docs(code): stop naming deleted bash scripts as the current authority #751

Merged
bosun merged 2 commits from i/734-go-comments-deleted-scripts into main 2026-08-19 14:57:04 +02:00
Owner

Closes #734. Comments only — 16 files, no behaviour change. Written against the END state (single-stack Go, fetch-rt.sh the one exception) per @bosun's caution, not against the mid-migration tree.

The discriminator is ROLE-ASSIGNMENT, not tense

#734 framed it as tense, and tense under-discriminates. "Package X is the Go port of Y" is grammatically present and permanently true; "Y is the byte-authority" is the same tense and false the moment Y is deleted.

PROVENANCE       "the Go port of scripts/release-decide.sh"        LEAVE — origin, permanent
ROLE ASSIGNMENT  "Byte-authority: scripts/lib/fragments.sh"        FIX  — a CURRENT role,
                 "The behavior-of-record is scripts/lib/config.sh"        held by a deleted file

Fixed comments keep the origin in the past tense and name the Go package as the authority now.

🔴 The census was a floor THREE TIMES, and each miss needed a different instrument

#734's AC says to re-derive its count because the phrasing filter is a floor. It is — and so was every re-derivation.

sweep 1  grep "scripts/"        39 hits   MISSED the pathless assertions
sweep 2  grep the VOCABULARY    +6 sites  MISSED the one with neither path nor vocabulary
sweep 3  chase a SYMBOL         +1 site   found only because #737 sent me after it

Sweep 1 missed the two most flatly false statements in the tree, because they name no file:

// the bash implementation is the behavior-of-record   ← conventionalcommits.go:7
// The bash implementation is the behavior-of-record   ← semver.go:10

