Spun off from #11 (closed — Phase 1 shipped in #23/#40/#42). This is the remaining piece: validate the fan-out scaffolding end-to-end on a fixture, not on itself (no regress), and without live agents (deterministic, CI-safe — option (a)+(b) from the #11 plan).
Scope
examples/fixture-target/ — a tiny consumer-shaped repo: gates.json (one fixture-core module over src/), trivial JS source + node test, README.
.claude/self/smoke-fanout.sh — a stub implementer run: stage the fixture into a temp git repo (with the real gate.sh copied in, consumer-layout), create an isolated worktree + branch, apply a canned diff (the "recorded implementer"), assert the module boundary is respected, run the fixture's build/lint/test gates through the real gate.sh, merge the branch, assert the change landed on main. Also a failure path: a broken canned diff must make the gate fail non-zero (verifies gate.sh propagates failures to the loop).
- Wire into
.claude/self/gates.json test so it runs in the existing self / test CI job on every PR. Keep test_affected static-only (Stop-hook fast path).
Non-goals
Verified feasible under the strict sandbox: git init/worktree/commit/merge all work in $TMPDIR.
Spun off from #11 (closed — Phase 1 shipped in #23/#40/#42). This is the remaining piece: validate the fan-out scaffolding end-to-end on a fixture, not on itself (no regress), and without live agents (deterministic, CI-safe — option (a)+(b) from the #11 plan).
Scope
examples/fixture-target/— a tiny consumer-shaped repo:gates.json(onefixture-coremodule oversrc/), trivial JS source + node test, README..claude/self/smoke-fanout.sh— a stub implementer run: stage the fixture into a temp git repo (with the realgate.shcopied in, consumer-layout), create an isolated worktree + branch, apply a canned diff (the "recorded implementer"), assert the module boundary is respected, run the fixture's build/lint/test gates through the realgate.sh, merge the branch, assert the change landed on main. Also a failure path: a broken canned diff must make the gate fail non-zero (verifies gate.sh propagates failures to the loop)..claude/self/gates.jsontestso it runs in the existingself / testCI job on every PR. Keeptest_affectedstatic-only (Stop-hook fast path).Non-goals
Verified feasible under the strict sandbox: git init/worktree/commit/merge all work in
$TMPDIR.