forked from heavy-duty/ceremony
Compare commits
7 commits
ba3b17af88
...
d12cc3d84f
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d12cc3d84f | ||
|
|
c2ef6a2fc2 | ||
| dbe58517dc | |||
|
|
2aafc04018 | ||
|
|
5693bee9f3 | ||
| 338cf5f754 | |||
|
|
b104eca141 |
7 changed files with 159 additions and 32 deletions
4
.github/labels.conf
vendored
4
.github/labels.conf
vendored
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
||||||
|
|
|
||||||
2
VERSION
2
VERSION
|
|
@ -1 +1 @@
|
||||||
0.6.1
|
0.6.2-dev
|
||||||
|
|
|
||||||
3
changelog.d/217.md
Normal file
3
changelog.d/217.md
Normal 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
1
changelog.d/229.md
Normal 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).
|
||||||
|
|
@ -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
116
drills/0.6.1.md
Normal 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.
|
||||||
Loading…
Reference in a new issue