Development record
docs-only PRs pay the full two-OS build+test matrix — add a fail-closed inert-path skip gate
docs-only PRs pay the full two-OS build+test matrix — add a fail-closed inert-path skip gate
Evidence (2026-08-16, measured on PR #239 — a record-only change)
check (macos) 2m31s + check (ubuntu) 1m57s + smoke 20s + zizmor 10s +
gitleaks 6s + record-lint 4s, all ruleset-required. For a docs-only PR the
only strictly needed work is: gitleaks (docs can leak secrets), the
reviews-charter record-lint, attribution, and the check job's last two
steps — go run ./cmd/record-lint and go run ./cmd/abcd docs lint —
which compile most of the module anyway (the gates ARE the binary; a
zero-build docs lane is structurally impossible). Skippable on inert
changes: the full test suite, race tests, vet, the entire macOS leg,
smoke, and zizmor (unless .github/** changed).
Design constraints (settled or recorded)
- Fail-closed classifier only. The 2026-08-15 decision records that a
"no source touched" test FAILS OPEN here:
commands/*.md,hooks/hooks.json,.abcd/*.json, and the rules router are markdown/ JSON that change behaviour. Skip only when EVERY changed file matches a narrow inert allowlist (docs/**,.abcd/development/**,.abcd/work/**, root markdown); anything else runs the full matrix. - All seven check contexts are ruleset-required, so workflow-level
paths:filtering wedges PRs (never-reporting checks block). The viable shape is achangesclassifier job + job-levelif:on downstream jobs; skipped jobs report askippedconclusion, documented as satisfying required checks — MUST be verified on a rehearsal PR before auto-merge relies on it (loud-staging: no assumed green). ci.ymlis not scaffold-coupled (parity test pins release workflows only). Typed link: a proven skip gaterefineswhat itd-106 (abcd scaffolds required CI per repo) would ship to managed repos.- Repo is public — Actions minutes are free; the win is wall-clock / auto-merge latency (~2.5-3 min → ~1 min) and queue pressure, not money.
- CI config changes need explicit maintainer sign-off before landing.
Related: iss-233 (duplicate push+PR runs) is the cheaper, independent first fix — do it regardless of this one.
Frontmatter
| id | iss-234 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | minor |
.abcd/work/issues/resolved/iss-234-docs-only-prs-pay-the-full-two-os-build.md
open on GitHub ↗ · commit history ↗
mentions4
- dcn-26081600000000022026-08-16 — CI inert-path skip gate (iss-234): the inert allowlist is `docs/**`, `.abcd/development/**`, `.abcd/work/**`, plus exactly README.md, CHANGELOG.md, CONTRIBUTING.md, SECURITY.md, ACKNOWLEDGEMENTS.md, LICENSE, LICENSE.md; everything else — notably the harness routers (AGENTS.md/CLAUDE.md/GEMINI.md), commands/, agents/, hooks/, .abcd/*.json, .github/**, evals/, scripts/, Makefile, Go source — is non-inert, and every unknown or degraded outcome (non-PR event, empty diff, unreadable base, aborted or failed classifier) runs the full matrix, fail closed and loudly. Deviation from the capture's skippable list, maintainer-confirmed 2026-08-16: the ubuntu unit lane ALWAYS runs — lifeboat brief-coverage, glossary-index and README-grounding tests assert against the live tree inside the allowlist (reproduced: a prose-only brief edit turns TestEveryBriefSectionHasARow red while record-lint and docs-lint stay green), so skipping `go test ./...` on an inert change is fail-open; what stands down is the macOS leg's heavy steps, the race lane, smoke, and zizmor. The skipped-conclusion-satisfies-ruleset behaviour is unverified until the rehearsal PR passes; nothing arms auto-merge on it before that. Rejected: a fromJSON dynamic matrix (a never-reporting `check (macos-latest)` wedges every PR) and a marketplace paths-filter action (plain git suffices, no new pinned dependency).
- dcn-26082000000000022026-08-20 — bughunt round 2 (branch bughunt-b/round-2): captured the round-2 records (iss-346..iss-357, with the two colliding ids re-minted as iss-358/iss-359), fixed
- iss-233ci.yml runs the full check matrix twice per PR push — push and pull_request triggers overlap
- itd-106abcd Sets Up the CI a Repo Requires, and Reports What It Did