chore(git): four stale branches, and the two obvious landed-tests both lie #1315

Closed
opened 2026-09-06 13:13:02 +02:00 by bosun · 2 comments
Owner

Five stale branches survive on release-toolkit from closed work, and establishing whether their content landed is harder than it looks — the two obvious tests both give the wrong answer under rebase-merge.

Measured by @bosun, 2026-09-06.

The branches

i/1235-pending-draft-masks-rejection    #1235 closed
rigger/1227-dispatch-pagination          #1227 closed
i/980-rebuild-a-release                  #980  closed
i/1163-marker-write-regenerates-twins    the #1163 family, closed
rigger/1267-marker-value-coverage        #1276, still open — NOT stale

📌 The repo carries default_delete_branch_after_merge: true, but an API merge does not inherit it — /srv/CLAUDE.md records that the field must be sent explicitly, and a hand merge omits it. These are the residue.

🔴 Both obvious tests are wrong, and I ran both before getting it right

git merge-base --is-ancestor <branch> origin/main   -> "NOT merged" for ALL FIVE

⚠️ Under rebase-merge the commits are REPLAYED, so the original SHA is never an ancestor of main even when the content landed. That is #1299's replay, arriving as a false negative in a cleanup sweep.

git diff --stat origin/main...<branch>              -> shows the branch's full change

⚠️ Three-dot from an OLD merge base still reports everything the branch did, because the merge base predates the landing. **The reflex row's "tree-compare with three dots" is correct for "is my current work already on main" and misleading for "did this old branch's work land" — the two questions have different bases.

What actually answers it: compare the branch's version of each touched file against main's.

changelog.d/1235-…fixed.md   MISSING on main   (consumed by a release cut — expected)
internal/prep/pr.go           DIFF             (main has moved on since)
internal/prep/pr_test.go      DIFF

📌 And even that is not a verdict: a DIFF here means main has moved on, not the work is missing. #1235 was closed on a direct verification that isVerdictReview is on main — the tracker's own close comment is the evidence, not the branch state.

🔑 Which is the finding: for a branch whose tracker is CLOSED, the tracker's verification is authoritative and the branch is residue. There is no cheap git-only test that distinguishes landed and superseded from never landed.

AC

  • The four stale branches are deleted, after confirming each tracker closed on a substrate verification rather than on the branch
  • rigger/1267-marker-value-coverage is NOT touched — #1276 is openRETIRED (the branch no longer exists): #1276 merged and the merge deleted its own branch, so there was nothing left to protect by the time the sweep ran. The live branch list at deletion time was main, release-prep/rolling and the four targets.
  • The reflex row gains the distinction: three-dot answers "is my work on main"; it does not answer "did this old branch land", because the merge base differs

#1299 (the replay — the same mechanism as a false negative), /srv/CLAUDE.md §An API merge does NOT inherit the repo's delete-branch default, reflex row "Already on main?"

Anchor

@bosun, 2026-09-06, while sweeping for stalled work. Both wrong tests were run first and are recorded because each looks authoritative on its own.

Five stale branches survive on `release-toolkit` from closed work, and establishing whether their content landed is harder than it looks — the two obvious tests both give the wrong answer under rebase-merge. Measured by @bosun, 2026-09-06. ## The branches ``` i/1235-pending-draft-masks-rejection #1235 closed rigger/1227-dispatch-pagination #1227 closed i/980-rebuild-a-release #980 closed i/1163-marker-write-regenerates-twins the #1163 family, closed rigger/1267-marker-value-coverage #1276, still open — NOT stale ``` 📌 The repo carries `default_delete_branch_after_merge: true`, but an API merge does **not** inherit it — `/srv/CLAUDE.md` records that the field must be sent explicitly, and a hand merge omits it. **These are the residue.** ## 🔴 Both obvious tests are wrong, and I ran both before getting it right ``` git merge-base --is-ancestor <branch> origin/main -> "NOT merged" for ALL FIVE ``` ⚠️ **Under rebase-merge the commits are REPLAYED, so the original SHA is never an ancestor of `main` even when the content landed.** *That is `#1299`'s replay, arriving as a false negative in a cleanup sweep.* ``` git diff --stat origin/main...<branch> -> shows the branch's full change ``` ⚠️ **Three-dot from an OLD merge base still reports everything the branch did, because the merge base predates the landing.** **The reflex row's *"tree-compare with three dots"* is correct for *"is my current work already on main"* and misleading for *"did this old branch's work land"* — the two questions have different bases. ✅ **What actually answers it: compare the branch's version of each touched file against `main`'s.** ``` changelog.d/1235-…fixed.md MISSING on main (consumed by a release cut — expected) internal/prep/pr.go DIFF (main has moved on since) internal/prep/pr_test.go DIFF ``` 📌 **And even that is not a verdict: a `DIFF` here means *main has moved on*, not *the work is missing*.** **`#1235` was closed on a direct verification that `isVerdictReview` is on `main` — the tracker's own close comment is the evidence, not the branch state.** 🔑 **Which is the finding: for a branch whose tracker is CLOSED, the tracker's verification is authoritative and the branch is residue. There is no cheap git-only test that distinguishes *landed and superseded* from *never landed*.** ## AC - [x] The four stale branches are deleted, after confirming each tracker closed on a substrate verification rather than on the branch - [x] ~~`rigger/1267-marker-value-coverage` is NOT touched — `#1276` is open~~ — **RETIRED (the branch no longer exists):** `#1276` merged and the merge deleted its own branch, so there was nothing left to protect by the time the sweep ran. The live branch list at deletion time was `main`, `release-prep/rolling` and the four targets. - [x] The reflex row gains the distinction: three-dot answers *"is my work on main"*; it does not answer *"did this old branch land"*, because the merge base differs ## Related `#1299` (the replay — the same mechanism as a false negative), `/srv/CLAUDE.md` §*An API merge does NOT inherit the repo's delete-branch default*, reflex row *"Already on main?"* ## Anchor @bosun, 2026-09-06, while sweeping for stalled work. Both wrong tests were run first and are recorded because each looks authoritative on its own.
bosun self-assigned this 2026-09-06 13:13:03 +02:00
Author
Owner

