Skip to content

ci: rule 3 does not reach a run that carries no per-commit answer - #590

Merged
JulienMartel merged 1 commit into
mainfrom
worktree-ci-doc-hausfoldco-stale
Sep 13, 2026
Merged

JulienMartel merged 1 commit into
mainfrom
worktree-ci-doc-hausfoldco-stale

Conversation

@JulienMartel

@JulienMartel JulienMartel commented Sep 13, 2026 •

Copy link
Copy Markdown
Contributor

What

docs/ci.md, one insertion into rule 3 (41 added, 20 of them rewrites of nothing — pure addition against main). Docs only.

Rule 3 bolds an absolute — "Only a PR run is ever in a shared group" — and the family has three standing counterexamples that the doc never mentioned. This writes the exemption.

Follow-up to #587, which narrowed rule 3's endorsement of hausfold.co so the paragraph could not be read as blessing them, but deliberately left the exemption itself unwritten.

Why

An unstated exemption is what the next PR "fixes". Three workflows key every run into one constant group with no github.sha in it, all in hausfold.co — deploy.yml, dns.yml, preview-sweep.yml — each on purpose and each commented (two of them) in its own file.

The property is written so the count is not load-bearing: what a gate loses when an intermediate run is dropped is that commit's answer, which nothing else will produce. These three converge something outside the repo instead — the deployed site, the DNS zone, this repo's own preview Workers — and a converge has no answer to lose, because the surviving run redoes the whole job from current state. For them the constant group is the point of the line, not a cost of it.

Three things the text is careful about, each of which a review caught in the first draft:

  • The pull_request guard comes with a standing example, not a hypothetical. preview.yml converges something external and has a PR run, and keys on the PR number anyway — rule 3's ternary with only the PR arm left.
  • The three do not share one cancel-in-progress reason. deploy cancels (a newer build supersedes outright); dns does not (a converge stopped between two tables leaves the zone half-way, its own words); the preview sweep does not for a completely different reason — its deletes are independent and an already-gone Worker counts as success, so nothing is half-written; there is simply nothing to supersede, and a dry_run dispatch would otherwise take out a live sweep. The first draft gave the sweep dns's reason, which its own job body contradicts.
  • The cost is stated, not papered over. dns's scheduled check shares group: dns with publish, and a pending run is cancelled outright when a newer one joins whatever cancel-in-progress says — so a Monday check queued behind a running converge can be dropped, and that week's drift answer waits seven days. One writer on the zone is worth more than one week's report. That is a trade made once, for a converge, not a reason to key a gate this way.

Verify

Census over every public repo in the org at its origin/main, walking .github/workflows/* rather than trusting a list (ops is private and outside it; it runs a scheduled scoreboard and nothing on a push):

workflows in the family 27
carrying a concurrency: block 21
with a constant top-level group: 3, all in hausfold.co
deploy.yml group: deploy, cancel-in-progress: true
dns.yml group: dns, cancel-in-progress: false
preview-sweep.yml group: preview-sweep, cancel-in-progress: false
any of the three with a pull_request: trigger none — push+dispatch, push+schedule+dispatch, schedule+dispatch

Near misses, both correctly keyed and correctly excluded: scruff's release.yml (release-${{ github.ref }}) and hausfold.co's preview.yml (preview-${{ github.event.pull_request.number }}).

The fourth constant group a reader's grep will find is pounce's job-level bump-pin in release.yml. Release workflows are off this list by the doc's own line, and the text now says so in half a clause so the grep closes instead of reading stale.

Reasons checked against the workflows themselves, not assumed: deploy.yml and dns.yml each carry a comment stating theirs. preview-sweep.yml carries none — its reason here is read out of the job body (independent per-Worker DELETEs, a continue on per-Worker failure, Cloudflare 10007 treated as success, a dry_run dispatch input).

Pre-PR assurance pass run on the diff + AGENTS.md. Nothing at 5; the one 4/5 (the sweep's invented reason) and all three 3/5s (the "is not a gate" opener colliding with this file's own gate table, the dns scheduled-check arm, the fourth constant group) are fixed in this commit. No test in this repo asserts on docs/ci.md.

Watch out

🤖 Generated with Claude Code

https://claude.ai/code/session_01UMUHVTxRfgADnACNXzc6Ef

Rule 3 states an absolute — "**Only a PR run is ever in a shared group**" —
and the family has three standing counterexamples, all in `hausfold.co`:
`deploy.yml`, `dns.yml` and `preview-sweep.yml`, each keying every run into
one constant group named for the workflow, each on purpose, and the doc said
nothing about any of them. An unstated exemption is what the next PR "fixes".

Census over the org's public repos at their `origin/main`: 27 workflows, 21
carrying a `concurrency:` block, exactly 3 with a constant top-level group.
The near misses are `scruff`'s `release.yml` (`release-${{ github.ref }}`) and
hausfold.co's `preview.yml` (keyed on the PR number), both correctly keyed.
`ops` is private and outside the sweep; it runs a scheduled `scoreboard` and
nothing on a push.

The property, written so the count is not load-bearing: what a gate loses when
an intermediate run is dropped is that commit's answer, which nothing else
will produce. These three converge something outside the repo instead — the
deployed site, the DNS zone, this repo's own preview Workers — and a converge
has no answer to lose, because the surviving run redoes the whole job from the
current state. For them the constant group is the point of the line, not a
cost of it: what it serializes is the resource.

The guard against reading that wider than it is: check for a `pull_request`
trigger first. None of the three has one, and `preview.yml` is the standing
example of a workflow that converges something external AND has a PR run, and
keys on the PR number anyway. The one other constant group in the family,
`pounce`'s job-level `bump-pin`, is in a release workflow and off this list by
the doc's own line; a reader who greps finds four and now knows why.

`cancel-in-progress` is a second and separate question, about what a stopped
run leaves behind, and the three do not share one reason. `deploy` cancels, a
newer build superseding an older outright. `dns` does not, because a converge
stopped between two tables leaves the zone half-way. The preview sweep does
not for a different reason entirely: its deletes are independent and a Worker
already gone counts as success, so nothing is half-written — there is just
nothing for a later run to supersede, and a `dry_run` dispatch would otherwise
take out a live sweep.

And the cost is stated rather than papered over. `dns`'s scheduled `check`
shares `group: dns` with `publish`, a *pending* run is cancelled outright when
a newer one joins whatever `cancel-in-progress` says, so a Monday check queued
behind a running converge can be dropped and that week's drift answer waits
seven days. One writer on the zone is worth more than one week's report. It is
a trade made once, for a converge, and not a reason to key a gate this way.

Follow-up to #587, which narrowed rule 3's endorsement of `hausfold.co` so the
paragraph could not be read as blessing these three, but left the exemption
itself unwritten.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UMUHVTxRfgADnACNXzc6Ef
@JulienMartel
JulienMartel merged commit 1d9eb9a into main Sep 13, 2026
1 check passed
@JulienMartel
JulienMartel deleted the worktree-ci-doc-hausfoldco-stale branch September 13, 2026 00:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant