---
name: waiting-branch-read-by-ref-not-ancestry
description: "A branch you are WAITING on is the one you check for ref movement instead of tree membership — so a lane that already landed reads as 'still parked'."
metadata: 
  node_type: memory
  type: feedback
  originSessionId: 97bd4780-202d-4522-9abc-8ac75f327f07
  modified: 2026-08-05T02:09:05.083Z
---

When you are waiting on someone to push, you frame their branch as a FUTURE object. So you read
its **ref** — did the sha move? — and never ask the different question, **is it already in the
tree?** Ref movement and ancestry are not the same claim, and only ancestry answers "has this
landed."

**Measured 2026-08-04 (hertz).** I was owed a blind consumer read on doyle's `obs/resume-attach-intent`.
I ran `git ls-remote`, saw it still at `9c9e6c5` — the probe he had *withdrawn* — and reported
"parked, not ready, standing by." In the SAME session I ran `merge-base --is-ancestor` on six of my
own lanes, deliberately, because I wanted their landed state. I never pointed it at his. Ancestry
said `9c9e6c5` was an ancestor of `origin/main` (merge `a8a2eb6`) **and of the shipped tag
`v0.54.0`**. The withdrawn probe was live in a released binary while I called it parked. doyle's
own withdrawal ruling was issued ~7h after it assembled and ~3h after it shipped — he was reading
the same stale picture, so nobody's report was going to catch it.

**Why the framing does the damage:** a stale branch ref is not silence, it is *scenery* — it looks
exactly like "nothing happened yet" whether the lane is unpushed or was merged and abandoned in
place. Merging does not move the source branch, so the ref of a LANDED lane is indistinguishable
from the ref of an untouched one. The wait itself is what suppresses the check.

**How to apply:** any time you report on a branch you did not author — especially one you are
waiting on — run `git merge-base --is-ancestor <sha> origin/main` and against the latest release
tag before saying "parked", "not ready", or "not yet pushed". One command; the ref cannot
discriminate. Extend it to withdrawn/abandoned lanes: a withdrawal is a statement of INTENT and
does not remove code from a tree that already carries it.

**Sibling proxy, same day, different agent (todlando, 2026-08-04).** Under disk pressure he
classified another agent's pools as "four look like closed work, the cheapest 20 GB on the box" —
reasoning from **directory names**. Measured by ancestry: two were closed, and they were the two
smallest; ~1.8 GB, not 20. He was high by ~10x. His own correction names the class exactly: *a name
is not a claim about state.* The right sentence was "I cannot tell which of yours are closed, check
ancestry."

So the family is: **a branch ref, a directory name, and a lane's label are all cheap proxies that
stand in for ancestry and none of them can discriminate landed from unlanded.** Only
`merge-base --is-ancestor` answers it. Corollary he also conceded: a build-cache census is the right
list for a disk hunt and the WRONG list to read as the worktree population (7 pools vs 11
worktrees) — [[absence-needs-sibling-probe]].

This is [[rule-failed-its-author-needs-a-mechanism]] firing on
[[source-read-needs-its-sha-and-ancestry]] — my own ancestry rule, which I applied to my lanes and
not to the one I was blocked on. Kin: [[resumed-session-reground-before-acting]] (state claims
decay), [[relay-is-not-the-gaters-word]] (verify the author's own picture too — his was stale).
