You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Problem — The amicode hardware stage is an honest stub: it records intent (a device_session entity) but runs nothing, so the researcher's first contact with the closed loop is a promise, not a preview. The landed stack can already do better: Strumento.jl's MockSoc runs the entire transport path (translate → envelopes → execute! → synthetic IQ → Measurement → one strategy step) in pure Julia, no Python, no board — the identical seam real hardware uses. Approach — the solved pulse runs a full sim rehearsal through the ACTUAL Strumento.jl path, recorded into the device session, honestly labeled sim. The stage stays an honest stub until a rehearsal PASSES — a failed rehearsal does not satisfy it (failures surface distinctly). Scope — in: the rehearsal path (however the extension best invokes it — a CLI-launched script following the established run-launch pattern is the expected shape), the outcome-gated artifact, the stage wiring · out: any bespoke simulation (F1: if the real path cannot be used, ship NOTHING and the stage stays a stub), any hardware I/O, any change to Strumento.jl/Intonato surface.
Acceptance Criteria
mocksoc_rehearsal_artifact_recorded == 1 AND rehearsal_outcome == success per hardware-stage invocation; a failed rehearsal is surfaced distinctly and does NOT satisfy the stage
The artifact carries the pulse content-hash, the mock system's mismatch declaration, and the strategy-step outcome
rehearsal_imports_strumento_path_only == 1 — an import-surface check: the rehearsal entry point imports no sim module outside the Strumento.jl path (no bespoke sim, mechanically checked)
The rehearsal is honestly labeled sim in the device-session record and the UI surface
Testing Decisions
The import-surface check is a test (grep/import-graph over the rehearsal entry point + its module graph); the outcome-gating is a unit test over the stage's recording path (a failing rehearsal leaves the stub state honest); an end-to-end test drives one solved-pulse fixture through the rehearsal in the test env. Follow the repo's vitest conventions; the rehearsal script itself is exercised through whatever invocation pattern the extension uses for Julia work (the established run-launch seam).
Key Decisions
The rehearsal runs the Strumento.jl MockSoc verbatim — the entire point is that the preview exercises the identical transport seam real hardware uses.
MockSoc is pure Julia: the test/rehearsal env resolves Strumento + Intonato + Piccolo from the registry — no PythonCall, no qick extra, no board.
F1 verbatim: if the slice cannot use the Strumento.jl path, it ships nothing rather than a declared-sim lookalike.
Constraints & Invariants
The honesty invariant set (LIVE/STALE/DEAD, untrusted-until-verified, propose-only-on-hardware) applies; the sim label is part of the trust chain, not a disclaimer bolted on.
No landed contract or API changes — the stage's entity schema may grow additively (wiring, not re-shaping).
Prior Art
The hardware-loop skill's MockSoc idiom (the canonical pattern); Strumento.jl's MockSoc + integration test (the whole QILC→board loop tested with no Python and no board); the amico CLI's run-launch pattern (how the extension already drives Julia); the device_session entity surface.
Source
Part of #679 · design-of-record: specs/spec-20260831-120000-amicode-outside-lab-codesign.md (SEAM 1) · no blockers.
Notes
First slice of the codesign decomposition — picked because it is unblocked, amicode-only, and makes the journey's stage-5 story real.
Important
Problem — The amicode hardware stage is an honest stub: it records intent (a device_session entity) but runs nothing, so the researcher's first contact with the closed loop is a promise, not a preview. The landed stack can already do better: Strumento.jl's MockSoc runs the entire transport path (translate → envelopes → execute! → synthetic IQ → Measurement → one strategy step) in pure Julia, no Python, no board — the identical seam real hardware uses.
Approach — the solved pulse runs a full sim rehearsal through the ACTUAL Strumento.jl path, recorded into the device session, honestly labeled sim. The stage stays an honest stub until a rehearsal PASSES — a failed rehearsal does not satisfy it (failures surface distinctly).
Scope — in: the rehearsal path (however the extension best invokes it — a CLI-launched script following the established run-launch pattern is the expected shape), the outcome-gated artifact, the stage wiring · out: any bespoke simulation (F1: if the real path cannot be used, ship NOTHING and the stage stays a stub), any hardware I/O, any change to Strumento.jl/Intonato surface.
Acceptance Criteria
mocksoc_rehearsal_artifact_recorded == 1 AND rehearsal_outcome == successper hardware-stage invocation; a failed rehearsal is surfaced distinctly and does NOT satisfy the stagerehearsal_imports_strumento_path_only == 1— an import-surface check: the rehearsal entry point imports no sim module outside the Strumento.jl path (no bespoke sim, mechanically checked)Testing Decisions
The import-surface check is a test (grep/import-graph over the rehearsal entry point + its module graph); the outcome-gating is a unit test over the stage's recording path (a failing rehearsal leaves the stub state honest); an end-to-end test drives one solved-pulse fixture through the rehearsal in the test env. Follow the repo's vitest conventions; the rehearsal script itself is exercised through whatever invocation pattern the extension uses for Julia work (the established run-launch seam).
Key Decisions
Constraints & Invariants
Prior Art
The hardware-loop skill's MockSoc idiom (the canonical pattern); Strumento.jl's MockSoc + integration test (the whole QILC→board loop tested with no Python and no board); the amico CLI's run-launch pattern (how the extension already drives Julia); the device_session entity surface.
Source
Part of #679 · design-of-record: specs/spec-20260831-120000-amicode-outside-lab-codesign.md (SEAM 1) · no blockers.
Notes
First slice of the codesign decomposition — picked because it is unblocked, amicode-only, and makes the journey's stage-5 story real.