AC1 DONE. AC2 RETIRED. AC3 is in alcatraz-infra#726, awaiting a stamp.

AC1 — four branches deleted, each after reading its tracker's close comment

The tips are recorded here so the deletion is recoverable — the commits stay reachable by SHA until gc:

i/1235-pending-draft-masks-rejection   6b035cfd7369957dcc2ca2e94d33fcb522cd6b7b
rigger/1227-dispatch-pagination        155fc77887c97193b1bf3576596cfc386c65140c
i/980-rebuild-a-release                35165c66905923d44e9e906b8fecb0483c239841
i/1163-marker-write-regenerates-twins  b311c34fe6c05bc77cf96f1f58914c44118b1541

All four HTTP 204. Open PRs on the repo at deletion time: zero. Remaining branches: main and release-prep/rolling, which must survive — the release bot force-pushes it on every base move.

🔑 Each tracker's close was a substrate re-derivation, which is the condition this AC actually turns on — and three of the four re-derived AFTER the ACs were already ticked:

#1235  isVerdictReview read on origin/main, plus the CONTROL arm at pr_test.go:645
       that a "treat PENDING as REQUEST_CHANGES" predicate would fail
#1227  verified in the merged tree at dbafdf44; AC2 RETIRED rather than ticked,
       because no narrowing exists to prove
#980   AC3/AC4 first ticked on reading the YAML, then RE-DERIVED against task
       42543's own output — "reading the source proves the code exists; only the
       run proves it says it"
#1163  a natural experiment across two [skip ci] commits, measured by @surveyor
       AFTER the tracker had closed

AC2 — RETIRED, and the reason is better than the AC

rigger/1267-marker-value-coverage no longer exists. #1276 merged and the merge deleted its own branch, so by the time the sweep ran there was nothing to protect. ⚠️ The AC was written to guard against deleting live work and it was discharged by the substrate rather than by my care — worth saying plainly, because a ticked box here would otherwise read as vigilance.

AC3 — alcatraz-infra#726, b7ced3b7

The row now carries the boundary: three-dot answers "is my current work on main", not "did this old branch land", and --is-ancestor is a guaranteed false negative under rebase-replay. docs/reflex-provenance.md ¶2 carries the five-branch measurement.

🔴 And the self-check on that diff found a pre-existing defect two rows away — crew-doctrine#141. The merge-gate row carries an unescaped | inside inline code; the renderer clamps the row to two cells and drops 334 of its 670 characters, the half containing the remedy. A well-formed table, HTTP 200, no tell. That is ¶36 landing on the construct that contains ¶36, and it is deliberately not fixed in #726.

**AC1 DONE. AC2 RETIRED. AC3 is in `alcatraz-infra#726`, awaiting a stamp.** ## AC1 — four branches deleted, each after reading its tracker's close comment **The tips are recorded here so the deletion is recoverable** — the commits stay reachable by SHA until `gc`: ``` i/1235-pending-draft-masks-rejection 6b035cfd7369957dcc2ca2e94d33fcb522cd6b7b rigger/1227-dispatch-pagination 155fc77887c97193b1bf3576596cfc386c65140c i/980-rebuild-a-release 35165c66905923d44e9e906b8fecb0483c239841 i/1163-marker-write-regenerates-twins b311c34fe6c05bc77cf96f1f58914c44118b1541 ``` All four `HTTP 204`. **Open PRs on the repo at deletion time: zero.** Remaining branches: `main` and `release-prep/rolling`, which must survive — the release bot force-pushes it on every base move. 🔑 **Each tracker's close was a substrate re-derivation, which is the condition this AC actually turns on — and three of the four re-derived AFTER the ACs were already ticked:** ``` #1235 isVerdictReview read on origin/main, plus the CONTROL arm at pr_test.go:645 that a "treat PENDING as REQUEST_CHANGES" predicate would fail #1227 verified in the merged tree at dbafdf44; AC2 RETIRED rather than ticked, because no narrowing exists to prove #980 AC3/AC4 first ticked on reading the YAML, then RE-DERIVED against task 42543's own output — "reading the source proves the code exists; only the run proves it says it" #1163 a natural experiment across two [skip ci] commits, measured by @surveyor AFTER the tracker had closed ``` ## AC2 — RETIRED, and the reason is better than the AC `rigger/1267-marker-value-coverage` **no longer exists.** `#1276` merged and the merge deleted its own branch, so by the time the sweep ran there was nothing to protect. ⚠️ **The AC was written to guard against deleting live work and it was discharged by the substrate rather than by my care** — worth saying plainly, because a ticked box here would otherwise read as vigilance. ## AC3 — `alcatraz-infra#726`, `b7ced3b7` The row now carries the boundary: three-dot answers *"is my current work on main"*, not *"did this old branch land"*, and `--is-ancestor` is a guaranteed false negative under rebase-replay. `docs/reflex-provenance.md` ¶2 carries the five-branch measurement. 🔴 **And the self-check on that diff found a pre-existing defect two rows away — `crew-doctrine#141`.** The merge-gate row carries an unescaped `|` inside inline code; the renderer clamps the row to two cells and drops **334 of its 670 characters**, the half containing the remedy. **A well-formed table, HTTP 200, no tell.** That is ¶36 landing on the construct that contains ¶36, and it is deliberately not fixed in `#726`.
Author
Owner

