carlos / platform Public

docs: the migration is three commands, and the third is the console's

README's accounts section now shows carlos accounts migrate followed by
console migrate-app, and says why there is a second half: console state is the
console's authority, so the carlos binary never opens its database.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Paul Campbell b6feaf396b2417ce552bf7111542d3d4ab6bac88 parent ede325e
1 file changed, +12 −6
  • README.md +12 −6
diff --git a/README.md b/README.md
index f5477d69a..d31ca528a 100644
--- a/README.md
+++ b/README.md
@@ -86,12 +86,18 @@ Moving an app is a verb:
carlos accounts migrate -app kass -to <sqid> -dry-run # prints the plan
carlos accounts migrate -app kass -to <sqid>
-
-It copies the objects and re-stamps the app's routes. **It never deletes a
-legacy object.** Deleting them — and removing the fallback code — is a
-separate operator step, gated on verification: every channel pointer must
-resolve from the qualified keys with the fallback disabled, and one adopt pass
-must be a no-op, first.
+ console migrate-app -app kass -to <sqid> # on the console's box
+
+It copies the objects and re-stamps the app's routes. The console keeps its
+own app→account row — console state is the console's authority, and the
+carlos binary deliberately never opens its database — so `console
+migrate-app` completes the move; `carlos accounts migrate` prints that exact
+command when it finishes. Both halves are idempotent.
+
+**It never deletes a legacy object.** Deleting them — and removing the
+fallback code — is a separate operator step, gated on verification: every
+channel pointer must resolve from the qualified keys with the fallback
+disabled, and one adopt pass must be a no-op, first.
## Domains