prepare
Introduce a new generation (EntitlementLedger.prepare); returns whether it applied.
Two peers preparing one id starve the child — on this ungoverned path only. There is no serializer here: both peers pass their own local isKnown check, the Quilter merges the results, and the per-id join is a set union (§5.2 deliberately refuses last-writer-wins on a parent pointer), so the id ends up bound to a divergent set. EntitlementLedger.record then resolves to null, the policy drops the edge as inconsistent input, and the child never competes again — permanently, on every peer, with no way to re-prepare the id. One proposer per generation is a hard requirement in static mode, not a habit.
The governed path does not have this failure mode: GovernedHeddleNode.prepare routes through the consensus log, which orders concurrent proposals first-wins and answers the loser with a structured Conflict(Refused) naming the bound id. That is why this mutator is not re-exposed on GovernedHeddleNode.
The record carries no seat (issue #1752), so nothing about when it is prepared decides where the child starts competing: schedule's seat bump writes the Gauge at the front the edge is actually joining, on every peer that still sees it unseated.