carlos / platform Public

edge: fair share over backhaul slots so one client cannot fill a box's hop (#358)

While a destination box's slots are at least half taken, a client key already
holding 8 of them is answered 429 with Retry-After: 1, the same answer the home
edge gives. Saturation still answers 503 with Retry-After: 2. Door callers,
fleet-tunnelled requests and unkeyable addresses take no part; observe mode
logs "would refuse" and admits.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev 3eb9a3e699e1b69c810c73e03b0658b2807a6f39 parent b3c1ff2
3 files changed, +361 −13
  • internal/edge/backhaul_share_test.go +268 −0
  • internal/edge/edge.go +91 −11
  • internal/edge/homemap_test.go +2 −2

CI failed — run details

CI log
=== gate ===
.amadan/test-gate.sh
=== launchctx (1 s)
ok  	amadan.net/carlos/platform.git/launchctx	0.012s
?   	amadan.net/carlos/platform.git/launchctx/controlname	[no test files]
?   	amadan.net/carlos/platform.git/launchctx/wireid	[no test files]
=== vet (18 s)
=== gofmt (1 s)
gofmt -l .: clean
=== rest (171 s)
?   	github.com/carlosframework/platform/cmd/changelog	[no test files]
ok  	github.com/carlosframework/platform/cmd/console	3.660s
ok  	github.com/carlosframework/platform/cmd/moveprobe	11.985s
ok  	github.com/carlosframework/platform/cmd/zddprobe	0.734s
ok  	github.com/carlosframework/platform/internal/activator	58.049s
ok  	github.com/carlosframework/platform/internal/agentsock	0.038s
ok  	github.com/carlosframework/platform/internal/alerting	0.005s
ok  	github.com/carlosframework/platform/internal/analytics	0.039s
ok  	github.com/carlosframework/platform/internal/appconfig	3.075s
ok  	github.com/carlosframework/platform/internal/apperr	0.129s
ok  	github.com/carlosframework/platform/internal/applog	0.226s
ok  	github.com/carlosframework/platform/internal/awsinv	0.018s
ok  	github.com/carlosframework/platform/internal/boxchoice	0.016s
ok  	github.com/carlosframework/platform/internal/boxid	0.756s
?   	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.026s
ok  	github.com/carlosframework/platform/internal/caps	0.028s
ok  	github.com/carlosframework/platform/internal/certwarm	0.023s
ok  	github.com/carlosframework/platform/internal/cgroup	0.823s
ok  	github.com/carlosframework/platform/internal/changelog	0.517s
ok  	github.com/carlosframework/platform/internal/claimactivation	1.266s
ok  	github.com/carlosframework/platform/internal/clamd	0.059s
?   	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	8.223s
ok  	github.com/carlosframework/platform/internal/dbdoor/dbdoortest	0.031s
ok  	github.com/carlosframework/platform/internal/dbquery	0.006s
ok  	github.com/carlosframework/platform/internal/dbreads	2.160s
?   	github.com/carlosframework/platform/internal/dbreads/dbreadstest	[no test files]
ok  	github.com/carlosframework/platform/internal/dbverify	0.009s
ok  	github.com/carlosframework/platform/internal/dnsrec	0.009s
ok  	github.com/carlosframework/platform/internal/docsite	0.031s
ok  	github.com/carlosframework/platform/internal/domains	2.940s
ok  	github.com/carlosframework/platform/internal/doorkey	0.022s
ok  	github.com/carlosframework/platform/internal/economics	0.022s
ok  	github.com/carlosframework/platform/internal/edge	46.175s
?   	github.com/carlosframework/platform/internal/edgeproof	[no test files]
ok  	github.com/carlosframework/platform/internal/edgesfile	0.008s
ok  	github.com/carlosframework/platform/internal/fleetapi	0.133s
ok  	github.com/carlosframework/platform/internal/gate	1.654s
ok  	github.com/carlosframework/platform/internal/genselect	0.015s
ok  	github.com/carlosframework/platform/internal/geo	0.016s
ok  	github.com/carlosframework/platform/internal/geoip	0.030s
ok  	github.com/carlosframework/platform/internal/historyreadback	0.152s
ok  	github.com/carlosframework/platform/internal/host	142.846s
ok  	github.com/carlosframework/platform/internal/hostactors	5.407s
ok  	github.com/carlosframework/platform/internal/hostactors/awsmembership	0.006s
ok  	github.com/carlosframework/platform/internal/hostbox	2.899s
ok  	github.com/carlosframework/platform/internal/hostclaim	0.722s
ok  	github.com/carlosframework/platform/internal/hostenv	0.007s
ok  	github.com/carlosframework/platform/internal/hostevidence	0.006s
ok  	github.com/carlosframework/platform/internal/hostexec	5.308s
ok  	github.com/carlosframework/platform/internal/hostfence	0.061s
ok  	github.com/carlosframework/platform/internal/hostfiles	10.375s
ok  	github.com/carlosframework/platform/internal/hostfloor	0.019s
ok  	github.com/carlosframework/platform/internal/hostguard	1.017s
ok  	github.com/carlosframework/platform/internal/hostops	1.933s
?   	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.002s
ok  	github.com/carlosframework/platform/internal/hostrelocate	0.609s
ok  	github.com/carlosframework/platform/internal/hostresolve	0.173s
ok  	github.com/carlosframework/platform/internal/hostwrite	0.002s
ok  	github.com/carlosframework/platform/internal/infraview	0.006s
ok  	github.com/carlosframework/platform/internal/instancectl	5.227s
ok  	github.com/carlosframework/platform/internal/instanceexec	2.806s
ok  	github.com/carlosframework/platform/internal/instancefs	0.013s
ok  	github.com/carlosframework/platform/internal/instancekey	0.017s
ok  	github.com/carlosframework/platform/internal/instanceupdates	0.013s
ok  	github.com/carlosframework/platform/internal/layout	1.743s
ok  	github.com/carlosframework/platform/internal/lbhealth	0.007s
ok  	github.com/carlosframework/platform/internal/lease	10.114s
ok  	github.com/carlosframework/platform/internal/lease/leasetest	0.503s
ok  	github.com/carlosframework/platform/internal/ledger	0.016s
ok  	github.com/carlosframework/platform/internal/mail	0.215s
ok  	github.com/carlosframework/platform/internal/maintenance	0.098s
ok  	github.com/carlosframework/platform/internal/maintenanceexec	5.614s
ok  	github.com/carlosframework/platform/internal/maintenanceguard	0.094s
ok  	github.com/carlosframework/platform/internal/metrics	0.005s
ok  	github.com/carlosframework/platform/internal/moves	22.543s
ok  	github.com/carlosframework/platform/internal/moves/archive	1.015s
ok  	github.com/carlosframework/platform/internal/objstore	0.271s
ok  	github.com/carlosframework/platform/internal/ops	0.204s
ok  	github.com/carlosframework/platform/internal/park	0.287s
ok  	github.com/carlosframework/platform/internal/plans	0.007s
ok  	github.com/carlosframework/platform/internal/privatefile	0.003s
2026/10/24 21:47:11 provision: listing apps/bab/blog/instances/: list refused — its records are unseen this pass
2026/10/24 21:47:11 provision: listing apps/bab/: listdirs refused — its records are unseen this pass
2026/10/24 21:47:11 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:11 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:11 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:11 provision: listing apps/bac/tito/instances/: list refused — its records are unseen this pass
2026/10/24 21:47:11 provision: listing apps/bac/tito/instances/: list refused — its records are unseen this pass
2026/10/24 21:47:11 provision: skipping record apps/bac/tito/instances/one.example.com.json: unreadable: read refused
2026/10/24 21:47:11 provision: listing apps/bac/tito/instances/: list refused — its records are unseen this pass
2026/10/24 21:47:11 provision: an app's records could not be listed: they are skipped
2026/10/24 21:47:11 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:47:11 provision: remove retired instance route shop.example: provision: claim admission unavailable
2026/10/24 21:47:11 provision: remove retired instance route shop.example: provision: claim admission unavailable
2026/10/24 21:47:11 provision: remove retired sidecar route worker.sidecar.internal: provision: claim admission unavailable
2026/10/24 21:47:11 provision: remove retired sidecar route worker.sidecar.internal: provision: claim admission unavailable
2026/10/24 21:47:11 provision: claim install acme.go.tito.io: provision: claim admission unavailable
2026/10/24 21:47:11 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:11 provision: claim install acme.go.tito.io: registry: claim row ownership changed or unknown
2026/10/24 21:47:11 provision: claim install bot.eleven.bac.sidecar.internal: provision: claim admission unavailable
2026/10/24 21:47:11 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/24 21:47:11 provision: claim install bot.eleven.bac.sidecar.internal: registry: claim row ownership changed or unknown
2026/10/24 21:47:11 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:47:11 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:47:11 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:11 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:11 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:47:11 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/24 21:47:12 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/24 21:47:12 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:47:12 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 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:47:12 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/24 21:47:12 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/24 21:47:12 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: claim install acme.go.tito.io: registry: claim row ownership changed or unknown
2026/10/24 21:47:12 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: claim install acme.go.tito.io: registry: claim row ownership changed or unknown
2026/10/24 21:47:12 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:47:12 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/24 21:47:12 provision: claim install bot.eleven.bac.sidecar.internal: registry: claim row ownership changed or unknown
2026/10/24 21:47:12 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/24 21:47:12 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/24 21:47:12 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:47:12 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:47:12 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:12 provision: skipping record apps/bac/tito/instances/new.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:12 provision: not removing acme.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/24 21:47:12 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:12 provision: skipping record apps/bac/tito/instances/new.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:12 provision: minted instance route ra.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route rb.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route rc.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route rf.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route ri.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route rj.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route rd.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route re.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route rg.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route rh.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route rk.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route rl.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route rc.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route rd.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route ra.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route rb.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: skipping record apps/bac/tito/instances/rb.go.tito.io.json: read failed: read refused
2026/10/24 21:47:12 provision: skipping record apps/bac/tito/instances/rb.go.tito.io.json: read failed: read refused
2026/10/24 21:47:12 provision: minted instance route re.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route x.appa.example (app "appa" acct "bac")
2026/10/24 21:47:12 provision: minted instance route x.appg.example (app "appg" acct "bac")
2026/10/24 21:47:12 provision: minted instance route x.apph.example (app "apph" acct "bac")
2026/10/24 21:47:12 provision: minted instance route x.appi.example (app "appi" acct "bac")
2026/10/24 21:47:12 provision: minted instance route x.appb.example (app "appb" acct "bac")
2026/10/24 21:47:12 provision: minted instance route x.appc.example (app "appc" acct "bac")
2026/10/24 21:47:12 provision: minted instance route x.appd.example (app "appd" acct "bac")
2026/10/24 21:47:12 provision: minted instance route x.appe.example (app "appe" acct "bac")
2026/10/24 21:47:12 provision: minted instance route x.appf.example (app "appf" acct "bac")
2026/10/24 21:47:12 provision: minted instance route x.appj.example (app "appj" acct "bac")
2026/10/24 21:47:12 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/24 21:47:12 provision: minted instance route r0021.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0050.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0055.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0078.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0030.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0032.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0077.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0092.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0093.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0115.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0059.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0066.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0091.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0106.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0125.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0001.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0005.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0065.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0085.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0007.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0015.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0043.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0104.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0003.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0039.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0058.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0076.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0020.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0022.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0084.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0000.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0004.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0068.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0094.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0111.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0117.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0060.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0097.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0018.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0024.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0079.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0027.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0057.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0086.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0013.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0041.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0119.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0049.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0075.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0099.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0110.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0118.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0009.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0002.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0006.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0025.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0101.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0102.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0129.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0047.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0083.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0096.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0107.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0042.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0062.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0095.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0116.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0019.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0061.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0012.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0036.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0048.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0073.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0103.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0034.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0070.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0071.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0081.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0098.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0127.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0044.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0053.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0108.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0113.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0114.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0052.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0080.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0089.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0090.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0011.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0033.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0054.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0017.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0037.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0063.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0120.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0122.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0072.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0123.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0010.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0035.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0038.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0088.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0109.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0112.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0008.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0040.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0046.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0051.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0069.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0074.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0082.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0105.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0016.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0026.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0028.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0031.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0056.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0126.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0121.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0064.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0087.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0014.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0023.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0124.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0128.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0029.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0045.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0067.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:12 provision: minted instance route r0100.go.tito.io (app "tito" acct "bac")
--- FAIL: TestPlan9B8RecordWriteCensus (0.76s)
    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:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47: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:47:14 provision: minted instance route shop.example.com (app "shop" acct "bac")
2026/10/24 21:47:14 provision: minted instance route shop.example.com (app "shop" acct "bac")
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: minted instance route console.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: minted service route ha.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: minted service route svc.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: minted instance route whole.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: minted instance route shared.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: converged acme.go.tito.io channel stable -> edge
2026/10/24 21:47:14 provision: converged acme.go.tito.io channel edge -> canary/rehearsal
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: empty channel
2026/10/24 21:47:14 provision: not removing acme.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: converged acme.go.tito.io environment "" -> "staging"
2026/10/24 21:47:14 provision: converged acme.go.tito.io environment "staging" -> ""
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: converged acme.go.tito.io steering "" -> "latency"
2026/10/24 21:47:14 provision: converged acme.go.tito.io steering "latency" -> ""
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: converged acme.go.tito.io hibernate false -> true
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: converged acme.go.tito.io hibernate true -> false (replication "daily" cleared: only a hibernating route's rung is read)
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: converged acme.go.tito.io status-named false -> true
2026/10/24 21:47:14 provision: converged acme.go.tito.io status-named true -> false
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: minted service route ha.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 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:47:14 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:47:14 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:47:14 provision: minted service route whole.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 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:47:14 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:47:14 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:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: minted service route whole.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47: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:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: skipping accounts/bac/account.json: malformed account manifest: invalid character 'o' in literal null (expecting 'u')
2026/10/24 21:47:14 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: manifest bac/tito: read failed: provision: manifest bac/tito: invalid character 'o' in literal null (expecting 'u')
2026/10/24 21:47:14 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:47:14 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:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 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:47:14 provision: not removing acme$evil.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/24 21:47:14 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:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 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:47:14 provision: not removing bad-service.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/24 21:47:14 provision: skipping record apps/bac/tito/instances/no-channel.go.tito.io.json: empty channel
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: skipping record apps/bac/tito/instances/no-channel.go.tito.io.json: empty channel
2026/10/24 21:47:14 provision: not removing no-channel.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47: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:47:14 provision: not removing acme.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/24 21:47:14 provision: removed retired instance route ghost.go.tito.io (record gone)
2026/10/24 21:47:14 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:47:14 provision: minted instance route dup.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/24 21:47:14 provision: removed retired instance route acme.go.tito.io (app in the trash)
2026/10/24 21:47:14 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/24 21:47:14 provision: removed retired static route site.go.tito.io (app in the trash)
2026/10/24 21:47:14 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:47:14 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/24 21:47:14 provision: removed retired instance route acme.go.tito.io (app in the trash)
2026/10/24 21:47:14 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/24 21:47:14 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:47: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:47:14 provision: converged acme.go.tito.io channel stable -> edge
2026/10/24 21:47: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:47:14 provision: converged acme.go.tito.io channel canary/rehearsal -> edge
2026/10/24 21:47:14 provision: converged acme.go.tito.io environment "staging" -> ""
2026/10/24 21:47: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:47:14 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:47:14 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:47:14 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:47:14 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:47:14 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:47:14 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:47: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:47:14 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/24 21:47:14 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:47:14 provision: dry-run: would converge adopt.go.tito.io channel stable -> edge
2026/10/24 21:47:14 provision: dry-run: would converge adopt.go.tito.io environment "" -> "staging"
2026/10/24 21:47:14 provision: dry-run: would converge owned.go.tito.io channel stable -> edge
2026/10/24 21:47:14 provision: dry-run: would converge owned.go.tito.io environment "" -> "staging"
2026/10/24 21:47:14 provision: dry-run: would converge owned.go.tito.io hibernate false -> true
2026/10/24 21:47:14 provision: dry-run: would converge owned.go.tito.io seed
2026/10/24 21:47:14 provision: dry-run: would mint instance route acme.go.tito.io (app "tito" acct "bac" channel "stable")
2026/10/24 21:47:14 provision: dry-run: would remove retired instance route gone.go.tito.io (record gone)
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: adopted existing route adopt.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/24 21:47:14 provision: converged adopt.go.tito.io channel stable -> edge
2026/10/24 21:47:14 provision: converged adopt.go.tito.io environment "" -> "staging"
2026/10/24 21:47:14 provision: converged owned.go.tito.io channel stable -> edge
2026/10/24 21:47:14 provision: converged owned.go.tito.io environment "" -> "staging"
2026/10/24 21:47:14 provision: converged owned.go.tito.io hibernate false -> true
2026/10/24 21:47:14 provision: removed retired instance route gone.go.tito.io (record gone)
2026/10/24 21:47:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:14 provision: adopted existing route story.carlosframework.com (app "story" acct "bad") — this record now owns its channel and environment
2026/10/24 21:47:15 provision: story.carlosframework.com exists but is not the route this record describes (kind "instance"/"static") — leaving it alone
2026/10/24 21:47:15 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted service route pub.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted service route pubs.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted instance route unit.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted instance route exec.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted service route loop.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted service route named.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted service route priv.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted static route pisite.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: removed retired static route site.go.tito.io (record gone)
2026/10/24 21:47:15 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted instance route acme-uk.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: converged acme.go.tito.io replicas "ie,uk" -> "uk"
2026/10/24 21:47:15 provision: converged acme.go.tito.io replicas "uk" -> ""
2026/10/24 21:47:15 provision: minted instance route acme-uk.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: converged acme-uk.go.tito.io replica mark true -> false
2026/10/24 21:47:15 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 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:47:15 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:15 provision: acme.go.tito.io: not minting this pass: the box's layout intent could not be read: store down
2026/10/24 21:47:15 provision: router.go.tito.io: not minting this pass: the box's layout intent could not be read: store down
2026/10/24 21:47:15 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/24 21:47:15 provision: converged acme.go.tito.io channel stable -> edge
2026/10/24 21:47:15 provision: minted instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac")
2026/10/24 21:47:15 provision: not removing acme.go.tito.io (record gone): participant of a running operation
2026/10/24 21:47:15 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/24 21:47:15 provision: minted instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac")
2026/10/24 21:47:15 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:47:15 provision: held acme.go.tito.io landing by mv_acme (was ready)
2026/10/24 21:47:15 provision: acme.go.tito.io: held restoring by rb_other, not by mv_acme; leaving it
2026/10/24 21:47:15 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:47:15 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/24 21:47:15 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:47:15 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:47:15 provision: held acme.go.tito.io landing by mv_acme (was ready)
2026/10/24 21:47:15 provision: minted instance route acme.example.com (app "shop" acct "bac")
2026/10/24 21:47:15 provision: minted instance route plain.example.com (app "shop" acct "bac")
2026/10/24 21:47:15 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:15 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:47:15 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:15 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:47:15 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:15 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:47:15 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:15 provision: listing apps/bac/shop/instances/: list refused — its records are unseen this pass
2026/10/24 21:47:16 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:16 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:16 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/24 21:47:16 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:16 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/24 21:47:16 provision: minted sidecar route bot.shop.bac.sidecar.internal (app "shop" acct "bac" args ["run"])
2026/10/24 21:47:16 provision: removed retired sidecar route bot.shop.bac.sidecar.internal (record gone)
2026/10/24 21:47:16 provision: minted sidecar route bot.shop.bum.sidecar.internal (app "shop" acct "bum" args ["run"])
2026/10/24 21:47:16 provision: minted sidecar route bot.shop.bum.sidecar.internal (app "shop" acct "bum" args ["run"])
2026/10/24 21:47:16 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:47:16 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:47:16 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:47:16 provision: removed retired sidecar route bot.shop.bum.sidecar.internal (record gone)
2026/10/24 21:47:16 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:47:16 provision: removed retired sidecar route bot.shop.bum.sidecar.internal (record gone)
2026/10/24 21:47:16 provision: a.shop.example.com: swapped for import sd_azo2rmmguobouykwklvnshnloa (the original route is journaled)
2026/10/24 21:47:16 provision: a.shop.example.com: import sd_azo2rmmguobouykwklvnshnloa committed: its gate is cleared and its journal row dropped
2026/10/24 21:47:16 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:47:17 provision: a.shop.example.com: import sd_bqckdywwbotb2ypkdrkkm7exni rolled back to its original route
2026/10/24 21:47:17 provision: a.shop.example.com: import sd_bqckdywwbotb2ypkdrkkm7exni: 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:47:17 provision: a.shop.example.com: import sd_bqckdywwbotb2ypkdrkkm7exni is cleaned up and its journal row retired
2026/10/24 21:47:17 provision: a.shop.example.com: import sd_v3lbus6h3tnrwdfpyq4yx5nyru rolled back to its original route
2026/10/24 21:47:17 provision: a.shop.example.com: import sd_v3lbus6h3tnrwdfpyq4yx5nyru: 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:47:17 provision: a.shop.example.com: import sd_v3lbus6h3tnrwdfpyq4yx5nyru is cleaned up and its journal row retired
2026/10/24 21:47:17 provision: dry-run: would redo a.shop.example.com's swap record CAS for import sd_a7myaukzxd4xjbymw22f4szy5e
2026/10/24 21:47:17 provision: dry-run: would clear a.shop.example.com's import gate
2026/10/24 21:47:17 provision: dry-run: would converge a.shop.example.com seed source
2026/10/24 21:47:17 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:47:17 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:47:17 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:47:17 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:47:17 provision: a.shop.example.com: import sd_t2vesxsdt2i53rfvobxhewvvuu cannot roll back on this box: the activator is not wired; it stays journaled and gated
2026/10/24 21:47:17 provision: a.shop.example.com: import sd_2rncfvuwvxk2yfsigbrm2izsiu cannot roll back on this box: the activator is not wired; it stays journaled and gated
2026/10/24 21:47:17 provision: a.shop.example.com: import sd_nntcuk5w3tpa4yraxjyjmj637i is journaled, but this box cannot act on imports; its row is left alone
2026/10/24 21:47:17 provision: a.shop.example.com: import sd_y7nzw273krnvdadsouy4o5uewa is journaled, but this box cannot act on imports; its row is left alone
2026/10/24 21:47:17 provision: a.shop.example.com: import sd_lyjq76vzvgv45u54tt2g47wdj4 is journaled, but this box cannot act on imports; its row is left alone
2026/10/24 21:47:17 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:47:17 provision: b.shop.example.com: import sd_xzphs4aarcutv6pul3sozl6xnq left alone this pass: the import journal could not be read
2026/10/24 21:47:17 provision: c.shop.example.com: import sd_rx7d7km5dk4zrrt4rgl6e3cuk4 left alone this pass: the import journal could not be read
2026/10/24 21:47:17 provision: a.shop.example.com: import sd_da5l7a4skeuxwxrfsrx7vxf2mi committed: its gate is cleared and its journal row dropped
2026/10/24 21:47:17 provision: a.shop.example.com: not converging import sd_y3kcuwzwpywd5crnc36hnxobka: it is swapped but not committed, and the row on this box has no import gate
2026/10/24 21:47:17 provision: a.shop.example.com: not converging import sd_v3bohccjrhxualorzw6a4rqsmm: it is swapped but not committed, and the row on this box has no import gate
2026/10/24 21:47:17 provision: a.shop.example.com: not converging import sd_yztushdggoxq2gr475iu4dfwam: it is placed but not committed, and the row on this box has no import gate
2026/10/24 21:47:17 provision: a.shop.example.com: not converging import sd_noiljettjom5hcq4cyv7j7im3q: it is placed but not committed, and the row on this box has no import gate
2026/10/24 21:47:17 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:47:17 provision: converge seed source on a.shop.example.com: constraint failed: seed_source is read-only here (1811)
2026/10/24 21:47:17 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:47:17 provision: a.shop.example.com: import sd_on3on6k2mvszrkilya6jo5e5uu committed: its gate is cleared and its journal row dropped
2026/10/24 21:47:17 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:47:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:17 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:47:17 provision: acme.go.tito.io: not minting a seeded instance: this box does not mint nested (<nil>)
2026/10/24 21:47:17 provision: acme.go.tito.io: not minting a seeded instance: claim control is on for this box
2026/10/24 21:47:17 provision: acme.go.tito.io: aborted seed sd_fy6ovono7y4zvx4eykzm4rn2zq: this box cannot read seed markers, and places no seed; nothing local is removed
2026/10/24 21:47:17 provision: acme.go.tito.io: aborted seed sd_fy6ovono7y4zvx4eykzm4rn2zq rolled back (no box had swapped it)
2026/10/24 21:47:17 provision: acme.go.tito.io: not minting a seeded instance: its record does not describe a hibernating instance
2026/10/24 21:47:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:17 provision: removed instance route acme.go.tito.io (its seed sd_adaupj2bsu6l5janvy32bvgd3e was aborted); the next pass rolls it back
2026/10/24 21:47:17 provision: acme.go.tito.io: aborted seed sd_adaupj2bsu6l5janvy32bvgd3e: this box cannot read seed markers, and places no seed; nothing local is removed
2026/10/24 21:47:17 provision: acme.go.tito.io: aborted seed sd_adaupj2bsu6l5janvy32bvgd3e rolled back (no box had swapped it)
2026/10/24 21:47:17 provision: acme.go.tito.io: aborted seed sd_ze7lbv5bifq4riufcgkbqcbitu has a row this pass may not remove; leaving the seed aborted
2026/10/24 21:47:17 provision: acme.go.tito.io: aborted seed sd_d4u3lzfdapr66gd3yfyocntgle rolled back (no box had swapped it)
2026/10/24 21:47:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:17 provision: removed instance route acme.go.tito.io (its seed sd_uzlvvhev5cu27nj554lzhstism was aborted); the next pass rolls it back
2026/10/24 21:47:17 provision: acme.go.tito.io: aborted seed sd_uzlvvhev5cu27nj554lzhstism has no route on this box: its local data is removed
2026/10/24 21:47:17 provision: acme.go.tito.io: aborted seed sd_uzlvvhev5cu27nj554lzhstism rolled back (no box had swapped it)
2026/10/24 21:47:17 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:17 provision: a.shop.example.com: swapped for import sd_pikcmjjgli6nlh3cqfpo2irqwa (the original route is journaled)
2026/10/24 21:47:17 provision: a.shop.example.com: import sd_pikcmjjgli6nlh3cqfpo2irqwa rolled back to its original route
2026/10/24 21:47:17 provision: a.shop.example.com: import sd_pikcmjjgli6nlh3cqfpo2irqwa is cleaned up and its journal row retired
2026/10/24 21:47:17 provision: a.shop.example.com: swapped for import sd_ddaimkqpydnva34eewotoogv6q (the original route is journaled)
2026/10/24 21:47:17 provision: a.shop.example.com: import sd_ddaimkqpydnva34eewotoogv6q rolled back to its original route
2026/10/24 21:47:17 provision: a.shop.example.com: import sd_ddaimkqpydnva34eewotoogv6q is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_l7t7nnbmglkm75y5il25lrtn6m (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_l7t7nnbmglkm75y5il25lrtn6m rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_l7t7nnbmglkm75y5il25lrtn6m: the host's replica is left alone: its record no longer names this seed
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_l7t7nnbmglkm75y5il25lrtn6m is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_sthxzekkm26644jeueryc6taeu (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_sthxzekkm26644jeueryc6taeu rollback deferred: the host is not fenced and stopped yet (<nil>)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_sthxzekkm26644jeueryc6taeu rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_sthxzekkm26644jeueryc6taeu is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_joscp3zynvdxrgve5uui3yk3ka (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_joscp3zynvdxrgve5uui3yk3ka rollback deferred: the host is not fenced and stopped yet (stop unproven)
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_yq5roswlbococvnxenmfj4vvvi (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_yq5roswlbococvnxenmfj4vvvi is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_o2vxso66vas67hzcksvegh4hxq (the original route is journaled)
2026/10/24 21:47:18 provision: skipping record apps/bac/shop/instances/a.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_o2vxso66vas67hzcksvegh4hxq left alone this pass: its record could not be read
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_lcyxsbhjmgrnyhihy5xehwuzja (the original route is journaled)
2026/10/24 21:47:18 provision: skipping record apps/bac/shop/instances/a.shop.example.com.json: read failed: connection reset
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_lcyxsbhjmgrnyhihy5xehwuzja left alone this pass: its record could not be read
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_m66enpcmi43lubs3cffra4alhq (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_m66enpcmi43lubs3cffra4alhq: close the import gate: constraint failed: injected (1811)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_m66enpcmi43lubs3cffra4alhq rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_m66enpcmi43lubs3cffra4alhq is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_dkf7po3yhinx22lrcsc6vzuv2u (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_dkf7po3yhinx22lrcsc6vzuv2u: close the import gate: constraint failed: injected (1811)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_dkf7po3yhinx22lrcsc6vzuv2u rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_dkf7po3yhinx22lrcsc6vzuv2u is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_sggv57ex7ajdpwmprkbv5vx3g4 (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_sggv57ex7ajdpwmprkbv5vx3g4 rollback deferred: the host is not fenced and stopped yet (injected failure at fence)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_sggv57ex7ajdpwmprkbv5vx3g4 rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_sggv57ex7ajdpwmprkbv5vx3g4 is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_lf6q4lagxsb4am23mzqqrdyob4 (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_lf6q4lagxsb4am23mzqqrdyob4 rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_lf6q4lagxsb4am23mzqqrdyob4 is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_t6joup5ax2a7svbxxovtwzgvuy (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_t6joup5ax2a7svbxxovtwzgvuy: retire its instance key: injected failure at retire-key
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_t6joup5ax2a7svbxxovtwzgvuy rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_t6joup5ax2a7svbxxovtwzgvuy is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_455qu7ft45meyioqwx5xfwpr6m (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_455qu7ft45meyioqwx5xfwpr6m rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_455qu7ft45meyioqwx5xfwpr6m is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_c65mu636x2wm3y3zc7dggsnakm (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_c65mu636x2wm3y3zc7dggsnakm: remove its local data: injected failure at remove-local
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_c65mu636x2wm3y3zc7dggsnakm rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_c65mu636x2wm3y3zc7dggsnakm is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_ybuu3e6b4uouatvzbznm55maym (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_ybuu3e6b4uouatvzbznm55maym rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_ybuu3e6b4uouatvzbznm55maym is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_h6ia5loefsxz2xvlnp3msmcmcq (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_h6ia5loefsxz2xvlnp3msmcmcq: remove its local data: injected failure at remove-local-done
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_h6ia5loefsxz2xvlnp3msmcmcq rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_h6ia5loefsxz2xvlnp3msmcmcq is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_ktradbeaoofn4pb6y7274uh5wy (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_ktradbeaoofn4pb6y7274uh5wy rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_ktradbeaoofn4pb6y7274uh5wy is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_gtasmeyn27bpocluizuyivq2rm (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_gtasmeyn27bpocluizuyivq2rm: restore the original route: constraint failed: injected (1811)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_gtasmeyn27bpocluizuyivq2rm rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_gtasmeyn27bpocluizuyivq2rm is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_oxfhsmxmgngg7hpeyyf5youc6m (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_oxfhsmxmgngg7hpeyyf5youc6m: restore the original route: constraint failed: injected (1811)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_oxfhsmxmgngg7hpeyyf5youc6m rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_oxfhsmxmgngg7hpeyyf5youc6m is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_dmgymi7yvnqaugdegvyxkg2bzi (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_dmgymi7yvnqaugdegvyxkg2bzi is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_smd7rtotxznk6kg4tuluwys4h4 (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_smd7rtotxznk6kg4tuluwys4h4 rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_smd7rtotxznk6kg4tuluwys4h4: delete its snapshot: injected failure at delete-snapshot
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_smd7rtotxznk6kg4tuluwys4h4 is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_tj5os4hvaowxuf3g5gssdmqwyu (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_tj5os4hvaowxuf3g5gssdmqwyu rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_tj5os4hvaowxuf3g5gssdmqwyu is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_wlb67ckcdxavva4nowz4qpxmne (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_wlb67ckcdxavva4nowz4qpxmne rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_wlb67ckcdxavva4nowz4qpxmne: delete the host's replica: injected failure at delete-replica
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_wlb67ckcdxavva4nowz4qpxmne is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_oksnyug4s4fhtuchery6ow56ia (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_oksnyug4s4fhtuchery6ow56ia rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_oksnyug4s4fhtuchery6ow56ia is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_cvrjg2dpritaua6cwlzkcab5km (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_cvrjg2dpritaua6cwlzkcab5km rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_cvrjg2dpritaua6cwlzkcab5km: retire its journal row: constraint failed: injected (1811)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_cvrjg2dpritaua6cwlzkcab5km is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_47cml4r2bixzhegi2esakdlhz4 (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_47cml4r2bixzhegi2esakdlhz4 rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_47cml4r2bixzhegi2esakdlhz4: retire its journal row: constraint failed: injected (1811)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_47cml4r2bixzhegi2esakdlhz4 is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_nglynikpqaf5xy5rtqheqxyxzi (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_nglynikpqaf5xy5rtqheqxyxzi rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_nglynikpqaf5xy5rtqheqxyxzi is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: mark import sd_nglynikpqaf5xy5rtqheqxyxzi rolled back: injected failure at cas
2026/10/24 21:47:18 provision: a.shop.example.com: aborted seed sd_nglynikpqaf5xy5rtqheqxyxzi rolled back (no box had swapped it)
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_ru5r5urufxe5xf6dyhbkk6syuy (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_ru5r5urufxe5xf6dyhbkk6syuy rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_ru5r5urufxe5xf6dyhbkk6syuy is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: aborted seed sd_ru5r5urufxe5xf6dyhbkk6syuy rolled back (no box had swapped it)
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_urkh5g4ouq2qc5jkdk5lirhx2a (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_urkh5g4ouq2qc5jkdk5lirhx2a rollback deferred: the host is not fenced and stopped yet (<nil>)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_urkh5g4ouq2qc5jkdk5lirhx2a rollback deferred: the host is not fenced and stopped yet (<nil>)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_urkh5g4ouq2qc5jkdk5lirhx2a rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_urkh5g4ouq2qc5jkdk5lirhx2a is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_zemuciefgryngzt3ux6fcdhjhu (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_zemuciefgryngzt3ux6fcdhjhu rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_zemuciefgryngzt3ux6fcdhjhu is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_4j3jawsqfjjqkuzyyaaqhmy3ki (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_4j3jawsqfjjqkuzyyaaqhmy3ki rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_4j3jawsqfjjqkuzyyaaqhmy3ki is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_gnz63rrtowsrxihiifqm4zk7pm (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_gnz63rrtowsrxihiifqm4zk7pm rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_gnz63rrtowsrxihiifqm4zk7pm is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_3jcegkti7sim7ny2aqilzn6x2u (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_3jcegkti7sim7ny2aqilzn6x2u rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_3jcegkti7sim7ny2aqilzn6x2u is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_35ab4izavgpkrpasrwnzktot2q (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_35ab4izavgpkrpasrwnzktot2q rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_35ab4izavgpkrpasrwnzktot2q is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: minted instance route a.shop.example.com (app "other" acct "bac")
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_jfxdu7kkokmp3qd5457xvlgp64 (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_jfxdu7kkokmp3qd5457xvlgp64 rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_jfxdu7kkokmp3qd5457xvlgp64 is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: minted instance route a.shop.example.com (app "other" acct "bac")
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_5wfgthk4ymyp3iqi3uodithxmu (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_5wfgthk4ymyp3iqi3uodithxmu rolled back to its original route
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_5wfgthk4ymyp3iqi3uodithxmu is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: minted instance route a.shop.example.com (app "other" acct "bac")
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_4y5gdaxmpgohffettaht53o7ym (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_4y5gdaxmpgohffettaht53o7ym has no route on this box: its local data is removed and no route is put back
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_4y5gdaxmpgohffettaht53o7ym is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_smfxklht7edzpnivemnismfvu4 (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_otjnjjoticr2dmlt63tkoyvygq (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_hw7tejiuqymjghr6mqigd55wbi (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_hw7tejiuqymjghr6mqigd55wbi cannot roll back on this box: the activator is not wired; it stays journaled and gated
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_xhpe2ygx2t5lkot764xzenfofy (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_xhpe2ygx2t5lkot764xzenfofy is not rolled back: the route changed under the fence, so nothing there is touched
2026/10/24 21:47:18 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:47:18 provision: a.shop.example.com: import ../not-a-seed is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_2rylqdiylpvrapvk52wu534bne (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_gsiviv22yyve5jkql6aucx55zu (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_hmmtigfm5zc2qfrdrtiro6ozjm (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_77togni4pvrcmlp5rgyv6sfa5m (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_jt3ciwapgb2iq72oskh2b2o64e (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_jt3ciwapgb2iq72oskh2b2o64e rollback deferred: the host is not fenced and stopped yet (stop evidence unreadable)
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_tpeitqvkbh75m4b2eerl2dhh24 (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_tpeitqvkbh75m4b2eerl2dhh24 has no route on this box: its local data is removed and no route is put back
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_tpeitqvkbh75m4b2eerl2dhh24 is cleaned up and its journal row retired
2026/10/24 21:47:18 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_3gjk2szte3kpyfc6p3mznyrmui (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_3gjk2szte3kpyfc6p3mznyrmui: remove its local data: injected failure at remove-local
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_3gjk2szte3kpyfc6p3mznyrmui is not rolled back: the route at the host is not the import's, so nothing there is touched
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_2nuhrofxeqmqntt3cdnoqml4mq (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_2nuhrofxeqmqntt3cdnoqml4mq: a route appeared at the host, so its local database is left and the rollback waits
2026/10/24 21:47:18 provision: a.shop.example.com: swapped for import sd_hynmfxk47qhnbyyy6ydqvhrbm4 (the original route is journaled)
2026/10/24 21:47:18 provision: a.shop.example.com: import sd_hynmfxk47qhnbyyy6ydqvhrbm4 rollback deferred: no fence generation: registry busy
2026/10/24 21:47:19 provision: a.shop.example.com: swapped for import sd_sy42nwazepfxqyhf4wug6qwlsi (the original route is journaled)
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_sy42nwazepfxqyhf4wug6qwlsi rollback deferred: no fence generation: the generation source answered 0
2026/10/24 21:47:19 provision: a.shop.example.com: swapped for import sd_z5z53ercqcwkui3kdmgxgnvwi4 (the original route is journaled)
2026/10/24 21:47:19 provision: a.shop.example.com: swapped for import sd_235rz4fsctaz5shhex56vd6dne (the original route is journaled)
2026/10/24 21:47:19 provision: a.shop.example.com: swapped for import sd_dpuoj3p7ww4rfogy4rvh7egtbq (the original route is journaled)
2026/10/24 21:47:19 provision: a.shop.example.com: import deferred: this box cannot read the instance's env file
2026/10/24 21:47:19 provision: a.shop.example.com: import deferred: the instance's env file could not be read: a symlink
2026/10/24 21:47:19 provision: a.shop.example.com: swapped for import sd_om35atjlowcghhv7dkzoifbfce (the original route is journaled)
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_om35atjlowcghhv7dkzoifbfce rolled back to its original route
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_om35atjlowcghhv7dkzoifbfce is cleaned up and its journal row retired
2026/10/24 21:47:19 provision: a.shop.example.com: swapped for import sd_4vqzfqjtgntzigctjfsyvbdo7q (the original route is journaled)
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_4vqzfqjtgntzigctjfsyvbdo7q rolled back to its original route
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_4vqzfqjtgntzigctjfsyvbdo7q is cleaned up and its journal row retired
2026/10/24 21:47:19 provision: a.shop.example.com: swapped for import sd_sjsa64mgryr56jqh26pb65w6wi (the original route is journaled)
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_sjsa64mgryr56jqh26pb65w6wi rolled back to its original route
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_sjsa64mgryr56jqh26pb65w6wi is cleaned up and its journal row retired
2026/10/24 21:47:19 provision: a.shop.example.com: swapped for import sd_4aiitiuwz5f5vv4mnnchjpk2aq (the original route is journaled)
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_4aiitiuwz5f5vv4mnnchjpk2aq: retire its instance key: the env file is a symlink
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_4aiitiuwz5f5vv4mnnchjpk2aq rolled back to its original route
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_4aiitiuwz5f5vv4mnnchjpk2aq is cleaned up and its journal row retired
2026/10/24 21:47:19 provision: a.shop.example.com: swapped for import sd_oaiddf4yejk67vmdomgklfmj2u (the original route is journaled)
2026/10/24 21:47: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:47:19 provision: a.shop.example.com: swapped for import sd_jj2u5idtwxz7jgjh2ryxn3ugse (the original route is journaled)
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_jaljrhoz5f5n4wmpxkgbrclayu refused: there is no route at a.shop.example.com to replace
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_xnegzylctr5l35vthdmnnqe2dy refused: the route's address is 127.0.0.1:9, not 127.0.0.1:8401
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_3es6c25rolbk4zei5nz5dsudeu 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:47:19 provision: a.shop.example.com: import sd_2yq4ewn5n35pz4xgmrgyxdhybu refused: the route's address is 127.0.0.1:9, not 127.0.0.1:8401
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_w6kscghs4qix7q5yyngjp3wpdu refused: the route belongs to app other
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_jsrcavixmpajewpdz3neidmiju refused: the route is filed under another account
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_azhocu7wvrybeinhb47odfxc5y refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_bfguex62ez5muauzha73qyhyu4 refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_avh3um6ifll4dcrlxqdpads6ty refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_s35qab5nqcc4jz2x7qkqe3qfba refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_lwnyb33aefbrweui24t2zvg4ba refused: the route is not an address route this import can take over (socket)
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_v5l2cqf3grynal6w7j6bd3o56i refused: the route is not an address route this import can take over (no address)
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_fwyweueqnlmx3jjj2wh3vpkb3y refused: the route is not an address route this import can take over (provisioned)
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_o6wcntndcgxiaartko37lgogmi refused: the route is not an address route this import can take over (kind static)
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_2lrbzetxz3j6ugpmgzsdzzhxwm refused: the route is not an address route this import can take over (backing)
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_3xt7ynh7y7vyqpexgjhpx3h6qy refused: the route is not an address route this import can take over (tunnel)
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_j32vx3q5rybs4jhtuxzrmrgid4 refused: the route is not an address route this import can take over (caps)
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_hwdio4n6vm5lcppj66kywhylcy refused: the route is not an address route this import can take over (platform)
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_nnl5kybtjcwxmi5r5bta44ap24 refused: the route is not an address route this import can take over (canary)
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_ji4iqfajaryltw5mapust4w4uq refused: the route is not an address route this import can take over (kind sidecar)
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_ybbhnfdrntuukntwgzwnnbd2uu refused: the route is not an address route this import can take over (region)
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_pgg54qnvilvkwq62bgrvpszq34 refused: the route is not an address route this import can take over (fleet_box)
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_hxrqa4u2gvkcmdtvy4gmnjlraq refused: the route is not an address route this import can take over (hibernate)
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_ayyqhejesp3hb7mipknmksxbza refused: the route is not an address route this import can take over (claim_owner)
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_ww3kvitjag6rmmpyqdymh2s3gu refused: this box does not run instances nested
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_6pq2ayynfjimoufcg5yar7ho4q refused: this box does not run instances nested
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_4a2enuqtoql6poqel7sb4i5ggu refused: claim control is on for this box
2026/10/24 21:47:19 provision: a.shop.example.com: swapped for import sd_fvctjpi72ij3zeq2qyjmihd2fi (the original route is journaled)
2026/10/24 21:47:19 provision: a.shop.example.com: swapped for import sd_7c5qjjg65rohnxj4tlwbgzhqwu (the original route is journaled)
2026/10/24 21:47:19 provision: a.shop.example.com: import deferred: the legacy route assignments could not be read: store down
2026/10/24 21:47:19 provision: a.shop.example.com: import deferred: this box cannot read the legacy route assignments
2026/10/24 21:47:19 provision: a.shop.example.com: not swapping for import sd_wd6bugy44brtrldqlhhvl3aoaq: its verify hash is not a sha256
2026/10/24 21:47:19 provision: a.shop.example.com: not swapping for import sd_jfdphmjd7nimcjq4g5q5cygi3e: its verify hash is not a sha256
2026/10/24 21:47:19 provision: a.shop.example.com: not swapping for import sd_i4rpuitcxjrfindfchamoufsyq: its verify hash is not a sha256
2026/10/24 21:47:19 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:47:19 provision: A.shop.example.com/..: not swapping for import sd_i445l2s4dp5vwnzxfpxlumk7ai: its host or seed id is malformed (seeds: not a host)
2026/10/24 21:47:19 provision: a.shop.example.com: not swapping for import sd_lvivlzy72xd4furunoivfu7gjy: its record does not describe a nested, hibernating instance
2026/10/24 21:47:19 provision: a.shop.example.com: not swapping for import sd_ffrdfc5upd5xe4mrmjtlhr2wli: its record does not describe a nested, hibernating instance
2026/10/24 21:47:19 provision: a.shop.example.com: not swapping for import sd_qkd4rvpfzfkihopcvrobvcztt4: its record does not describe a nested, hibernating instance
2026/10/24 21:47:19 provision: a.shop.example.com: not swapping for import sd_2czaulicrqgaewpd37ccnfs3jq: its record does not describe a nested, hibernating instance
2026/10/24 21:47:19 provision: a.shop.example.com: import deferred: the box's layout intent could not be read: store down
2026/10/24 21:47:19 provision: a.shop.example.com: swapped for import sd_54ojsyzdbjlepdyzrn6hgunjla (the original route is journaled)
2026/10/24 21:47:19 provision: a.shop.example.com: import deferred: the box's nested probe did not answer: ready probe timed out
2026/10/24 21:47:19 provision: a.shop.example.com: swapped for import sd_4ayac7gc4x4rfedrjox2fygdjm (the original route is journaled)
2026/10/24 21:47:19 provision: a.shop.example.com: swapped for import sd_vjjlaxom6gj3dfiuhy7vuec2zq (the original route is journaled)
2026/10/24 21:47:19 provision: a.shop.example.com: import deferred: the route is held by operation op_1
2026/10/24 21:47:19 provision: dry-run: would consider swapping a.shop.example.com for import sd_dhvelo3q2k5d3hjz4x4gpfflbu
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_34kqaiwww5sx3jsghgy6k64ajy rolled back to its original route
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_34kqaiwww5sx3jsghgy6k64ajy: 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:47:19 provision: a.shop.example.com: import sd_34kqaiwww5sx3jsghgy6k64ajy is cleaned up and its journal row retired
2026/10/24 21:47:19 provision: a.shop.example.com: import sd_il24ncqwku75iyycklr3bgvn64 left alone: the import journal holds seed sd_qqpbpdi2ykbujkv2qougbaelfq at swapped
2026/10/24 21:47:19 provision: a.shop.example.com: not minting import sd_pcaoq7qjtj3yg7i34r4tktxqwu: it is swapped but not committed, and only its swap makes its row
2026/10/24 21:47:19 provision: a.shop.example.com: not minting import sd_miluulxmjwtlqxf6xfsgu6wvbm: it is placed but not committed, and only its swap makes its row
2026/10/24 21:47:19 provision: a.shop.example.com: swapped for import sd_z27cpi2blrnrhasaubdwn4mx4e (the original route is journaled)
2026/10/24 21:47:19 provision: a.shop.example.com: not minting import sd_z27cpi2blrnrhasaubdwn4mx4e: it is swapped but not committed, and only its swap makes its row
2026/10/24 21:47:19 provision: a.shop.example.com: not minting import sd_z27cpi2blrnrhasaubdwn4mx4e: it is placed but not committed, and only its swap makes its row
2026/10/24 21:47:20 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/24 21:47:20 provision: removed retired sidecar route gone.eleven.bac.sidecar.internal (record gone)
2026/10/24 21:47:20 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:47:20 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:47:20 provision: converged sidecar bot.eleven.bac.sidecar.internal args ["sidecar","run"] -> ["worker","run"]
2026/10/24 21:47:20 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:47:20 provision: converged sidecar bot.eleven.bac.sidecar.internal ceilings 300/3600 -> 60/120
2026/10/24 21:47:20 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:47:20 provision: converged sidecar bot.eleven.bac.sidecar.internal channel stable -> canary/eleven
2026/10/24 21:47:20 provision: converged sidecar bot.eleven.bac.sidecar.internal environment "other" -> "relay"
2026/10/24 21:47:20 provision: converged sidecar bot.eleven.bac.sidecar.internal hibernate true -> false
2026/10/24 21:47:20 provision: skipping sidecar record apps/bac/eleven/sidecars/bot.json: read failed: failStore: reads disabled under apps/bac/eleven/sidecars/
2026/10/24 21:47:20 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:47:20 provision: not removing sidecar bot.eleven.bac.sidecar.internal: its record exists but could not be read cleanly this pass
2026/10/24 21:47:20 provision: skipping sidecar record apps/bac/eleven/sidecars/bot.json: empty channel
2026/10/24 21:47:20 provision: skipping sidecar record apps/bac/eleven/sidecars/held.json: empty channel
2026/10/24 21:47:20 provision: not removing sidecar held.eleven.bac.sidecar.internal: its record exists but could not be read cleanly this pass
2026/10/24 21:47:20 provision: removed retired sidecar route old.eleven.bac.sidecar.internal (record gone)
2026/10/24 21:47:20 provision: bac/eleven has sidecar records but no sidecars manifest — not minting
2026/10/24 21:47:20 provision: bac/eleven is in the trash — not minting sidecar routes for it
2026/10/24 21:47:20 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:47:20 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:47:20 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:47:20 provision: minted sidecar route hub.relay.bac.sidecar.internal (app "relay" acct "bac" args ["relay"])
2026/10/24 21:47:20 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:47:20 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:47:20 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:47:20 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:47:20 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:47:20 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:47:20 provision: removed retired sidecar route bot.eleven.bac.sidecar.internal (record gone)
2026/10/24 21:47:20 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:47:20 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:47:20 provision: skipping sidecar record apps/bac/relay/sidecars/hub.json: read failed: failStore: reads disabled under apps/bac/relay/sidecars/
2026/10/24 21:47:20 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:47:20 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/24 21:47:20 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:47:20 provision: dry-run: would remove retired sidecar route gone.eleven.bac.sidecar.internal (record gone)
2026/10/24 21:47:20 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:47:20 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:20 provision: converged acme.go.tito.io update settings "{\"updates\":\"manual\",\"channel\":\"stable\"}" -> ""
2026/10/24 21:47:20 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:20 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:20 provision: manifest bac/tito: read failed: provision: manifest bac/tito: unexpected end of JSON input
2026/10/24 21:47:20 provision: manifest bac/tito: read failed: provision: manifest bac/tito: unexpected end of JSON input
2026/10/24 21:47:20 provision: acme.go.tito.io: not minted this pass: the app's update policy could not be read
2026/10/24 21:47:20 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/24 21:47:20 provision: manifest bac/tito: read failed: provision: manifest bac/tito: unexpected end of JSON input
2026/10/24 21:47:20 provision: acme.go.tito.io: not minted this pass: the app's update policy could not be read
2026/10/24 21:47:20 provision: minted instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac")
2026/10/24 21:47:20 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:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: listing apps/bqd/: listdirs refused — its records are unseen this pass
2026/10/24 21:47:20 provision: listing apps/bqd/: listdirs refused — its records are unseen this pass
2026/10/24 21:47:20 provision: listing apps/bqd/: listdirs refused — its records are unseen this pass
2026/10/24 21:47:20 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:47:20 provision: listing apps/bqd/: listdirs refused — its records are unseen this pass
2026/10/24 21:47:20 provision: record view: re-reading apps/bqc/shop failed: retrying on the next refresh
2026/10/24 21:47:20 provision: listing apps/bqc/shop/instances/: context canceled — its records are unseen this pass
2026/10/24 21:47:20 provision: listing apps/bqd/: listdirs refused — its records are unseen this pass
2026/10/24 21:47:20 provision: record view: change index unusable (get refused): walking
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: record view: re-reading apps/bqc/shop failed: retrying on the next refresh
2026/10/24 21:47:20 provision: listing apps/bqc/shop/instances/: list refused — its records are unseen this pass
2026/10/24 21:47:20 provision: listing apps/bqc/shop/instances/: list refused — its records are unseen this pass
2026/10/24 21:47:20 provision: an app's records could not be listed: they are skipped
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping accounts/bqd/account.json: malformed account manifest: invalid character 'n' looking for beginning of object key string
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping accounts/bqd/account.json: malformed account manifest: invalid character 'n' looking for beginning of object key string
2026/10/24 21:47:20 provision: skipping accounts/bqd/account.json: malformed account manifest: invalid character 'n' looking for beginning of object key string
2026/10/24 21:47:20 provision: record view: re-reading accounts/bqd failed: retrying on the next refresh
2026/10/24 21:47:20 provision: skipping accounts/bqd/account.json: read failed: list refused
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: minted instance route one.example.com (app "shop" acct "bum")
2026/10/24 21:47:20 provision: minted instance route one.example.com (app "shop" acct "bum")
2026/10/24 21:47:20 provision: skipping record apps/bum/shop/instances/one.example.com.json: empty channel
2026/10/24 21:47:20 provision: not removing one.example.com: its record exists but could not be read cleanly this pass
2026/10/24 21:47:20 provision: skipping record apps/bum/shop/instances/one.example.com.json: empty channel
2026/10/24 21:47:20 provision: minted instance route one.example.com (app "shop" acct "bum")
2026/10/24 21:47:20 provision: not removing one.example.com: its record exists but could not be read cleanly this pass
2026/10/24 21:47:20 provision: removed retired instance route one.example.com (record gone)
2026/10/24 21:47:20 provision: removed retired instance route one.example.com (record gone)
2026/10/24 21:47:20 provision: record view: change index unusable (context deadline exceeded): walking
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/24 21:47:20 provision: record view: change index unusable (context deadline exceeded): the walk records no generations
2026/10/24 21:47:20 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
--- FAIL: TestPlan14RootReadCensus (14.89s)
    plan14_root_reads_test.go:600: root read census: 33 discrepancies
        changed registry schema
        changed root read internal/edge/edge.go:Edge.Reload; review class, task, sites and digest
        changed root read internal/edge/edge.go:Edge.ServeHTTP; review class, task, sites and digest
        changed root read internal/host/agent.go:runAgent; 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/registry/registry.go:Registry.Fingerprint; 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/edge
        changed root source envelope internal/host
        changed root source envelope internal/plans
        changed root source envelope internal/provision
        changed root source envelope internal/ratelimit
        changed root source envelope internal/registry
        changed root source envelope internal/usage
        unclassified root read internal/edge/ratelimit.go:Edge.noteRateLimited registry:Host@505,registry:Host@597,whole:Route@166
        unclassified root read internal/edge/ratelimit.go:Edge.parseRateSettings registry:Host@271,registry:Host@367,registry:RateLimit@158,registry:RateLimit@77
        unclassified root read internal/edge/ratelimit.go:Edge.rateAdmit registry:Host@834,registry:Kind@150,whole:Route@153,whole:Route@561,whole:Route@837,whole:Route@943
        unclassified root read internal/edge/usagemeter.go:UsageMeter.RecordRateLimited registry:App@206,registry:Host@146,registry:Host@294,whole:Route@191
        unclassified root read internal/host/plans_pass.go:planRateCeilingFor whole:Route@108
        unclassified root read internal/registry/registry.go:Registry.SetRateLimit file:Exec@225,registry:remote@68,registry:remote@98,registry:sql@225,whole:remoteClient@100,whole:remoteClient@70
        changed legacy declaration internal/edge/edge.go:Edge.Reload
        changed legacy declaration internal/edge/edge.go:Edge.ServeHTTP
        changed legacy declaration internal/provision/reconcile.go:Reconcile
        changed legacy declaration internal/registry/registry.go:Registry.Fingerprint
        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
        
        make census-card shows what changed; make census-propose NAME=<branch> CLAIMS=<file> writes the overlay and its approval card (AGENTS.md, The census)
FAIL
FAIL	github.com/carlosframework/platform/internal/provision	23.666s
ok  	github.com/carlosframework/platform/internal/publicrelease	0.008s
ok  	github.com/carlosframework/platform/internal/ratelimit	0.116s
?   	github.com/carlosframework/platform/internal/regionname	[no test files]
ok  	github.com/carlosframework/platform/internal/registry	5.706s
ok  	github.com/carlosframework/platform/internal/relay	7.244s
ok  	github.com/carlosframework/platform/internal/release	25.612s
ok  	github.com/carlosframework/platform/internal/rollout	3.771s
ok  	github.com/carlosframework/platform/internal/rolloutwords	0.004s
ok  	github.com/carlosframework/platform/internal/rootaws	0.008s
ok  	github.com/carlosframework/platform/internal/rootparticipation	0.062s
ok  	github.com/carlosframework/platform/internal/rootstate	0.028s
ok  	github.com/carlosframework/platform/internal/runs	0.540s
ok  	github.com/carlosframework/platform/internal/s3compat	0.007s
ok  	github.com/carlosframework/platform/internal/safefile	0.008s
ok  	github.com/carlosframework/platform/internal/schedule	2.652s
ok  	github.com/carlosframework/platform/internal/seeds	0.012s
ok  	github.com/carlosframework/platform/internal/sim/engines	2.616s
ok  	github.com/carlosframework/platform/internal/sim/hostlife	10.345s
ok  	github.com/carlosframework/platform/internal/sim/litestreamfacts	4.405s
ok  	github.com/carlosframework/platform/internal/status	0.084s
ok  	github.com/carlosframework/platform/internal/steering	0.009s
ok  	github.com/carlosframework/platform/internal/stopevidence	0.359s
ok  	github.com/carlosframework/platform/internal/svcrole	0.002s
ok  	github.com/carlosframework/platform/internal/telemetry	0.005s
ok  	github.com/carlosframework/platform/internal/termfence	0.004s
ok  	github.com/carlosframework/platform/internal/tunnelclient	0.007s
ok  	github.com/carlosframework/platform/internal/unixdial	0.008s
ok  	github.com/carlosframework/platform/internal/updatewords	0.005s
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.660s
FAIL
=== internal_console@0 (79 s)
ok  	github.com/carlosframework/platform/internal/console	78.218s
=== internal_console@1 (43 s)
ok  	github.com/carlosframework/platform/internal/console	41.781s
=== internal_console@2 (41 s)
ok  	github.com/carlosframework/platform/internal/console	39.599s
=== internal_console@3 (42 s)
ok  	github.com/carlosframework/platform/internal/console	40.315s
=== internal_console@4 (41 s)
ok  	github.com/carlosframework/platform/internal/console	40.086s
=== internal_console@5 (40 s)
ok  	github.com/carlosframework/platform/internal/console	39.193s
=== internal_console@6 (36 s)
ok  	github.com/carlosframework/platform/internal/console	35.192s
=== internal_console@7 (46 s)
ok  	github.com/carlosframework/platform/internal/console	44.503s
=== root@0 (109 s)
ok  	github.com/carlosframework/platform	107.648s
=== root@1 (82 s)
ok  	github.com/carlosframework/platform	80.999s
=== root@2 (92 s)
ok  	github.com/carlosframework/platform	90.585s

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/edge/backhaul_share_test.go b/internal/edge/backhaul_share_test.go
new file mode 100644
index 000000000..59af83526
--- /dev/null
+++ b/internal/edge/backhaul_share_test.go
@@ -0,0 +1,268 @@
+package edge
+
+// The fair share over the sending edge's backhaul slots (#358): while a
+// destination box's slots are at least half taken, one client cannot take
+// more than backhaulClientShare of them.
+
+import (
+ "context"
+ "io"
+ "net"
+ "net/http"
+ "net/http/httptest"
+ "strings"
+ "sync"
+ "sync/atomic"
+ "testing"
+)
+
+const (
+ shareClientA = "203.0.113.1"
+ shareClientB = "203.0.113.2"
+)
+
+// shareScene is a sending edge whose host example.com is homed on box
+// "betty", fronted by a server that sets each request's peer address from
+// rlPeerHeader.
+type shareScene struct {
+ e *Edge
+ front *httptest.Server
+ home *homeEdgeRecord
+ eip string
+}
+
+func newShareScene(t *testing.T, mode RateMode) *shareScene {
+ t.Helper()
+ e, m, _ := hopEdge(t, "annie", "local.test")
+ e.rateMode = mode
+ rec, eip := fakeHomeEdge(t, nil)
+ homedOn(t, m, "betty", eip, "example.com")
+ front := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ if p := r.Header.Get(rlPeerHeader); p != "" {
+ r.Header.Del(rlPeerHeader)
+ r.RemoteAddr = net.JoinHostPort(p, "40000")
+ }
+ e.ServeHTTP(w, r)
+ }))
+ t.Cleanup(front.Close)
+ return &shareScene{e: e, front: front, home: rec, eip: eip}
+}
+
+// get sends one request for example.com from peer and reads the answer.
+func (s *shareScene) get(t *testing.T, peer string) (*http.Response, string) {
+ t.Helper()
+ req, err := http.NewRequest(http.MethodGet, s.front.URL+"/", nil)
+ if err != nil {
+ t.Fatal(err)
+ }
+ req.Host = "example.com"
+ req.Header.Set(rlPeerHeader, peer)
+ req.Header.Set("Accept-Encoding", "identity")
+ resp, err := rlClient.Do(req)
+ if err != nil {
+ t.Fatalf("GET from %s: %v", peer, err)
+ }
+ defer resp.Body.Close()
+ b, err := io.ReadAll(resp.Body)
+ if err != nil {
+ t.Fatal(err)
+ }
+ return resp, string(b)
+}
+
+// hold takes n slots toward betty for peer, failing the test if any is
+// refused, and gives them back when the test ends.
+func (s *shareScene) hold(t *testing.T, peer string, n int) {
+ t.Helper()
+ key := ""
+ if peer != "" {
+ key = peer + "/32"
+ }
+ for i := 0; i < n; i++ {
+ release, ok, shed := s.e.backhaulAcquire("betty", key)
+ if !ok || shed {
+ t.Fatalf("holding slot %d for %q: ok=%v shed=%v", i+1, peer, ok, shed)
+ }
+ t.Cleanup(release)
+ }
+}
+
+func (s *shareScene) inflight() int64 {
+ v, ok := s.e.backhaulInflight.Load("betty")
+ if !ok {
+ return 0
+ }
+ return v.(*atomic.Int64).Load()
+}
+
+func TestBackhaulShareShedsHeavyClient(t *testing.T) {
+ s := newShareScene(t, RateEnforce)
+ buf := captureLog(t)
+ s.hold(t, shareClientA, 32) // the 32nd is admitted: 31 were held before it
+
+ resp, body := s.get(t, shareClientA)
+ if resp.StatusCode != http.StatusTooManyRequests {
+ t.Fatalf("A's 33rd: status = %d, want 429", resp.StatusCode)
+ }
+ if got := resp.Header.Get("Retry-After"); got != "1" {
+ t.Fatalf("Retry-After = %q, want 1", got)
+ }
+ if got := resp.Header.Get("Cache-Control"); got != "no-store" {
+ t.Fatalf("Cache-Control = %q, want no-store", got)
+ }
+ if body != rateLimitBody {
+ t.Fatalf("body = %q, want the rate-limit body", body)
+ }
+ if n := s.home.get().n; n != 0 {
+ t.Fatalf("the home edge saw %d request(s), want none: a refused hop must not dial", n)
+ }
+ if got := s.inflight(); got != 32 {
+ t.Fatalf("box count = %d after the refusal, want 32: the refusal must roll its increment back", got)
+ }
+ if !strings.Contains(buf.String(), "refused") {
+ t.Fatalf("no refusal logged: %s", buf.String())
+ }
+
+ resp, body = s.get(t, shareClientB)
+ if resp.StatusCode != http.StatusOK || body != homeEdgeBody {
+ t.Fatalf("B: status = %d body = %q, want the home edge's 200: another client is not shed", resp.StatusCode, body)
+ }
+}
+
+func TestBackhaulShareQuietAdmitsHeavyClient(t *testing.T) {
+ s := newShareScene(t, RateEnforce)
+ s.hold(t, shareClientA, 31)
+
+ resp, body := s.get(t, shareClientA)
+ if resp.StatusCode != http.StatusOK || body != homeEdgeBody {
+ t.Fatalf("status = %d body = %q, want 200: 31 slots held is under half of 64", resp.StatusCode, body)
+ }
+}
+
+func TestBackhaulSaturationUnchanged(t *testing.T) {
+ s := newShareScene(t, RateEnforce)
+ s.hold(t, "", 64) // unkeyed, so the share plays no part
+
+ resp, _ := s.get(t, shareClientA)
+ if resp.StatusCode != http.StatusServiceUnavailable {
+ t.Fatalf("status = %d, want the existing 503 at 64 slots", resp.StatusCode)
+ }
+ if got := resp.Header.Get("Retry-After"); got != "2" {
+ t.Fatalf("Retry-After = %q, want 2", got)
+ }
+ if got := s.inflight(); got != 64 {
+ t.Fatalf("box count = %d, want 64", got)
+ }
+}
+
+// A heavy client at saturation is still told the box is full, not that it is
+// using too much: the cap is checked before the share.
+func TestBackhaulSaturationBeatsShare(t *testing.T) {
+ s := newShareScene(t, RateEnforce)
+ s.hold(t, shareClientA, 32)
+ s.hold(t, "", 32)
+
+ resp, _ := s.get(t, shareClientA)
+ if resp.StatusCode != http.StatusServiceUnavailable {
+ t.Fatalf("status = %d, want 503", resp.StatusCode)
+ }
+}
+
+func TestBackhaulShareObserveOnlyLogs(t *testing.T) {
+ s := newShareScene(t, RateObserve)
+ buf := captureLog(t)
+ s.hold(t, shareClientA, 32)
+
+ resp, body := s.get(t, shareClientA)
+ if resp.StatusCode != http.StatusOK || body != homeEdgeBody {
+ t.Fatalf("status = %d body = %q, want 200: observe never refuses", resp.StatusCode, body)
+ }
+ if !strings.Contains(buf.String(), "would refuse") {
+ t.Fatalf("no \"would refuse\" line: %s", buf.String())
+ }
+}
+
+func TestBackhaulShareOffTakesNoPart(t *testing.T) {
+ s := newShareScene(t, RateOff)
+ buf := captureLog(t)
+ s.hold(t, shareClientA, 33)
+
+ resp, _ := s.get(t, shareClientA)
+ if resp.StatusCode != http.StatusOK {
+ t.Fatalf("status = %d, want 200: the limiter is off", resp.StatusCode)
+ }
+ if strings.Contains(buf.String(), "refuse") {
+ t.Fatalf("off logged a refusal: %s", buf.String())
+ }
+}
+
+// The edge-local door's calls are the box's own traffic and never shed. The
+// door reaches backhaulTo directly (serveDoor), so the test does too.
+func TestBackhaulShareDoorExempt(t *testing.T) {
+ s := newShareScene(t, RateEnforce)
+ s.hold(t, shareClientA, 32)
+
+ req := httptest.NewRequest(http.MethodGet, "http://example.com/", nil)
+ req.RemoteAddr = net.JoinHostPort(shareClientA, "40000")
+ req = req.WithContext(context.WithValue(req.Context(), doorCallerKey{}, doorCaller{Account: "shop", App: "web"}))
+ rec := httptest.NewRecorder()
+ if !s.e.backhaulTo(rec, req, "example.com", s.eip, "betty") {
+ t.Fatal("backhaulTo declined the request")
+ }
+ if rec.Code != http.StatusOK || rec.Body.String() != homeEdgeBody {
+ t.Fatalf("door caller: status = %d body = %q, want 200: a door caller is never shed", rec.Code, rec.Body.String())
+ }
+}
+
+// A slot's share and its box count both come back, once, whatever the
+// release order and however often release is called.
+func TestBackhaulShareReleaseGivesBothBack(t *testing.T) {
+ e, _, _ := hopEdge(t, "annie", "local.test")
+ e.rateMode = RateEnforce
+ var rels []func()
+ for i := 0; i < 8; i++ {
+ rel, ok, shed := e.backhaulAcquire("betty", "198.51.100.7/32")
+ if !ok || shed {
+ t.Fatalf("slot %d: ok=%v shed=%v", i+1, ok, shed)
+ }
+ rels = append(rels, rel)
+ }
+ for _, rel := range rels {
+ rel()
+ rel()
+ }
+ if v, _ := e.backhaulInflight.Load("betty"); v.(*atomic.Int64).Load() != 0 {
+ t.Fatalf("box count = %d after every release, want 0", v.(*atomic.Int64).Load())
+ }
+ sv, _ := e.backhaulShares.Load("betty")
+ if got := sv.(interface{ Held(string) int }).Held("198.51.100.7/32"); got != 0 {
+ t.Fatalf("client still holds %d slot(s) after every release", got)
+ }
+}
+
+// Concurrent clients never push the box over its cap, and everything is
+// given back; run under -race.
+func TestBackhaulShareConcurrent(t *testing.T) {
+ e, _, _ := hopEdge(t, "annie", "local.test")
+ e.rateMode = RateEnforce
+ var wg sync.WaitGroup
+ for c := 0; c < 8; c++ {
+ key := "203.0.113." + string(rune('1'+c)) + "/32"
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ for i := 0; i < 500; i++ {
+ if rel, ok, _ := e.backhaulAcquire("betty", key); ok {
+ if v, _ := e.backhaulInflight.Load("betty"); v.(*atomic.Int64).Load() > backhaulMaxInflight.Load() {
+ t.Error("box count over the cap")
+ }
+ rel()
+ }
+ }
+ }()
+ }
+ wg.Wait()
+ if v, _ := e.backhaulInflight.Load("betty"); v.(*atomic.Int64).Load() != 0 {
+ t.Fatalf("box count = %d at rest, want 0", v.(*atomic.Int64).Load())
+ }
+}
diff --git a/internal/edge/edge.go b/internal/edge/edge.go
index e4beee12c..ed155629d 100644
--- a/internal/edge/edge.go
+++ b/internal/edge/edge.go
@@ -282,6 +282,10 @@ type Edge struct {
// subdomain a backhaul target, so a per-host key would let a stranger
// grow this map without limit. Bounded by the deployment's box count.
backhaulInflight sync.Map // box → *atomic.Int64
+ // backhaulShares counts, per destination box, the slots each client
+ // holds, for the fair share in backhaulAcquire. Keyed by box for the
+ // reason backhaulInflight is; each Shares bounds its own client keys.
+ backhaulShares sync.Map // box → *ratelimit.Shares
// The edge-local door (door.go, #175 P7). doorPath and doorAddr come from
// WithEdgeDoor: the socket to listen on ("" = no door, the default) and
// the box's public address, which every door request presents as its
@@ -2818,11 +2822,45 @@ func backhaulInflightFromEnv() int {
return n
}
-// backhaulAcquire reserves one in-flight slot toward box, or reports
-// saturation. releaseSlot must be called exactly once when the hop's
-// ServeHTTP returns — a streaming or upgraded response holds its slot for the
-// life of the stream, deliberately: a long-lived stream IS sustained
-// cross-region egress, which is the thing being bounded.
+// backhaulClientShare is the most slots one client may hold toward a
+// destination box while the box is at least half full. A fixed number, not a
+// setting: the sending edge has no route row to read one from (#358).
+const backhaulClientShare = 8
+
+// backhaulSharesMaxKeys bounds the clients tracked per destination box.
+const backhaulSharesMaxKeys = 10_000
+
+// backhaulClientKey is the fair-share key of the client behind r, or "" when
+// r is not shared out: the limiter is off, a door caller (the box's own
+// traffic), a request that came over a fleet tunnel (its address is the hub's,
+// so every client would be one key), or an address with no usable prefix.
+func (e *Edge) backhaulClientKey(r *http.Request) string {
+ if e.rateMode == RateOff {
+ return ""
+ }
+ if _, door := doorCallerFrom(r.Context()); door || fromTunnel(r.Context()) {
+ return ""
+ }
+ p, ok := ratelimit.ClientKey(clientIP(r))
+ if !ok {
+ return ""
+ }
+ return p.String()
+}
+
+// backhaulAcquire reserves one in-flight slot toward box, or reports why it
+// cannot: saturation (ok and shed both false, the box's cap is spent) or a
+// fair-share refusal (shed true). releaseSlot must be called exactly once
+// when the hop's ServeHTTP returns — a streaming or upgraded response holds
+// its slot for the life of the stream, deliberately: a long-lived stream IS
+// sustained cross-region egress, which is the thing being bounded.
+//
+// The fair share is the home edge's rule over the sending edge's slots: while
+// the box's slots are at least half taken, a client that already holds
+// backhaulClientShare of them is refused, so one client cannot fill the hop
+// and push everyone else to 503 while the instance is quiet. clientKey ""
+// takes no part in it. In observe mode the refusal is logged and the request
+// takes its slot and share anyway.
//
// The counter is per home BOX and the map is never keyed by anything a
// stranger controls (backhaulInflight's own doc). The count is incremented
@@ -2831,8 +2869,9 @@ func backhaulInflightFromEnv() int {
// request arriving inside another's rollback window can be refused while a
// slot is in fact free. Both errors are in the safe direction — a refusal is
// a 503 the client retries in two seconds, where an over-admission would be
-// cross-region bytes the cap exists to prevent.
-func (e *Edge) backhaulAcquire(box string) (releaseSlot func(), ok bool) {
+// cross-region bytes the cap exists to prevent. A fair-share refusal rolls
+// the count back the same way.
+func (e *Edge) backhaulAcquire(box, clientKey string) (releaseSlot func(), ok bool, shed bool) {
// Load first, like backhaulTransport: LoadOrStore would allocate a
// counter per backhauled request just to throw it away on the hit path.
v, hit := e.backhaulInflight.Load(box)
@@ -2840,15 +2879,50 @@ func (e *Edge) backhaulAcquire(box string) (releaseSlot func(), ok bool) {
v, _ = e.backhaulInflight.LoadOrStore(box, new(atomic.Int64))
}
n := v.(*atomic.Int64)
- if n.Add(1) > backhaulMaxInflight.Load() {
+ limit := backhaulMaxInflight.Load()
+ held := n.Add(1)
+ if held > limit {
n.Add(-1)
- return nil, false
+ return nil, false, false
}
// Once-guarded because a slot released twice would let the cap drift
// upwards for the life of the process — the one failure mode of a
// hand-released semaphore, and cheaper to make impossible than to audit.
var once sync.Once
- return func() { once.Do(func() { n.Add(-1) }) }, true
+ var releaseShare func()
+ if clientKey != "" && e.rateMode != RateOff {
+ sv, hit := e.backhaulShares.Load(box)
+ if !hit {
+ sv, _ = e.backhaulShares.LoadOrStore(box, ratelimit.NewShares(backhaulSharesMaxKeys))
+ }
+ shares := sv.(*ratelimit.Shares)
+ // Busy is the slots already taken, not counting this request.
+ busy := held-1 >= limit/2
+ rel, admitted := shares.Acquire(clientKey, busy, backhaulClientShare)
+ if !admitted {
+ verb := "refused"
+ if e.rateMode == RateObserve {
+ verb = "would refuse"
+ }
+ e.logThrottled("backhaul-share "+box, fmt.Sprintf(
+ "backhaul to %s is at least half full (%d of %d slots) and client %s holds %d of them — %s the request (fair share %d)",
+ box, held-1, limit, clientKey, shares.Held(clientKey), verb, backhaulClientShare))
+ if e.rateMode == RateEnforce {
+ n.Add(-1)
+ return nil, false, true
+ }
+ rel, _ = shares.Acquire(clientKey, false, backhaulClientShare)
+ }
+ releaseShare = rel
+ }
+ return func() {
+ once.Do(func() {
+ if releaseShare != nil {
+ releaseShare()
+ }
+ n.Add(-1)
+ })
+ }, true, false
}
// backhaulPort is the port a home edge answers on. Always 443 in production —
@@ -2940,7 +3014,13 @@ func (e *Edge) backhaulTo(w http.ResponseWriter, r *http.Request, host, eip, box
// edge, which would lie to a legitimate client about where its app lives.
// The log key is per home BOX, like "backhaul-error "+box below and for
// the same bounded-key reason.
- releaseSlot, ok := e.backhaulAcquire(box)
+ releaseSlot, ok, shed := e.backhaulAcquire(box, e.backhaulClientKey(r))
+ if shed {
+ // The fair share, not saturation: this client holds its share of a
+ // busy hop. The same 429 the home edge gives (writeRateLimited).
+ writeRateLimited(w, time.Second)
+ return true
+ }
if !ok {
e.logThrottled("backhaul-saturated "+box,
fmt.Sprintf("backhaul to %s (%s) is at its in-flight cap (%d) — answering 503 + Retry-After: 2", box, eip, backhaulMaxInflight.Load()))
diff --git a/internal/edge/homemap_test.go b/internal/edge/homemap_test.go
index 898eaf95f..2e38542e8 100644
--- a/internal/edge/homemap_test.go
+++ b/internal/edge/homemap_test.go
@@ -1360,7 +1360,7 @@ func TestBackhaulInflightCapIsPerHomeBox(t *testing.T) {
// would hang for the whole 5s budget and be visible as a failure.)
homedOn(t, m, "betty", "192.0.2.5", "saturated.test")
- release, ok := e.backhaulAcquire("betty")
+ release, ok, _ := e.backhaulAcquire("betty", "")
if !ok {
t.Fatal("the first slot toward a box must always be available")
}
@@ -1457,7 +1457,7 @@ func TestBackhaulSaturationLogsThrottledPerBox(t *testing.T) {
homedOn(t, m, "betty", "192.0.2.5", "betty.test")
homedOn(t, m, "carol", "192.0.2.6", "carol.test")
for _, box := range []string{"betty", "carol"} {
- release, ok := e.backhaulAcquire(box)
+ release, ok, _ := e.backhaulAcquire(box, "")
if !ok {
t.Fatalf("%s: the first slot toward a box must always be available", box)
}