carlos / platform Public

host: an empty listing gives a release position 0 only for writer session 0, without a second replicator position reader

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Paul Campbell pushed by claude agent, operated by paul@keymail.dev 734e8424dcae56447a92dc63177cedefa9e37b2e parent 95a1ed8
5 files changed, +41 −126
  • internal/activator/fenceowner_test.go +18 −5
  • internal/host/relocationassembly.go +9 −15
  • internal/host/relocationassembly_test.go +14 −28
  • internal/lease/lease.go +0 −15
  • internal/lease/position_test.go +0 −63

CI failed — run details

CI log
=== gate ===
cd launchctx && go vet ./... && go test ./... -count=1
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]
go vet ./...
gofmt -l .: clean
go test ./... -count=1 -timeout 30m
ok  	github.com/carlosframework/platform	304.986s
?   	github.com/carlosframework/platform/cmd/changelog	[no test files]
ok  	github.com/carlosframework/platform/cmd/console	3.313s
ok  	github.com/carlosframework/platform/internal/activator	136.769s
ok  	github.com/carlosframework/platform/internal/agentsock	0.019s
ok  	github.com/carlosframework/platform/internal/alerting	0.006s
ok  	github.com/carlosframework/platform/internal/analytics	0.018s
ok  	github.com/carlosframework/platform/internal/appconfig	2.210s
ok  	github.com/carlosframework/platform/internal/apperr	0.083s
ok  	github.com/carlosframework/platform/internal/applog	0.160s
ok  	github.com/carlosframework/platform/internal/awsinv	0.005s
ok  	github.com/carlosframework/platform/internal/boxchoice	0.008s
ok  	github.com/carlosframework/platform/internal/boxid	0.410s
?   	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.011s
ok  	github.com/carlosframework/platform/internal/caps	0.016s
ok  	github.com/carlosframework/platform/internal/certwarm	0.003s
ok  	github.com/carlosframework/platform/internal/cgroup	0.198s
ok  	github.com/carlosframework/platform/internal/changelog	0.286s
ok  	github.com/carlosframework/platform/internal/clamd	0.055s
?   	github.com/carlosframework/platform/internal/cliflag	[no test files]
ok  	github.com/carlosframework/platform/internal/console	317.582s
?   	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	5.672s
ok  	github.com/carlosframework/platform/internal/dbdoor/dbdoortest	0.010s
ok  	github.com/carlosframework/platform/internal/dbverify	0.005s
ok  	github.com/carlosframework/platform/internal/dnsrec	0.006s
ok  	github.com/carlosframework/platform/internal/docsite	0.005s
ok  	github.com/carlosframework/platform/internal/domains	1.977s
ok  	github.com/carlosframework/platform/internal/doorkey	0.009s
ok  	github.com/carlosframework/platform/internal/economics	0.005s
ok  	github.com/carlosframework/platform/internal/edge	25.772s
?   	github.com/carlosframework/platform/internal/edgeproof	[no test files]
ok  	github.com/carlosframework/platform/internal/edgesfile	0.007s
ok  	github.com/carlosframework/platform/internal/fleetapi	0.140s
ok  	github.com/carlosframework/platform/internal/gate	1.656s
ok  	github.com/carlosframework/platform/internal/genselect	0.025s
ok  	github.com/carlosframework/platform/internal/geo	0.012s
ok  	github.com/carlosframework/platform/internal/geoip	0.031s
ok  	github.com/carlosframework/platform/internal/host	44.653s
ok  	github.com/carlosframework/platform/internal/hostactors	0.367s
ok  	github.com/carlosframework/platform/internal/hostbox	1.490s
ok  	github.com/carlosframework/platform/internal/hostclaim	0.404s
ok  	github.com/carlosframework/platform/internal/hostevidence	0.008s
ok  	github.com/carlosframework/platform/internal/hostexec	0.332s
ok  	github.com/carlosframework/platform/internal/hostfence	0.036s
ok  	github.com/carlosframework/platform/internal/hostfiles	4.068s
ok  	github.com/carlosframework/platform/internal/hostfloor	0.012s
ok  	github.com/carlosframework/platform/internal/hostguard	0.140s
ok  	github.com/carlosframework/platform/internal/hostops	1.272s
ok  	github.com/carlosframework/platform/internal/hostquarantine	0.002s
ok  	github.com/carlosframework/platform/internal/hostrelocate	0.384s
ok  	github.com/carlosframework/platform/internal/hostresolve	0.143s
ok  	github.com/carlosframework/platform/internal/hostwrite	0.002s
ok  	github.com/carlosframework/platform/internal/infraview	0.002s
ok  	github.com/carlosframework/platform/internal/instancectl	1.702s
ok  	github.com/carlosframework/platform/internal/instanceexec	2.696s
ok  	github.com/carlosframework/platform/internal/instancefs	0.009s
ok  	github.com/carlosframework/platform/internal/instancekey	0.004s
ok  	github.com/carlosframework/platform/internal/layout	1.335s
ok  	github.com/carlosframework/platform/internal/lease	9.438s
ok  	github.com/carlosframework/platform/internal/lease/leasetest	0.006s
ok  	github.com/carlosframework/platform/internal/ledger	0.017s
ok  	github.com/carlosframework/platform/internal/mail	0.169s
ok  	github.com/carlosframework/platform/internal/maintenance	0.080s
ok  	github.com/carlosframework/platform/internal/maintenanceexec	5.497s
ok  	github.com/carlosframework/platform/internal/maintenanceguard	0.067s
ok  	github.com/carlosframework/platform/internal/metrics	0.005s
ok  	github.com/carlosframework/platform/internal/moves	21.144s
ok  	github.com/carlosframework/platform/internal/moves/archive	0.749s
ok  	github.com/carlosframework/platform/internal/objstore	0.171s
ok  	github.com/carlosframework/platform/internal/ops	0.156s
ok  	github.com/carlosframework/platform/internal/park	0.199s
ok  	github.com/carlosframework/platform/internal/privatefile	0.004s
2026/10/11 20:56:12 provision: listing apps/bab/blog/instances/: list refused — its records are unseen this pass
2026/10/11 20:56:12 provision: listing apps/bab/: listdirs refused — its records are unseen this pass
2026/10/11 20:56:12 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:12 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:12 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:12 provision: listing apps/bac/tito/instances/: list refused — its records are unseen this pass
2026/10/11 20:56:12 provision: listing apps/bac/tito/instances/: list refused — its records are unseen this pass
2026/10/11 20:56:12 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/11 20:56:12 provision: remove retired instance route shop.example: provision: claim admission unavailable
2026/10/11 20:56:12 provision: remove retired instance route shop.example: provision: claim admission unavailable
2026/10/11 20:56:12 provision: remove retired sidecar route worker.sidecar.internal: provision: claim admission unavailable
2026/10/11 20:56:12 provision: remove retired sidecar route worker.sidecar.internal: provision: claim admission unavailable
2026/10/11 20:56:12 provision: claim install acme.go.tito.io: provision: claim admission unavailable
2026/10/11 20:56:12 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:12 provision: claim install acme.go.tito.io: registry: claim row ownership changed or unknown
2026/10/11 20:56:13 provision: claim install bot.eleven.bac.sidecar.internal: provision: claim admission unavailable
2026/10/11 20:56:13 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/11 20:56:13 provision: claim install bot.eleven.bac.sidecar.internal: registry: claim row ownership changed or unknown
2026/10/11 20:56:13 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/11 20:56:13 provision: acme.go.tito.io: not minting this pass: the box's layout intent could not be read: no sealed config
2026/10/11 20:56:13 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 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/11 20:56:13 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/11 20:56:13 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/11 20:56:13 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/11 20:56:13 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 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/11 20:56:13 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/11 20:56:13 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/11 20:56:13 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: claim install acme.go.tito.io: registry: claim row ownership changed or unknown
2026/10/11 20:56:13 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: claim install acme.go.tito.io: registry: claim row ownership changed or unknown
2026/10/11 20:56:13 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/11 20:56:13 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/11 20:56:13 provision: claim install bot.eleven.bac.sidecar.internal: registry: claim row ownership changed or unknown
2026/10/11 20:56:13 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/11 20:56:13 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/11 20:56:13 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/11 20:56:13 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/11 20:56:13 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/11 20:56:13 provision: skipping record apps/bac/tito/instances/new.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/11 20:56:13 provision: not removing acme.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/11 20:56:13 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/11 20:56:13 provision: skipping record apps/bac/tito/instances/new.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/11 20:56:13 provision: minted instance route rc.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route rd.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route rf.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route rg.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route rh.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route rj.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route rl.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route ra.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route rb.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route re.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route ri.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route rk.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route ra.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route rb.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route rc.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route rd.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: skipping record apps/bac/tito/instances/rb.go.tito.io.json: read failed: read refused
2026/10/11 20:56:13 provision: skipping record apps/bac/tito/instances/rb.go.tito.io.json: read failed: read refused
2026/10/11 20:56:13 provision: minted instance route re.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route x.appa.example (app "appa" acct "bac")
2026/10/11 20:56:13 provision: minted instance route x.appf.example (app "appf" acct "bac")
2026/10/11 20:56:13 provision: minted instance route x.appg.example (app "appg" acct "bac")
2026/10/11 20:56:13 provision: minted instance route x.apph.example (app "apph" acct "bac")
2026/10/11 20:56:13 provision: minted instance route x.appi.example (app "appi" acct "bac")
2026/10/11 20:56:13 provision: minted instance route x.appb.example (app "appb" acct "bac")
2026/10/11 20:56:13 provision: minted instance route x.appc.example (app "appc" acct "bac")
2026/10/11 20:56:13 provision: minted instance route x.appd.example (app "appd" acct "bac")
2026/10/11 20:56:13 provision: minted instance route x.appe.example (app "appe" acct "bac")
2026/10/11 20:56:13 provision: minted instance route x.appj.example (app "appj" acct "bac")
2026/10/11 20:56:13 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/11 20:56:13 provision: minted instance route r0096.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0099.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0102.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0069.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0080.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0084.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0060.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0086.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0118.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0035.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0049.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0103.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0122.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0026.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0031.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0037.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0062.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0064.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0008.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0013.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0091.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0127.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0002.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0022.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0030.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0034.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0004.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0067.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0073.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0112.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0000.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0027.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0081.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0120.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0033.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0101.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0085.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0097.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0110.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0021.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0028.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0042.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0063.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0121.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0047.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0065.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0087.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0093.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0104.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0043.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0044.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0017.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0068.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0106.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0032.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0098.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0040.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0041.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0051.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0052.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0057.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0079.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0038.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0048.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0050.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0071.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0078.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0011.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0045.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0053.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0114.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0124.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0001.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0020.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0036.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0039.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0126.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0058.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0059.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0061.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0072.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0117.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0119.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0009.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0016.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0023.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0025.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0092.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0116.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0014.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0015.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0055.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0107.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0005.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0123.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0012.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0074.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0075.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0076.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0108.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0129.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0090.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0105.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0006.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0046.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0077.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0083.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0088.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0113.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0007.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0024.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0054.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0066.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0070.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0089.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0094.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0109.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0010.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0019.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0095.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0115.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0018.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0029.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0082.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0100.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0125.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0128.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0111.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0003.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:13 provision: minted instance route r0056.go.tito.io (app "tito" acct "bac")
--- FAIL: TestPlan9B8RecordWriteCensus (0.42s)
    plan9_b8_census_test.go:371: record-write census rejected 1 site(s); update the explicit inventory only after reviewing the source:
          changed site internal/hostops/operations.go:Controller.Attempt: source differs from the reviewed digest
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56: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/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: minted instance route console.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: minted service route ha.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: minted service route svc.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: minted instance route whole.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: minted instance route shared.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: converged acme.go.tito.io channel stable -> edge
2026/10/11 20:56:14 provision: converged acme.go.tito.io channel edge -> canary/rehearsal
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: empty channel
2026/10/11 20:56:14 provision: not removing acme.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: converged acme.go.tito.io environment "" -> "staging"
2026/10/11 20:56:14 provision: converged acme.go.tito.io environment "staging" -> ""
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: converged acme.go.tito.io steering "" -> "latency"
2026/10/11 20:56:14 provision: converged acme.go.tito.io steering "latency" -> ""
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: converged acme.go.tito.io hibernate false -> true
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: converged acme.go.tito.io hibernate true -> false (replication "daily" cleared: only a hibernating route's rung is read)
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: converged acme.go.tito.io status-named false -> true
2026/10/11 20:56:14 provision: converged acme.go.tito.io status-named true -> false
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: minted service route ha.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56: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/11 20:56: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/11 20:56: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/11 20:56:14 provision: minted service route whole.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56: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/11 20:56: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/11 20:56: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/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: minted service route whole.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: skipping accounts/bac/account.json: malformed account manifest: invalid character 'o' in literal null (expecting 'u')
2026/10/11 20:56:14 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: manifest bac/tito: read failed: provision: manifest bac/tito: invalid character 'o' in literal null (expecting 'u')
2026/10/11 20:56: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/11 20:56: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/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56: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/11 20:56:14 provision: not removing acme$evil.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/11 20:56: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/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56: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/11 20:56:14 provision: not removing bad-service.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/11 20:56:14 provision: skipping record apps/bac/tito/instances/no-channel.go.tito.io.json: empty channel
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: skipping record apps/bac/tito/instances/no-channel.go.tito.io.json: empty channel
2026/10/11 20:56:14 provision: not removing no-channel.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/11 20:56:14 provision: not removing acme.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/11 20:56:14 provision: removed retired instance route ghost.go.tito.io (record gone)
2026/10/11 20:56: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/11 20:56:14 provision: minted instance route dup.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/11 20:56:14 provision: removed retired instance route acme.go.tito.io (app in the trash)
2026/10/11 20:56:14 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/11 20:56:14 provision: removed retired static route site.go.tito.io (app in the trash)
2026/10/11 20:56: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/11 20:56:14 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/11 20:56:14 provision: removed retired instance route acme.go.tito.io (app in the trash)
2026/10/11 20:56:14 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/11 20:56: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/11 20:56:14 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/11 20:56:14 provision: converged acme.go.tito.io channel stable -> edge
2026/10/11 20:56:14 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/11 20:56:14 provision: converged acme.go.tito.io channel canary/rehearsal -> edge
2026/10/11 20:56:14 provision: converged acme.go.tito.io environment "staging" -> ""
2026/10/11 20:56:14 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/11 20:56: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/11 20:56: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/11 20:56: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/11 20:56: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/11 20:56: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/11 20:56: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/11 20:56:14 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/11 20:56:14 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/11 20:56:14 provision: dry-run: would converge owned.go.tito.io channel stable -> edge
2026/10/11 20:56:14 provision: dry-run: would converge owned.go.tito.io environment "" -> "staging"
2026/10/11 20:56:14 provision: dry-run: would converge owned.go.tito.io hibernate false -> true
2026/10/11 20:56:14 provision: dry-run: would converge owned.go.tito.io seed
2026/10/11 20:56:14 provision: dry-run: would mint instance route acme.go.tito.io (app "tito" acct "bac" channel "stable")
2026/10/11 20:56: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/11 20:56:14 provision: dry-run: would converge adopt.go.tito.io channel stable -> edge
2026/10/11 20:56:14 provision: dry-run: would converge adopt.go.tito.io environment "" -> "staging"
2026/10/11 20:56:14 provision: dry-run: would remove retired instance route gone.go.tito.io (record gone)
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:14 provision: adopted existing route adopt.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/11 20:56:14 provision: converged adopt.go.tito.io channel stable -> edge
2026/10/11 20:56:14 provision: converged adopt.go.tito.io environment "" -> "staging"
2026/10/11 20:56:14 provision: converged owned.go.tito.io channel stable -> edge
2026/10/11 20:56:14 provision: converged owned.go.tito.io environment "" -> "staging"
2026/10/11 20:56:14 provision: converged owned.go.tito.io hibernate false -> true
2026/10/11 20:56:14 provision: removed retired instance route gone.go.tito.io (record gone)
2026/10/11 20:56:14 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: adopted existing route story.carlosframework.com (app "story" acct "bad") — this record now owns its channel and environment
2026/10/11 20:56:15 provision: story.carlosframework.com exists but is not the route this record describes (kind "instance"/"static") — leaving it alone
2026/10/11 20:56:15 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted service route pubs.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted service route pub.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted instance route unit.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted instance route exec.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted service route loop.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted service route named.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted service route priv.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted static route pisite.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: removed retired static route site.go.tito.io (record gone)
2026/10/11 20:56:15 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted instance route acme-uk.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: converged acme.go.tito.io replicas "ie,uk" -> "uk"
2026/10/11 20:56:15 provision: converged acme.go.tito.io replicas "uk" -> ""
2026/10/11 20:56:15 provision: minted instance route acme-uk.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: converged acme-uk.go.tito.io replica mark true -> false
2026/10/11 20:56:15 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56: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/11 20:56:15 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/11 20:56:15 provision: acme.go.tito.io: not minting this pass: the box's layout intent could not be read: store down
2026/10/11 20:56:15 provision: router.go.tito.io: not minting this pass: the box's layout intent could not be read: store down
2026/10/11 20:56:15 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/11 20:56:15 provision: converged acme.go.tito.io channel stable -> edge
2026/10/11 20:56:15 provision: minted instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac")
2026/10/11 20:56:15 provision: not removing acme.go.tito.io (record gone): participant of a running operation
2026/10/11 20:56:15 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/11 20:56:15 provision: minted instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac")
2026/10/11 20:56: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/11 20:56:15 provision: held acme.go.tito.io landing by mv_acme (was ready)
2026/10/11 20:56:15 provision: acme.go.tito.io: held restoring by rb_other, not by mv_acme; leaving it
2026/10/11 20:56:15 provision: acme.go.tito.io: the row is not this pass's (app "other" acct ""); not holding it for mv_acme
2026/10/11 20:56:15 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/11 20:56: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/11 20:56: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/11 20:56:15 provision: held acme.go.tito.io landing by mv_acme (was ready)
2026/10/11 20:56:15 provision: removed retired sidecar route gone.eleven.bac.sidecar.internal (record gone)
2026/10/11 20:56:15 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/11 20:56:15 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/11 20:56:15 provision: converged sidecar bot.eleven.bac.sidecar.internal args ["sidecar","run"] -> ["worker","run"]
2026/10/11 20:56:15 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/11 20:56:15 provision: converged sidecar bot.eleven.bac.sidecar.internal ceilings 300/3600 -> 60/120
2026/10/11 20:56:15 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/11 20:56:15 provision: converged sidecar bot.eleven.bac.sidecar.internal channel stable -> canary/eleven
2026/10/11 20:56:15 provision: converged sidecar bot.eleven.bac.sidecar.internal environment "other" -> "relay"
2026/10/11 20:56:15 provision: converged sidecar bot.eleven.bac.sidecar.internal hibernate true -> false
2026/10/11 20:56:15 provision: skipping sidecar record apps/bac/eleven/sidecars/bot.json: read failed: failStore: reads disabled under apps/bac/eleven/sidecars/
2026/10/11 20:56:15 provision: skipping sidecar record apps/bac/eleven/sidecars/bot.json: malformed: invalid character 'n' looking for beginning of object key string
2026/10/11 20:56:15 provision: not removing sidecar bot.eleven.bac.sidecar.internal: its record exists but could not be read cleanly this pass
2026/10/11 20:56:15 provision: skipping sidecar record apps/bac/eleven/sidecars/bot.json: empty channel
2026/10/11 20:56:15 provision: skipping sidecar record apps/bac/eleven/sidecars/held.json: empty channel
2026/10/11 20:56:15 provision: not removing sidecar held.eleven.bac.sidecar.internal: its record exists but could not be read cleanly this pass
2026/10/11 20:56:15 provision: removed retired sidecar route old.eleven.bac.sidecar.internal (record gone)
2026/10/11 20:56:15 provision: bac/eleven has sidecar records but no sidecars manifest — not minting
2026/10/11 20:56:15 provision: bac/eleven is in the trash — not minting sidecar routes for it
2026/10/11 20:56:15 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/11 20:56:15 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/11 20:56:15 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/11 20:56:15 provision: minted sidecar route hub.relay.bac.sidecar.internal (app "relay" acct "bac" args ["relay"])
2026/10/11 20:56:15 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/11 20:56:15 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/11 20:56:15 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/11 20:56:15 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/11 20:56:15 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/11 20:56:15 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/11 20:56:15 provision: removed retired sidecar route bot.eleven.bac.sidecar.internal (record gone)
2026/10/11 20:56:15 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/11 20:56:15 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/11 20:56:15 provision: skipping sidecar record apps/bac/relay/sidecars/hub.json: read failed: failStore: reads disabled under apps/bac/relay/sidecars/
2026/10/11 20:56:15 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/11 20:56:15 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/11 20:56:15 provision: dry-run: would mint sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" channel "stable" args ["sidecar","run"])
2026/10/11 20:56:15 provision: dry-run: would remove retired sidecar route gone.eleven.bac.sidecar.internal (record gone)
2026/10/11 20:56:15 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
FAIL
FAIL	github.com/carlosframework/platform/internal/provision	3.006s
ok  	github.com/carlosframework/platform/internal/publicrelease	0.008s
ok  	github.com/carlosframework/platform/internal/registry	3.497s
ok  	github.com/carlosframework/platform/internal/relay	7.225s
ok  	github.com/carlosframework/platform/internal/release	17.578s
ok  	github.com/carlosframework/platform/internal/rollout	1.476s
ok  	github.com/carlosframework/platform/internal/rootaws	0.008s
ok  	github.com/carlosframework/platform/internal/s3compat	0.006s
ok  	github.com/carlosframework/platform/internal/safefile	0.004s
ok  	github.com/carlosframework/platform/internal/schedule	2.196s
ok  	github.com/carlosframework/platform/internal/sim/hostlife	2.387s
ok  	github.com/carlosframework/platform/internal/sim/litestreamfacts	4.074s
ok  	github.com/carlosframework/platform/internal/status	0.040s
ok  	github.com/carlosframework/platform/internal/steering	0.006s
ok  	github.com/carlosframework/platform/internal/stopevidence	0.080s
ok  	github.com/carlosframework/platform/internal/svcrole	0.002s
ok  	github.com/carlosframework/platform/internal/telemetry	0.004s
ok  	github.com/carlosframework/platform/internal/termfence	0.004s
ok  	github.com/carlosframework/platform/internal/tunnelclient	0.004s
ok  	github.com/carlosframework/platform/internal/unixdial	0.002s
ok  	github.com/carlosframework/platform/internal/updatewords	0.002s
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.558s
FAIL
make: *** [Makefile:18: 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/activator/fenceowner_test.go b/internal/activator/fenceowner_test.go
index 25c1054a5..58dbe8dd4 100644
--- a/internal/activator/fenceowner_test.go
+++ b/internal/activator/fenceowner_test.go
@@ -131,18 +131,26 @@ func TestAnOwnedCallNeverTakesBackAFenceReplacedWhileItWaited(t *testing.T) {
}
done := make(chan answer, 1)
go func() {
- proof, err := a.FenceAndStopAs(maintenanceContext(t, 5*time.Second), e.host, 12, "owner-1")
+ proof, err := a.FenceAndStopAs(maintenanceContext(t, 30*time.Second), e.host, 12, "owner-1")
done <- answer{proof, err}
}()
- for installed := false; !installed; {
+ for deadline := time.Now().Add(5 * time.Second); ; {
a.mu.Lock()
- installed = a.fences[e.host] == 12 && a.fenceOwners[e.host] == "owner-1"
+ installed := a.fences[e.host] == 12 && a.fenceOwners[e.host] == "owner-1"
a.mu.Unlock()
+ if installed {
+ break
+ }
+ if time.Now().After(deadline) {
+ t.Fatal("the owned call never installed its fence")
+ }
time.Sleep(time.Millisecond)
}
switch meanwhile {
case "a plain fence":
- if _, err := a.FenceAndStop(maintenanceContext(t, 20*time.Millisecond), e.host, 12); !errors.Is(err, ErrStopUnproven) {
+ // The stop is still in progress, so the plain call installs and
+ // then waits out its own deadline: ErrStopUnproven.
+ if _, err := a.FenceAndStop(maintenanceContext(t, 500*time.Millisecond), e.host, 12); !errors.Is(err, ErrStopUnproven) {
t.Fatalf("the plain fence: %v", err)
}
case "a plain lift":
@@ -154,7 +162,12 @@ func TestAnOwnedCallNeverTakesBackAFenceReplacedWhileItWaited(t *testing.T) {
delete(a.entries, e.host)
a.mu.Unlock()
close(stopped)
- got := <-done
+ var got answer
+ select {
+ case got = <-done:
+ case <-time.After(30 * time.Second):
+ t.Fatal("the owned call never answered after the stop completed")
+ }
if !errors.Is(got.err, ErrStopUnproven) || got.proof != nil {
t.Fatalf("the owned call after its fence was replaced: %v %v", got.proof, got.err)
}
diff --git a/internal/host/relocationassembly.go b/internal/host/relocationassembly.go
index a16b9b91a..9d72194ed 100644
--- a/internal/host/relocationassembly.go
+++ b/internal/host/relocationassembly.go
@@ -186,21 +186,19 @@ func (a ClaimAssembly) relocationFlushDB(cfg RelocationAssemblyConfig) func(cont
// database flush uses (lease.Replicator).
type releaseReplica interface {
SyncAndWait(context.Context) error
- Position() (uint64, error)
}
// releaseFinalTXID is release step 2 (ruling 8): SyncAndWait with every
// writer stopped, then N is the newest level-0 MaxTXID, which must equal
// the plan's MaxTXID.
//
-// An empty listing is not evidence of an empty database (fix round 1, I2):
-// a wrong bucket, or a listing not yet visible, reads the same. N is 0
-// only when the holder's writer session is 0 (no writer was ever admitted,
-// pin.go's "session-0" and ruling 25) and the replicator's own position
-// (lease.Replicator.Position, litestream's newest local LTX) is 0 too.
-// Any other empty listing refuses: the release is never journaled, and the
-// worker marks the op stuck ReleaseDeadline after releasing began, for an
-// operator, as a refused pin leaves it.
+// An empty listing is not evidence of an empty database (fix round 1, I2;
+// N1): a wrong bucket, or a listing not yet visible, reads the same. N is
+// 0 only for writer session 0, a holder no writer was ever admitted to
+// (pin.go's "session-0", ruling 25). An empty listing for any other
+// session refuses: the release is never journaled, and the worker marks
+// the op stuck ReleaseDeadline after releasing began, for an operator, as
+// a refused pin leaves it.
func releaseFinalTXID(ctx context.Context, rep releaseReplica, sel func(context.Context, genselect.Request) (*genselect.Plan, error), req genselect.Request) (uint64, error) {
if rep == nil || sel == nil {
return 0, ErrClaimStopUnavailable
@@ -208,16 +206,12 @@ func releaseFinalTXID(ctx context.Context, rep releaseReplica, sel func(context.
if err := rep.SyncAndWait(ctx); err != nil {
return 0, err
}
- pos, err := rep.Position()
- if err != nil {
- return 0, err
- }
plan, err := sel(ctx, req)
if errors.Is(err, genselect.ErrEmpty) {
- if req.Holder.Session == 0 && pos == 0 {
+ if req.Holder.Session == 0 {
return 0, nil
}
- return 0, fmt.Errorf("%w: the listing is empty for writer session %d, whose replicator is at %d", ErrClaimStopUnavailable, req.Holder.Session, pos)
+ return 0, fmt.Errorf("%w: the listing is empty for writer session %d", ErrClaimStopUnavailable, req.Holder.Session)
}
if err != nil {
return 0, err
diff --git a/internal/host/relocationassembly_test.go b/internal/host/relocationassembly_test.go
index 7d5a9bb40..c0fd96c5b 100644
--- a/internal/host/relocationassembly_test.go
+++ b/internal/host/relocationassembly_test.go
@@ -16,12 +16,10 @@ import (
)
// fakeReleaseReplica is the session's replicator as releaseFinalTXID sees
-// it: SyncAndWait, then its own position.
+// it: SyncAndWait.
type fakeReleaseReplica struct {
calls []string
syncErr error
- pos uint64
- posErr error
}
func (r *fakeReleaseReplica) SyncAndWait(context.Context) error {
@@ -29,17 +27,12 @@ func (r *fakeReleaseReplica) SyncAndWait(context.Context) error {
return r.syncErr
}
-func (r *fakeReleaseReplica) Position() (uint64, error) {
- r.calls = append(r.calls, "position")
- return r.pos, r.posErr
-}
-
-// Fix round 1, I2: an empty listing is not evidence of an empty database.
-// FinalTXID 0 comes only from a writer session 0 whose replicator is at 0
-// too; a wrong bucket (an empty listing while the replicator reports a
-// position) refuses, and so does an empty listing for an admitted writer.
-// A listing is read only after the replicator synced and reported.
-func TestReleaseFinalTXIDNeedsTheReplicatorsOwnEvidence(t *testing.T) {
+// Fix round 1, I2 (N1): an empty listing is not evidence of an empty
+// database. FinalTXID 0 comes only from writer session 0, a holder no
+// writer was ever admitted to; an empty listing for any other session (a
+// wrong bucket, a listing not yet visible) refuses. The listing is read
+// only after the replicator synced.
+func TestReleaseFinalTXIDIsZeroOnlyForWriterSessionZero(t *testing.T) {
ctx := context.Background()
failure := errors.New("s3: access denied")
for _, tc := range []struct {
@@ -52,15 +45,12 @@ func TestReleaseFinalTXIDNeedsTheReplicatorsOwnEvidence(t *testing.T) {
refuses bool
calls []string
}{
- {name: "the wrong bucket: an empty listing, the replicator at 41", session: 6, rep: fakeReleaseReplica{pos: 41}, selErr: genselect.ErrEmpty, refuses: true},
- {name: "an empty listing for an admitted writer whose replicator is at 0", session: 6, selErr: genselect.ErrEmpty, refuses: true},
- {name: "an empty listing for session 0 whose replicator is at 3", rep: fakeReleaseReplica{pos: 3}, selErr: genselect.ErrEmpty, refuses: true},
+ {name: "the wrong bucket: an empty listing for writer session 6", session: 6, selErr: genselect.ErrEmpty, refuses: true},
{name: "a genuinely empty session-0 database", selErr: genselect.ErrEmpty, want: 0},
- {name: "a listing at the database's position", session: 6, rep: fakeReleaseReplica{pos: 41}, plan: &genselect.Plan{MaxTXID: 41, MaxLevel0TXID: 41}, want: 41},
- {name: "level 0 behind the database", session: 6, rep: fakeReleaseReplica{pos: 41}, plan: &genselect.Plan{MaxTXID: 41, MaxLevel0TXID: 40}, refuses: true},
- {name: "a listing that fails", session: 6, rep: fakeReleaseReplica{pos: 41}, selErr: failure, refuses: true},
- {name: "a sync that fails", session: 6, rep: fakeReleaseReplica{syncErr: failure}, refuses: true, calls: []string{"sync"}},
- {name: "a position that cannot be read", session: 0, rep: fakeReleaseReplica{posErr: failure}, refuses: true, calls: []string{"sync", "position"}},
+ {name: "a listing at the database's position", session: 6, plan: &genselect.Plan{MaxTXID: 41, MaxLevel0TXID: 41}, want: 41},
+ {name: "level 0 behind the database", session: 6, plan: &genselect.Plan{MaxTXID: 41, MaxLevel0TXID: 40}, refuses: true},
+ {name: "a listing that fails", session: 6, selErr: failure, refuses: true},
+ {name: "a sync that fails", session: 0, rep: fakeReleaseReplica{syncErr: failure}, refuses: true, calls: []string{"sync"}},
} {
t.Run(tc.name, func(t *testing.T) {
rep := tc.rep
@@ -80,12 +70,8 @@ func TestReleaseFinalTXIDNeedsTheReplicatorsOwnEvidence(t *testing.T) {
} else if err != nil || got != tc.want {
t.Fatalf("got %d %v, want %d", got, err, tc.want)
}
- want := tc.calls
- if want == nil {
- want = []string{"sync", "position"}
- }
- if !slices.Equal(rep.calls, want) || selected != (tc.calls == nil) {
- t.Fatalf("ran %v selected=%v, want %v", rep.calls, selected, want)
+ if !slices.Equal(rep.calls, []string{"sync"}) || selected != (tc.calls == nil) {
+ t.Fatalf("ran %v selected=%v", rep.calls, selected)
}
})
}
diff --git a/internal/lease/lease.go b/internal/lease/lease.go
index 24c109ac1..61788e219 100644
--- a/internal/lease/lease.go
+++ b/internal/lease/lease.go
@@ -392,21 +392,6 @@ func (r *Replicator) SyncAndWait(ctx context.Context) error {
return r.db.SyncAndWait(ctx)
}
-// Position is the replicator's own position: the newest TXID litestream
-// has turned into a local level-0 LTX file (litestream's DB.Pos, which
-// keeps the newest L0 file through retention). After a SyncAndWait that
-// returned nil the replica holds everything up to it. Zero, with a nil
-// error, only when litestream holds no LTX file at all: nothing was ever
-// committed through this replicator's database. An unreadable LTX
-// directory or file is an error, never zero.
-func (r *Replicator) Position() (uint64, error) {
- pos, err := r.db.Pos()
- if err != nil {
- return 0, err
- }
- return uint64(pos.TXID), nil
-}
-
// Err reports whether lease renewal has failed (leadership lost).
func (r *Replicator) Err() error { return r.rn.Err() }
diff --git a/internal/lease/position_test.go b/internal/lease/position_test.go
deleted file mode 100644
index 1c9e34eba..000000000
--- a/internal/lease/position_test.go
+++ /dev/null
@@ -1,63 +0,0 @@
-package lease
-
-import (
- "database/sql"
- "path/filepath"
- "testing"
-
- "github.com/benbjohnson/litestream/file"
- _ "modernc.org/sqlite"
-)
-
-// Fix round 1 (region HA I2): Position is the replicator's own position.
-// It is zero while litestream holds no LTX file, and after commits and a
-// SyncAndWait it names the newest committed TXID, which the replica holds.
-func TestReplicatorPositionIsItsOwnNewestLTX(t *testing.T) {
- ctx := t.Context()
- dir := t.TempDir()
- path := filepath.Join(dir, "app.db")
- h := &Held{replicaClient: file.NewReplicaClient(filepath.Join(dir, "replica"))}
- store, db, err := h.newStore(path, 0)
- if err != nil {
- t.Fatal(err)
- }
- r := &Replicator{store: store, db: db}
- if pos, err := r.Position(); err != nil || pos != 0 {
- t.Fatalf("before any LTX: %d %v", pos, err)
- }
- conn, err := sql.Open("sqlite", path+"?_pragma=journal_mode(WAL)")
- if err != nil {
- t.Fatal(err)
- }
- defer conn.Close()
- if _, err := conn.Exec(`CREATE TABLE t (v INTEGER)`); err != nil {
- t.Fatal(err)
- }
- if err := store.Open(ctx); err != nil {
- t.Fatal(err)
- }
- defer store.Close(ctx)
- if _, err := conn.Exec(`INSERT INTO t VALUES (1)`); err != nil {
- t.Fatal(err)
- }
- if err := r.SyncAndWait(ctx); err != nil {
- t.Fatal(err)
- }
- first, err := r.Position()
- if err != nil || first == 0 {
- t.Fatalf("after a commit: %d %v", first, err)
- }
- if _, err := conn.Exec(`INSERT INTO t VALUES (2)`); err != nil {
- t.Fatal(err)
- }
- if err := r.SyncAndWait(ctx); err != nil {
- t.Fatal(err)
- }
- second, err := r.Position()
- if err != nil || second <= first {
- t.Fatalf("after a second commit: %d (was %d) %v", second, first, err)
- }
- if remote := uint64(db.Replica.Pos().TXID); remote != second {
- t.Fatalf("the replica is at %d, the replicator reports %d", remote, second)
- }
-}