carlos / platform Public

Clone
git clone https://amadan.net/carlos/platform

Plain git — no account needed to clone.

Download

Download this file

Region HA L14 to L18 against the moves spec and the claim (platform-d8, 2026-10-06)

Written while folding region HA spec 1 rev 5.4 §9 (branch design-region-ha-rev5) into moves rev 7.19, with claim rev 6.27 (989ee349) §1.1's rulings in hand. "Claim change" means platform-1e has to do something for the moves text to hold.

Folded into moves rev 7.19 with no conflict

  • L15, the target box in the start CAS. Moves' hostclaim.BeginMove (plan 1 Task 3) already takes targetBox and records participants = {source, target} and intent.target. Rev 7.19 §7.1 names choose() as the chooser for a multi-box region. No claim change: the participants list and the single-exec rule are claim §2 as they stand. Moves' door reads the roster and the edges snapshot; it needs the roster's eligibility read (region HA §5.2 eligibleBoxes) exported from wherever region HA builds it, or it falls back to "the lexically-first box publishing the placement" for a one-box region, which is what it does today.
  • L16, one install routine. moves.BuildGeneration (plan 2 Task 8) takes a pinned version set and N; relocation can call it with a genselect.SelectPrepared plan or a current listing. No claim change.
  • L17, the files manifest per installation. Moves' local phase publishes the installed directory through region HA's files publisher before .files-gen. Claim change (already region HA's L13): the sweep's classifier must treat <location>files/<generation>/ as that generation's and protect the objects the files live set names; without L13, a park-generation chore would archive a live manifest's objects. Moves also needs the publisher's API (region HA plan 1a's) exported: files.Publish(ctx, store, location, generation, dir, envPath) (manifestVersion string, err error) or equivalent; the moves plan names it as a contract, not a fact.

Folded with a claim change required

  • L14, the termination fence as M16's evidence. Moves §7.10 now says a fenced target is taken off the move automatically before the record's commit, through the declared-loss path, with fenced_at as the scope's evidence time. On the claim side this needs L2 to L4 as region HA requests them: declareLostTransition today requires QuarantineRevision != 0 and a non-empty Enrollment from an operator-prepared LossRecord (leases branch lost.go:221); a fence with no quarantine revision and no operator must be a legal declaration input (L4 says a terminated box needs no readmission). Moves needs the journal to carry one readable reference to the fence (the loss.<id> entry's intent, or a new fence key) so ReturnToSource (plan 4 Task 2) can accept it as the cited evidence; the key name is the claim's to choose. Until that lands, the moves plan marks the fence path BLOCKED-ON-CLAIM beside --declare-lost.
  • A terminated source before the flip. Moves §7.10 says the move aborts and relocation takes the host. The claim's moving op must be releasable by the fence's lost-box path while the move's staging park is still owed (abort's park-staging, owned by the target region): the release of a moving claim with outstanding obligations is today ErrPendingChore (ReleaseMove); region HA's L1 "source-loss conversion to failover from starting or releasing" needs the same for moving. Claim change: a fence may convert moving to relocating with the staging obligation carried over, or the obligation's owner must be allowed to acknowledge under the new op.

Not done, stated as a limit

  • L18, two boxes per region in the model. internal/sim/hostlife keeps one box per region plus replacement boxes. The requested extension models relocation, an operation outside the moves spec, over a world whose box.Region bookkeeping assumes one box per region; it is not tractable in this revision within the CPU policy (the gate plus one niced 3000 sweep). Rev 7.19 §14.2.6 states the limit. It belongs to a joint round with the region HA session on its own branch once relocation's protocol is fixed.

Rulings that touch both

  • P7, cold-only. Moves rev 7.19 §0.5 and §19.1: every admission cold, no certificate issued. The claim library keeps Mode: "warm" and PredecessorCertified; moves never passes them. No claim change; the claim's own §1.1 already records P7.
  • Park kinds (plan review round 2, finding 3; platform-1e's interface check). Moves drops park-superseded and park-staging: staging lanes are park-replica scoped to moves/<host>/<op id>; a source's finalization and a rolled-back target's cleaning are park-replica scoped to the whole location (non-authoritative there, so the engine selects everything); a landing's earlier-stay residue is park-generation per residue generation (the engine's live-set rule lets those acknowledge after the new generation is live). Destination stays the engine's parked/<incarnation>/<host>/<retirement>/; F3 selects by manifest Op. No new claim kind is needed in 6.27. Reason: nothing in the move reads superseded data back (a dirty return seals the target's live installation before cleaning parks; a clean return restores from the source's live replica), M7's seven-day hold is F3's rule over immutable manifests, not a path, and D5's one manifest per retirement event is the engine's own.
  • One claim contract moves still needs for parks on a serving box: Engine.Run acquires the location's replica lease (park/remote.go:404). A park-generation chore for a location this box itself serves (the landing's earlier-stay residue acknowledging after the probe; the at-rest sweep on a serving host) can only acknowledge if the regional runner's Leases.Acquire shares the activator's held lease for a location this box serves (an aggregate lease adapter, claim Plan 5 D3's wording). Moves lists it as a BLOCKED-ON-CLAIM contract.