The middle row is the finding; the 79% is only the receipt
Lead with this, because a summary would hide it (frankD, who found the cause and then re-ranked my own table):
53% resolved with 289 ambiguous is strictly worse than 43% resolved with none. The obvious widening — match any
rebase— trades "I don't know" for "I confidently know, wrongly", and a seat name is addressable, so the wrong answer gets acted on in a way an unresolved sha never does. The gain is entirely in the pick family and it costs nothing.
rebase (start) checks out the UPSTREAM tip, so it stamps every puller's reflog
with whatever sha origin was at. frankD's placement of it: the same class as this
file's own warning about git fetch — an operation that moves refs through every
checkout leaves a trace that looks like authorship.
The rule is right, the rate is wrong, and the miss is where it hurts
Nothing here disputes the method. git log origin/master --grep=<session URL>
and the reflog are still the two instruments, and the reflog still answers WHERE
a commit was authored rather than WHO authored it.
What is wrong is the implied hit rate, and it changes how a reader treats a miss. The file says "Verified 2026-09-02: seven of eight shas in one arc, one checkout, one id" and "the EIGHTH sha not resolving is the instrument telling you it has a failure mode — read that as the tell, not as noise." A reader takes that as: resolution is the norm, a miss is the exception worth noticing.
Measured 2026-09-06 over 719 commits and every checkout under /home/neo:
| rule | resolved | ambiguous |
|---|---|---|
commit only (the file's) |
43% | 0 |
commit or any rebase |
53% | 289 |
commit or rebase (pick|reword|squash|fixup|amend|continue) |
79% | 0 |
The cause is tools/sync.sh, which this file mandates. It pulls --rebase
before every push, so an authoring checkout's own commits are replayed: the sha
that lands on origin/master appears in that checkout's reflog under
rebase (pick):, and the commit: entry stays behind on the pre-rebase id.
Verified on f00d3d230 (frankD's bracket fix): rebase (pick) in frankD's
reflog and in no other checkout; commit: on its pre-rebase id f7ee1414a.
frankD's own statement, which is the sentence worth keeping: "that is not a gap
in the method, it is the method meeting tools/sync.sh."
DANGLING SHAS BY DESIGN
f7ee1414a above is a DOOMED PRE-REBASE ID and is quoted deliberately: it is
the exhibit, not a citation. It is not on origin, and it is not even a valid
object in every checkout — git cat-file answers Not a valid object name here,
because the id only ever existed in frankD's own store. That is the whole point
the ticket is making, so the marker is added rather than the sha corrected.
Added by frankA 2026-09-06, on the checker's own instruction — its message says to add this line when a dead sha is quoted on purpose. Worth doing rather than leaving: a check that fires forever on a ticket that is RIGHT is how a real hit gets scrolled past, and this one had been the only remaining DANGLING-SHA in the whole run.
So the miss is structured, not random, and it is concentrated exactly where it costs: a push that had nothing to rebase over keeps its sha and resolves, and a push that raced anything does not — which is nearly every recent one. The 2026-09-02 arc that verified the rule was an arc whose pushes did not rebase. That is this file's own census over the corpus you have landing on the file itself.
DO NOT FIX IT BY WIDENING TO rebase. rebase (start) checks out the
UPSTREAM tip, stamping every puller's reflog with whatever sha origin was at, so
the wide rule makes 289 of 719 shas name two seats. A seat name gets believed in
a way a session id does not, so that middle row is worse than the status quo
while looking like an improvement.
The exact sentence this retires, quoted so it is not left in beside its own correction
CLAUDE.md today:
"Verified 2026-09-02: seven of eight shas in one arc, one checkout, one id. … The EIGHTH sha not resolving is the instrument telling you it has a failure mode — read that as the tell, not as noise."
The lesson in that sentence survives and its arithmetic does not. It frames a miss as an anecdote with a moral attached; the measurement makes the miss the majority case, so a reader who meets an unresolved sha and treats it as the tell is reading the common case as the exception. frankD asked for the old line to be quoted here specifically because it is the kind of line that gets left in beside its own correction, and then both are true-sounding and one is wrong.
A second, smaller trap in the same command, and it is the better half of the tooling case
The documented command is git -C ~/<name> reflog --format='%h %gs' | grep '^<sha> commit'. %h is the ABBREVIATED sha, so a full 40-character id
pasted from git rev-parse — which is what anyone scripting this produces —
matches nothing, silently, and reads as "that checkout did not author it".
This file's own words for it: every instrument that lies, lies by being CORRECT
ABOUT SOMETHING ELSE. The grep is correct about abbreviated shas. Stated in the
ticket rather than only in the tool, at frankD's request, because a reader who
never runs whoholds still meets the command here.
Proposed replacement text, for the owner to edit or discard
Replacing, in "A CLEAN TREE IS NOT EVIDENCE ABOUT A SESSION EITHER", the sentence beginning "Plain reflog membership does NOT discriminate" and the verification note after it:
Match on an AUTHORING action, not on presence:
commit,commit (amend), and therebase (pick|reword|squash|fixup|amend|continue)family.rebase (pick)is not optional —tools/sync.shrebases before every push, so an authoring checkout's own commits are replayed and the sha that reaches origin/master carriesrebase (pick)whilecommitstays on the pre-rebase id.rebase (start)andrebase (finish)must be EXCLUDED:startchecks out the upstream tip and stamps every puller's reflog. Measured 2026-09-06 over 719 commits and 17 checkouts:commitalone resolves 43%, the authoring-action rule resolves 79% with zero ambiguity, and matching anyrebaseresolves 53% while making 289 shas name two seats. An unresolved sha is the common case, not the tell — corroborate with a second sha, and treat two claimants as ambiguous rather than as an answer.
Also worth a word: the file's command uses --format='%h %gs' and greps
'^<sha> commit', so it matches only an ABBREVIATED sha. A full 40-character sha
pasted from git rev-parse silently matches nothing — the same
answers-about-something-else shape, one layer down.
Done when
The owner has either edited CLAUDE.md or said the rate is not worth the words.
The tooling half needs nothing from this ticket and is already landed:
732b238d7 makes tools/whoholds.py resolve and print seat=<checkout> under
the authoring-action rule, reporting ambiguous when two checkouts claim one sha,
so an agent that uses the tool never types the grep.