Skip to content

ci: hoist docs_only scope resolution into one job instead of 46 references #3159

Description

@claude

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

  • One job resolves scope; every consumer reads its output rather than re-referencing the detector step.
  • Adding a new gated job requires referencing one documented output, with no polarity decision to get wrong.
  • A detector failure still resolves to "run the full suite" — verified by a test, not by a comment.
  • The intentional docs-only skip is still mapped to success in the aggregator feed, with the aggregator unchanged.
  • check-lane-coverage.sh --check stays clean (every job still reachable from ci-status.needs).

References

Metadata

Field Value
Category unspecified
Area unspecified
Ecosystem unspecified

Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.priority: mediumReal value, no hard deadline; normal backlog flow.status: readyTriaged, unblocked, and fully specified; eligible to pick up.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions