Parent
Refs #2914
Context
The docs_only string contract fans out to 46 references in .github/workflows/ci.yml. Consumers gate on steps.scope.outputs.docs_only != 'true' — an inverse-polarity condition whose correctness is maintained by a prose comment rather than by anything executable. That is connascence of meaning at 46 sites: every consumer has to independently know that the flag is a string 'true', that the safe direction is to run the suite, and that the negation must be spelled this exact way.
Two failure modes follow from the shape. A consumer that writes == 'false' instead of != 'true' skips its lane whenever the detector emits anything unexpected — a fail-open, and the polarity comment is the only thing that prevents it. A consumer that forgets the gate entirely runs always, which is merely wasteful. The asymmetry is why the comment exists, and why 46 hand-maintained copies of it is the wrong mechanism.
Route-lane finding 5 of 7 from the first /coupling:reduce dogfood run (#2914). Reproduced against the tree at dff0942: exactly 46 docs_only references in ci.yml.
Proposed work
- Hoist scope resolution into a single job that runs the detector once and publishes the result as a job output.
- Have consumers read
needs.scope.outputs.docs_only rather than each re-deriving or re-referencing the step output.
- Consider publishing the already-negated form (e.g. a
run_full output) so consumers express the safe direction positively and the inverse-polarity comment stops being load-bearing.
- Preserve the existing never-skip discipline: the detector self-test runs unconditionally, and detection stays fail-closed toward running the full suite.
Acceptance criteria
References
Metadata
| Field |
Value |
| Category |
unspecified |
| Area |
unspecified |
| Ecosystem |
unspecified |
Generated by Claude Code
Parent
Refs #2914
Context
The
docs_onlystring contract fans out to 46 references in.github/workflows/ci.yml. Consumers gate onsteps.scope.outputs.docs_only != 'true'— an inverse-polarity condition whose correctness is maintained by a prose comment rather than by anything executable. That is connascence of meaning at 46 sites: every consumer has to independently know that the flag is a string'true', that the safe direction is to run the suite, and that the negation must be spelled this exact way.Two failure modes follow from the shape. A consumer that writes
== 'false'instead of!= 'true'skips its lane whenever the detector emits anything unexpected — a fail-open, and the polarity comment is the only thing that prevents it. A consumer that forgets the gate entirely runs always, which is merely wasteful. The asymmetry is why the comment exists, and why 46 hand-maintained copies of it is the wrong mechanism.Route-lane finding 5 of 7 from the first
/coupling:reducedogfood run (#2914). Reproduced against the tree atdff0942: exactly 46docs_onlyreferences inci.yml.Proposed work
needs.scope.outputs.docs_onlyrather than each re-deriving or re-referencing the step output.run_fulloutput) so consumers express the safe direction positively and the inverse-polarity comment stops being load-bearing.Acceptance criteria
successin the aggregator feed, with the aggregator unchanged.check-lane-coverage.sh --checkstays clean (every job still reachable fromci-status.needs).References
.github/workflows/ci.yml— the 46 references and the polarity commentscripts/check-docs-only.sh— the detector, whose fail-safe contract must be preservedMetadata
Generated by Claude Code