docs: the parked claim and the one-build-at-a-time rule #81
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#81
Loading…
Reference in a new issue
No description provided.
Delete branch "build/77-parked-claim"
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 #77.
The one-issue-at-a-time bullet counted claims when it meant build work in flight, and the 2026-07-23 board (#15 and #16 parked beside the one active build #73) already contradicted it. This rewrites the rule as D1–D6 of #77: BUILDER.md's Picking bullet now counts a single active deliverable and defines the three parked shapes plus the non-parked counterexamples; Claiming gains the declared-never-inferred park comment (tied to the existing #52 / #68 reclaim-clock exemptions — no new label, no machinery) and the unparking rule; TRIAGE.md names a directed hold as a park in the escalate outcome.
Vendored-mirror note (test plan):
BUILDER.mdandTRIAGE.mdare both indocs/VENDORED.txt, so every governed repo's.ceremony/mirror drifts on merge; the mirrors refresh on each consumer's nextdocs-sync --fix, and that is the whole cost.Acceptance criteria
needs-rulinghard block can decide from BUILDER.md alone whether picking a second issue is legitimate.ready.needs-ruling(#52) andoffsite(#68) clock exemptions — no third mechanism.BUILDER.md,TRIAGE.md,CHANGELOG.mdand nothing else — no new label, nocore_label_rows()row, no change underactions/.Test plan
test/run.sh— 15 files, 22 asserts in the last file, all green; shellcheck and actionlint clean.Worklog
cb3d482(Picking/Claiming unchanged since the pinf6797d0; only the ruling-ask section moved)## Unreleased, above the0.1.0headingtest/run.sh+ shellcheck + actionlint greendc78c9a🔎 reviewing head dc78c9a7632c64a0c7abf1a4dd163aa8fe67021b
🔎 reviewing head dc78c9a7632c64a0c7abf1a4dd163aa8fe67021b
Verdict: approve
Reviewed head
dc78c9a7632c64a0c7abf1a4dd163aa8fe67021bagainst #77 (D1–D6 and the acceptance criteria). Docs-only change;test/run.sh— 15 files, all green.Acceptance criteria
needs-rulinghard block can decide alone whether a second pick is legitimatereadyclaim_decision()construction noteSpec decisions (D1–D6)
All six land as written. Read-through check: the wording does not admit two active builds — "at most one issue on which you are writing or revising a deliverable" plus parked = next move is someone else's. Cross-ref "(the review round, step 2)" resolves to the existing section. CHANGELOG line is under
## Unreleased, above0.1.0. No new label, no machinery.Non-blocking
None that matter. CHANGELOG still opens with the old rule name ("One issue at a time counts…") while BUILDER renames the bullet to "One build at a time" — intentional framing of the change, not a drift.
Approve.
The implementation satisfies #77's acceptance criteria. BUILDER.md makes the slot explicitly about one active deliverable, defines all three parked shapes and the non-parked cases, preserves abandonment, requires the declared waiter/owner comment, explains unparking and the lack of counter-based enforcement, and records the #15/#16/#73 evidence. TRIAGE.md adds the directed-hold duty, and the changelog and three-file scope are correct.
Verified at
dc78c9a:test/run.shpasses all 15 test files;shellcheck-all.sh,actionlint-all.sh, andgit diff --checkpass; all applicable GitHub checks are green.🔎 reviewing head dc78c9a7632c64a0c7abf1a4dd163aa8fe67021b
Approve — head
dc78c9a.Reviewed the whole PR against #77's acceptance criteria; all eight hold:
needs-rulinghard block decide from the doc alone.ready, explicitly distinguished from parking.claim_decision()(actions/issueflow-reconcile/issueflow-reconcile.sh:94) does see one issue at a time.BUILDER.md,TRIAGE.md,CHANGELOG.mdonly; the changelog line sits under## Unreleasedabove the## 0.1.0heading (insert-above, per the monotonic guard's rule).Verification, not just reading:
dc78c9ais fully green (test, self-guards, labels reconcile/scope, docs-sync-exercise, release-exercise chain; the release-on-* jobs skipped as designed).test/run.shin a detached worktree at the head: 8 passed / 7 failed files — then ran it onorigin/mainand got the identical profile. The failures are local-environment (nonode/npmfor the package-json cases, and the same pre-existing ruling/issueflow failures on main), not this PR. Docs-only diff cannot and does not change test behavior.The vendored-mirror drift note in the PR body is accurate —
BUILDER.mdandTRIAGE.mdare indocs/VENDORED.txt, and consumer.ceremony/mirrors refresh on their nextdocs-sync --fix. No blocking points.Round summary — handoff
What shipped. #77 whole (D1–D6), docs-only.
BUILDER.mdPicking now counts build work in flight — at most one issue on which you are writing or revising a deliverable — and defines the three parked shapes plus the three non-parked counterexamples, with the 2026-07-23 board (#15, #16 beside the one active build #73) as evidence (D1–D2). Claiming gains the declared-never-inferred park comment naming the waiter and the owner, tied to the existing #52 / #68 reclaim-clock exemptions, the unparking rule, and the plain statement that no counter or reconciler path enforces any of this (D3–D5).TRIAGE.mdnames a directed hold as a park in the escalate outcome (D6). OneCHANGELOG.mdline under## Unreleased. No new label, nocore_label_rows()row, nothing underactions/.Rounds. One round, no revisions. Panel requested at head
dc78c9a— the only head this PR has had — and codex, grok, and kimi each reviewed and approved that exact head with no changes requested.Verified.
test/run.sh— 15 files, 22 asserts in the last file, all green; shellcheck and actionlint clean. Full CI green ondc78c9a: test, self-guards, labels scope + reconcile, release-exercise (fixture-chain and both step-replays), docs-sync-exercise, action-exercise. All eight acceptance criteria checked in the body and independently confirmed by all three verdicts.Post-merge residue.
BUILDER.mdandTRIAGE.mdare both indocs/VENDORED.txt, so every governed repo's.ceremony/mirror drifts on merge; each mirror refreshes on that consumer's nextdocs-sync --fix, and that is the whole cost. Merge closes #77. Nothing else outstanding.Handing off: requesting @danmt and setting
state:needs-human.Rebased onto current main (
e1d50c9) to resolve the CHANGELOG.md conflict; new head iscf2adb8— re-requesting the panel since the push staled prior approvals.🔎 reviewing head
cf2adb89f5🔎 reviewing head
cf2adb89f5Verdict: approve
Reviewed head
cf2adb89f5672b84df1305910fe88a932d294fa1against #77 (D1–D6 and all eight acceptance criteria). Diff is docs-only (BUILDER.md,TRIAGE.md,CHANGELOG.md);test/run.sh— 15 files, all green.Acceptance criteria
needs-rulinghard block can decide from BUILDER.md alone that a second active pick is legitimate.needs-rulingwith named decider andBlocked:; (2) review round answered whole, outstanding verdicts belong to others; (3) remaining criteria operator-owned per triage. Not parked: waiting on yourself, CI, or “a good moment.” Abandonment still routes to unassign +ready.#52/#68reclaim-clock exemptions, no new label.actions/, nocore_label_rows().Read-through
The wording cannot be read as permitting two active builds: the slot is defined as deliverable-writing work, and park is defined by whose move it is. CHANGELOG line sits under
## Unreleasedabove0.1.0. References are issue links and in-doc section pointers, not SHA-fragile file-line permalinks.Non-blocking: none material enough to withhold approval.
The implementation satisfies #77 at
cf2adb8. BUILDER.md defines the slot as one active deliverable, enumerates exactly the three parked shapes and the non-parked counterexamples, preserves the abandonment path, requires a declared waiter/owner comment, and makes unparking consume the single slot again. It also explicitly rules out claim-counting machinery and records the #15/#16/#73 evidence. TRIAGE.md adds the directed-hold duty, while the changelog and three-file scope match the contract.Verified locally:
test/run.shpasses all 15 test files; the repository's shellcheck, actionlint, self-reference check, andgit diff --checkpass. All applicable GitHub checks are green at this head.🔎 reviewing head
cf2adb89f5Approving head
cf2adb8.This is the same change I approved at
dc78c9a, rebased onto the current main after #76 and #80 landed. Verification this round:origin/main. File set and stat identical (BUILDER.md+41/-2 across the two files,TRIAGE.md+4,CHANGELOG.md+1); the added and removed lines are byte-identical — only CHANGELOG hunk context shifted (line numbers and the new #74 FLEET.md context line from main). The rebase carried the change cleanly.cf2adb8is fully green (test, self-guards, labels reconcile/scope, docs-sync-exercise, action-exercise, release-exercise chain; release-on-merge/tag skipped as designed). Docs-only diff; nothing local could add over that.ready(D2); park declared-never-inferred via a comment naming waiter and owner, tied to the #52 / #68 clock exemptions, no third mechanism (D3); unparking takes the slot, one active build, stated on both issues (D4); doc states plainly that nothing counts claims per builder and no reconciler path enforces it (D5); TRIAGE.md names a directed hold as a park and requires naming what it waits on (D6); diff touches only the three files — no label, nocore_label_rows()row, nothing underactions/; the 2026-07-23 board evidence with links to #15, #16, #73 is in the file; changelog line sits under## Unreleasedabove## 0.1.0(insert-above rule intact after the rebase).No blocking points.
Closing round summary — handoff
What shipped. #77 whole (D1–D6), docs-only across
BUILDER.md,TRIAGE.md,CHANGELOG.md. The Picking rule now counts build work in flight — at most one issue on which you are writing or revising a deliverable — instead of claims held. The three parked shapes (needs-rulingwith a named decider; a round answered whole with outstanding verdicts belonging to others; remaining criteria operator-owned per triage) and the three non-parked counterexamples are enumerated, with the 2026-07-23 board (#15 and #16 parked beside the one active build #73) as evidence. Claiming gains the declared-never-inferred park comment naming the waiter and the owner, tied to the existing #52 / #68 reclaim-clock exemptions — no new label, no reconciler machinery — plus the unparking rule (the slot stays one; releases stated on both issues). TRIAGE.md's escalate outcome now names a directed hold as a park and requires triage to say what it waits on.Round 1 (head
dc78c9a): panel requested at the ready-for-review mark; all three approved — grok and codex at 16:31Z, kimi at 16:35Z, 2026-07-23. No changes requested; the round produced no diff changes.Between rounds: #76 and #80 merged to main, conflicting on
CHANGELOG.md. Rebased ontoe1d50c9→ new headcf2adb8; since the push staled the approvals, the panel was re-requested in full.Round 2 (head
cf2adb8): all three re-approved the current head. kimi computed a diff-of-diffs against each head's merge-base and confirmed the added/removed lines are byte-identical (only CHANGELOG hunk context shifted); codex re-rantest/run.sh(15 files green) plus shellcheck, actionlint, self-reference check, andgit diff --checklocally; grok re-walked all eight acceptance criteria and the two-active-builds read-through failure case against the new head.Verified at
cf2adb8. CI fully green: test, self-guards, labels reconcile/scope, docs-sync-exercise, action-exercise, and the release-exercise chain (release-on-merge/tag skipped as designed). Changelog line sits under## Unreleasedabove## 0.1.0— insert-above rule intact after the rebase. All references are issue links or in-document section pointers; no SHA-fragile permalinks. Diff touches exactly the three allowed files — no label rows, nothing underactions/.Post-merge residue.
BUILDER.mdandTRIAGE.mdare both indocs/VENDORED.txt, so every governed repo's.ceremony/mirror drifts on merge; each consumer's nextdocs-sync --fixrefreshes it. That is the whole cost — no other follow-up. Merge closes #77.Zero blockers, whole panel approved the current head — handing off per BUILDER.md: requesting @danmt and setting
state:needs-human.