docs: the parked claim and the one-build-at-a-time rule #81

Merged
claude-bot-andresmgsl merged 1 commit from build/77-parked-claim into main 2026-07-23 16:50:57 +00:00
claude-bot-andresmgsl commented 2026-07-23 16:26:38 +00:00 (Migrated from github.com)

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.md and TRIAGE.md are both in docs/VENDORED.txt, so every governed repo's .ceremony/ mirror drifts on merge; the mirrors refresh on each consumer's next docs-sync --fix, and that is the whole cost.

Acceptance criteria

  • BUILDER.md states the rule in terms of build work in flight; a builder holding a needs-ruling hard block can decide from BUILDER.md alone whether picking a second issue is legitimate.
  • The three parked shapes and the three non-parked counterexamples are both present; abandonment still routes to unassign + ready.
  • D3 stated as a comment on the parked issue naming the waiter and the owner, tied to the existing needs-ruling (#52) and offsite (#68) clock exemptions — no third mechanism.
  • Unparking (D4) covered: the slot is one; a builder who unparks while active says on both issues which one they released.
  • The doc says plainly that nothing counts claims per builder and no reconciler path enforces this.
  • TRIAGE.md names a directed hold as a park and requires triage to say what it waits on.
  • Diff touches BUILDER.md, TRIAGE.md, CHANGELOG.md and nothing else — no new label, no core_label_rows() row, no change under actions/.
  • The 2026-07-23 board state cited as evidence, with links to #15, #16 and #73.

Test plan

  • test/run.sh — 15 files, 22 asserts in the last file, all green; shellcheck and actionlint clean.
  • Read-through: the new text cannot be read as permitting two active builds ("at most one issue on which you are writing or revising a deliverable").
  • No file-line permalinks added; all references are issue links or in-document section pointers, so nothing can rot.

Worklog

  • Read #77, current BUILDER.md/TRIAGE.md at cb3d482 (Picking/Claiming unchanged since the pin f6797d0; only the ruling-ask section moved)
  • BUILDER.md Picking — D1 rule + D2 three parked shapes, counterexamples, board citation
  • BUILDER.md Claiming — D3 declaration, D4 unparking, D5 no-machinery statement
  • TRIAGE.md escalate outcome — D6 sentence
  • CHANGELOG.md — one line under ## Unreleased, above the 0.1.0 heading
  • test/run.sh + shellcheck + actionlint green
  • Mark ready-for-review, request the panel (codex, grok, kimi) — requested at head dc78c9a
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.md` and `TRIAGE.md` are both in `docs/VENDORED.txt`, so every governed repo's `.ceremony/` mirror drifts on merge; the mirrors refresh on each consumer's next `docs-sync --fix`, and that is the whole cost. ## Acceptance criteria - [x] BUILDER.md states the rule in terms of build work in flight; a builder holding a `needs-ruling` hard block can decide from BUILDER.md alone whether picking a second issue is legitimate. - [x] The three parked shapes and the three non-parked counterexamples are both present; abandonment still routes to unassign + `ready`. - [x] D3 stated as a comment on the parked issue naming the waiter and the owner, tied to the existing `needs-ruling` (#52) and `offsite` (#68) clock exemptions — no third mechanism. - [x] Unparking (D4) covered: the slot is one; a builder who unparks while active says on both issues which one they released. - [x] The doc says plainly that nothing counts claims per builder and no reconciler path enforces this. - [x] TRIAGE.md names a directed hold as a park and requires triage to say what it waits on. - [x] Diff touches `BUILDER.md`, `TRIAGE.md`, `CHANGELOG.md` and nothing else — no new label, no `core_label_rows()` row, no change under `actions/`. - [x] The 2026-07-23 board state cited as evidence, with links to #15, #16 and #73. ## Test plan - [x] `test/run.sh` — 15 files, 22 asserts in the last file, all green; shellcheck and actionlint clean. - [x] Read-through: the new text cannot be read as permitting two *active* builds ("at most one issue on which you are writing or revising a deliverable"). - [x] No file-line permalinks added; all references are issue links or in-document section pointers, so nothing can rot. ## Worklog - [x] Read #77, current BUILDER.md/TRIAGE.md at `cb3d482` (Picking/Claiming unchanged since the pin `f6797d0`; only the ruling-ask section moved) - [x] BUILDER.md Picking — D1 rule + D2 three parked shapes, counterexamples, board citation - [x] BUILDER.md Claiming — D3 declaration, D4 unparking, D5 no-machinery statement - [x] TRIAGE.md escalate outcome — D6 sentence - [x] CHANGELOG.md — one line under `## Unreleased`, above the `0.1.0` heading - [x] `test/run.sh` + shellcheck + actionlint green - [x] Mark ready-for-review, request the panel (codex, grok, kimi) — requested at head `dc78c9a`
danmt (Migrated from github.com) reviewed 2026-07-23 16:26:38 +00:00
codex-bot-andresmgsl commented 2026-07-23 16:30:40 +00:00 (Migrated from github.com)

🔎 reviewing head dc78c9a7632c64a0c7abf1a4dd163aa8fe67021b

🔎 reviewing head dc78c9a7632c64a0c7abf1a4dd163aa8fe67021b
grok-bot-andresmgsl commented 2026-07-23 16:30:42 +00:00 (Migrated from github.com)

🔎 reviewing head dc78c9a7632c64a0c7abf1a4dd163aa8fe67021b

🔎 reviewing head dc78c9a7632c64a0c7abf1a4dd163aa8fe67021b
grok-bot-andresmgsl (Migrated from github.com) approved these changes 2026-07-23 16:31:38 +00:00
grok-bot-andresmgsl (Migrated from github.com) left a comment

Verdict: approve

Reviewed head dc78c9a7632c64a0c7abf1a4dd163aa8fe67021b against #77 (D1–D6 and the acceptance criteria). Docs-only change; test/run.sh — 15 files, all green.

Acceptance criteria

Criterion Status
Rule counts build work in flight; builder with needs-ruling hard block can decide alone whether a second pick is legitimate Met — Picking states the slot as one active deliverable; parked shape 1 is the hard block
Three parked shapes + three non-parked counterexamples; abandonment → unassign + ready Met
D3: declare park in a comment naming waiter + owner; tied to #52 / #68, no third mechanism Met in Claiming
D4 unparking: slot is one; release named on both issues Met
Nothing counts claims; no reconciler path Met, including the claim_decision() construction note
TRIAGE.md directed hold = park, names what it waits on Met in escalate outcome
Diff only BUILDER.md / TRIAGE.md / CHANGELOG.md Met (3 files, +44/−2)
2026-07-23 board cited with #15, #16, #73 Met

Spec 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, above 0.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.

## Verdict: approve Reviewed head `dc78c9a7632c64a0c7abf1a4dd163aa8fe67021b` against #77 (D1–D6 and the acceptance criteria). Docs-only change; `test/run.sh` — 15 files, all green. ### Acceptance criteria | Criterion | Status | |---|---| | Rule counts build work in flight; builder with `needs-ruling` hard block can decide alone whether a second pick is legitimate | Met — Picking states the slot as one active deliverable; parked shape 1 is the hard block | | Three parked shapes + three non-parked counterexamples; abandonment → unassign + `ready` | Met | | D3: declare park in a comment naming waiter + owner; tied to #52 / #68, no third mechanism | Met in Claiming | | D4 unparking: slot is one; release named on both issues | Met | | Nothing counts claims; no reconciler path | Met, including the `claim_decision()` construction note | | TRIAGE.md directed hold = park, names what it waits on | Met in escalate outcome | | Diff only BUILDER.md / TRIAGE.md / CHANGELOG.md | Met (3 files, +44/−2) | | 2026-07-23 board cited with #15, #16, #73 | Met | ### Spec 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`, above `0.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.
codex-bot-andresmgsl (Migrated from github.com) approved these changes 2026-07-23 16:31:51 +00:00
codex-bot-andresmgsl (Migrated from github.com) left a comment

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.sh passes all 15 test files; shellcheck-all.sh, actionlint-all.sh, and git diff --check pass; all applicable GitHub checks are green.

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.sh` passes all 15 test files; `shellcheck-all.sh`, `actionlint-all.sh`, and `git diff --check` pass; all applicable GitHub checks are green.
kimi-bot-andresmgsl commented 2026-07-23 16:34:22 +00:00 (Migrated from github.com)

🔎 reviewing head dc78c9a7632c64a0c7abf1a4dd163aa8fe67021b

🔎 reviewing head dc78c9a7632c64a0c7abf1a4dd163aa8fe67021b
kimi-bot-andresmgsl (Migrated from github.com) approved these changes 2026-07-23 16:35:00 +00:00
kimi-bot-andresmgsl (Migrated from github.com) left a comment

Approve — head dc78c9a.

Reviewed the whole PR against #77's acceptance criteria; all eight hold:

  1. Rule restated as build work in flight — BUILDER.md's Picking bullet now reads "at most one issue on which you are writing or revising a deliverable," and parked shape 1 lets a builder holding a needs-ruling hard block decide from the doc alone.
  2. Three parked shapes + three counterexamples present; abandonment still routes to unassign + ready, explicitly distinguished from parking.
  3. D3 declared-never-inferred — comment on the parked issue naming waiter and owner, tied to the existing #52/#68 clock exemptions, no third mechanism, no new label.
  4. D4 unparking covered — the slot is one; release/choice is announced on both issues.
  5. No counter, no machinery — stated plainly, and the reference checks out: claim_decision() (actions/issueflow-reconcile/issueflow-reconcile.sh:94) does see one issue at a time.
  6. TRIAGE.md names the directed hold as a park and requires naming what it waits on, in the escalate outcome where it reads as an existing duty.
  7. Diff scopeBUILDER.md, TRIAGE.md, CHANGELOG.md only; the changelog line sits under ## Unreleased above the ## 0.1.0 heading (insert-above, per the monotonic guard's rule).
  8. Evidence cited — the 2026-07-23 board with links to #15, #16, #73 is in the file.

Verification, not just reading:

  • CI at dc78c9a is fully green (test, self-guards, labels reconcile/scope, docs-sync-exercise, release-exercise chain; the release-on-* jobs skipped as designed).
  • Ran test/run.sh in a detached worktree at the head: 8 passed / 7 failed files — then ran it on origin/main and got the identical profile. The failures are local-environment (no node/npm for 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.
  • Read-through failure case from the test plan: the wording does not admit two active builds — "the slot is still one" is stated at both the parking and unparking points.
  • Parked shape 2's pointer "(the review round, step 2)" resolves correctly to BUILDER.md's "answer the round whole … re-request exactly the reviewers who did not approve."
  • No code permalinks introduced; new links are issue links, so the SHA-pinning rule is untouched.

The vendored-mirror drift note in the PR body is accurate — BUILDER.md and TRIAGE.md are in docs/VENDORED.txt, and consumer .ceremony/ mirrors refresh on their next docs-sync --fix. No blocking points.

**Approve** — head `dc78c9a`. Reviewed the whole PR against #77's acceptance criteria; all eight hold: 1. **Rule restated as build work in flight** — BUILDER.md's Picking bullet now reads "at most one issue on which you are writing or revising a deliverable," and parked shape 1 lets a builder holding a `needs-ruling` hard block decide from the doc alone. 2. **Three parked shapes + three counterexamples present**; abandonment still routes to unassign + `ready`, explicitly distinguished from parking. 3. **D3 declared-never-inferred** — comment on the parked issue naming waiter and owner, tied to the existing #52/#68 clock exemptions, no third mechanism, no new label. 4. **D4 unparking covered** — the slot is one; release/choice is announced on both issues. 5. **No counter, no machinery** — stated plainly, and the reference checks out: `claim_decision()` (actions/issueflow-reconcile/issueflow-reconcile.sh:94) does see one issue at a time. 6. **TRIAGE.md names the directed hold as a park** and requires naming what it waits on, in the escalate outcome where it reads as an existing duty. 7. **Diff scope** — `BUILDER.md`, `TRIAGE.md`, `CHANGELOG.md` only; the changelog line sits under `## Unreleased` above the `## 0.1.0` heading (insert-above, per the monotonic guard's rule). 8. **Evidence cited** — the 2026-07-23 board with links to #15, #16, #73 is in the file. Verification, not just reading: - CI at `dc78c9a` is fully green (test, self-guards, labels reconcile/scope, docs-sync-exercise, release-exercise chain; the release-on-* jobs skipped as designed). - Ran `test/run.sh` in a detached worktree at the head: 8 passed / 7 failed files — then ran it on `origin/main` and got the **identical** profile. The failures are local-environment (no `node`/`npm` for 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. - Read-through failure case from the test plan: the wording does not admit two active builds — "the slot is still one" is stated at both the parking and unparking points. - Parked shape 2's pointer "(the review round, step 2)" resolves correctly to BUILDER.md's "answer the round whole … re-request exactly the reviewers who did not approve." - No code permalinks introduced; new links are issue links, so the SHA-pinning rule is untouched. The vendored-mirror drift note in the PR body is accurate — `BUILDER.md` and `TRIAGE.md` are in `docs/VENDORED.txt`, and consumer `.ceremony/` mirrors refresh on their next `docs-sync --fix`. No blocking points.
claude-bot-andresmgsl commented 2026-07-23 16:36:31 +00:00 (Migrated from github.com)

Round summary — handoff

What shipped. #77 whole (D1–D6), docs-only. BUILDER.md Picking 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.md names a directed hold as a park in the escalate outcome (D6). One CHANGELOG.md line under ## Unreleased. No new label, no core_label_rows() row, nothing under actions/.

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 on dc78c9a: 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.md and TRIAGE.md are both in docs/VENDORED.txt, so every governed repo's .ceremony/ mirror drifts on merge; each mirror refreshes on that consumer's next docs-sync --fix, and that is the whole cost. Merge closes #77. Nothing else outstanding.

Handing off: requesting @danmt and setting state:needs-human.

## Round summary — handoff **What shipped.** #77 whole (D1–D6), docs-only. `BUILDER.md` Picking 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.md` names a directed hold as a park in the escalate outcome (D6). One `CHANGELOG.md` line under `## Unreleased`. No new label, no `core_label_rows()` row, nothing under `actions/`. **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 on `dc78c9a`: 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.md` and `TRIAGE.md` are both in `docs/VENDORED.txt`, so every governed repo's `.ceremony/` mirror drifts on merge; each mirror refreshes on that consumer's next `docs-sync --fix`, and that is the whole cost. Merge closes #77. Nothing else outstanding. Handing off: requesting @danmt and setting `state:needs-human`.
claude-bot-andresmgsl commented 2026-07-23 16:38:13 +00:00 (Migrated from github.com)

Rebased onto current main (e1d50c9) to resolve the CHANGELOG.md conflict; new head is cf2adb8 — re-requesting the panel since the push staled prior approvals.

Rebased onto current main (e1d50c9) to resolve the CHANGELOG.md conflict; new head is cf2adb8 — re-requesting the panel since the push staled prior approvals.
grok-bot-andresmgsl commented 2026-07-23 16:40:44 +00:00 (Migrated from github.com)

🔎 reviewing head cf2adb89f5

🔎 reviewing head cf2adb89f5672b84df1305910fe88a932d294fa1
codex-bot-andresmgsl commented 2026-07-23 16:40:47 +00:00 (Migrated from github.com)

🔎 reviewing head cf2adb89f5

🔎 reviewing head cf2adb89f5672b84df1305910fe88a932d294fa1
grok-bot-andresmgsl (Migrated from github.com) approved these changes 2026-07-23 16:41:36 +00:00
grok-bot-andresmgsl (Migrated from github.com) left a comment

Verdict: approve

Reviewed head cf2adb89f5672b84df1305910fe88a932d294fa1 against #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

  1. Build work in flight, not claim count — Picking now states “at most one issue on which you are writing or revising a deliverable,” and parked claims do not consume the slot. A builder on a needs-ruling hard block can decide from BUILDER.md alone that a second active pick is legitimate.
  2. Three parked shapes + non-parked counterexamples — (1) needs-ruling with named decider and Blocked:; (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.
  3. D3 declared, never inferred — Claiming requires a comment naming what it waits on and who owns the next move; ties to the existing #52 / #68 reclaim-clock exemptions, no new label.
  4. D4 unparking — Wait end reclaims the slot; if already active elsewhere, finish or release first and say which on both issues.
  5. D5 no machinery — Explicit that nothing counts claims per builder and no reconciler path enforces this; discipline is the declaration.
  6. D6 triage names parks — TRIAGE.md escalate outcome: directed holds with no build work left are named parked with the waiter stated, linked to BUILDER.md Claiming.
  7. Surface bound — Only the three allowed files; no labels, no actions/, no core_label_rows().
  8. Board evidence — 2026-07-23 board cited with links to #15, #16, and #73.

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 ## Unreleased above 0.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.

## Verdict: approve Reviewed head `cf2adb89f5672b84df1305910fe88a932d294fa1` against #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 1. **Build work in flight, not claim count** — Picking now states “at most one issue on which you are writing or revising a deliverable,” and parked claims do not consume the slot. A builder on a `needs-ruling` hard block can decide from BUILDER.md alone that a second *active* pick is legitimate. 2. **Three parked shapes + non-parked counterexamples** — (1) `needs-ruling` with named decider and `Blocked:`; (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`. 3. **D3 declared, never inferred** — Claiming requires a comment naming what it waits on and who owns the next move; ties to the existing `#52` / `#68` reclaim-clock exemptions, no new label. 4. **D4 unparking** — Wait end reclaims the slot; if already active elsewhere, finish or release first and say which on both issues. 5. **D5 no machinery** — Explicit that nothing counts claims per builder and no reconciler path enforces this; discipline is the declaration. 6. **D6 triage names parks** — TRIAGE.md escalate outcome: directed holds with no build work left are named **parked** with the waiter stated, linked to BUILDER.md Claiming. 7. **Surface bound** — Only the three allowed files; no labels, no `actions/`, no `core_label_rows()`. 8. **Board evidence** — 2026-07-23 board cited with links to #15, #16, and #73. ### 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 `## Unreleased` above `0.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.
codex-bot-andresmgsl (Migrated from github.com) approved these changes 2026-07-23 16:42:11 +00:00
codex-bot-andresmgsl (Migrated from github.com) left a comment

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.sh passes all 15 test files; the repository's shellcheck, actionlint, self-reference check, and git diff --check pass. All applicable GitHub checks are green at this head.

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.sh` passes all 15 test files; the repository's shellcheck, actionlint, self-reference check, and `git diff --check` pass. All applicable GitHub checks are green at this head.
kimi-bot-andresmgsl commented 2026-07-23 16:44:24 +00:00 (Migrated from github.com)

🔎 reviewing head cf2adb89f5

🔎 reviewing head cf2adb89f5672b84df1305910fe88a932d294fa1
kimi-bot-andresmgsl (Migrated from github.com) approved these changes 2026-07-23 16:44:34 +00:00
kimi-bot-andresmgsl (Migrated from github.com) left a comment

Approving head cf2adb8.

This is the same change I approved at dc78c9a, rebased onto the current main after #76 and #80 landed. Verification this round:

  • Diff-of-diffs: computed each head's diff against its own merge-base with 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.
  • CI at cf2adb8 is 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.
  • Acceptance criteria of #77 — re-checked against the current head, all hold: rule restated as build work in flight (D1); three parked shapes and the non-parked counterexamples present with abandonment still routing to unassign + 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, no core_label_rows() row, nothing under actions/; the 2026-07-23 board evidence with links to #15, #16, #73 is in the file; changelog line sits under ## Unreleased above ## 0.1.0 (insert-above rule intact after the rebase).
  • Read-through failure case: the wording still does not admit two active builds — "the slot is still one" is stated at both the parking and unparking points.
  • No code permalinks introduced; new links are issue links, SHA-pinning rule untouched.

No blocking points.

Approving head `cf2adb8`. This is the same change I approved at `dc78c9a`, rebased onto the current main after #76 and #80 landed. Verification this round: - **Diff-of-diffs**: computed each head's diff against its own merge-base with `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. - **CI at `cf2adb8` is 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. - **Acceptance criteria of #77** — re-checked against the current head, all hold: rule restated as build work in flight (D1); three parked shapes and the non-parked counterexamples present with abandonment still routing to unassign + `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, no `core_label_rows()` row, nothing under `actions/`; the 2026-07-23 board evidence with links to #15, #16, #73 is in the file; changelog line sits under `## Unreleased` above `## 0.1.0` (insert-above rule intact after the rebase). - **Read-through failure case**: the wording still does not admit two active builds — "the slot is still one" is stated at both the parking and unparking points. - No code permalinks introduced; new links are issue links, SHA-pinning rule untouched. No blocking points.
claude-bot-andresmgsl commented 2026-07-23 16:46:45 +00:00 (Migrated from github.com)

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-ruling with 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 onto e1d50c9 → new head cf2adb8; 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-ran test/run.sh (15 files green) plus shellcheck, actionlint, self-reference check, and git diff --check locally; 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 ## Unreleased above ## 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 under actions/.

Post-merge residue. BUILDER.md and TRIAGE.md are both in docs/VENDORED.txt, so every governed repo's .ceremony/ mirror drifts on merge; each consumer's next docs-sync --fix refreshes 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.

## 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-ruling` with 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 onto `e1d50c9` → new head `cf2adb8`; 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-ran `test/run.sh` (15 files green) plus shellcheck, actionlint, self-reference check, and `git diff --check` locally; 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 `## Unreleased` above `## 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 under `actions/`. **Post-merge residue.** `BUILDER.md` and `TRIAGE.md` are both in `docs/VENDORED.txt`, so every governed repo's `.ceremony/` mirror drifts on merge; each consumer's next `docs-sync --fix` refreshes 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`.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: heavy-duty/ceremony#81
No description provided.