carlos / platform Public

provision: census overlays for self-serve moves plan 2, Task 6 (PROPOSED-self-serve-moves-2)

Thirteen new agent units frozen accepted-legacy with reviewed bases (the
ready facts, the precheck, the strays and the start's removal of an empty
stray directory, the file measurement, the status tick's host facts, the
stage path probe); eleven accepted-legacy units re-pinned in place and
armMovesPass's B,C authority re-digested; the seal moves. Envelopes:
console and moves in place, host, lease and status added. In the
record-write inventory offlineLand, offlineKeepStop and offlineTakeSeal are
re-pinned and MirrorPrefixKeepObserved takes MirrorPrefixKeep's place as
versioned-transport; the report writers are writeOfflineReport's shapes.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev 51edfaeb8341c90318823819fea3d155e8559e1d parent 77da46f
4 files changed, +92 −3
  • docs/superpowers/notes/census-proposal-self-serve-moves-2.md +4 −0
  • internal/provision/plan14_root_reads_test.go +6 −1
  • internal/provision/self_serve_moves2_census_test.go +27 −0
  • internal/provision/testdata/plan14-root-reads-self-serve-moves-2.tsv +55 −2
diff --git a/docs/superpowers/notes/census-proposal-self-serve-moves-2.md b/docs/superpowers/notes/census-proposal-self-serve-moves-2.md
index 241ad885b..8546e155a 100644
--- a/docs/superpowers/notes/census-proposal-self-serve-moves-2.md
+++ b/docs/superpowers/notes/census-proposal-self-serve-moves-2.md
@@ -11,3 +11,7 @@ Task 2 (the queued state, the receipts, the caller's stamps, the bound write and
Task 3 (per-box reservations with a legacy projection and a sentinel, the fenced reclaim and the operator doors' bound admission) adds no root read, class or task, and re-pins no accepted-legacy unit, so the root-read seal does not move. The new code reads no file: `moves.ParseOfflineActive` and `moves.OfflineActiveBody` are pure, and the console's `offlinereserve.go` reads `control/offline-moves/active.json` from the bucket and the instance record only through the judged reader (`observeRecord`) and plan 1's `fenceRecord`. The internal/console and internal/moves envelopes are re-pinned in place (Task 2's rows replaced). In the record-write inventory, `active.json`'s table form is a new write shape: `Server.reserveBoxes` and `Server.releaseBoxes` are added as nonrecord units (`sel:Put`): their only writes are that control key, a conditional Put under the ETag they read (create-only when absent) and, for release, a DeleteIfMatch when the table empties. `Server.offlineTakeLock`, the one-move lock's writer, is removed. `Server.offlineApplyBound` is added as a record-writer (`key:SetRecordMoveAt`): the start and stage doors' one transition bound to the incarnation and record_seq of the judged record the gate read before reserving. The reclaim's only record write is `fenceRecord`'s (WriteRecord, plan 1), reached under the holder's app lock then hostname exclusion and only once `admit` passes. Paul's ruling is still outstanding. Task 3's fix round 1 re-pins `Server.reserveBoxes` (the reclaim answers held, unreadable or reclaimed, so an unreadable holder keeps today's 502; two lost races answer busy) and the internal/console envelope; no write or read site changes.
Task 4 (the journal, the events table, the console lease and the pass skeleton) adds no root read, class or task. The console SQLite journal in `selfserve_store.go` adds twenty-two units (the schema migration, admission, the row readers, the request lifecycle, the advance, the expiry and cut writes, abort, the row setters, the finaliser, the reclaim rule's two row reads, the event insert, the undelivered-event list and the transactional audit insert), each frozen accepted-legacy under `rev3=PROPOSED-self-serve-moves-2` with a reviewed basis: console SQL as `carlos-console`, no bucket or root action. `Server.selfServeConsoleID` reads `crypto/rand` once per process for the console name the lease carries, as `mintLifetime` does. `serve` is re-pinned in place (the paging arm takes the store and reads the journal and `active.json`; the self-serve moves pass is started as a recorded worker), and `NewServer` (the store as the reclaim rule's row evidence, the recovery-mode scan) and `Store.migrate` (`migrateSelfServe`) are re-pinned. The seal moves. The cmd/console, internal/console and internal/provision envelopes are re-pinned in place. In the record-write inventory the console lease is a new write shape: `leaseToken.put` is added as a nonrecord unit (`sel:Put`), whose only write is `control/offline-moves/console.json`, a conditional Put under the ETag read (create-only when absent). `WriteRecord`, the record primitive, is re-pinned for the write guard (`WithWriteGuard`: a check immediately before the Put that can only refuse it), and `NewServer` stays a key-site and is re-pinned. No record write is added in this task; the pass's record writes arrive with Task 7. Paul's ruling is still outstanding.
+
+Task 6 (the boxes' reports: participant identity, the lane, the source precheck, target-ready, the staged book and the per-host status block) adds no root read class or task beyond accepted-legacy. In the root-read overlay thirteen agent units are new, each frozen accepted-legacy under `rev3=PROPOSED-self-serve-moves-2` with a reviewed basis (the agent, `/opt/carlos/carlos agent` under carlos-edge.service, user carlos): `movesWorker.offlineTargetReady` (the target's ready facts: the host's row and timer rows, an Lstat of `/data/programs/<host>.json`, the live link, the data paths, the park directory and the disk; it writes nothing), `liveLinkFact` (Lstat then Readlink of `<opt>/live/<host>`, never followed, compared with the channel build's version path), `absentFact` and `parkDirFact` (Lstat and ReadDir), `movesWorker.offlineSourcePrecheck` (the row, the seal's own file selection, a dry run of `archive.Build` into `io.Discard`, the live build), `strayEntry` (Lstat and a WalkDir that never follows a link), `movesWorker.removeEmptyStrays` (the one new removal: `os.Remove` of a stray entry that is an empty directory, only at a self-serve move's start once the stop holds; nothing else is removed), `movesWorker.startStrays` (this box's last source report from the bucket, then removeEmptyStrays), `measureFiles` (Lstat and WalkDir counting the files as the archive would, bounded by a time budget and twice the cap), `movesWorker.hostFacts` and `selfServeStatusProbes` (the status tick's per-host block over the rows the tick listed and one listing of the box's replica prefix), `movesWorker.offlineLayout` (the row's layout) and `stagePathActive` (`systemctl is-active carlos-stage.path`, as `configPathActive`). Eleven accepted-legacy units are re-pinned in place: `statusLoop` (it reads the box id once and publishes the self-serve block), `offlineSourceGone`, `offlineSourcePark`, `offlineSourceRevert`, `offlineTargetOpen` and `offlineTargetRevert` (their reports go through `putOfflineReport`, which stamps the box's identity), `offlineSourceStop` (a self-serve start hands its row to `startStrays`, one site added on the same row), `sourceReport` (the layout and the identity on every source report, one site added on the same row), `offlineTakeSeal` (the seal records `FinalCopiedBytes` and the identity), `armOffline` (it arms the box id, the lane probe over `lease.NewVersionedS3`, `DiskFree` and `StagePathArmed` whenever they are unset) and `CollectBox` (it carries the block into the private metrics only). `armMovesPass` keeps its B,C authority with a new digest (it sets the box id and instance id). The seal moves. Envelopes re-pinned: internal/console (readOfflineEvidence takes the move) and internal/moves in place, internal/host, internal/lease and internal/status added.
+
+In the record-write inventory Task 6 adds no record write and makes none raw. The box's new report writers (the lane, precheck, ready, staged and reverting reports) are new write shapes of an existing unit: every one goes through `putOfflineReport`, which stamps the box's identity and calls `writeOfflineReport`, unchanged (a nonrecord `PutReplace` under `control/offline-moves/<host>/<id>/<role>/<box>.json`, never a record key), so the census finds no new write unit for them. Three units are re-pinned: `movesWorker.offlineLand` and `movesWorker.offlineKeepStop` stay record-writers (`SetRecordMove` with `OfflineLandedBy` and `OfflineSealedBy`, receipts `Receipt{}`, unchanged) and only write their reports through `putOfflineReport`; `movesWorker.offlineTakeSeal` stays nonrecord (the archive, timers and env-report objects in the target bucket) and adds `FinalCopiedBytes` to the seal. `lease.MirrorPrefixKeep` is no longer a write site (it is `MirrorPrefixKeepObserved` with no observer), and `MirrorPrefixKeepObserved` takes its place as versioned-transport (`sel:CopyVersioned`), its copies, deletes and receipts exactly MirrorPrefixKeep's.
diff --git a/internal/provision/plan14_root_reads_test.go b/internal/provision/plan14_root_reads_test.go
index dae8ba1e5..6f85f90f0 100644
--- a/internal/provision/plan14_root_reads_test.go
+++ b/internal/provision/plan14_root_reads_test.go
@@ -1311,7 +1311,12 @@ func TestPlan14RootReadCensus(t *testing.T) {
// again. Task 4 (the journal, the lease and the pass skeleton) adds the
// self-serve journal's store units and the lease's console name, and
// re-pins serve, NewServer and Store.migrate, which moves it once more.
- seal = "1ab22492b6cfafd533e6f1911769d451ae0453278edfa3b319201cd2e213c28e"
+ // Task 6 (the boxes' reports and the per-host status block) adds
+ // thirteen agent units and re-pins eleven accepted-legacy ones (the
+ // offline source, target and seal steps that now report the box's
+ // identity, armOffline, statusLoop and CollectBox), which moves it once
+ // more.
+ seal = "06609884968e344b186087405e75ae217305d0813784aa5f286c0ee174d0e4e6"
errs := append(compareRootReads(got, inv), checkRootReadLegacy(inv, seal)...)
errs = append(errs, checkRootReadDeclarations(got, inv)...)
if len(errs) > 0 {
diff --git a/internal/provision/self_serve_moves2_census_test.go b/internal/provision/self_serve_moves2_census_test.go
index 1c92194b7..9863243e9 100644
--- a/internal/provision/self_serve_moves2_census_test.go
+++ b/internal/provision/self_serve_moves2_census_test.go
@@ -73,6 +73,24 @@ package provision
// and active.json for recovery mode, reading no record.
// - The journal itself is console SQLite, not a bucket write; the pass's
// record writes arrive with Task 7 (selfServeApply under the lease).
+//
+// Task 6 (the boxes' reports and the per-host status block): no record
+// write is added or made raw; three units are re-pinned and one moves.
+// - The box's new report writers (lane, precheck, ready, staged,
+// reverting) are new write shapes of writeOfflineReport, unchanged (a
+// nonrecord PutReplace under control/offline-moves/), reached through
+// putOfflineReport, which stamps the box's identity; no new unit.
+// - movesoffline_land.go:movesWorker.offlineLand and
+// movesoffline_seal.go:movesWorker.offlineKeepStop stay record-writers
+// (SetRecordMove with OfflineLandedBy and OfflineSealedBy, receipts
+// Receipt{}, unchanged) and are re-pinned: their reports go through
+// putOfflineReport.
+// - movesoffline_seal.go:movesWorker.offlineTakeSeal stays nonrecord (the
+// archive, timers and env-report objects) and is re-pinned: the seal
+// records FinalCopiedBytes and the box's identity.
+// - lease/mirror.go:MirrorPrefixKeep is no longer a write site (it is
+// MirrorPrefixKeepObserved with no observer); MirrorPrefixKeepObserved
+// takes its place as versioned-transport, its writes MirrorPrefixKeep's.
func plan14SelfServeMoves2WriteCensusInventory() []censusEntry {
removed := []struct{ file, unit string }{
{"internal/console/apiinstancemove.go", "Server.handleAPIInstanceMoveRequest"},
@@ -82,6 +100,10 @@ func plan14SelfServeMoves2WriteCensusInventory() []censusEntry {
{"internal/console/apiinstancemove_offline.go", "Server.offlineTakeLock"},
{"internal/console/server.go", "NewServer"},
{"internal/provision/record_sequence.go", "WriteRecord"},
+ {"internal/host/movesoffline_land.go", "movesWorker.offlineLand"},
+ {"internal/host/movesoffline_seal.go", "movesWorker.offlineKeepStop"},
+ {"internal/host/movesoffline_seal.go", "movesWorker.offlineTakeSeal"},
+ {"internal/lease/mirror.go", "MirrorPrefixKeep"},
}
added := []censusEntry{
{"internal/console/apiinstancemove.go", "Server.handleAPIInstanceMoveRequest", "record-writer", "key:SetRecordMove,lit:instances", "6be4b2d5ed59e3e42c47589039daba2cdb4081db45e0258d8889ef8477290591"},
@@ -96,6 +118,11 @@ func plan14SelfServeMoves2WriteCensusInventory() []censusEntry {
{"internal/console/selfserve_lease.go", "leaseToken.put", "nonrecord", "sel:Put", "e574640142eb930463ce8c4a91cd599857870311303072902ca8d98901d64fac"},
{"internal/console/server.go", "NewServer", "key-site", "lit:instances", "4a3aea119aaef70a5eb1a0e0a01c47ea8f91b1f3b121bb209624d1752e0086e3"},
{"internal/provision/record_sequence.go", "WriteRecord", "record-primitive", "key:IsRecordKey,key:WriteRecord,key:preparedRecordKey,sel:Put", "85bcdcc6bfe53d3f170fa3a2b79709b374646460301d12456b453d04e347428e"},
+ // Task 6.
+ {"internal/host/movesoffline_land.go", "movesWorker.offlineLand", "record-writer", "key:SetRecordMove", "666b5bfad0442ce99a1777a47a138114f9903b8e1d7189a64c99075d3e386b16"},
+ {"internal/host/movesoffline_seal.go", "movesWorker.offlineKeepStop", "record-writer", "key:SetRecordMove", "2d2532c60ceb4bed176f4afa16d1bba2e312da4c1df87d609dfbdbd2f4332082"},
+ {"internal/host/movesoffline_seal.go", "movesWorker.offlineTakeSeal", "nonrecord", "sel:Put", "cb3fed4feb67588e0b66aaa6ce13b5dc0e01f579b3d3767a312052e9998bc754"},
+ {"internal/lease/mirror.go", "MirrorPrefixKeepObserved", "versioned-transport", "sel:CopyVersioned", "487ecbda5a65e1306f4fd65eaeb670a4890cbe7efb27457b7401efd9ff974ddc"},
}
entries := plan14SelfServeMoves1WriteCensusInventory()
for _, r := range removed {
diff --git a/internal/provision/testdata/plan14-root-reads-self-serve-moves-2.tsv b/internal/provision/testdata/plan14-root-reads-self-serve-moves-2.tsv
index 68abb01dd..9c800855c 100644
--- a/internal/provision/testdata/plan14-root-reads-self-serve-moves-2.tsv
+++ b/internal/provision/testdata/plan14-root-reads-self-serve-moves-2.tsv
@@ -23,8 +23,8 @@ internal/console/templates/settings.html external legacy accepted-legacy accepte
internal/provision/offline_move.go offlineBegin legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-input (J4, as OfflineStart); the console (cmd/console serve under console.service, user carlos-console): self-serve moves 1 Task 7's body (OfflineStart's, the state a parameter; a direct start advances move_seq and stamps move.seq, refusing ErrLifetimeExhausted at MaxInt64 before any write), and it now also creates the self-serve move in offline-queued for OfflineQueue (queued_at, staged_at and precheck_at at the caller's stamp, move.seq set to the record's move_seq, no advance) and records return_of; a stage and a queue hold nothing; its one site is still rec.ActiveRun.Open(), a method on the record's run state (RunState.Open), not a file read; self-serve moves 2 Task 2 file:Open@208 0a9b432ddf2f39a977c0651e377258b35c1d05635e9979583eeac6253d6c0ec8
@coverage internal/provision 42588b9f64803b41c4463efb31e69fda0fc66573efd5d6a2d6e709682eeca385
# Task 3 (per-box reservations with a legacy projection and a sentinel, the fenced reclaim and the operator doors' bound admission), rev3=PROPOSED-self-serve-moves-2: no root read, class or task is added and no accepted-legacy unit is re-pinned, so the seal does not move. The new units (moves.ParseOfflineActive, moves.OfflineActiveBody, the console's offlinereserve.go, the doors' offlineApplyBound and offlineAdvanceBound) read no file: their reads are the bucket's control/offline-moves/active.json and the instance record through the judged readers and fenceRecord. Envelopes re-pinned in place (Task 2's rows replaced): internal/console (offlinereserve.go, the start and stage doors, the Server's two evidence fields) and internal/moves (the reservation table in offline.go).
-@coverage internal/console bc37711925780197a23dee96565006cb22e012f26d4e0decbc04b29b5a990c2a
-@coverage internal/moves 7fcb4834a033d8cea99621143ba2afcbf14568c9467f08329af7c692d0c1359b
+@coverage internal/console 1f822bfe7af0fb43574bb50053474a3ef533f693cef7210434e1766c2c97ec06
+@coverage internal/moves 994b798ea9f4b582395776f27e3857339b96064fbe7637d7eeff41a0d061c200
# Task 4 (the journal, the events table, the console lease and the pass skeleton), rev3=PROPOSED-self-serve-moves-2: no root read, class or task is added. The console SQLite journal (selfserve_store.go) adds twenty-two units, each frozen accepted-legacy with a reviewed basis (console SQL as carlos-console, no bucket or root action), and the lease's console name adds one crypto/rand read (Server.selfServeConsoleID); serve (in place: the paging arm takes the store, the pass is started), NewServer (the row evidence and the recovery-mode scan) and Store.migrate (migrateSelfServe) are re-pinned. The seal moves. The lease and the pass read control/offline-moves/console.json and active.json from the bucket, not a file. Envelopes re-pinned in place: cmd/console, internal/console and internal/provision (WithWriteGuard in WriteRecord).
@legacy a8dd51a494ab3cd2ad371ded2850b6d78492569729527ea82cd8dd0f2b418a78 internal/console/selfserve_lease.go Server.selfServeConsoleID legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: reads crypto/rand once per process for the random console name the self-serve moves lease carries; randomness grants no root authority file:Read@110 3303b18ec5c77ccaf662064801f94276bfe947c31378cc1ecb8c4fe509d5d4d1
internal/console/selfserve_lease.go Server.selfServeConsoleID legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: reads crypto/rand once per process for the random console name the self-serve moves lease carries; randomness grants no root authority file:Read@110 3303b18ec5c77ccaf662064801f94276bfe947c31378cc1ecb8c4fe509d5d4d1
@@ -76,3 +76,56 @@ internal/console/selfserve_store.go auditActivityTx legacy accepted-legacy accep
internal/console/server.go NewServer legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console construction adds the lifetime judge, the cutover admission gate and its first marker read; claims-off app materialisation moves to the cutover watch; plan 2 Task 4 sets the store as the reclaim rule's row evidence and scans the self-serve journal and the bucket's active.json for recovery mode on a claims-off console; the existing logs/data route literal moves and is not a filesystem read data-literal@9149 4a3aea119aaef70a5eb1a0e0a01c47ea8f91b1f3b121bb209624d1752e0086e3
@legacy 21e8d6011940ef180e4d52a7da73ed962fbab94f7ee3e720ab94ce99e632249f internal/console/store.go Store.migrate legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: adds the three account/app-scoped lifetime intent tables and apps.lifetime at unarmed store boot, then backfills missing lifetimes; plan 2 Task 4 calls migrateSelfServe last; no bucket or root action file:Exec@13226,file:Exec@19282 21f4de8f705ef043ce2f2b10805c2e51c92fcf04a435b47a19dc148f6c3042cf
internal/console/store.go Store.migrate legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: adds the three account/app-scoped lifetime intent tables and apps.lifetime at unarmed store boot, then backfills missing lifetimes; plan 2 Task 4 calls migrateSelfServe last; no bucket or root action file:Exec@13226,file:Exec@19282 21f4de8f705ef043ce2f2b10805c2e51c92fcf04a435b47a19dc148f6c3042cf
+# Task 6 (the boxes' reports: participant identity, the lane, the source precheck, target-ready, the staged book and the per-host status block), rev3=PROPOSED-self-serve-moves-2: no root read class or task is added beyond accepted-legacy. Thirteen units are new, each frozen accepted-legacy with a reviewed basis (the agent as carlos; lstat, readlink, read-dir and walk reads that never follow a link, the dry-run archive, the registry rows the tick or the pass holds, and one systemctl is-active): movesWorker.startStrays, absentFact, liveLinkFact, movesWorker.offlineTargetReady, parkDirFact, measureFiles, movesWorker.hostFacts, movesWorker.offlineLayout, movesWorker.offlineSourcePrecheck, movesWorker.removeEmptyStrays (os.Remove of an empty stray directory only, at a self-serve start once the stop holds), selfServeStatusProbes, strayEntry and stagePathActive. Eleven accepted-legacy units are re-pinned in place with reviewed bases (statusLoop, offlineSourceGone, offlineSourcePark, offlineSourceRevert, offlineSourceStop, sourceReport, offlineTargetOpen, offlineTargetRevert, offlineTakeSeal, armOffline, CollectBox) and armMovesPass keeps its B,C authority with a new digest. The seal moves. Envelopes re-pinned: internal/console and internal/moves in place (Task 4's and Task 3's rows replaced), internal/host, internal/lease and internal/status added.
+@legacy bd73090006d466ca0f2848ec8bd155b191ca27bfc0c0753bbbb1e5063e4f47bc internal/host/agent.go statusLoop legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): the status tick's context carries the box's lifetime judge; read sites unchanged, offsets moved; self-serve moves 2 Task 6: reads the box id once (metricsBoxLabel, the edges writer's value) and publishes the self-serve block each tick through selfServeStatusProbes (the box id, CARLOS_MOVE_LANES and the armed worker's per-host facts, private Metrics only); read sites unchanged, offsets moved whole:Route@11393,whole:Route@6506,whole:Route@6533,whole:Route@7775,whole:Route@9789 05cb4aad927c91c22b02d9cd6b177b410fc574d5fe558ab95d0e832e6b50295a
+internal/host/agent.go statusLoop legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): the status tick's context carries the box's lifetime judge; read sites unchanged, offsets moved; self-serve moves 2 Task 6: reads the box id once (metricsBoxLabel, the edges writer's value) and publishes the self-serve block each tick through selfServeStatusProbes (the box id, CARLOS_MOVE_LANES and the armed worker's per-host facts, private Metrics only); read sites unchanged, offsets moved whole:Route@11393,whole:Route@6506,whole:Route@6533,whole:Route@7775,whole:Route@9789 05cb4aad927c91c22b02d9cd6b177b410fc574d5fe558ab95d0e832e6b50295a
+@legacy 12cf9adb411966865e9d150042b7f2a6824f4a6e202e4a1df4c87047fcdd9f27 internal/host/movesoffline.go movesWorker.offlineSourceGone legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, as main's moves units); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, reads the row at offline-finishing and reports gone once reconcile has removed it; lifts this move's own fence; self-serve moves 2 Task 6: writes its report through putOfflineReport, which stamps the box's identity (box id, instance id); read sites unchanged whole:Route@236 a2935a9cbe3946a5d28299511424bbbd8c579a416677062db6098e432c884068
+internal/host/movesoffline.go movesWorker.offlineSourceGone legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, as main's moves units); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, reads the row at offline-finishing and reports gone once reconcile has removed it; lifts this move's own fence; self-serve moves 2 Task 6: writes its report through putOfflineReport, which stamps the box's identity (box id, instance id); read sites unchanged whole:Route@236 a2935a9cbe3946a5d28299511424bbbd8c579a416677062db6098e432c884068
+@legacy 2a9e97729774bd11ee5c6b07bf0a2bddf45d68a0f8b90a4b926754acc061cd44 internal/host/movesoffline.go movesWorker.offlineSourcePark legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, as main's moves units); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, reads the row, then renames the host's local paths into the move's park directory under the fence; deletes nothing; self-serve moves 2 Task 6: writes its report through putOfflineReport, which stamps the box's identity; read sites unchanged, offsets moved whole:Route@1150,whole:Route@1700,whole:Route@466,whole:Route@943 db347380fc41a24ab75370a4187a5b326eb0d9a350374f803283d6d76c91a071
+internal/host/movesoffline.go movesWorker.offlineSourcePark legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, as main's moves units); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, reads the row, then renames the host's local paths into the move's park directory under the fence; deletes nothing; self-serve moves 2 Task 6: writes its report through putOfflineReport, which stamps the box's identity; read sites unchanged, offsets moved whole:Route@1150,whole:Route@1700,whole:Route@466,whole:Route@943 db347380fc41a24ab75370a4187a5b326eb0d9a350374f803283d6d76c91a071
+@legacy 5a604ddf024caebcca362a10de8fab992a8ac51a4bb18ab2481e733edd5292c6 internal/host/movesoffline.go movesWorker.offlineSourceRevert legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, census-ruling-moves-offline-precopy's disposition); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos), on abort: that body (offlineUnstage before the reverted report, unchanged), with the release now releaseObserved under reconcileMu and the host's hold lock: the record is observed afresh through the box's lifetime judge (a nil judge on a claims-on box reads the record only), and the row is released through moveCfg.ReleaseHoldSeq (registry ReleaseHoldSeq) only while that record still carries this move at offline-reverting, with that record's incarnation and move.seq; otherwise the pass skips the release and reports nothing, logged; the row reads (the hold op of the route offlineRow returns) unchanged, offsets moved; self-serve moves 1 Task 7; fix round 1: the release is offlineRelease, which with no judge (claims on) is today's moveCfg.ReleaseHold under the move's op, the row's pair untouched, and with a judge releaseObserved as above; self-serve moves 2 Task 6: writes its report through putOfflineReport, which stamps the box's identity; read sites unchanged, offsets moved registry:HoldOp@747,whole:Route@1028,whole:Route@734 b6451a1b6f08a4ac4fa5fe0fe6cd51ae97bce891082e84d82250416accabfe2c
+internal/host/movesoffline.go movesWorker.offlineSourceRevert legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, census-ruling-moves-offline-precopy's disposition); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos), on abort: that body (offlineUnstage before the reverted report, unchanged), with the release now releaseObserved under reconcileMu and the host's hold lock: the record is observed afresh through the box's lifetime judge (a nil judge on a claims-on box reads the record only), and the row is released through moveCfg.ReleaseHoldSeq (registry ReleaseHoldSeq) only while that record still carries this move at offline-reverting, with that record's incarnation and move.seq; otherwise the pass skips the release and reports nothing, logged; the row reads (the hold op of the route offlineRow returns) unchanged, offsets moved; self-serve moves 1 Task 7; fix round 1: the release is offlineRelease, which with no judge (claims on) is today's moveCfg.ReleaseHold under the move's op, the row's pair untouched, and with a judge releaseObserved as above; self-serve moves 2 Task 6: writes its report through putOfflineReport, which stamps the box's identity; read sites unchanged, offsets moved registry:HoldOp@747,whole:Route@1028,whole:Route@734 b6451a1b6f08a4ac4fa5fe0fe6cd51ae97bce891082e84d82250416accabfe2c
+@legacy 29b8dcd4884b8c29af3c3778bc983cb150b96368462192f7384845635806f5ed internal/host/movesoffline.go movesWorker.offlineSourceStop legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, as main's moves units); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, installs this move's fence, reads the row and rewrites the source report every pass; self-serve moves 2 Task 6: on a self-serve move in offline-stopping it hands the row it read to startStrays (the start's removal of empty stray directories once the stop holds), which adds one site naming the same row; the report goes through putOfflineReport whole:Route@274,whole:Route@450 7fa40437ec7a0d5d843e408f76efd7686ee097d6aa8a8ec3ed94d2d5a539dad5
+internal/host/movesoffline.go movesWorker.offlineSourceStop legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, as main's moves units); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, installs this move's fence, reads the row and rewrites the source report every pass; self-serve moves 2 Task 6: on a self-serve move in offline-stopping it hands the row it read to startStrays (the start's removal of empty stray directories once the stop holds), which adds one site naming the same row; the report goes through putOfflineReport whole:Route@274,whole:Route@450 7fa40437ec7a0d5d843e408f76efd7686ee097d6aa8a8ec3ed94d2d5a539dad5
+@legacy dc23ce88e338cbc9638b7a19f22c0a3283c08d8e8f7194d518ff26534105c279 internal/host/movesoffline.go movesWorker.sourceReport legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, as main's moves units); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, reads the row for the source report's evidence; self-serve moves 2 Task 6: also names the row's layout (offlineLayout) and the box's identity on every source report; one site added, the same row whole:Route@198,whole:Route@461,whole:Route@520,whole:Route@752 1d99bb982d835433ca11600d92c3931e3e971d8f10fd709a689617309d02792d
+internal/host/movesoffline.go movesWorker.sourceReport legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, as main's moves units); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, reads the row for the source report's evidence; self-serve moves 2 Task 6: also names the row's layout (offlineLayout) and the box's identity on every source report; one site added, the same row whole:Route@198,whole:Route@461,whole:Route@520,whole:Route@752 1d99bb982d835433ca11600d92c3931e3e971d8f10fd709a689617309d02792d
+@legacy ebee7c64759243836aaad32a2ce2332942fcd0383993f161f9d60589f2a38eca internal/host/movesoffline.go movesWorker.startStrays legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=route-and-input (J1,J4, as main's sourceFinal.run); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, reads this box's last source report from the bucket and, only once the stop holds on a self-serve move in offline-stopping, removeEmptyStrays over the row it is handed; reads only the row; self-serve moves 2 Task 6 whole:Route@683 7448fc0d4b9d94f8e1f16f28a5a8b2eef66c86f03aba740a63a2a7a51809d20c
+internal/host/movesoffline.go movesWorker.startStrays legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=route-and-input (J1,J4, as main's sourceFinal.run); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, reads this box's last source report from the bucket and, only once the stop holds on a self-serve move in offline-stopping, removeEmptyStrays over the row it is handed; reads only the row; self-serve moves 2 Task 6 whole:Route@683 7448fc0d4b9d94f8e1f16f28a5a8b2eef66c86f03aba740a63a2a7a51809d20c
+@legacy 239d2d5cc0395d6d53530b38c5c6249330885e825c23a9273058e6488b18ad5d internal/host/movesoffline_land.go absentFact legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-input (J4, as the moves units' isDir and lexists); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, an Lstat that never follows a link, of each instance path the target's ready report says must be absent; self-serve moves 2 Task 6 file:Lstat@51 45a46c84fc13bee75095b84f7aa78251b026829653ec5f5c1e2d6cee71ab9b8f
+internal/host/movesoffline_land.go absentFact legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-input (J4, as the moves units' isDir and lexists); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, an Lstat that never follows a link, of each instance path the target's ready report says must be absent; self-serve moves 2 Task 6 file:Lstat@51 45a46c84fc13bee75095b84f7aa78251b026829653ec5f5c1e2d6cee71ab9b8f
+@legacy 21fa695607b7844ecff8158b80f3a6cf9762834a7f2ca786953b9d9f2320d899 internal/host/movesoffline_land.go liveLinkFact legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-input (J4, as liveNotSealed); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, Lstat then Readlink of <opt>/live/<host>, never following it, compared as a string with the channel build's VersionPath for the record's account and app (a registry.Route built from the record, no registry read); self-serve moves 2 Task 6 file:Lstat@158,file:Readlink@485,registry:App@800,registry:Host@134,whole:Route@785 6f582ca29fac11b69632e87636bd3e0a392cb308820b7dc382c147cf6ff6cadc
+internal/host/movesoffline_land.go liveLinkFact legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-input (J4, as liveNotSealed); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, Lstat then Readlink of <opt>/live/<host>, never following it, compared as a string with the channel build's VersionPath for the record's account and app (a registry.Route built from the record, no registry read); self-serve moves 2 Task 6 file:Lstat@158,file:Readlink@485,registry:App@800,registry:Host@134,whole:Route@785 6f582ca29fac11b69632e87636bd3e0a392cb308820b7dc382c147cf6ff6cadc
+@legacy 19fd9d2b2e8fac5dffef9d37d20a44c4aac147198dabe6fcc34b204e691563ab internal/host/movesoffline_land.go movesWorker.offlineTargetOpen legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, as main's moves units); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): census-ruling-moves-offline's body (releases this move's hold on the landed row only from this box's own all-OK report), with the release now releaseObserved under reconcileMu and the host's hold lock: the record observed afresh through the box's lifetime judge must still carry this move at offline-open, and the row is released with that record's incarnation and move.seq through moveCfg.ReleaseHoldSeq; otherwise the pass ends without releasing, logged; row read sites unchanged, offsets moved; self-serve moves 1 Task 7; fix round 1: the release is offlineRelease, which with no judge (claims on) is today's moveCfg.ReleaseHold under the move's op, the row's pair untouched, and with a judge releaseObserved as above; self-serve moves 2 Task 6: writes its reports through putOfflineReport, which stamps the box's identity; read sites unchanged, offsets moved registry:HoldOp@1834,registry:HoldOp@1982,registry:HoldOp@417,registry:Status@1549,registry:Status@1869,registry:Status@1971,registry:Status@454,whole:Route@1454,whole:Route@1520,whole:Route@315,whole:Route@3151 75b16554fdd92503e92769720a93ceb89e059876ca2723fa829e59a6cd288d4e
+internal/host/movesoffline_land.go movesWorker.offlineTargetOpen legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, as main's moves units); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): census-ruling-moves-offline's body (releases this move's hold on the landed row only from this box's own all-OK report), with the release now releaseObserved under reconcileMu and the host's hold lock: the record observed afresh through the box's lifetime judge must still carry this move at offline-open, and the row is released with that record's incarnation and move.seq through moveCfg.ReleaseHoldSeq; otherwise the pass ends without releasing, logged; row read sites unchanged, offsets moved; self-serve moves 1 Task 7; fix round 1: the release is offlineRelease, which with no judge (claims on) is today's moveCfg.ReleaseHold under the move's op, the row's pair untouched, and with a judge releaseObserved as above; self-serve moves 2 Task 6: writes its reports through putOfflineReport, which stamps the box's identity; read sites unchanged, offsets moved registry:HoldOp@1834,registry:HoldOp@1982,registry:HoldOp@417,registry:Status@1549,registry:Status@1869,registry:Status@1971,registry:Status@454,whole:Route@1454,whole:Route@1520,whole:Route@315,whole:Route@3151 75b16554fdd92503e92769720a93ceb89e059876ca2723fa829e59a6cd288d4e
+@legacy a5443ede31319a1c709da14704f7f233b8503c2a023bea878120517b2d453bc5 internal/host/movesoffline_land.go movesWorker.offlineTargetReady legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=route-and-input (J1,J4, as main's sourceFinal.run); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, the target's ready facts for a self-serve move: the host's row and timer rows (absent or not), an Lstat of /data/programs/<host>.json and ReadPrograms when present, the live link, the data paths, the park directory and the disk; reads only, writes nothing; self-serve moves 2 Task 6 file:Lstat@1692,registry:HoldOp@559,registry:Status@548,whole:Route@1386,whole:Route@1571,whole:Route@449,whole:Timer@1009,whole:Timer@914,whole:Timer@935 e3d86d371cd3d348fc99afb59fc120da0407517a65348485099cfa582217aa2c
+internal/host/movesoffline_land.go movesWorker.offlineTargetReady legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=route-and-input (J1,J4, as main's sourceFinal.run); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, the target's ready facts for a self-serve move: the host's row and timer rows (absent or not), an Lstat of /data/programs/<host>.json and ReadPrograms when present, the live link, the data paths, the park directory and the disk; reads only, writes nothing; self-serve moves 2 Task 6 file:Lstat@1692,registry:HoldOp@559,registry:Status@548,whole:Route@1386,whole:Route@1571,whole:Route@449,whole:Timer@1009,whole:Timer@914,whole:Timer@935 e3d86d371cd3d348fc99afb59fc120da0407517a65348485099cfa582217aa2c
+@legacy da1a54fdca8fcdfcdab11079da18a5677b645f3b5c10b2a529623dc5f25f78d6 internal/host/movesoffline_land.go movesWorker.offlineTargetRevert legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, as main's moves units); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, parks what the move extracted and deletes only a row this move holds; self-serve moves 2 Task 6: writes its report through putOfflineReport, which stamps the box's identity; read sites unchanged, offsets moved registry:HoldOp@1572,registry:HoldOp@289,registry:HoldOp@627,registry:Status@326,registry:Status@616,whole:Route@1493,whole:Route@1559,whole:Route@1965,whole:Route@276,whole:Route@341 344f836f52dc43dd254c163c400aea7ffbbfc2fa7fbde8861608fea45acb356e
+internal/host/movesoffline_land.go movesWorker.offlineTargetRevert legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, as main's moves units); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, parks what the move extracted and deletes only a row this move holds; self-serve moves 2 Task 6: writes its report through putOfflineReport, which stamps the box's identity; read sites unchanged, offsets moved registry:HoldOp@1572,registry:HoldOp@289,registry:HoldOp@627,registry:Status@326,registry:Status@616,whole:Route@1493,whole:Route@1559,whole:Route@1965,whole:Route@276,whole:Route@341 344f836f52dc43dd254c163c400aea7ffbbfc2fa7fbde8861608fea45acb356e
+@legacy 688953d7febdf5616edb4350a1f00227b41333d78138da8d7b9a5328b46c47ee internal/host/movesoffline_land.go parkDirFact legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-input (J4, as the moves units' isDir and lexists); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, lists /data/.offline-moves/<host> for the ready report: absent, or only other moves' directories; self-serve moves 2 Task 6 file:ReadDir@60 d7ec020ce59795999aedca6ec715b0aa6b2190225b21b7145c330f7447a1389d
+internal/host/movesoffline_land.go parkDirFact legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-input (J4, as the moves units' isDir and lexists); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, lists /data/.offline-moves/<host> for the ready report: absent, or only other moves' directories; self-serve moves 2 Task 6 file:ReadDir@60 d7ec020ce59795999aedca6ec715b0aa6b2190225b21b7145c330f7447a1389d
+@legacy d0e36948201bc700e1adfe2005cfb097702c1b1cb76887e902b6ff315d903fa7 internal/host/movesoffline_reports.go measureFiles legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-input (J4, as archive.Build's walk); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, Lstat of the env file and the files directory and a WalkDir that never follows a link, counting regular files as the offline archive would, bounded by a time budget and twice the cap; reads only; self-serve moves 2 Task 6 file:Lstat@449,file:Lstat@716,file:WalkDir@1018 08b3f3cdd00eb65e2aba6f9c0f947e1a146746fdb9f5c0fe353aaf5b62f2a96f
+internal/host/movesoffline_reports.go measureFiles legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-input (J4, as archive.Build's walk); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, Lstat of the env file and the files directory and a WalkDir that never follows a link, counting regular files as the offline archive would, bounded by a time budget and twice the cap; reads only; self-serve moves 2 Task 6 file:Lstat@449,file:Lstat@716,file:WalkDir@1018 08b3f3cdd00eb65e2aba6f9c0f947e1a146746fdb9f5c0fe353aaf5b62f2a96f
+@legacy ce0c7b1de542406ca21165cdb0a3d26c20670d957cd22675b7dc941663710d32 internal/host/movesoffline_reports.go movesWorker.hostFacts legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=route-and-input (J1,J4, as main's sourceFinal.run); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, the status tick's per-host block: the instance rows the tick listed (their kind, platform mark, host and incarnation), one listing of the box's replica prefix, offlineFilesOf and measureFiles per row; reads only; self-serve moves 2 Task 6 registry:Host@1530,registry:Host@310,registry:Host@746,registry:Host@986,registry:Incarnation@665,registry:Kind@243,registry:Platform@228,whole:Route@214,whole:Route@339,whole:Route@353,whole:Route@359,whole:Route@374,whole:Route@569,whole:Route@596,whole:Route@996 08f912e24fe36accf84bb3d14757c8f6651616e60b42c4f9f3abf56746a03dda
+internal/host/movesoffline_reports.go movesWorker.hostFacts legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=route-and-input (J1,J4, as main's sourceFinal.run); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, the status tick's per-host block: the instance rows the tick listed (their kind, platform mark, host and incarnation), one listing of the box's replica prefix, offlineFilesOf and measureFiles per row; reads only; self-serve moves 2 Task 6 registry:Host@1530,registry:Host@310,registry:Host@746,registry:Host@986,registry:Incarnation@665,registry:Kind@243,registry:Platform@228,whole:Route@214,whole:Route@339,whole:Route@353,whole:Route@359,whole:Route@374,whole:Route@569,whole:Route@596,whole:Route@996 08f912e24fe36accf84bb3d14757c8f6651616e60b42c4f9f3abf56746a03dda
+@legacy 37448c3d940f9755313625d922295bccab3c4c30d112b0c7adaaa00a92251d1f internal/host/movesoffline_reports.go movesWorker.offlineLayout legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, as main's moves units); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, the row's layout (provision.NestedPaths) as a report names it; self-serve moves 2 Task 6 whole:Route@120,whole:Route@69 d3996dd93a2f0c6c77b9e045519f95fd86c6f60398cc8b0ce935914998d62626
+internal/host/movesoffline_reports.go movesWorker.offlineLayout legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, as main's moves units); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, the row's layout (provision.NestedPaths) as a report names it; self-serve moves 2 Task 6 whole:Route@120,whole:Route@69 d3996dd93a2f0c6c77b9e045519f95fd86c6f60398cc8b0ce935914998d62626
+@legacy 11bd6b2828eeebd0e06ba39fea91b92bfcb3a7e66218d0fb09db3eb5d746aa39 internal/host/movesoffline_reports.go movesWorker.offlineSourcePrecheck legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=route-and-input (J1,J4, as main's sourceFinal.run); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, the source's precheck: the row, offlineFilesOf, a dry run of archive.Build into io.Discard over the seal's own selection, strayEntries and the live build; reads only; self-serve moves 2 Task 6 whole:Route@290,whole:Route@399 65cf1ceb9885ccbe69c5ffdc85739f58486fbb9fd89b7ee6a1e02c193c61148a
+internal/host/movesoffline_reports.go movesWorker.offlineSourcePrecheck legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=route-and-input (J1,J4, as main's sourceFinal.run); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, the source's precheck: the row, offlineFilesOf, a dry run of archive.Build into io.Discard over the seal's own selection, strayEntries and the live build; reads only; self-serve moves 2 Task 6 whole:Route@290,whole:Route@399 65cf1ceb9885ccbe69c5ffdc85739f58486fbb9fd89b7ee6a1e02c193c61148a
+@legacy 71381ac41057aaad02978f756c3746def72cbb6d69f21c301c0f0e9f3aff2afe internal/host/movesoffline_reports.go movesWorker.removeEmptyStrays legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=route-and-input (J1,J4, as main's sourceFinal.run); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, offlineFilesOf over the row, an Lstat and a ReadDir of each stray entry, and os.Remove of a stray that is an empty directory, only at a self-serve move's start once the stop holds; nothing else is removed; self-serve moves 2 Task 6 file:Lstat@285,file:ReadDir@413,whole:Route@177 7d310348a3df10a4820b9019ebb4d3bf77b7f946f8f4f389ad5c916c87d59366
+internal/host/movesoffline_reports.go movesWorker.removeEmptyStrays legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=route-and-input (J1,J4, as main's sourceFinal.run); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, offlineFilesOf over the row, an Lstat and a ReadDir of each stray entry, and os.Remove of a stray that is an empty directory, only at a self-serve move's start once the stop holds; nothing else is removed; self-serve moves 2 Task 6 file:Lstat@285,file:ReadDir@413,whole:Route@177 7d310348a3df10a4820b9019ebb4d3bf77b7f946f8f4f389ad5c916c87d59366
+@legacy 97980304c1f251b54567a42965b567dbe00db45e3fae9f1bc5375ec5fe78ab60 internal/host/movesoffline_reports.go selfServeStatusProbes legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, as statusLoop); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, hands the rows the status tick listed to hostFacts; self-serve moves 2 Task 6 whole:Route@256 8133195827f7c500c423e24ba4d5827c21b7a0e9287ca2ddadd29eb056c725ed
+internal/host/movesoffline_reports.go selfServeStatusProbes legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, as statusLoop); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, hands the rows the status tick listed to hostFacts; self-serve moves 2 Task 6 whole:Route@256 8133195827f7c500c423e24ba4d5827c21b7a0e9287ca2ddadd29eb056c725ed
+@legacy a0c0ae52b14243b2462e7a22cdd812944a91c36e02f4d1369f9c6a4d4ac75471 internal/host/movesoffline_reports.go strayEntry legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-input (J4, as the moves units' isDir and lexists); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, an Lstat and, for a directory, a WalkDir that never follows a link, sizing one stray entry beside the files directory; self-serve moves 2 Task 6 file:Lstat@89,file:WalkDir@433 75354250e2c6ff0087289be4b0592f0f6f1bfc558824afd7849f6ed6306b7cdc
+internal/host/movesoffline_reports.go strayEntry legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-input (J4, as the moves units' isDir and lexists); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): new, an Lstat and, for a directory, a WalkDir that never follows a link, sizing one stray entry beside the files directory; self-serve moves 2 Task 6 file:Lstat@89,file:WalkDir@433 75354250e2c6ff0087289be4b0592f0f6f1bfc558824afd7849f6ed6306b7cdc
+@legacy f3436e6ba616f637cc3f6d10dcede79f587b091bacef2cfc0f8d719d3124b1f0 internal/host/movesoffline_seal.go movesWorker.offlineTakeSeal legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, census-ruling-moves-offline's disposition); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): census-ruling-moves-offline's body (seal steps 1 to 9 from the row: database path, next due, replication rung and timer rows, read for the seal) with one refusal before the mirror: a staged move (staged_at set) is sealed only into the staging bucket and region the stage fixed on the record (move.stage_bucket, move.stage_region), a comparison of record and edges-file fields that reads and writes nothing new. Read sites unchanged; every offset after the check moved by 487 bytes; self-serve moves 2 Task 6: the seal also records FinalCopiedBytes (the final round's copied bytes) and the box's identity; read sites unchanged, offsets moved registry:DBPath@2621,registry:NextDue@12050,registry:NextDue@12962,registry:Replication@11955,registry:Replication@12937,whole:Route@10690,whole:Route@1713,whole:Route@2682,whole:Route@3463,whole:Route@5452,whole:Route@8226,whole:Timer@9377,whole:Timer@9442,whole:Timer@9448,whole:Timer@9707,whole:Timer@9806 cb3fed4feb67588e0b66aaa6ce13b5dc0e01f579b3d3767a312052e9998bc754
+internal/host/movesoffline_seal.go movesWorker.offlineTakeSeal legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, census-ruling-moves-offline's disposition); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): census-ruling-moves-offline's body (seal steps 1 to 9 from the row: database path, next due, replication rung and timer rows, read for the seal) with one refusal before the mirror: a staged move (staged_at set) is sealed only into the staging bucket and region the stage fixed on the record (move.stage_bucket, move.stage_region), a comparison of record and edges-file fields that reads and writes nothing new. Read sites unchanged; every offset after the check moved by 487 bytes; self-serve moves 2 Task 6: the seal also records FinalCopiedBytes (the final round's copied bytes) and the box's identity; read sites unchanged, offsets moved registry:DBPath@2621,registry:NextDue@12050,registry:NextDue@12962,registry:Replication@11955,registry:Replication@12937,whole:Route@10690,whole:Route@1713,whole:Route@2682,whole:Route@3463,whole:Route@5452,whole:Route@8226,whole:Timer@9377,whole:Timer@9442,whole:Timer@9448,whole:Timer@9707,whole:Timer@9806 cb3fed4feb67588e0b66aaa6ce13b5dc0e01f579b3d3767a312052e9998bc754
+internal/host/movespass.go armMovesPass authority B,C rev3=PROPOSED-self-serve-moves-2;basis=the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): arms the moves worker with the box's judge (moveCfg.Judge, copied into its offline view); read sites unchanged, offsets moved; B,C authority retained; self-serve moves 2 Task 6: also sets moveCfg.BoxID (the label) and InstanceID (cachedInstanceID, the status tick's IMDS answer) before armOffline; read sites unchanged, offsets moved; B,C authority retained file:Read@3230,registry:Provisioned@1807,whole:Route@1794 124411d4d6cd6e09f03def44f7b99241b852b350fb5cb601801508c53a2355e1
+@legacy b13da35550effbd205bd82e0ddbae93c98ef2a79dc3d24031430d0e53c1618f9 internal/host/movespass.go armOffline legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, as main's moves units); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): census-ruling-moves-offline's body, which also arms moveCfg.ReleaseHoldSeq (releaseHeldSeq over the registry, touching the stage-requested marker after a release that landed); closes over the registry and reads nothing itself; self-serve moves 1 Task 7; self-serve moves 2 Task 6: also arms BoxID (the label), the lane probe over lease.NewVersionedS3, DiskFree (diskBytes) and StagePathArmed (stagePathActive) whenever they are unset, so the self-serve move's lane, precheck and ready reports work with Phase 1 off; read sites unchanged, offsets moved whole:Route@2780 8f23dbe5a5479bdcdcef2d85f8bb5d7c74dd6215367bb005dd74f0da761784d9
+internal/host/movespass.go armOffline legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route (J1, as main's moves units); the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): census-ruling-moves-offline's body, which also arms moveCfg.ReleaseHoldSeq (releaseHeldSeq over the registry, touching the stage-requested marker after a release that landed); closes over the registry and reads nothing itself; self-serve moves 1 Task 7; self-serve moves 2 Task 6: also arms BoxID (the label), the lane probe over lease.NewVersionedS3, DiskFree (diskBytes) and StagePathArmed (stagePathActive) whenever they are unset, so the self-serve move's lane, precheck and ready reports work with Phase 1 off; read sites unchanged, offsets moved whole:Route@2780 8f23dbe5a5479bdcdcef2d85f8bb5d7c74dd6215367bb005dd74f0da761784d9
+@legacy 9048337314c86aa4b52bc63937e6eeca71771c192a579f7efb6f3c290f879940 internal/host/probes.go stagePathActive legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-input (J4, as configPathActive): systemctl is-active carlos-stage.path for the precheck's and the ready report's stage-path fact; self-serve moves 2 Task 6 file:Command@42 f7cbe0e2ba971d201f8fc7111eb4cebac9c9bae14cc826366c06b9e8bd3eecb8
+internal/host/probes.go stagePathActive legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-input (J4, as configPathActive): systemctl is-active carlos-stage.path for the precheck's and the ready report's stage-path fact; self-serve moves 2 Task 6 file:Command@42 f7cbe0e2ba971d201f8fc7111eb4cebac9c9bae14cc826366c06b9e8bd3eecb8
+@legacy 6febdffd5ed3a46ca7c8296e2bf12d8249561e26ab6479eb672f40a96b13f0f4 internal/status/snapshot.go CollectBox legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route; self-serve moves 2 Task 6: carries Probes.BoxID, Lanes and Hosts into the private BoxMetrics only (never the public feed); read sites unchanged, offsets moved registry:Alias@4465,registry:CertExpiresAt@3160,registry:CertExpiresAt@3396,registry:CertExpiresAt@4580,registry:DBPath@2495,registry:DBPath@2553,registry:DNSCheckedAt@3365,registry:DNSCheckedAt@4549,registry:DNSStatus@3139,registry:DNSStatus@3334,registry:DNSStatus@4519,registry:Hibernate@3853,registry:Host@2295,registry:Host@2437,registry:Host@2666,registry:Host@3280,registry:Host@3315,registry:Host@4500,registry:Kind@2473,registry:Kind@3807,registry:Platform@2152,registry:ServingVersion@2324,registry:ServingVersion@2447,registry:Socket@3988,registry:Version@2186,registry:Version@2305,whole:Route@1581,whole:RouteAlias@4362 e874e3166d22d437b4d4daf2b1dc8b2d56bc853076cc132b9b2c1d30f9a2b1be
+internal/status/snapshot.go CollectBox legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route; self-serve moves 2 Task 6: carries Probes.BoxID, Lanes and Hosts into the private BoxMetrics only (never the public feed); read sites unchanged, offsets moved registry:Alias@4465,registry:CertExpiresAt@3160,registry:CertExpiresAt@3396,registry:CertExpiresAt@4580,registry:DBPath@2495,registry:DBPath@2553,registry:DNSCheckedAt@3365,registry:DNSCheckedAt@4549,registry:DNSStatus@3139,registry:DNSStatus@3334,registry:DNSStatus@4519,registry:Hibernate@3853,registry:Host@2295,registry:Host@2437,registry:Host@2666,registry:Host@3280,registry:Host@3315,registry:Host@4500,registry:Kind@2473,registry:Kind@3807,registry:Platform@2152,registry:ServingVersion@2324,registry:ServingVersion@2447,registry:Socket@3988,registry:Version@2186,registry:Version@2305,whole:Route@1581,whole:RouteAlias@4362 e874e3166d22d437b4d4daf2b1dc8b2d56bc853076cc132b9b2c1d30f9a2b1be
+@coverage internal/host f4067a03eba1f16e1b01f8a708de3197c8f3f58b85b15b0aeb33402e98048182
+@coverage internal/lease 7e2a4a3652f964aaf1ee32356d2538a292c66ee0aaf9e622cf087b644aeaaa61
+@coverage internal/status 6bf65bf3b04fdc150e2ec35d2d0d67046cf37b7c60a9dcde1c2204b75bcf8d2b