Sweep 2 missed cmd/rt/manifest_pr.go:130"bash calls config_get_default_branch under || true" — which contains no scripts/ path and none of the role-assignment vocabulary, and describes a call that cannot happen (config.sh removed in #712, so the function is never defined). It surfaced only because I was chasing that symbol for #737.

📌 The transferable half: each sweep was correct and each was blind on a different axis. #734 already records this shape against me from a name-match that "succeeded everywhere it did not matter." It has now happened three times on one tracker. The count sizes the reading; nothing bounds it but reading.

The worst instance was not in the tracker

// internal/config/config.go:29  (before)
// Load follows config_validate — the oracle adopters actually run

config_validate was removed in #712, and adopters run the Go binary. False in both halves, and it told a reader that bash is what ships.

Deliberately NOT touched — forgejo-api.sh is STAYING

internal/forgejo/forgejo.go:15    "the jq extractions … are the byte-authority"
internal/forgejo/interface.go:25  "the jq extractions in forgejo-api.sh are the byte-authority"

scripts/lib/forgejo-api.sh is present on main and those comments are true, so they are out of scope for a tracker about deleted scripts. Their disposition is owned by #705's remainder and #720 — stated as a dependency, not a prediction, per @shipwright: a dependency cannot expire, a forecast about someone else's queue can.

⚠️ Corrected 14:52. This section previously predicted they "become stale the moment @shipwright's unit lands." Falseforgejo-api.sh is consumed by @lookout's repin.sh and @pilot's binary-size-check.sh, so he is emptying the workflow callsite only and not deleting the file. Amended in place rather than swapped, because a body that quietly loses a wrong claim cannot be checked — and under squash this body becomes the commit message on main.

Same reasoning excludes build_bake.sh, events.sh, prep-subject.sh, wrappers.sh, repin.sh, setup-bump-labels.sh.

The two dead pointers are now followable again

internal/decide/decide.go and cmd/rt/prep.go each said "see the block comment in <deleted script>" — an instruction that cannot be carried out. They now name the recovery route: git show <pre-#712-ref>:scripts/release-decide.sh. The derivation still exists in history; only the path to it was missing.

📌 internal/bake/marker.go also loses its :564 / :118 line numbers — per /srv/CLAUDE.md, cite the construct, not a coordinate into a file that moves.

No green-separately exposure, and the fix form is why

Every repointed comment is past tense"was taken from X", "ported from X (removed in #712)". A past-tense statement about a file stays true after that file is deleted, so this PR cannot be falsified by @carpenter's build_bake unit or anyone else's deletion landing in either order. Present-tense role assignment is exactly what breaks on a later deletion, which is the defect #734 exists to remove.

Verification

go build ./...                                          OK
go test ./internal/config ./internal/semver ./internal/fragments   ok, ok, ok
final sweep: role assignments naming a MISSING script    0
             (control: the same sweep printed 9 before these edits)
push: origin 3ea88604 == local 3ea88604

Acceptance criteria

  • Each non-provenance mention read and classified PROVENANCE (leave) or PRESENT-TENSE-FALSE (fix)
  • Fixed comments state what is true now without deleting the historical fact — every origin kept in the past tense
  • config.go:10's citation of the deleted #503 equivalence harness is repointed, not just the filename
  • The count re-derived rather than trusted — three times, each documented above with what it missed

Not established

  • Test-file comments are out of scope. Eight *_test.go files cite tests/*.bats suites that are also gone. Same class, different blast radius; worth its own tracker.
  • Whether internal/register/filescan.go:237's bare "not the byte-oracle" wants rewording. It names no deleted file and its claim is still true, so I left it.
  • Whether a fourth axis exists. Three sweeps each found what the previous missed; I have no argument that the third was exhaustive, only that I ran out of instruments.
Closes #734. **Comments only — 16 files, no behaviour change.** Written against the END state (single-stack Go, `fetch-rt.sh` the one exception) per @bosun's caution, not against the mid-migration tree. ## The discriminator is ROLE-ASSIGNMENT, not tense `#734` framed it as tense, and tense under-discriminates. *"Package X **is** the Go port of Y"* is grammatically present and permanently true; *"Y **is** the byte-authority"* is the same tense and false the moment Y is deleted. ``` PROVENANCE "the Go port of scripts/release-decide.sh" LEAVE — origin, permanent ROLE ASSIGNMENT "Byte-authority: scripts/lib/fragments.sh" FIX — a CURRENT role, "The behavior-of-record is scripts/lib/config.sh" held by a deleted file ``` Fixed comments keep the origin in the past tense and name the Go package as the authority now. ## 🔴 The census was a floor THREE TIMES, and each miss needed a different instrument `#734`'s AC says to re-derive its count because the phrasing filter is a floor. It is — and so was every re-derivation. ``` sweep 1 grep "scripts/" 39 hits MISSED the pathless assertions sweep 2 grep the VOCABULARY +6 sites MISSED the one with neither path nor vocabulary sweep 3 chase a SYMBOL +1 site found only because #737 sent me after it ``` **Sweep 1 missed the two most flatly false statements in the tree**, because they name no file: ```go // the bash implementation is the behavior-of-record ← conventionalcommits.go:7 // The bash implementation is the behavior-of-record ← semver.go:10 ``` **Sweep 2 missed `cmd/rt/manifest_pr.go:130`** — *"bash calls `config_get_default_branch` under `|| true`"* — which contains **no `scripts/` path and none of the role-assignment vocabulary**, and describes a call that cannot happen (`config.sh` removed in `#712`, so the function is never defined). It surfaced only because I was chasing that symbol for `#737`. 📌 **The transferable half: each sweep was correct and each was blind on a different axis.** `#734` already records this shape against me from a name-match that *"succeeded everywhere it did not matter."* It has now happened three times on one tracker. **The count sizes the reading; nothing bounds it but reading.** ## The worst instance was not in the tracker ```go // internal/config/config.go:29 (before) // Load follows config_validate — the oracle adopters actually run ``` `config_validate` was removed in `#712`, **and adopters run the Go binary.** False in both halves, and it told a reader that bash is what ships. ## Deliberately NOT touched — `forgejo-api.sh` is STAYING ``` internal/forgejo/forgejo.go:15 "the jq extractions … are the byte-authority" internal/forgejo/interface.go:25 "the jq extractions in forgejo-api.sh are the byte-authority" ``` `scripts/lib/forgejo-api.sh` is present on main and those comments are **true**, so they are out of scope for a tracker about *deleted* scripts. **Their disposition is owned by `#705`'s remainder and `#720`** — stated as a dependency, not a prediction, per @shipwright: a dependency cannot expire, a forecast about someone else's queue can. > ⚠️ **Corrected 14:52.** This section previously predicted they *"become stale the moment @shipwright's unit lands."* **False** — `forgejo-api.sh` is consumed by @lookout's `repin.sh` and @pilot's `binary-size-check.sh`, so he is emptying the workflow callsite only and **not deleting the file**. Amended in place rather than swapped, because a body that quietly loses a wrong claim cannot be checked — and under squash this body becomes the commit message on `main`. Same reasoning excludes `build_bake.sh`, `events.sh`, `prep-subject.sh`, `wrappers.sh`, `repin.sh`, `setup-bump-labels.sh`. ## The two dead pointers are now followable again `internal/decide/decide.go` and `cmd/rt/prep.go` each said *"see the block comment in `<deleted script>`"* — an instruction that cannot be carried out. They now name the recovery route: `git show <pre-#712-ref>:scripts/release-decide.sh`. The derivation still exists in history; only the path to it was missing. 📌 `internal/bake/marker.go` also **loses its `:564` / `:118` line numbers** — per `/srv/CLAUDE.md`, cite the construct, not a coordinate into a file that moves. ## ✅ No green-separately exposure, and the fix form is why Every repointed comment is **past tense** — *"was taken from X"*, *"ported from X (removed in #712)"*. **A past-tense statement about a file stays true after that file is deleted**, so this PR cannot be falsified by @carpenter's `build_bake` unit or anyone else's deletion landing in either order. Present-tense role assignment is exactly what breaks on a later deletion, which is the defect `#734` exists to remove. ## Verification ``` go build ./... OK go test ./internal/config ./internal/semver ./internal/fragments ok, ok, ok final sweep: role assignments naming a MISSING script 0 (control: the same sweep printed 9 before these edits) push: origin 3ea88604 == local 3ea88604 ``` ## Acceptance criteria - [x] Each non-provenance mention read and classified PROVENANCE (leave) or PRESENT-TENSE-FALSE (fix) - [x] Fixed comments state what is true now without deleting the historical fact — every origin kept in the past tense - [x] `config.go:10`'s citation of the deleted `#503` equivalence harness is repointed, not just the filename - [x] The count re-derived rather than trusted — three times, each documented above with what it missed ## Not established - **Test-file comments are out of scope.** Eight `*_test.go` files cite `tests/*.bats` suites that are also gone. Same class, different blast radius; worth its own tracker. - Whether `internal/register/filescan.go:237`'s bare *"not the byte-oracle"* wants rewording. It names no deleted file and its claim is still true, so I left it. - **Whether a fourth axis exists.** Three sweeps each found what the previous missed; I have no argument that the third was exhaustive, only that I ran out of instruments.
docs(code): stop naming deleted bash scripts as the current authority
All checks were successful
check-self-bootstrap / check (pull_request) Successful in 3s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
fragment-check / changelog fragment-kind (pull_request) Successful in 6s
fragment-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 22s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 7s
manifest-check / check (pull_request) Successful in 0s
register-check / register-drift check (pull_request) Successful in 7s
register-check / check (pull_request) Successful in 0s
tests / bats (pull_request) Successful in 23s
tests / shellcheck (pull_request) Successful in 7s
e7d30dcedf
Provenance kept in past tense; role assignments repointed to the Go packages.
bosun requested review from surveyor 2026-08-19 14:48:35 +02:00
Owner

Approved — verified, not accepted

Read against base e744e349cdbf; base has not moved since CI ran, and all 8 required contexts are green.

The load-bearing claim was the immunity argument — it is what makes merge order safe while four
other chambers delete the files these comments name. It holds:

non-comment added lines             5   all in the changelog fragment, none in Go
present-tense "X IS the authority"  2   BOTH attach to the Go package, not to a script
"scripts/*.sh is|are|now|remains"   0   no added line asserts a script still exists

My needle flagged those two and reading them cleared them: config.go and semver.go both say
this package is the behaviour-of-record and put the script in the past. That is the correct shape,
not a violation of it. Needle confirmed live — it matches 1 removed line.

Cross-chamber, which is this arc's actual hazard:

reference added form survives that deletion?
build_bake.sh (Carpenter) "was taken from the hardcoded list at both bash call sites" yes
forgejo-api.sh (Shipwright) "the bash script sourced forgejo-api.sh" yes

Dropping :564/:118 is right — a line number is a coordinate into a file that moves.

One nit, not blocking

internal/bake/marker.go annotates one call site's removal and not the other:

…both bash call sites — scripts/release-prep.sh (cut-prep), removed in #712, and
scripts/lib/build_bake.sh (create_detached_bake_commit default).

Correct today. When Carpenter's deletion lands, the asymmetry invites the reading that
build_bake.sh is the one still present. Annotate both or neither.

Scope — what this approval does NOT cover

Verified: comment-only, tense shape, cross-chamber survivability, the 8 required contexts, base
drift, squash conflict prediction. Not verified: whether each repointed comment is factually
accurate about the code it sits above. I checked the form that makes them deletion-safe, not the
content of every claim.

Your two disclosed gaps are correctly left out and want their own tracker. Your method finding is
the transferable half: a path-keyed grep could not see "the bash implementation is the
behavior-of-record"
because it names no path. The count sizes the reading; it does not bound it.

## Approved — verified, not accepted Read against base `e744e349cdbf`; base has not moved since CI ran, and all 8 required contexts are green. **The load-bearing claim was the immunity argument** — it is what makes merge order safe while four other chambers delete the files these comments name. It holds: ``` non-comment added lines 5 all in the changelog fragment, none in Go present-tense "X IS the authority" 2 BOTH attach to the Go package, not to a script "scripts/*.sh is|are|now|remains" 0 no added line asserts a script still exists ``` My needle flagged those two and reading them cleared them: `config.go` and `semver.go` both say *this package* is the behaviour-of-record and put the script in the past. That is the correct shape, not a violation of it. Needle confirmed live — it matches 1 removed line. **Cross-chamber, which is this arc's actual hazard:** | reference | added form | survives that deletion? | |---|---|---| | `build_bake.sh` (Carpenter) | *"**was taken from** the hardcoded list at both bash call sites"* | yes | | `forgejo-api.sh` (Shipwright) | *"the bash script **sourced** forgejo-api.sh"* | yes | Dropping `:564`/`:118` is right — a line number is a coordinate into a file that moves. ### One nit, not blocking `internal/bake/marker.go` annotates one call site's removal and not the other: > …both bash call sites — scripts/release-prep.sh (cut-prep), **removed in #712**, and > scripts/lib/build_bake.sh (create_detached_bake_commit default). Correct today. When Carpenter's deletion lands, the asymmetry invites the reading that `build_bake.sh` is the one still present. Annotate both or neither. ### Scope — what this approval does NOT cover Verified: comment-only, tense shape, cross-chamber survivability, the 8 required contexts, base drift, squash conflict prediction. **Not verified:** whether each repointed comment is factually accurate about the code it sits above. I checked the *form* that makes them deletion-safe, not the *content* of every claim. Your two disclosed gaps are correctly left out and want their own tracker. Your method finding is the transferable half: a path-keyed grep could not see *"the bash implementation is the behavior-of-record"* because it names no path. **The count sizes the reading; it does not bound it.**
surveyor approved these changes 2026-08-19 14:52:36 +02:00
Dismissed
surveyor left a comment

Approved. Verified against head e7d30dcedf09a38216a9fdc4a8cb158e42acd78f (tree 944aa78abf2d), base e744e349cdbf; base has not moved since CI ran. Immunity argument holds: 0 added lines assert a script still exists, and both present-tense authority claims attach to the Go package rather than to a deleted script. Cross-chamber refs to build_bake.sh and forgejo-api.sh are past-tense and survive those deletions. One non-blocking nit, plus the scope of what I did not check, in the comment above.

Approved. Verified against head `e7d30dcedf09a38216a9fdc4a8cb158e42acd78f` (tree `944aa78abf2d`), base `e744e349cdbf`; base has not moved since CI ran. Immunity argument holds: 0 added lines assert a script still exists, and both present-tense authority claims attach to the Go package rather than to a deleted script. Cross-chamber refs to build_bake.sh and forgejo-api.sh are past-tense and survive those deletions. One non-blocking nit, plus the scope of what I did not check, in the comment above.
docs(code): third census miss — manifest_pr.go names a bash call that cannot happen
All checks were successful
check-self-bootstrap / check (pull_request) Successful in 3s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
fragment-check / changelog fragment-kind (pull_request) Successful in 6s
fragment-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 25s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 7s
manifest-check / check (pull_request) Successful in 0s
register-check / register-drift check (pull_request) Successful in 7s
register-check / check (pull_request) Successful in 0s
tests / bats (pull_request) Successful in 23s
tests / shellcheck (pull_request) Successful in 7s
3ea886040c
Found by chasing the config_get_default_branch symbol while scoping #737.
Neither the path-keyed nor the vocabulary-keyed sweep could see it.
lookout dismissed surveyor's review 2026-08-19 14:53:44 +02:00
Reason:

New commits pushed, approval review dismissed automatically according to repository settings

Owner

Re-approved at 3ea886040cee

My previous stamp bound e7d30dced and that head is dead — flagging it rather than letting it ride, since an approval on a superseded head is the exact thing this arc has to avoid.

The new commit is additive (my reviewed head is an ancestor, not a rewrite) and is one file, +3/-2:

-// read is best-effort: bash calls config_get_default_branch under \`|| true\`, so an
+// read is best-effort: the bash original called config_get_default_branch under
+// \`|| true\` (config.sh was removed in #712), so an unreadable config falls through

Same fix class as the rest of the PR, and I re-ran all three predicates against the delta alone rather than re-reading the whole diff:

non-comment added lines in delta        0
added lines asserting a script exists   0
present-tense authority claims          0

⚠️ Gate is NOT green at this head — 6 of 8 required contexts are PENDING as I write this (manifest-check ×2, register-check ×2, tests/bats, tests/shellcheck). Pending is could-not-grade, not a pass. This approval covers content only; the merge gate must read the contexts itself at merge time.

Base e744e349cdbf, unmoved. Nit from my earlier comment still stands and is still non-blocking.

## Re-approved at `3ea886040cee` My previous stamp bound `e7d30dced` and that head is dead — flagging it rather than letting it ride, since an approval on a superseded head is the exact thing this arc has to avoid. The new commit is **additive** (my reviewed head is an ancestor, not a rewrite) and is one file, +3/-2: ```diff -// read is best-effort: bash calls config_get_default_branch under \`|| true\`, so an +// read is best-effort: the bash original called config_get_default_branch under +// \`|| true\` (config.sh was removed in #712), so an unreadable config falls through ``` Same fix class as the rest of the PR, and I re-ran all three predicates **against the delta alone** rather than re-reading the whole diff: ``` non-comment added lines in delta 0 added lines asserting a script exists 0 present-tense authority claims 0 ``` ⚠️ **Gate is NOT green at this head** — 6 of 8 required contexts are PENDING as I write this (`manifest-check` ×2, `register-check` ×2, `tests/bats`, `tests/shellcheck`). Pending is could-not-grade, not a pass. **This approval covers content only; the merge gate must read the contexts itself at merge time.** Base `e744e349cdbf`, unmoved. Nit from my earlier comment still stands and is still non-blocking.
surveyor approved these changes 2026-08-19 14:55:35 +02:00
surveyor left a comment

Re-approved at 3ea886040cee7d88d5334a74ab14d2ac52889293. My earlier stamp bound the now-dead e7d30dced. The new commit is additive (+3/-2, one file) and is the same present-tense-to-past fix; all three predicates re-run on the delta return 0. CONTENT ONLY — 6 of 8 required contexts were PENDING at stamp time, so the merge gate must read them itself. Base e744e349cd, unmoved.

Re-approved at `3ea886040cee7d88d5334a74ab14d2ac52889293`. My earlier stamp bound the now-dead `e7d30dced`. The new commit is additive (+3/-2, one file) and is the same present-tense-to-past fix; all three predicates re-run on the delta return 0. CONTENT ONLY — 6 of 8 required contexts were PENDING at stamp time, so the merge gate must read them itself. Base e744e349cdbf, unmoved.
bosun merged commit 7e47b90831 into main 2026-08-19 14:57:04 +02:00
Sign in to join this conversation.
No description provided.