Gap
The pr-merge merge-hook mod (open a code-branch PR to next, record pr:, block until merge, two-step terminalize) is not exercised by any automated test — live or offline. Its only verification is FO dogfooding: every entity merge this session drove it by hand.
What live testing actually covers
internal/ensigncycle/live_test.go → TestLiveEnsignCycle (run by the claude-live job in runtime-live-e2e.yml, behind the CI-E2E approval gate) drives a real model through spacedock claude to take a single flat-entity backlog → done, then asserts the mechanical cycle outputs (stage-report heading, - DONE: marker, ### Summary, no checkbox bullets, one path-scoped commit naming only the entity).
The fixture is non-worktree, non-split-root, no _mods/, no gh (readmeNonWorktree() + one entity). None of the pr-merge preconditions exist, so the PR lifecycle (rebase → push branch → gh pr create → set pr: → block → merge-detect → two-step terminalize) never runs.
What IS tested
Only the guard mechanism (offline unit tests): internal/status/archive_guard_test.go (+ the mods-definition-dir-location tests) assert that a terminal --set/--archive is refused when a merge hook is registered and pr/mod-block are empty. Plus a static surface-grep in skills/integration/skill_surface_test.go. Neither drives the mod's behavior.
Why it's hard
The mod is FO-executed markdown, not Go code, so it can't be unit-tested. An honest live test needs a real gh PR round-trip against a throwaway repo (mocking gh would violate the no-mocks-in-e2e rule).
Options
- A gated live pr-mod round-trip test (throwaway repo + real
gh), as a sibling to TestLiveEnsignCycle behind the CI-E2E gate.
- An honest coverage-matrix entry marking the pr-merge lifecycle as FO-dogfood-only (no automated coverage), so the gap is tracked rather than silently assumed-covered.
Natural row for the behavior coverage matrix (the skeleton-and-matrix work). Off the immediate critical path; filed for tracking, not dispatched.
Gap
The
pr-mergemerge-hook mod (open a code-branch PR tonext, recordpr:, block until merge, two-step terminalize) is not exercised by any automated test — live or offline. Its only verification is FO dogfooding: every entity merge this session drove it by hand.What live testing actually covers
internal/ensigncycle/live_test.go→TestLiveEnsignCycle(run by theclaude-livejob inruntime-live-e2e.yml, behind the CI-E2E approval gate) drives a real model throughspacedock claudeto take a single flat-entity backlog → done, then asserts the mechanical cycle outputs (stage-report heading,- DONE:marker,### Summary, no checkbox bullets, one path-scoped commit naming only the entity).The fixture is non-worktree, non-split-root, no
_mods/, nogh(readmeNonWorktree()+ one entity). None of the pr-merge preconditions exist, so the PR lifecycle (rebase → push branch →gh pr create→ setpr:→ block → merge-detect → two-step terminalize) never runs.What IS tested
Only the guard mechanism (offline unit tests):
internal/status/archive_guard_test.go(+ themods-definition-dir-locationtests) assert that a terminal--set/--archiveis refused when a merge hook is registered andpr/mod-blockare empty. Plus a static surface-grep inskills/integration/skill_surface_test.go. Neither drives the mod's behavior.Why it's hard
The mod is FO-executed markdown, not Go code, so it can't be unit-tested. An honest live test needs a real
ghPR round-trip against a throwaway repo (mockingghwould violate the no-mocks-in-e2e rule).Options
gh), as a sibling toTestLiveEnsignCyclebehind the CI-E2E gate.Natural row for the behavior coverage matrix (the skeleton-and-matrix work). Off the immediate critical path; filed for tracking, not dispatched.