merge: multi-account — accounts as projects, memberships, account-scoped app identity
Console-minted durable account ids in the bucket (registry materializes, never assigns), owner/member memberships replacing per-app grants, account-scoped bucket keys behind a legacy read-fallback, Stripe-like switcher with MRU landing and keymail invites, and migration as a verb. Two adversarial review rounds found four real defects: accounts migrate would have copied stale legacy pointers and silently rolled production back; the console's activity feed leaked across accounts sharing an app name; the activator returned account sqids as versions for migrated tenants; and the bake clock was account-blind. All fixed with red-first tests. Lands inert: no accounts exist yet, every key is legacy, and the fallback carries the live fleet unchanged until the operator migrates.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
45 files changed,
+5399
−752
README.md+84 −6accounts.go+549 −0cli.go+34 −8cmd/console/main.go+77 −1cmd/console/main_test.go+106 −0e2e_test.go+586 −25internal/activator/activator_test.go+32 −0internal/activator/backend_exec.go+12 −11internal/activator/backend_unit.go+4 −11internal/activator/backend_unit_test.go+8 −0internal/console/account.go+101 −0internal/console/account_test.go+404 −0internal/console/keymail_test.go+18 −2internal/console/migrate_test.go+107 −0internal/console/server.go+473 −142internal/console/server_account_test.go+355 −0internal/console/server_test.go+161 −140internal/console/store.go+631 −12internal/console/store_test.go+4 −4internal/console/templates/app.html+17 −4internal/console/templates/apps.html+43 −5internal/console/templates/layout.html+20 −1internal/console/view.go+47 −16internal/console/view_test.go+13 −13internal/domains/reconcile.go+214 −112internal/domains/reconcile_test.go+122 −27internal/edge/static.go+20 −6internal/edge/static_test.go+5 −5internal/registry/registry.go+125 −24internal/registry/registry_test.go+180 −14internal/release/adopt.go+42 −19internal/release/adopt_test.go+116 −17internal/release/bake.go+42 −10internal/release/bake_test.go+101 −26internal/release/fallback.go+85 −0internal/release/fallback_test.go+190 −0internal/release/release.go+87 −24internal/release/release_test.go+34 −34internal/release/versions.go+39 −10internal/release/versions_test.go+6 −6internal/status/fleet.go+14 −4internal/status/status_test.go+67 −0internal/vet/vet.go+13 −5internal/vet/vet_test.go+7 −7main.go+4 −1
README.mdLoading diff…
accounts.goLoading diff…
cli.goLoading diff…
cmd/console/main.goLoading diff…
cmd/console/main_test.goLoading diff…
e2e_test.goLoading diff…
internal/activator/activator_test.goLoading diff…
internal/activator/backend_exec.goLoading diff…
internal/activator/backend_unit.goLoading diff…
internal/activator/backend_unit_test.goLoading diff…
internal/console/account.goLoading diff…
internal/console/account_test.goLoading diff…
internal/console/keymail_test.goLoading diff…
internal/console/migrate_test.goLoading diff…
internal/console/server.goLoading diff…
internal/console/server_account_test.goLoading diff…
internal/console/server_test.goLoading diff…
internal/console/store.goLoading diff…
internal/console/store_test.goLoading diff…
internal/console/templates/app.htmlLoading diff…
internal/console/templates/apps.htmlLoading diff…
internal/console/templates/layout.htmlLoading diff…
internal/console/view.goLoading diff…
internal/console/view_test.goLoading diff…
internal/domains/reconcile.goLoading diff…
internal/domains/reconcile_test.goLoading diff…
internal/edge/static.goLoading diff…
internal/edge/static_test.goLoading diff…
internal/registry/registry.goLoading diff…
internal/registry/registry_test.goLoading diff…
internal/release/adopt.goLoading diff…
internal/release/adopt_test.goLoading diff…
internal/release/bake.goLoading diff…
internal/release/bake_test.goLoading diff…
internal/release/fallback.goLoading diff…
internal/release/fallback_test.goLoading diff…
internal/release/release.goLoading diff…
internal/release/release_test.goLoading diff…
internal/release/versions.goLoading diff…
internal/release/versions_test.goLoading diff…
internal/status/fleet.goLoading diff…
internal/status/status_test.goLoading diff…
internal/vet/vet.goLoading diff…
internal/vet/vet_test.goLoading diff…
main.goLoading diff…