Two-stage CI phase 4: documentation¶
Phase 4 of PLAN-two-stage-ci.md. Phases
1 to 3 built the two tiers, added the Windows cross-check, and
turned on the merge queue. This phase makes the result
discoverable: what runs where, how to read a failure that no
longer appears on the pull request, and which invariants an
agent editing ci.yml has to preserve.
A new page, not a longer section¶
The master plan left this open ("docs/development.md, or a new
docs/ci.md if the CI material has outgrown it"). It has
outgrown it. The material that now needs writing down — two
tiers, three gate jobs, the check_paths fast path, queue
mechanics and ejections, artifact provenance, the ruleset and
its bypass actor, the prune-reviews bot — is a reference, and
most of it is of no interest to somebody who just wants to build
ryll.
So docs/ci.md is new and carries the reference, including the
workflow inventory table that used to live in
development.md. development.md keeps a short summary aimed
at a contributor: the two tiers exist, merging enqueues rather
than merges, the merge tier reports on the queue's run, and the
Linux commands CI runs are the local ones. It links out for the
rest.
What the pass found stale¶
AGENTS.md still claimed review-only changes skip CI "via
paths-ignore" and that "the supply-chain content scanners
still run on them". Phase 1 replaced the paths-ignore with the
check_paths job and folded the scanners into ci.yml, so both
halves were wrong: the scanners skip too. codeql-analysis.yml
does still use paths-ignore, which is presumably where the
claim survived from.
docs/development.md said the merge tier runs "on
merge_group", which is true but says nothing to a reader who
has not met a merge queue.
ARCHITECTURE.md describes CI only as it stood at phase 7 of
the web-frontend work, as a record of that phase. It is not a
current-state description and was left alone.
docs/releasing.md needed nothing: release artifacts come from
release.yml on a tag and never came from a push to develop.
The merge-queue material worth writing down¶
Three things are non-obvious enough to be the reason this page exists:
- Merge-tier failures are invisible on the pull request.
They ran against
gh-readonly-queue/develop/pr-N-<sha>, so the pull request shows only a timeline event saying it was removed from the queue. You have to go to the merge group's run in the Actions tab. - Skipped counts as success, deliberately. Both gates map
each dependency to "success or skipped", and the gate that
does not apply to an event is itself skipped. That is what
lets
Can mergebe required without blocking pull requests, and what lets review-only changes through without running a single build. It reads like a bug if you meet it cold. - A job nothing needs is not required. The ruleset names
three checks, none of which is a real job. Adding a job to
ci.ymlwithout adding it to a gate'sneedsproduces a job that can fail without blocking a merge.
Steps¶
| Step | Effort | Model | Isolation | Brief |
|---|---|---|---|---|
| 4a | medium | opus | none | Write docs/ci.md; move the workflow inventory into it; trim development.md's CI section to a summary plus a link; add the page to docs/index.md. |
| 4b | low | opus | none | Fix the stale paths-ignore claim in AGENTS.md and add a "two CI tiers and the merge queue" section to its CI conventions, covering gate membership, the shared if: shape, skipped-as-success, workflow_dispatch running both tiers, and not pushing to develop. |
| 4c | low | opus | none | Annotate PLAN-ci-platform-matrix.md: its future runtime smokes are merge-tier work, preferably as steps in the existing build matrix, and any new job needs a gate. |
| 4d | low | opus | none | Update the master plan's phase table and open questions, and docs/plans/index.md. |
Implementation ran in the management session rather than in sub-agents, contrary to the master plan's execution model: the work is prose about material the session had just built and measured, and the plan's own guidance rates docs work as well-briefed and bounded.
Validation¶
pre-commit run --all-filespasses.- Every relative link in the new and edited pages resolves
(
docs/ci.md→plans/…,development.md,releasing.md;docs/plans/PLAN-ci-platform-matrix.md→../ci.md). - The job tables in
docs/ci.mdmatchci.ymljob for job, including runner labels. - Merging this branch also closes the last phase 3 validation
gap. Phase 3 could not prove that
prune-reviewspushes successfully under the active ruleset: the run after the first queued merge found nothing to prune and exited beforegit push. This branch changesAGENTS.md, which is a reviewed file, so the post-merge prune has real work to do and exercises the bot's push through the team bypass actor for real.
Follow-ups this phase does not do¶
- A review-only pull request (touching only
REVIEWS.md) has not been exercised since the checks became required. The path is the same one this branch'scheck_pathsjob takes, but the gate-passes-on-all-skipped case specifically has only been observed while the checks were advisory. shakenfist/actions'export-repo-configworkflow exports"bypass_actors": []even when a ruleset has one — kerbside's export shows the same, so the audit trail is missing the bypass fleet-wide. Worth raising there.tools/ci-prune-reviews.shpushes todevelopwhatever ref it was run against. ryll now guards the workflow, but the script mirrors one in shakenfist/development and kerbside carries the same hazard.- Nothing in the repository runs actionlint, despite
.github/actionlint.yamlexisting. Raised twice during this work and by the automated reviewer on PR #257; still open, and possibly a fleet-wide consistency-audit item.