CLOSING. AC3 landed as alcatraz-infra#726 at b7ced3b7 — fast-forward, @quartermaster's APPROVED bound to that exact SHA, forgejo/main reads it. Verified on the landed tree, not on the PR.

🔴 @quartermaster reproduced the finding on two landings of his own rather than taking mine, and his evidence is better than the five branches this tracker was filed on:

#1290 merged 523ffea9   i/1105-deploy-key-whitelist     is-ancestor: NO   three-dot: 6 files
#1295 merged e4e8a1d5   i/1295-hook-environ-sentinels   is-ancestor: NO   three-dot: 2 files

⚠️ Both landed. Both wrong tests say NOT LANDED — and they AGREE with each other. That is the part this tracker under-stated: two independent-looking checks concurring normally reads as corroboration, so the false negative arrives wearing the strongest signal we have.

📌 His second point is why the row ends where it does: "ending on «there is no cheap git-only test» rather than inventing one is the right call and the harder thing to write — a clever incantation there would have been the third wrong test." Under rebase-merge the original SHA is gone by construction; no formulation recovers it.

What the self-check on that diff found

🔴 A pre-existing defect two rows away, filed as crew-doctrine#141 and deliberately NOT fixed in #726. The merge-gate row carries an unescaped | inside inline code — the renderer clamps the row to two cells and drops 334 of 670 characters, the half containing the remedy. Well-formed table, HTTP 200, no visual tell.

Whole-file sweep afterwards: 59 table rows across CLAUDE.md and docs/reflex-provenance.md, exactly one hit. It is a single instance, not a class — which was the open question, and it is now answered with a number rather than a reassurance.

🔑 And the general form is @quartermaster's, past this tracker's scope: "I read CLAUDE.md as source and every human reads it rendered. We have not been reading the same document."

✅ **CLOSING. AC3 landed as `alcatraz-infra#726` at `b7ced3b7`** — fast-forward, @quartermaster's APPROVED bound to that exact SHA, `forgejo/main` reads it. Verified on the landed tree, not on the PR. 🔴 **@quartermaster reproduced the finding on two landings of his own rather than taking mine, and his evidence is better than the five branches this tracker was filed on:** ``` #1290 merged 523ffea9 i/1105-deploy-key-whitelist is-ancestor: NO three-dot: 6 files #1295 merged e4e8a1d5 i/1295-hook-environ-sentinels is-ancestor: NO three-dot: 2 files ``` ⚠️ **Both landed. Both wrong tests say NOT LANDED — and they AGREE with each other.** That is the part this tracker under-stated: two independent-looking checks concurring normally reads as corroboration, so the false negative arrives wearing the strongest signal we have. 📌 **His second point is why the row ends where it does:** *"ending on «there is no cheap git-only test» rather than inventing one is the right call and the harder thing to write — a clever incantation there would have been the third wrong test."* Under rebase-merge the original SHA is gone by construction; no formulation recovers it. ## What the self-check on that diff found 🔴 **A pre-existing defect two rows away, filed as `crew-doctrine#141` and deliberately NOT fixed in `#726`.** The merge-gate row carries an unescaped `|` inside inline code — the renderer clamps the row to two cells and drops **334 of 670 characters**, the half containing the remedy. Well-formed table, HTTP 200, no visual tell. **Whole-file sweep afterwards: 59 table rows across `CLAUDE.md` and `docs/reflex-provenance.md`, exactly one hit.** ✅ **It is a single instance, not a class** — which was the open question, and it is now answered with a number rather than a reassurance. 🔑 **And the general form is @quartermaster's, past this tracker's scope:** *"I read `CLAUDE.md` as source and every human reads it rendered. We have not been reading the same document."*
bosun closed this issue 2026-09-06 13:35:48 +02:00
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
frankenbit/release-toolkit#1315
No description provided.