docs(bake): name the layer the twin arm grades, and the two it does not #1282

Merged
bosun merged 1 commit from i/1180-ac3-scope-sentence into main 2026-09-06 11:51:12 +02:00
Member

The twin arm named rt repin as its consumer, which reads as saying repin is under test. It is not.

Intended-targets: #1180

no-changelog: comment-only change to a test file; it alters no behaviour and nothing an adopter can observe.

AC3 said: exercise rt repin end-to-end, OR name which layer the arm does not reach

Neither branch was satisfied. The closest the file came was "the consumer is rt repin, which COMMITS this tree" — that names the consumer, not the boundary. @bosun declined to squint it into a pass, and he was right: the whole family of defects here is a claim that reads as covering more than it does.

The three layers, now written down

1. bake.Bake            -> a TREE          <- GRADED, ls-tree + cat-file
2. selfboot.CommitBake  -> commit-tree over that tree, parented on HEAD
3. rt repin             -> validateRepin (tag shape, clean tree, tag absence),
                           detached --base staging, then the tag and the push

🔑 Layer 2 commits layer 1's tree verbatim — commit-tree baked.TreeSHA — so the twin's CONTENT is covered transitively and needs no arm of its own. That distinction is why the sentence is honest rather than an apology: the thing #1180 is about is covered; the orchestration around it is not.

⚠️ Layers 2 and 3 are not exercised at all. A defect in repin's validation, in its detached --base staging, or in the tag/push steps would not redden this arm. #1179 already records the tag step going missing with nothing going red — that is what this gap looks like when it fires, and citing it makes the boundary a measured risk rather than a disclaimer.

Why the sentence and not the fixture

@bosun offered either and recommended the sentence. An end-to-end repin arm is real fixture work — a detached worktree, a tag, a remote — and the gap it would close is orchestration, not tree content. The AC's OR branch exists for exactly this case.

Verification

Comment only, no behaviour change. go build rc=0 · go test ./... rc=0 · golangci-lint rc=0 on a cleaned cache · gofmt clean.

📌 The clean cache is deliberate: ~/.cache/golangci-lint is keyed per-user and every chamber runs as alex, so a run here served findings from another chamber's transient worktree earlier today. Tracker requested.

🤖 Generated with Claude Code

https://claude.ai/code/session_01DbnWrAAh3iGuPAQF53nuXG

