Cut wall-clock CI on documentation-only PRs to <=5 minutes WITHOUT defining any workflow-level paths: or paths-ignore: filter, so every required branch-protection context is still created and still reports on every pull request. This is route (a) from the 2026-08-07 blocking note, confirmed reachable 2026-08-08.
WHY THE CONFLICT DISSOLVES. The gate at scripts/check-foundation-gates.mjs:226-227 forbids a MECHANISM, not this bead's GOAL. Its regex /^ paths(?:-ignore)?:/m is anchored to four-space indentation - the on: trigger block - and ci.yml states the rationale in exactly those terms: a paths filter means the workflow never runs, so the check run is never created and the required context stays Pending forever. A job-level if: is a different thing: the workflow runs, the check run IS created, and the job reports conclusion 'skipped', which branch protection accepts. ci.yml already has a preflight job that runs first and already uses conditional execution, so the docs-only signal has a natural home.
IMPLEMENTATION. preflight emits a boolean docs_only output computed from the PR's changed-file set; the expensive jobs (backend, the postgres-reachability jobs, company-conformance, dev-up-smoke) carry if: needs.preflight.outputs.docs_only != 'true'; preflight and repo-gates always run. Any failure computing the diff yields docs_only=false - fail closed.
OWNED ROOT: .github/workflows/ci.yml ONLY.
EXPLICITLY NOT OWNED: scripts/check-foundation-gates.mjs. The gate is not to be weakened, relaxed, or exempted by this bead. If the goal proves unreachable without editing it, STOP and escalate rather than edit it.
Cut wall-clock CI on documentation-only PRs to <=5 minutes WITHOUT defining any workflow-level paths: or paths-ignore: filter, so every required branch-protection context is still created and still reports on every pull request. This is route (a) from the 2026-08-07 blocking note, confirmed reachable 2026-08-08.
WHY THE CONFLICT DISSOLVES. The gate at scripts/check-foundation-gates.mjs:226-227 forbids a MECHANISM, not this bead's GOAL. Its regex /^ paths(?:-ignore)?:/m is anchored to four-space indentation - the on: trigger block - and ci.yml states the rationale in exactly those terms: a paths filter means the workflow never runs, so the check run is never created and the required context stays Pending forever. A job-level if: is a different thing: the workflow runs, the check run IS created, and the job reports conclusion 'skipped', which branch protection accepts. ci.yml already has a preflight job that runs first and already uses conditional execution, so the docs-only signal has a natural home.
IMPLEMENTATION. preflight emits a boolean docs_only output computed from the PR's changed-file set; the expensive jobs (backend, the postgres-reachability jobs, company-conformance, dev-up-smoke) carry if: needs.preflight.outputs.docs_only != 'true'; preflight and repo-gates always run. Any failure computing the diff yields docs_only=false - fail closed.
OWNED ROOT: .github/workflows/ci.yml ONLY.
EXPLICITLY NOT OWNED: scripts/check-foundation-gates.mjs. The gate is not to be weakened, relaxed, or exempted by this bead. If the goal proves unreachable without editing it, STOP and escalate rather than edit it.