Merge origin/main: instance provisioning meets the trash — a trashed app provisions nothing
Textual conflicts were both-sides-appended test sections (apicli_test.go, host_test.go); both sections kept whole. The semantic conflict was real: provision.Reconcile mints routes from bucket instance records, and domains.Reconcile drops a trashed app's routes every pass — merged untouched, the two loops would re-raise and drop the same routes forever. Resolution: an app in the trash provisions nothing. The record stays in recs so provision's removal phase never retires the route either — dropping a trashed app's routes stays domains.Reconcile's call alone, behind its production-flag guard. An unreadable marker declines minting too (the reversible direction); purge already deletes instance records with the rest of the app prefix, so post-purge the removal phase retires the routes on its own.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
CLAUDE.md+7 −1README.md+127 −3apimode.go+254 −11apimode_test.go+592 −10appconfig_cli.go+334 −41cli.go+780 −24cli_test.go+434 −0cmd/console/main.go+28 −1config_e2e_test.go+317 −0docs/superpowers/plans/2026-08-03-app-capabilities.md+902 −0docs/superpowers/plans/2026-08-04-config-console-api.md+382 −0docs/superpowers/plans/2026-08-04-instance-provisioning.md+661 −0docs/superpowers/plans/2026-08-04-pi-enablement.md+247 −0docs/superpowers/plans/2026-08-04-remote-host-agent.md+1261 −0docs/superpowers/specs/2026-08-03-app-capabilities-design.md+960 −0docs/superpowers/specs/2026-08-03-cli-console-api-design.md+2 −1docs/superpowers/specs/2026-08-04-config-console-api-design.md+266 −0docs/superpowers/specs/2026-08-04-instance-provisioning-design.md+374 −0docs/superpowers/specs/2026-08-04-remote-host-pi-design.md+267 −0e2e_test.go+151 −0go.mod+1 −1infra/remote-host.md+95 −0instances_cli.go+119 −0instances_cli_test.go+79 −0internal/activator/activator.go+30 −6internal/activator/activator_test.go+576 −6internal/activator/backend_exec.go+193 −17internal/activator/backend_unit.go+18 −5internal/activator/backend_unit_test.go+40 −2internal/appconfig/crypto.go+31 −0internal/appconfig/crypto_test.go+66 −0internal/appconfig/environments.go+12 −1internal/appconfig/generation.go+128 −0internal/appconfig/generation_test.go+252 −0internal/appconfig/store.go+21 −3internal/appconfig/sync.go+34 −0internal/appconfig/syncexec.go+43 −0internal/appconfig/syncexec_test.go+120 −0internal/caps/caps.go+436 −0internal/caps/caps_test.go+456 −0internal/caps/converge.go+1055 −0internal/caps/converge_test.go+1255 −0internal/caps/grants.go+214 −0internal/caps/grants_test.go+184 −0internal/caps/neutrality_test.go+141 −0internal/caps/render.go+187 −0internal/caps/render_test.go+353 −0internal/caps/testdata/console.service.conf+6 −0internal/caps/testdata/keymail.service.conf+14 −0internal/caps/testdata/keymail.socket.conf+3 −0internal/console/apicli.go+152 −15internal/console/apicli_test.go+366 −0internal/console/apiconfig.go+472 −0internal/console/apiconfig_test.go+904 −0internal/console/apiinstances.go+394 −0internal/console/apiinstances_seam_test.go+125 −0internal/console/apiinstances_test.go+718 −0internal/console/authcli.go+56 −4internal/console/authcli_test.go+38 −0internal/console/authstore.go+121 −6internal/console/authstore_test.go+216 −0internal/console/ladder.go+6 −0internal/console/ladder_test.go+83 −0internal/console/metricsview.go+13 −2internal/console/server.go+40 −1internal/console/server_test.go+134 −1internal/console/templates/app.html+4 −0internal/console/templates/cli_tokens.html+7 −5internal/console/templates/fleet.html+38 −0internal/console/templates/ladder.html+1 −0internal/console/view.go+137 −3internal/console/view_test.go+10 −1internal/edge/edge.go+158 −1internal/edge/tunnel.go+224 −0internal/edge/tunnel_e2e_test.go+218 −0internal/edge/tunnel_test.go+316 −0internal/host/adopt_advice.go+198 −0internal/host/adopt_advice_test.go+170 −0internal/host/agent.go+467 −19internal/host/agent_test.go+388 −0internal/host/bootstrap.go+62 −18internal/host/caps_pass.go+388 −0internal/host/caps_pass_test.go+845 −0internal/host/host_test.go+182 −2internal/host/probes.go+102 −0internal/host/tunnel_client.go+59 −0internal/host/tunnel_client_test.go+100 −0internal/host/units/carlos-adopt.path+20 −0internal/host/units/carlos-config-sync.service+46 −0internal/lease/lease.go+23 −2internal/lease/lease_test.go+95 −0internal/provision/provision.go+307 −0internal/provision/provision_test.go+337 −0internal/provision/reconcile.go+356 −0internal/provision/reconcile_test.go+604 −0internal/registry/registry.go+303 −18internal/registry/registry_test.go+571 −2internal/release/adopt.go+415 −29internal/release/adopt_test.go+1604 −0internal/release/golden_test.go+72 −0internal/release/release.go+42 −0internal/release/release_test.go+96 −0internal/release/versions.go+89 −0internal/release/versions_test.go+193 −0internal/status/assets/index.html+6 −0internal/status/contract_test.go+47 −9internal/status/dryrun.go+73 −8internal/status/fleet.go+62 −10internal/status/snapshot.go+108 −11internal/status/status_test.go+185 −0internal/tunnelclient/tunnelclient.go+267 −0internal/tunnelclient/tunnelclient_test.go+154 −0main.go+12 −0statuslive_test.go+127 −0
CLAUDE.mdLoading diff…
README.mdLoading diff…
apimode.goLoading diff…
apimode_test.goLoading diff…
appconfig_cli.goLoading diff…
cli.goLoading diff…
cli_test.goLoading diff…
cmd/console/main.goLoading diff…
config_e2e_test.goLoading diff…
docs/superpowers/plans/2026-08-03-app-capabilities.mdLoading diff…
docs/superpowers/plans/2026-08-04-config-console-api.mdLoading diff…
docs/superpowers/plans/2026-08-04-instance-provisioning.mdLoading diff…
docs/superpowers/plans/2026-08-04-pi-enablement.mdLoading diff…
docs/superpowers/plans/2026-08-04-remote-host-agent.mdLoading diff…
docs/superpowers/specs/2026-08-03-app-capabilities-design.mdLoading diff…
docs/superpowers/specs/2026-08-03-cli-console-api-design.mdLoading diff…
docs/superpowers/specs/2026-08-04-config-console-api-design.mdLoading diff…
docs/superpowers/specs/2026-08-04-instance-provisioning-design.mdLoading diff…
docs/superpowers/specs/2026-08-04-remote-host-pi-design.mdLoading diff…
e2e_test.goLoading diff…
go.modLoading diff…
infra/remote-host.mdLoading diff…
instances_cli.goLoading diff…
instances_cli_test.goLoading diff…
internal/activator/activator.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/appconfig/crypto.goLoading diff…
internal/appconfig/crypto_test.goLoading diff…
internal/appconfig/environments.goLoading diff…
internal/appconfig/generation.goLoading diff…
internal/appconfig/generation_test.goLoading diff…
internal/appconfig/store.goLoading diff…
internal/appconfig/sync.goLoading diff…
internal/appconfig/syncexec.goLoading diff…
internal/appconfig/syncexec_test.goLoading diff…
internal/caps/caps.goLoading diff…
internal/caps/caps_test.goLoading diff…
internal/caps/converge.goLoading diff…
internal/caps/converge_test.goLoading diff…
internal/caps/grants.goLoading diff…
internal/caps/grants_test.goLoading diff…
internal/caps/neutrality_test.goLoading diff…
internal/caps/render.goLoading diff…
internal/caps/render_test.goLoading diff…
internal/caps/testdata/console.service.confLoading diff…
internal/caps/testdata/keymail.service.confLoading diff…
internal/caps/testdata/keymail.socket.confLoading diff…
internal/console/apicli.goLoading diff…
internal/console/apicli_test.goLoading diff…
internal/console/apiconfig.goLoading diff…
internal/console/apiconfig_test.goLoading diff…
internal/console/apiinstances.goLoading diff…
internal/console/apiinstances_seam_test.goLoading diff…
internal/console/apiinstances_test.goLoading diff…
internal/console/authcli.goLoading diff…
internal/console/authcli_test.goLoading diff…
internal/console/authstore.goLoading diff…
internal/console/authstore_test.goLoading diff…
internal/console/ladder.goLoading diff…
internal/console/ladder_test.goLoading diff…
internal/console/metricsview.goLoading diff…
internal/console/server.goLoading diff…
internal/console/server_test.goLoading diff…
internal/console/templates/app.htmlLoading diff…
internal/console/templates/cli_tokens.htmlLoading diff…
internal/console/templates/fleet.htmlLoading diff…
internal/console/templates/ladder.htmlLoading diff…
internal/console/view.goLoading diff…
internal/console/view_test.goLoading diff…
internal/edge/edge.goLoading diff…
internal/edge/tunnel.goLoading diff…
internal/edge/tunnel_e2e_test.goLoading diff…
internal/edge/tunnel_test.goLoading diff…
internal/host/adopt_advice.goLoading diff…
internal/host/adopt_advice_test.goLoading diff…
internal/host/agent.goLoading diff…
internal/host/agent_test.goLoading diff…
internal/host/bootstrap.goLoading diff…
internal/host/caps_pass.goLoading diff…
internal/host/caps_pass_test.goLoading diff…
internal/host/host_test.goLoading diff…
internal/host/probes.goLoading diff…
internal/host/tunnel_client.goLoading diff…
internal/host/tunnel_client_test.goLoading diff…
internal/host/units/carlos-adopt.pathLoading diff…
internal/host/units/carlos-config-sync.serviceLoading diff…
internal/lease/lease.goLoading diff…
internal/lease/lease_test.goLoading diff…
internal/provision/provision.goLoading diff…
internal/provision/provision_test.goLoading diff…
internal/provision/reconcile.goLoading diff…
internal/provision/reconcile_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/golden_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/assets/index.htmlLoading diff…
internal/status/contract_test.goLoading diff…
internal/status/dryrun.goLoading diff…
internal/status/fleet.goLoading diff…
internal/status/snapshot.goLoading diff…
internal/status/status_test.goLoading diff…
internal/tunnelclient/tunnelclient.goLoading diff…
internal/tunnelclient/tunnelclient_test.goLoading diff…
main.goLoading diff…
statuslive_test.goLoading diff…