carlos / platform Public

provision: census re-pins for Task 6 fix round 1 (PROPOSED-self-serve-moves-2)

Five Task 6 rows re-pinned in place (sourceReport, measureFiles,
hostFacts, selfServeStatusProbes, offlineTakeSeal) and armMovesPass's B,C
authority re-digested; the seal and the internal/host envelope move. In
the record-write inventory offlineTakeSeal is re-pinned.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev d138725d366e64835b3b56f75fa34a51213703fe parent a19010e
4 files changed, +21 −16
  • docs/superpowers/notes/census-proposal-self-serve-moves-2.md +2 −0
  • internal/provision/plan14_root_reads_test.go +4 −2
  • internal/provision/self_serve_moves2_census_test.go +3 −2
  • internal/provision/testdata/plan14-root-reads-self-serve-moves-2.tsv +12 −12
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 8546e155a..3ca36f0b9 100644
--- a/docs/superpowers/notes/census-proposal-self-serve-moves-2.md
+++ b/docs/superpowers/notes/census-proposal-self-serve-moves-2.md
@@ -15,3 +15,5 @@ Task 4 (the journal, the events table, the console lease and the pass skeleton)
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.
+
+Task 6 fix round 1 re-pins five of Task 6's root-read rows in place, with the basis extended: `sourceReport` and `offlineTakeSeal` name the lazily resolved instance id, `measureFiles` returns its budget error, `hostFacts` gives the walks their own budget and reports a host it never measured as not known, and `selfServeStatusProbes` collects the per-host facts only when `CARLOS_SELF_SERVE_MOVES=offline` is in the box's environment or the box takes part in a queued or staging move. `armMovesPass` keeps its B,C authority with a new digest (it sets the lazy resolver). No read site, class or task is added. The seal moves; the internal/host envelope is re-pinned in place. In the record-write inventory `offlineTakeSeal` is re-pinned (nonrecord, unchanged writes).
diff --git a/internal/provision/plan14_root_reads_test.go b/internal/provision/plan14_root_reads_test.go
index 6f85f90f0..89dc38659 100644
--- a/internal/provision/plan14_root_reads_test.go
+++ b/internal/provision/plan14_root_reads_test.go
@@ -1315,8 +1315,10 @@ func TestPlan14RootReadCensus(t *testing.T) {
// 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"
+ // more. Its fix round 1 (the lazy instance id, the walks' budget and the
+ // tick's in-play rule) re-pins five of its rows in place, which moves it
+ // again.
+ seal = "e02822ca7770fab72cdc984930c7631600f06f252f1235edc402808474dab0c0"
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 9863243e9..e1ba3808a 100644
--- a/internal/provision/self_serve_moves2_census_test.go
+++ b/internal/provision/self_serve_moves2_census_test.go
@@ -87,7 +87,8 @@ package provision
// 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.
+// records FinalCopiedBytes and the box's identity (fix round 1: the
+// lazily resolved instance id).
// - 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.
@@ -121,7 +122,7 @@ func plan14SelfServeMoves2WriteCensusInventory() []censusEntry {
// 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/host/movesoffline_seal.go", "movesWorker.offlineTakeSeal", "nonrecord", "sel:Put", "b6c3ab647f9ad8def7bc745e0781d12e4c079f24053fb53ad9a3f5053d20cc63"},
{"internal/lease/mirror.go", "MirrorPrefixKeepObserved", "versioned-transport", "sel:CopyVersioned", "487ecbda5a65e1306f4fd65eaeb670a4890cbe7efb27457b7401efd9ff974ddc"},
}
entries := plan14SelfServeMoves1WriteCensusInventory()
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 9c800855c..550e23e15 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
@@ -87,8 +87,8 @@ internal/host/movesoffline.go movesWorker.offlineSourcePark legacy accepted-lega
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 6e8dc4ce8f8e75473f4a58457ec8e26d241ee136cc2b737360ca5e43a54dcf92 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; fix round 1: the identity is the lazily resolved instance id (moveCfg.instance); read sites unchanged whole:Route@198,whole:Route@461,whole:Route@520,whole:Route@752 f24034064f5a3a8b6421cf10f3f083c5f0231aaed0cb3a9414781382afe70c01
+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; fix round 1: the identity is the lazily resolved instance id (moveCfg.instance); read sites unchanged whole:Route@198,whole:Route@461,whole:Route@520,whole:Route@752 f24034064f5a3a8b6421cf10f3f083c5f0231aaed0cb3a9414781382afe70c01
@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
@@ -103,29 +103,29 @@ internal/host/movesoffline_land.go movesWorker.offlineTargetReady legacy accepte
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 66f461462bce033d2a2c0dee9c7e89151e1b422e05ad4b96289020ae7e7ba65b 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; fix round 1: a walk the budget cut returns errMeasureBudget; read sites unchanged file:Lstat@449,file:Lstat@716,file:WalkDir@1018 86250ed7934c7d5ea4689c5f82296cb782a8afcee54bb5957a57f7736bd26d32
+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; fix round 1: a walk the budget cut returns errMeasureBudget; read sites unchanged file:Lstat@449,file:Lstat@716,file:WalkDir@1018 86250ed7934c7d5ea4689c5f82296cb782a8afcee54bb5957a57f7736bd26d32
+@legacy 5502c6cc9f0c1e678af55e953a0552f21bf7fb6bcbac5cbdf4c2b7de18f50a4b 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; fix round 1: the walks share a budget from after the listing, and a host the budget never reaches or cuts is not known; read sites unchanged, offsets moved registry:Host@1182,registry:Host@1906,registry:Host@310,registry:Host@942,registry:Incarnation@861,registry:Kind@243,registry:Platform@228,whole:Route@1192,whole:Route@214,whole:Route@339,whole:Route@353,whole:Route@359,whole:Route@374,whole:Route@765,whole:Route@792 062e4a9f8d4afb9629668a057b7f806b472225385981e8d5164c8a3b60738860
+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; fix round 1: the walks share a budget from after the listing, and a host the budget never reaches or cuts is not known; read sites unchanged, offsets moved registry:Host@1182,registry:Host@1906,registry:Host@310,registry:Host@942,registry:Incarnation@861,registry:Kind@243,registry:Platform@228,whole:Route@1192,whole:Route@214,whole:Route@339,whole:Route@353,whole:Route@359,whole:Route@374,whole:Route@765,whole:Route@792 062e4a9f8d4afb9629668a057b7f806b472225385981e8d5164c8a3b60738860
@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 c94e0181d9aee416414add6b2c7abad2092d4863eb3c2e8d7d614b5ea45208c9 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; fix round 1: the per-host facts only when CARLOS_SELF_SERVE_MOVES=offline is in the box environment or the box takes part in a queued or staging move (selfServeInPlay); the instance id published always whole:Route@363 5702277c0ae2491be6b2e28bdab5ac9d436f6c3ce9ebccebbc538d2bec8917e3
+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; fix round 1: the per-host facts only when CARLOS_SELF_SERVE_MOVES=offline is in the box environment or the box takes part in a queued or staging move (selfServeInPlay); the instance id published always whole:Route@363 5702277c0ae2491be6b2e28bdab5ac9d436f6c3ce9ebccebbc538d2bec8917e3
@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 a443a0757e282f057bc226d3118343432b73d54407eedf13d0b03ee2294ab30f 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; fix round 1: the seal names the lazily resolved instance id; read sites unchanged 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 b6c3ab647f9ad8def7bc745e0781d12e4c079f24053fb53ad9a3f5053d20cc63
+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; fix round 1: the seal names the lazily resolved instance id; read sites unchanged 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 b6c3ab647f9ad8def7bc745e0781d12e4c079f24053fb53ad9a3f5053d20cc63
+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; fix round 1: also sets InstanceIDOf (cachedInstanceID through throttledInstanceID); read sites unchanged, offsets moved file:Read@3311,registry:Provisioned@1807,whole:Route@1794 527e57425a562148c7973df28359eb890083e05358c94239ee47a7a2e3d38fe3
@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/host 8f1c08e95ae6cb5f287d7acea0bb3e7311a94f69cdbf0afd0ff4bebb21075af4
@coverage internal/lease 7e2a4a3652f964aaf1ee32356d2538a292c66ee0aaf9e622cf087b644aeaaa61
@coverage internal/status 6bf65bf3b04fdc150e2ec35d2d0d67046cf37b7c60a9dcde1c2204b75bcf8d2b