From a92dfc2dd9f99ec54e80a4eaf2948ee2e0a0db30 Mon Sep 17 00:00:00 2001 From: Jonathan Borduas Date: Fri, 21 Aug 2026 14:26:26 +0100 Subject: [PATCH] handoff: withdraw guard 5 -- it measured branch age, not content loss TEAMLEAD (pane uds:/tmp/cc-socks/3482.sock; the registry labels it DEV4). Guard 5 refused every open PR on the board and every one was a net addition. git diff main..head counts everything main gained since the branch base as a deletion; a merge applies the three-dot diff. #499's actual merge adds 68 lines and removes 2, against the 907 deletions the guard reported. ARCHITECT showed by controlled experiment that the genuinely dangerous case conflicts rather than merging silently, so mergeStateStatus reads DIRTY. Two-dot vs three-dot is a trap recorded earlier in this same session. The guard was built on a number I had already been taught not to trust. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01B1HzE38NGQojr3FtUnR1JX --- docs/HANDOFF.md | 47 ++++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 91fd489..0d784b9 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -113,7 +113,7 @@ repeat "the fleet ran out of context" as though it were measured. ⇒ **Nothing was lost.** Zero open PRs, `main` green, every open thread owned with a close condition. -## ⇒ The FIVE guards on the merge loop, each added after it cost something +## ⇒ The FOUR guards on the merge loop, each added after it cost something ``` reviews read before merge ← a review was merged over; CI status cannot carry an objection @@ -124,30 +124,35 @@ gating run POST-dates THE GATE ← added 04:45Z, CORRECTED 06:20Z. A check older establishes nothing about the gate it must pass. ``` -⛔ **GUARD 5 EXISTS BECAUSE ALL FOUR OTHERS PASSED A PR THAT WOULD HAVE REVERTED SEVEN MERGES.** -Measured 12:53Z on #509: +⛔ **GUARD 5 WAS WITHDRAWN THE SAME DAY IT WAS ADDED. It measured BRANCH AGE, not content loss.** +It refused every open PR on the board and every one was a net addition: ``` -merge-base 273b4a8 ⇒ SEVEN merges behind main -mergeStateStatus CLEAN ⇒ no conflict exists — none is possible -guards 1-4 ALL PASS ⇒ base IS main, 0 reviews, gating SUCCESS, check post-dates the gate -git diff --stat origin/main : 14 files, 4 insertions, 709 DELETIONS + two-dot (what guard 5 used) three-dot ACTUAL MERGE (merge-tree) +#499 119 ins, 907 deletions 68 ins, 2 del 68 ins, 2 del +#507 76 ins, 224 deletions 61 ins,13 del 61 ins,13 del +#511 49 ins, 171 deletions 36 ins, 3 del — ``` -⇒ **A branch old enough merges as a REVERT SHAPED LIKE A FAST-FORWARD.** Git is correct and the -board is correct; the hazard is invisible to both. ⛔ **Guard 1 checks `base == main` and the base -IS main** — the base ref was never the hazard, the **merge-base age** is, and the ref does not carry -it. ★ It is #445 mirrored: I instrumented *a stacked PR's squash orphans its child* and not *a stale -branch's merge reverts its parents*. - -``` -guard 5: git diff --stat origin/main → net-NEGATIVE on a PR that describes an addition -``` - -⚠ **The naive form over-fires** — legitimate deletions exist. The discriminator is **lines the PR -never added, in files it does not claim to touch**. ⛔ **And it was caught by RECOGNISING three -commit shas**, not by any check: memory, which does not scale and fails if another pane merged the -parents. Filed as **#510**. `strict: true` closes it entirely by forcing currency. +⇒ **`git diff main..head` counts every line MAIN has gained since the branch's base as a deletion.** +A merge applies the **three-dot** diff — it uses the merge base — so the "709-line revert" I blocked +#509 on **was never going to happen**. ⚠ ARCHITECT further showed by controlled experiment that the +genuinely dangerous case (rewriting a file main has grown) **CONFLICTS** — `mergeStateStatus` reads +`DIRTY`, not `CLEAN`. ⛔ **The four guards passed #509 because there was nothing to catch.** + +★ **This is CLASS C in the guard itself**: `git diff --stat main ` answers *"how does this TREE +differ from main"* and merging answers *"what will be ADDED"*. **Both numbers were correct and they +answer different questions.** + +⚠ **And it was my own recorded trap, used backwards** — two-dot versus three-dot is filed earlier in +this session as a defect I hit and named. ⛔ ⇒ A guard built on a number you have already been taught +not to trust is worse than no guard, because it refuses real work with a confident figure. + +⚠ **What is NOT settled** — #509's branch was updated before merging, so the state I reacted to is +**gone from every ref**. ARCHITECT's experiments are analogues on real history, not the instance. +⇒ And the hazard would be real if this repository ever merged by a path that is not a merge — +**"rebase and merge" replays commits and is not merge-base-aware the same way.** That is DEVOPS's +question and it is open on #510. ⛔ **GUARD 4's FIRST FORM WAS SELF-DEFEATING AND BLOCKED THE WHOLE QUEUE.** It compared the check against **main's HEAD**, so every merge invalidated every other PR. Measured 06:19Z: #453 merged,