Skip to content

docs: an abandoned claim is invisible to its holder and blocking to everyone else - #1694

Open
ZacxDev wants to merge 2 commits into
mainfrom
docs/stale-claim-asymmetry
Open

ZacxDev wants to merge 2 commits into
mainfrom
docs/stale-claim-asymmetry

Conversation

@ZacxDev

@ZacxDev ZacxDev commented Sep 14, 2026

Copy link
Copy Markdown
Member

Session close-out. Two commits: the durable lesson lands in the skill reference that owns it, and the handoff records the arc state.

🔴 The finding

While answering "is anything outstanding?" I ran claim-work --list and found cairn-oss-multi-instance-20 claimed for 5 days on work that is still open and that nobody was doing.

It survived because of an asymmetry that isn't visible from the exit codes read one at a time. The ownership token is /etc/machine-id + git rev-parse --git-dir, so the same unreleased ref answers:

  • rc 12THIS SESSION (you already hold it)carry on, to the clone that claimed it
  • rc 10ALREADY CLAIMEDSTOP, to the other host or any other clone

So a claim nobody is working reads as fine from exactly the machine that could clear it, and as taken from the machines it obstructs. Neither side sees the contradiction: the holder is told to carry on, the blocked session is told someone is on it, and nothing expires the ref in a way a human notices. It surfaced only because a human asked — not from any check the workflow performs.

Released; the arc now holds zero claims.

Where it landed

claude/skills/handoff/reference/shared-queue.md — the file that already owns the claim protocol — rather than only in a handoff, which gets overwritten. Adds two habits needing no --force: release your own unlanded claims at session end, and read the list before assuming an inherited queue is free.

⚠ Explicitly does not license auto-stealing. The file's existing reasoning stands — "the holder went quiet for a week" and "the holder is on a long piece of work" are the same observable, which is why --steal is a separate deliberate verb. What changes is that the holder now has a reason to look, being the one party the stale ref never warns.

Handoff

Also records the second gotcha this session produced: "is anything outstanding?" is answered by the closing-condition, not by the ranked list, and the two gave opposite answers. Ranks 4, 23 and 26 all closed and the queue read as productive; the frozen closing-condition says the arc has not arrived — phase B has not started and ranks 25/27/28 cannot advance it. A ranked list measures activity; only a frozen closing-condition measures arrival.

193,498 B of 196,608 B — 3,110 B headroom. The tool's advisory notes the next update or two will go over; claudedocs/refs/cairn-oss-multi-instance.md is the demote target.

⚠ No clawgate-task: field: resolve exited 5 with a positive control (the same endpoint answered 9 links for another session), so the board is reachable and this session genuinely has no task.

… to everyone else

The asymmetry is why abandoned claims survive, and it is not visible from the exit
codes read one at a time. The ownership token is machine-id + git-dir, so the SAME
unreleased ref tells the claiming clone "THIS SESSION (you already hold it) — carry
on" and every other host "ALREADY CLAIMED — STOP".

A claim nobody is working therefore reads as FINE from exactly the machine that
could clear it, and as TAKEN from the machines it obstructs. Neither side sees the
contradiction: the holder is told to carry on, the blocked session is told someone
is on it, and nothing expires the ref in a way a human notices.

Measured 2026-09-14: `cairn-oss-multi-instance-20` sat claimed for 5 days on work
that was still open and that nobody was doing. It surfaced only because someone
asked whether anything was outstanding and ran `claim-work --list` by hand — not
from any check the workflow performs.

Adds two habits that need no `--force`: release your own unlanded claims at session
end, and read the list before assuming an INHERITED queue is free (checking `where:`
against your own before reading rc 10 as "a peer is on it").

⚠ Explicitly does NOT license auto-stealing. The file's existing reasoning stands —
"the holder went quiet for a week" and "the holder is on a long piece of work" are
the same observable, which is why `--steal` is a separate deliberate verb. What
changes is that the HOLDER now has a reason to look, being the one party the stale
ref never warns.

Claude-Session-Id: a92541c5-8dbf-4529-aac0-2770e277e0a1
… claim-work lock on rank 20, h

Claude-Session-Id: a92541c5-8dbf-4529-aac0-2770e277e0a1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant