Merge origin/main into console-as-an-app (40 commits, domains fold + bake ratchet)
One conflict, in internal/host/agent.go, and both sides were wanted.
main (ec3767c, c567b1d) made the domains work fleet-aware: the edge set is
folded per pass from every live box's published edges file rather than read
once from PLATFORM_EDGE_IPS at boot, and ReconcileAliases now takes a
DeploymentRoutes set so a claim cannot capture a hostname another box already
serves as a route. Both call sites in the fast-converge full pass and
instancesLoop grew an edgesfile fold.
This branch had rewritten the same function's tail: fastDeps is built in two
phases (empty struct first, so observeRestart can wrap the restart dispatch
around a `d` that exists), which turned main's single fastDeps{...} struct
literal into a run of field assignments. That is the whole of the conflict —
the two changes are textually adjacent and semantically independent.
Resolved by keeping this branch's two-phase construction and lifting main's
per-pass fold into it: d.fullPass now folds edgesfile.DeploymentRoutes and
hands it to ReconcileAliases, with main's comment on why it is uncached. The
domainsLoop and instancesLoop halves of main's change auto-merged untouched.
All five pieces of the restart-recovery work verified intact after the merge:
makeStartRoute's two refusals (no Unit, and the structural Hibernate guard),
systemctlStartUnit's start-not-try-restart, observeRestart never suppressing
a restart, the restartHold backoff with fullPass deliberately ungated, and
fastPassOpts' fourth parameter. internal/release/adopt.go carries both sides
too: our rolledBack gating and startUnit call, and main's bake ratchet and
pipeline-evidence changes (bake.go is byte-identical to main).
Gate: go vet clean, gofmt -l . clean, 34 ok. The three failing packages
(root, internal/edge, internal/activator) fail identically on clean
origin/main in a throwaway worktree — issue #326's walkConfig cwd-climb plus
a unix-socket sun_path length limit that trips the long-named activator
tests. All five cross-compile targets build.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
apimode.go+28 −0deploy.go+88 −2deploy_test.go+40 −0docs/superpowers/specs/2026-08-19-fleet-architecture-diagram-design.md+27 −13docs/superpowers/specs/2026-08-27-managed-custom-domains-design.md+703 −0domains_cli.go+69 −2domains_cli_test.go+64 −1domains_e2e_test.go+5 −2e2e_test.go+1 −1internal/console/apicli_test.go+36 −0internal/console/apidomains.go+140 −11internal/console/apidomains_test.go+291 −0internal/console/apimail.go+7 −1internal/console/appdomains_test.go+83 −0internal/console/archgraph.go+50 −13internal/console/archgraph_test.go+28 −30internal/console/archlayout.go+102 −15internal/console/archlayout_test.go+17 −19internal/console/archlegibility_test.go+149 −0internal/console/domainattach.go+25 −1internal/console/domainstate.go+206 −0internal/console/domainstate_test.go+210 −0internal/console/edgefold_test.go+119 −0internal/console/mailcounts.go+9 −2internal/console/pending.go+52 −3internal/console/pending_test.go+69 −0internal/console/pendingflow_test.go+286 −0internal/console/pendinghandlers.go+180 −20internal/console/pipelinepage.go+14 −2internal/console/pipelinepage_test.go+114 −4internal/console/server.go+117 −3internal/console/server_test.go+7 −1internal/console/sesevents.go+72 −0internal/console/sesevents_test.go+108 −0internal/console/store.go+9 −0internal/console/templates/app_releases.html+48 −13internal/console/templates/layout.html+5 −0internal/console/view.go+42 −5internal/domains/aliases.go+34 −1internal/domains/aliases_test.go+155 −16internal/domains/reconcile.go+162 −82internal/domains/reconcile_internal_test.go+106 −4internal/domains/reconcile_test.go+107 −13internal/edge/certwarm.go+376 −0internal/edge/certwarm_test.go+269 −0internal/edge/edge.go+39 −0internal/edge/homemap.go+32 −0internal/edgesfile/edgesfile.go+89 −0internal/edgesfile/edgesfile_test.go+49 −0internal/edgesfile/fold.go+181 −0internal/edgesfile/fold_test.go+316 −0internal/host/agent.go+67 −21internal/host/edgesfile_test.go+40 −0internal/host/host_test.go+37 −19internal/mail/aws.go+1 −0internal/mail/memprovisioner.go+10 −1internal/mail/provisioner.go+11 −0internal/mail/walk.go+137 −4internal/mail/walk_enable_test.go+88 −4internal/mail/walk_verify_test.go+113 −8internal/release/adopt.go+85 −23internal/release/adopt_test.go+378 −0internal/release/bake.go+141 −7internal/release/bake_test.go+90 −5internal/release/pipeline_test.go+80 −0internal/release/release.go+23 −7internal/status/snapshot.go+37 −10internal/status/status_test.go+49 −0mail_cli.go+7 −5
apimode.goLoading diff…
deploy.goLoading diff…
deploy_test.goLoading diff…
docs/superpowers/specs/2026-08-19-fleet-architecture-diagram-design.mdLoading diff…
docs/superpowers/specs/2026-08-27-managed-custom-domains-design.mdLoading diff…
domains_cli.goLoading diff…
domains_cli_test.goLoading diff…
domains_e2e_test.goLoading diff…
e2e_test.goLoading diff…
internal/console/apicli_test.goLoading diff…
internal/console/apidomains.goLoading diff…
internal/console/apidomains_test.goLoading diff…
internal/console/apimail.goLoading diff…
internal/console/appdomains_test.goLoading diff…
internal/console/archgraph.goLoading diff…
internal/console/archgraph_test.goLoading diff…
internal/console/archlayout.goLoading diff…
internal/console/archlayout_test.goLoading diff…
internal/console/archlegibility_test.goLoading diff…
internal/console/domainattach.goLoading diff…
internal/console/domainstate.goLoading diff…
internal/console/domainstate_test.goLoading diff…
internal/console/edgefold_test.goLoading diff…
internal/console/mailcounts.goLoading diff…
internal/console/pending.goLoading diff…
internal/console/pending_test.goLoading diff…
internal/console/pendingflow_test.goLoading diff…
internal/console/pendinghandlers.goLoading diff…
internal/console/pipelinepage.goLoading diff…
internal/console/pipelinepage_test.goLoading diff…
internal/console/server.goLoading diff…
internal/console/server_test.goLoading diff…
internal/console/sesevents.goLoading diff…
internal/console/sesevents_test.goLoading diff…
internal/console/store.goLoading diff…
internal/console/templates/app_releases.htmlLoading diff…
internal/console/templates/layout.htmlLoading diff…
internal/console/view.goLoading diff…
internal/domains/aliases.goLoading diff…
internal/domains/aliases_test.goLoading diff…
internal/domains/reconcile.goLoading diff…
internal/domains/reconcile_internal_test.goLoading diff…
internal/domains/reconcile_test.goLoading diff…
internal/edge/certwarm.goLoading diff…
internal/edge/certwarm_test.goLoading diff…
internal/edge/edge.goLoading diff…
internal/edge/homemap.goLoading diff…
internal/edgesfile/edgesfile.goLoading diff…
internal/edgesfile/edgesfile_test.goLoading diff…
internal/edgesfile/fold.goLoading diff…
internal/edgesfile/fold_test.goLoading diff…
internal/host/agent.goLoading diff…
internal/host/edgesfile_test.goLoading diff…
internal/host/host_test.goLoading diff…
internal/mail/aws.goLoading diff…
internal/mail/memprovisioner.goLoading diff…
internal/mail/provisioner.goLoading diff…
internal/mail/walk.goLoading diff…
internal/mail/walk_enable_test.goLoading diff…
internal/mail/walk_verify_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/pipeline_test.goLoading diff…
internal/release/release.goLoading diff…
internal/status/snapshot.goLoading diff…
internal/status/status_test.goLoading diff…
mail_cli.goLoading diff…