carlos / platform Public

edge asset cache task 7 fix round 1: partial route reads and fleet-withheld claims

DeploymentRoutesComplete reports whether every live box's edges file was
read and parsed; the host callers pass a partial read into the alias
report. A listed claim whose body is not found makes the pass incomplete
only when an account tied to it owns a route on this box, so the fleet
door's expected 404s no longer block confirmation. Test registries close
on cleanup.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev 92bf16c4470a160b67b66997a2831e218de1a8bb parent 5901df1
8 files changed, +392 −35
  • internal/domains/aliases.go +71 −8
  • internal/domains/aliases_complete_test.go +127 −0
  • internal/domains/claimcache.go +32 −15
  • internal/domains/claims.go +14 −4
  • internal/edgesfile/fold.go +30 −4
  • internal/edgesfile/fold_complete_test.go +108 −0
  • internal/host/agent.go +5 −2
  • internal/host/changeindex.go +5 −2

CI failed — run details

CI log
=== gate ===
.amadan/test-gate.sh
=== launchctx (0 s)
ok  	amadan.net/carlos/platform.git/launchctx	0.015s
?   	amadan.net/carlos/platform.git/launchctx/controlname	[no test files]
?   	amadan.net/carlos/platform.git/launchctx/wireid	[no test files]
=== vet (14 s)
=== gofmt (0 s)
gofmt -l .: clean
=== rest (172 s)
?   	github.com/carlosframework/platform/cmd/changelog	[no test files]
ok  	github.com/carlosframework/platform/cmd/console	3.726s
ok  	github.com/carlosframework/platform/cmd/moveprobe	11.847s
ok  	github.com/carlosframework/platform/cmd/zddprobe	0.700s
ok  	github.com/carlosframework/platform/internal/activator	58.769s
ok  	github.com/carlosframework/platform/internal/agentsock	0.046s
ok  	github.com/carlosframework/platform/internal/alerting	0.012s
ok  	github.com/carlosframework/platform/internal/analytics	0.069s
ok  	github.com/carlosframework/platform/internal/appconfig	2.941s
ok  	github.com/carlosframework/platform/internal/apperr	0.178s
ok  	github.com/carlosframework/platform/internal/applog	0.251s
ok  	github.com/carlosframework/platform/internal/awsinv	0.005s
ok  	github.com/carlosframework/platform/internal/boxchoice	0.027s
ok  	github.com/carlosframework/platform/internal/boxid	1.088s
?   	github.com/carlosframework/platform/internal/boxid/boxidtest	[no test files]
?   	github.com/carlosframework/platform/internal/boxid/internal/signtest	[no test files]
ok  	github.com/carlosframework/platform/internal/boxvolumes	0.029s
ok  	github.com/carlosframework/platform/internal/caps	0.050s
ok  	github.com/carlosframework/platform/internal/certwarm	0.010s
ok  	github.com/carlosframework/platform/internal/cgroup	0.828s
ok  	github.com/carlosframework/platform/internal/changelog	0.526s
ok  	github.com/carlosframework/platform/internal/claimactivation	1.179s
ok  	github.com/carlosframework/platform/internal/clamd	0.066s
?   	github.com/carlosframework/platform/internal/cliflag	[no test files]
?   	github.com/carlosframework/platform/internal/controlname	[no test files]
?   	github.com/carlosframework/platform/internal/controlsock	[no test files]
ok  	github.com/carlosframework/platform/internal/dbdoor	7.727s
ok  	github.com/carlosframework/platform/internal/dbdoor/dbdoortest	0.013s
ok  	github.com/carlosframework/platform/internal/dbquery	0.021s
ok  	github.com/carlosframework/platform/internal/dbreads	2.115s
?   	github.com/carlosframework/platform/internal/dbreads/dbreadstest	[no test files]
ok  	github.com/carlosframework/platform/internal/dbverify	0.014s
ok  	github.com/carlosframework/platform/internal/dnsrec	0.015s
ok  	github.com/carlosframework/platform/internal/docsite	0.021s
ok  	github.com/carlosframework/platform/internal/domains	3.430s
ok  	github.com/carlosframework/platform/internal/doorkey	0.019s
ok  	github.com/carlosframework/platform/internal/economics	0.012s
ok  	github.com/carlosframework/platform/internal/edge	45.834s
?   	github.com/carlosframework/platform/internal/edgeproof	[no test files]
ok  	github.com/carlosframework/platform/internal/edgesfile	0.017s
ok  	github.com/carlosframework/platform/internal/fleetapi	0.167s
ok  	github.com/carlosframework/platform/internal/gate	1.657s
ok  	github.com/carlosframework/platform/internal/genselect	0.028s
ok  	github.com/carlosframework/platform/internal/geo	0.016s
ok  	github.com/carlosframework/platform/internal/geoip	0.043s
ok  	github.com/carlosframework/platform/internal/historyreadback	0.239s
ok  	github.com/carlosframework/platform/internal/host	145.931s
ok  	github.com/carlosframework/platform/internal/hostactors	5.928s
ok  	github.com/carlosframework/platform/internal/hostactors/awsmembership	0.005s
ok  	github.com/carlosframework/platform/internal/hostbox	3.125s
ok  	github.com/carlosframework/platform/internal/hostclaim	0.854s
ok  	github.com/carlosframework/platform/internal/hostenv	0.007s
ok  	github.com/carlosframework/platform/internal/hostevidence	0.008s
ok  	github.com/carlosframework/platform/internal/hostexec	5.291s
ok  	github.com/carlosframework/platform/internal/hostfence	0.057s
ok  	github.com/carlosframework/platform/internal/hostfiles	10.304s
ok  	github.com/carlosframework/platform/internal/hostfloor	0.016s
ok  	github.com/carlosframework/platform/internal/hostguard	1.060s
ok  	github.com/carlosframework/platform/internal/hostops	1.951s
?   	github.com/carlosframework/platform/internal/hostops/fencerelease	[no test files]
ok  	github.com/carlosframework/platform/internal/hostops/internal/fencerelease	0.002s
ok  	github.com/carlosframework/platform/internal/hostquarantine	0.005s
ok  	github.com/carlosframework/platform/internal/hostrelocate	0.609s
ok  	github.com/carlosframework/platform/internal/hostresolve	0.180s
ok  	github.com/carlosframework/platform/internal/hostwrite	0.002s
ok  	github.com/carlosframework/platform/internal/infraview	0.005s
ok  	github.com/carlosframework/platform/internal/instancectl	5.237s
ok  	github.com/carlosframework/platform/internal/instanceexec	2.782s
ok  	github.com/carlosframework/platform/internal/instancefs	0.005s
ok  	github.com/carlosframework/platform/internal/instancekey	0.004s
ok  	github.com/carlosframework/platform/internal/instanceupdates	0.011s
ok  	github.com/carlosframework/platform/internal/layout	1.845s
ok  	github.com/carlosframework/platform/internal/lbhealth	0.003s
ok  	github.com/carlosframework/platform/internal/lease	10.100s
ok  	github.com/carlosframework/platform/internal/lease/leasetest	0.618s
ok  	github.com/carlosframework/platform/internal/ledger	0.021s
ok  	github.com/carlosframework/platform/internal/mail	0.215s
ok  	github.com/carlosframework/platform/internal/maintenance	0.105s
ok  	github.com/carlosframework/platform/internal/maintenanceexec	5.586s
ok  	github.com/carlosframework/platform/internal/maintenanceguard	0.084s
ok  	github.com/carlosframework/platform/internal/metrics	0.011s
ok  	github.com/carlosframework/platform/internal/moves	21.760s
ok  	github.com/carlosframework/platform/internal/moves/archive	1.044s
ok  	github.com/carlosframework/platform/internal/objstore	0.295s
ok  	github.com/carlosframework/platform/internal/ops	0.259s
ok  	github.com/carlosframework/platform/internal/park	0.296s
ok  	github.com/carlosframework/platform/internal/plans	0.008s
ok  	github.com/carlosframework/platform/internal/privatefile	0.005s
2026/10/24 21:42:14 provision: listing apps/bab/blog/instances/: list refused — its records are unseen this pass
2026/10/24 21:42:14 provision: listing apps/bab/: listdirs refused — its records are unseen this pass
2026/10/24 21:42:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:14 provision: listing apps/bac/tito/instances/: list refused — its records are unseen this pass
2026/10/24 21:42:14 provision: listing apps/bac/tito/instances/: list refused — its records are unseen this pass
2026/10/24 21:42:14 provision: skipping record apps/bac/tito/instances/one.example.com.json: unreadable: read refused
2026/10/24 21:42:14 provision: listing apps/bac/tito/instances/: list refused — its records are unseen this pass
2026/10/24 21:42:14 provision: an app's records could not be listed: they are skipped
2026/10/24 21:42:14 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:42:14 provision: remove retired instance route shop.example: provision: claim admission unavailable
2026/10/24 21:42:14 provision: remove retired instance route shop.example: provision: claim admission unavailable
2026/10/24 21:42:14 provision: remove retired sidecar route worker.sidecar.internal: provision: claim admission unavailable
2026/10/24 21:42:14 provision: remove retired sidecar route worker.sidecar.internal: provision: claim admission unavailable
2026/10/24 21:42:14 provision: claim install acme.go.tito.io: provision: claim admission unavailable
2026/10/24 21:42:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:14 provision: claim install acme.go.tito.io: registry: claim row ownership changed or unknown
2026/10/24 21:42:14 provision: claim install bot.eleven.bac.sidecar.internal: provision: claim admission unavailable
2026/10/24 21:42:14 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/24 21:42:14 provision: claim install bot.eleven.bac.sidecar.internal: registry: claim row ownership changed or unknown
2026/10/24 21:42:14 provision: refusing to mint route acme.go.tito.io (app "tito" acct "bac"): this box declares CARLOS_INBOUND=none (no-inbound) and cannot serve routed instance traffic
2026/10/24 21:42:14 provision: acme.go.tito.io: not minting this pass: the box's layout intent could not be read: no sealed config
2026/10/24 21:42:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:14 provision: REFUSING to mint sidecar bot.eleven.bac.sidecar.internal: bot.eleven.bac.sidecar.internal-sidecar.env is staged on this box — the legacy file co-spawn and a native sidecar row are two mechanisms for one host; remove the file to migrate this host onto sidecar records
2026/10/24 21:42:14 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/24 21:42:14 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/24 21:42:14 provision: refusing to mint route acme.go.tito.io (app "tito" acct "bac"): this box declares CARLOS_INBOUND=none (no-inbound) and cannot serve routed instance traffic
2026/10/24 21:42:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:14 provision: REFUSING to mint sidecar bot.eleven.bac.sidecar.internal: bot.eleven.bac.sidecar.internal-sidecar.env is staged on this box — the legacy file co-spawn and a native sidecar row are two mechanisms for one host; remove the file to migrate this host onto sidecar records
2026/10/24 21:42:14 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/24 21:42:14 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/24 21:42:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:14 provision: claim install acme.go.tito.io: registry: claim row ownership changed or unknown
2026/10/24 21:42:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:14 provision: claim install acme.go.tito.io: registry: claim row ownership changed or unknown
2026/10/24 21:42:14 provision: bot.eleven.bac.sidecar.internal exists but is not a sidecar row this pass owns (kind "sidecar" provisioned false app "eleven" acct "bac") — leaving it alone
2026/10/24 21:42:14 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/24 21:42:14 provision: claim install bot.eleven.bac.sidecar.internal: registry: claim row ownership changed or unknown
2026/10/24 21:42:14 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/24 21:42:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:14 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/24 21:42:14 provision: bot.eleven.bac.sidecar.internal exists but is not a sidecar row this pass owns (kind "sidecar" provisioned false app "eleven" acct "bac") — leaving it alone
2026/10/24 21:42:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:14 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:42:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:14 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:14 provision: skipping record apps/bac/tito/instances/new.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:14 provision: not removing acme.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/24 21:42:14 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:14 provision: skipping record apps/bac/tito/instances/new.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:15 provision: minted instance route ra.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route rd.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route re.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route rf.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route ri.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route rj.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route rk.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route rb.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route rc.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route rg.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route rh.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route rl.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route rb.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route rc.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route rd.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route ra.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: skipping record apps/bac/tito/instances/rb.go.tito.io.json: read failed: read refused
2026/10/24 21:42:15 provision: skipping record apps/bac/tito/instances/rb.go.tito.io.json: read failed: read refused
2026/10/24 21:42:15 provision: minted instance route re.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route x.appj.example (app "appj" acct "bac")
2026/10/24 21:42:15 provision: minted instance route x.appa.example (app "appa" acct "bac")
2026/10/24 21:42:15 provision: minted instance route x.appb.example (app "appb" acct "bac")
2026/10/24 21:42:15 provision: minted instance route x.appc.example (app "appc" acct "bac")
2026/10/24 21:42:15 provision: minted instance route x.appe.example (app "appe" acct "bac")
2026/10/24 21:42:15 provision: minted instance route x.appf.example (app "appf" acct "bac")
2026/10/24 21:42:15 provision: minted instance route x.appg.example (app "appg" acct "bac")
2026/10/24 21:42:15 provision: minted instance route x.apph.example (app "apph" acct "bac")
2026/10/24 21:42:15 provision: minted instance route x.appi.example (app "appi" acct "bac")
2026/10/24 21:42:15 provision: minted instance route x.appd.example (app "appd" acct "bac")
2026/10/24 21:42:15 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/24 21:42:15 provision: minted instance route r0003.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0022.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0091.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0014.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0076.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0074.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0102.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0110.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0026.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0098.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0123.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0023.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0086.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0114.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0028.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0038.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0088.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0092.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0124.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0018.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0043.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0065.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0075.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0100.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0108.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0000.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0035.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0071.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0127.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0068.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0101.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0121.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0006.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0013.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0078.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0080.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0087.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0104.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0010.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0051.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0064.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0113.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0089.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0041.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0027.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0057.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0115.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0128.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0062.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0033.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0034.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0029.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0107.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0116.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0015.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0069.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0025.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0055.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0085.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0125.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0009.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0020.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0046.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0054.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0056.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0058.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0079.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0002.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0008.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0050.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0053.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0081.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0094.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0103.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0112.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0037.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0084.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0118.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0036.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0060.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0067.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0097.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0117.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0045.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0021.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0012.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0016.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0049.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0001.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0007.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0042.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0048.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0072.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0106.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0111.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0070.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0093.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0126.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0019.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0059.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0095.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0129.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0105.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0122.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0099.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0011.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0047.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0073.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0082.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0096.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0119.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0083.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0004.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0005.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0017.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0024.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0040.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0077.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0044.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0052.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0031.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0032.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0039.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0061.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0120.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0030.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0063.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0066.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0090.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:15 provision: minted instance route r0109.go.tito.io (app "tito" acct "bac")
--- FAIL: TestPlan9B8RecordWriteCensus (0.70s)
    plan9_b8_census_test.go:372: record-write census rejected 1 site(s); update the explicit inventory only after reviewing the source:
          changed site internal/provision/reconcile.go:Reconcile: source differs from the reviewed digest
