docs: make consumer guard adoption tag-aware #76
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#76
Loading…
Reference in a new issue
No description provided.
Delete branch "build/14-convert-box"
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?
Part of #14
Summary
Correct the consumer guide after the box conversion proved that
maindocumentedrunner-isolatedeven though the pinned0.1.0release does not carry that action.Worklog
runner-isolatedunreleased and absent from0.1.0issues:trigger unreleased and absent from0.1.0triage-actors=guidance tag-aware and prohibit adding it before the carrying pin bumpVerification
bash test/run.sh— 15 test files passed, 0 failed on initial head, round-1 head162ce6b, and round-2 commit0d74c820.1.0source inspection —load_configrecognizes onlypanel=before treating other rows as label rows; the guide now warns that earlytriage-actors=is a parse failure🔎 reviewing head
3e96d80389Verdict: approve
Reviewed head
3e96d80against issue #14's three upstream CONSUMERS.md edits (triage amendment / ruling) and verified the factual claims against the0.1.0tag.Acceptance criteria (the guide fixes this PR owns)
runner-isolatedunreleased / not in0.1.0mainmain; adopt missing actions at pin-bump; never mix refsVerification
git ls-tree -r 0.1.0 -- actions/has armed, monotonic, drill-recorded, docs-sync; norunner-isolated(exists only fromfccdd40onward) — the unreleased mark and the "three + docs-sync" claim are accurate.docs/CONSUMERS.md.bash test/run.shat this head: 15 test files passed, 0 failed.No blockers. Non-blocking: none.
🔎 reviewing head
3e96d80389Approve — head
3e96d8038974208169a029c84e564dfb3a0eed5f.Reviewed the whole PR at this head against issue #14's "Upstream feedback" section, which names exactly three CONSUMERS.md edits. All three land:
runner-isolatedmarked unreleased in the bootstrap guard block — the YAML comment now states it is not in0.1.0and must be adopted with the pin bump to the first carrying tag, never by mixing refs.main, new machinery enters marked unreleased and loses the mark when a tag ships it, and adoption at an absent action's pin happens only at the pin bump. Matches the triage amendment's wording.Facts verified, not assumed:
git ls-tree 0.1.0 actions/— carrieschangelog-armed,changelog-monotonic,docs-sync,drill-recorded,labels-reconcile; norunner-isolated(it landed atfccdd40after the tag, per the issue). The doc's claim checks out.0.1.0indeed carries the three release guards plusdocs-sync, as the new text states.issueflow-reconcile(also main-only) is not referenced anywhere in CONSUMERS.md, so no second unmarked step exists.bash test/run.shin a detached worktree at this head: 8 test files pass, 7 fail — identical profile toorigin/mainrun the same way here. The failures are environmental (npmnot installed, so every package-json case fails; the sweep-fixture cases fail on main too) and untouched by a docs-only diff. No test readsdocs/CONSUMERS.mdbeyond a fixture string, so nothing the suite guards can regress.Non-blocking nit: the new "carries the three release guards above plus
docs-sync" sentence is scoped to this step's guard list and is accurate in that scope; a reader could momentarily forgetlabels-reconcilealso ships at0.1.0(it's covered in the Labels automation step). Not worth a round.🔎 reviewing head
3e96d80389Approve — reviewed at head
3e96d80.This PR delivers exactly the three CONSUMERS.md edits decided in #14's "Upstream feedback this conversion owes" section, and each one checks out against the repo's actual state:
runner-isolatedmarked unreleased in the bootstrap block — the YAML comment sits directly above therunner-isolatedstep and states both the fact (not in0.1.0) and the remedy (adopt at the pin bump, never mix refs). Verified the fact independently:git ls-tree 0.1.0 actions/showschangelog-armed,changelog-monotonic,docs-sync,drill-recorded,labels-reconcile— norunner-isolated, which exists only onmain(landed in #58 after the tag).main, that new machinery enters marked unreleased until a tag ships it, and that adoption happens at the pin bump, never through mixed refs. "The three release guards above plusdocs-sync, but notrunner-isolated" is accurate per the tag listing above, and reads correctly in context (the block above lists exactly those three release guards).Also verified:
bash test/run.shat the head: 15 test files passed, 0 failed — matches the PR's verification claim.five,four CI guards): no leftovers.Closesis right here: #14 is the box conversion and stays open; this PR is only its upstream-feedback leg.One non-blocking nit, at the builder's discretion: in the Version pinning bullet, the preceding sentence says "the workflow callers and each guard step" (plural — release plus labels), while the new sentence says "the caller plus the guards". A repo with labels automation has two callers, so "the caller(s)" or "the workflow callers" would be more precise. Not worth a round on its own.
🔧 addressing round on head
3e96d80389.docs-sync” could momentarily obscure thatlabels-reconcilealso ships in0.1.0. Agree with the observation but not with changing this sentence: it explicitly describes the release-guard block above, while the labels action is documented in the next numbered step. I will leave that scoped wording intact.No blocking point or ruling is outstanding. The only code/docs change this round is the caller-count precision edit above; I will add it to the PR Worklog, commit and push it, check it off, rerun the relevant verification, and re-request all three reviewers because the head will change.
Round 1 fix complete at
162ce6b: the tag-dependent count now covers the workflow caller or callers, so both release-only and labels-enabled consumers read correctly.bash test/run.sh: 15 test files passed, 0 failed. Re-requesting Grok, Kimi, and Claude because the head changed.🔎 reviewing head
162ce6b817Approve head
162ce6b817.Docs-only round-1 head, reviewed whole. Verified against the spec (Part of #14) and the repo's own facts:
0.1.0tag carrieschangelog-armed,changelog-monotonic,drill-recorded, anddocs-sync— and does not carryrunner-isolated(confirmed via the contents API at ref0.1.0;runner-isolatedonly exists at head). Marking the step unreleased and forbidding mixed refs is the correct correction, and it matches the version-pinning section's same-tag rule.## Unreleasedconvention.CI green on this head (
testand all guards pass).🔎 reviewing head
162ce6b817🔎 reviewing head
162ce6b817Verdict: approve
Reviewed whole PR at head
162ce6bagainst issue #14's three upstream CONSUMERS.md edits (triage amendment / ruling) and the round-1 wording fix.Acceptance criteria (the guide fixes this PR owns)
runner-isolatedunreleased / not in0.1.0mainmain; adopt missing actions at pin-bump; never mix refsRound-1 delta
Prior head
3e96d80used singular "the caller plus the guards…". Claude's non-blocking precision point is addressed: the count now covers both release-only (one caller) and labels-enabled (two callers) consumers, without resurrecting a fixed number.Verification
git ls-tree -r 0.1.0 -- actions/carries armed, monotonic, drill-recorded, docs-sync, labels-reconcile; norunner-isolated(exists only fromfccdd40/ #58 onward) — the unreleased mark and the "three + docs-sync" claim are accurate.docs/CONSUMERS.md.bash test/run.shat this head: 15 test files passed, 0 failed.No blockers. Non-blocking: none.
Reviewed head
162ce6bin a detached worktree (re-review; my previous approve covered3e96d80, and the count fix in the new commit is correct — box at 0.1.0 with the labels caller has sixuses:lines, not five).The guards-side correction is right and I verified the underlying facts:
0.1.0is the only tag, it carries changelog-armed / changelog-monotonic / drill-recorded / docs-sync, andrunner-isolatedis unreleased. But the PR's own new rule — "New machinery is marked unreleased here until a release tag ships it" — is violated one section down, on the side that just burned a real consumer.Blocking: the Labels automation section (L235–285) is not tag-aware. It presents, with no unreleased marker:
issues:trigger in the caller stub (L254), andtriage-actorsas a mandatory labels.conf setting (L272–285).Both are ceremony#32 machinery — on main, in no tag. A consumer converting at
0.1.0who follows this section ships a labels.conf the pinned reconciler cannot parse:load_configat 0.1.0 routes every non-panel=line toparse_label_row, andtriage-actors=...fails as a malformed label row — the labels workflow goes red on every run from the moment of merge. This is not hypothetical: box#164 did exactly this (copying this guide), and I had to request changes on it an hour ago with the reproduction (labels: malformed label row: triage-actors=dan-claude-bot, exit 1, against the extracted 0.1.0 script).Fix: mark the labels-side additions the same way the guards side now is — at 0.1.0 the caller stub has no
issues:trigger and labels.conf ispanel=+ scope rows only; theissues:trigger and the mandatorytriage-actors=arrive with the first tag carrying ceremony#32, adopted at the pin bump, never mixed.CI is green on this head and the rest of the diff is sound; with the labels section marked, this is an approve.
🔎 reviewing head
162ce6b817Request changes on head
162ce6b817. Reviewed the whole PR at this head in a detached worktree.What checks out. The diff delivers all three CONSUMERS.md edits issue #14 prescribes, and I verified the underlying facts independently:
0.1.0is the repo's only tag; at that tag the guard set ischangelog-armed,changelog-monotonic,drill-recorded,docs-sync, andrunner-isolateddoes not exist (it landed atfccdd40, post-tag). The unreleased marker on the bootstrap guard block, the mixed-refs refusal, and the tag-dependent reference count in Version pinning are all correct as written. CI is green on this head.Blocking: the PR's own rule is falsified one section down, and I reproduced the breakage. The new paragraph states: "This guide documents
main. New machinery is marked unreleased here until a release tag ships it." That claim is not true of the document this PR ships. The Labels automation section presents, with no unreleased marker:issues:trigger in the complete caller stub, andtriage-actors=as a mandatorylabels.confsetting ("one mandatory panel setting, one mandatorytriage-actorssetting").Both are post-
0.1.0machinery (the ceremony#32/#18 line, merged after therelease: 0.1.0commit;git log 0.1.0..main -- actions/labels-reconcile/confirms). I extractedactions/labels-reconcile/labels-reconcile.shat ref0.1.0and ran itsload_configagainst alabels.confwritten exactly per this guide:At
0.1.0,load_configspecial-cases onlypanel=and routes every other non-blank line toparse_label_row, so the guide's mandatory line hard-fails the labels workflow on every run for a0.1.0-pinned consumer. This is the exact incident class this PR exists to close (a0.1.0consumer following a main-documented guide), and it has already burned a real consumer per the panel record (box#164). Shipping the "machinery is marked unreleased here" sentence while known unreleased machinery sits unmarked in the same file makes the guide actively misleading at the moment of merge — this is a correctness defect of the PR at this head, not out-of-scope pre-existing text, because the PR's added sentence asserts a property the document demonstrably lacks.What unblocks approval (concurring with kimi-bot's round): give the labels side the same treatment the guards side now has —
issues:trigger in the caller stub unreleased / not in0.1.0.triage-actors=unreleased: at0.1.0the file ispanel=plus scope rows only, and the mandatorytriage-actors=line arrives with the pin bump to the first tag carrying ceremony#32 — never by mixing refs, and never added early (at0.1.0it is a parse failure, not an ignored setting).With those markers in place, this is an approve; the rest of the diff needs no further changes.
🔧 addressing round on head
162ce6b817.0.1.0issues:trigger and mandatorytriage-actors=setting unmarked; at0.1.0,triage-actors=is parsed as a malformed label row and breaks the workflow. Agree. I will mark theissues:trigger as unreleased and absent from0.1.0, and document thattriage-actors=is likewise unreleased, must not be added at0.1.0, and arrives only with the first carrying tag at the same pin bump.0.1.0parse failure. Agree. I will make the caller stub and labels.conf guidance explicitly tag-aware, state that0.1.0usespanel=plus scope rows only, and preserve the no-mixed-refs rule. Claude reports no other changes are needed.No disagreement or maintainer ruling is outstanding. I will add two Round 2 fix checkboxes to the PR Worklog, update only
docs/CONSUMERS.md, run the full suite plus a focused check of the0.1.0labels configuration claims, commit and push the completed fix, check off the Worklog items, then answer the round whole and re-request Kimi and Claude, the two non-approvers.Round 2 is complete at
0d74c82.issues:unreleased and absent from0.1.0, with adoption only at the first ceremony#32-carrying pin bump. The configuration guidance now saystriage-actors=is also unreleased, that0.1.0acceptspanel=plus scope rows only, and that adding it early is a parse failure rather than an ignored setting. Both additions explicitly retain the no-mixed-refs rule.Verification:
bash test/run.shpasses all 15 test files;git diff --checkpasses; inspection of the0.1.0reconciler confirmsload_configspecial-cases onlypanel=and otherwise parses a row as a label. Both Round 2 Worklog items are checked. Re-requesting Kimi and Claude, the two non-approvers.🔎 reviewing head
0d74c827e7Approve head
0d74c827e7. Reviewed the whole PR at this head in a detached worktree.Round-2 blockers are resolved. Both items from my request-changes on
162ce6b(concurred by claude-bot) are now addressed:issues:trigger in the labels caller stub carries an unreleased marker inline, plus a paragraph below: not in0.1.0, omitted by0.1.0consumers, added only at the pin bump to the first tag carrying ceremony#32, never via mixed refs.triage-actors=is marked unreleased with the exact failure mode named — at0.1.0it is a parse failure, not an ignored setting — and the same pin-bump-only adoption rule.Facts re-verified at this head, not trusted from last round:
0.1.0is the repo's only tag; itsactions/tree carries changelog-armed, changelog-monotonic, docs-sync, drill-recorded, labels-reconcile — norunner-isolated(git ls-tree 0.1.0 actions/).load_configat0.1.0special-cases onlypanel=(grep of the extracted script: notriage-actorshandling), so the guide's "parse failure, not an ignored setting" claim is accurate.0.1.0(git log 0.1.0..HEADon the labels workflow and labels-reconcile shows the whole line landing after the tag).docs/CONSUMERS.md(+11); the previously-approved guards and count sections are unchanged.Test suite.
bash test/run.shin the worktree: all failures are environmental —nodenot installed (package-json version-source cases) andjqnot installed (issueflow-reconcile cases). None touch this docs-only diff; CI on the head is green.One non-blocking observation: L276 still reads "one mandatory
triage-actorssetting" and the example block shows the line — correct formain, which is what this guide documents, and the paragraph immediately below now carries the unreleased caveat. The placement is fine; no change needed.Docs-only, no changelog line required. Nothing else stands between this and handoff once the rest of the panel converges.
🔎 reviewing head
0d74c827e7Approve at head
0d74c827e7. Reviewed the whole PR at this head in a detached worktree.My round-2 blockers are resolved, and I re-verified each claim against the actual machinery rather than taking the text on faith:
issues:trigger marked unreleased — the caller stub now carries the inline# Unreleased — not in 0.1.0comment and a follow-up paragraph stating a0.1.0-pinned consumer omits it, adopting only at the pin bump to the first tag carrying ceremony#32, never through mixed refs. Verified:labels.ymlat0.1.0isworkflow_call-only, and theissues:-driven machinery (issueflow-reconcile) is post-tag.triage-actors=marked unreleased with the parse-failure warning — the new paragraph states that at0.1.0the file ispanel=plus scope rows only and that addingtriage-actors=is "a parse failure, not an ignored setting". Reproduced both sides:0.1.0'sload_configrejects it (labels: malformed label row: triage-actors=…, exit 1), while at this head the line is accepted byload_configand required byissueflow-reconcile.sh("missing triage-actors= line" → hard fail), so "mandatory … and unreleased" is exactly right for a main-documented, tag-adopted setting.Whole-PR check at this head (all previously verified facts still hold):
0.1.0is the repo's only tag;git ls-tree 0.1.0 actions/showschangelog-armed,changelog-monotonic,drill-recorded,docs-sync,labels-reconcile— norunner-isolated. The unreleased marker on the bootstrap guard step, the "guide documentsmain" paragraph, and the "three release guards plusdocs-sync, but notrunner-isolated" sentence are all accurate.162ce6b).bash test/run.shon this head: 15 test files passed, 0 failed. CI is green on the head, including the labels and release-exercise jobs.The guide is now internally consistent: the "machinery is marked unreleased here" rule it announces is true of every post-
0.1.0surface the document mentions — guards, trigger, and config setting alike. This closes the exact incident class that burned the box conversion (a0.1.0consumer following main-documented machinery).🔧 addressing round on head
0d74c827e7.triage-actors=mandatory while the adjacent paragraph marks it unreleased for0.1.0; Kimi finds that placement correct and needs no change. Agree. The guide intentionally documentsmain, while the immediately adjacent tag caveat prevents early adoption. No code or docs change is owed.No disagreement or maintainer ruling is outstanding. This is an approval-only round, so there are no fix steps to add under
## Worklogand no head-changing commit to make. I will verify the current-head panel gate, checks, mergeability, and blocker labels; if all gates pass, I will post the whole-round summary, request the human review, and setstate:needs-human.Round 3 and panel review are complete on head
0d74c827e714e1071e7c2a2b039db37411ab7f5c.issues:trigger andtriage-actors=configuration as unreleased and absent from0.1.0; documented adoption only at the first carrying pin bump and the early-setting parse failure.Verification:
bash test/run.shpasses all 15 test files on this head; every current CI check is green; the PR is cleanly mergeable; noblocker:*label stands. The Worklog is complete. Handing off to the human.Handoff validation exposed one remaining current-head gate: Grok approved
162ce6b, not current head0d74c82, so the reconciler correctly raisedblocker:unrequestedandstate:addressing. I have removed the premature human review request and optimisticstate:needs-humanlabel, and requested Grok on the current head. No code or docs change is owed; the PR returns to panel review until Grok supplies its head-current verdict. I will not hand off again until the reconciler shows zero blockers and all three panel approvals are current.🔎 reviewing head
0d74c827e7Approve head
0d74c827e7. Reviewed the whole PR at this head in a detached worktree (not only the round-2 delta).Round-2 blockers are resolved. The two items kimi and claude requested on
162ce6bare present and correct:issues:trigger — inline unreleased marker in the caller stub, plus a paragraph: not in0.1.0, omit at that pin, adopt only at the pin bump to the first tag carrying ceremony#32, never via mixed refs.triage-actors=— marked unreleased with the accurate failure mode: at0.1.0the conf ispanel=plus scope rows only; addingtriage-actors=is a parse failure, not an ignored setting. Same pin-bump-only adoption rule as the trigger.Independently re-verified (not trusted from prior rounds or panel peers):
0.1.0.git ls-tree 0.1.0 actions/carrieschangelog-armed,changelog-monotonic,drill-recorded,docs-sync,labels-reconcile— norunner-isolated. That action lands atfccdd40(#58), not an ancestor of0.1.0.load_configfrom0.1.0: special-cases onlypanel=; other non-blank lines go toparse_label_row. Against a conf withtriage-actors=dan-claude-bot:labels: malformed label row: triage-actors=dan-claude-bot, exit 1. Same conf without that line exits 0. At this head,load_configaccepts the line (exit 0).0.1.0labels reusable workflow isworkflow_call-only; theissues:trigger is caller-side machinery on the #32 line (issueflow-reconcileis post-tag).runner-isolated, the "guide documentsmain" rule, and "three release guards plusdocs-sync, but notrunner-isolated" all match the tree.0.1.0surface the guide names.Verification.
bash test/run.shin the worktree: 15 test files passed, 0 failed. CI on the head is green (test, self-guards, action/docs-sync/release exercises, labels reconcile). Docs-only diff; no changelog line required.Non-blocking: L276 still calls
triage-actors"mandatory" above an example that includes the line — correct formain, which this guide documents, with the unreleased/parse-failure caveat in the next paragraph. No change needed.Nothing blocking. Approve.
🔧 addressing round on head
0d74c827e7.triage-actorsremains described as mandatory formainimmediately before the unreleased and parse-failure caveat; Grok finds this accurate and needs no change. Agree. The wording correctly distinguishes the main contract from0.1.0adoption. No code or docs change is owed.No disagreement or maintainer ruling is outstanding. This is an approval-only completion of the current-head panel, so there are no fix steps to add under
## Worklogand no commit to make. I will close the existing handoff checkbox and verify the human request,state:needs-human, mergeability, checks, and absence of everyblocker:*label.Current-head panel convergence is complete at
0d74c827e714e1071e7c2a2b039db37411ab7f5c: Kimi, Claude, and Grok all approve this exact head. Grok independently re-verified the two Round 2 fixes and the whole PR; its only non-blocking observation agrees that the main-oriented mandatory wording is correct beside the explicit0.1.0caveat, so no change is owed. All 15 test files pass, CI is green, mergeability is clean, and no blocker stands. The Worklog is complete; human handoff remains requested fromdanmtunderstate:needs-human.