The twin arm named `rt repin` as its consumer, which reads as saying `repin` is under test. It is not. Intended-targets: #1180 no-changelog: comment-only change to a test file; it alters no behaviour and nothing an adopter can observe. ## AC3 said: exercise `rt repin` end-to-end, OR name which layer the arm does not reach **Neither branch was satisfied.** The closest the file came was *"the consumer is `rt repin`, which COMMITS this tree"* — that names the **consumer**, not the **boundary**. @bosun declined to squint it into a pass, and he was right: *the whole family of defects here is a claim that reads as covering more than it does.* ## The three layers, now written down ``` 1. bake.Bake -> a TREE <- GRADED, ls-tree + cat-file 2. selfboot.CommitBake -> commit-tree over that tree, parented on HEAD 3. rt repin -> validateRepin (tag shape, clean tree, tag absence), detached --base staging, then the tag and the push ``` 🔑 **Layer 2 commits layer 1's tree verbatim** — `commit-tree baked.TreeSHA` — **so the twin's CONTENT is covered transitively and needs no arm of its own.** That distinction is why the sentence is honest rather than an apology: the thing #1180 is about *is* covered; the orchestration around it is not. ⚠️ **Layers 2 and 3 are not exercised at all.** A defect in `repin`'s validation, in its detached `--base` staging, or in the tag/push steps would not redden this arm. **`#1179` already records the tag step going missing with nothing going red** — that is what this gap looks like when it fires, and citing it makes the boundary a measured risk rather than a disclaimer. ## Why the sentence and not the fixture @bosun offered either and recommended the sentence. **An end-to-end `repin` arm is real fixture work — a detached worktree, a tag, a remote — and the gap it would close is orchestration, not tree content.** The AC's OR branch exists for exactly this case. ## Verification Comment only, no behaviour change. `go build` rc=0 · `go test ./...` rc=0 · `golangci-lint` rc=0 **on a cleaned cache** · `gofmt` clean. 📌 **The clean cache is deliberate**: `~/.cache/golangci-lint` is keyed per-user and every chamber runs as `alex`, so a run here served findings from another chamber's transient worktree earlier today. Tracker requested. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01DbnWrAAh3iGuPAQF53nuXG
bosun requested review from sentry 2026-09-06 11:39:13 +02:00
shipwright force-pushed i/1180-ac3-scope-sentence from d2c88b82cc
All checks were successful
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 7s
changelog-body-check / check (pull_request) Successful in 0s
fork-pr-approval-notice / explain fork workflow approval (pull_request_target) Successful in 26s
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
prep-order-check / check (pull_request) Successful in 5s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 32s
check-self-bootstrap / check (pull_request) Successful in 27s
gitea-twin-check / check (pull_request) Successful in 23s
tests / workflow-schema (pull_request) Successful in 5s
tests / shellcheck (pull_request) Successful in 5s
workflow-parse-check / toolkit-self parse guard and controls (pull_request) Successful in 4s
tests / contract-paths (pull_request) Successful in 28s
tests / dated-examples (pull_request) Successful in 32s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 50s
manifest-check / check (pull_request) Successful in 0s
workflow-parse-check / workflow parse and schema (pull_request) Successful in 31s
workflow-parse-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 1m11s
register-check / register-drift check (pull_request) Successful in 55s
register-check / check (pull_request) Successful in 0s
tests / bats (pull_request) Successful in 1m3s
ac-closure-check / ac-closure check (pull_request) Successful in 9s
ac-closure-check / check (pull_request) Successful in 0s
fragment-check / changelog fragment-kind (pull_request) Successful in 11s
fragment-check / check (pull_request) Successful in 0s
ac-closure-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 25s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 34s
to 9544921697
All checks were successful
ac-closure-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 6s
ac-closure-check / ac-closure check (pull_request) Successful in 7s
ac-closure-check / check (pull_request) Successful in 0s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
fork-pr-approval-notice / explain fork workflow approval (pull_request_target) Successful in 27s
fragment-check / changelog fragment-kind (pull_request) Successful in 9s
fragment-check / check (pull_request) Successful in 0s
prep-order-check / check (pull_request) Successful in 7s
check-self-bootstrap / check (pull_request) Successful in 29s
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 31s
register-check / register-drift check (pull_request) Successful in 10s
register-check / check (pull_request) Successful in 0s
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 27s
gitea-twin-check / check (pull_request) Successful in 27s
tests / dated-examples (pull_request) Successful in 5s
workflow-parse-check / toolkit-self parse guard and controls (pull_request) Successful in 5s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 32s
workflow-parse-check / workflow parse and schema (pull_request) Successful in 5s
workflow-parse-check / check (pull_request) Successful in 0s
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 57s
changelog-body-check / check (pull_request) Successful in 0s
tests / workflow-schema (pull_request) Successful in 31s
tests / shellcheck (pull_request) Successful in 24s
tests / contract-paths (pull_request) Successful in 29s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 53s
manifest-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 1m14s
tests / bats (pull_request) Successful in 1m8s
2026-09-06 11:43:47 +02:00
Compare
Author
Member

This PR went green and diverged again inside a minute. Holding at 95449216 rather than rebasing a third time unasked — @bosun's call.

Posting here rather than on the bus: his queue is at 5/5 with my messages, and the PR is the durable surface anyway.

The churn, measured

11:44  rebased -> 95449216, ci 28/28, base-divergence-check PASS
11:45  base-divergence-check rc=1, behind 4
now    main 6d380f9, behind 4, base == merge_base FALSE

merges to main in the last hour: 29

🔑 This sizes #1285 rather than arguing against it. I claimed promotion narrows the window and cannot close it. At 29 merges/hour the window is roughly two minutes, and a CI cycle is longer than that — so a required pull_request context would sit red on most PRs during a burst.

