carlos / platform Public

moves offline copy: Luna's MV-O192 rewrite; MV-O190 to MV-O192 approved

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev 981294cf150fff21b89a70306ea6f0a4b32037f2 parent 0961440
3 files changed, +6 −6
  • docs/superpowers/plans/2026-10-06-moves-phase1-copy.md +4 −4
  • internal/console/apiinstancemove_offline.go +1 −1
  • internal/console/apiinstancemove_offline_stage_test.go +1 −1

CI cancelled — superseded by a newer push — run details

CI log
=== gate ===
cd launchctx && go vet ./... && go test ./... -count=1
ok  	amadan.net/carlos/platform.git/launchctx	0.011s
?   	amadan.net/carlos/platform.git/launchctx/controlname	[no test files]
?   	amadan.net/carlos/platform.git/launchctx/wireid	[no test files]
go vet ./...
gofmt -l .: clean
go test ./... -count=1 -timeout 30m

amadan: job cancelled — a newer push superseded it
diff --git a/docs/superpowers/plans/2026-10-06-moves-phase1-copy.md b/docs/superpowers/plans/2026-10-06-moves-phase1-copy.md
index 0d785b5b0..56eaba0c4 100644
--- a/docs/superpowers/plans/2026-10-06-moves-phase1-copy.md
+++ b/docs/superpowers/plans/2026-10-06-moves-phase1-copy.md
@@ -710,10 +710,10 @@ MV-O181 is the usage line with `stage` added. It replaces MV-O56, whose withdraw
| MV-O188 | move.go | The staged copy of <host> is removed. Run carlos move offline finish --host <host> to end the move. | approved |
| MV-O189 | docs/site/cli.md | `stage` is optional and comes before `start`. It copies the instance's data to the region it moves to while the instance keeps serving, and each time it runs it copies only what is new. The more it has copied, the less is left to copy while the instance is offline. Until `start`, `abort` removes the staged copy and the instance is never offline. | approved |
-Three more console door refusals for a staged move (`internal/console/apiinstancemove_offline.go`, Astra round 2), pending Luna's review. MV-O190 is what `start` and `seal` answer when the box that staged the instance (the stager, pinned on the record at the stage) no longer publishes an edges file in the source region: its absence is not proof that it stopped copying, so the step waits for it or the operator aborts. `<box>` is the stager, `<from>` the source region's name. MV-O191 is the stage door's refusal of a target whose data bucket is a source box's own, where a staged copy would replace the serving replica. MV-O192 is what `stage`, `start` and `seal` answer once the target publishes another data bucket or region than the one the stage fixed on the record: the staged copy is in the stored bucket and is never followed elsewhere.
+Three more console door refusals for a staged move (`internal/console/apiinstancemove_offline.go`, Astra round 2), approved by Luna 2026-10-21 (MV-O192 as Luna rewrote it). MV-O190 is what `start` and `seal` answer when the box that staged the instance (the stager, pinned on the record at the stage) no longer publishes an edges file in the source region: its absence is not proof that it stopped copying, so the step waits for it or the operator aborts. `<box>` is the stager, `<from>` the source region's name. MV-O191 is the stage door's refusal of a target whose data bucket is a source box's own, where a staged copy would replace the serving replica. MV-O192 is what `stage`, `start` and `seal` answer once the target publishes another data bucket or region than the one the stage fixed on the record: the staged copy is in the stored bucket and is never followed elsewhere.
| id | file | text | status |
|---|---|---|---|
-| MV-O190 | internal/console/apiinstancemove_offline.go | <box>, which staged <host>, no longer publishes an edges file in <from>. bring it back or abort the move | pending |
-| MV-O191 | internal/console/apiinstancemove_offline.go | <to> publishes the same data bucket as <from>. a staged copy there would replace the serving one | pending |
-| MV-O192 | internal/console/apiinstancemove_offline.go | <to> now publishes a different data bucket than the one <host> was staged in. abort the move and stage it again | pending |
+| MV-O190 | internal/console/apiinstancemove_offline.go | <box>, which staged <host>, no longer publishes an edges file in <from>. bring it back or abort the move | approved |
+| MV-O191 | internal/console/apiinstancemove_offline.go | <to> publishes the same data bucket as <from>. a staged copy there would replace the serving one | approved |
+| MV-O192 | internal/console/apiinstancemove_offline.go | <to> now publishes a different data bucket or region from what was recorded when <host> was staged. abort the move and stage it again | approved |
diff --git a/internal/console/apiinstancemove_offline.go b/internal/console/apiinstancemove_offline.go
index b8097a663..dc51ef24d 100644
--- a/internal/console/apiinstancemove_offline.go
+++ b/internal/console/apiinstancemove_offline.go
@@ -585,7 +585,7 @@ func (s *Server) offlineStageCoords(f offlineFleet, mv *provision.MoveState, hos
}
tgt := f.boxesAt(mv.To)
if len(tgt) != 1 || tgt[0].DataBucket != mv.StageBucket || tgt[0].DataBucketRegion != mv.StageRegion {
- return &offlineRefusal{status: http.StatusConflict, msg: fmt.Sprintf("%s now publishes a different data bucket than the one %s was staged in. abort the move and stage it again", s.offlineName(mv.To), host)}
+ return &offlineRefusal{status: http.StatusConflict, msg: fmt.Sprintf("%s now publishes a different data bucket or region from what was recorded when %s was staged. abort the move and stage it again", s.offlineName(mv.To), host)}
}
return nil
}
diff --git a/internal/console/apiinstancemove_offline_stage_test.go b/internal/console/apiinstancemove_offline_stage_test.go
index b598a9cfb..a22255413 100644
--- a/internal/console/apiinstancemove_offline_stage_test.go
+++ b/internal/console/apiinstancemove_offline_stage_test.go
@@ -218,7 +218,7 @@ func msgO190(box string) string {
const (
msgO191 = "uk publishes the same data bucket as ie. a staged copy there would replace the serving one"
- msgO192 = "uk now publishes a different data bucket than the one " + offlineHost + " was staged in. abort the move and stage it again"
+ msgO192 = "uk now publishes a different data bucket or region from what was recorded when " + offlineHost + " was staged. abort the move and stage it again"
)
// unpublish removes a box from the fleet's evidence, its edges file and