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>
5 files changed,
+41
−126
internal/activator/fenceowner_test.go+18 −5internal/host/relocationassembly.go+9 −15internal/host/relocationassembly_test.go+14 −28internal/lease/lease.go+0 −15internal/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) |
| - } |
| -} |