carlos / platform Public

instance-control: a misplaced rootfs unit's files go only once it is proven gone; overlapping starts counted (rootfs apps plan 2, task 5 fix 1)

The C5/C10 refusal now proves the stop: systemctl stop must succeed, the
unit must read inactive or failed, and the control group the post-start
show reported (a misplaced unit's own, never one under the host slice)
must be absent or empty. Otherwise the files stay and a generation or
worker answers statusGenUnproven, which the client reads as
ErrGenUnproven. The 503 names the first check that is not ok, so the
probe-less stub says rootfs-probe. The activator's unitName answers an
error for a worker and newUnitProcFor refuses it. genStarting counts the
starts in flight, so a reused worker name's overlapping starts both hold
the sweep off, and the exe layout's temp files are unique.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev c9f6dd7519a80549e9042801a11dcd17037f3623 parent 0a59e97
9 files changed, +347 −51
  • internal/activator/backend_exec.go +11 −8
  • internal/activator/rootfs_worker_unit_test.go +31 −0
  • internal/activator/unitproc.go +26 −9
  • internal/activator/unitproc_gen_test.go +4 −4
  • internal/instancectl/client.go +3 −1
  • internal/instancectl/gen.go +6 −4
  • internal/instancectl/rootfs.go +48 −22
  • internal/instancectl/rootfs_test.go +207 −0
  • internal/instancectl/server.go +11 −3

CI failed — run details

CI log
=== gate ===
.amadan/test-gate.sh
=== launchctx (2 s)
ok  	amadan.net/carlos/platform.git/launchctx	0.012s
?   	amadan.net/carlos/platform.git/launchctx/controlname	[no test files]
?   	amadan.net/carlos/platform.git/launchctx/wireid	[no test files]
=== vet (21 s)
=== gofmt (1 s)
gofmt -l .: clean
=== rest (71 s)
?   	github.com/carlosframework/platform/cmd/changelog	[no test files]
ok  	github.com/carlosframework/platform/cmd/console	6.315s
ok  	github.com/carlosframework/platform/cmd/moveprobe	12.251s
ok  	github.com/carlosframework/platform/cmd/zddprobe	0.749s
ok  	github.com/carlosframework/platform/internal/activator	58.791s
ok  	github.com/carlosframework/platform/internal/agentsock	0.038s
ok  	github.com/carlosframework/platform/internal/alerting	0.005s
ok  	github.com/carlosframework/platform/internal/analytics	0.064s
ok  	github.com/carlosframework/platform/internal/appconfig	4.298s
ok  	github.com/carlosframework/platform/internal/apperr	0.151s
ok  	github.com/carlosframework/platform/internal/applog	0.315s
ok  	github.com/carlosframework/platform/internal/assetcache	0.109s
ok  	github.com/carlosframework/platform/internal/awsinv	0.004s
ok  	github.com/carlosframework/platform/internal/boxchoice	0.007s
ok  	github.com/carlosframework/platform/internal/boxid	1.082s
?   	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.009s
ok  	github.com/carlosframework/platform/internal/caps	0.032s
ok  	github.com/carlosframework/platform/internal/certwarm	0.003s
ok  	github.com/carlosframework/platform/internal/cgroup	0.791s
ok  	github.com/carlosframework/platform/internal/changelog	0.492s
ok  	github.com/carlosframework/platform/internal/claimactivation	1.340s
ok  	github.com/carlosframework/platform/internal/clamd	0.066s
?   	github.com/carlosframework/platform/internal/cliflag	[no test files]
?   	github.com/carlosframework/platform/internal/controlname	[no test files]
?   	github.com/carlosframework/platform/internal/controlsock	[no test files]
ok  	github.com/carlosframework/platform/internal/dbdoor	8.309s
ok  	github.com/carlosframework/platform/internal/dbdoor/dbdoortest	0.019s
ok  	github.com/carlosframework/platform/internal/dbquery	0.018s
ok  	github.com/carlosframework/platform/internal/dbreads	2.230s
?   	github.com/carlosframework/platform/internal/dbreads/dbreadstest	[no test files]
ok  	github.com/carlosframework/platform/internal/dbverify	0.014s
ok  	github.com/carlosframework/platform/internal/dnsrec	0.005s
ok  	github.com/carlosframework/platform/internal/docsite	0.007s
ok  	github.com/carlosframework/platform/internal/domains	4.204s
ok  	github.com/carlosframework/platform/internal/doorkey	0.008s
ok  	github.com/carlosframework/platform/internal/economics	0.004s
ok  	github.com/carlosframework/platform/internal/edge	47.584s
?   	github.com/carlosframework/platform/internal/edgeproof	[no test files]
ok  	github.com/carlosframework/platform/internal/edgesfile	0.028s
ok  	github.com/carlosframework/platform/internal/fleetapi	0.483s
ok  	github.com/carlosframework/platform/internal/gate	3.154s
ok  	github.com/carlosframework/platform/internal/genselect	0.370s
ok  	github.com/carlosframework/platform/internal/geo	0.015s
ok  	github.com/carlosframework/platform/internal/geoip	0.046s
ok  	github.com/carlosframework/platform/internal/historyreadback	0.563s
ok  	github.com/carlosframework/platform/internal/hostactors	7.640s
ok  	github.com/carlosframework/platform/internal/hostactors/awsmembership	0.026s
ok  	github.com/carlosframework/platform/internal/hostbox	5.057s
ok  	github.com/carlosframework/platform/internal/hostclaim	1.512s
ok  	github.com/carlosframework/platform/internal/hostenv	0.153s
ok  	github.com/carlosframework/platform/internal/hostevidence	0.301s
ok  	github.com/carlosframework/platform/internal/hostexec	7.759s
ok  	github.com/carlosframework/platform/internal/hostfence	0.088s
ok  	github.com/carlosframework/platform/internal/hostfiles	11.325s
ok  	github.com/carlosframework/platform/internal/hostfloor	0.034s
ok  	github.com/carlosframework/platform/internal/hostguard	1.230s
ok  	github.com/carlosframework/platform/internal/hostops	4.057s
?   	github.com/carlosframework/platform/internal/hostops/fencerelease	[no test files]
ok  	github.com/carlosframework/platform/internal/hostops/internal/fencerelease	0.007s
ok  	github.com/carlosframework/platform/internal/hostquarantine	0.012s
ok  	github.com/carlosframework/platform/internal/hostrelocate	1.151s
ok  	github.com/carlosframework/platform/internal/hostresolve	0.230s
ok  	github.com/carlosframework/platform/internal/hostwrite	0.025s
ok  	github.com/carlosframework/platform/internal/infraview	0.003s
ok  	github.com/carlosframework/platform/internal/instancectl	5.671s
ok  	github.com/carlosframework/platform/internal/instanceexec	3.188s
ok  	github.com/carlosframework/platform/internal/instancefs	0.010s
ok  	github.com/carlosframework/platform/internal/instancekey	0.005s
ok  	github.com/carlosframework/platform/internal/instanceupdates	0.020s
ok  	github.com/carlosframework/platform/internal/layout	2.813s
ok  	github.com/carlosframework/platform/internal/lbhealth	0.007s
ok  	github.com/carlosframework/platform/internal/lease	10.397s
ok  	github.com/carlosframework/platform/internal/lease/leasetest	0.730s
ok  	github.com/carlosframework/platform/internal/ledger	0.288s
ok  	github.com/carlosframework/platform/internal/mail	0.620s
ok  	github.com/carlosframework/platform/internal/maintenance	0.096s
ok  	github.com/carlosframework/platform/internal/maintenanceexec	5.862s
ok  	github.com/carlosframework/platform/internal/maintenanceguard	0.172s
ok  	github.com/carlosframework/platform/internal/metrics	0.006s
ok  	github.com/carlosframework/platform/internal/moves	24.750s
ok  	github.com/carlosframework/platform/internal/moves/archive	1.285s
ok  	github.com/carlosframework/platform/internal/objstore	0.667s
ok  	github.com/carlosframework/platform/internal/ops	0.481s
ok  	github.com/carlosframework/platform/internal/park	0.546s
ok  	github.com/carlosframework/platform/internal/plans	0.011s
ok  	github.com/carlosframework/platform/internal/privatefile	0.015s
2026/10/25 13:05:43 provision: listing apps/bab/blog/instances/: list refused — its records are unseen this pass
2026/10/25 13:05:43 provision: listing apps/bab/: listdirs refused — its records are unseen this pass
2026/10/25 13:05:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:43 provision: listing apps/bac/tito/instances/: list refused — its records are unseen this pass
2026/10/25 13:05:43 provision: listing apps/bac/tito/instances/: list refused — its records are unseen this pass
2026/10/25 13:05:43 provision: skipping record apps/bac/tito/instances/one.example.com.json: unreadable: read refused
2026/10/25 13:05:43 provision: listing apps/bac/tito/instances/: list refused — its records are unseen this pass
2026/10/25 13:05:43 provision: an app's records could not be listed: they are skipped
2026/10/25 13:05:43 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 13:05:43 provision: remove retired instance route shop.example: provision: claim admission unavailable
2026/10/25 13:05:43 provision: remove retired instance route shop.example: provision: claim admission unavailable
2026/10/25 13:05:43 provision: remove retired sidecar route worker.sidecar.internal: provision: claim admission unavailable
2026/10/25 13:05:43 provision: remove retired sidecar route worker.sidecar.internal: provision: claim admission unavailable
2026/10/25 13:05:43 provision: claim install acme.go.tito.io: provision: claim admission unavailable
2026/10/25 13:05:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:43 provision: claim install acme.go.tito.io: registry: claim row ownership changed or unknown
2026/10/25 13:05:43 provision: claim install bot.eleven.bac.sidecar.internal: provision: claim admission unavailable
2026/10/25 13:05:43 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/25 13:05:43 provision: claim install bot.eleven.bac.sidecar.internal: registry: claim row ownership changed or unknown
2026/10/25 13:05:43 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/25 13:05:43 provision: acme.go.tito.io: not minting this pass: the box's layout intent could not be read: no sealed config
2026/10/25 13:05:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:43 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/25 13:05:43 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/25 13:05:43 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/25 13:05:43 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/25 13:05:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:44 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/25 13:05:44 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/25 13:05:44 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/25 13:05:44 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:44 provision: claim install acme.go.tito.io: registry: claim row ownership changed or unknown
2026/10/25 13:05:44 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:44 provision: claim install acme.go.tito.io: registry: claim row ownership changed or unknown
2026/10/25 13:05:44 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/25 13:05:44 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/25 13:05:44 provision: claim install bot.eleven.bac.sidecar.internal: registry: claim row ownership changed or unknown
2026/10/25 13:05:44 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/25 13:05:44 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:44 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/25 13:05:44 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/25 13:05:44 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:44 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:44 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:44 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 13:05:44 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:44 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:44 provision: skipping record apps/bac/tito/instances/new.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:44 provision: not removing acme.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/25 13:05:44 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:44 provision: skipping record apps/bac/tito/instances/new.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:44 provision: minted instance route rl.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:44 provision: minted instance route rc.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:44 provision: minted instance route rf.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:44 provision: minted instance route rh.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:44 provision: minted instance route ri.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:44 provision: minted instance route rj.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:44 provision: minted instance route ra.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:44 provision: minted instance route rb.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:44 provision: minted instance route rd.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:44 provision: minted instance route re.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:44 provision: minted instance route rg.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:44 provision: minted instance route rk.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route ra.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route rb.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route rc.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route rd.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: skipping record apps/bac/tito/instances/rb.go.tito.io.json: read failed: read refused
2026/10/25 13:05:45 provision: skipping record apps/bac/tito/instances/rb.go.tito.io.json: read failed: read refused
2026/10/25 13:05:45 provision: minted instance route re.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route x.appd.example (app "appd" acct "bac")
2026/10/25 13:05:45 provision: minted instance route x.appe.example (app "appe" acct "bac")
2026/10/25 13:05:45 provision: minted instance route x.appg.example (app "appg" acct "bac")
2026/10/25 13:05:45 provision: minted instance route x.appc.example (app "appc" acct "bac")
2026/10/25 13:05:45 provision: minted instance route x.appf.example (app "appf" acct "bac")
2026/10/25 13:05:45 provision: minted instance route x.apph.example (app "apph" acct "bac")
2026/10/25 13:05:45 provision: minted instance route x.appi.example (app "appi" acct "bac")
2026/10/25 13:05:45 provision: minted instance route x.appj.example (app "appj" acct "bac")
2026/10/25 13:05:45 provision: minted instance route x.appa.example (app "appa" acct "bac")
2026/10/25 13:05:45 provision: minted instance route x.appb.example (app "appb" acct "bac")
2026/10/25 13:05:45 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/25 13:05:45 provision: minted instance route r0120.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0087.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0125.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0061.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0113.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0035.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0057.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0068.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0076.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0004.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0039.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0108.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0013.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0019.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0033.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0046.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0103.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0116.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0036.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0047.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0066.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0086.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0102.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0115.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0038.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0077.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0085.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0105.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0049.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0069.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0001.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0037.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0041.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0048.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0050.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0053.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0062.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0124.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0005.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0060.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0078.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0104.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0122.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0006.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0024.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0027.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0067.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0089.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0098.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0112.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0044.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0010.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0014.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0018.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0020.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0032.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0040.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0099.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0101.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0110.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0000.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0071.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0096.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0015.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0034.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0092.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0097.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0107.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0054.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0129.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0065.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0094.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0119.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0008.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0009.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0017.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0022.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0025.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0059.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0106.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0121.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0055.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0074.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0091.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0117.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0118.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0002.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0111.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0051.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0063.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0064.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0080.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0081.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0109.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0128.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0021.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0029.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0030.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0026.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0042.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0073.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0082.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0090.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0126.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0007.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0043.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0095.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0093.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0058.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0079.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0088.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0127.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0023.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0031.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0072.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0123.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0012.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0045.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0084.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0114.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0052.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0003.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0016.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0083.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0011.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0028.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0056.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0070.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0075.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:45 provision: minted instance route r0100.go.tito.io (app "tito" acct "bac")
--- FAIL: TestPlan9B8RecordWriteCensus (1.20s)
    plan9_b8_census_test.go:372: record-write census rejected 2 site(s); update the explicit inventory only after reviewing the source:
          stale inventory entry internal/instancectl/gen.go:GenDropIn: no such unit with a write site any more
          unlisted site internal/instancectl/gen.go:hostMountLines [lit:instances]: review it, classify it, and update its explicit inventory entry
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 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/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: minted service route svc.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: minted instance route whole.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: minted instance route console.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: minted service route ha.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: minted instance route shared.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: converged acme.go.tito.io channel stable -> edge
2026/10/25 13:05:48 provision: converged acme.go.tito.io channel edge -> canary/rehearsal
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: empty channel
2026/10/25 13:05:48 provision: not removing acme.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: converged acme.go.tito.io environment "" -> "staging"
2026/10/25 13:05:48 provision: converged acme.go.tito.io environment "staging" -> ""
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: converged acme.go.tito.io steering "" -> "latency"
2026/10/25 13:05:48 provision: converged acme.go.tito.io steering "latency" -> ""
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: converged acme.go.tito.io hibernate false -> true
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: converged acme.go.tito.io hibernate true -> false (replication "daily" cleared: only a hibernating route's rung is read)
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: converged acme.go.tito.io status-named false -> true
2026/10/25 13:05:48 provision: converged acme.go.tito.io status-named true -> false
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: minted service route ha.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 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/25 13:05:48 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/25 13:05:48 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/25 13:05:48 provision: minted service route whole.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 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/25 13:05:48 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/25 13:05:48 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/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: minted service route whole.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: skipping accounts/bac/account.json: malformed account manifest: invalid character 'o' in literal null (expecting 'u')
2026/10/25 13:05:48 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: manifest bac/tito: read failed: provision: manifest bac/tito: invalid character 'o' in literal null (expecting 'u')
2026/10/25 13:05:48 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/25 13:05:48 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/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 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/25 13:05:48 provision: not removing acme$evil.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/25 13:05:48 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/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 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/25 13:05:48 provision: not removing bad-service.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/25 13:05:48 provision: skipping record apps/bac/tito/instances/no-channel.go.tito.io.json: empty channel
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: skipping record apps/bac/tito/instances/no-channel.go.tito.io.json: empty channel
2026/10/25 13:05:48 provision: not removing no-channel.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:48 provision: not removing acme.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/25 13:05:48 provision: removed retired instance route ghost.go.tito.io (record gone)
2026/10/25 13:05:48 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/25 13:05:48 provision: minted instance route dup.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/25 13:05:48 provision: removed retired instance route acme.go.tito.io (app in the trash)
2026/10/25 13:05:48 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/25 13:05:48 provision: removed retired static route site.go.tito.io (app in the trash)
2026/10/25 13:05:48 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/25 13:05:48 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/25 13:05:48 provision: removed retired instance route acme.go.tito.io (app in the trash)
2026/10/25 13:05:48 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/25 13:05:48 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/25 13:05:48 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/25 13:05:48 provision: converged acme.go.tito.io channel stable -> edge
2026/10/25 13:05:48 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/25 13:05:48 provision: converged acme.go.tito.io channel canary/rehearsal -> edge
2026/10/25 13:05:48 provision: converged acme.go.tito.io environment "staging" -> ""
2026/10/25 13:05:48 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/25 13:05:48 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/25 13:05:48 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/25 13:05:48 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/25 13:05:48 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/25 13:05:48 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/25 13:05:48 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/25 13:05:48 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/25 13:05:48 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/25 13:05:48 provision: dry-run: would mint instance route acme.go.tito.io (app "tito" acct "bac" channel "stable")
2026/10/25 13:05:48 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/25 13:05:48 provision: dry-run: would converge adopt.go.tito.io channel stable -> edge
2026/10/25 13:05:48 provision: dry-run: would converge adopt.go.tito.io environment "" -> "staging"
2026/10/25 13:05:48 provision: dry-run: would converge owned.go.tito.io channel stable -> edge
2026/10/25 13:05:48 provision: dry-run: would converge owned.go.tito.io environment "" -> "staging"
2026/10/25 13:05:48 provision: dry-run: would converge owned.go.tito.io hibernate false -> true
2026/10/25 13:05:48 provision: dry-run: would converge owned.go.tito.io seed
2026/10/25 13:05:48 provision: dry-run: would remove retired instance route gone.go.tito.io (record gone)
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:48 provision: adopted existing route adopt.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/25 13:05:48 provision: converged adopt.go.tito.io channel stable -> edge
2026/10/25 13:05:48 provision: converged adopt.go.tito.io environment "" -> "staging"
2026/10/25 13:05:48 provision: converged owned.go.tito.io channel stable -> edge
2026/10/25 13:05:48 provision: converged owned.go.tito.io environment "" -> "staging"
2026/10/25 13:05:48 provision: converged owned.go.tito.io hibernate false -> true
2026/10/25 13:05:48 provision: removed retired instance route gone.go.tito.io (record gone)
2026/10/25 13:05:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: adopted existing route story.carlosframework.com (app "story" acct "bad") — this record now owns its channel and environment
2026/10/25 13:05:49 provision: story.carlosframework.com exists but is not the route this record describes (kind "instance"/"static") — leaving it alone
2026/10/25 13:05:49 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted service route pub.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted service route pubs.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted service route loop.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted service route named.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted service route priv.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted instance route unit.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted instance route exec.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted static route pisite.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: removed retired static route site.go.tito.io (record gone)
2026/10/25 13:05:49 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted instance route acme-uk.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: converged acme.go.tito.io replicas "ie,uk" -> "uk"
2026/10/25 13:05:49 provision: converged acme.go.tito.io replicas "uk" -> ""
2026/10/25 13:05:49 provision: minted instance route acme-uk.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: converged acme-uk.go.tito.io replica mark true -> false
2026/10/25 13:05:49 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 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/25 13:05:49 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:49 provision: acme.go.tito.io: not minting this pass: the box's layout intent could not be read: store down
2026/10/25 13:05:49 provision: router.go.tito.io: not minting this pass: the box's layout intent could not be read: store down
2026/10/25 13:05:49 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/25 13:05:49 provision: converged acme.go.tito.io channel stable -> edge
2026/10/25 13:05:49 provision: minted instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac")
2026/10/25 13:05:49 provision: not removing acme.go.tito.io (record gone): participant of a running operation
2026/10/25 13:05:49 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/25 13:05:49 provision: minted instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac")
2026/10/25 13:05:49 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/25 13:05:49 provision: held acme.go.tito.io landing by mv_acme (was ready)
2026/10/25 13:05:49 provision: acme.go.tito.io: held restoring by rb_other, not by mv_acme; leaving it
2026/10/25 13:05:49 provision: acme.go.tito.io: the row is not this pass's (app "other" acct ""); not holding it for mv_acme
2026/10/25 13:05:49 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/25 13:05:49 provision: dry-run: would mint instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac" channel "stable")
2026/10/25 13:05:49 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/25 13:05:49 provision: held acme.go.tito.io landing by mv_acme (was ready)
2026/10/25 13:05:49 provision: minted instance route acme.example.com (app "shop" acct "bac")
2026/10/25 13:05:49 provision: minted instance route plain.example.com (app "shop" acct "bac")
2026/10/25 13:05:49 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:49 provision: skipping record apps/bac/shop/instances/liar.shop.example.com.json: disagrees with its own path (host="other.shop.example.com" account="bac" app="shop")
2026/10/25 13:05:49 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:49 provision: skipping record apps/bac/shop/instances/liar.shop.example.com.json: disagrees with its own path (host="other.shop.example.com" account="bac" app="shop")
2026/10/25 13:05:49 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:49 provision: skipping record apps/bac/shop/instances/liar.shop.example.com.json: disagrees with its own path (host="other.shop.example.com" account="bac" app="shop")
2026/10/25 13:05:49 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:49 provision: listing apps/bac/shop/instances/: list refused — its records are unseen this pass
2026/10/25 13:05:50 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:50 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:50 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/25 13:05:50 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:50 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/25 13:05:50 provision: minted sidecar route bot.shop.bac.sidecar.internal (app "shop" acct "bac" args ["run"])
2026/10/25 13:05:50 provision: removed retired sidecar route bot.shop.bac.sidecar.internal (record gone)
2026/10/25 13:05:50 provision: minted sidecar route bot.shop.bum.sidecar.internal (app "shop" acct "bum" args ["run"])
2026/10/25 13:05:50 provision: sidecar bot.shop.bum.sidecar.internal is not placeable here: it asks for "no-inbound" placement and this box accepts inbound work (CARLOS_INBOUND="")
2026/10/25 13:05:50 provision: sidecar bot.shop.bum.sidecar.internal is not placeable here: it asks for "no-inbound" placement and this box accepts inbound work (CARLOS_INBOUND="")
2026/10/25 13:05:50 provision: removed retired sidecar route bot.shop.bum.sidecar.internal (record gone)
2026/10/25 13:05:50 provision: minted sidecar route bot.shop.bum.sidecar.internal (app "shop" acct "bum" args ["run"])
2026/10/25 13:05:50 provision: sidecar bot.shop.bum.sidecar.internal is not placeable here: it asks for "no-inbound" placement and this box accepts inbound work (CARLOS_INBOUND="")
2026/10/25 13:05:50 provision: sidecar bot.shop.bum.sidecar.internal is not placeable here: it asks for "no-inbound" placement and this box accepts inbound work (CARLOS_INBOUND="")
2026/10/25 13:05:50 provision: removed retired sidecar route bot.shop.bum.sidecar.internal (record gone)
2026/10/25 13:05:51 provision: a.shop.example.com: swapped for import sd_eoky42j3xqd4g3c4nthb4632bm (the original route is journaled)
2026/10/25 13:05:51 provision: a.shop.example.com: import sd_eoky42j3xqd4g3c4nthb4632bm committed: its gate is cleared and its journal row dropped
2026/10/25 13:05:51 provision: a.shop.example.com: row is on the nested layout (db "/data/instances/a.shop.example.com/a.shop.example.com.db" socket "/run/carlos/instances/a.shop.example.com/app.sock"); the record's shared paths are not drift
2026/10/25 13:05:51 provision: a.shop.example.com: import sd_tqsa4wur6th6hz5eqk5fh4b7q4 rolled back to its original route
2026/10/25 13:05:51 provision: a.shop.example.com: import sd_tqsa4wur6th6hz5eqk5fh4b7q4: the host's replica is left alone: the record apps/bac/shop/instances/a.shop.example.com.json holds the host
2026/10/25 13:05:51 provision: a.shop.example.com: import sd_tqsa4wur6th6hz5eqk5fh4b7q4 is cleaned up and its journal row retired
2026/10/25 13:05:51 provision: a.shop.example.com: import sd_rda2b3n2b7mseernde6csstfea rolled back to its original route
2026/10/25 13:05:51 provision: a.shop.example.com: import sd_rda2b3n2b7mseernde6csstfea: the host's replica is left alone: the record apps/bac/shop/instances/a.shop.example.com.json holds the host
2026/10/25 13:05:51 provision: a.shop.example.com: import sd_rda2b3n2b7mseernde6csstfea is cleaned up and its journal row retired
2026/10/25 13:05:51 provision: dry-run: would redo a.shop.example.com's swap record CAS for import sd_2ipqi2k5qhcp4xizrdslxvrdnq
2026/10/25 13:05:51 provision: dry-run: would clear a.shop.example.com's import gate
2026/10/25 13:05:51 provision: dry-run: would converge a.shop.example.com seed source
2026/10/25 13:05:51 provision: a.shop.example.com: row is on the nested layout (db "/data/instances/a.shop.example.com/a.shop.example.com.db" socket "/run/carlos/instances/a.shop.example.com/app.sock"); the record's shared paths are not drift
2026/10/25 13:05:51 provision: a.shop.example.com: the import's record apps/bac/shop/instances/a.shop.example.com.json is not one this pass can use (connection reset)
2026/10/25 13:05:51 provision: a.shop.example.com: the import's record apps/bac/shop/instances/a.shop.example.com.json is not one this pass can use (provision: invalid maintenance projection or protected fields)
2026/10/25 13:05:51 provision: a.shop.example.com: the import's record apps/bac/shop/instances/a.shop.example.com.json is not one this pass can use (the record under apps/bac/shop/instances/a.shop.example.com.json is apps/bac/shop/instances/b.shop.example.com.json's)
2026/10/25 13:05:51 provision: a.shop.example.com: import sd_f4jmuwbjzrlhl77eeh236mfpby cannot roll back on this box: the activator is not wired; it stays journaled and gated
2026/10/25 13:05:51 provision: a.shop.example.com: import sd_h5lqfdzizlv4y5ia5b76rd2h4y cannot roll back on this box: the activator is not wired; it stays journaled and gated
2026/10/25 13:05:51 provision: a.shop.example.com: import sd_u5rzgj7pz45gqdsjiehxztmifi is journaled, but this box cannot act on imports; its row is left alone
2026/10/25 13:05:51 provision: a.shop.example.com: import sd_5pndg37fb7jgpp6iofg6xn3f5a is journaled, but this box cannot act on imports; its row is left alone
2026/10/25 13:05:51 provision: a.shop.example.com: import sd_tdn7lukbm3gg25w5ui7gtdrp7y is journaled, but this box cannot act on imports; its row is left alone
2026/10/25 13:05:51 provision: the import journal could not be read: registry: import journal a.shop.example.com: original row: unexpected end of JSON input (no import is acted on and no route is removed this pass)
2026/10/25 13:05:51 provision: b.shop.example.com: import sd_fyifulq7am57xpm2ihdt3a74g4 left alone this pass: the import journal could not be read
2026/10/25 13:05:51 provision: c.shop.example.com: import sd_mo2dkju4rxdgd7sg7chhahozji left alone this pass: the import journal could not be read
2026/10/25 13:05:51 provision: a.shop.example.com: import sd_3y2fpn6ncozifkaefm6vvwzadu committed: its gate is cleared and its journal row dropped
2026/10/25 13:05:51 provision: a.shop.example.com: not converging import sd_q4fm7a5iagvaritekajbbzcasu: it is swapped but not committed, and the row on this box has no import gate
2026/10/25 13:05:51 provision: a.shop.example.com: not converging import sd_otm7cjk7rx2buii76b4je3jzta: it is swapped but not committed, and the row on this box has no import gate
2026/10/25 13:05:51 provision: a.shop.example.com: not converging import sd_plwvdzmn3vhaxocqeoaitewqqu: it is placed but not committed, and the row on this box has no import gate
2026/10/25 13:05:51 provision: a.shop.example.com: not converging import sd_e7th2rrfiks4gbp7nj5xckxl3u: it is placed but not committed, and the row on this box has no import gate
2026/10/25 13:05:51 provision: a.shop.example.com: row is on the nested layout (db "/data/instances/a.shop.example.com/a.shop.example.com.db" socket "/run/carlos/instances/a.shop.example.com/app.sock"); the record's shared paths are not drift
2026/10/25 13:05:51 provision: converge seed source on a.shop.example.com: constraint failed: seed_source is read-only here (1811)
2026/10/25 13:05:51 provision: a.shop.example.com: row is on the nested layout (db "/data/instances/a.shop.example.com/a.shop.example.com.db" socket "/run/carlos/instances/a.shop.example.com/app.sock"); the record's shared paths are not drift
2026/10/25 13:05:51 provision: a.shop.example.com: import sd_bzi6ewivdjj6jpyx6z4hfgavke committed: its gate is cleared and its journal row dropped
2026/10/25 13:05:51 provision: a.shop.example.com: row is on the nested layout (db "/data/instances/a.shop.example.com/a.shop.example.com.db" socket "/run/carlos/instances/a.shop.example.com/app.sock"); the record's shared paths are not drift
2026/10/25 13:05:51 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:51 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/25 13:05:51 provision: acme.go.tito.io: not minting a seeded instance: claim control is on for this box
2026/10/25 13:05:51 provision: acme.go.tito.io: not minting a seeded instance: this box does not mint nested (<nil>)
2026/10/25 13:05:52 provision: acme.go.tito.io: aborted seed sd_llaxqfaracnjil7x2yvb2jzxqe: this box cannot read seed markers, and places no seed; nothing local is removed
2026/10/25 13:05:52 provision: acme.go.tito.io: aborted seed sd_llaxqfaracnjil7x2yvb2jzxqe rolled back (no box had swapped it)
2026/10/25 13:05:52 provision: acme.go.tito.io: not minting a seeded instance: its record does not describe a hibernating instance
2026/10/25 13:05:52 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:52 provision: removed instance route acme.go.tito.io (its seed sd_hdi2fgyus4mbo2o27odbggzen4 was aborted); the next pass rolls it back
2026/10/25 13:05:52 provision: acme.go.tito.io: aborted seed sd_hdi2fgyus4mbo2o27odbggzen4: this box cannot read seed markers, and places no seed; nothing local is removed
2026/10/25 13:05:52 provision: acme.go.tito.io: aborted seed sd_hdi2fgyus4mbo2o27odbggzen4 rolled back (no box had swapped it)
2026/10/25 13:05:52 provision: acme.go.tito.io: aborted seed sd_53pn4jpri3h75tqhg6zi7si6p4 has a row this pass may not remove; leaving the seed aborted
2026/10/25 13:05:52 provision: acme.go.tito.io: aborted seed sd_ynnjt7on4hqygnl6j7lspzop44 rolled back (no box had swapped it)
2026/10/25 13:05:52 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:52 provision: removed instance route acme.go.tito.io (its seed sd_sav6qery63wmshu7iiyncruiy4 was aborted); the next pass rolls it back
2026/10/25 13:05:52 provision: acme.go.tito.io: aborted seed sd_sav6qery63wmshu7iiyncruiy4 has no route on this box: its local data is removed
2026/10/25 13:05:52 provision: acme.go.tito.io: aborted seed sd_sav6qery63wmshu7iiyncruiy4 rolled back (no box had swapped it)
2026/10/25 13:05:52 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_wnuhnf6rqvwnrykmm2iz3fneim (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_wnuhnf6rqvwnrykmm2iz3fneim rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_wnuhnf6rqvwnrykmm2iz3fneim is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_cjvqxe3ohkn5tq36bxj2ivyjty (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_cjvqxe3ohkn5tq36bxj2ivyjty rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_cjvqxe3ohkn5tq36bxj2ivyjty is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_ukastlc75naxm5rtke3uzzuaiy (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_ukastlc75naxm5rtke3uzzuaiy rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_ukastlc75naxm5rtke3uzzuaiy: the host's replica is left alone: its record no longer names this seed
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_ukastlc75naxm5rtke3uzzuaiy is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_wre2mbg44oxi4ybuph5i3v4m4e (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_wre2mbg44oxi4ybuph5i3v4m4e rollback deferred: the host is not fenced and stopped yet (<nil>)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_wre2mbg44oxi4ybuph5i3v4m4e rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_wre2mbg44oxi4ybuph5i3v4m4e is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_g4wh7klgssnfsna6eqpcebtw2e (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_g4wh7klgssnfsna6eqpcebtw2e rollback deferred: the host is not fenced and stopped yet (stop unproven)
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_bejvn5wcik7f2q5dgsstynwfyq (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_bejvn5wcik7f2q5dgsstynwfyq is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_uj5y2hjf5hx5yby3wybwaocrqi (the original route is journaled)
2026/10/25 13:05:52 provision: skipping record apps/bac/shop/instances/a.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_uj5y2hjf5hx5yby3wybwaocrqi left alone this pass: its record could not be read
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_lnw6gjnqzqavvplfowjwh2ndya (the original route is journaled)
2026/10/25 13:05:52 provision: skipping record apps/bac/shop/instances/a.shop.example.com.json: read failed: connection reset
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_lnw6gjnqzqavvplfowjwh2ndya left alone this pass: its record could not be read
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_imhgkdcubcsv73wmw2agb266em (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_imhgkdcubcsv73wmw2agb266em: close the import gate: constraint failed: injected (1811)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_imhgkdcubcsv73wmw2agb266em rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_imhgkdcubcsv73wmw2agb266em is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_k7dleq7ifhao56wfb5xhtgzg4e (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_k7dleq7ifhao56wfb5xhtgzg4e: close the import gate: constraint failed: injected (1811)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_k7dleq7ifhao56wfb5xhtgzg4e rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_k7dleq7ifhao56wfb5xhtgzg4e is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_rh7ip74cxjtl2v74fjjzx6hslu (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_rh7ip74cxjtl2v74fjjzx6hslu rollback deferred: the host is not fenced and stopped yet (injected failure at fence)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_rh7ip74cxjtl2v74fjjzx6hslu rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_rh7ip74cxjtl2v74fjjzx6hslu is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_uz7jjfcminstonianbdcjdub2i (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_uz7jjfcminstonianbdcjdub2i rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_uz7jjfcminstonianbdcjdub2i is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_yzizgdgz3dtcbpsipg2aoitga4 (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_yzizgdgz3dtcbpsipg2aoitga4: retire its instance key: injected failure at retire-key
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_yzizgdgz3dtcbpsipg2aoitga4 rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_yzizgdgz3dtcbpsipg2aoitga4 is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_rcpzxctcpv4ejwz7parugtvikq (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_rcpzxctcpv4ejwz7parugtvikq rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_rcpzxctcpv4ejwz7parugtvikq is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_imzy72jnsywjmqgtkvhk2ekjky (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_imzy72jnsywjmqgtkvhk2ekjky: remove its local data: injected failure at remove-local
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_imzy72jnsywjmqgtkvhk2ekjky rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_imzy72jnsywjmqgtkvhk2ekjky is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_djndz5pweqkktwvvu4yv2ud44a (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_djndz5pweqkktwvvu4yv2ud44a rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_djndz5pweqkktwvvu4yv2ud44a is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_hxx6ihagmqje6w3ft35upjlyr4 (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_hxx6ihagmqje6w3ft35upjlyr4: remove its local data: injected failure at remove-local-done
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_hxx6ihagmqje6w3ft35upjlyr4 rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_hxx6ihagmqje6w3ft35upjlyr4 is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_mw7sti66upx4qixzmuf3nefccu (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_mw7sti66upx4qixzmuf3nefccu rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_mw7sti66upx4qixzmuf3nefccu is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_vauknv5ihmks4k72wm2p2yiuqe (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_vauknv5ihmks4k72wm2p2yiuqe: restore the original route: constraint failed: injected (1811)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_vauknv5ihmks4k72wm2p2yiuqe rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_vauknv5ihmks4k72wm2p2yiuqe is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_cmpommckf2tvat7wyvyru7plwi (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_cmpommckf2tvat7wyvyru7plwi: restore the original route: constraint failed: injected (1811)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_cmpommckf2tvat7wyvyru7plwi rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_cmpommckf2tvat7wyvyru7plwi is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_wzr6arifoo6nihkdg252t532me (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_wzr6arifoo6nihkdg252t532me is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_666yxmwdtchtk3tkkl5n4l7y6e (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_666yxmwdtchtk3tkkl5n4l7y6e rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_666yxmwdtchtk3tkkl5n4l7y6e: delete its snapshot: injected failure at delete-snapshot
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_666yxmwdtchtk3tkkl5n4l7y6e is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_a43tylpox67wlhpgqc6qy2dx7i (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_a43tylpox67wlhpgqc6qy2dx7i rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_a43tylpox67wlhpgqc6qy2dx7i is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_gfzl7npsvdenhso3ldlch3mdpa (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_gfzl7npsvdenhso3ldlch3mdpa rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_gfzl7npsvdenhso3ldlch3mdpa: delete the host's replica: injected failure at delete-replica
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_gfzl7npsvdenhso3ldlch3mdpa is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_5lggdfzoq324dcdsqqhgkjeqdu (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_5lggdfzoq324dcdsqqhgkjeqdu rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_5lggdfzoq324dcdsqqhgkjeqdu is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_yl3drv4yscbq5ogsgdbmitgy4a (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_yl3drv4yscbq5ogsgdbmitgy4a rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_yl3drv4yscbq5ogsgdbmitgy4a: retire its journal row: constraint failed: injected (1811)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_yl3drv4yscbq5ogsgdbmitgy4a is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_mhmbn2r2a5hswsfoutitx7fube (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_mhmbn2r2a5hswsfoutitx7fube rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_mhmbn2r2a5hswsfoutitx7fube: retire its journal row: constraint failed: injected (1811)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_mhmbn2r2a5hswsfoutitx7fube is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_oswlp35pkpgpd4fkjj3z2ib7iu (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_oswlp35pkpgpd4fkjj3z2ib7iu rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_oswlp35pkpgpd4fkjj3z2ib7iu is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: mark import sd_oswlp35pkpgpd4fkjj3z2ib7iu rolled back: injected failure at cas
2026/10/25 13:05:52 provision: a.shop.example.com: aborted seed sd_oswlp35pkpgpd4fkjj3z2ib7iu rolled back (no box had swapped it)
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_73ylst6nzgm4gxsqfpgm5sqwwm (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_73ylst6nzgm4gxsqfpgm5sqwwm rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_73ylst6nzgm4gxsqfpgm5sqwwm is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: aborted seed sd_73ylst6nzgm4gxsqfpgm5sqwwm rolled back (no box had swapped it)
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_dpqatqqfyxijszdxjx5zmpfqma (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_dpqatqqfyxijszdxjx5zmpfqma rollback deferred: the host is not fenced and stopped yet (<nil>)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_dpqatqqfyxijszdxjx5zmpfqma rollback deferred: the host is not fenced and stopped yet (<nil>)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_dpqatqqfyxijszdxjx5zmpfqma rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_dpqatqqfyxijszdxjx5zmpfqma is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_y72thd4gvtm27jwzcz4ibveizq (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_y72thd4gvtm27jwzcz4ibveizq rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_y72thd4gvtm27jwzcz4ibveizq is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_3xjladqc2uxj2lscrebcu4sfsq (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_3xjladqc2uxj2lscrebcu4sfsq rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_3xjladqc2uxj2lscrebcu4sfsq is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_2rdykklp76cuuchbtxnxbytp2m (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_2rdykklp76cuuchbtxnxbytp2m rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_2rdykklp76cuuchbtxnxbytp2m is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_dgkywfulyx4d7ma3qtwuyhxcae (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_dgkywfulyx4d7ma3qtwuyhxcae rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_dgkywfulyx4d7ma3qtwuyhxcae is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_mqhkv3vhfalwnob4khdfdcpbw4 (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_mqhkv3vhfalwnob4khdfdcpbw4 rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_mqhkv3vhfalwnob4khdfdcpbw4 is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: minted instance route a.shop.example.com (app "other" acct "bac")
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_ffofrm25h7f3ki6g4mjylca76a (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_ffofrm25h7f3ki6g4mjylca76a rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_ffofrm25h7f3ki6g4mjylca76a is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: minted instance route a.shop.example.com (app "other" acct "bac")
2026/10/25 13:05:52 provision: a.shop.example.com: swapped for import sd_hys3co65njjbg24tmx6ltwd5lq (the original route is journaled)
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_hys3co65njjbg24tmx6ltwd5lq rolled back to its original route
2026/10/25 13:05:52 provision: a.shop.example.com: import sd_hys3co65njjbg24tmx6ltwd5lq is cleaned up and its journal row retired
2026/10/25 13:05:52 provision: minted instance route a.shop.example.com (app "other" acct "bac")
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_dxhcalcksexhac6benpmirqzke (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_dxhcalcksexhac6benpmirqzke has no route on this box: its local data is removed and no route is put back
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_dxhcalcksexhac6benpmirqzke is cleaned up and its journal row retired
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_7xf4rjqdzvfyut6daxzgxxpumq (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_omuiuqanwuvgsc2ldmjdu4rwoa (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_lakvlshyuup67aeklkabspdqae (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_lakvlshyuup67aeklkabspdqae cannot roll back on this box: the activator is not wired; it stays journaled and gated
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_l4iupwgvvv3cpu43qlwikgv5f4 (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_l4iupwgvvv3cpu43qlwikgv5f4 is not rolled back: the route changed under the fence, so nothing there is touched
2026/10/25 13:05:53 provision: a.shop.example.com: import "../not-a-seed" names no snapshot and no replica; only its journal row is cleaned up
2026/10/25 13:05:53 provision: a.shop.example.com: import ../not-a-seed is cleaned up and its journal row retired
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_dgku245st3s7baq7skgwrc6tp4 (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_bayd7cfcxydrfmtqdqaq6jhn24 (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_tbfsrqxej7v3qyldjauakn4qhy (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_t5ioierbvh7wxpq5cmseisgpnu (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_45ucg2agqu4e2xjl5z2nzrg664 (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_45ucg2agqu4e2xjl5z2nzrg664 rollback deferred: the host is not fenced and stopped yet (stop evidence unreadable)
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_mtfhdtveutwi3cyuyrjkzf3ama (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_mtfhdtveutwi3cyuyrjkzf3ama has no route on this box: its local data is removed and no route is put back
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_mtfhdtveutwi3cyuyrjkzf3ama is cleaned up and its journal row retired
2026/10/25 13:05:53 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_fom2girohpkzqsb22tmpflsx74 (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_fom2girohpkzqsb22tmpflsx74: remove its local data: injected failure at remove-local
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_fom2girohpkzqsb22tmpflsx74 is not rolled back: the route at the host is not the import's, so nothing there is touched
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_2lzmimbw6pboobp63p7mg62jre (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_2lzmimbw6pboobp63p7mg62jre: a route appeared at the host, so its local database is left and the rollback waits
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_6udemfgoimden4nkqapb3jcusm (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_6udemfgoimden4nkqapb3jcusm rollback deferred: no fence generation: registry busy
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_3ovv6oo5fflfnaoz37ihihwyri (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_3ovv6oo5fflfnaoz37ihihwyri rollback deferred: no fence generation: the generation source answered 0
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_izdvhjgut53qbrow76pw5qfojy (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_p474ew4py627s3t2gjarvqo5sq (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_kvr5qovdakq5dwppzq3byawzkq (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: import deferred: this box cannot read the instance's env file
2026/10/25 13:05:53 provision: a.shop.example.com: import deferred: the instance's env file could not be read: a symlink
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_66cqztpgfnosfze4s6yyeowqmq (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_66cqztpgfnosfze4s6yyeowqmq rolled back to its original route
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_66cqztpgfnosfze4s6yyeowqmq is cleaned up and its journal row retired
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_mlkpguu3x7qjkvqdhxig6opyle (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_mlkpguu3x7qjkvqdhxig6opyle rolled back to its original route
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_mlkpguu3x7qjkvqdhxig6opyle is cleaned up and its journal row retired
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_djghhh5ridhqnws74wj73zplqy (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_djghhh5ridhqnws74wj73zplqy rolled back to its original route
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_djghhh5ridhqnws74wj73zplqy is cleaned up and its journal row retired
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_hxgbe5f2r7jsivybbxlxwhbwny (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_hxgbe5f2r7jsivybbxlxwhbwny: retire its instance key: the env file is a symlink
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_hxgbe5f2r7jsivybbxlxwhbwny rolled back to its original route
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_hxgbe5f2r7jsivybbxlxwhbwny is cleaned up and its journal row retired
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_r6ha5sbgm4qxoydat4wldzhise (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: row is on the nested layout (db "/data/instances/a.shop.example.com/a.shop.example.com.db" socket "/run/carlos/instances/a.shop.example.com/app.sock"); the record's shared paths are not drift
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_lwpngz53jmsrq5w4bo2rc5hwne (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_xzhy77nxonkx6bowmtchpb3wie refused: there is no route at a.shop.example.com to replace
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_rkjv4h2cdyuqgsxj3n2eywl7oa refused: the route's address is 127.0.0.1:9, not 127.0.0.1:8401
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_cappe5zwlkbzbciygfvwqt2vwe refused: the route's address is 127.0.0.1:8401,127.0.0.1:8402, not 127.0.0.1:8401
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_wzytqxzrsrughcijirli4kjxmm refused: the route's address is 127.0.0.1:9, not 127.0.0.1:8401
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_mhjijt7r5bw4lz3grngu2dztpe refused: the route belongs to app other
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_rixraj3v3yajoky46fw4r5pjku refused: the route is filed under another account
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_fuylfafp5p2edu66n4rwfomlom refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_fsnae2rp7yjwatcenzqbgiwupe refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_jshznx7r2vkzy3mth3h6hzcdda refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_gszxkvzihupyrp7gnuek5xnr4e refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_onf2nwuwq27iv7gvxkwsccg2dm refused: the route is not an address route this import can take over (socket)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_m4rqnzah6dcniwnt33m526u6cm refused: the route is not an address route this import can take over (no address)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_hf3oepcqepbgznpihewrqt35g4 refused: the route is not an address route this import can take over (provisioned)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_ktvm26kuvuqvzl4ekicf4lryvq refused: the route is not an address route this import can take over (kind static)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_ht5m4hvol5mcrh6ymk36fn6pua refused: the route is not an address route this import can take over (backing)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_4yxctxy5apd3fhelxqrs54hmiq refused: the route is not an address route this import can take over (tunnel)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_ity5inihouzjys2joquf56esli refused: the route is not an address route this import can take over (caps)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_zdf74tm6vo343p3pcmf3bponom refused: the route is not an address route this import can take over (platform)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_pq6sww44tbjdkwbhvwsamzs2qy refused: the route is not an address route this import can take over (canary)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_gyvtkpudjouavumexo47ihk2ei refused: the route is not an address route this import can take over (kind sidecar)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_e55fm7bp5vzl5loh5srfsfdfya refused: the route is not an address route this import can take over (region)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_v7ch6opywhwipyhbs335wuybxa refused: the route is not an address route this import can take over (fleet_box)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_44esnt4d47m6nuzki5qbyjpi5m refused: the route is not an address route this import can take over (hibernate)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_di7p5ut5xnddkhqha2piwazpfq refused: the route is not an address route this import can take over (claim_owner)
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_x5ufn2xnm2nd5ybf5dhlikgczq refused: this box does not run instances nested
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_a2ojo3vcmi6vdlpr4z32omlp5y refused: this box does not run instances nested
2026/10/25 13:05:53 provision: a.shop.example.com: import sd_tvfzouykyk23jox7wlhyglhiby refused: claim control is on for this box
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_jbzg6xsfukrlybtygcoi5ifhnu (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: swapped for import sd_wlb5wnb6nweexjy4j2u4bjkuae (the original route is journaled)
2026/10/25 13:05:53 provision: a.shop.example.com: import deferred: this box cannot read the legacy route assignments
2026/10/25 13:05:53 provision: a.shop.example.com: import deferred: the legacy route assignments could not be read: store down
2026/10/25 13:05:53 provision: a.shop.example.com: not swapping for import sd_e42mt5mjsue2avmr7ycdamjebi: its verify hash is not a sha256
2026/10/25 13:05:53 provision: a.shop.example.com: not swapping for import sd_arrhvofki4hw2rsvmarlhwcz4e: its verify hash is not a sha256
2026/10/25 13:05:54 provision: a.shop.example.com: not swapping for import sd_mrhtsw2yttak6husqu6phqjnjy: its verify hash is not a sha256
2026/10/25 13:05:54 provision: a.shop.example.com: not swapping for import sd_../../x: its host or seed id is malformed (seeds: not a seed id)
2026/10/25 13:05:54 provision: A.shop.example.com/..: not swapping for import sd_3gcl67wb3dvun27qez3n3thm24: its host or seed id is malformed (seeds: not a host)
2026/10/25 13:05:54 provision: a.shop.example.com: not swapping for import sd_a2wb44znjn2wkkf5msvbuczuam: its record does not describe a nested, hibernating instance
2026/10/25 13:05:54 provision: a.shop.example.com: not swapping for import sd_qvbfzcfpyc55j2vm6pe6jyfcsy: its record does not describe a nested, hibernating instance
2026/10/25 13:05:54 provision: a.shop.example.com: not swapping for import sd_ewicd55y6f7jxlocb7bzvpikoq: its record does not describe a nested, hibernating instance
2026/10/25 13:05:54 provision: a.shop.example.com: not swapping for import sd_jel2yix2xzkkjwh2ig5qkc3ntq: its record does not describe a nested, hibernating instance
2026/10/25 13:05:54 provision: a.shop.example.com: import deferred: the box's layout intent could not be read: store down
2026/10/25 13:05:54 provision: a.shop.example.com: swapped for import sd_q4qy4uxnjzm2sicms56gnxcngu (the original route is journaled)
2026/10/25 13:05:54 provision: a.shop.example.com: import deferred: the box's nested probe did not answer: ready probe timed out
2026/10/25 13:05:54 provision: a.shop.example.com: swapped for import sd_pyfzgn3aqkdjfmqjmmsatvtuxy (the original route is journaled)
2026/10/25 13:05:54 provision: a.shop.example.com: swapped for import sd_oqx7f2olbbxtog6orz2n2vxcs4 (the original route is journaled)
2026/10/25 13:05:54 provision: a.shop.example.com: import deferred: the route is held by operation op_1
2026/10/25 13:05:54 provision: dry-run: would consider swapping a.shop.example.com for import sd_62vebwxhsogiiacaat5uxvzgei
2026/10/25 13:05:54 provision: a.shop.example.com: import sd_eo4zli3tlh26bsj4odlumg6pcq rolled back to its original route
2026/10/25 13:05:54 provision: a.shop.example.com: import sd_eo4zli3tlh26bsj4odlumg6pcq: the host's replica is left alone: the record apps/bac/shop/instances/a.shop.example.com.json holds the host
2026/10/25 13:05:54 provision: a.shop.example.com: import sd_eo4zli3tlh26bsj4odlumg6pcq is cleaned up and its journal row retired
2026/10/25 13:05:54 provision: a.shop.example.com: import sd_s5hgxtaspj5wj77n4nfhnyjdje left alone: the import journal holds seed sd_2eu67mef3fpm7kjtkab6y6hshy at swapped
2026/10/25 13:05:54 provision: a.shop.example.com: not minting import sd_beiwqn3mzj72tebd4m7qhdi2he: it is swapped but not committed, and only its swap makes its row
2026/10/25 13:05:54 provision: a.shop.example.com: not minting import sd_p2xjllabsga2mdpewwdtsm2v6i: it is placed but not committed, and only its swap makes its row
2026/10/25 13:05:54 provision: a.shop.example.com: swapped for import sd_vim2rwkynwp5z7utopl6bdt7ya (the original route is journaled)
2026/10/25 13:05:54 provision: a.shop.example.com: not minting import sd_vim2rwkynwp5z7utopl6bdt7ya: it is swapped but not committed, and only its swap makes its row
2026/10/25 13:05:54 provision: a.shop.example.com: not minting import sd_vim2rwkynwp5z7utopl6bdt7ya: it is placed but not committed, and only its swap makes its row
2026/10/25 13:05:54 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/25 13:05:54 provision: removed retired sidecar route gone.eleven.bac.sidecar.internal (record gone)
2026/10/25 13:05:54 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 13:05:54 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 13:05:54 provision: converged sidecar bot.eleven.bac.sidecar.internal args ["sidecar","run"] -> ["worker","run"]
2026/10/25 13:05:54 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 13:05:54 provision: converged sidecar bot.eleven.bac.sidecar.internal ceilings 300/3600 -> 60/120
2026/10/25 13:05:54 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 13:05:54 provision: converged sidecar bot.eleven.bac.sidecar.internal channel stable -> canary/eleven
2026/10/25 13:05:54 provision: converged sidecar bot.eleven.bac.sidecar.internal environment "other" -> "relay"
2026/10/25 13:05:54 provision: converged sidecar bot.eleven.bac.sidecar.internal hibernate true -> false
2026/10/25 13:05:54 provision: skipping sidecar record apps/bac/eleven/sidecars/bot.json: read failed: failStore: reads disabled under apps/bac/eleven/sidecars/
2026/10/25 13:05:54 provision: skipping sidecar record apps/bac/eleven/sidecars/bot.json: malformed: invalid character 'n' looking for beginning of object key string
2026/10/25 13:05:54 provision: not removing sidecar bot.eleven.bac.sidecar.internal: its record exists but could not be read cleanly this pass
2026/10/25 13:05:54 provision: skipping sidecar record apps/bac/eleven/sidecars/bot.json: empty channel
2026/10/25 13:05:54 provision: skipping sidecar record apps/bac/eleven/sidecars/held.json: empty channel
2026/10/25 13:05:54 provision: not removing sidecar held.eleven.bac.sidecar.internal: its record exists but could not be read cleanly this pass
2026/10/25 13:05:54 provision: removed retired sidecar route old.eleven.bac.sidecar.internal (record gone)
2026/10/25 13:05:54 provision: bac/eleven has sidecar records but no sidecars manifest — not minting
2026/10/25 13:05:54 provision: bac/eleven is in the trash — not minting sidecar routes for it
2026/10/25 13:05:54 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/25 13:05:54 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/25 13:05:54 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 13:05:54 provision: minted sidecar route hub.relay.bac.sidecar.internal (app "relay" acct "bac" args ["relay"])
2026/10/25 13:05:54 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/25 13:05:54 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 13:05:54 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/25 13:05:54 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 13:05:54 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 13:05:54 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/25 13:05:54 provision: removed retired sidecar route bot.eleven.bac.sidecar.internal (record gone)
2026/10/25 13:05:54 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 13:05:54 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/25 13:05:54 provision: skipping sidecar record apps/bac/relay/sidecars/hub.json: read failed: failStore: reads disabled under apps/bac/relay/sidecars/
2026/10/25 13:05:54 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/25 13:05:54 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 13:05:54 provision: dry-run: would mint sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" channel "stable" args ["sidecar","run"])
2026/10/25 13:05:54 provision: dry-run: would remove retired sidecar route gone.eleven.bac.sidecar.internal (record gone)
2026/10/25 13:05:54 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/25 13:05:54 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:54 provision: converged acme.go.tito.io update settings "{\"updates\":\"manual\",\"channel\":\"stable\"}" -> ""
2026/10/25 13:05:54 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:54 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:54 provision: manifest bac/tito: read failed: provision: manifest bac/tito: unexpected end of JSON input
2026/10/25 13:05:54 provision: manifest bac/tito: read failed: provision: manifest bac/tito: unexpected end of JSON input
2026/10/25 13:05:54 provision: acme.go.tito.io: not minted this pass: the app's update policy could not be read
2026/10/25 13:05:54 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 13:05:54 provision: manifest bac/tito: read failed: provision: manifest bac/tito: unexpected end of JSON input
2026/10/25 13:05:54 provision: acme.go.tito.io: not minted this pass: the app's update policy could not be read
2026/10/25 13:05:54 provision: minted instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac")
2026/10/25 13:05:54 provision: listing apps/bqd/: listdirs refused — its records are unseen this pass
2026/10/25 13:05:54 provision: listing apps/bqd/: listdirs refused — its records are unseen this pass
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: record view: change index unusable (release: change index unreadable: store has no conditional read: unsupported operation): the walk records no generations
2026/10/25 13:05:54 provision: record view: change index unusable (get refused): walking
2026/10/25 13:05:54 provision: record view: change index unusable (release: change index malformed: invalid character 'n' looking for beginning of object key string): walking
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: listing apps/bqd/: listdirs refused — its records are unseen this pass
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: listing apps/bqd/: listdirs refused — its records are unseen this pass
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: listing apps/bqd/: listdirs refused — its records are unseen this pass
2026/10/25 13:05:54 provision: record view: re-reading apps/bqc/shop failed: retrying on the next refresh
2026/10/25 13:05:54 provision: listing apps/bqc/shop/instances/: context canceled — its records are unseen this pass
2026/10/25 13:05:54 provision: record view: re-reading apps/bqc/shop failed: retrying on the next refresh
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: listing apps/bqc/shop/instances/: list refused — its records are unseen this pass
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: listing apps/bqc/shop/instances/: list refused — its records are unseen this pass
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: an app's records could not be listed: they are skipped
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: skipping accounts/bqd/account.json: malformed account manifest: invalid character 'n' looking for beginning of object key string
2026/10/25 13:05:54 provision: skipping accounts/bqd/account.json: malformed account manifest: invalid character 'n' looking for beginning of object key string
2026/10/25 13:05:54 provision: skipping accounts/bqd/account.json: malformed account manifest: invalid character 'n' looking for beginning of object key string
2026/10/25 13:05:54 provision: record view: re-reading accounts/bqd failed: retrying on the next refresh
2026/10/25 13:05:54 provision: skipping accounts/bqd/account.json: read failed: list refused
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: minted instance route one.example.com (app "shop" acct "bum")
2026/10/25 13:05:54 provision: skipping record apps/bum/shop/instances/one.example.com.json: empty channel
2026/10/25 13:05:54 provision: not removing one.example.com: its record exists but could not be read cleanly this pass
2026/10/25 13:05:54 provision: skipping record apps/bum/shop/instances/one.example.com.json: empty channel
2026/10/25 13:05:54 provision: not removing one.example.com: its record exists but could not be read cleanly this pass
2026/10/25 13:05:54 provision: minted instance route one.example.com (app "shop" acct "bum")
2026/10/25 13:05:54 provision: removed retired instance route one.example.com (record gone)
2026/10/25 13:05:54 provision: minted instance route one.example.com (app "shop" acct "bum")
2026/10/25 13:05:54 provision: removed retired instance route one.example.com (record gone)
2026/10/25 13:05:54 provision: record view: change index unusable (context deadline exceeded): walking
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 13:05:54 provision: record view: change index unusable (context deadline exceeded): the walk records no generations
2026/10/25 13:05:54 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
--- FAIL: TestPlan14RootReadCensus (16.18s)
    plan14_root_reads_test.go:600: root read census: 66 discrepancies
        changed registry schema
        changed root read internal/activator/backend_exec.go:ExecBackend.LegacyRunGone; review class, task, sites and digest
        changed root read internal/activator/backend_exec.go:ExecBackend.killFailedGen; review class, task, sites and digest
        changed root read internal/activator/backend_exec.go:ExecBackend.spawnUnitFrom; review class, task, sites and digest
        changed root read internal/activator/backend_exec.go:ExecBackend.startSidecarUnitFrom; review class, task, sites and digest
        changed root read internal/activator/backend_exec.go:ExecBackend.startUnitAt; review class, task, sites and digest
        changed root read internal/activator/backend_exec.go:ExecBackend.waitRoleCgroupEmpty; review class, task, sites and digest
        changed root read internal/activator/unitproc.go:ExecBackend.newUnitProc; review class, task, sites and digest
        changed root read internal/activator/unitproc.go:ExecBackend.newUnitProcFor; review class, task, sites and digest
        changed root read internal/host/buildstate.go:buildStates.retained; review class, task, sites and digest
        changed root read internal/host/claimunit_dropin_linux.go:openClaimUnitDropin; review class, task, sites and digest
        changed root read internal/instancectl/cmd.go:Server.handleCmdStatus; review class, task, sites and digest
        changed root read internal/instancectl/server.go:Server.RunProbe; review class, task, sites and digest
        changed root read internal/instancectl/server.go:parseRequest; review class, task, sites and digest
        changed root read internal/instancectl/server.go:runWithClaim; review class, task, sites and digest
        changed root read internal/instancectl/server.go:type Server; review class, task, sites and digest
        changed root read internal/registry/registry.go:Registry.Upsert; review class, task, sites and digest
        changed root read internal/registry/registry.go:Registry.migrate; review class, task, sites and digest
        changed root read internal/registry/registry.go:routeArgs; review class, task, sites and digest
        changed root read internal/registry/registry.go:scanRoute; review class, task, sites and digest
        changed root read internal/release/adopt.go:adoptHost; review class, task, sites and digest
        changed root source envelope internal/activator
        changed root source envelope internal/host
        changed root source envelope internal/host/units
        changed root source envelope internal/instancectl
        changed root source envelope internal/registry
        changed root source envelope internal/release
        stale root read internal/host/claimstop_run.go:RunInstanceControl
        stale root read internal/instancectl/client.go:Client.do
        stale root read internal/instancectl/gen.go:GenDropIn
        stale root read internal/instancectl/server.go:WaitCgroupEmpty
        stale root read internal/release/adopt.go:stageFrom
        stale root read internal/release/adopt.go:type stageCheck
        unclassified root read internal/host/claimstop_run.go:instanceRegistryHostRuntime registry:Runtime@322,whole:Route@270
        unclassified root read internal/host/units/carlos-instance-rootfs-cmd@.service:external file:external@0
        unclassified root read internal/host/units/carlos-instance-rootfs-gen@.service:external file:external@0
        unclassified root read internal/host/units/carlos-instance-rootfs-probe.service:external file:external@0
        unclassified root read internal/host/units/carlos-instance-rootfs-worker@.service:external file:external@0
        unclassified root read internal/host/units/carlos-instance-rootfs@.service:external file:external@0
        unclassified root read internal/instancectl/client.go:Client.doBody file:ReadAll@719
        unclassified root read internal/instancectl/gen.go:Server.genUnitOfExeKey file:Lstat@197
        unclassified root read internal/instancectl/gen.go:Server.writeDropInIfChanged file:ReadFile@95
        unclassified root read internal/instancectl/gen.go:hostMountLines data-literal@123,data-literal@203,data-literal@288
        unclassified root read internal/instancectl/rootfs.go:Server.ensureRootfsExe file:Lstat@673,file:ReadFile@1102
        unclassified root read internal/instancectl/rootfs.go:resolveRootfsLaunch file:Command@1150,file:Command@898,file:Command@917
        unclassified root read internal/instancectl/rootfs.go:writeFileExcl file:CreateTemp@230
        unclassified root read internal/instancectl/rootfs_identity_linux.go:fileIdentityOf file:Fstat@87
        unclassified root read internal/instancectl/server.go:waitCgroupFileEmpty file:ReadFile@115
        changed legacy declaration internal/activator/backend_exec.go:ExecBackend.LegacyRunGone
        changed legacy declaration internal/activator/backend_exec.go:ExecBackend.killFailedGen
        changed legacy declaration internal/activator/backend_exec.go:ExecBackend.spawnUnitFrom
        changed legacy declaration internal/activator/backend_exec.go:ExecBackend.startUnitAt
        changed legacy declaration internal/activator/backend_exec.go:ExecBackend.waitRoleCgroupEmpty
        changed legacy declaration internal/activator/unitproc.go:ExecBackend.newUnitProc
        changed legacy declaration internal/activator/unitproc.go:ExecBackend.newUnitProcFor
        changed legacy declaration internal/instancectl/client.go:Client.do
        changed legacy declaration internal/instancectl/cmd.go:Server.handleCmdStatus
        changed legacy declaration internal/instancectl/gen.go:GenDropIn
        changed legacy declaration internal/instancectl/server.go:Server.RunProbe
        changed legacy declaration internal/instancectl/server.go:WaitCgroupEmpty
        changed legacy declaration internal/instancectl/server.go:parseRequest
        changed legacy declaration internal/instancectl/server.go:type Server
        changed legacy declaration internal/registry/registry.go:Registry.migrate
        changed legacy declaration internal/registry/registry.go:scanRoute
        changed reclassified declaration internal/activator/backend_exec.go:ExecBackend.startSidecarUnitFrom
        changed reclassified declaration internal/registry/registry.go:Registry.Upsert
        
        make census-card shows what changed; make census-propose NAME=<branch> CLAIMS=<file> writes the overlay and its approval card (AGENTS.md, The census)
FAIL
FAIL	github.com/carlosframework/platform/internal/provision	27.696s
ok  	github.com/carlosframework/platform/internal/publicrelease	0.025s
?   	github.com/carlosframework/platform/internal/regionname	[no test files]
ok  	github.com/carlosframework/platform/internal/registry	6.677s
ok  	github.com/carlosframework/platform/internal/relay	7.273s
ok  	github.com/carlosframework/platform/internal/release	28.147s
ok  	github.com/carlosframework/platform/internal/rollout	4.916s
ok  	github.com/carlosframework/platform/internal/rolloutwords	0.014s
ok  	github.com/carlosframework/platform/internal/rootaws	0.007s
ok  	github.com/carlosframework/platform/internal/rootfsimage	0.353s
ok  	github.com/carlosframework/platform/internal/rootparticipation	0.068s
ok  	github.com/carlosframework/platform/internal/rootstate	0.033s
ok  	github.com/carlosframework/platform/internal/runs	0.662s
ok  	github.com/carlosframework/platform/internal/s3compat	0.010s
ok  	github.com/carlosframework/platform/internal/safefile	0.007s
ok  	github.com/carlosframework/platform/internal/schedule	3.831s
ok  	github.com/carlosframework/platform/internal/seeds	0.011s
ok  	github.com/carlosframework/platform/internal/sim/engines	4.675s
ok  	github.com/carlosframework/platform/internal/sim/hostlife	12.551s
ok  	github.com/carlosframework/platform/internal/sim/litestreamfacts	3.907s
ok  	github.com/carlosframework/platform/internal/status	0.094s
ok  	github.com/carlosframework/platform/internal/steering	0.010s
ok  	github.com/carlosframework/platform/internal/stopevidence	0.382s
ok  	github.com/carlosframework/platform/internal/svcrole	0.005s
ok  	github.com/carlosframework/platform/internal/telemetry	0.020s
ok  	github.com/carlosframework/platform/internal/termfence	0.005s
ok  	github.com/carlosframework/platform/internal/tunnelclient	0.004s
ok  	github.com/carlosframework/platform/internal/unixdial	0.004s
ok  	github.com/carlosframework/platform/internal/updatewords	0.006s
ok  	github.com/carlosframework/platform/internal/usage	0.010s
ok  	github.com/carlosframework/platform/internal/version	0.005s
ok  	github.com/carlosframework/platform/internal/vet	2.065s
FAIL
=== internal_console@0 (78 s)
ok  	github.com/carlosframework/platform/internal/console	76.386s
=== internal_console@1 (50 s)
ok  	github.com/carlosframework/platform/internal/console	48.526s
=== internal_console@2 (46 s)
ok  	github.com/carlosframework/platform/internal/console	44.244s
=== internal_console@3 (47 s)
ok  	github.com/carlosframework/platform/internal/console	45.495s
=== internal_console@4 (49 s)
ok  	github.com/carlosframework/platform/internal/console	47.116s
=== internal_console@5 (47 s)
ok  	github.com/carlosframework/platform/internal/console	45.997s
=== internal_console@6 (51 s)
ok  	github.com/carlosframework/platform/internal/console	49.955s
=== internal_console@7 (55 s)
ok  	github.com/carlosframework/platform/internal/console	53.439s
=== internal_host@0 (36 s)
ok  	github.com/carlosframework/platform/internal/host	34.045s
=== internal_host@1 (35 s)
ok  	github.com/carlosframework/platform/internal/host	32.732s
=== internal_host@2 (67 s)
ok  	github.com/carlosframework/platform/internal/host	64.108s
=== internal_host@3 (39 s)
ok  	github.com/carlosframework/platform/internal/host	36.785s
=== root@0 (73 s)
ok  	github.com/carlosframework/platform	70.786s
=== root@1 (52 s)
ok  	github.com/carlosframework/platform	50.255s
=== root@2 (63 s)
ok  	github.com/carlosframework/platform	61.294s
=== root@3 (61 s)
ok  	github.com/carlosframework/platform	59.068s
=== root@4 (62 s)
ok  	github.com/carlosframework/platform	59.899s

Failure summary:
--- rest
--- FAIL: TestPlan9B8RecordWriteCensus (1.20s)
    plan9_b8_census_test.go:372: record-write census rejected 2 site(s); update the explicit inventory only after reviewing the source:
--- FAIL: TestPlan14RootReadCensus (16.18s)
    plan14_root_reads_test.go:600: root read census: 66 discrepancies
FAIL	github.com/carlosframework/platform/internal/provision	27.696s

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

amadan: step gate failed: exit status 2

amadan: job failed at step gate — its output is above, not at the tail of this log
diff --git a/internal/activator/backend_exec.go b/internal/activator/backend_exec.go
index b830c5313..191f6c998 100644
--- a/internal/activator/backend_exec.go
+++ b/internal/activator/backend_exec.go
@@ -2506,7 +2506,7 @@ func (b *ExecBackend) spawnUnitFrom(ctx context.Context, rt registry.Route, sock
if err == nil {
// The unit ran and exited before root observed it: the build
// crashed at its start (errStartedThenExited, ruling 206).
- err = exitedUnobserved{unit: unitName(instancectl.RoleRun, rt.Host, gen)}
+ err = exitedUnobserved{unit: runUnitName(rt.Host, gen)}
}
if kerr := b.killFailedGen(ctx, rt, gen); kerr != nil {
// Nothing is released: the generation may still be running.
@@ -2526,14 +2526,17 @@ func (b *ExecBackend) spawnUnitFrom(ctx context.Context, rt registry.Route, sock
// The server read the invocation after the start and found none:
// the unit already exited (plan 2 final review). Nothing is
// running, so there is nothing to stop; the wake failed.
- return fail(markStartUncertain(fmt.Errorf("%s: %w", rt.Host, exitedUnobserved{unit: unitName(instancectl.RoleRun, rt.Host, gen)})))
+ return fail(markStartUncertain(fmt.Errorf("%s: %w", rt.Host, exitedUnobserved{unit: runUnitName(rt.Host, gen)})))
}
started := tier
if started == (cgroup.Limit{}) {
started = b.tier(rt)
}
- log.Printf("activator: %s: started %s memory.max=%d (%s)", rt.Host, unitName(instancectl.RoleRun, rt.Host, gen), started.MemoryMax, steps.String())
- up := b.newUnitProcFor(rt, instancectl.RoleRun, gen, p, inv, ctl, logs)
+ log.Printf("activator: %s: started %s memory.max=%d (%s)", rt.Host, runUnitName(rt.Host, gen), started.MemoryMax, steps.String())
+ up, err := b.newUnitProcFor(rt, instancectl.RoleRun, gen, p, inv, ctl, logs)
+ if err != nil {
+ return fail(err)
+ }
// The file environment this generation launched with, kept on its
// handle: a run against it composes its environment from this, never
// from the files config sync has delivered since (merge ruling M3).
@@ -2600,7 +2603,7 @@ func (b *ExecBackend) startUnitAt(ctx context.Context, rt registry.Route, sock s
}
// The spawn's own split, for the journal: the unit's launch (instance
// control's half included) and then the app's boot to its socket.
- log.Printf("activator: %s: %s launched in %s, healthy %s later", rt.Host, unitName(instancectl.RoleRun, rt.Host, n),
+ log.Printf("activator: %s: %s launched in %s, healthy %s later", rt.Host, runUnitName(rt.Host, n),
launched.Sub(began).Round(time.Millisecond), time.Since(launched).Round(time.Millisecond))
b.normalizeSocketMode(rt, sock, up)
return up, spawnVer, nil
@@ -2621,7 +2624,7 @@ func (b *ExecBackend) LegacyRunGone(ctx context.Context, rt registry.Route) erro
if b.Control == nil {
return fmt.Errorf("%s: instance control channel not configured", rt.Host)
}
- unit := unitName(instancectl.RoleRun, rt.Host, 0)
+ unit := runUnitName(rt.Host, 0)
if err := b.Control.Stop(ctx, rt.Host, instancectl.RoleRun); err != nil {
return fmt.Errorf("stop %s: %w", unit, err)
}
@@ -2678,7 +2681,7 @@ func (b *ExecBackend) killFailedGen(ctx context.Context, rt registry.Route, gen
kctx, cancel := context.WithTimeout(context.WithoutCancel(ctx), instancectl.DeadlineControl)
defer cancel()
if err := gc.StopGen(kctx, rt.Host, gen, true); err != nil {
- log.Printf("activator: %s: kill %s after a failed start: %v", rt.Host, unitName(instancectl.RoleRun, rt.Host, gen), err)
+ log.Printf("activator: %s: kill %s after a failed start: %v", rt.Host, runUnitName(rt.Host, gen), err)
return err
}
return nil
@@ -3235,7 +3238,7 @@ func (b *ExecBackend) startSidecarUnitFrom(ctx context.Context, rt registry.Rout
logs.Close()
return nil, fmt.Errorf("%s: %s exited before it was observed", rt.Host, instancectl.UnitName(instancectl.RoleSidecar, rt.Host))
}
- return b.newUnitProc(rt, instancectl.RoleSidecar, p, inv, nil, logs), nil
+ return b.newUnitProc(rt, instancectl.RoleSidecar, p, inv, nil, logs)
}
// socketClient returns an HTTP client that dials an instance's unix socket
diff --git a/internal/activator/rootfs_worker_unit_test.go b/internal/activator/rootfs_worker_unit_test.go
index 42242a944..b5967cc04 100644
--- a/internal/activator/rootfs_worker_unit_test.go
+++ b/internal/activator/rootfs_worker_unit_test.go
@@ -21,3 +21,34 @@ func TestWaitRoleCgroupEmptyRefusesAWorker(t *testing.T) {
t.Fatal("a worker's wait was not refused")
}
}
+
+// unitName answers an error, never "", for a role with no binary unit, and
+// newUnitProcFor refuses before it watches anything.
+func TestUnitNameRefusesAWorker(t *testing.T) {
+ t.Parallel()
+ if u, err := unitName(instancectl.RoleWorker, "shop.example.com", 0); err == nil || u != "" {
+ t.Fatalf("unitName(worker) = %q, %v; want an error", u, err)
+ }
+ if u, err := unitName(instancectl.RoleRun, "shop.example.com", 0); err != nil || u != instancectl.UnitName(instancectl.RoleRun, "shop.example.com") {
+ t.Fatalf("unitName(run) = %q, %v", u, err)
+ }
+ if u := runUnitName("shop.example.com", 7); u != instancectl.GenUnitName("shop.example.com", 7) {
+ t.Fatalf("runUnitName(7) = %q", u)
+ }
+ b := &ExecBackend{}
+ if up, err := b.newUnitProcFor(registry.Route{Host: "shop.example.com"}, instancectl.RoleWorker, 0, instancePaths{}, "inv", nil, nil); err == nil || up != nil {
+ t.Fatalf("newUnitProcFor(worker) = %v, %v; want a refusal", up, err)
+ }
+}
+
+// mustUnitProc wraps newUnitProcFor for a test whose role always has a
+// unit: mustUnitProc(t)(b.newUnitProcFor(...)).
+func mustUnitProc(t *testing.T) func(*unitProc, error) *unitProc {
+ return func(up *unitProc, err error) *unitProc {
+ t.Helper()
+ if err != nil {
+ t.Fatal(err)
+ }
+ return up
+ }
+}
diff --git a/internal/activator/unitproc.go b/internal/activator/unitproc.go
index b69a2eab4..d5304b1a8 100644
--- a/internal/activator/unitproc.go
+++ b/internal/activator/unitproc.go
@@ -95,24 +95,41 @@ type launchKeyLayerProc interface {
// LaunchKeyLayer is the layer LaunchEnv's CARLOS_INSTANCE_KEY came from.
func (p *unitProc) LaunchKeyLayer() instancekey.Layer { return p.launchKeyLayer }
-func (b *ExecBackend) newUnitProc(rt registry.Route, role instancectl.Role, p instancePaths, inv string, ctl *edge.ControlListener, logs *logListener) *unitProc {
+func (b *ExecBackend) newUnitProc(rt registry.Route, role instancectl.Role, p instancePaths, inv string, ctl *edge.ControlListener, logs *logListener) (*unitProc, error) {
return b.newUnitProcFor(rt, role, 0, p, inv, ctl, logs)
}
-func (b *ExecBackend) newUnitProcFor(rt registry.Route, role instancectl.Role, gen uint64, p instancePaths, inv string, ctl *edge.ControlListener, logs *logListener) *unitProc {
- up := &unitProc{b: b, rt: rt, role: role, gen: gen, unit: unitName(role, rt.Host, gen), slice: instancectl.SliceName(rt.Host),
+// newUnitProcFor starts observing the unit a role of host runs as. A role
+// with no binary unit (a rootfs worker, rootfs apps plan 2) is refused
+// before anything watches "".
+func (b *ExecBackend) newUnitProcFor(rt registry.Route, role instancectl.Role, gen uint64, p instancePaths, inv string, ctl *edge.ControlListener, logs *logListener) (*unitProc, error) {
+ unit, err := unitName(role, rt.Host, gen)
+ if err != nil {
+ return nil, err
+ }
+ up := &unitProc{b: b, rt: rt, role: role, gen: gen, unit: unit, slice: instancectl.SliceName(rt.Host),
invocation: inv, runDir: p.runDir, dataDir: p.dataDir, ctl: ctl, logs: logs, done: make(chan struct{})}
go b.observe(up)
- return up
+ return up, nil
}
// unitName is the unit a role of host runs as: the original template's, or
-// generation gen's (zero-downtime spec §7.6).
-func unitName(role instancectl.Role, host string, gen uint64) string {
- if gen == 0 {
- return instancectl.UnitName(role, host)
+// generation gen's (zero-downtime spec §7.6). A role with no binary unit
+// (RoleWorker) is an error, never "".
+func unitName(role instancectl.Role, host string, gen uint64) (string, error) {
+ if gen != 0 {
+ return instancectl.GenUnitName(host, gen), nil
}
- return instancectl.GenUnitName(host, gen)
+ if unit := instancectl.UnitName(role, host); unit != "" {
+ return unit, nil
+ }
+ return "", fmt.Errorf("%s: role %s has no binary unit", host, role)
+}
+
+// runUnitName is unitName for the run role, which always has a unit.
+func runUnitName(host string, gen uint64) string {
+ unit, _ := unitName(instancectl.RoleRun, host, gen)
+ return unit
}
// stopRole stops one role's unit: the original template's through Control,
diff --git a/internal/activator/unitproc_gen_test.go b/internal/activator/unitproc_gen_test.go
index 1d8394c42..a09d8d6aa 100644
--- a/internal/activator/unitproc_gen_test.go
+++ b/internal/activator/unitproc_gen_test.go
@@ -77,7 +77,7 @@ func TestGenerationUnitProcStopsAndWatchesItsOwnUnit(t *testing.T) {
}
unit.set("active", "inv7", true, true)
ctl.stopHook = func(string, instancectl.Role) { unit.set("inactive", "inv7", false, false) }
- up := b.newUnitProcFor(rt, instancectl.RoleRun, 7, b.pathsFor(rt), "inv7", nil, nil)
+ up := mustUnitProc(t)(b.newUnitProcFor(rt, instancectl.RoleRun, 7, b.pathsFor(rt), "inv7", nil, nil))
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
if err := up.Stop(ctx); err != nil {
@@ -127,7 +127,7 @@ func TestGenerationUnitProcConsumesOnlyItsOwnRecordAndLaunchFile(t *testing.T) {
}
}
unit.set("active", "inv7", true, true)
- up := b.newUnitProcFor(rt, instancectl.RoleRun, 7, p, "inv7", nil, nil)
+ up := mustUnitProc(t)(b.newUnitProcFor(rt, instancectl.RoleRun, 7, p, "inv7", nil, nil))
unit.set("inactive", "inv7", false, false)
waitFor(t, "the generation to exit", up.Exited)
for path, want := range map[string]bool{
@@ -300,7 +300,7 @@ func TestGenerationNaturalExitFinalisesItsFiles(t *testing.T) {
t.Parallel()
ctl, unit, b, rt, launch := genProcFixture(t)
unit.set("active", "inv7", true, true)
- up := b.newUnitProcFor(rt, instancectl.RoleRun, 7, b.pathsFor(rt), "inv7", nil, nil)
+ up := mustUnitProc(t)(b.newUnitProcFor(rt, instancectl.RoleRun, 7, b.pathsFor(rt), "inv7", nil, nil))
unit.set("inactive", "inv7", false, false)
waitFor(t, "the generation to exit", up.Exited)
if want := "stopgen h.example.com 7 kill=false"; ctl.joined() != want {
@@ -325,7 +325,7 @@ func TestGenerationForeignInvocationExitFinalisesItsFiles(t *testing.T) {
ctl, unit, b, rt, launch := genProcFixture(t)
ctl.stopHook = func(string, instancectl.Role) { unit.set("inactive", "", false, false) }
unit.set("active", "inv7", true, true)
- up := b.newUnitProcFor(rt, instancectl.RoleRun, 7, b.pathsFor(rt), "inv7", nil, nil)
+ up := mustUnitProc(t)(b.newUnitProcFor(rt, instancectl.RoleRun, 7, b.pathsFor(rt), "inv7", nil, nil))
unit.set("active", "someone-else", true, true)
waitFor(t, "the generation to exit", up.Exited)
if want := "stopgen h.example.com 7 kill=false"; ctl.joined() != want {
diff --git a/internal/instancectl/client.go b/internal/instancectl/client.go
index a3d653c1b..fc4a07054 100644
--- a/internal/instancectl/client.go
+++ b/internal/instancectl/client.go
@@ -425,7 +425,9 @@ func (c *Client) startRootfsQuery(ctx context.Context, q url.Values, memoryMax i
switch {
case status == http.StatusForbidden:
return "", fmt.Errorf("%w: %v", ErrStagedImage, err)
- case status == statusGenUnproven && q.Has("gen"):
+ case status == statusGenUnproven && (q.Has("gen") || q.Has("worker")):
+ // A generation or worker whose refused start could not be proven
+ // stopped: its files are kept and the unit may live.
return "", fmt.Errorf("%w: %w", ErrGenUnproven, err)
}
return "", err
diff --git a/internal/instancectl/gen.go b/internal/instancectl/gen.go
index f2ea69c56..9759fe07f 100644
--- a/internal/instancectl/gen.go
+++ b/internal/instancectl/gen.go
@@ -378,13 +378,15 @@ func (s *Server) markGenStarting(unit string, on bool) {
s.genMu.Lock()
defer s.genMu.Unlock()
if !on {
- delete(s.genStarting, unit)
+ if s.genStarting[unit]--; s.genStarting[unit] <= 0 {
+ delete(s.genStarting, unit)
+ }
return
}
if s.genStarting == nil {
- s.genStarting = map[string]bool{}
+ s.genStarting = map[string]int{}
}
- s.genStarting[unit] = true
+ s.genStarting[unit]++
}
// sweepGenLeftovers is the sweep's recovery for generation units that are
@@ -514,7 +516,7 @@ func (s *Server) sweepGenLeftover(ctx context.Context, unit string) {
// cannot write fresh files in between.
s.genMu.Lock()
defer s.genMu.Unlock()
- if s.genStarting[unit] {
+ if s.genStarting[unit] > 0 {
return
}
if state := s.showValue(ctx, "ActiveState", unit); state != "inactive" && state != "failed" {
diff --git a/internal/instancectl/rootfs.go b/internal/instancectl/rootfs.go
index 8c0e80387..7215a7689 100644
--- a/internal/instancectl/rootfs.go
+++ b/internal/instancectl/rootfs.go
@@ -351,12 +351,13 @@ func (s *Server) ensureRootfsExe(key string, role Role, imagePath string, launch
// writeFileExcl writes data to a fresh temp file beside path (O_EXCL, so a
// link planted there is never followed) and renames it into place.
func writeFileExcl(path string, data []byte, mode os.FileMode) error {
- tmp := path + ".tmp"
- _ = os.Remove(tmp)
- f, err := os.OpenFile(tmp, os.O_WRONLY|os.O_CREATE|os.O_EXCL, mode)
+ // A unique temp name (O_EXCL under the hood), so two starts of one unit
+ // overlapping on the same layout never write through each other's file.
+ f, err := os.CreateTemp(filepath.Dir(path), "."+filepath.Base(path)+".*.tmp")
if err != nil {
return err
}
+ tmp := f.Name()
if _, err := f.Write(data); err != nil {
f.Close()
os.Remove(tmp)
@@ -584,9 +585,11 @@ func (s *Server) rootfsPreflight(w http.ResponseWriter, host string, role Role,
return RootfsLaunch{}, true
}
if rep, ok := s.ReadyRootfs(); !ok {
+ // The first check that is not ok: a failing one, or the unverified
+ // line a service with no probe image reports.
check := "not yet run"
for _, l := range rep.Lines {
- if l.Verdict == "fail" {
+ if l.Verdict != "ok" {
check = l.Check
break
}
@@ -748,7 +751,7 @@ func (s *Server) startRootfs(w http.ResponseWriter, r *http.Request, req request
http.Error(w, msg, http.StatusBadGateway)
return
}
- inv, ok := s.rootfsPlaced(ctx, w, req.host, unit, launch.JIT, remove)
+ inv, ok := s.rootfsPlaced(ctx, w, req.host, unit, launch.JIT, perStart, remove)
if !ok {
return
}
@@ -801,13 +804,25 @@ func rootfsMountFailure(out string) (string, bool) {
// the host slice (a unit that has already exited has none, so its
// configured Slice stands in); MemoryDenyWriteExecute must be no when the
// release declares jit and yes otherwise. On a mismatch the unit is
-// stopped and waited on, its jit drop-in removed, a reload marked owed
-// (the loaded configuration was stale even when no file was there), its
-// files taken, and the request answered 502 naming the property. ok is
-// false when it answered.
-func (s *Server) rootfsPlaced(ctx context.Context, w http.ResponseWriter, host, unit string, jit bool, remove func()) (inv string, ok bool) {
+// stopped and proven gone (endMisplaced), a reload marked owed (the loaded
+// configuration was stale even when no file was there), its files taken,
+// and the request answered 502 naming the property. A stop that cannot be
+// proven keeps the files and says so: a generation or worker (perStart)
+// answers statusGenUnproven, as abandonGen does, so the client knows the
+// unit may live. ok is false when it answered.
+func (s *Server) rootfsPlaced(ctx context.Context, w http.ResponseWriter, host, unit string, jit, perStart bool, remove func()) (inv string, ok bool) {
+ var m map[string]string
end := func(msg string) (string, bool) {
- s.endMisplaced(ctx, host, unit, remove)
+ if err := s.endMisplaced(ctx, unit, m["ControlGroup"]); err != nil {
+ s.logf("instance-control: %s: %s; termination unproven, files kept: %v", host, msg, err)
+ status := http.StatusBadGateway
+ if perStart {
+ status = statusGenUnproven
+ }
+ http.Error(w, msg+"; termination unproven: "+err.Error(), status)
+ return "", false
+ }
+ remove()
s.logf("instance-control: %s: %s", host, msg)
http.Error(w, msg, http.StatusBadGateway)
return "", false
@@ -816,7 +831,7 @@ func (s *Server) rootfsPlaced(ctx context.Context, w http.ResponseWriter, host,
if err != nil {
return end("show: " + err.Error())
}
- m := parseShow(out)
+ m = parseShow(out)
slice := SliceName(host)
own := "/" + parentSlices + "/" + slice + "/" + unit
if cg := m["ControlGroup"]; cg != "" && cg != own || cg == "" && m["Slice"] != slice {
@@ -833,20 +848,31 @@ func (s *Server) rootfsPlaced(ctx context.Context, w http.ResponseWriter, host,
}
// endMisplaced stops a started unit the post-start check refused, on a
-// context the client's hang-up cannot cancel, waits for its cgroup, drops
-// its jit drop-in, marks the reload owed and takes its files.
-func (s *Server) endMisplaced(ctx context.Context, host, unit string, remove func()) {
- dctx, cancel := context.WithTimeout(context.WithoutCancel(ctx), DeadlineControl+s.waitBudget())
+// context the client's hang-up cannot cancel, and proves it gone: the stop
+// succeeds, systemd reports the unit inactive or failed, and the control
+// group the show reported (not the one under the host slice, which a
+// misplaced unit never had) is absent or empty. nil is the proof. The
+// reload is marked owed either way; the jit drop-in goes only with the
+// proof, so a unit that may still run keeps the file that describes it.
+func (s *Server) endMisplaced(ctx context.Context, unit, cg string) error {
+ s.markJITReloadOwed()
+ dctx, cancel := context.WithTimeout(context.WithoutCancel(ctx), DeadlineControl+2*s.waitBudget())
defer cancel()
- s.stopUnit(dctx, unit)
+ if out, err := s.Systemctl(dctx, "stop", unit); err != nil {
+ return errors.New("stop: " + strings.TrimSpace(out+" "+err.Error()))
+ }
wctx, waitCancel := context.WithTimeout(dctx, s.waitBudget())
defer waitCancel()
- if err := WaitCgroupEmpty(wctx, s.CgroupRoot, SliceName(host), unit, 50*time.Millisecond); err != nil {
- s.logf("instance-control: %s: %s: %v", host, unit, err)
+ if err := s.waitInactiveOrFailed(wctx, unit, 50*time.Millisecond); err != nil {
+ return err
+ }
+ if cg != "" && path.IsAbs(cg) && path.Clean(cg) == cg {
+ if err := waitCgroupFileEmpty(wctx, filepath.Join(s.CgroupRoot, cg, "cgroup.events"), unit, 50*time.Millisecond); err != nil {
+ return err
+ }
}
s.removeJITDropIn(unit)
- s.markJITReloadOwed()
- remove()
+ return nil
}
// startRootfsCmd is handleCmd's rootfs branch (run spec §5.4 for a rootfs
@@ -925,7 +951,7 @@ func (s *Server) startRootfsCmd(w http.ResponseWriter, r *http.Request, req requ
deadline := time.Now().Add(s.cmdStartWait())
for {
if inv := s.showValue(ctx, "InvocationID", unit); inv != "" && inv != before {
- if _, ok := s.rootfsPlaced(ctx, w, req.host, unit, launch.JIT, remove); !ok {
+ if _, ok := s.rootfsPlaced(ctx, w, req.host, unit, launch.JIT, false, remove); !ok {
return
}
s.logf("instance-control: %s: started %s (%s) from %s memory.max=%d", req.host, unit, launch.Process, launch.Version, req.tier.MemoryMax)
diff --git a/internal/instancectl/rootfs_test.go b/internal/instancectl/rootfs_test.go
index 05cd8d3cc..9085d184b 100644
--- a/internal/instancectl/rootfs_test.go
+++ b/internal/instancectl/rootfs_test.go
@@ -1749,3 +1749,210 @@ func TestRootfsDigestOfAnotherFileAtTheSamePathIsRehashed(t *testing.T) {
t.Fatalf("an image the manifest does not name was vouched for: %v", err)
}
}
+
+// Fix round 1, finding 1: the C5/C10 refusal takes a unit's files only once
+// the unit is proven gone: the stop succeeded, systemd reports it inactive,
+// and the control group the show reported (a misplaced unit's own, never
+// one under the host slice) is absent or empty. A stop that fails, or a
+// cgroup that stays populated, keeps the files and says so: a generation
+// or worker answers statusGenUnproven, which the client reads as
+// ErrGenUnproven; a run unit a 502 naming the unproven termination.
+func TestRootfsMisplacedUnitIsRemovedOnlyWhenProvenGone(t *testing.T) {
+ misplaced := func(f *rootfsBox, unit string) string {
+ return "InvocationID=" + strings.Repeat("ab", 16) + "\nSlice=system.slice\nControlGroup=/system.slice/" + unit + "\nMemoryDenyWriteExecute=no\n"
+ }
+ // Run unit, jit release (so a jit drop-in exists), stop fails: 502 naming
+ // the unproven termination, the layout and the jit drop-in kept, a
+ // reload owed all the same.
+ f := rootfsFixture(t)
+ f.restageManifest(t, func(m *release.Manifest) { m.JIT = true })
+ unit := RootfsUnitName(RoleRun, f.host)
+ f.ctl.set(rootfsPostStartShow+" "+unit, misplaced(f, unit))
+ f.ctl.fail["stop "+unit] = errors.New("exit status 1")
+ // systemd reads the unit inactive all the same (the stop job failed for
+ // another reason): the failed stop alone must keep the files.
+ f.ctl.set("show -p ActiveState --value "+unit, "inactive\n")
+ status, body := f.post(t, "/start", f.startQuery(RoleRun, release.ProcessWeb, 0))
+ if status != 502 || !strings.Contains(body, "termination unproven") || !strings.Contains(body, "slice") {
+ t.Fatalf("stop failed: %d %q", status, body)
+ }
+ for _, p := range []string{filepath.Join(f.srv.DropInDir, unit+".d", JITDropInName), filepath.Join(RootfsExeDir(f.srv.ExeRoot, provision.InstanceID(f.host), RoleRun), RootfsExeLaunch)} {
+ if _, err := os.Stat(p); err != nil {
+ t.Errorf("%s went although the stop was not proven: %v", p, err)
+ }
+ }
+ if !f.srv.jitReloadOwed() {
+ t.Error("no reload owed after a stale MemoryDenyWriteExecute")
+ }
+ // Run unit, stop succeeds but the reported control group stays populated:
+ // unproven too.
+ f = rootfsFixture(t)
+ f.restageManifest(t, func(m *release.Manifest) { m.JIT = true })
+ f.srv.cgroupWaitBudget = 100 * time.Millisecond
+ f.ctl.set(rootfsPostStartShow+" "+unit, misplaced(f, unit))
+ ev := filepath.Join(f.srv.CgroupRoot, "system.slice", unit, "cgroup.events")
+ if err := os.MkdirAll(filepath.Dir(ev), 0o755); err != nil {
+ t.Fatal(err)
+ }
+ if err := os.WriteFile(ev, []byte("populated 1\n"), 0o644); err != nil {
+ t.Fatal(err)
+ }
+ if status, body := f.post(t, "/start", f.startQuery(RoleRun, release.ProcessWeb, 0)); status != 502 || !strings.Contains(body, "termination unproven") {
+ t.Fatalf("populated cgroup: %d %q", status, body)
+ }
+ f.ctl.mustHaveCall(t, "stop "+unit)
+ if _, err := os.Stat(filepath.Join(f.srv.DropInDir, unit+".d", JITDropInName)); err != nil {
+ t.Errorf("the jit drop-in went although processes remain: %v", err)
+ }
+ // The same, once the cgroup empties: proven, files taken, a plain 502.
+ if err := os.WriteFile(ev, []byte("populated 0\n"), 0o644); err != nil {
+ t.Fatal(err)
+ }
+ if status, body := f.post(t, "/start", f.startQuery(RoleRun, release.ProcessWeb, 0)); status != 502 || strings.Contains(body, "unproven") {
+ t.Fatalf("empty cgroup: %d %q", status, body)
+ }
+ if _, err := os.Stat(filepath.Join(f.srv.DropInDir, unit+".d", JITDropInName)); err == nil {
+ t.Error("the jit drop-in survived a proven stop")
+ }
+ // Generation, stop fails: statusGenUnproven, drop-in and exe directory
+ // kept; through the client it is ErrGenUnproven. A worker the same.
+ for _, c := range []struct {
+ name string
+ unit string
+ dir string
+ call func(f *rootfsBox) error
+ }{
+ {"gen", RootfsGenUnitName(f.host, 2), GenKey(f.host, 2), func(f *rootfsBox) error {
+ _, err := f.client(t).StartRootfs(context.Background(), f.host, 2, cgroup.TierChildren.MemoryMax, f.img(release.ProcessWeb))
+ return err
+ }},
+ {"worker", WorkerUnitName(f.host, "jobs"), WorkerKey(f.host, "jobs"), func(f *rootfsBox) error {
+ _, err := f.client(t).StartRootfsWorker(context.Background(), f.host, "jobs", cgroup.TierChildren.MemoryMax, f.img("jobs"))
+ return err
+ }},
+ } {
+ f := rootfsFixture(t)
+ f.ctl.set(rootfsPostStartShow+" "+c.unit, misplaced(f, c.unit))
+ f.ctl.fail["stop "+c.unit] = errors.New("exit status 1")
+ f.ctl.set("show -p ActiveState --value "+c.unit, "inactive\n")
+ err := c.call(f)
+ if !errors.Is(err, ErrGenUnproven) || !strings.Contains(err.Error(), "termination unproven") {
+ t.Fatalf("%s: %v, want ErrGenUnproven", c.name, err)
+ }
+ if _, err := os.Stat(filepath.Join(f.srv.DropInDir, c.unit+".d", DropInName)); err != nil {
+ t.Errorf("%s: drop-in went although the stop failed: %v", c.name, err)
+ }
+ if _, err := os.Stat(filepath.Join(f.srv.ExeRoot, c.dir)); err != nil {
+ t.Errorf("%s: exe directory went although the stop failed: %v", c.name, err)
+ }
+ // With the stop working, the files go and the answer is a 502 the
+ // client does not read as unproven.
+ delete(f.ctl.fail, "stop "+c.unit)
+ if err := c.call(f); err == nil || errors.Is(err, ErrGenUnproven) {
+ t.Fatalf("%s with a working stop: %v, want a plain refusal", c.name, err)
+ }
+ if _, err := os.Stat(filepath.Join(f.srv.ExeRoot, c.dir)); err == nil {
+ t.Errorf("%s: exe directory survived a proven stop", c.name)
+ }
+ }
+}
+
+// Fix round 1, finding 2: the 503 names the first check that is not ok,
+// so a service with no probe image (the production stub, "unverified")
+// says so rather than "not yet run".
+func TestRootfsPreflightNamesTheFirstFailingCheck(t *testing.T) {
+ f := rootfsFixture(t)
+ f.srv.setRootfsReport(ProbeReport{Ready: false, Lines: []VerdictLine{{Check: "root-image", Verdict: "ok"}, {Check: "rootfs-probe", Verdict: "unverified", Detail: "no probe image on this service"}}})
+ if status, body := f.post(t, "/start", f.startQuery(RoleRun, release.ProcessWeb, 0)); status != 503 || !strings.Contains(body, "(rootfs-probe)") {
+ t.Fatalf("unverified line: %d %q", status, body)
+ }
+ // The production stub itself.
+ f.srv.ProbeImage = nil
+ f.srv.runRootfsProbe(context.Background())
+ if status, body := f.post(t, "/start", f.startQuery(RoleRun, release.ProcessWeb, 0)); status != 503 || !strings.Contains(body, "(rootfs-probe)") {
+ t.Fatalf("stub report: %d %q", status, body)
+ }
+ // A fresh service that has not probed at all.
+ f.srv.mu.Lock()
+ f.srv.rootfsProbed = false
+ f.srv.mu.Unlock()
+ if status, body := f.post(t, "/start", f.startQuery(RoleRun, release.ProcessWeb, 0)); status != 503 || !strings.Contains(body, "(rootfs-probe)") {
+ t.Fatalf("not probed: %d %q", status, body)
+ }
+}
+
+// Fix round 1, finding 4: a worker's drop-in is written only when its bytes
+// change. A second identical start leaves the file's mtime alone (systemd
+// would otherwise report NeedDaemonReload for the loaded unit); a file
+// whose bytes differ is rewritten.
+func TestRootfsWorkerDropInIsWrittenOnlyWhenItsBytesChange(t *testing.T) {
+ f := rootfsFixture(t)
+ unit := WorkerUnitName(f.host, "jobs")
+ q := f.startQuery(RoleWorker, "jobs", 0)
+ q.Set("worker", "jobs")
+ if status, body := f.post(t, "/start", q); status != 200 {
+ t.Fatalf("first start: %d %s", status, body)
+ }
+ path := filepath.Join(f.srv.DropInDir, unit+".d", DropInName)
+ past := time.Now().Add(-time.Hour)
+ if err := os.Chtimes(path, past, past); err != nil {
+ t.Fatal(err)
+ }
+ // The unit is stopped by its stop verb between starts in production; here
+ // the stop would remove the drop-in, so the second start is made with
+ // the unit still loaded, which is exactly when the mtime matters.
+ if status, body := f.post(t, "/start", q); status != 200 {
+ t.Fatalf("second start: %d %s", status, body)
+ }
+ if fi, err := os.Stat(path); err != nil || !fi.ModTime().Equal(past) {
+ t.Errorf("an identical drop-in was rewritten: mtime %v, %v", fi.ModTime(), err)
+ }
+ // Bytes that differ (a drop-in from an older build) are replaced.
+ if err := os.WriteFile(path, []byte(WorkerDropIn(f.host, "jobs", cgroup.TierChildren)+"MemoryMax=1\n"), 0o644); err != nil {
+ t.Fatal(err)
+ }
+ if status, body := f.post(t, "/start", q); status != 200 {
+ t.Fatalf("third start: %d %s", status, body)
+ }
+ if got, _ := os.ReadFile(path); string(got) != WorkerDropIn(f.host, "jobs", cgroup.TierChildren) {
+ t.Errorf("a stale drop-in was not rewritten:\n%s", got)
+ }
+}
+
+// Fix round 1, finding 5: two overlapping starts of the same worker (its
+// name is reused) each hold the unit as starting; the first to finish must
+// not let the sweep take the files the other still needs. The sweep runs
+// while start A is inside its systemctl start, after start B has run whole
+// and systemd (the model) is told the unit is inactive.
+func TestOverlappingWorkerStartsKeepTheSecondStartsFiles(t *testing.T) {
+ f := rootfsFixture(t)
+ unit := WorkerUnitName(f.host, "jobs")
+ q := f.startQuery(RoleWorker, "jobs", 0)
+ q.Set("worker", "jobs")
+ var swept sync.WaitGroup
+ swept.Add(1)
+ f.ctl.mu.Lock()
+ f.ctl.before = map[string]func(){"start": func() {
+ defer swept.Done()
+ if status, body := f.post(t, "/start", q); status != 200 {
+ t.Errorf("start B inside start A: %d %s", status, body)
+ }
+ f.ctl.set("show -p ActiveState --value "+unit, "inactive\n")
+ f.srv.sweepGenLeftovers(context.Background(), nil)
+ }}
+ f.ctl.mu.Unlock()
+ if status, body := f.post(t, "/start", q); status != 200 {
+ t.Fatalf("start A: %d %s", status, body)
+ }
+ swept.Wait()
+ for _, p := range []string{filepath.Join(f.srv.DropInDir, unit+".d", DropInName), filepath.Join(RootfsExeDir(f.srv.ExeRoot, WorkerKey(f.host, "jobs"), RoleWorker), RootfsExeLaunch)} {
+ if _, err := os.Stat(p); err != nil {
+ t.Errorf("%s was swept while a start of the unit was in flight: %v", p, err)
+ }
+ }
+ // With both starts done, the same sweep takes the inactive unit's files.
+ f.srv.sweepGenLeftovers(context.Background(), nil)
+ if _, err := os.Stat(filepath.Join(f.srv.ExeRoot, WorkerKey(f.host, "jobs"))); err == nil {
+ t.Error("the sweep left an inactive worker's files once no start was in flight")
+ }
+}
diff --git a/internal/instancectl/server.go b/internal/instancectl/server.go
index f46f0f580..e10c9209e 100644
--- a/internal/instancectl/server.go
+++ b/internal/instancectl/server.go
@@ -137,8 +137,11 @@ type Server struct {
// genMu guards genStarting, the generation units a start is preparing
// now. The sweep never removes the files of one of them.
- genMu sync.Mutex
- genStarting map[string]bool
+ genMu sync.Mutex
+ // genStarting counts the starts of each unit in flight: worker names
+ // are reused, so two overlapping starts of one unit must both finish
+ // before the sweep may judge its files.
+ genStarting map[string]int
// Legacy run start attempts per host (legacystart.go, #292): the
// starts in flight, the stops in progress, and each host's barrier,
@@ -1070,7 +1073,12 @@ func (s *Server) waitBudget() time.Duration {
// absent or reports "populated 0" in cgroup.events, polling every `every`,
// bounded by ctx and the caller's budget (design §6.5, codex R2-5).
func WaitCgroupEmpty(ctx context.Context, root, slice, unit string, every time.Duration) error {
- events := filepath.Join(root, parentSlices, slice, unit, "cgroup.events")
+ return waitCgroupFileEmpty(ctx, filepath.Join(root, parentSlices, slice, unit, "cgroup.events"), unit, every)
+}
+
+// waitCgroupFileEmpty is WaitCgroupEmpty on one cgroup.events file, for a
+// cgroup that is not under the host slice (a misplaced unit's).
+func waitCgroupFileEmpty(ctx context.Context, events, unit string, every time.Duration) error {
for {
b, err := os.ReadFile(events)
switch {