merge: main into cli-app-create — shared apps dispatch, instances limiter, trash-door resolver
The two sides of the case-"apps" bargain meet: main's delete/restore keep their file and this branch's create joins their dispatch. apiAccountAppBy (main's trash-door resolver split) now composes with this branch's apiAccount split — account resolution in one place, the has-gate the only variable. Both rate-limiter families (instances, create) coexist.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
CLAUDE.md+13 −5README.md+127 −3apimode.go+326 −11apimode_test.go+592 −10appconfig_cli.go+334 −41apps.go+308 −18apps_test.go+370 −0auth.go+132 −22auth_e2e_test.go+42 −12auth_test.go+9 −10cli.go+780 −24cli_test.go+434 −0cmd/console/main.go+28 −1config.go+161 −0config_e2e_test.go+317 −0config_test.go+327 −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-console-default-resolution.md+939 −0docs/superpowers/plans/2026-08-04-deletion-policy.md+697 −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/plans/2026-08-05-wildcard-certs.md+2073 −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-console-default-resolution-design.md+162 −0docs/superpowers/specs/2026-08-04-deletion-policy-design.md+321 −0docs/superpowers/specs/2026-08-04-instance-provisioning-design.md+374 −0docs/superpowers/specs/2026-08-04-remote-host-pi-design.md+267 −0docs/superpowers/specs/2026-08-05-wildcard-certs-design.md+172 −0e2e_test.go+249 −21go.mod+2 −1go.sum+2 −0infra/dev/region-pi.md+64 −0infra/modules/README.md+19 −0infra/modules/region-host/main.tf+42 −0infra/modules/region-host/variables.tf+10 −0infra/modules/region-remote-host/README.md+34 −0infra/modules/region-remote-host/main.tf+102 −0infra/modules/region-remote-host/outputs.tf+6 −0infra/modules/region-remote-host/variables.tf+14 −0infra/remote-host.md+99 −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+353 −17internal/console/apicli_test.go+767 −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+62 −4internal/console/authcli_test.go+38 −0internal/console/authstore.go+121 −6internal/console/authstore_test.go+216 −0internal/console/deletion_test.go+306 −0internal/console/ladder.go+6 −0internal/console/ladder_test.go+83 −0internal/console/materialize.go+221 −16internal/console/materialize_test.go+311 −0internal/console/metricsview.go+13 −2internal/console/ownership.go+232 −3internal/console/server.go+57 −1internal/console/server_test.go+134 −1internal/console/store.go+218 −9internal/console/store_test.go+239 −0internal/console/templates/app.html+4 −0internal/console/templates/apps.html+2 −0internal/console/templates/cli_tokens.html+7 −5internal/console/templates/fleet.html+38 −0internal/console/templates/ladder.html+1 −0internal/console/templates/trash.html+54 −0internal/console/view.go+183 −3internal/console/view_test.go+10 −1internal/domains/reconcile.go+168 −4internal/domains/reconcile_internal_test.go+114 −0internal/domains/reconcile_test.go+443 −0internal/edge/dns.go+268 −0internal/edge/dns_test.go+178 −0internal/edge/edge.go+209 −7internal/edge/route53dns.go+182 −0internal/edge/route53dns_test.go+124 −0internal/edge/tunnel.go+224 −0internal/edge/tunnel_e2e_test.go+218 −0internal/edge/tunnel_test.go+316 −0internal/edge/wildcard.go+570 −0internal/edge/wildcard_test.go+420 −0internal/host/adopt_advice.go+198 −0internal/host/adopt_advice_test.go+170 −0internal/host/agent.go+509 −23internal/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+254 −7internal/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/production.go+14 −0internal/release/production_test.go+64 −0internal/release/release.go+42 −0internal/release/release_test.go+96 −0internal/release/trash.go+165 −0internal/release/trash_test.go+347 −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+23 −3scopedkeys_e2e_test.go+20 −8scripts/seed-pi-demo.sh+54 −0statuslive_test.go+127 −0
CLAUDE.mdLoading diff…
README.mdLoading diff…
apimode.goLoading diff…
apimode_test.goLoading diff…
appconfig_cli.goLoading diff…
apps.goLoading diff…
apps_test.goLoading diff…
auth.goLoading diff…
auth_e2e_test.goLoading diff…
auth_test.goLoading diff…
cli.goLoading diff…
cli_test.goLoading diff…
cmd/console/main.goLoading diff…
config.goLoading diff…
config_e2e_test.goLoading diff…
config_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-console-default-resolution.mdLoading diff…
docs/superpowers/plans/2026-08-04-deletion-policy.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/plans/2026-08-05-wildcard-certs.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-console-default-resolution-design.mdLoading diff…
docs/superpowers/specs/2026-08-04-deletion-policy-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…
docs/superpowers/specs/2026-08-05-wildcard-certs-design.mdLoading diff…
e2e_test.goLoading diff…
go.modLoading diff…
go.sumLoading diff…
infra/dev/region-pi.mdLoading diff…
infra/modules/README.mdLoading diff…
infra/modules/region-host/main.tfLoading diff…
infra/modules/region-host/variables.tfLoading diff…
infra/modules/region-remote-host/README.mdLoading diff…
infra/modules/region-remote-host/main.tfLoading diff…
infra/modules/region-remote-host/outputs.tfLoading diff…
infra/modules/region-remote-host/variables.tfLoading 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/deletion_test.goLoading diff…
internal/console/ladder.goLoading diff…
internal/console/ladder_test.goLoading diff…
internal/console/materialize.goLoading diff…
internal/console/materialize_test.goLoading diff…
internal/console/metricsview.goLoading diff…
internal/console/ownership.goLoading diff…
internal/console/server.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/cli_tokens.htmlLoading diff…
internal/console/templates/fleet.htmlLoading diff…
internal/console/templates/ladder.htmlLoading diff…
internal/console/templates/trash.htmlLoading diff…
internal/console/view.goLoading diff…
internal/console/view_test.goLoading diff…
internal/domains/reconcile.goLoading diff…
internal/domains/reconcile_internal_test.goLoading diff…
internal/domains/reconcile_test.goLoading diff…
internal/edge/dns.goLoading diff…
internal/edge/dns_test.goLoading diff…
internal/edge/edge.goLoading diff…
internal/edge/route53dns.goLoading diff…
internal/edge/route53dns_test.goLoading diff…
internal/edge/tunnel.goLoading diff…
internal/edge/tunnel_e2e_test.goLoading diff…
internal/edge/tunnel_test.goLoading diff…
internal/edge/wildcard.goLoading diff…
internal/edge/wildcard_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/production.goLoading diff…
internal/release/production_test.goLoading diff…
internal/release/release.goLoading diff…
internal/release/release_test.goLoading diff…
internal/release/trash.goLoading diff…
internal/release/trash_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…
scopedkeys_e2e_test.goLoading diff…
scripts/seed-pi-demo.shLoading diff…
statuslive_test.goLoading diff…