Free a slot only on explicit release — never by inference #37
Labels
No labels
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Meta/Campaign
Meta/Epic
Meta/Session
Priority/Critical
Priority/High
Priority/Low
Priority/Medium
Reviewed/Confirmed
Reviewed/Curated
Reviewed/Duplicate
Reviewed/Invalid
Reviewed/Won't Fix
Scope/Campaign
Status/Abandoned
Status/Blocked
Status/Conflicted
Status/In Progress
Status/In Review
Status/Need Grooming
Status/Need More Info
Status/Ready
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Blocks
Reference
Ting/Vedanta#37
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Proposal
The pool's core invariant, in the only form that needs no mechanism: a slot is freed by an explicit release and by nothing else.
Delivery class
agent-unit— the release path and the refusal of every other path, with capture doubles.Design
A slot is available when something explicitly released it. Every other condition holds it: no timeout frees a slot, no staleness backstop frees a slot, no unreachable or silent runtime frees a slot, and no absence of evidence frees a slot.
This is the whole behaviour, not a fallback branch. Per the freeholder direction on Ting/Ting#2 Q2 (2026-09-04), the liveness mechanism stays undefined until there is operational evidence to design it against. Rather than leave that as a gap, the record takes the conservative shape: nothing infers liveness at all. There is no mechanism to get wrong because there is no inference.
Directory state was never a candidate anyway. It records attribution — holder, checkout time, generation — all written by the checkout now in doubt. A record of who took a slot is not evidence they still hold it.
The failure this chooses
A drone that dies without releasing holds its slot indefinitely. Ten such deaths exhaust the pool: allocation refuses, and the swarm cannot start.
That is the intended failure, and choosing it is the point. It is loud, bounded, non-destructive, and recoverable by an explicit release. The alternative — an automatic release built on a mechanism nobody has validated — fails silently, and its failure is two live drones sharing one identity: unbounded, and found late.
Held slots are drift this service observes and cannot resolve, so they are raised under the #11 mandate rather than left to accumulate quietly. The pool says it is filling before it is full.
What is deferred
The eventual liveness source. It returns as an amendment when held-slot incidents show what evidence was actually available at the time — grounded rather than assumed. Nothing in this record needs revisiting to add it: an inference path would be a new way to release, not a change to the rule that only a release frees a slot.
Tasks
Specification Delta
Requirement: only an explicit release frees a slot
Scenario: a holder disappears without releasing
Scenario: the pool is exhausted
Requirement: a failed check never reads as availability
Scenario: a liveness or transport failure
OpenSpec
OpenSpec 30
Structural parent
Vedanta#31
Refuse reissue until the previous holder is shown goneto Free a slot only on explicit release — never by inference