| index 0d2e8c798..504dcc7a4 100644 |
| --- a/docs/superpowers/plans/2026-10-06-moves-phase1-copy.md |
| +++ b/docs/superpowers/plans/2026-10-06-moves-phase1-copy.md |
| @@ -491,194 +491,194 @@ Plan `docs/superpowers/plans/2026-10-20-offline-operator-move.md`. The rows take |
| |
| | id | file | text | status | |
| |---|---|---|---| |
| -| MV-O1 | move.go | <host> is offline from now until the move opens or is aborted. | pending | |
| -| MV-O2 | move.go | Every box in <from> has stopped <host>. Run carlos move offline seal --host <host> to copy it. | pending | |
| -| MV-O3 | move.go | Copying <host> to <to>. | pending | |
| -| MV-O4 | move.go | Copied and checked. Run carlos move offline flip --host <host> to start it in <to>. | pending | |
| -| MV-O5 | move.go | <to> holds everything <host> needs. Nothing is served yet. Run carlos move offline open --host <host> to serve it from <to>. | pending | |
| -| MV-O6 | move.go | <to> could not take <host>: <reason>. Run carlos move offline abort --host <host> to move it back. | pending | |
| -| MV-O7 | move.go | <host> is served from <to>. Run carlos move offline finish --host <host> once <from> has cleaned up. | pending | |
| -| MV-O8 | move.go | Moving <host> back to <from>. | pending | |
| -| MV-O9 | move.go | The move could not finish a step: <reason>. Run carlos move offline status --host <host> for each item. | pending | |
| -| MV-O10 | move.go | Waiting for <box> to clean up <host>. | pending | |
| -| MV-O20 | internal/console/apiinstancemove_offline.go | offline moves are not available while host claims or Phase 1 moves are on | pending | |
| -| MV-O21 | internal/console/apiinstancemove_offline.go | <box> cannot take part in an offline move. it runs an older release or has host claims on | pending | |
| -| MV-O22 | internal/console/apiinstancemove_offline.go | <region> has <n> boxes. an offline move needs exactly one box in the region it moves to | pending | |
| -| MV-O23 | internal/console/apiinstancemove_offline.go | <box> does not hold this deployment's secrets key | pending | |
| -| MV-O24 | internal/console/apiinstancemove_offline.go | <host> has no offline move in flight | pending | |
| -| MV-O25 | internal/console/apiinstancemove_offline.go | this move is <state>. run carlos move offline status --host <host> to see what it waits for | pending | |
| -| MV-O26 | internal/console/apiinstancemove_offline.go | <host> keeps local data on more than one box: <boxes>. remove the stale copy first | pending | |
| -| MV-O27 | internal/console/apiinstancemove_offline.go | <host> is already served from <to>. move it back with a new move | pending | |
| -| MV-O28 | internal/console/apiinstancemove_offline.go | <box> keeps a sidecar file for <host>. instances with sidecars cannot move yet | pending | |
| -| MV-O29 | internal/console/apiinstancemove_offline.go | <host> has a host claim. offline moves are only for hosts without one | pending | |
| -| MV-O30 | internal/console/apiinstancemove_offline.go | <other> is moving offline. move one instance at a time | pending | |
| -| MV-O31 | internal/console/apiinstancemove_offline.go | <box> still runs a process for <host>. wait for it to stop, then flip | pending | |
| +| MV-O1 | move.go | <host> is offline from now until the move opens or is aborted. | approved | |
| +| MV-O2 | move.go | Every box in <from> has stopped <host>. Run carlos move offline seal --host <host> to copy it. | approved | |
| +| MV-O3 | move.go | Copying <host> to <to>. | approved | |
| +| MV-O4 | move.go | Copied and checked. Run carlos move offline flip --host <host> to start it in <to>. | approved | |
| +| MV-O5 | move.go | <to> holds everything <host> needs. Nothing is served yet. Run carlos move offline open --host <host> to serve it from <to>. | approved | |
| +| MV-O6 | move.go | <to> could not take <host>: <reason>. Run carlos move offline abort --host <host> to move it back. | approved | |
| +| MV-O7 | move.go | <host> is served from <to>. Run carlos move offline finish --host <host> once <from> has cleaned up. | approved | |
| +| MV-O8 | move.go | Moving <host> back to <from>. | approved | |
| +| MV-O9 | move.go | The move could not finish a step: <reason>. Run carlos move offline status --host <host> for each item. | approved | |
| +| MV-O10 | move.go | Waiting for <box> to clean up <host>. | approved | |
| +| MV-O20 | internal/console/apiinstancemove_offline.go | offline moves are not available while host claims or Phase 1 moves are on | approved | |
| +| MV-O21 | internal/console/apiinstancemove_offline.go | <box> cannot take part in an offline move. it runs an older release or has host claims on | approved | |
| +| MV-O22 | internal/console/apiinstancemove_offline.go | <region> has <n> boxes. an offline move needs exactly one box in the region it moves to | approved | |
| +| MV-O23 | internal/console/apiinstancemove_offline.go | <box> does not hold this deployment's secrets key | approved | |
| +| MV-O24 | internal/console/apiinstancemove_offline.go | <host> has no offline move in flight | approved | |
| +| MV-O25 | internal/console/apiinstancemove_offline.go | this move is <state>. run carlos move offline status --host <host> to see what it waits for | approved | |
| +| MV-O26 | internal/console/apiinstancemove_offline.go | <host> keeps local data on more than one box: <boxes>. remove the stale copy first | approved | |
| +| MV-O27 | internal/console/apiinstancemove_offline.go | <host> is already served from <to>. move it back with a new move | approved | |
| +| MV-O28 | internal/console/apiinstancemove_offline.go | <box> keeps a sidecar file for <host>. instances with sidecars cannot move yet | approved | |
| +| MV-O29 | internal/console/apiinstancemove_offline.go | <host> has a host claim. offline moves are only for hosts without one | approved | |
| +| MV-O30 | internal/console/apiinstancemove_offline.go | <other> is moving offline. move one instance at a time | approved | |
| +| MV-O31 | internal/console/apiinstancemove_offline.go | <box> still runs a process for <host>. wait for it to stop, then flip | approved | |
| |
| The docs page (`docs/site/cli.md`, under `### carlos move`) gets two paragraphs and one block of commands. The block is commands, not prose, and is not a row. The docsite gate reads it. |
| |
| | id | file | text | status | |
| |---|---|---|---| |
| -| MV-O32 | docs/site/cli.md | `carlos move offline` moves one instance with planned downtime, one step at a time. It is for operators, works with host claims and Phase 1 moves off, and never acts on its own: each verb does one step and says which verb comes next. | pending | |
| -| MV-O33 | docs/site/cli.md | The instance is offline from `start` until `open`. Until `open`, `abort` puts it back where it was with nothing lost. After `open`, moving it back is a new move. | pending | |
| +| MV-O32 | docs/site/cli.md | `carlos move offline` moves one instance with planned downtime, one step at a time. It is for operators, works with host claims and Phase 1 moves off, and never acts on its own: each verb does one step and says which verb comes next. | approved | |
| +| MV-O33 | docs/site/cli.md | The instance is offline from `start` until `open`. Until `open`, `abort` puts it back where it was with nothing lost. After `open`, moving it back is a new move. | approved | |
| |
| The offline transitions' refusals (fix round 1, review M4). A refusal that names no value is a whole sentence; the ones that name a value are one format. The no-move, same-region, malformed-start, replica and in-flight refusals reuse the existing rows (MV-N45, MV-N16, MV-N14, MV-N44, MV-N43). |
| |
| | id | file | text | status | |
| |---|---|---|---| |
| -| MV-O34 | internal/provision/offline_move.go | this is not an offline move | pending | |
| -| MV-O35 | internal/provision/offline_move.go | the record carries a different offline move | pending | |
| -| MV-O36 | internal/provision/offline_move.go | this offline move is <state>. this step follows <state> | pending | |
| -| MV-O37 | internal/provision/offline_move.go | a seal names the box that seals and the boxes that stopped the instance. the box that seals is one of them | pending | |
| -| MV-O38 | internal/provision/offline_move.go | this offline move is sealed by <box> | pending | |
| -| MV-O39 | internal/provision/offline_move.go | the record's region is <region>, which this step does not expect. the instance changed under the move | pending | |
| -| MV-O40 | internal/provision/offline_move.go | this offline move is <state>. it cannot be aborted once it is open | pending | |
| -| MV-O41 | internal/provision/offline_move.go | this offline move is <state>. it finishes from finishing or reverting | pending | |
| -| MV-O42 | internal/provision/offline_move.go | this is an offline move. use carlos move offline | pending | |
| -| MV-O43 | internal/provision/offline_move.go | the instance is in <region>, not <from> | pending | |
| +| MV-O34 | internal/provision/offline_move.go | this is not an offline move | approved | |
| +| MV-O35 | internal/provision/offline_move.go | the record carries a different offline move | approved | |
| +| MV-O36 | internal/provision/offline_move.go | this offline move is <state>. this step follows <state> | approved | |
| +| MV-O37 | internal/provision/offline_move.go | a seal names the box that seals and the boxes that stopped the instance. the box that seals is one of them | approved | |
| +| MV-O38 | internal/provision/offline_move.go | this offline move is sealed by <box> | approved | |
| +| MV-O39 | internal/provision/offline_move.go | the record's region is <region>, which this step does not expect. the instance changed under the move | approved | |
| +| MV-O40 | internal/provision/offline_move.go | this offline move is <state>. it cannot be aborted once it is open | approved | |
| +| MV-O41 | internal/provision/offline_move.go | this offline move is <state>. it finishes from finishing or reverting | approved | |
| +| MV-O42 | internal/provision/offline_move.go | this is an offline move. use carlos move offline | approved | |
| +| MV-O43 | internal/provision/offline_move.go | the instance is in <region>, not <from> | approved | |
| |
| Two more refusals of the console doors (Task 6), for cases MV-O20 to MV-O31 do not cover: the start door's class rail for a steered or unit-backed instance, and its rule that the region the instance moves to must not already list the host. |
| |
| | id | file | text | status | |
| |---|---|---|---| |
| -| MV-O50 | internal/console/apiinstancemove_offline.go | <host> is steered or runs under a unit. offline moves cannot carry either yet | pending | |
| -| MV-O51 | internal/console/apiinstancemove_offline.go | <box> already serves <host>. an offline move needs the region it moves to to be empty of it | pending | |
| +| MV-O50 | internal/console/apiinstancemove_offline.go | <host> is steered or runs under a unit. offline moves cannot carry either yet | approved | |
| +| MV-O51 | internal/console/apiinstancemove_offline.go | <box> already serves <host>. an offline move needs the region it moves to to be empty of it | approved | |
| |
| Seven more lines of `carlos move offline` (`move.go`, Task 7), for places MV-O1 to MV-O10 do not reach: what `abort` says once every box has put the instance back (the plan's runbook has the operator run `finish` next, and no row said so), the lines `status` prints for each box and for each manifest item (`<status>` is ok, waiting, failed or unchecked; `<detail>` and `<phase>` are box diagnostics, not copy; an item with no detail uses the shorter line), the usage line, and the line `status` prints for a path a source box could not park and left where it was (MV-O58; `<reason>` is the box's own reason, not copy). A box whose report is not current says so: `flip` and `open` refuse on a stale report, so `status` has to show it. MV-O56 follows MV-O57 in the table only by number. |
| |
| | id | file | text | status | |
| |---|---|---|---| |
| -| MV-O52 | move.go | Every box has put <host> back in <from>. Run carlos move offline finish --host <host> to end the move. | pending | |
| -| MV-O53 | move.go | <box> is <phase> as the <role>. | pending | |
| -| MV-O54 | move.go | <box> is <phase> as the <role>. Its report is not current. | pending | |
| -| MV-O55 | move.go | Item <id> is <status>: <detail>. | pending | |
| -| MV-O57 | move.go | Item <id> is <status>. | pending | |
| -| MV-O56 | move.go | carlos move offline needs start, seal, flip, open, finish, abort or status. | pending | |
| -| MV-O58 | move.go | <box> left <path> in place: <reason>. | pending | |
| -| MV-O65 | move.go | <box> could not clean up <host>: <reason>. Run carlos move offline status --host <host> for each item. | pending | |
| +| MV-O52 | move.go | Every box has put <host> back in <from>. Run carlos move offline finish --host <host> to end the move. | approved | |
| +| MV-O53 | move.go | <box> is <phase> as the <role>. | approved | |
| +| MV-O54 | move.go | <box> is <phase> as the <role>. Its report is not current. | approved | |
| +| MV-O55 | move.go | Item <id> is <status>: <detail>. | approved | |
| +| MV-O57 | move.go | Item <id> is <status>. | approved | |
| +| MV-O56 | move.go | carlos move offline needs start, seal, flip, open, finish, abort or status. | approved | |
| +| MV-O58 | move.go | <box> left <path> in place: <reason>. | approved | |
| +| MV-O65 | move.go | <box> could not clean up <host>: <reason>. Run carlos move offline status --host <host> for each item. | approved | |
| |
| The source box's reasons for a path it left in place (`internal/host/movesoffline.go`, `retire`), which `carlos move offline status` shows as MV-O58's `<reason>`. They are human text the box writes into its parked report. The two that end in the box's own OS error (`<error>`, a diagnostic, not copy) are recorded for their fixed beginning. |
| |
| | id | file | text | status | |
| |---|---|---|---| |
| -| MV-O59 | internal/host/movesoffline.go | root-owned: listed for the census, not renamed | pending | |
| -| MV-O60 | internal/host/movesoffline.go | the mount view of the instance directory: it stays, empty | pending | |
| -| MV-O61 | internal/host/movesoffline.go | the instance directory stays, empty | pending | |
| -| MV-O62 | internal/host/movesoffline.go | not renamed yet: the stop could not be confirmed this pass | pending | |
| -| MV-O63 | internal/host/movesoffline.go | cannot be renamed: <error> | pending | |
| -| MV-O64 | internal/host/movesoffline.go | not renamed yet: <error> | pending | |
| +| MV-O59 | internal/host/movesoffline.go | root-owned: listed for the census, not renamed | approved | |
| +| MV-O60 | internal/host/movesoffline.go | the mount view of the instance directory: it stays, empty | approved | |
| +| MV-O61 | internal/host/movesoffline.go | the instance directory stays, empty | approved | |
| +| MV-O62 | internal/host/movesoffline.go | not renamed yet: the stop could not be confirmed this pass | approved | |
| +| MV-O63 | internal/host/movesoffline.go | cannot be renamed: <error> | approved | |
| +| MV-O64 | internal/host/movesoffline.go | not renamed yet: <error> | approved | |
| |
| The sealer's lost-stop page (`internal/host/movesoffline_seal.go`, Task 4 fix round 1, review I2 and M2). After the seal the stop is kept, never taken again; when it no longer holds, the sealer pages an operator once per move. The body splits by state: before `open`, `abort` puts the instance back with nothing lost; from `open` on, `abort` is refused (MV-O40) and the move is fixed forward by hand. `<state>` is the record's offline state (`offline-sealed`, `offline-open` and so on). `<cause>` is one of the two causes below, and the failed item's reason (MV-O71) carries the same cause. `<lease>` is one of the four lease states MV-O72 to MV-O75; `<owner>` is a lease owner (`moved:<id>` or a box's lease id) and `<time>` an RFC 3339 time. |
| |
| | id | file | text | status | |
| |---|---|---|---| |
| -| MV-O66 | internal/host/movesoffline_seal.go | offline move of <host> lost its stop | pending | |
| -| MV-O67 | internal/host/movesoffline_seal.go | The offline move <id> of <host> is <state>, and its stop no longer holds: <cause>. The move cannot go on. Read carlos move offline status --host <host> and abort the move. | pending | |
| -| MV-O68 | internal/host/movesoffline_seal.go | The offline move <id> of <host> is <state>, and its stop no longer holds: <cause>. It cannot be aborted once it is open. Read carlos move offline status --host <host> and follow the offline move runbook. | pending | |
| -| MV-O69 | internal/host/movesoffline_seal.go | the source's lease is <lease>, not this move's tombstone | pending | |
| -| MV-O70 | internal/host/movesoffline_seal.go | <box> reports TXID <n>, past the sealed position <final> | pending | |
| -| MV-O71 | internal/host/movesoffline_seal.go | lost stop: <cause> | pending | |
| -| MV-O72 | internal/host/movesoffline_seal.go | absent | pending | |
| -| MV-O73 | internal/host/movesoffline_seal.go | lifted (<owner>) | pending | |
| -| MV-O74 | internal/host/movesoffline_seal.go | expired (<owner> at <time>) | pending | |
| -| MV-O75 | internal/host/movesoffline_seal.go | held by <owner> until <time> | pending | |
| +| MV-O66 | internal/host/movesoffline_seal.go | offline move of <host> lost its stop | approved | |
| +| MV-O67 | internal/host/movesoffline_seal.go | The offline move <id> of <host> is <state>, and its stop no longer holds: <cause>. The move cannot go on. Read carlos move offline status --host <host> and abort the move. | approved | |
| +| MV-O68 | internal/host/movesoffline_seal.go | The offline move <id> of <host> is <state>, and its stop no longer holds: <cause>. It cannot be aborted once it is open. Read carlos move offline status --host <host> and follow the offline move runbook. | approved | |
| +| MV-O69 | internal/host/movesoffline_seal.go | the source's lease is <lease>, not this move's tombstone | approved | |
| +| MV-O70 | internal/host/movesoffline_seal.go | <box> reports TXID <n>, past the sealed position <final> | approved | |
| +| MV-O71 | internal/host/movesoffline_seal.go | lost stop: <cause> | approved | |
| +| MV-O72 | internal/host/movesoffline_seal.go | absent | approved | |
| +| MV-O73 | internal/host/movesoffline_seal.go | lifted (<owner>) | approved | |
| +| MV-O74 | internal/host/movesoffline_seal.go | expired (<owner> at <time>) | approved | |
| +| MV-O75 | internal/host/movesoffline_seal.go | held by <owner> until <time> | approved | |
| |
| The sealer's item reasons, which `carlos move offline status` shows as MV-O55's `<detail>`. The copy gate reads every Check reason, so each has a row. MV-O76 is the `files` refusal for an entry the app keeps beside its files directory (review I3): the move cannot carry it, and moving it into the files directory or removing it would lose the app's data, so the row offers neither and points to the runbook; `<paths>` are the entries' paths on the box. MV-O77 to MV-O84 are the other refusals. Two refusals carry an error's own text and are box diagnostics, not rows (`movesDiagnosticWrites`): the archive's own refusal (its sentinels are MV-N77 to MV-N81 and MV-N86) and a secrets key that does not decode. MV-O85 to MV-O98 are the reasons of the items that passed; `<rung>` is the replication rung, quoted. |
| |
| | id | file | text | status | |
| |---|---|---|---| |
| -| MV-O76 | internal/host/movesoffline_seal.go | <host> keeps <paths> beside its files directory, and this move can carry only the files directory. see the offline move runbook | pending | |
| -| MV-O77 | internal/host/movesoffline_seal.go | <box> keeps a sidecar file for <host> | pending | |
| -| MV-O78 | internal/host/movesoffline_seal.go | this box's local position <n> is past the replica's <replica> and there is no database at <path> to checkpoint | pending | |
| -| MV-O79 | internal/host/movesoffline_seal.go | the replica at <bucket>/<prefix> holds no database | pending | |
| -| MV-O80 | internal/host/movesoffline_seal.go | <box>'s local position <n> is past the replica's final position <final> | pending | |
| -| MV-O81 | internal/host/movesoffline_seal.go | this box has no exec backend to compose the launch environment | pending | |
| -| MV-O82 | internal/host/movesoffline_seal.go | this box holds no CARLOS_SECRETS_KEY to key the env report | pending | |
| -| MV-O83 | internal/host/movesoffline_seal.go | no build is live for <host> on this box | pending | |
| -| MV-O84 | internal/host/movesoffline_seal.go | this box holds no CARLOS_SECRETS_KEY to seal the archive under | pending | |
| -| MV-O85 | internal/host/movesoffline_seal.go | no source box keeps a sidecar file | pending | |
| -| MV-O86 | internal/host/movesoffline_seal.go | every source box is at or below TXID <final> | pending | |
| -| MV-O87 | internal/host/movesoffline_seal.go | <owner> holds <location>/lock.json | pending | |
| -| MV-O88 | internal/host/movesoffline_seal.go | the request record is in the build state the replica prefix carries | pending | |
| -| MV-O89 | internal/host/movesoffline_seal.go | this box keeps no request records; the build state travels as the replica prefix holds it | pending | |
| -| MV-O90 | internal/host/movesoffline_seal.go | <n> objects staged at <bucket>/<prefix>, newest TXID <final> | pending | |
| -| MV-O91 | internal/host/movesoffline_seal.go | <n> files, <bytes> bytes, sealed at <prefix><object> | pending | |
| -| MV-O92 | internal/host/movesoffline_seal.go | <n> active timers at <prefix><object> | pending | |
| -| MV-O93 | internal/host/movesoffline_seal.go | absent on the source, so none is carried | pending | |
| -| MV-O94 | internal/host/movesoffline_seal.go | carried in the archive | pending | |
| -| MV-O95 | internal/host/movesoffline_seal.go | launch environment digest <digest> | pending | |
| -| MV-O96 | internal/host/movesoffline_seal.go | live build <version> | pending | |
| -| MV-O97 | internal/host/movesoffline_seal.go | replication "<rung>" | pending | |
| -| MV-O98 | internal/host/movesoffline_seal.go | next due <unix time> | pending | |
| +| MV-O76 | internal/host/movesoffline_seal.go | <host> keeps <paths> beside its files directory, and this move can carry only the files directory. see the offline move runbook | approved | |
| +| MV-O77 | internal/host/movesoffline_seal.go | <box> keeps a sidecar file for <host> | approved | |
| +| MV-O78 | internal/host/movesoffline_seal.go | this box's local position <n> is past the replica's <replica> and there is no database at <path> to checkpoint | approved | |
| +| MV-O79 | internal/host/movesoffline_seal.go | the replica at <bucket>/<prefix> holds no database | approved | |
| +| MV-O80 | internal/host/movesoffline_seal.go | <box>'s local position <n> is past the replica's final position <final> | approved | |
| +| MV-O81 | internal/host/movesoffline_seal.go | this box has no exec backend to compose the launch environment | approved | |
| +| MV-O82 | internal/host/movesoffline_seal.go | this box holds no CARLOS_SECRETS_KEY to key the env report | approved | |
| +| MV-O83 | internal/host/movesoffline_seal.go | no build is live for <host> on this box | approved | |
| +| MV-O84 | internal/host/movesoffline_seal.go | this box holds no CARLOS_SECRETS_KEY to seal the archive under | approved | |
| +| MV-O85 | internal/host/movesoffline_seal.go | no source box keeps a sidecar file | approved | |
| +| MV-O86 | internal/host/movesoffline_seal.go | every source box is at or below TXID <final> | approved | |
| +| MV-O87 | internal/host/movesoffline_seal.go | <owner> holds <location>/lock.json | approved | |
| +| MV-O88 | internal/host/movesoffline_seal.go | the request record is in the build state the replica prefix carries | approved | |
| +| MV-O89 | internal/host/movesoffline_seal.go | this box keeps no request records; the build state travels as the replica prefix holds it | approved | |
| +| MV-O90 | internal/host/movesoffline_seal.go | <n> objects staged at <bucket>/<prefix>, newest TXID <final> | approved | |
| +| MV-O91 | internal/host/movesoffline_seal.go | <n> files, <bytes> bytes, sealed at <prefix><object> | approved | |
| +| MV-O92 | internal/host/movesoffline_seal.go | <n> active timers at <prefix><object> | approved | |
| +| MV-O93 | internal/host/movesoffline_seal.go | absent on the source, so none is carried | approved | |
| +| MV-O94 | internal/host/movesoffline_seal.go | carried in the archive | approved | |
| +| MV-O95 | internal/host/movesoffline_seal.go | launch environment digest <digest> | approved | |
| +| MV-O96 | internal/host/movesoffline_seal.go | live build <version> | approved | |
| +| MV-O97 | internal/host/movesoffline_seal.go | replication "<rung>" | approved | |
| +| MV-O98 | internal/host/movesoffline_seal.go | next due <unix time> | approved | |
| |
| The landing's item reasons (`internal/host/movesoffline_land.go`, Task 5 fix round 1), which `carlos move offline status` shows as MV-O55's `<detail>` for the target's items. The copy gate reads every Check reason, so each has a row. A reason never carries an error's text: the error behind a reason that waits or fails is the box's log line. `<names>` is the list of variables a failed env pin finds different, each as `<name> (<kind>)` from `moves.CompareEnv`, never a value. MV-O110 to MV-O177. MV-O177 is the `release` item's failure when the target box keeps a live link for the host that names another build than the sealed one (final review, return moves). |
| |
| | id | file | text | status | |
| |---|---|---|---| |
| -| MV-O110 | internal/host/movesoffline_land.go | a stale tombstone in the target's bucket could not be lifted | pending | |
| -| MV-O111 | internal/host/movesoffline_land.go | a writer holds the target's lock | pending | |
| -| MV-O112 | internal/host/movesoffline_land.go | after extraction the files are not the seal's | pending | |
| -| MV-O113 | internal/host/movesoffline_land.go | next due could not be set | pending | |
| -| MV-O114 | internal/host/movesoffline_land.go | next due reads back differently from the seal's | pending | |
| -| MV-O115 | internal/host/movesoffline_land.go | no registry on this box | pending | |
| -| MV-O116 | internal/host/movesoffline_land.go | no row yet: reconcile mints it held | pending | |
| -| MV-O117 | internal/host/movesoffline_land.go | the archive could not be extracted | pending | |
| -| MV-O118 | internal/host/movesoffline_land.go | the archive could not be read | pending | |
| -| MV-O119 | internal/host/movesoffline_land.go | the archive does not verify | pending | |
| -| MV-O120 | internal/host/movesoffline_land.go | the archive is not the one the seal names | pending | |
| -| MV-O121 | internal/host/movesoffline_land.go | the channel could not be resolved | pending | |
| -| MV-O122 | internal/host/movesoffline_land.go | the channel points at another build than the sealed one | pending | |
| -| MV-O123 | internal/host/movesoffline_land.go | the config ack could not be read | pending | |
| -| MV-O124 | internal/host/movesoffline_land.go | the config ack does not name this move and the rendered file | pending | |
| -| MV-O125 | internal/host/movesoffline_land.go | the config could not be rendered | pending | |
| -| MV-O126 | internal/host/movesoffline_land.go | the config file could not be read | pending | |
| -| MV-O127 | internal/host/movesoffline_land.go | the config file does not hold the rendered bytes | pending | |
| -| MV-O128 | internal/host/movesoffline_land.go | the config was rendered at another path | pending | |
| -| MV-O129 | internal/host/movesoffline_land.go | the env file could not be read | pending | |
| -| MV-O130 | internal/host/movesoffline_land.go | the env file is missing | pending | |
| -| MV-O131 | internal/host/movesoffline_land.go | the env file is not the source's | pending | |
| -| MV-O132 | internal/host/movesoffline_land.go | the env file the target held could not be parked | pending | |
| -| MV-O133 | internal/host/movesoffline_land.go | the files directory the target held could not be parked | pending | |
| -| MV-O134 | internal/host/movesoffline_land.go | the instance key is not the source's | pending | |
| -| MV-O135 | internal/host/movesoffline_land.go | the launch environment could not be composed | pending | |
| -| MV-O136 | internal/host/movesoffline_land.go | the launch environment differs from the source's | pending | |
| -| MV-O137 | internal/host/movesoffline_land.go | the launch environment differs from the source's in <names> | pending | |
| -| MV-O138 | internal/host/movesoffline_land.go | the record and the seal disagree on this item | pending | |
| -| MV-O139 | internal/host/movesoffline_land.go | the record carries no seal evidence | pending | |
| -| MV-O140 | internal/host/movesoffline_land.go | the replication rung could not be set | pending | |
| -| MV-O141 | internal/host/movesoffline_land.go | the replication rung reads back differently from the seal's | pending | |
| -| MV-O142 | internal/host/movesoffline_land.go | the row is held by another operation | pending | |
| -| MV-O143 | internal/host/movesoffline_land.go | the row is not held landing by this move yet | pending | |
| -| MV-O144 | internal/host/movesoffline_land.go | the row's paths are nested, and an offline move lands flat rows only | pending | |
| -| MV-O145 | internal/host/movesoffline_land.go | the seal could not be read | pending | |
| -| MV-O146 | internal/host/movesoffline_land.go | the seal does not decode | pending | |
| -| MV-O147 | internal/host/movesoffline_land.go | the seal is missing | pending | |
| -| MV-O148 | internal/host/movesoffline_land.go | the seal is not a valid seal of this move | pending | |
| -| MV-O149 | internal/host/movesoffline_land.go | the seal is not the one the record names | pending | |
| -| MV-O150 | internal/host/movesoffline_land.go | the seal staged nothing | pending | |
| -| MV-O151 | internal/host/movesoffline_land.go | the staged replica could not be listed | pending | |
| -| MV-O152 | internal/host/movesoffline_land.go | the staged replica could not be verified this pass | pending | |
| -| MV-O153 | internal/host/movesoffline_land.go | the staged replica does not end at the sealed position | pending | |
| -| MV-O154 | internal/host/movesoffline_land.go | the staged replica does not restore clean | pending | |
| -| MV-O155 | internal/host/movesoffline_land.go | the staged replica is not the one the seal staged | pending | |
| -| MV-O156 | internal/host/movesoffline_land.go | the target's lock could not be read | pending | |
| -| MV-O157 | internal/host/movesoffline_land.go | the target's lock is still held after the lift | pending | |
| -| MV-O158 | internal/host/movesoffline_land.go | the target's lock is this move's own tombstone | pending | |
| -| MV-O159 | internal/host/movesoffline_land.go | the timers could not be read | pending | |
| -| MV-O160 | internal/host/movesoffline_land.go | the timers could not be replaced | pending | |
| -| MV-O161 | internal/host/movesoffline_land.go | the timers read back differently from the seal's | pending | |
| -| MV-O162 | internal/host/movesoffline_land.go | the timers snapshot could not be read | pending | |
| -| MV-O163 | internal/host/movesoffline_land.go | the timers snapshot is not the one the seal names | pending | |
| -| MV-O164 | internal/host/movesoffline_land.go | this box cannot resolve channels | pending | |
| -| MV-O165 | internal/host/movesoffline_land.go | this box has no exec backend to compose the launch environment | pending | |
| -| MV-O166 | internal/host/movesoffline_land.go | this box has no held render | pending | |
| -| MV-O167 | internal/host/movesoffline_land.go | this box holds no CARLOS_SECRETS_KEY to key the env report | pending | |
| -| MV-O168 | internal/host/movesoffline_land.go | this box holds no CARLOS_SECRETS_KEY to open the archive with | pending | |
| -| MV-O169 | internal/host/movesoffline_land.go | waits for the config item: the instance key is read from both files | pending | |
| -| MV-O170 | internal/host/movesoffline_land.go | waits for the files and config items | pending | |
| -| MV-O171 | internal/host/movesoffline_land.go | waits for the files item | pending | |
| -| MV-O172 | internal/host/movesoffline_land.go | a path the target held for the host could not be parked | pending | |
| -| MV-O173 | internal/host/movesoffline_land.go | a path the target held for the host is still there | pending | |
| -| MV-O174 | internal/host/movesoffline_land.go | not checked: the row is not held for this move | pending | |
| -| MV-O175 | internal/host/movesoffline_land.go | not checked: the seal could not be used | pending | |
| -| MV-O176 | internal/host/movesoffline_land.go | the row could not be read back | pending | |
| -| MV-O177 | internal/host/movesoffline_land.go | the target box still holds an older build of this instance. see the offline move runbook | pending | |
| +| MV-O110 | internal/host/movesoffline_land.go | a stale tombstone in the target's bucket could not be lifted | approved | |
| +| MV-O111 | internal/host/movesoffline_land.go | a writer holds the target's lock | approved | |
| +| MV-O112 | internal/host/movesoffline_land.go | after extraction the files are not the seal's | approved | |
| +| MV-O113 | internal/host/movesoffline_land.go | next due could not be set | approved | |
| +| MV-O114 | internal/host/movesoffline_land.go | next due reads back differently from the seal's | approved | |
| +| MV-O115 | internal/host/movesoffline_land.go | no registry on this box | approved | |
| +| MV-O116 | internal/host/movesoffline_land.go | no row yet: reconcile mints it held | approved | |
| +| MV-O117 | internal/host/movesoffline_land.go | the archive could not be extracted | approved | |
| +| MV-O118 | internal/host/movesoffline_land.go | the archive could not be read | approved | |
| +| MV-O119 | internal/host/movesoffline_land.go | the archive does not verify | approved | |
| +| MV-O120 | internal/host/movesoffline_land.go | the archive is not the one the seal names | approved | |
| +| MV-O121 | internal/host/movesoffline_land.go | the channel could not be resolved | approved | |
| +| MV-O122 | internal/host/movesoffline_land.go | the channel points at another build than the sealed one | approved | |
| +| MV-O123 | internal/host/movesoffline_land.go | the config ack could not be read | approved | |
| +| MV-O124 | internal/host/movesoffline_land.go | the config ack does not name this move and the rendered file | approved | |
| +| MV-O125 | internal/host/movesoffline_land.go | the config could not be rendered | approved | |
| +| MV-O126 | internal/host/movesoffline_land.go | the config file could not be read | approved | |
| +| MV-O127 | internal/host/movesoffline_land.go | the config file does not hold the rendered bytes | approved | |
| +| MV-O128 | internal/host/movesoffline_land.go | the config was rendered at another path | approved | |
| +| MV-O129 | internal/host/movesoffline_land.go | the env file could not be read | approved | |
| +| MV-O130 | internal/host/movesoffline_land.go | the env file is missing | approved | |
| +| MV-O131 | internal/host/movesoffline_land.go | the env file is not the source's | approved | |
| +| MV-O132 | internal/host/movesoffline_land.go | the env file the target held could not be parked | approved | |
| +| MV-O133 | internal/host/movesoffline_land.go | the files directory the target held could not be parked | approved | |
| +| MV-O134 | internal/host/movesoffline_land.go | the instance key is not the source's | approved | |
| +| MV-O135 | internal/host/movesoffline_land.go | the launch environment could not be composed | approved | |
| +| MV-O136 | internal/host/movesoffline_land.go | the launch environment differs from the source's | approved | |
| +| MV-O137 | internal/host/movesoffline_land.go | the launch environment differs from the source's in <names> | approved | |
| +| MV-O138 | internal/host/movesoffline_land.go | the record and the seal disagree on this item | approved | |
| +| MV-O139 | internal/host/movesoffline_land.go | the record carries no seal evidence | approved | |
| +| MV-O140 | internal/host/movesoffline_land.go | the replication rung could not be set | approved | |
| +| MV-O141 | internal/host/movesoffline_land.go | the replication rung reads back differently from the seal's | approved | |
| +| MV-O142 | internal/host/movesoffline_land.go | the row is held by another operation | approved | |
| +| MV-O143 | internal/host/movesoffline_land.go | the row is not held landing by this move yet | approved | |
| +| MV-O144 | internal/host/movesoffline_land.go | the row's paths are nested, and an offline move lands flat rows only | approved | |
| +| MV-O145 | internal/host/movesoffline_land.go | the seal could not be read | approved | |
| +| MV-O146 | internal/host/movesoffline_land.go | the seal does not decode | approved | |
| +| MV-O147 | internal/host/movesoffline_land.go | the seal is missing | approved | |
| +| MV-O148 | internal/host/movesoffline_land.go | the seal is not a valid seal of this move | approved | |
| +| MV-O149 | internal/host/movesoffline_land.go | the seal is not the one the record names | approved | |
| +| MV-O150 | internal/host/movesoffline_land.go | the seal staged nothing | approved | |
| +| MV-O151 | internal/host/movesoffline_land.go | the staged replica could not be listed | approved | |
| +| MV-O152 | internal/host/movesoffline_land.go | the staged replica could not be verified this pass | approved | |
| +| MV-O153 | internal/host/movesoffline_land.go | the staged replica does not end at the sealed position | approved | |
| +| MV-O154 | internal/host/movesoffline_land.go | the staged replica does not restore clean | approved | |
| +| MV-O155 | internal/host/movesoffline_land.go | the staged replica is not the one the seal staged | approved | |
| +| MV-O156 | internal/host/movesoffline_land.go | the target's lock could not be read | approved | |
| +| MV-O157 | internal/host/movesoffline_land.go | the target's lock is still held after the lift | approved | |
| +| MV-O158 | internal/host/movesoffline_land.go | the target's lock is this move's own tombstone | approved | |
| +| MV-O159 | internal/host/movesoffline_land.go | the timers could not be read | approved | |
| +| MV-O160 | internal/host/movesoffline_land.go | the timers could not be replaced | approved | |
| +| MV-O161 | internal/host/movesoffline_land.go | the timers read back differently from the seal's | approved | |
| +| MV-O162 | internal/host/movesoffline_land.go | the timers snapshot could not be read | approved | |
| +| MV-O163 | internal/host/movesoffline_land.go | the timers snapshot is not the one the seal names | approved | |
| +| MV-O164 | internal/host/movesoffline_land.go | this box cannot resolve channels | approved | |
| +| MV-O165 | internal/host/movesoffline_land.go | this box has no exec backend to compose the launch environment | approved | |
| +| MV-O166 | internal/host/movesoffline_land.go | this box has no held render | approved | |
| +| MV-O167 | internal/host/movesoffline_land.go | this box holds no CARLOS_SECRETS_KEY to key the env report | approved | |
| +| MV-O168 | internal/host/movesoffline_land.go | this box holds no CARLOS_SECRETS_KEY to open the archive with | approved | |
| +| MV-O169 | internal/host/movesoffline_land.go | waits for the config item: the instance key is read from both files | approved | |
| +| MV-O170 | internal/host/movesoffline_land.go | waits for the files and config items | approved | |
| +| MV-O171 | internal/host/movesoffline_land.go | waits for the files item | approved | |
| +| MV-O172 | internal/host/movesoffline_land.go | a path the target held for the host could not be parked | approved | |
| +| MV-O173 | internal/host/movesoffline_land.go | a path the target held for the host is still there | approved | |
| +| MV-O174 | internal/host/movesoffline_land.go | not checked: the row is not held for this move | approved | |
| +| MV-O175 | internal/host/movesoffline_land.go | not checked: the seal could not be used | approved | |
| +| MV-O176 | internal/host/movesoffline_land.go | the row could not be read back | approved | |
| +| MV-O177 | internal/host/movesoffline_land.go | the target box still holds an older build of this instance. see the offline move runbook | approved | |