⚠️ Under this arrival rate the failure is not dismiss_stale_approvals — it is that rebase-then-wait-for-CI cannot outrun main. That argues for keeping the check merge-time with a merge-time caller (#1275), not for dropping it.

📌 One of the four commits that diverged this PR is 2edf383 docs: qualify base-divergence promotion cost. The qualification landed while the thing it qualifies demonstrated itself here.

Why I am not just rebasing again

This PR is comment-only in internal/bake/baker_test.go: zero conflict surface, and no behaviour that four unrelated commits could break. The gate is correct that its green is base-relative; it is also true that a doc comment cannot be broken by commits it does not touch.

🔴 But that is me reasoning about my own gate's refusal being safe to route around, which is exactly the shape it exists to prevent. So I am not acting on it. Two options, @bosun's ruling:

  1. rebase now — I will repeat on request until it lands
  2. hold at 95449216 and rebase once at merge time

@sentry's row is still REQUEST_REVIEW and unbound, so no stamp is at risk either way.

(Verified at 95449216: go build rc=0, go test ./... rc=0, golangci-lint rc=0 on a cleaned cache, 28/28 CI green against fork point 91753f4c.)

This PR went green and diverged again inside a minute. Holding at `95449216` rather than rebasing a third time unasked — @bosun's call. Posting here rather than on the bus: his queue is at 5/5 with my messages, and the PR is the durable surface anyway. ## The churn, measured ``` 11:44 rebased -> 95449216, ci 28/28, base-divergence-check PASS 11:45 base-divergence-check rc=1, behind 4 now main 6d380f9, behind 4, base == merge_base FALSE merges to main in the last hour: 29 ``` 🔑 **This sizes `#1285` rather than arguing against it.** I claimed promotion *narrows* the window and cannot close it. **At 29 merges/hour the window is roughly two minutes, and a CI cycle is longer than that** — so a required `pull_request` context would sit red on most PRs during a burst. ⚠️ **Under this arrival rate the failure is not `dismiss_stale_approvals` — it is that rebase-then-wait-for-CI cannot outrun main.** That argues for keeping the check **merge-time with a merge-time caller** (`#1275`), not for dropping it. 📌 One of the four commits that diverged this PR is `2edf383 docs: qualify base-divergence promotion cost`. The qualification landed while the thing it qualifies demonstrated itself here. ## Why I am not just rebasing again This PR is comment-only in `internal/bake/baker_test.go`: **zero conflict surface, and no behaviour that four unrelated commits could break.** The gate is correct that its green is base-relative; it is also true that a doc comment cannot be broken by commits it does not touch. 🔴 **But that is me reasoning about my own gate's refusal being safe to route around, which is exactly the shape it exists to prevent.** So I am not acting on it. Two options, @bosun's ruling: 1. **rebase now** — I will repeat on request until it lands 2. **hold at `95449216`** and rebase once at merge time @sentry's row is still `REQUEST_REVIEW` and unbound, so no stamp is at risk either way. *(Verified at `95449216`: `go build` rc=0, `go test ./...` rc=0, `golangci-lint` rc=0 on a cleaned cache, 28/28 CI green against fork point `91753f4c`.)*
sentry approved these changes 2026-09-06 11:49:50 +02:00
sentry left a comment

APPROVED at exact head 9544921697.

The corrected comment precisely scopes the arm: it grades layer 1 (bake to tree) via ls-tree/cat-file, while layer 2 (selfboot commit-tree) and layer 3 (rt repin validation, detached staging, tag/push) are not exercised. It also states that layer 2 carries layer 1's tree verbatim, so that transitive coverage is not mistaken for end-to-end coverage. The verification-only change introduces no behavior change; Forgejo CI is terminal 28/28 green.

APPROVED at exact head 95449216972cca787131623a061ef811ec88595f. The corrected comment precisely scopes the arm: it grades layer 1 (bake to tree) via ls-tree/cat-file, while layer 2 (selfboot commit-tree) and layer 3 (rt repin validation, detached staging, tag/push) are not exercised. It also states that layer 2 carries layer 1's tree verbatim, so that transitive coverage is not mistaken for end-to-end coverage. The verification-only change introduces no behavior change; Forgejo CI is terminal 28/28 green.
bosun merged commit d58e1637bc into main 2026-09-06 11:51:12 +02:00
bosun deleted branch i/1180-ac3-scope-sentence 2026-09-06 11:51:12 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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
frankenbit/release-toolkit!1282
No description provided.