Filed unassigned by the skills seat (session_01RMTpSRF5CjMmQBFfPtPCwJ) while implementing the #11705 ruling in PR #12274 — recording a measured gap in that ruling's REACH, not proposing to widen the card that found it. The decision it needs is a CI-cost trade, which is why it is filed rather than taken.
The gap
The 2026-08-25 ruling (issue #11705, comment 5406727512) carves generator-owned outputs inside skills/** out of the governed-merge fork, proven per file by recomputing the generator on the tree under test. PR #12274 implements that in the shared register, and both consumers — the seat-side --test predicate and scripts/pm/check-governed-queue-guard.mjs — now call the same membership test and the same recompute driver, so the exemption reaches both by construction.
But the two run in different environments, and only one of them can execute the recompute:
| consumer | environment | verdict on a spec PR carrying its regenerated skills/*/references/_index.md |
|---|
check-governed-merges.mjs --test (seat, dev container) | node_modules present | lifts — measured on PR #12274's own tree, exit 0 |
Governed Surface Queue Guard (merge_group) | no install step at all | fails closed — the row stays governed, and the PR needs an approving review to enter the queue |
.github/workflows/governed-surface-guard.yml says so deliberately, verbatim: "No install step and no corepack: the script is dependency-free and imports only sibling scripts/** modules." The #9866 row's recompute is plain node (scripts/docs-audit/**) and works there; the #11705 rows recompute by running pnpm --filter @objectstack/spec exec tsx …--check, which that job cannot do. Fail-closed is the correct answer for an environment that cannot measure — it is a pinned self-test case in both scripts, not an accident — but the practical effect is that half of what the ruling bought is not delivered at the one moment the ruling's own cost paragraph is about: merge-queue eligibility.
Why this is not just "fix it"
Every option costs something that belongs to the maintainer, not to a seat:
Evidence: PR #12274 (implementation + the measured --test readings), .github/workflows/governed-surface-guard.yml (the no-install comment), issue #11705 comment 5406727512 (the ruling).
Generated by Claude Code
Filed unassigned by the skills seat (
session_01RMTpSRF5CjMmQBFfPtPCwJ) while implementing the #11705 ruling in PR #12274 — recording a measured gap in that ruling's REACH, not proposing to widen the card that found it. The decision it needs is a CI-cost trade, which is why it is filed rather than taken.The gap
The 2026-08-25 ruling (issue #11705, comment 5406727512) carves generator-owned outputs inside
skills/**out of the governed-merge fork, proven per file by recomputing the generator on the tree under test. PR #12274 implements that in the shared register, and both consumers — the seat-side--testpredicate andscripts/pm/check-governed-queue-guard.mjs— now call the same membership test and the same recompute driver, so the exemption reaches both by construction.But the two run in different environments, and only one of them can execute the recompute:
skills/*/references/_index.mdcheck-governed-merges.mjs --test(seat, dev container)Governed Surface Queue Guard(merge_group).github/workflows/governed-surface-guard.ymlsays so deliberately, verbatim: "No install step and no corepack: the script is dependency-free and imports only siblingscripts/**modules." The #9866 row's recompute is plain node (scripts/docs-audit/**) and works there; the #11705 rows recompute by runningpnpm --filter @objectstack/spec exec tsx …--check, which that job cannot do. Fail-closed is the correct answer for an environment that cannot measure — it is a pinned self-test case in both scripts, not an accident — but the practical effect is that half of what the ruling bought is not delivered at the one moment the ruling's own cost paragraph is about: merge-queue eligibility.Why this is not just "fix it"
Every option costs something that belongs to the maintainer, not to a seat:
skills/*/references/_index.mdis generator-owned (gen:skill-refs) yet sits inside theskills/**governed-merge fence — every spec PR touching an indexed headline is forced to carry a governed-surface file #11705 measured — though the seat-side predicate now tells the PM the truth, so nobody splits the artifact out of its source PR again (the unworkable outcome the ruling named).skills/**(issue [finding]skills/*/references/_index.mdis generator-owned (gen:skill-refs) yet sits inside theskills/**governed-merge fence — every spec PR touching an indexed headline is forced to carry a governed-surface file #11705's option C, explicitly not taken by the ruling). Ends the collision structurally in both environments; build-system cost.Evidence: PR #12274 (implementation + the measured
--testreadings),.github/workflows/governed-surface-guard.yml(the no-install comment), issue #11705 comment 5406727512 (the ruling).Generated by Claude Code