2026/10/24 21:42:16 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:16 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:16 provision: refusing to mint route acme.go.tito.io (app "tito" acct "bac"): this box declares CARLOS_INBOUND=none (no-inbound) and cannot serve routed instance traffic
2026/10/24 21:42:16 provision: minted instance route b.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: minted instance route n.notes.example.com (app "notes" acct "bac")
2026/10/24 21:42:16 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: converged a.shop.example.com assets off false -> false, generation "0123456789abcdef" -> "fedcba9876543210"
2026/10/24 21:42:16 provision: minted instance route b.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: minted instance route n.notes.example.com (app "notes" acct "bac")
2026/10/24 21:42:16 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: skipping record apps/bac/shop/instances/b.shop.example.com.json: read failed: get refused
2026/10/24 21:42:16 provision: skipping record apps/bac/shop/instances/c.shop.example.com.json: read failed: get refused
2026/10/24 21:42:16 provision: minted instance route n.notes.example.com (app "notes" acct "bac")
2026/10/24 21:42:16 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: minted instance route b.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: skipping record apps/bac/shop/instances/b.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:16 provision: not removing b.shop.example.com: its record exists but could not be read cleanly this pass
2026/10/24 21:42:16 provision: skipping record apps/bac/shop/instances/c.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:16 provision: minted instance route b.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: minted instance route n.notes.example.com (app "notes" acct "bac")
2026/10/24 21:42:16 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: listing apps/bac/notes/instances/: list refused — its records are unseen this pass
2026/10/24 21:42:16 provision: minted instance route n.notes.example.com (app "notes" acct "bac")
2026/10/24 21:42:16 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: minted instance route b.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: minted instance route n.notes.example.com (app "notes" acct "bac")
2026/10/24 21:42:16 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: minted instance route b.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: trash marker for bac/shop unreadable: release: read trash marker for bac/shop: get refused — not minting for this app
2026/10/24 21:42:16 provision: minted instance route n.notes.example.com (app "notes" acct "bac")
2026/10/24 21:42:16 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: minted instance route b.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: converge gate on a.shop.example.com: constraint failed: injected (1811)
2026/10/24 21:42:16 provision: minted instance route n.notes.example.com (app "notes" acct "bac")
2026/10/24 21:42:16 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: minted instance route b.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: converged b.shop.example.com assets off false -> false, generation "0123456789abcdef" -> "fedcba9876543210"
2026/10/24 21:42:16 provision: remove retired instance route a.shop.example.com: constraint failed: injected (1811)
2026/10/24 21:42:16 provision: minted instance route b.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: minted instance route n.notes.example.com (app "notes" acct "bac")
2026/10/24 21:42:16 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: converged b.shop.example.com assets off false -> false, generation "0123456789abcdef" -> "fedcba9876543210"
2026/10/24 21:42:16 provision: skipping record apps/bac/notes/instances/n.notes.example.com.json: read failed: get refused
2026/10/24 21:42:16 provision: not removing any route this pass: the record view lacks a record or holds a trash marker, and the bucket's own walk could not be read cleanly
2026/10/24 21:42:16 provision: minted instance route n.notes.example.com (app "notes" acct "bac")
2026/10/24 21:42:16 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: minted instance route b.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: converged a.shop.example.com steering "" -> "latency"
2026/10/24 21:42:16 provision: converge assets on a.shop.example.com: constraint failed: injected (1811)
2026/10/24 21:42:16 provision: converged a.shop.example.com update settings "" -> "{\"updates\":\"manual\",\"channel\":\"stable\"}"
2026/10/24 21:42:16 provision: dry-run: would converge a.shop.example.com assets off false -> false, generation "0123456789abcdef" -> "fedcba9876543210"
2026/10/24 21:42:16 provision: converged a.shop.example.com steering "latency" -> ""
2026/10/24 21:42:16 provision: converge assets on a.shop.example.com: constraint failed: injected (1811)
2026/10/24 21:42:16 provision: converged a.shop.example.com update settings "{\"updates\":\"manual\",\"channel\":\"stable\"}" -> ""
2026/10/24 21:42:16 provision: a.shop.example.com: import sd_3elkmukpqmsieb6asihpt6q7bq is journaled, but this box cannot act on imports; its row is left alone
2026/10/24 21:42:16 provision: removed retired instance route a.notes.example.com (record gone)
2026/10/24 21:42:16 provision: bac/shop is in the trash — not minting instance routes for it
2026/10/24 21:42:16 provision: adopted existing route a.shop.example.com (app "shop" acct "bac") — this record now owns its channel and environment
2026/10/24 21:42:16 provision: minted instance route n.notes.example.com (app "notes" acct "bac")
2026/10/24 21:42:16 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: minted instance route b.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: held a.shop.example.com landing by op-1 (was ready)
2026/10/24 21:42:16 provision: minted instance route a.shop.example.com (app "shop" acct "bab")
2026/10/24 21:42:16 provision: minted instance route n.notes.example.com (app "notes" acct "bac")
2026/10/24 21:42:16 provision: skipping accounts/bab/account.json: read failed: get refused
2026/10/24 21:42:16 provision: minted instance route n.notes.example.com (app "notes" acct "bac")
2026/10/24 21:42:16 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: minted instance route b.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:16 provision: converged a.shop.example.com assets off false -> false, generation "0123456789abcdef" -> "fedcba9876543210"
2026/10/24 21:42:16 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:16 provision: minted instance route console.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:16 provision: minted service route ha.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:16 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:16 provision: minted service route svc.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:16 provision: minted instance route whole.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:16 provision: minted instance route shared.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:16 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:16 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:16 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:16 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:16 provision: converged acme.go.tito.io channel stable -> edge
2026/10/24 21:42:16 provision: converged acme.go.tito.io channel edge -> canary/rehearsal
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: empty channel
2026/10/24 21:42:17 provision: not removing acme.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: converged acme.go.tito.io environment "" -> "staging"
2026/10/24 21:42:17 provision: converged acme.go.tito.io environment "staging" -> ""
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: converged acme.go.tito.io steering "" -> "latency"
2026/10/24 21:42:17 provision: converged acme.go.tito.io steering "latency" -> ""
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: converged acme.go.tito.io hibernate false -> true
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: converged acme.go.tito.io hibernate true -> false (replication "daily" cleared: only a hibernating route's rung is read)
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: converged acme.go.tito.io status-named false -> true
2026/10/24 21:42:17 provision: converged acme.go.tito.io status-named true -> false
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: minted service route ha.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: converged ha.go.tito.io upstreams addr "" -> "", addrs "127.0.0.1:7001,127.0.0.1:7002" -> "127.0.0.1:7001,127.0.0.1:7003" (probe "{\"path\":\"/\",\"status\":200,\"interval_ms\":2000,\"fail_after\":3,\"rise_after\":2}" -> "{\"path\":\"/\",\"status\":200,\"interval_ms\":2000,\"fail_after\":3,\"rise_after\":2}")
2026/10/24 21:42:17 provision: converged ha.go.tito.io upstreams addr "" -> "", addrs "127.0.0.1:7001,127.0.0.1:7003" -> "127.0.0.1:7003,127.0.0.1:7001" (probe "{\"path\":\"/\",\"status\":200,\"interval_ms\":2000,\"fail_after\":3,\"rise_after\":2}" -> "{\"path\":\"/\",\"status\":200,\"interval_ms\":2000,\"fail_after\":3,\"rise_after\":2}")
2026/10/24 21:42:17 provision: converged ha.go.tito.io upstreams addr "" -> "", addrs "127.0.0.1:7003,127.0.0.1:7001" -> "127.0.0.1:7003,127.0.0.1:7001" (probe "{\"path\":\"/\",\"status\":200,\"interval_ms\":2000,\"fail_after\":3,\"rise_after\":2}" -> "{\"path\":\"/healthz\",\"status\":200,\"interval_ms\":2000,\"fail_after\":3,\"rise_after\":2}")
2026/10/24 21:42:17 provision: minted service route whole.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: converged whole.go.tito.io upstreams addr "127.0.0.1:9443" -> "", addrs "" -> "127.0.0.1:9443,127.0.0.1:9444" (probe "" -> "{\"path\":\"/\",\"status\":200,\"interval_ms\":2000,\"fail_after\":3,\"rise_after\":2}")
2026/10/24 21:42:17 provision: converged whole.go.tito.io upstreams addr "" -> "", addrs "127.0.0.1:9443,127.0.0.1:9444" -> "" (probe "{\"path\":\"/\",\"status\":200,\"interval_ms\":2000,\"fail_after\":3,\"rise_after\":2}" -> "")
2026/10/24 21:42:17 provision: whole.go.tito.io: record describes a different route SHAPE than the row (kind "instance"/"service" unit ""/"" socket "/run/carlos/whole.go.tito.io.sock"/"" db "/data/whole.go.tito.io.db"/"") — not converged in place; `carlos remove whole.go.tito.io` purges this route's capability grants (registry.Delete's contract, not a bug) before the next pass re-mints it, so treat that as a last resort, not a routine fix
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: minted service route whole.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: skipping accounts/bac/account.json: malformed account manifest: invalid character 'o' in literal null (expecting 'u')
2026/10/24 21:42:17 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: manifest bac/tito: read failed: provision: manifest bac/tito: invalid character 'o' in literal null (expecting 'u')
2026/10/24 21:42:17 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: disagrees with its own path (host="wrong-host.go.tito.io" account="bac" app="tito")
2026/10/24 21:42:17 provision: skipping record apps/bac/tito/instances/acme$evil.go.tito.io.json: host "acme$evil.go.tito.io" is not a hostname
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: skipping record apps/bac/tito/instances/acme$evil.go.tito.io.json: host "acme$evil.go.tito.io" is not a hostname
2026/10/24 21:42:17 provision: not removing acme$evil.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/24 21:42:17 provision: skipping record apps/bac/tito/instances/bad-service.go.tito.io.json: invalid shape: kind service with no addr: the platform only proxies to a service, so the record must name the upstream it proxies to
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: skipping record apps/bac/tito/instances/bad-service.go.tito.io.json: invalid shape: kind service with no addr: the platform only proxies to a service, so the record must name the upstream it proxies to
2026/10/24 21:42:17 provision: not removing bad-service.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/24 21:42:17 provision: skipping record apps/bac/tito/instances/no-channel.go.tito.io.json: empty channel
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: skipping record apps/bac/tito/instances/no-channel.go.tito.io.json: empty channel
2026/10/24 21:42:17 provision: not removing no-channel.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:17 provision: not removing acme.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/24 21:42:17 provision: removed retired instance route ghost.go.tito.io (record gone)
2026/10/24 21:42:17 provision: duplicate host dup.go.tito.io: keeping apps/bac/tito/instances/dup.go.tito.io.json, skipping apps/bad/tito/instances/dup.go.tito.io.json
2026/10/24 21:42:17 provision: minted instance route dup.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/24 21:42:17 provision: removed retired instance route acme.go.tito.io (app in the trash)
2026/10/24 21:42:17 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/24 21:42:17 provision: removed retired static route site.go.tito.io (app in the trash)
2026/10/24 21:42:17 provision: trash marker for bac/tito unreadable: release: malformed trash marker for bac/tito: invalid character 'n' looking for beginning of object key string — not minting for this app
2026/10/24 21:42:17 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/24 21:42:17 provision: removed retired instance route acme.go.tito.io (app in the trash)
2026/10/24 21:42:17 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/24 21:42:17 provision: trash marker for bac/tito unreadable: release: malformed trash marker for bac/tito: invalid character 'n' looking for beginning of object key string — not minting for this app
2026/10/24 21:42:17 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/24 21:42:17 provision: converged acme.go.tito.io channel stable -> edge
2026/10/24 21:42:17 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/24 21:42:17 provision: converged acme.go.tito.io channel canary/rehearsal -> edge
2026/10/24 21:42:17 provision: converged acme.go.tito.io environment "staging" -> ""
2026/10/24 21:42:17 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/24 21:42:17 provision: acme.go.tito.io exists but is not the route this record describes (backing "unit" (box-scoped, not expressible in a record)) — leaving it alone
2026/10/24 21:42:17 provision: acme.go.tito.io exists but is not the route this record describes (tunnel "pi-fleet" (box-scoped, not expressible in a record)) — leaving it alone
2026/10/24 21:42:17 provision: acme.go.tito.io exists but is not the route this record describes (caps "port:25" (box-scoped, not expressible in a record)) — leaving it alone
2026/10/24 21:42:17 provision: acme.go.tito.io exists but is not the route this record describes (platform (owned by the domains reconcile pass)) — leaving it alone
2026/10/24 21:42:17 provision: acme.go.tito.io exists but is not the route this record describes (canary (owned by the domains reconcile pass)) — leaving it alone
2026/10/24 21:42:17 provision: acme.go.tito.io exists but is not the route this record describes (db "/data/other.db"/"/data/acme.go.tito.io.db") — leaving it alone
2026/10/24 21:42:17 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/24 21:42:17 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/24 21:42:17 provision: dry-run: would mint instance route acme.go.tito.io (app "tito" acct "bac" channel "stable")
2026/10/24 21:42:17 provision: dry-run: would adopt existing route adopt.go.tito.io (app "tito" acct "bac") — this record would own its channel and environment
2026/10/24 21:42:17 provision: dry-run: would converge adopt.go.tito.io channel stable -> edge
2026/10/24 21:42:17 provision: dry-run: would converge adopt.go.tito.io environment "" -> "staging"
2026/10/24 21:42:17 provision: dry-run: would converge owned.go.tito.io channel stable -> edge
2026/10/24 21:42:17 provision: dry-run: would converge owned.go.tito.io environment "" -> "staging"
2026/10/24 21:42:17 provision: dry-run: would converge owned.go.tito.io hibernate false -> true
2026/10/24 21:42:17 provision: dry-run: would converge owned.go.tito.io seed
2026/10/24 21:42:17 provision: dry-run: would remove retired instance route gone.go.tito.io (record gone)
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: adopted existing route adopt.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/24 21:42:17 provision: converged adopt.go.tito.io channel stable -> edge
2026/10/24 21:42:17 provision: converged adopt.go.tito.io environment "" -> "staging"
2026/10/24 21:42:17 provision: converged owned.go.tito.io channel stable -> edge
2026/10/24 21:42:17 provision: converged owned.go.tito.io environment "" -> "staging"
2026/10/24 21:42:17 provision: converged owned.go.tito.io hibernate false -> true
2026/10/24 21:42:17 provision: removed retired instance route gone.go.tito.io (record gone)
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: adopted existing route story.carlosframework.com (app "story" acct "bad") — this record now owns its channel and environment
2026/10/24 21:42:17 provision: story.carlosframework.com exists but is not the route this record describes (kind "instance"/"static") — leaving it alone
2026/10/24 21:42:17 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: minted service route pub.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: minted service route pubs.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: minted instance route exec.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: minted service route loop.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: minted service route named.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: minted service route priv.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: minted instance route unit.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: minted static route pisite.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: removed retired static route site.go.tito.io (record gone)
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:17 provision: minted instance route acme-uk.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:18 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:18 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:18 provision: converged acme.go.tito.io replicas "ie,uk" -> "uk"
2026/10/24 21:42:18 provision: converged acme.go.tito.io replicas "uk" -> ""
2026/10/24 21:42:18 provision: minted instance route acme-uk.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:18 provision: converged acme-uk.go.tito.io replica mark true -> false
2026/10/24 21:42:18 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:18 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:18 provision: acme.go.tito.io: row is on the nested layout (db "/data/instances/acme.go.tito.io/acme.go.tito.io.db" socket "/run/carlos/instances/acme.go.tito.io/app.sock"); the record's shared paths are not drift
2026/10/24 21:42:18 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:18 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:18 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:18 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:18 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:18 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:18 provision: acme.go.tito.io: not minting this pass: the box's layout intent could not be read: store down
2026/10/24 21:42:18 provision: router.go.tito.io: not minting this pass: the box's layout intent could not be read: store down
2026/10/24 21:42:18 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/24 21:42:18 provision: converged acme.go.tito.io channel stable -> edge
2026/10/24 21:42:18 provision: minted instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac")
2026/10/24 21:42:18 provision: not removing acme.go.tito.io (record gone): participant of a running operation
2026/10/24 21:42:18 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/24 21:42:18 provision: minted instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac")
2026/10/24 21:42:18 provision: refusing to mint held route acme.go.tito.io (app "tito" acct "bac"): this box declares CARLOS_INBOUND=none (no-inbound) and cannot serve routed instance traffic
2026/10/24 21:42:18 provision: held acme.go.tito.io landing by mv_acme (was ready)
2026/10/24 21:42:18 provision: acme.go.tito.io: held restoring by rb_other, not by mv_acme; leaving it
2026/10/24 21:42:18 provision: acme.go.tito.io: the row is not this pass's (app "other" acct ""); not holding it for mv_acme
2026/10/24 21:42:18 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/24 21:42:18 provision: dry-run: would mint instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac" channel "stable")
2026/10/24 21:42:18 provision: acme.go.tito.io: not held landing by mv_acme: the row's hold changed under this pass; the next pass judges it afresh
2026/10/24 21:42:18 provision: held acme.go.tito.io landing by mv_acme (was ready)
2026/10/24 21:42:18 provision: minted instance route acme.example.com (app "shop" acct "bac")
2026/10/24 21:42:18 provision: minted instance route plain.example.com (app "shop" acct "bac")
2026/10/24 21:42:18 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:18 provision: skipping record apps/bac/shop/instances/liar.shop.example.com.json: disagrees with its own path (host="other.shop.example.com" account="bac" app="shop")
2026/10/24 21:42:18 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:18 provision: skipping record apps/bac/shop/instances/liar.shop.example.com.json: disagrees with its own path (host="other.shop.example.com" account="bac" app="shop")
2026/10/24 21:42:18 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:18 provision: skipping record apps/bac/shop/instances/liar.shop.example.com.json: disagrees with its own path (host="other.shop.example.com" account="bac" app="shop")
2026/10/24 21:42:18 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:18 provision: listing apps/bac/shop/instances/: list refused — its records are unseen this pass
2026/10/24 21:42:18 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:18 provision: converged a.shop.example.com assets off false -> false, generation "" -> "0123456789abcdef"
2026/10/24 21:42:18 provision: converged a.shop.example.com assets off false -> false, generation "0123456789abcdef" -> "fedcba9876543210"
2026/10/24 21:42:18 provision: converged a.shop.example.com assets off false -> true, generation "fedcba9876543210" -> "fedcba9876543210"
2026/10/24 21:42:18 provision: converged a.shop.example.com assets off true -> false, generation "fedcba9876543210" -> ""
2026/10/24 21:42:19 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:19 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:19 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/24 21:42:19 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:19 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/24 21:42:19 provision: minted sidecar route bot.shop.bac.sidecar.internal (app "shop" acct "bac" args ["run"])
2026/10/24 21:42:19 provision: removed retired sidecar route bot.shop.bac.sidecar.internal (record gone)
2026/10/24 21:42:19 provision: minted sidecar route bot.shop.bum.sidecar.internal (app "shop" acct "bum" args ["run"])
2026/10/24 21:42:19 provision: minted sidecar route bot.shop.bum.sidecar.internal (app "shop" acct "bum" args ["run"])
2026/10/24 21:42:19 provision: sidecar bot.shop.bum.sidecar.internal is not placeable here: it asks for "no-inbound" placement and this box accepts inbound work (CARLOS_INBOUND="")
2026/10/24 21:42:19 provision: sidecar bot.shop.bum.sidecar.internal is not placeable here: it asks for "no-inbound" placement and this box accepts inbound work (CARLOS_INBOUND="")
2026/10/24 21:42:19 provision: removed retired sidecar route bot.shop.bum.sidecar.internal (record gone)
2026/10/24 21:42:19 provision: sidecar bot.shop.bum.sidecar.internal is not placeable here: it asks for "no-inbound" placement and this box accepts inbound work (CARLOS_INBOUND="")
2026/10/24 21:42:19 provision: sidecar bot.shop.bum.sidecar.internal is not placeable here: it asks for "no-inbound" placement and this box accepts inbound work (CARLOS_INBOUND="")
2026/10/24 21:42:19 provision: removed retired sidecar route bot.shop.bum.sidecar.internal (record gone)
2026/10/24 21:42:19 provision: a.shop.example.com: swapped for import sd_moaqrh44b37ewgrjhxqh2ncw5e (the original route is journaled)
2026/10/24 21:42:19 provision: a.shop.example.com: import sd_moaqrh44b37ewgrjhxqh2ncw5e committed: its gate is cleared and its journal row dropped
2026/10/24 21:42:19 provision: a.shop.example.com: row is on the nested layout (db "/data/instances/a.shop.example.com/a.shop.example.com.db" socket "/run/carlos/instances/a.shop.example.com/app.sock"); the record's shared paths are not drift
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_c464amehqteceno5hkgoxaefgy rolled back to its original route
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_c464amehqteceno5hkgoxaefgy: the host's replica is left alone: the record apps/bac/shop/instances/a.shop.example.com.json holds the host
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_c464amehqteceno5hkgoxaefgy is cleaned up and its journal row retired
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_jwjl6qtybhg5vvrtc65fmxcqmu rolled back to its original route
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_jwjl6qtybhg5vvrtc65fmxcqmu: the host's replica is left alone: the record apps/bac/shop/instances/a.shop.example.com.json holds the host
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_jwjl6qtybhg5vvrtc65fmxcqmu is cleaned up and its journal row retired
2026/10/24 21:42:20 provision: dry-run: would redo a.shop.example.com's swap record CAS for import sd_traxvp3iamhgckrxhqaawpj3y4
2026/10/24 21:42:20 provision: dry-run: would clear a.shop.example.com's import gate
2026/10/24 21:42:20 provision: dry-run: would converge a.shop.example.com seed source
2026/10/24 21:42:20 provision: a.shop.example.com: row is on the nested layout (db "/data/instances/a.shop.example.com/a.shop.example.com.db" socket "/run/carlos/instances/a.shop.example.com/app.sock"); the record's shared paths are not drift
2026/10/24 21:42:20 provision: a.shop.example.com: the import's record apps/bac/shop/instances/a.shop.example.com.json is not one this pass can use (connection reset)
2026/10/24 21:42:20 provision: a.shop.example.com: the import's record apps/bac/shop/instances/a.shop.example.com.json is not one this pass can use (provision: invalid maintenance projection or protected fields)
2026/10/24 21:42:20 provision: a.shop.example.com: the import's record apps/bac/shop/instances/a.shop.example.com.json is not one this pass can use (the record under apps/bac/shop/instances/a.shop.example.com.json is apps/bac/shop/instances/b.shop.example.com.json's)
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_rk2qwkuxsnc7rpgohavlknoqly cannot roll back on this box: the activator is not wired; it stays journaled and gated
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_ja7u24hi4kj5mzhkztmwcp7md4 cannot roll back on this box: the activator is not wired; it stays journaled and gated
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_wpgjaic5xg353kaknoek3y5qsy is journaled, but this box cannot act on imports; its row is left alone
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_4mydbcnbwtwvwla4th4o3d4aue is journaled, but this box cannot act on imports; its row is left alone
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_kinzis37bvykirvzpft2bxs2g4 is journaled, but this box cannot act on imports; its row is left alone
2026/10/24 21:42:20 provision: the import journal could not be read: registry: import journal a.shop.example.com: original row: unexpected end of JSON input (no import is acted on and no route is removed this pass)
2026/10/24 21:42:20 provision: b.shop.example.com: import sd_alguyccwq2xssaevvd3uanex2e left alone this pass: the import journal could not be read
2026/10/24 21:42:20 provision: c.shop.example.com: import sd_et7gw76bv75i3ieyi24xxnhpwy left alone this pass: the import journal could not be read
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_jryh5zp2aflrgezrcu3iagmfbu committed: its gate is cleared and its journal row dropped
2026/10/24 21:42:20 provision: a.shop.example.com: not converging import sd_ebnkyxg7vh5u34eu7j7g6aydny: it is swapped but not committed, and the row on this box has no import gate
2026/10/24 21:42:20 provision: a.shop.example.com: not converging import sd_lazyyrzqseyer4zqk4n3eh4lmi: it is swapped but not committed, and the row on this box has no import gate
2026/10/24 21:42:20 provision: a.shop.example.com: not converging import sd_5qd5deb32jsrn6jnzihc335ahi: it is placed but not committed, and the row on this box has no import gate
2026/10/24 21:42:20 provision: a.shop.example.com: not converging import sd_wqxijafygitzjwkuy5g3oyk6wu: it is placed but not committed, and the row on this box has no import gate
2026/10/24 21:42:20 provision: a.shop.example.com: row is on the nested layout (db "/data/instances/a.shop.example.com/a.shop.example.com.db" socket "/run/carlos/instances/a.shop.example.com/app.sock"); the record's shared paths are not drift
2026/10/24 21:42:20 provision: converge seed source on a.shop.example.com: constraint failed: seed_source is read-only here (1811)
2026/10/24 21:42:20 provision: a.shop.example.com: row is on the nested layout (db "/data/instances/a.shop.example.com/a.shop.example.com.db" socket "/run/carlos/instances/a.shop.example.com/app.sock"); the record's shared paths are not drift
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_omaktzzbvqev2saeweqaa2lu34 committed: its gate is cleared and its journal row dropped
2026/10/24 21:42:20 provision: a.shop.example.com: row is on the nested layout (db "/data/instances/a.shop.example.com/a.shop.example.com.db" socket "/run/carlos/instances/a.shop.example.com/app.sock"); the record's shared paths are not drift
2026/10/24 21:42:20 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:20 provision: acme.go.tito.io: row is on the nested layout (db "/data/instances/acme.go.tito.io/acme.go.tito.io.db" socket "/run/carlos/instances/acme.go.tito.io/app.sock"); the record's shared paths are not drift
2026/10/24 21:42:20 provision: acme.go.tito.io: not minting a seeded instance: this box does not mint nested (<nil>)
2026/10/24 21:42:20 provision: acme.go.tito.io: not minting a seeded instance: claim control is on for this box
2026/10/24 21:42:20 provision: acme.go.tito.io: aborted seed sd_5wd6vvge7csunskkfu4mebd4vq: this box cannot read seed markers, and places no seed; nothing local is removed
2026/10/24 21:42:20 provision: acme.go.tito.io: aborted seed sd_5wd6vvge7csunskkfu4mebd4vq rolled back (no box had swapped it)
2026/10/24 21:42:20 provision: acme.go.tito.io: not minting a seeded instance: its record does not describe a hibernating instance
2026/10/24 21:42:20 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:20 provision: removed instance route acme.go.tito.io (its seed sd_jqb5uc4dvcv5yzc63pflxbkjku was aborted); the next pass rolls it back
2026/10/24 21:42:20 provision: acme.go.tito.io: aborted seed sd_jqb5uc4dvcv5yzc63pflxbkjku: this box cannot read seed markers, and places no seed; nothing local is removed
2026/10/24 21:42:20 provision: acme.go.tito.io: aborted seed sd_jqb5uc4dvcv5yzc63pflxbkjku rolled back (no box had swapped it)
2026/10/24 21:42:20 provision: acme.go.tito.io: aborted seed sd_fyhdesigug5h7tfrs3n3gds6km has a row this pass may not remove; leaving the seed aborted
2026/10/24 21:42:20 provision: acme.go.tito.io: aborted seed sd_tx5vzalgum2nods67gbn45um3a rolled back (no box had swapped it)
2026/10/24 21:42:20 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:20 provision: removed instance route acme.go.tito.io (its seed sd_uc4xpnbtirv7sjvdummv66n5di was aborted); the next pass rolls it back
2026/10/24 21:42:20 provision: acme.go.tito.io: aborted seed sd_uc4xpnbtirv7sjvdummv66n5di has no route on this box: its local data is removed
2026/10/24 21:42:20 provision: acme.go.tito.io: aborted seed sd_uc4xpnbtirv7sjvdummv66n5di rolled back (no box had swapped it)
2026/10/24 21:42:20 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:20 provision: a.shop.example.com: swapped for import sd_rlhzxm3h5jiydrxullrfnpjome (the original route is journaled)
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_rlhzxm3h5jiydrxullrfnpjome rolled back to its original route
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_rlhzxm3h5jiydrxullrfnpjome is cleaned up and its journal row retired
2026/10/24 21:42:20 provision: a.shop.example.com: swapped for import sd_lkd5h3djuiv4xswrzluyywhkua (the original route is journaled)
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_lkd5h3djuiv4xswrzluyywhkua rolled back to its original route
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_lkd5h3djuiv4xswrzluyywhkua is cleaned up and its journal row retired
2026/10/24 21:42:20 provision: a.shop.example.com: swapped for import sd_lnjgmctmqxvjmtpexi5rfpegt4 (the original route is journaled)
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_lnjgmctmqxvjmtpexi5rfpegt4 rolled back to its original route
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_lnjgmctmqxvjmtpexi5rfpegt4: the host's replica is left alone: its record no longer names this seed
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_lnjgmctmqxvjmtpexi5rfpegt4 is cleaned up and its journal row retired
2026/10/24 21:42:20 provision: a.shop.example.com: swapped for import sd_tyo6zungm3mat6r7d5m2lriqkm (the original route is journaled)
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_tyo6zungm3mat6r7d5m2lriqkm rollback deferred: the host is not fenced and stopped yet (<nil>)
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_tyo6zungm3mat6r7d5m2lriqkm rolled back to its original route
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_tyo6zungm3mat6r7d5m2lriqkm is cleaned up and its journal row retired
2026/10/24 21:42:20 provision: a.shop.example.com: swapped for import sd_5qdk36no3q5fm66j2j4o6eloyi (the original route is journaled)
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_5qdk36no3q5fm66j2j4o6eloyi rollback deferred: the host is not fenced and stopped yet (stop unproven)
2026/10/24 21:42:20 provision: a.shop.example.com: swapped for import sd_mtigra4hsjncrgwcfy2hovtuf4 (the original route is journaled)
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_mtigra4hsjncrgwcfy2hovtuf4 is cleaned up and its journal row retired
2026/10/24 21:42:20 provision: a.shop.example.com: swapped for import sd_b7poldrv5iic4se6reaotnea2i (the original route is journaled)
2026/10/24 21:42:20 provision: skipping record apps/bac/shop/instances/a.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:20 provision: a.shop.example.com: import sd_b7poldrv5iic4se6reaotnea2i left alone this pass: its record could not be read
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_nb4d4gtlll6wsjvnpxcpuf5yw4 (the original route is journaled)
2026/10/24 21:42:21 provision: skipping record apps/bac/shop/instances/a.shop.example.com.json: read failed: connection reset
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_nb4d4gtlll6wsjvnpxcpuf5yw4 left alone this pass: its record could not be read
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_7s73bdnptzolhzfdweq4qlz6vm (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_7s73bdnptzolhzfdweq4qlz6vm: close the import gate: constraint failed: injected (1811)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_7s73bdnptzolhzfdweq4qlz6vm rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_7s73bdnptzolhzfdweq4qlz6vm is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_shuru7e7vz4r5ndecodkigaa3m (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_shuru7e7vz4r5ndecodkigaa3m: close the import gate: constraint failed: injected (1811)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_shuru7e7vz4r5ndecodkigaa3m rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_shuru7e7vz4r5ndecodkigaa3m is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_ad77qldrgeposui726ihaylfti (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_ad77qldrgeposui726ihaylfti rollback deferred: the host is not fenced and stopped yet (injected failure at fence)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_ad77qldrgeposui726ihaylfti rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_ad77qldrgeposui726ihaylfti is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_v6yms2re2id3svgngjbig7yi5e (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_v6yms2re2id3svgngjbig7yi5e rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_v6yms2re2id3svgngjbig7yi5e is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_xozlr25ypdbde3axxwrymato7e (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_xozlr25ypdbde3axxwrymato7e: retire its instance key: injected failure at retire-key
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_xozlr25ypdbde3axxwrymato7e rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_xozlr25ypdbde3axxwrymato7e is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_tub45e5o76bi3a2zbriq7yhy4y (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_tub45e5o76bi3a2zbriq7yhy4y rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_tub45e5o76bi3a2zbriq7yhy4y is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_r5mpnmtriqhqc7fppaehflynz4 (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_r5mpnmtriqhqc7fppaehflynz4: remove its local data: injected failure at remove-local
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_r5mpnmtriqhqc7fppaehflynz4 rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_r5mpnmtriqhqc7fppaehflynz4 is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_ugzmil3mad7l526q6go6s77gju (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_ugzmil3mad7l526q6go6s77gju rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_ugzmil3mad7l526q6go6s77gju is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_2iw5tsazzvqhz27ihhetkdz7di (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_2iw5tsazzvqhz27ihhetkdz7di: remove its local data: injected failure at remove-local-done
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_2iw5tsazzvqhz27ihhetkdz7di rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_2iw5tsazzvqhz27ihhetkdz7di is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_sju2hjzx4l3bofpqovxfcw3gnq (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_sju2hjzx4l3bofpqovxfcw3gnq rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_sju2hjzx4l3bofpqovxfcw3gnq is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_5zyjb7z54fug2f34pmp5g3vd2y (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_5zyjb7z54fug2f34pmp5g3vd2y: restore the original route: constraint failed: injected (1811)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_5zyjb7z54fug2f34pmp5g3vd2y rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_5zyjb7z54fug2f34pmp5g3vd2y is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_waitg7jbizjohfziyomqldibq4 (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_waitg7jbizjohfziyomqldibq4: restore the original route: constraint failed: injected (1811)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_waitg7jbizjohfziyomqldibq4 rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_waitg7jbizjohfziyomqldibq4 is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_g7azsh63s3q4ac6fulbcnp3lsa (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_g7azsh63s3q4ac6fulbcnp3lsa is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_ziaqfuwygjhpa3afqih6hyjrdu (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_ziaqfuwygjhpa3afqih6hyjrdu rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_ziaqfuwygjhpa3afqih6hyjrdu: delete its snapshot: injected failure at delete-snapshot
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_ziaqfuwygjhpa3afqih6hyjrdu is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_ggl2kixlihi7wddtr52konjrsq (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_ggl2kixlihi7wddtr52konjrsq rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_ggl2kixlihi7wddtr52konjrsq is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_n4iofqfzxdqkyas6gxv7wl2x4i (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_n4iofqfzxdqkyas6gxv7wl2x4i rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_n4iofqfzxdqkyas6gxv7wl2x4i: delete the host's replica: injected failure at delete-replica
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_n4iofqfzxdqkyas6gxv7wl2x4i is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_ujgouebls4bagnecpdgl6kpfpi (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_ujgouebls4bagnecpdgl6kpfpi rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_ujgouebls4bagnecpdgl6kpfpi is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_yibspikk36zfofvml2g3b6lhym (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_yibspikk36zfofvml2g3b6lhym rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_yibspikk36zfofvml2g3b6lhym: retire its journal row: constraint failed: injected (1811)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_yibspikk36zfofvml2g3b6lhym is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_utfvtz5izpsrs3on6t5schwvga (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_utfvtz5izpsrs3on6t5schwvga rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_utfvtz5izpsrs3on6t5schwvga: retire its journal row: constraint failed: injected (1811)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_utfvtz5izpsrs3on6t5schwvga is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_olir7uvclhdrguebvjgxyxlerq (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_olir7uvclhdrguebvjgxyxlerq rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_olir7uvclhdrguebvjgxyxlerq is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: mark import sd_olir7uvclhdrguebvjgxyxlerq rolled back: injected failure at cas
2026/10/24 21:42:21 provision: a.shop.example.com: aborted seed sd_olir7uvclhdrguebvjgxyxlerq rolled back (no box had swapped it)
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_btotbnoq62y2uu6oowmj7si7xu (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_btotbnoq62y2uu6oowmj7si7xu rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_btotbnoq62y2uu6oowmj7si7xu is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: aborted seed sd_btotbnoq62y2uu6oowmj7si7xu rolled back (no box had swapped it)
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_ipsd2jgpwrgfmrgtgcoesod3ku (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_ipsd2jgpwrgfmrgtgcoesod3ku rollback deferred: the host is not fenced and stopped yet (<nil>)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_ipsd2jgpwrgfmrgtgcoesod3ku rollback deferred: the host is not fenced and stopped yet (<nil>)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_ipsd2jgpwrgfmrgtgcoesod3ku rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_ipsd2jgpwrgfmrgtgcoesod3ku is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_ixjop62oonbdxxdh6tohxus6rm (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_ixjop62oonbdxxdh6tohxus6rm rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_ixjop62oonbdxxdh6tohxus6rm is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_x46qt4xjh7gufchoceusrwsnda (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_x46qt4xjh7gufchoceusrwsnda rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_x46qt4xjh7gufchoceusrwsnda is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_5x2mly45wzn4rasuecx257gowe (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_5x2mly45wzn4rasuecx257gowe rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_5x2mly45wzn4rasuecx257gowe is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_dcp3tsx6xylfdzjqeuw4drsdoq (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_dcp3tsx6xylfdzjqeuw4drsdoq rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_dcp3tsx6xylfdzjqeuw4drsdoq is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_plyl2ik45je6lriq7jcwlumrmi (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_plyl2ik45je6lriq7jcwlumrmi rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_plyl2ik45je6lriq7jcwlumrmi is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: minted instance route a.shop.example.com (app "other" acct "bac")
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_uewhefmjec7dj3zwyc3uftquea (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_uewhefmjec7dj3zwyc3uftquea rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_uewhefmjec7dj3zwyc3uftquea is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: minted instance route a.shop.example.com (app "other" acct "bac")
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_poi4dllxocubmb3cfdip3vpdpe (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_poi4dllxocubmb3cfdip3vpdpe rolled back to its original route
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_poi4dllxocubmb3cfdip3vpdpe is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: minted instance route a.shop.example.com (app "other" acct "bac")
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_xawu4kmv36zsodeiy5lvjdetxy (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_xawu4kmv36zsodeiy5lvjdetxy has no route on this box: its local data is removed and no route is put back
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_xawu4kmv36zsodeiy5lvjdetxy is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_sh3xvdvaztummiu4kwdorg36sy (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_6kay52qlermd27cmabj3chl4aq (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_f5rzxa4bumclmsc3a3znodm3by (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_f5rzxa4bumclmsc3a3znodm3by cannot roll back on this box: the activator is not wired; it stays journaled and gated
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_zn5o6mbh3h3ggc77c6ay65lkfa (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_zn5o6mbh3h3ggc77c6ay65lkfa is not rolled back: the route changed under the fence, so nothing there is touched
2026/10/24 21:42:21 provision: a.shop.example.com: import "../not-a-seed" names no snapshot and no replica; only its journal row is cleaned up
2026/10/24 21:42:21 provision: a.shop.example.com: import ../not-a-seed is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_yr3b7l3tpfsdcbjxjpk6kikvvu (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_i5gwzkznb5nf37urfzd44qmaie (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_h434ve42xvjadjuparqbgn74tq (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_vwfigehd3fvtpe5gqym5afixxa (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_cqbyevnb6umwjbllmoyqko5rpe (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_cqbyevnb6umwjbllmoyqko5rpe rollback deferred: the host is not fenced and stopped yet (stop evidence unreadable)
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_dllwqlla6qnv4ndaorvvhi32xu (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_dllwqlla6qnv4ndaorvvhi32xu has no route on this box: its local data is removed and no route is put back
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_dllwqlla6qnv4ndaorvvhi32xu is cleaned up and its journal row retired
2026/10/24 21:42:21 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_whrc2gwwgmy4we4xou6jx2ofk4 (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_whrc2gwwgmy4we4xou6jx2ofk4: remove its local data: injected failure at remove-local
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_whrc2gwwgmy4we4xou6jx2ofk4 is not rolled back: the route at the host is not the import's, so nothing there is touched
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_pugjxbzx24tywxm32lakkrqzii (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_pugjxbzx24tywxm32lakkrqzii: a route appeared at the host, so its local database is left and the rollback waits
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_3yvcy2p5uljmmpqauthv36aqee (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_3yvcy2p5uljmmpqauthv36aqee rollback deferred: no fence generation: registry busy
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_2w4okxauybqmsbywjlyuo2ypga (the original route is journaled)
2026/10/24 21:42:21 provision: a.shop.example.com: import sd_2w4okxauybqmsbywjlyuo2ypga rollback deferred: no fence generation: the generation source answered 0
2026/10/24 21:42:21 provision: a.shop.example.com: swapped for import sd_x5qtx2shxdoa2kdgpmhtgo22xu (the original route is journaled)
2026/10/24 21:42:22 provision: a.shop.example.com: swapped for import sd_gy3x46byboquak735uovibgpia (the original route is journaled)
2026/10/24 21:42:22 provision: a.shop.example.com: swapped for import sd_6a5c2ymhdivhmr54g5qh75uhx4 (the original route is journaled)
2026/10/24 21:42:22 provision: a.shop.example.com: import deferred: this box cannot read the instance's env file
2026/10/24 21:42:22 provision: a.shop.example.com: import deferred: the instance's env file could not be read: a symlink
2026/10/24 21:42:22 provision: a.shop.example.com: swapped for import sd_mgvfme5r7xyk7htuc6qwl4u6kq (the original route is journaled)
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_mgvfme5r7xyk7htuc6qwl4u6kq rolled back to its original route
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_mgvfme5r7xyk7htuc6qwl4u6kq is cleaned up and its journal row retired
2026/10/24 21:42:22 provision: a.shop.example.com: swapped for import sd_a7tr63ednhhqrvrmxdzifxxxoq (the original route is journaled)
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_a7tr63ednhhqrvrmxdzifxxxoq rolled back to its original route
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_a7tr63ednhhqrvrmxdzifxxxoq is cleaned up and its journal row retired
2026/10/24 21:42:22 provision: a.shop.example.com: swapped for import sd_xzan7tkoww4m63mopbenhd2fhy (the original route is journaled)
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_xzan7tkoww4m63mopbenhd2fhy rolled back to its original route
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_xzan7tkoww4m63mopbenhd2fhy is cleaned up and its journal row retired
2026/10/24 21:42:22 provision: a.shop.example.com: swapped for import sd_jfrnwshrpmstnfi2lw4yg5crpq (the original route is journaled)
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_jfrnwshrpmstnfi2lw4yg5crpq: retire its instance key: the env file is a symlink
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_jfrnwshrpmstnfi2lw4yg5crpq rolled back to its original route
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_jfrnwshrpmstnfi2lw4yg5crpq is cleaned up and its journal row retired
2026/10/24 21:42:22 provision: a.shop.example.com: swapped for import sd_e5ojxh3kctufowia6gdgfhl3ba (the original route is journaled)
2026/10/24 21:42:22 provision: a.shop.example.com: row is on the nested layout (db "/data/instances/a.shop.example.com/a.shop.example.com.db" socket "/run/carlos/instances/a.shop.example.com/app.sock"); the record's shared paths are not drift
2026/10/24 21:42:22 provision: a.shop.example.com: swapped for import sd_y6dncy4egkkzp22xlyb5d6avga (the original route is journaled)
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_5hvbwa72fomhaot7jkom7azpzy refused: there is no route at a.shop.example.com to replace
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_dugpmppyj2dklkovq6wd6tt3kq refused: the route's address is 127.0.0.1:9, not 127.0.0.1:8401
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_6z6iucvid5uhjoidxybcebb3hi refused: the route's address is 127.0.0.1:8401,127.0.0.1:8402, not 127.0.0.1:8401
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_ma7eduppifktlx2bzni6g4g6ce refused: the route's address is 127.0.0.1:9, not 127.0.0.1:8401
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_nzfi5lcvxzruuzatee3m3x3fsy refused: the route belongs to app other
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_y6vsedanz34mtnipxtfgnlmnva refused: the route is filed under another account
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_rnpcgnfh75rsoeycep24sbdfgu refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_xg3yud54juygn6kqzyqaqg47fe refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_g4ylknac336mfnbmtk3alcepbq refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_n5vsoctm4j4nnnsfwxa5bixyc4 refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_kays56wbhuiyk5h3rvafh56iea refused: the route is not an address route this import can take over (socket)
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_2734lw6ozj3jjispxukcqeuihe refused: the route is not an address route this import can take over (no address)
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_gd73ww4dwef6alb7pvw6i2vfte refused: the route is not an address route this import can take over (provisioned)
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_sheimsmzp4zfgybdqufqiqsz2m refused: the route is not an address route this import can take over (kind static)
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_26doq3ryk54mvemketgoxaibue refused: the route is not an address route this import can take over (backing)
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_vkqgeznlpt5ih5ec2qjpt4kd5q refused: the route is not an address route this import can take over (tunnel)
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_rv7wqltgsmdnr34xk2hddonufq refused: the route is not an address route this import can take over (caps)
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_623xatvyvjusk44jvtckfwwrzu refused: the route is not an address route this import can take over (platform)
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_g5qb34orjm3zfmko2exnlhg5ty refused: the route is not an address route this import can take over (canary)
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_okwxynbibftf6nw5nttezbntyu refused: the route is not an address route this import can take over (kind sidecar)
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_sljlov2fnmw7varynlnthnex5y refused: the route is not an address route this import can take over (region)
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_5gxho7cn7koiaqztxcc63dzp6y refused: the route is not an address route this import can take over (fleet_box)
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_ss72qpwfw3ttunbcq734uydwbm refused: the route is not an address route this import can take over (hibernate)
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_g36bm65n37dwbh2pzb2ipdmfpy refused: the route is not an address route this import can take over (claim_owner)
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_in6rliu7gvqk2phe22u7hlrmke refused: this box does not run instances nested
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_w3ephnlose6cgdfatvol33hi3u refused: this box does not run instances nested
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_6hp4xrlroxftptrvhvopekjxre refused: claim control is on for this box
2026/10/24 21:42:22 provision: a.shop.example.com: swapped for import sd_o3b4kd3zxgkdc7rgmvyujqpir4 (the original route is journaled)
2026/10/24 21:42:22 provision: a.shop.example.com: swapped for import sd_bmkqgepksfr4k6mgtr7evkj4xi (the original route is journaled)
2026/10/24 21:42:22 provision: a.shop.example.com: import deferred: this box cannot read the legacy route assignments
2026/10/24 21:42:22 provision: a.shop.example.com: import deferred: the legacy route assignments could not be read: store down
2026/10/24 21:42:22 provision: a.shop.example.com: not swapping for import sd_fn5jgmdya4slrmxjvi7ykukzsq: its verify hash is not a sha256
2026/10/24 21:42:22 provision: a.shop.example.com: not swapping for import sd_kubu4qfpi6steq2xxygr7r3ena: its verify hash is not a sha256
2026/10/24 21:42:22 provision: a.shop.example.com: not swapping for import sd_vsm7bo35bxik6qvidnte5q6vhy: its verify hash is not a sha256
2026/10/24 21:42:22 provision: a.shop.example.com: not swapping for import sd_../../x: its host or seed id is malformed (seeds: not a seed id)
2026/10/24 21:42:22 provision: A.shop.example.com/..: not swapping for import sd_pk6tneqym5medyr5w3cxcymu2a: its host or seed id is malformed (seeds: not a host)
2026/10/24 21:42:22 provision: a.shop.example.com: not swapping for import sd_3xq3iel6pew5drgrh5kicvcwhu: its record does not describe a nested, hibernating instance
2026/10/24 21:42:22 provision: a.shop.example.com: not swapping for import sd_u4oggimy5g4mclyikrikhdb6xa: its record does not describe a nested, hibernating instance
2026/10/24 21:42:22 provision: a.shop.example.com: not swapping for import sd_zprlyoyd5u2sjgksgqoriz3orm: its record does not describe a nested, hibernating instance
2026/10/24 21:42:22 provision: a.shop.example.com: not swapping for import sd_wcdissm67zyrli6al2llnpggsy: its record does not describe a nested, hibernating instance
2026/10/24 21:42:22 provision: a.shop.example.com: import deferred: the box's layout intent could not be read: store down
2026/10/24 21:42:22 provision: a.shop.example.com: swapped for import sd_dgsi4r7toux4qf3pbvg325qgby (the original route is journaled)
2026/10/24 21:42:22 provision: a.shop.example.com: import deferred: the box's nested probe did not answer: ready probe timed out
2026/10/24 21:42:22 provision: a.shop.example.com: swapped for import sd_kxzgrfrzv5quq3edyf2gxzyga4 (the original route is journaled)
2026/10/24 21:42:22 provision: a.shop.example.com: swapped for import sd_6oylbeo7kcldsxphhcy722qmku (the original route is journaled)
2026/10/24 21:42:22 provision: a.shop.example.com: import deferred: the route is held by operation op_1
2026/10/24 21:42:22 provision: dry-run: would consider swapping a.shop.example.com for import sd_qbz2ssnwsha2vu23vdmz2h7mke
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_3jgqa67mioc3lz4pgrk34khs4a rolled back to its original route
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_3jgqa67mioc3lz4pgrk34khs4a: the host's replica is left alone: the record apps/bac/shop/instances/a.shop.example.com.json holds the host
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_3jgqa67mioc3lz4pgrk34khs4a is cleaned up and its journal row retired
2026/10/24 21:42:22 provision: a.shop.example.com: import sd_ro4imgoslyfqbwqpabeoo5wcfi left alone: the import journal holds seed sd_qg57b6odwdkam76762t7g53mwy at swapped
2026/10/24 21:42:22 provision: a.shop.example.com: not minting import sd_7duhjplux5hfsozww3sjysenua: it is swapped but not committed, and only its swap makes its row
2026/10/24 21:42:22 provision: a.shop.example.com: not minting import sd_6pzozkhoc5qz2nj35gnj6zdwq4: it is placed but not committed, and only its swap makes its row
2026/10/24 21:42:22 provision: a.shop.example.com: swapped for import sd_ejfohbgbhhymoepwx3cejkrqji (the original route is journaled)
2026/10/24 21:42:22 provision: a.shop.example.com: not minting import sd_ejfohbgbhhymoepwx3cejkrqji: it is swapped but not committed, and only its swap makes its row
2026/10/24 21:42:22 provision: a.shop.example.com: not minting import sd_ejfohbgbhhymoepwx3cejkrqji: it is placed but not committed, and only its swap makes its row
2026/10/24 21:42:23 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:42:23 provision: removed retired sidecar route gone.eleven.bac.sidecar.internal (record gone)
2026/10/24 21:42:23 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:42:23 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:42:23 provision: converged sidecar bot.eleven.bac.sidecar.internal args ["sidecar","run"] -> ["worker","run"]
2026/10/24 21:42:23 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:42:23 provision: converged sidecar bot.eleven.bac.sidecar.internal ceilings 300/3600 -> 60/120
2026/10/24 21:42:23 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:42:23 provision: converged sidecar bot.eleven.bac.sidecar.internal channel stable -> canary/eleven
2026/10/24 21:42:23 provision: converged sidecar bot.eleven.bac.sidecar.internal environment "other" -> "relay"
2026/10/24 21:42:23 provision: converged sidecar bot.eleven.bac.sidecar.internal hibernate true -> false
2026/10/24 21:42:23 provision: skipping sidecar record apps/bac/eleven/sidecars/bot.json: read failed: failStore: reads disabled under apps/bac/eleven/sidecars/
2026/10/24 21:42:23 provision: skipping sidecar record apps/bac/eleven/sidecars/bot.json: malformed: invalid character 'n' looking for beginning of object key string
2026/10/24 21:42:23 provision: not removing sidecar bot.eleven.bac.sidecar.internal: its record exists but could not be read cleanly this pass
2026/10/24 21:42:23 provision: skipping sidecar record apps/bac/eleven/sidecars/bot.json: empty channel
2026/10/24 21:42:23 provision: skipping sidecar record apps/bac/eleven/sidecars/held.json: empty channel
2026/10/24 21:42:23 provision: not removing sidecar held.eleven.bac.sidecar.internal: its record exists but could not be read cleanly this pass
2026/10/24 21:42:23 provision: removed retired sidecar route old.eleven.bac.sidecar.internal (record gone)
2026/10/24 21:42:23 provision: bac/eleven has sidecar records but no sidecars manifest — not minting
2026/10/24 21:42:23 provision: bac/eleven is in the trash — not minting sidecar routes for it
2026/10/24 21:42:23 provision: sidecar bot.eleven.bac.sidecar.internal is not placeable here: it asks for "no-inbound" placement and this box accepts inbound work (CARLOS_INBOUND="")
2026/10/24 21:42:23 provision: sidecar hub.relay.bac.sidecar.internal is not placeable here: it asks for "no-inbound" placement and this box accepts inbound work (CARLOS_INBOUND="")
2026/10/24 21:42:23 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:42:23 provision: minted sidecar route hub.relay.bac.sidecar.internal (app "relay" acct "bac" args ["relay"])
2026/10/24 21:42:23 provision: sidecar bot.eleven.bac.sidecar.internal is not placeable here: it asks for "no-inbound" placement and this box accepts inbound work (CARLOS_INBOUND="")
2026/10/24 21:42:23 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:42:23 provision: sidecar bot.eleven.bac.sidecar.internal is not placeable here: it asks for "no-inbound" placement and this box accepts inbound work (CARLOS_INBOUND="")
2026/10/24 21:42:23 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:42:23 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:42:23 provision: sidecar bot.eleven.bac.sidecar.internal is not placeable here: it asks for "no-inbound" placement and this box accepts inbound work (CARLOS_INBOUND="")
2026/10/24 21:42:23 provision: removed retired sidecar route bot.eleven.bac.sidecar.internal (record gone)
2026/10/24 21:42:23 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:42:23 provision: sidecar bot.eleven.bac.sidecar.internal is not placeable here: it asks for "no-inbound" placement and this box accepts inbound work (CARLOS_INBOUND="")
2026/10/24 21:42:23 provision: skipping sidecar record apps/bac/relay/sidecars/hub.json: read failed: failStore: reads disabled under apps/bac/relay/sidecars/
2026/10/24 21:42:23 provision: REFUSING to mint sidecar bot.eleven.bac.sidecar.internal: bot.eleven.bac.sidecar.internal-sidecar.env is staged on this box — the legacy file co-spawn and a native sidecar row are two mechanisms for one host; remove the file to migrate this host onto sidecar records
2026/10/24 21:42:23 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:42:23 provision: dry-run: would mint sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" channel "stable" args ["sidecar","run"])
2026/10/24 21:42:23 provision: dry-run: would remove retired sidecar route gone.eleven.bac.sidecar.internal (record gone)
2026/10/24 21:42:23 provision: bot.eleven.bac.sidecar.internal exists but is not a sidecar row this pass owns (kind "sidecar" provisioned false app "eleven" acct "bac") — leaving it alone
2026/10/24 21:42:23 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:23 provision: converged acme.go.tito.io update settings "{\"updates\":\"manual\",\"channel\":\"stable\"}" -> ""
2026/10/24 21:42:23 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:23 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:23 provision: manifest bac/tito: read failed: provision: manifest bac/tito: unexpected end of JSON input
2026/10/24 21:42:23 provision: manifest bac/tito: read failed: provision: manifest bac/tito: unexpected end of JSON input
2026/10/24 21:42:23 provision: acme.go.tito.io: not minted this pass: the app's update policy could not be read
2026/10/24 21:42:23 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:42:23 provision: manifest bac/tito: read failed: provision: manifest bac/tito: unexpected end of JSON input
2026/10/24 21:42:23 provision: acme.go.tito.io: not minted this pass: the app's update policy could not be read
2026/10/24 21:42:23 provision: minted instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac")
2026/10/24 21:42:23 provision: listing apps/bqd/: listdirs refused — its records are unseen this pass
2026/10/24 21:42:23 provision: record view: change index unusable (release: change index unreadable: store has no conditional read: unsupported operation): the walk records no generations
2026/10/24 21:42:23 provision: listing apps/bqd/: listdirs refused — its records are unseen this pass
2026/10/24 21:42:23 provision: listing apps/bqd/: listdirs refused — its records are unseen this pass
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: listing apps/bqd/: listdirs refused — its records are unseen this pass
2026/10/24 21:42:23 provision: listing apps/bqd/: listdirs refused — its records are unseen this pass
2026/10/24 21:42:23 provision: record view: change index unusable (get refused): walking
2026/10/24 21:42:23 provision: record view: re-reading apps/bqc/shop failed: retrying on the next refresh
2026/10/24 21:42:23 provision: listing apps/bqc/shop/instances/: context canceled — its records are unseen this pass
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: record view: re-reading apps/bqc/shop failed: retrying on the next refresh
2026/10/24 21:42:23 provision: listing apps/bqc/shop/instances/: list refused — its records are unseen this pass
2026/10/24 21:42:23 provision: listing apps/bqc/shop/instances/: list refused — its records are unseen this pass
2026/10/24 21:42:23 provision: an app's records could not be listed: they are skipped
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: record view: change index unusable (release: change index malformed: invalid character 'n' looking for beginning of object key string): walking
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping accounts/bqd/account.json: malformed account manifest: invalid character 'n' looking for beginning of object key string
2026/10/24 21:42:23 provision: skipping accounts/bqd/account.json: malformed account manifest: invalid character 'n' looking for beginning of object key string
2026/10/24 21:42:23 provision: skipping accounts/bqd/account.json: malformed account manifest: invalid character 'n' looking for beginning of object key string
2026/10/24 21:42:23 provision: record view: re-reading accounts/bqd failed: retrying on the next refresh
2026/10/24 21:42:23 provision: skipping accounts/bqd/account.json: read failed: list refused
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: minted instance route one.example.com (app "shop" acct "bum")
2026/10/24 21:42:23 provision: minted instance route one.example.com (app "shop" acct "bum")
2026/10/24 21:42:23 provision: minted instance route one.example.com (app "shop" acct "bum")
2026/10/24 21:42:23 provision: removed retired instance route one.example.com (record gone)
2026/10/24 21:42:23 provision: skipping record apps/bum/shop/instances/one.example.com.json: empty channel
2026/10/24 21:42:23 provision: not removing one.example.com: its record exists but could not be read cleanly this pass
2026/10/24 21:42:23 provision: removed retired instance route one.example.com (record gone)
2026/10/24 21:42:23 provision: skipping record apps/bum/shop/instances/one.example.com.json: empty channel
2026/10/24 21:42:23 provision: not removing one.example.com: its record exists but could not be read cleanly this pass
2026/10/24 21:42:23 provision: record view: change index unusable (context deadline exceeded): walking
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:42:23 provision: record view: change index unusable (context deadline exceeded): the walk records no generations
2026/10/24 21:42:23 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
--- FAIL: TestPlan14RootReadCensus (13.33s)
    plan14_root_reads_test.go:1462: root read census: 32 discrepancies
        changed registry schema
        changed root read internal/domains/aliases.go:deriveInstanceAliases; review class, task, sites and digest
        changed root read internal/provision/reconcile.go:Reconcile; review class, task, sites and digest
        changed root read internal/provision/reconcile.go:RouteFor; review class, task, sites and digest
        changed root read internal/provision/reconcile.go:convergeOwned; review class, task, sites and digest
        changed root read internal/registry/registry.go:Registry.Fingerprint; review class, task, sites and digest
        changed root read internal/registry/registry.go:Registry.SnapshotFingerprint; review class, task, sites and digest
        changed root read internal/registry/registry.go:Registry.Upsert; review class, task, sites and digest
        changed root read internal/registry/registry.go:Registry.migrate; review class, task, sites and digest
        changed root read internal/registry/registry.go:routeArgs; review class, task, sites and digest
        changed root read internal/registry/registry.go:scanRoute; review class, task, sites and digest
        changed root read internal/registry/remote_dispatch.go:Registry.dispatchRemote; review class, task, sites and digest
        changed root source envelope internal/domains
        changed root source envelope internal/edgesfile
        changed root source envelope internal/host
        changed root source envelope internal/provision
        changed root source envelope internal/registry
        stale root read internal/domains/aliases.go:ReconcileAliases
        unclassified root read internal/domains/aliases.go:ReconcileAliasesReport registry:Account@15690,registry:Account@15703,registry:Alias@15283,registry:Alias@15323,registry:Alias@15393,registry:App@12502,registry:App@12702,registry:App@12858,registry:App@13059,registry:App@15716,registry:App@15725,registry:App@2553,registry:App@2749,registry:App@6373,registry:App@6572,registry:Host@15675,registry:Host@15986,registry:Host@16039,registry:Host@16111,registry:Host@16645,registry:Host@16758,registry:Host@16817,registry:Host@16898,registry:Host@724,registry:Prefix@16653,registry:Prefix@16772,registry:Prefix@16825,registry:Prefix@16906,registry:Status@9236,whole:Route@12471,whole:Route@12546,whole:Route@12693,whole:Route@12755,whole:Route@12898,whole:Route@13054,whole:Route@13950,whole:Route@15045,whole:Route@15053,whole:Route@1896,whole:Route@2593,whole:Route@2744,whole:Route@2800,whole:Route@5719,whole:Route@6417,whole:Route@6563,whole:Route@677,whole:Route@706,whole:Route@717,whole:Route@735,whole:Route@844,whole:Route@8566,whole:Route@9018,whole:Route@9180,whole:RouteAlias@15061,whole:RouteAlias@15258,whole:RouteAlias@852,whole:RoutePath@10763,whole:RoutePath@16538,whole:RoutePath@16580,whole:RoutePath@16715,whole:RoutePath@16745,whole:WildcardDomain@13270,whole:WildcardDomain@15605,whole:WildcardDomain@15654,whole:WildcardDomain@15817,whole:WildcardDomain@15945,whole:WildcardDomain@15974
        unclassified root read internal/domains/aliases.go:relevantDropped registry:Account@944,registry:Alias@728,registry:Alias@749,registry:Alias@810,registry:Alias@875,registry:Host@605,whole:Route@304,whole:Route@335,whole:Route@374,whole:Route@590,whole:Route@652,whole:RouteAlias@707
        unclassified root read internal/provision/provision.go:NewAssetGen file:Read@66
        unclassified root read internal/registry/registry.go:Registry.SetAssets file:Exec@239,registry:remote@106,registry:remote@76,registry:sql@239,whole:remoteClient@108,whole:remoteClient@78
        changed legacy declaration internal/domains/aliases.go:ReconcileAliases
        changed legacy declaration internal/domains/aliases.go:deriveInstanceAliases
        changed legacy declaration internal/provision/reconcile.go:Reconcile
        changed legacy declaration internal/provision/reconcile.go:convergeOwned
        changed legacy declaration internal/registry/registry.go:Registry.Fingerprint
        changed legacy declaration internal/registry/registry.go:Registry.SnapshotFingerprint
        changed legacy declaration internal/registry/registry.go:Registry.migrate
        changed legacy declaration internal/registry/registry.go:scanRoute
        changed reclassified declaration internal/registry/registry.go:Registry.Upsert
        changed reclassified declaration internal/registry/remote_dispatch.go:Registry.dispatchRemote
FAIL
FAIL	github.com/carlosframework/platform/internal/provision	22.646s
ok  	github.com/carlosframework/platform/internal/publicrelease	0.010s
?   	github.com/carlosframework/platform/internal/regionname	[no test files]
ok  	github.com/carlosframework/platform/internal/registry	6.007s
ok  	github.com/carlosframework/platform/internal/relay	7.238s
ok  	github.com/carlosframework/platform/internal/release	25.259s
ok  	github.com/carlosframework/platform/internal/rollout	3.822s
ok  	github.com/carlosframework/platform/internal/rolloutwords	0.004s
ok  	github.com/carlosframework/platform/internal/rootaws	0.007s
ok  	github.com/carlosframework/platform/internal/rootparticipation	0.060s
ok  	github.com/carlosframework/platform/internal/rootstate	0.032s
ok  	github.com/carlosframework/platform/internal/runs	0.549s
ok  	github.com/carlosframework/platform/internal/s3compat	0.006s
ok  	github.com/carlosframework/platform/internal/safefile	0.004s
ok  	github.com/carlosframework/platform/internal/schedule	2.760s
ok  	github.com/carlosframework/platform/internal/seeds	0.012s
ok  	github.com/carlosframework/platform/internal/sim/engines	2.476s
ok  	github.com/carlosframework/platform/internal/sim/hostlife	10.220s
ok  	github.com/carlosframework/platform/internal/sim/litestreamfacts	4.371s
ok  	github.com/carlosframework/platform/internal/status	0.084s
ok  	github.com/carlosframework/platform/internal/steering	0.007s
ok  	github.com/carlosframework/platform/internal/stopevidence	0.729s
ok  	github.com/carlosframework/platform/internal/svcrole	0.003s
ok  	github.com/carlosframework/platform/internal/telemetry	0.004s
ok  	github.com/carlosframework/platform/internal/termfence	0.005s
ok  	github.com/carlosframework/platform/internal/tunnelclient	0.006s
ok  	github.com/carlosframework/platform/internal/unixdial	0.003s
ok  	github.com/carlosframework/platform/internal/updatewords	0.008s
ok  	github.com/carlosframework/platform/internal/usage	0.005s
ok  	github.com/carlosframework/platform/internal/version	0.002s
ok  	github.com/carlosframework/platform/internal/vet	1.682s
FAIL
=== internal_console@0 (80 s)
ok  	github.com/carlosframework/platform/internal/console	78.756s
=== internal_console@1 (44 s)
ok  	github.com/carlosframework/platform/internal/console	42.178s
=== internal_console@2 (41 s)
ok  	github.com/carlosframework/platform/internal/console	39.897s
=== internal_console@3 (42 s)
ok  	github.com/carlosframework/platform/internal/console	40.686s
=== internal_console@4 (43 s)
ok  	github.com/carlosframework/platform/internal/console	41.325s
=== internal_console@5 (41 s)
ok  	github.com/carlosframework/platform/internal/console	39.252s
=== internal_console@6 (38 s)
ok  	github.com/carlosframework/platform/internal/console	36.364s
=== internal_console@7 (46 s)
ok  	github.com/carlosframework/platform/internal/console	44.534s
=== root@0 (101 s)
ok  	github.com/carlosframework/platform	99.925s
=== root@1 (91 s)
ok  	github.com/carlosframework/platform	89.525s
=== root@2 (92 s)
ok  	github.com/carlosframework/platform	90.808s

FAILED: rest
make: *** [Makefile:19: test] Error 1

amadan: step gate failed: exit status 2

amadan: job failed at step gate — its output is above, not at the tail of this log
diff --git a/internal/domains/aliases.go b/internal/domains/aliases.go
index 6df3710fe..af34935ab 100644
--- a/internal/domains/aliases.go
+++ b/internal/domains/aliases.go
@@ -253,7 +253,67 @@ func ReconcileAliases(ctx context.Context, s release.Store, reg *registry.Regist
// behaviour is unchanged (a failed claim listing is still an error, and an
// errored pass is never complete).
type AliasReport struct {
+ // Complete is the pass's answer; written by ReconcileAliasesReport.
Complete bool
+ // DeploymentRoutesPartial is an INPUT, set by the caller before the pass:
+ // the deploymentRoutes it passes came from a read that skipped an
+ // unusable edges file (edgesfile.DeploymentRoutesComplete said so). The
+ // map is non-nil and still used, but it may be missing the very route a
+ // claim conflicts with, so the pass cannot vouch for it.
+ DeploymentRoutesPartial bool
+}
+
+// relevantDropped returns the hosts of the listed-but-unread claims that the
+// pass cannot afford to have missed. A claim whose GET failed, or whose body
+// is unparseable or from a newer schema, always counts: nothing says it is
+// not ours. A claim whose GET said "does not exist" is the shape of the fleet
+// store door withholding a foreign account's (or a pending) body behind a
+// listing that still shows its name; that reaches this box's tables only
+// through an account with a route here, since every derivation requires the
+// claim's tenancy to match a local route's. So a not-found claim counts only
+// if some account it is tied to owns a route in this registry. The account is
+// found from what the pass already holds: a local route on the claim's own
+// host, an alias row for the host (plain, catch-all star, or an instance name
+// under a catch-all parent), or an earlier cached read of the claim. A
+// not-found claim tied to no account is not counted. The name reservation
+// from the listing is separate and unchanged.
+func relevantDropped(dropped []droppedClaim, routes []registry.Route, aliases []registry.RouteAlias) []string {
+ var out []string
+ var owns map[string]bool
+ for _, d := range dropped {
+ if !d.notFound {
+ out = append(out, d.host)
+ continue
+ }
+ if owns == nil {
+ owns = make(map[string]bool, len(routes))
+ for _, rt := range routes {
+ owns[release.RouteAccount(rt)] = true
+ }
+ }
+ parent, isCatchall := ParseInstanceCatchallHost(d.host)
+ isCatchall = isCatchall && InstanceCatchallHost(parent) == d.host
+ matters := d.account != "" && owns[d.account]
+ for _, rt := range routes {
+ if rt.Host == d.host && owns[release.RouteAccount(rt)] {
+ matters = true
+ }
+ }
+ for _, a := range aliases {
+ tied := a.Alias == d.host || a.Alias == "*."+d.host
+ if isCatchall && strings.HasSuffix(a.Alias, "."+parent) &&
+ !strings.Contains(strings.TrimSuffix(a.Alias, "."+parent), ".") {
+ tied = true
+ }
+ if tied && owns[a.Account] {
+ matters = true
+ }
+ }
+ if matters {
+ out = append(out, d.host)
+ }
+ }
+ return out
}
// ReconcileAliasesReport is ReconcileAliases plus a completeness report. A
@@ -264,9 +324,12 @@ type AliasReport struct {
// - the label count for an instance catch-all failed
// - an alias, instance alias, catch-all alias, wildcard or path upsert failed
// - an alias, wildcard or path delete failed
-// - a listed claim yielded no claim (unreadable, unparseable, newer schema)
-// - deploymentRoutes is nil: its read failed, so the "another box serves
-// this as a route" guard was off for the pass
+// - a listed claim yielded no claim and the pass cannot rule it out
+// (relevantDropped: any read error, unparseable body or newer schema; a
+// not-found body only when its account owns a route on this box)
+// - deploymentRoutes is nil (its read failed, so the "another box serves
+// this as a route" guard was off for the pass) or rep.DeploymentRoutesPartial
+// says the read skipped an unusable edges file
//
// Refusals that are decisions on bytes the pass did read (a reserved suffix, a
// tenancy mismatch, a cap) are not incomplete: the same input refuses the same
@@ -277,15 +340,11 @@ func ReconcileAliasesReport(ctx context.Context, s release.Store, reg *registry.
}
// incomplete is set at every point that logs a failure and carries on;
// the report is written once, at the end.
- incomplete := deploymentRoutes == nil
+ incomplete := deploymentRoutes == nil || (rep != nil && rep.DeploymentRoutesPartial)
claims, listed, dropped, err := cache.listWithHosts(ctx, s)
if err != nil {
return err
}
- if dropped > 0 {
- log.Printf("domains: %d claim(s) listed but unreadable this pass — the pass is incomplete", dropped)
- incomplete = true
- }
routes, err := reg.List()
if err != nil {
return err
@@ -298,6 +357,10 @@ func ReconcileAliasesReport(ctx context.Context, s release.Store, reg *registry.
if err != nil {
return err
}
+ if h := relevantDropped(dropped, routes, existing); len(h) > 0 {
+ log.Printf("domains: %d claim(s) listed but unreadable this pass (e.g. %s) — the pass is incomplete", len(h), h[0])
+ incomplete = true
+ }
desired := map[string]bool{}
desiredWild := map[string]registry.WildcardDomain{}
desiredPaths := map[string]registry.RoutePath{} // key: host + "\x00" + prefix
diff --git a/internal/domains/aliases_complete_test.go b/internal/domains/aliases_complete_test.go
index 166a9506e..1f08310ab 100644
--- a/internal/domains/aliases_complete_test.go
+++ b/internal/domains/aliases_complete_test.go
@@ -42,6 +42,7 @@ func newAliasEnv(t *testing.T) *aliasEnv {
if err != nil {
t.Fatal(err)
}
+ t.Cleanup(func() { reg.Close() })
return &aliasEnv{t: t, root: root, store: release.NewDirStore(root), reg: reg, path: path}
}
@@ -485,3 +486,129 @@ func TestAliasReportIncompleteWhenThePassErrors(t *testing.T) {
t.Fatal("an errored pass reported complete")
}
}
+
+// TestAliasReportIncompleteWhenDeploymentRoutesArePartial: a non-nil
+// deploymentRoutes built from a read that skipped an unusable edges file
+// (the caller says so through the report) cannot be vouched for, because the
+// skipped file may name the conflicting route. The map is still used.
+func TestAliasReportIncompleteWhenDeploymentRoutesArePartial(t *testing.T) {
+ e := newAliasEnv(t)
+ addRoute(t, e.reg, "shop.example.com", "abc", "shop")
+ putClaim(t, e.store, Claim{Host: "www.example.com", Account: "abc", App: "shop", Route: "shop.example.com"})
+ rep := AliasReport{Complete: true, DeploymentRoutesPartial: true}
+ if err := ReconcileAliasesReport(context.Background(), e.store, e.reg, aliasNow(), known(), nil, &rep); err != nil {
+ t.Fatal(err)
+ }
+ if rep.Complete {
+ t.Fatal("a partial deployment-route read was reported complete")
+ }
+ if _, ok := aliasMap(t, e.reg)["www.example.com"]; !ok {
+ t.Fatal("a partial route set is still used: the alias should derive")
+ }
+ rep = AliasReport{Complete: true}
+ if err := ReconcileAliasesReport(context.Background(), e.store, e.reg, aliasNow(), known(), nil, &rep); err != nil || !rep.Complete {
+ t.Fatalf("control: complete=%v err=%v", rep.Complete, err)
+ }
+}
+
+// withholdStore answers NotExist for the named claim keys, the way the fleet
+// store door does for a foreign account's claim or a pending one (it lists
+// every name but 404s the body).
+type withholdStore struct {
+ *release.DirStore
+ keys map[string]bool
+}
+
+func (w withholdStore) Get(ctx context.Context, key string) ([]byte, string, error) {
+ if w.keys[key] {
+ return nil, "", fmt.Errorf("fleet door: %s: %w", key, os.ErrNotExist)
+ }
+ return w.DirStore.Get(ctx, key)
+}
+
+// TestAliasReportFleetWithheldClaims: the fleet door lists every claim name
+// and 404s the bodies it will not show. That is expected for a foreign
+// account, and it must not stop a healthy fleet box from ever confirming; a
+// withheld body that could matter locally still makes the pass incomplete. The
+// name reservation from the listing is untouched either way.
+func TestAliasReportFleetWithheldClaims(t *testing.T) {
+ cached := map[string]bool{"plain": false, "cached": true}
+ for name, useCache := range cached {
+ cache := func() *ClaimCache {
+ if useCache {
+ return &ClaimCache{}
+ }
+ return nil
+ }
+ t.Run(name+"/a foreign account with no local route is complete and still reserves the name", func(t *testing.T) {
+ e := newAliasEnv(t)
+ putClaim(t, e.store, Claim{Host: "example.com", Account: "abc", App: "shop-site"})
+ putClaim(t, e.store, Claim{Host: "*.example.com", Account: "abc", App: "shop", Instances: true})
+ addInstance(t, e.reg, "acme.abc.carlos.example.net", "acme", "abc", "shop")
+ addInstance(t, e.reg, "beta.abc.carlos.example.net", "beta", "abc", "shop")
+ // xyz holds acme.example.com and has no route on this box.
+ putClaim(t, e.store, Claim{Host: "acme.example.com", Account: "xyz", App: "other"})
+ // A second foreign claim that is pending: the door withholds it too.
+ putClaim(t, e.store, Claim{Host: "later.example.org", Account: "xyz", App: "other", Pending: true})
+ fleet := withholdStore{e.store, map[string]bool{
+ ClaimKey("acme.example.com"): true, ClaimKey("later.example.org"): true}}
+ rep, err := e.pass(fleet, known(), cache())
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !rep.Complete {
+ t.Fatal("a foreign account's withheld claim, with no local route, blocked confirmation")
+ }
+ got := aliasMap(t, e.reg)
+ if _, ok := got["acme.example.com"]; ok {
+ t.Fatalf("the foreign claim's name was lost to the catch-all: %+v", got)
+ }
+ if got["beta.example.com"].Host != "beta.abc.carlos.example.net" {
+ t.Fatalf("the unclaimed name did not derive: %+v", got)
+ }
+ })
+
+ t.Run(name+"/a withheld body for an account that owns a local route is incomplete", func(t *testing.T) {
+ e := newAliasEnv(t)
+ addRoute(t, e.reg, "shop.example.com", "abc", "shop")
+ putClaim(t, e.store, Claim{Host: "www.example.com", Account: "abc", App: "shop", Route: "shop.example.com"})
+ e.mustPass() // the alias is derived and now ties the claim to abc
+ fleet := withholdStore{e.store, map[string]bool{ClaimKey("www.example.com"): true}}
+ rep, err := e.pass(fleet, known(), cache())
+ if err != nil {
+ t.Fatal(err)
+ }
+ if rep.Complete {
+ t.Fatal("a body withheld for a local account was reported complete")
+ }
+ })
+
+ t.Run(name+"/a withheld body on a local route's own host is incomplete", func(t *testing.T) {
+ e := newAliasEnv(t)
+ addRoute(t, e.reg, "shop.example.com", "abc", "shop")
+ addRoute(t, e.reg, "api.example.com", "abc", "shop")
+ putClaim(t, e.store, Claim{Host: "shop.example.com", Account: "abc", App: "shop", Route: "shop.example.com",
+ Paths: map[string]string{"api": "api.example.com"}})
+ fleet := withholdStore{e.store, map[string]bool{ClaimKey("shop.example.com"): true}}
+ rep, err := e.pass(fleet, known(), cache())
+ if err != nil {
+ t.Fatal(err)
+ }
+ if rep.Complete {
+ t.Fatal("a body withheld on a local route's host was reported complete")
+ }
+ })
+ }
+
+ t.Run("an unparseable body is incomplete whoever it belongs to", func(t *testing.T) {
+ e := newAliasEnv(t)
+ addRoute(t, e.reg, "shop.example.com", "abc", "shop")
+ if _, err := e.store.Put(context.Background(), ClaimKey("theirs.example.org"), []byte("{not json"), ""); err != nil {
+ t.Fatal(err)
+ }
+ rep, err := e.pass(e.store, known(), nil)
+ if err != nil || rep.Complete {
+ t.Fatalf("complete=%v err=%v, want incomplete", rep.Complete, err)
+ }
+ })
+}
diff --git a/internal/domains/claimcache.go b/internal/domains/claimcache.go
index 5b0d026d7..322990ad7 100644
--- a/internal/domains/claimcache.go
+++ b/internal/domains/claimcache.go
@@ -94,34 +94,35 @@ func claimHostFromKey(key string) string {
// the claims, and deciding from those would let a default take the name for
// that pass — failing open on exactly the blip it should ride out.
//
-// dropped counts the listed keys that produced no claim this pass, for any
-// reason: the GET failed, the object had gone by the time it was read, the
-// body was unparseable, or its schema is newer than this binary. A claim the
-// pass could not read is a claim it did not decide on, so a caller that
-// reports completeness (ReconcileAliasesReport) must treat dropped > 0 as an
-// incomplete pass. It counts carried-forward entries too: a cached skip is
-// still a claim nobody read.
-func (c *ClaimCache) listWithHosts(ctx context.Context, s release.Store) (claims []Claim, hosts map[string]bool, dropped int, err error) {
+// dropped names the listed keys that produced no claim this pass, for any
+// reason: the GET failed, the object was not there (the fleet door's 404 for
+// a body it will not show, or a claim detached since the listing), the body
+// was unparseable, or its schema is newer than this binary. A claim the pass
+// could not read is a claim it did not decide on; a caller that reports
+// completeness (ReconcileAliasesReport) decides which of them matter. It
+// includes carried-forward entries: a cached skip is still a claim nobody
+// read.
+func (c *ClaimCache) listWithHosts(ctx context.Context, s release.Store) (claims []Claim, hosts map[string]bool, dropped []droppedClaim, err error) {
lister, ok := s.(release.ModLister)
if c == nil || !ok {
keys, err := s.List(ctx, ClaimsPrefix)
if err != nil {
- return nil, nil, 0, fmt.Errorf("domains: list claims: %w", err)
+ return nil, nil, nil, fmt.Errorf("domains: list claims: %w", err)
}
hosts = make(map[string]bool, len(keys))
for _, key := range keys {
hosts[claimHostFromKey(key)] = true
- if cl, ok, _ := readClaim(ctx, s, key); ok {
+ if cl, ok, _, notFound := readClaimDetail(ctx, s, key); ok {
claims = append(claims, cl)
} else {
- dropped++
+ dropped = append(dropped, droppedClaim{host: claimHostFromKey(key), notFound: notFound})
}
}
return claims, hosts, dropped, nil
}
listed, err := lister.ListMod(ctx, ClaimsPrefix)
if err != nil {
- return nil, nil, 0, err
+ return nil, nil, nil, err
}
hosts = make(map[string]bool, len(listed))
for _, km := range listed {
@@ -141,15 +142,21 @@ func (c *ClaimCache) listWithHosts(ctx context.Context, s release.Store) (claims
if !hit.skipped {
claims = append(claims, hit.claim)
} else {
- dropped++
+ dropped = append(dropped, droppedClaim{host: claimHostFromKey(km.Key)})
}
continue
}
- claim, ok, firm := readClaim(ctx, s, km.Key)
+ claim, ok, firm, notFound := readClaimDetail(ctx, s, km.Key)
if ok {
claims = append(claims, claim)
} else {
- dropped++
+ d := droppedClaim{host: claimHostFromKey(km.Key), notFound: notFound}
+ // What an earlier read of this key said, if one was cached: the
+ // only way to know whose claim an unreadable body is.
+ if prev, had := c.entries[km.Key]; had && !prev.skipped {
+ d.account = prev.claim.Account
+ }
+ dropped = append(dropped, d)
}
if !firm {
// The read itself failed. Remembering that would hide a good
@@ -170,6 +177,16 @@ func (c *ClaimCache) listWithHosts(ctx context.Context, s release.Store) (claims
return claims, hosts, dropped, nil
}
+// droppedClaim is a listed claim key that produced no claim this pass.
+type droppedClaim struct {
+ host string
+ // notFound: the GET answered "does not exist". Every other reason (a
+ // store error, an unparseable body, a newer schema) leaves notFound false.
+ notFound bool
+ // account is the claim's account when an earlier cached read knew it.
+ account string
+}
+
// Reset drops everything. Nothing in this package needs it; it exists so a
// caller whose store changed underneath it (a test, a reconfiguration) can
// say so explicitly rather than construct a new cache and lose the field.
diff --git a/internal/domains/claims.go b/internal/domains/claims.go
index 1de2720dc..92b701d77 100644
--- a/internal/domains/claims.go
+++ b/internal/domains/claims.go
@@ -583,6 +583,16 @@ func ListClaims(ctx context.Context, s release.Store) ([]Claim, error) {
// of what counts as a claim — which would show up as a hostname that appears
// on a cached read and vanishes on an uncached one.
func readClaim(ctx context.Context, s release.Store, key string) (c Claim, ok, firm bool) {
+ c, ok, firm, _ = readClaimDetail(ctx, s, key)
+ return c, ok, firm
+}
+
+// readClaimDetail is readClaim plus notFound: the GET said the object does
+// not exist. That is the one failure the fleet store door uses on purpose (a
+// foreign account's or a pending claim's body is a 404 behind a listing that
+// shows its name), so a caller that reports completeness needs it apart from
+// a store error, an unparseable body or a schema this binary cannot read.
+func readClaimDetail(ctx context.Context, s release.Store, key string) (c Claim, ok, firm, notFound bool) {
raw, _, err := s.Get(ctx, key)
if err != nil {
// Not-found is quiet: a claim detached between the listing and this
@@ -592,17 +602,17 @@ func readClaim(ctx context.Context, s release.Store, key string) (c Claim, ok, f
if !errors.Is(err, os.ErrNotExist) {
log.Printf("domains: claim %s: %v", key, err)
}
- return Claim{}, false, false
+ return Claim{}, false, false, errors.Is(err, os.ErrNotExist)
}
if err := json.Unmarshal(raw, &c); err != nil {
log.Printf("domains: claim %s: unparseable: %v", key, err)
- return Claim{}, false, true
+ return Claim{}, false, true, false
}
if c.Schema > 1 {
log.Printf("domains: claim %s: schema %d is newer than this binary understands, skipping", key, c.Schema)
- return Claim{}, false, true
+ return Claim{}, false, true, false
}
- return c, true, true
+ return c, true, true, false
}
// hostLabelRe mirrors provision.labelRe (which itself mirrors
diff --git a/internal/edgesfile/fold.go b/internal/edgesfile/fold.go
index 292313379..a0551a17c 100644
--- a/internal/edgesfile/fold.go
+++ b/internal/edgesfile/fold.go
@@ -4,6 +4,7 @@ import (
"context"
"log"
"slices"
+ "strings"
"time"
"github.com/carlosframework/platform/internal/release"
@@ -123,14 +124,29 @@ func EdgeIPs(ctx context.Context, s release.Store, env []string, now time.Time)
// layers; this one is the only one that can act across boxes, but it must not
// be able to break ordinary attach when the bucket is unavailable.
func DeploymentRoutes(ctx context.Context, s release.Store, now time.Time) map[string]bool {
+ out, _ := DeploymentRoutesComplete(ctx, s, now)
+ return out
+}
+
+// DeploymentRoutesComplete is DeploymentRoutes plus whether the answer is
+// WHOLE. complete is false when the route set is nil (nothing could be read)
+// and also when the set is partial: an edges file of a live box that could be
+// listed but not read or not parsed. DeploymentRoutes skips such a file and
+// still returns a non-nil map, which is right for its best-effort callers (a
+// bucket blip must not break attach) but is not something a caller that
+// vouches for its decisions (the alias pass's completeness report) can treat
+// as the full set: the skipped file may be the one that names the conflicting
+// route. A file that fails for a box with no fresh snapshot is not counted:
+// the fold would have discarded it anyway.
+func DeploymentRoutesComplete(ctx context.Context, s release.Store, now time.Time) (routes map[string]bool, complete bool) {
if s == nil {
- return nil
+ return nil, false
}
live := map[string]bool{}
boxes, err := status.LoadBoxes(ctx, s)
if err != nil {
log.Printf("edgesfile: could not load box snapshots (%v) — deployment route set unknown this pass", err)
- return nil
+ return nil, false
}
for _, b := range boxes {
if !status.BoxStale(b, now, status.SnapshotPeriod) {
@@ -140,19 +156,29 @@ func DeploymentRoutes(ctx context.Context, s release.Store, now time.Time) map[s
keys, err := s.List(ctx, Prefix)
if err != nil {
log.Printf("edgesfile: could not list %s (%v) — deployment route set unknown this pass", Prefix, err)
- return nil
+ return nil, false
}
out := map[string]bool{}
+ complete = true
joined := 0
for _, key := range keys {
+ // The box a key names (Key's inverse), for deciding whether an
+ // unreadable file matters: only a live box's file does.
+ keyBox := strings.TrimSuffix(strings.TrimPrefix(key, Prefix), ".json")
body, _, err := s.Get(ctx, key)
if err != nil {
log.Printf("edgesfile: %s: %v", key, err)
+ if live[keyBox] {
+ complete = false
+ }
continue
}
f, err := Parse(body)
if err != nil {
log.Printf("edgesfile: %s: %v", key, err)
+ if live[keyBox] {
+ complete = false
+ }
continue
}
if !live[f.Box] {
@@ -177,5 +203,5 @@ func DeploymentRoutes(ctx context.Context, s release.Store, now time.Time) map[s
if len(keys) > 0 && joined == 0 {
log.Printf("edgesfile: %d edges file(s) under %s but no fresh box snapshot matched any of them — the deployment route set is EMPTY this pass, so hostname claims are unchecked against other boxes' routes (are edges and status in different buckets? see CARLOS_STATUS_BUCKET/CARLOS_STATUS_PREFIX)", len(keys), Prefix)
}
- return out
+ return out, complete
}
diff --git a/internal/edgesfile/fold_complete_test.go b/internal/edgesfile/fold_complete_test.go
new file mode 100644
index 000000000..5bf0a240e
--- /dev/null
+++ b/internal/edgesfile/fold_complete_test.go
@@ -0,0 +1,108 @@
+package edgesfile
+
+import (
+ "context"
+ "errors"
+ "testing"
+ "time"
+
+ "github.com/carlosframework/platform/internal/release"
+)
+
+// getFailStore fails GET of one key and nothing else: a transient bucket
+// error on one box's edges file.
+type getFailStore struct {
+ release.Store
+ key string
+}
+
+func (g getFailStore) Get(ctx context.Context, key string) ([]byte, string, error) {
+ if key == g.key {
+ return nil, "", errors.New("synthetic read failure")
+ }
+ return g.Store.Get(ctx, key)
+}
+
+// Two boxes are live; the second one's edges file is the one that goes wrong.
+// DeploymentRoutes (best-effort, other callers) keeps returning the partial
+// map. DeploymentRoutesComplete says it is partial, because the skipped file
+// may be the one that names the conflicting route. Real fold, real
+// status.WriteBox snapshots, real parser: no stand-in for the code under test.
+func TestDeploymentRoutesCompleteSaysSoWhenALiveBoxFileIsUnusable(t *testing.T) {
+ now := time.Date(2026, 8, 27, 12, 0, 0, 0, time.UTC)
+ setup := func(t *testing.T) release.Store {
+ s := foldTestStore(t)
+ putEdgesFile(t, s, "annie", `{"v":1,"box":"annie","eip":"1.1.1.1","hosts":{"shop.example.com":{"role":"home"}}}`)
+ putEdgesFile(t, s, "bert", `{"v":1,"box":"bert","eip":"2.2.2.2","hosts":{"api.example.com":{"role":"home"}}}`)
+ putFreshBox(t, s, "annie", now)
+ putFreshBox(t, s, "bert", now)
+ return s
+ }
+
+ t.Run("control: both files fine", func(t *testing.T) {
+ got, complete := DeploymentRoutesComplete(context.Background(), setup(t), now)
+ if !complete || !got["shop.example.com"] || !got["api.example.com"] {
+ t.Fatalf("routes=%v complete=%v, want both routes and complete", got, complete)
+ }
+ })
+
+ cases := []struct {
+ name string
+ make func(t *testing.T) release.Store
+ }{
+ {"unreadable file", func(t *testing.T) release.Store {
+ return getFailStore{setup(t), Key("bert")}
+ }},
+ {"malformed file", func(t *testing.T) release.Store {
+ s := setup(t)
+ if err := s.Delete(context.Background(), Key("bert")); err != nil {
+ t.Fatal(err)
+ }
+ putEdgesFile(t, s, "bert", `{not json`)
+ return s
+ }},
+ }
+ for _, c := range cases {
+ t.Run(c.name, func(t *testing.T) {
+ s := c.make(t)
+ got, complete := DeploymentRoutesComplete(context.Background(), s, now)
+ if complete {
+ t.Fatalf("routes=%v: a partial read was reported complete", got)
+ }
+ if !got["shop.example.com"] || got["api.example.com"] {
+ t.Fatalf("routes=%v, want the readable box's route only", got)
+ }
+ // The existing function is unchanged for its other callers: the
+ // same partial, non-nil map.
+ if old := DeploymentRoutes(context.Background(), s, now); !old["shop.example.com"] || len(old) != 1 {
+ t.Fatalf("DeploymentRoutes = %v, want the unchanged best-effort map", old)
+ }
+ })
+ }
+}
+
+// A retired box's unusable file is not evidence of anything, so it does not
+// make the read partial: the fold would have thrown that file away unread.
+func TestDeploymentRoutesCompleteIgnoresAnUnusableFileOfARetiredBox(t *testing.T) {
+ now := time.Date(2026, 8, 27, 12, 0, 0, 0, time.UTC)
+ s := foldTestStore(t)
+ putEdgesFile(t, s, "annie", `{"v":1,"box":"annie","eip":"1.1.1.1","hosts":{"shop.example.com":{"role":"home"}}}`)
+ putEdgesFile(t, s, "retired", `{not json`)
+ putFreshBox(t, s, "annie", now)
+ putFreshBox(t, s, "retired", now.Add(-72*time.Hour))
+ got, complete := DeploymentRoutesComplete(context.Background(), s, now)
+ if !complete || !got["shop.example.com"] {
+ t.Fatalf("routes=%v complete=%v, want complete", got, complete)
+ }
+}
+
+// Nothing readable at all is incomplete too (and nil), as before.
+func TestDeploymentRoutesCompleteIsFalseWhenNothingCanBeRead(t *testing.T) {
+ now := time.Date(2026, 8, 27, 12, 0, 0, 0, time.UTC)
+ for name, s := range map[string]release.Store{"nil store": nil, "broken store": brokenStore{}} {
+ got, complete := DeploymentRoutesComplete(context.Background(), s, now)
+ if got != nil || complete {
+ t.Errorf("%s: routes=%v complete=%v, want nil and false", name, got, complete)
+ }
+ }
+}
diff --git a/internal/host/agent.go b/internal/host/agent.go
index ef5e93ddf..ee9104601 100644
--- a/internal/host/agent.go
+++ b/internal/host/agent.go
@@ -3611,8 +3611,11 @@ func instancesLoop(reg *registry.Registry, writes hostwrite.Config, bs *buildSta
plansPass(ctx, store, reg, os.Getenv)
runMovesPass(ctx, store)
runRunsPass(ctx)
- deploymentRoutes := edgesfile.DeploymentRoutes(ctx, store, time.Now())
- if err := domains.ReconcileAliases(ctx, store, reg, time.Now, deploymentRoutes, &aliasClaimCache); err != nil {
+ deploymentRoutes, routesWhole := edgesfile.DeploymentRoutesComplete(ctx, store, time.Now())
+ // The report carries "the route read was partial" into the pass;
+ // Task 8 reads its Complete to feed the domain confirmed time.
+ aliasRep := domains.AliasReport{DeploymentRoutesPartial: deploymentRoutes != nil && !routesWhole}
+ if err := domains.ReconcileAliasesReport(ctx, store, reg, time.Now, deploymentRoutes, &aliasClaimCache, &aliasRep); err != nil {
log.Printf("agent: instances alias pass: %v", err)
}
if !isFleetBox {
diff --git a/internal/host/changeindex.go b/internal/host/changeindex.go
index 4fd0289bd..1a821de3d 100644
--- a/internal/host/changeindex.go
+++ b/internal/host/changeindex.go
@@ -312,8 +312,11 @@ func (l *passLegs) run(ctx context.Context, what string, keep func(registry.Rout
// is the one thing a security guard must not have. Aliases read
// the domain claims, not the record families, so they read the
// bucket.
- deploymentRoutes := edgesfile.DeploymentRoutes(ctx, l.store, time.Now())
- if err := domains.ReconcileAliases(ctx, l.store, l.reg, time.Now, deploymentRoutes, &aliasClaimCache); err != nil {
+ deploymentRoutes, routesWhole := edgesfile.DeploymentRoutesComplete(ctx, l.store, time.Now())
+ // See agent.go: the report carries "the route read was partial" into
+ // the pass; Task 8 reads its Complete.
+ aliasRep := domains.AliasReport{DeploymentRoutesPartial: deploymentRoutes != nil && !routesWhole}
+ if err := domains.ReconcileAliasesReport(ctx, l.store, l.reg, time.Now, deploymentRoutes, &aliasClaimCache, &aliasRep); err != nil {
log.Printf("agent: fast converge alias pass: %v", err)
}
mark("aliases")