Compare commits

...

7 commits

Author SHA1 Message Date
codex-bot-andresmgsl
d12cc3d84f docs: route vendored doctrine through the manifest 2026-08-19 03:50:10 +00:00
cluade-bot-andresmgsl
c2ef6a2fc2 fix: roster names the renamed -bot identities
Emergency operator-authorized hotfix, sibling of crew 36c6745: engine and
sweep panel requests fail on the pre-rename -reviewer names. ceremony#232
records the debt and verifies. Authorized by @andres in-session.
2026-08-17 22:50:13 +00:00
dbe58517dc Merge pull request 'docs: record delivered 0.6.1 runner exercise' (#227) from issue-217-runner-consumer into main
Reviewed-on: heavy-duty/ceremony#227
Reviewed-by: cluade-reviewer-andresmgsl <andres+1@heavyduty.builders>
Reviewed-by: glm-reviewer-andresmgsl <andres+5@heavyduty.builders>
Reviewed-by: kimi-reviewer-andresmgsl <andres+4@heavyduty.builders>
2026-08-09 21:09:36 +00:00
Codex Review
2aafc04018 docs: record delivered 0.6.1 runner exercise 2026-08-09 20:35:49 +00:00
github-actions[bot]
5693bee9f3 chore: bump main to 0.6.2-dev — a dev install must not impersonate 0.6.1 2026-08-09 19:47:02 +00:00
338cf5f754 Merge pull request 'release 0.6.1' (#226) from release-0.6.1 into main
Reviewed-on: heavy-duty/ceremony#226
Reviewed-by: cluade-reviewer-andresmgsl <andres+1@heavyduty.builders>
Reviewed-by: kimi-reviewer-andresmgsl <andres+4@heavyduty.builders>
Reviewed-by: glm-reviewer-andresmgsl <andres+5@heavyduty.builders>
2026-08-09 19:43:10 +00:00
Codex Review
b104eca141 docs: record 0.6.1 Forgejo rehearsal 2026-08-09 18:20:49 +00:00
7 changed files with 159 additions and 32 deletions

4
.github/labels.conf vendored
View file

@ -1,5 +1,5 @@
panel=codex-reviewer-andresmgsl glm-reviewer-andresmgsl cluade-reviewer-andresmgsl kimi-reviewer-andresmgsl panel=codex-bot-andresmgsl glm-bot-andresmgsl cluade-bot-andresmgsl kimi-bot-andresmgsl
triage-actors=cluade-reviewer-andresmgsl triage-actors=cluade-bot-andresmgsl
scope:release-flow|C5DEF5|The reusable release workflow, decide, the doors scope:release-flow|C5DEF5|The reusable release workflow, decide, the doors
scope:guards|C5DEF5|changelog-armed / changelog-monotonic / drill-recorded scope:guards|C5DEF5|changelog-armed / changelog-monotonic / drill-recorded
scope:labels|C5DEF5|The labels workflow, reconciler, the taxonomy scope:labels|C5DEF5|The labels workflow, reconciler, the taxonomy

View file

@ -48,10 +48,10 @@ the box is the blast-radius boundary; roles are what a session is told, and
| identity | box (rig tenant) | standing work | | identity | box (rig tenant) | standing work |
|---|---|---| |---|---|---|
| `cluade-reviewer-andresmgsl` | `triage` (claude-box) | **triage** — the only door issues come through; this identity mints issues and nothing else writes them (#18's `triage-actors`) — and review. It does not build. | | `cluade-bot-andresmgsl` | `triage` (claude-box) | **triage** — the only door issues come through; this identity mints issues and nothing else writes them (#18's `triage-actors`) — and review. It does not build. |
| `codex-reviewer-andresmgsl` | codex-box | build + review | | `codex-bot-andresmgsl` | codex-box | build + review |
| `glm-reviewer-andresmgsl` | glm-box | review | | `glm-bot-andresmgsl` | glm-box | review |
| `kimi-reviewer-andresmgsl` | kimi-box | review | | `kimi-bot-andresmgsl` | kimi-box | review |
**The review panel for any PR is every bench identity except its author** — **The review panel for any PR is every bench identity except its author** —
recusal by construction, enforced by the reconciler (#10): the required recusal by construction, enforced by the reconciler (#10): the required
@ -97,14 +97,13 @@ table repeats it (#104).
## Doctrine conventions ## Doctrine conventions
The vendored role files — `AGENTS.md`, `TRIAGE.md`, `BUILDER.md`, The vendored role files — the set [`docs/VENDORED.txt`](docs/VENDORED.txt)
`REVIEWER.md`, `LABELS.md`, and `RELEASES.md` — state each normative rule declares — state each normative rule completely, keep at most one sentence of
completely, keep at most one sentence of why, and cite its record only with a why, and cite its record only with a bare parenthetical such as `(#N)`,
bare parenthetical such as `(#N)`, `(#N D3)`, or `(#N, #M)`. Incident `(#N D3)`, or `(#N, #M)`. Incident narrative — timestamps, actors, quoted
narrative — timestamps, actors, quoted comments, measured counts, and links to comments, measured counts, and links to specific comments — belongs in that
specific comments — belongs in that record. If a rule cannot be followed record. If a rule cannot be followed without chasing its cite, the rule is
without chasing its cite, the rule is under-stated: fix the statement, not the under-stated: fix the statement, not the citation. (#280)
citation. (#280)
Normative text in those files does not cite issues from other repositories. Normative text in those files does not cite issues from other repositories.
Consumers read the vendored bytes outside this organization's context, and a Consumers read the vendored bytes outside this organization's context, and a
@ -119,21 +118,12 @@ every session. (#280)
## How the other repos use this ## How the other repos use this
Two consumption modes, split by what has a runtime: Two consumption modes, split by what has a runtime: **machinery by
reference**, fetched at run time from the ref a caller pins, and **doctrine
- **Machinery is consumed by reference.** Workflows and actions are fetched as a mirror** — the set [`docs/VENDORED.txt`](docs/VENDORED.txt) declares,
by GitHub at run time from the ref the caller pins — no copy exists in the vendored at `.ceremony/` and held to the pin by a guard (issue #19). The
consumer. [README](README.md) states both modes in full, and why they differ; what
- **Doctrine is consumed as a machine-verified mirror.** A document's only follows is only what they leave a governed repo to carry.
"runtime" is an agent reading the working tree of the repo it stands in —
a doc that requires a cross-repo fetch before it governs is a doc that
sometimes goes unread. So the agent-facing set — **AGENTS.md, TRIAGE.md,
BUILDER.md, REVIEWER.md, LABELS.md, RELEASES.md** — is vendored into each governed
repo at **`.ceremony/`**, byte-identical to this repo at the pinned ref,
by the sync tool (issue #19). A CI guard diffs the mirror against the pin
on every PR: hand-editing a vendored file, or bumping the pin without
re-syncing, goes red. It is a copy that cannot drift — which is the only
kind of copy this org allows.
A governed repo (box, rig, cast, incubator, …) therefore carries: A governed repo (box, rig, cast, incubator, …) therefore carries:

View file

@ -1 +1 @@
0.6.1 0.6.2-dev

3
changelog.d/217.md Normal file
View file

@ -0,0 +1,3 @@
### Changed
- `docs/RUNNER-PROBES.md` records the delivered 0.6.1 consumer exercise in the standing Forgejo runner venue (#217).

1
changelog.d/229.md Normal file
View file

@ -0,0 +1 @@
- Forge consumers now receive the upstream 0.6.1 and 0.6.2 doctrine for vendored-set routing, review-round signalling, operator-owned remainders, producer liveness, and post-merge release edges (#229).

View file

@ -368,8 +368,25 @@ memory.
caller's `event.inputs` on this instance. Records: caller's `event.inputs` on this instance. Records:
[probe issues #4 and #5](https://forgejo.heavyduty.builders/heavy-duty/ceremony-runner-probe/issues/4) [probe issues #4 and #5](https://forgejo.heavyduty.builders/heavy-duty/ceremony-runner-probe/issues/4)
(runs 6 and 7). (runs 6 and 7).
- A 0.6.0 consumer exercise once ceremony#198 has merged. (#198 merged - **ceremony#217** — DELIVERED (2026-08-09). The standing venue used the
2026-08-05; this probe remains open.) published consumer callers without rewrites or bypasses:
`labels.yml@0.6.1` and `labels-sweep.yml@0.6.1`. Opening fixture issue #7
drove event caller
[run 23](https://forgejo.heavyduty.builders/heavy-duty/ceremony-runner-probe/actions/runs/23)
and its dispatched sweep
[run 24](https://forgejo.heavyduty.builders/heavy-duty/ceremony-runner-probe/actions/runs/24);
the sweep wrote `needs-triage` on that issue under the workflow token. A
separate manual sweep was green in
[run 25](https://forgejo.heavyduty.builders/heavy-duty/ceremony-runner-probe/actions/runs/25).
Observer
[run 30](https://forgejo.heavyduty.builders/heavy-duty/ceremony-runner-probe/actions/runs/30)
recorded the released tag SHA `338cf5f754f0e87feefe9231b47910fb236ab4d0`,
both caller runs and the resulting label set in
[probe issue #10](https://forgejo.heavyduty.builders/heavy-duty/ceremony-runner-probe/issues/10).
The event caller loaded its reusable workflow at `@0.6.1`; both sweep runs
completed the reusable workflow's internal `CEREMONY_SELF_REF` checkout at
the real `0.6.1` tag. There was no candidate SHA rewrite and no dogfood
bypass.
Two venue lessons from the first drills, kept where the next probe author will Two venue lessons from the first drills, kept where the next probe author will
look: look:

116
drills/0.6.1.md Normal file
View file

@ -0,0 +1,116 @@
# 0.6.1 — drill record
Run 2026-08-09 by `codex-reviewer-andresmgsl` against release PR !226,
candidate branch `release-0.6.1`, canonical candidate SHA
`ba3b17af88e0fe1ccae9eefd4b37bf2666f6cdad`. All six probes ran on this
Forgejo instance. Each result below was read from its own run and from the
repository state after that run.
## Scope ruling — a full rehearsal was owed
The last rehearsed tag was `0.6.0`. The release path at this candidate is the
exact output of `.github/scripts/release-path.sh`. Its measured diff from
`0.6.0` is not pin-only: `.github/workflows/release.yml`, `lib/facts.sh`, and
the new `lib/forge.sh` changed. These are release-door bytes, so the
doors-unchanged record shape is refused and this release carries a full live
rehearsal.
## Where
Disposable **private** repository `heavy-duty/ceremony-drill-0.6.1`, created
by the operator on 2026-08-09 after the fleet identity's personal repository
could not see the organization runner. It carries the `docs/CONSUMERS.md`
release caller with `version-source: file`, a fragment-mode fixture armed at
`0.6.1-dev`, and a non-blank `drills/0.6.1.md`. The `release` label existed
before the first probe PR.
**Disposal as observed when this record was written:** the repository is
private and **not yet archived**. This builder's archive PATCH returned 403
because it has push but not admin permission. The operator was asked to
archive it; delete remains the operator's later step. No archive or delete is
claimed, and cleanup gates neither review nor merge.
## Candidate-ref deviation
The candidate tree pins `CEREMONY_SELF_REF` to `0.6.1`, a tag that did not
exist before this release. No branch named `0.6.1` was created on
`heavy-duty/ceremony`.
The scratch caller instead uses
`codex-reviewer-andresmgsl/ceremony/.github/workflows/release.yml@drill/0.6.1`.
That ref is commit `f766752090429241c20a0d86aba6f679d713fc2c`; its parent is the canonical
candidate SHA above, and its only change rewrites all three
`CEREMONY_SELF_REF` carriers to that canonical SHA. The release path is
therefore byte-identical to the candidate except for the required candidate
pin rewrite.
## Probes
| # | probe | run | result |
|---|---|---|---|
| 1 | merge-door ceremony | 5 | ✅ one `0.6.1` release; tag points to merge commit `438097fc75b1d294b448830a3a79c00b0ee7b83f`; main re-armed to `0.6.2-dev` |
| 2 | release-labelled ordinary PR | 2 | ✅ green no-op; zero tags and zero releases |
| 3 | bare-version PR without `release` | 3 | ✅ refused; zero tags and zero releases |
| 4 | completed ceremony repeated | 7 | ✅ refused; release count stayed one and tag `0.6.1` stayed on the original merge commit |
| 5 | manual matching tag | 8 | ✅ `0.6.2` published from its own changelog section; main was unchanged |
| 6 | mismatched tag | 9 | ✅ refused before publication; no `9.9.9` release, and the operator-created probe tag was removed afterwards |
### Probe 1 — merge door
PR #4 transitioned `VERSION` from `0.6.1-dev` to `0.6.1`, assembled both
fixture fragments, and carried the `release` label. Run 5 succeeded. The
published body is exactly the assembled `0.6.1` section, tag `0.6.1` points
to PR #4's merge commit, and the workflow pushed `0.6.2-dev` to main at
`1c74d76f035da4a13f7af0d2a43d611092061204`.
### Probe 2 — labelled ordinary work
PR #1 carried the `release` label and added only `changelog.d/2.md`.
`VERSION` stayed `0.6.1-dev`. Run 2 succeeded as a no-op; the tag and release
lists were both empty afterwards.
### Probe 3 — bare version without declared intent
PR #2 assembled the two fragments and transitioned to bare `0.6.1`, but had
no `release` label. Run 3 failed. Both tag and release lists remained empty.
Setup PR #3 then reverted that probe and restored the armed fixture; run 4
was green before the ceremony probe began.
### Probe 4 — completed ceremony repeated
Forgejo exposes no run-rerun API, so this probe reproduced the completed
door's input. Setup PR #5 restored `0.6.1-dev` and run 6 was green. Release-
labelled PR #6 transitioned to bare `0.6.1` again. Run 7 failed at the
already-existing tag guard. The release count stayed one and tag `0.6.1`
still pointed to the original ceremony merge commit, not PR #6.
### Probe 5 — matching manual tag
Side branch `probe5-tag` carried bare `VERSION 0.6.2` and a publishable
`0.6.2` changelog section. Tag `0.6.2` was created at
`a4ba62aa83fdd2e259ed3c3e906b13eaab1abcd0`. Run 8 succeeded and published
only that section. Main stayed at the state left by probe 4; the tag door did
not push a version change to it.
### Probe 6 — mismatched tag
Tag `9.9.9` was created at the same `0.6.2` tree. Run 9 failed before
publication. The release list remained exactly `0.6.1` and `0.6.2`. The
operator-created `9.9.9` ref was then deleted; the remaining tag list was
exactly `0.6.1` and `0.6.2`.
## Runs that are setup, not probes
- Run 1: the initial `0.6.1-dev` fixture push; green no-op.
- Run 4: PR #3 restored the armed fixture after probe 3; green.
- Run 6: PR #5 restored `0.6.1-dev` to reproduce the completed ceremony
input for probe 4; green.
## What this rehearsal establishes
Both release doors ran against the 0.6.1 candidate's Forgejo implementation.
The merge door published once, tagged the reviewed merge commit, and re-armed
main. It stayed a green no-op for labelled ordinary work, refused a bare
unlabelled transition, and refused a repeated ceremony. The tag door
published a matching tag without changing main and refused a mismatched tag
without publishing. Every refusal created no tag or release of its own.