| 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 |