* refactor(core): move the command descriptor registry into its own package
`src/core/command-descriptor/`, `src/command-catalog.ts`, `src/core/wait-positionals.ts`
and `src/core/parse-timeout.ts` move as git renames into a new private package
`@agent-device/command-registry` (deps: contracts, selectors). One subpath per module
points straight at the moved file; no `index.ts`, no re-export at the old path. Every
consumer switches to the owning specifier.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jqfa11D8QsCMuL17SsLvDz
* test(host-kit): pin the command-registry package inside the daemon code graph
The daemon reaches the registry and its catalog only by workspace specifier. A walk
that stopped at the package boundary would report an unchanged signature after a
descriptor edit, and the client would keep reusing a daemon running the superseded
policy. The manifest is asserted beside the sources because its `exports` map is what
chose them. The cache doc comment quoting the old ~800-module graph is corrected.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jqfa11D8QsCMuL17SsLvDz
* chore(gates): point the descriptor-registry gates at the package path
R66's `COMMAND_DESCRIPTOR_MODULE`, R16's record-runtime join subject and the Fallow
`AssertTrue` totality-guard key follow the registry to its package. The two descriptor
hubs leave `HUB_ENTRY_FILES` because the package manifest now publishes them, so the
eager-closure gate discovers them as facades and one entry gets one rule; this also
flips `denyPlatformImplementations` from false (hub) to true (package entry) for both,
which is intentional and stricter. `command-registry` joins the ranked spine at rank 1.
No `APPROVED_OVER_CEILING` row: rename detection carries every moved entry's merge-base
baseline, so all twelve fall under the no-growth rule rather than a ceiling.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jqfa11D8QsCMuL17SsLvDz
---------
Co-authored-by: Claude <noreply@anthropic.com>
* test(fuzz): structured CLI/Maestro generators that reach command validation and assert error codes (#1781 B2)
* test(fuzz): pin the rediscovered #1433 excess-positional case and keep numeric flag samples inside their range
* style: apply oxfmt to the new fuzz modules
* perf(fuzz): derive the CLI validation surface lazily so unrelated harness paths keep their startup
* test(fuzz): resolve validation generators in the run path so corpus replay keeps its small module graph
* test(fuzz): weight the CLI budget toward command validation, pin the finite classes as seeds, guard lazy surface derivation
* docs(testing): describe the validation lane's layer split, seed-pinned classes, and PR-time gates
* refactor(fuzz): split the validation generator into CLI and Maestro modules, mirrored in tests
* refactor(fuzz): collapse the flag-shaped mutation classes and seed literals, derive class coverage from declarations
* fix(fuzz): hash every case-generation module in configHash, guarded by an import-closure test
* test(fuzz): assert CLI command and flag-key coverage against the registry, and close the six gaps it found
* test: nightly parser fuzz lane with typed-AppError invariant (#1414)
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* test(fuzz): run envelope, artifact promotion, and harness self-check tests (#1414)
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* test(fuzz): shared scheduled-lane envelope on every terminal path, watchdog after ready (#1414)
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* test(fuzz): envelope for malformed options; add scheduled-lane health consumer (#1414, #1430)
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* fix(lanes): actions:read scope, terminal error envelope, first-due grace (#1414, #1430)
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* fix(lanes): anchor first-run grace to schedule registration, use exec helper in tests (#1414, #1430)
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* fix(lanes): portable POSIX pickaxe pattern for schedule registration (#1414, #1430)
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* refactor(fuzz): fast-check generators over the shared hazard list, drop the bundled lane-health work (#1414)
- Strip scripts/scheduled-lane/* and scheduled-lane-health.yml: that watcher is #1430's own
deliverable and collides with PR #1439's implementation of the same lane. What this lane owes
(a per-run envelope) moves into scripts/fuzz/envelope.ts.
- Rebase onto #1437 and rebuild the generator layer on fast-check: cases come from arbitraries
sharing SELECTOR_VALUE_HAZARDS with the property suite, and counterexamples are shrunk, so a
failure names a minimal input plus fast-check's seed/path instead of a 20k-char random string.
- Route harness.test.ts into the serialized subprocess-stub project.
- Drop the AGENT_DEVICE_FUZZ_STARTUP_DELAY_MS test seam: the ready handshake is now proven by a
case budget far below real worker startup.
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* test(fuzz): replay the regression corpus through the worker watchdog (#1414)
A promoted hang case used to wedge the unit job until the CI timeout, because corpus replay called
checkCase in-process. It now goes through the same worker-backed watchdog the nightly lane uses, so
such a case fails against a 5s per-case budget; the file moves to the serialized subprocess-stub
project with the rest of the worker-driven fuzz tests.
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* test(fuzz): let the watchdog outlive vitest's default case timeout (#1414)
A wedged parser was surfacing as a bare 'Test timed out in 5000ms' instead of the named hang:
failure that says which input wedged, because the file's vitest timeout was shorter than the
watchdog budget times the number of replayed cases.
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* test(fuzz): complete drift provenance in the lane envelope (#1414)
configHash now covers every input that decides what a seed generates (generate.ts and the shared property arbitraries, not just the arbitraries/targets/invariant), and tool records fast-check's installed version. A generation-loop edit or a fast-check upgrade previously changed the case set while the envelope looked unchanged. A test recomputes the hash with each input omitted so a future omission fails.
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
---------
Co-authored-by: Michał Pierzchała <thymikee@gmail.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>