docs: README doctrine + CONSUMERS.md adoption guide #48
No reviewers
Labels
No labels
attention
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-ruling
needs-triage
offsite
post-merge
ready
release
scope:docs
scope:guards
scope:labels
scope:release-flow
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/ceremony#48
Loading…
Reference in a new issue
No description provided.
Delete branch "build/12-docs-doctrine"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #12.
Two documents:
README.md— the doctrine (greenfield; the extensionless 12-byte placeholder renamed and written) — anddocs/CONSUMERS.mdextended with the remaining adoption/migration sections (the release-workflow, artifact-hook, and labels sections already onmainfrom #27/#39 stay).Acceptance criteria (from #12)
Worklog
README→README.md, open draft PRlib/*.sh,actions/*, workflows,bin/changelog-section, currentdocs/CONSUMERS.mdREADME.md: what a release is · the two doors · the decide table for operators · the guards · drill doctrine · troubleshooting red main · design lineagedocs/CONSUMERS.md: prerequisites · bootstrap checklist · convert checklist · pinning policy · changelog contributor rule · agent-team-flow adoption + pin-bump procedureChangelog note: no
CHANGELOG.mdentry — the file itself lands with #11's bootstrap (PR #44), and this PR is documentation, not a behavior change (the rule binds behavior PRs).docs-sync note: the team-flow section documents
docs-syncfrom #19's contract (the tool is in flight in #43, per triage's guidance on #12); if #43 lands a different shape, that is a docs fix in the same cycle.Round 1 fixes
uses:reference updated together (callers + guard steps); release-only count made explicit (codex-bot, blocking)lib/decide.sh's spec comment (codex-bot, blocking)🔎 reviewing head d82ec7e8fb70a1b9e258c8a0c6ef299b11a5129d
🔎 reviewing head d82ec7e8fb70a1b9e258c8a0c6ef299b11a5129d
Verdict: approve
Reviewed head
d82ec7e8fb70a1b9e258c8a0c6ef299b11a5129dagainst #12's acceptance criteria and the in-tree sources.Acceptance criteria
README.mdcovers the full doctrine outline (release-as-PR, two doors, decide table, three guards, drill doctrine, troubleshooting catalog, design lineage).docs/CONSUMERS.mdextends with prerequisites, bootstrap, convert, artifact hook, pinning, changelog rule, team-flow adoption + pin-bump (release/labels caller sections retained from earlier landings). Spot-checked 42path#L…anchors — every range resolves inside a real file on this head; refuse messages cite the same lines the grep finds.grep -n -A2 'refuse \|>&2' lib/decide.sh lib/facts.sh .github/workflows/release.ymlplus the armed/version paths. Every full refusal quoted in the README is present in source text (decide rows 4–5 + fact guards, facts/version read failures, merge/tag door asserts, bump-fallback notice). The armed multi-line is intentionally abbreviated with…and points at the script for the full text — acceptable for the 2am cut.Spec coverage vs #12 body
fetch-depth: 0, singlepush:key,VERSIONat-dev, plaindrills/(not.drills) are called out with anchors.CHANGELOG.mdline required (and none present). CI green on this head (test, action-exercise, release-exercise fixtures).Non-blocking
actions/docs-syncfrom #19's contract while the action itself is in flight (#43). PR body already flags that; if #43 lands a different shape, fix the guide in that cycle (or in #13). Does not fail #12's checkable ACs.Approve.
Approve — head
d82ec7e8fb70a1b9e258c8a0c6ef299b11a5129d.Reviewed in a detached worktree at the head, against issue #12's acceptance criteria.
Criterion 1 — both documents land, claims linked.
README.md(385 lines) and the extendeddocs/CONSUMERS.md(343 lines) both land; the rename from the extensionless placeholder is clean and no in-repo link pointed at the old path. I spot-checked the load-bearing claims against the sources at this head and every one resolves: the decide table rendering matches the spec comment inlib/decide.sh:29-61; the first-release edge link (lib/decide.sh:70-74), the fact-guard block (L92-L105), rows 4/5 (L129-L133,L147-L149), the merge-door and tag-door refusal line ranges inrelease.yml(L202-L205, L207-L222, L292-L300, L333-L337, L346-L349), the guard-script rule blocks (changelog-armedL27-L42, drill-recordedL23-L48), thepush-to-main-never-pull_requestdoctrine (release.yml:70-74, box#97), the label read via API (lib/facts.sh:88-101), thereleaselabel row (labels-reconcile.sh:369), the plain-drillsrationale (drill-recorded.sh:49-52), and the caller YAML examples (release caller'sversion-source: filematches theworkflow_callinput default atrelease.yml:112-121; the labels caller matcheslabels.yml's callable shape).Criterion 2 — refusal catalog verbatim. I ran the README's own regeneration command (
grep -n -A2 'refuse \|>&2' lib/decide.sh lib/facts.sh .github/workflows/release.yml) and diffed mentally against the catalog: every quoted refusal is verbatim from source, interpolation variables included, and the two non-refusal-but-red-adjacent messages (the bump-PR fallback, the armed guard's main-tree failure) are correctly framed as such rather than dressed up as refusals.Criterion 3 — pilot check. Not checkable here by the issue's own design; #13 owns it.
Notes (non-blocking):
docs-syncreferences in CONSUMERS.md point at an action that lands with #43 (in flight); the PR body flags this per triage's guidance, and the text is written against #19's contract. Fine as documented-forward; if #43 changes shape, a docs fix in the same cycle covers it.CHANGELOG.mdentry is correct: the file lands with #44, and the contributor rule binds behavior PRs, not docs.Docs-only diff; nothing to run beyond the greps above, which I ran.
Verdict: I have feedback.
Blocking: docs/CONSUMERS.md says every ceremony uses reference must name the same exact tag, but the next bullet calls a release-only pin bump a one-line uses change. The setup in this guide has the release caller plus three guard references (and optionally the labels caller), so changing one line leaves the consumer split across ceremony versions. Please make the upgrade instruction require updating every ceremony reference together, and adjust the later pin-bump wording to be equally explicit; this guide is meant to support conversion with zero out-of-band knowledge.
Also please correct the README description of lib/decide.sh as a 5-state table: the rendered and source tables both have six rows. This is small, but it is operator-facing doctrine and should agree with the linked source.
🔧 addressing round on head
d82ec7eRound analysis — all three verdicts in (grok-bot ✅, kimi-bot ✅, codex-bot ❌); answering the round whole.
codex-bot (blocking) — pin-bump wording contradicts the same-tag rule. Agree. The "Version pinning" section correctly says every
uses:of ceremony names the same tag, then two bullets later calls a release-only repo's bump "the one-lineuses:change" — but the guide's own release-only setup has four references (the release caller + three guard steps), five with the labels caller. One line would split the consumer across versions, exactly what the same-tag rule forbids. Fix: the bump bullet will require updating every ceremonyuses:reference together (callers and guard steps, atomically, one PR), and "The pin-bump procedure" section gets the same explicitness — "the pin-line change in the workflow callers" becomes "every ceremonyuses:reference — workflow callers and guard steps".codex-bot (blocking, small) — README calls
lib/decide.sha "5-state table". Agree. The spec comment inlib/decide.shand the rendered table both have six rows; the "5-state" at README L101 is a plain miscount. Fix: "six-row".grok-bot (non-blocking) —
docs-syncdocumented from #19's contract while #43 is in flight. Acknowledged, no change: #43 is atstate:needs-humanon the same contract shape the guide documents; if it lands differently, the docs fix happens in that cycle, as the PR body already commits to.kimi-bot (non-blocking) — same docs-sync note + changelog-exemption note. Same as above; the no-changelog-line call is confirmed correct by both approvers, no change.
Fixes are docs-only, two files; pushing shortly, then re-requesting codex-bot.
Round 1 answered — fixes pushed, head
d82ec7e→c1ff338(one commit, docs-only:docs/CONSUMERS.md+README.md, +17/−9). Exactly per the plan of record above:uses:reference to the new tag — workflow callers and each guard step — and spells out that a release-only setup already has four (release caller + the three CI guards), so a one-line change would split the consumer across versions, which the same-tag rule forbids. "The pin-bump procedure" section says the same: every reference, all to the same new tag, linked back to the pinning rule.lib/decide.sh's spec comment and the rendered table.state:needs-humanon the documented contract shape; no change.All internal anchors in the new text resolve to real headings (
#release-workflow,#bootstrap-a-new-repo,#version-pinning). Re-requesting @codex-bot-andresmgsl onc1ff338.Verdict: I agree with everything and have no additional feedback.
Re-reviewed the full PR at head c1ff338 against #12. The pin-bump guidance now consistently requires every ceremony caller and guard reference to move together, and README correctly describes the decision table as six rows. The current docs satisfy the checkable acceptance criteria; current checks are green.
Rebased onto current main (resolved the docs/CONSUMERS.md conflict with #43's doctrine-mirror section; content otherwise unchanged) — approvals were staled by the push, re-requesting the panel.
🔎 reviewing head
55d0384c22Verdict: approve
Reviewed head
55d0384c2297bda1b2ac021b22ccd6cafe91003e(full PR at current head, detached worktree) against #12's acceptance criteria and in-tree sources.Round context
Prior panel round on
d82ec7eproduced two approvals (this identity, kimi) and codex request-changes (pin-bump "one-line" wording vs same-tag rule; README "5-state" miscount). Builder fixed both on the next head; then rebased onto main after #43, which staled all approvals. This is a full re-review of the rebased head.Acceptance criteria
Both documents land; workflow-behavior claims link a workflow line or specifying issue. Met.
README.md(385 lines) covers the doctrine outline (release-as-PR / three stamps, two doors, six-row decide table, three guards, drill doctrine, troubleshooting catalog, design lineage).docs/CONSUMERS.mdextends with prerequisites, bootstrap, convert, artifact hook, pinning, changelog rule, team-flow + pin-bump (release/labels/doctrine-mirror sections retained from earlier landings). Spot-checked load-bearing anchors at this head — decide tablelib/decide.sh#L29-L61(six rows), first-release edgeL70-L74, fact guardsL92-L105, rows 4/5L129-L133/L147-L149, merge-door and tag-door refusal ranges inrelease.yml, guard rule blocks, push-not-pull_request(release.yml#L70-L74), label API read (lib/facts.sh#L88-L101),releaselabel row (labels-reconcile.sh#L369), plain-drillsrationale, self-ref stamp — all resolve.Refusal-message catalog grepped from scripts/workflow, listed verbatim. Met. Re-ran
grep -n -A2 'refuse \|>&2' lib/decide.sh lib/facts.sh .github/workflows/release.ymlplus version/armed paths. Every full refusal quoted in the README is present in source (decide rows 4–5 + fact guards, facts/version read failures, merge/tag door asserts, bump-fallback notice). Armed multi-line abbreviated with…and points at the script — acceptable for the 2am cut.version_read: $path: no version fieldmatches the node path interpolation inlib/version.sh.#13 "done from CONSUMERS.md alone". Not checkable on this PR (pilot owns it). Guide states the sufficiency bar and the "file gaps as edits here" rule.
Round-1 fixes (still present after rebase)
uses:(callers and each guard step); release-only count made explicit (four); pin-bump procedure says the same and links the pinning rule.lib/decide.sh's spec comment and the rendered table.Other
CHANGELOG.mdentry required (behavior-PR rule). ExtensionlessREADME→README.mdrename is clean.docs-syncis no longer forward-doc only — #43 is on main; the doctrine-mirror section and team-flow checklist agree withactions/docs-sync(pin fromrelease.yml,modedefaultcheck, rootAGENTS.mdscaffold-once).Approve.
🔎 reviewing head
55d0384cApprove — head
55d0384c2297bda1b2ac021b22ccd6cafe91003e.Re-reviewed the whole PR at the current head in a detached worktree. My previous round approved
d82ec7e8; the branch has since been rebased onto main (which landed #43/#44) and carries one new content commit addressing codex's request-changes. PR's own diff vs main remains docs-only: extensionlessREADMErenamed toREADME.md(385 lines),docs/CONSUMERS.mdextended (+245).Round-1 fixes verified at this head:
README.md:101), matching the spec comment inlib/decide.shand the rendered operator table — codex's count point is fixed.uses:reference, with the release-only count made explicit (docs/CONSUMERS.md:304), and the pin-bump procedure section links the same rule — codex's split-version point is fixed.Acceptance criteria re-check at this head:
grep -n -A2 'refuse \|>&2' lib/decide.sh lib/facts.sh .github/workflows/release.yml) at this head — the catalog still matches source verbatim.Also verified: the
docs-syncreferences are no longer forward-doc — #43 is on main, and the CONSUMERS text agrees with the landed action (modedefaultcheck, pin read from the consumer'srelease.yml, no ref input). CI green on this head (test, self-guards, action-exercise, docs-sync-exercise, release-exercise fixtures, labels). NoCHANGELOG.mdentry is correct — docs-only, and the contributor rule binds behavior PRs.Nothing blocking.
Verdict: I agree with everything and have no additional feedback.
Re-reviewed the complete PR at head
55d0384after the renewed review request and rebase onto current main. The rebase preserves the pin-bump fix requiring every ceremony caller and guard reference to move together, keeps the six-row decision-table correction, and cleanly incorporates the landed docs-sync doctrine. The checkable #12 acceptance criteria are satisfied and current checks are green.Round summary — converged, handing off
What shipped (docs-only, closes #12): the extensionless
READMEplaceholder renamed toREADME.mdand written as the full doctrine (385 lines — what a release is, the two doors, the six-row decide table, the three guards, drill doctrine, troubleshooting red main, design lineage), anddocs/CONSUMERS.mdextended (+245 lines) with the remaining adoption/migration sections: prerequisites, bootstrap checklist, convert checklist, version pinning, the changelog contributor rule, and agent-team-flow adoption with the pin-bump procedure. Every workflow-behavior claim links the workflow line or spec issue; the refusal-message catalog is grepped verbatim from the scripts and workflow, not paraphrased.Round 1 (head
d82ec7e): grok-bot ✅, kimi-bot ✅, codex-bot ❌ with two blocking points — the pin-bump bullets called a release-only bump "the one-lineuses:change", contradicting the guide's own same-tag rule (a release-only setup has four ceremony references), and README miscountedlib/decide.sh's table as "5-state". Both fixed inc1ff338: the bump guidance now requires every ceremonyuses:reference — callers and guard steps — updated together in one PR, and README says "six-row table". codex-bot re-approvedc1ff338. Non-blocking notes from grok-bot/kimi-bot (docs-sync documented from #19's contract while #43 was in flight) stood as flagged in the PR body.Rebase (
c1ff338→55d0384): rebased onto main after #43/#44 landed, resolving thedocs/CONSUMERS.mdconflict with #43's doctrine-mirror section; content otherwise unchanged. The push staled all approvals, so the whole panel was re-requested.Round 2 (head
55d0384, current): full re-reviews from all three — grok-bot ✅, kimi-bot ✅, codex-bot ✅. Reviewers verified the round-1 fixes survived the rebase, the load-bearing claims resolve against the sources at this head, and the landed docs-sync doctrine is cleanly incorporated.Verified: all checks green at
55d0384(test, self-guards, release-exercise fixture-chain + step-replays, action-exercise, docs-sync-exercise, labels reconcile/scope); noblocker:*labels; branch is conflict-free against main.Post-merge residue:
CHANGELOG.mdline: docs-only, no behavior change (confirmed by both approvers in round 1).@danmt the PR is yours — review requested,
state:needs-humanset.