carlos / platform Public

instancectl: worker role, rootfs unit names and the two launch schemas (rootfs apps plan 2, task 1)

RoleWorker joins ParseRole; prefixFor answers "" for it, so UnitName
never names the host's binary run unit for a worker (preflight 1.1).
Adds the four rootfs template prefixes and the probe unit, the worker
instance and key encodings with their parsers, the rootfs generation
unit, worker file names, IsRootfsUnit, ParseUnitName over the rootfs
templates, Launch's Runtime and Process, RootfsLaunch, StagedImage,
ErrStagedImage and the rootfs exe layout.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev 90ef6a0c79098d5ac27fb628cb6381f802e27be5 parent 3208235
2 files changed, +436 −11
  • internal/instancectl/names.go +277 −11
  • internal/instancectl/names_test.go +159 −0

CI failed — run details

CI log
=== gate ===
.amadan/test-gate.sh
=== launchctx (0 s)
ok  	amadan.net/carlos/platform.git/launchctx	0.013s
?   	amadan.net/carlos/platform.git/launchctx/controlname	[no test files]
?   	amadan.net/carlos/platform.git/launchctx/wireid	[no test files]
=== vet (19 s)
=== gofmt (0 s)
gofmt -l .: clean
=== rest (75 s)
?   	github.com/carlosframework/platform/cmd/changelog	[no test files]
ok  	github.com/carlosframework/platform/cmd/console	4.032s
ok  	github.com/carlosframework/platform/cmd/moveprobe	11.786s
ok  	github.com/carlosframework/platform/cmd/zddprobe	0.748s
ok  	github.com/carlosframework/platform/internal/activator	60.987s
ok  	github.com/carlosframework/platform/internal/agentsock	0.021s
ok  	github.com/carlosframework/platform/internal/alerting	0.006s
ok  	github.com/carlosframework/platform/internal/analytics	0.038s
ok  	github.com/carlosframework/platform/internal/appconfig	2.953s
ok  	github.com/carlosframework/platform/internal/apperr	0.105s
ok  	github.com/carlosframework/platform/internal/applog	0.178s
ok  	github.com/carlosframework/platform/internal/assetcache	0.095s
ok  	github.com/carlosframework/platform/internal/awsinv	0.004s
ok  	github.com/carlosframework/platform/internal/boxchoice	0.005s
ok  	github.com/carlosframework/platform/internal/boxid	0.988s
?   	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.018s
ok  	github.com/carlosframework/platform/internal/caps	0.016s
ok  	github.com/carlosframework/platform/internal/certwarm	0.003s
ok  	github.com/carlosframework/platform/internal/cgroup	0.807s
ok  	github.com/carlosframework/platform/internal/changelog	0.412s
ok  	github.com/carlosframework/platform/internal/claimactivation	1.135s
ok  	github.com/carlosframework/platform/internal/clamd	0.062s
?   	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.260s
ok  	github.com/carlosframework/platform/internal/dbdoor/dbdoortest	0.012s
ok  	github.com/carlosframework/platform/internal/dbquery	0.006s
ok  	github.com/carlosframework/platform/internal/dbreads	2.144s
?   	github.com/carlosframework/platform/internal/dbreads/dbreadstest	[no test files]
ok  	github.com/carlosframework/platform/internal/dbverify	0.006s
ok  	github.com/carlosframework/platform/internal/dnsrec	0.005s
ok  	github.com/carlosframework/platform/internal/docsite	0.010s
ok  	github.com/carlosframework/platform/internal/domains	3.020s
ok  	github.com/carlosframework/platform/internal/doorkey	0.010s
ok  	github.com/carlosframework/platform/internal/economics	0.018s
ok  	github.com/carlosframework/platform/internal/edge	45.270s
?   	github.com/carlosframework/platform/internal/edgeproof	[no test files]
ok  	github.com/carlosframework/platform/internal/edgesfile	0.018s
ok  	github.com/carlosframework/platform/internal/fleetapi	0.175s
ok  	github.com/carlosframework/platform/internal/gate	1.772s
ok  	github.com/carlosframework/platform/internal/genselect	0.052s
ok  	github.com/carlosframework/platform/internal/geo	0.033s
ok  	github.com/carlosframework/platform/internal/geoip	0.086s
ok  	github.com/carlosframework/platform/internal/historyreadback	0.278s
ok  	github.com/carlosframework/platform/internal/hostactors	7.067s
ok  	github.com/carlosframework/platform/internal/hostactors/awsmembership	0.008s
ok  	github.com/carlosframework/platform/internal/hostbox	3.046s
ok  	github.com/carlosframework/platform/internal/hostclaim	0.791s
ok  	github.com/carlosframework/platform/internal/hostenv	0.013s
ok  	github.com/carlosframework/platform/internal/hostevidence	0.014s
ok  	github.com/carlosframework/platform/internal/hostexec	5.223s
ok  	github.com/carlosframework/platform/internal/hostfence	0.057s
ok  	github.com/carlosframework/platform/internal/hostfiles	10.498s
ok  	github.com/carlosframework/platform/internal/hostfloor	0.039s
ok  	github.com/carlosframework/platform/internal/hostguard	1.096s
ok  	github.com/carlosframework/platform/internal/hostops	1.927s
?   	github.com/carlosframework/platform/internal/hostops/fencerelease	[no test files]
ok  	github.com/carlosframework/platform/internal/hostops/internal/fencerelease	0.010s
ok  	github.com/carlosframework/platform/internal/hostquarantine	0.003s
ok  	github.com/carlosframework/platform/internal/hostrelocate	0.675s
ok  	github.com/carlosframework/platform/internal/hostresolve	0.247s
ok  	github.com/carlosframework/platform/internal/hostwrite	0.005s
ok  	github.com/carlosframework/platform/internal/infraview	0.008s
ok  	github.com/carlosframework/platform/internal/instancectl	5.252s
ok  	github.com/carlosframework/platform/internal/instanceexec	2.832s
ok  	github.com/carlosframework/platform/internal/instancefs	0.009s
ok  	github.com/carlosframework/platform/internal/instancekey	0.012s
ok  	github.com/carlosframework/platform/internal/instanceupdates	0.014s
ok  	github.com/carlosframework/platform/internal/layout	1.783s
ok  	github.com/carlosframework/platform/internal/lbhealth	0.009s
ok  	github.com/carlosframework/platform/internal/lease	10.141s
ok  	github.com/carlosframework/platform/internal/lease/leasetest	0.594s
ok  	github.com/carlosframework/platform/internal/ledger	0.043s
ok  	github.com/carlosframework/platform/internal/mail	0.281s
ok  	github.com/carlosframework/platform/internal/maintenance	0.107s
ok  	github.com/carlosframework/platform/internal/maintenanceexec	5.581s
ok  	github.com/carlosframework/platform/internal/maintenanceguard	0.112s
ok  	github.com/carlosframework/platform/internal/metrics	0.011s
ok  	github.com/carlosframework/platform/internal/moves	23.929s
ok  	github.com/carlosframework/platform/internal/moves/archive	0.953s
ok  	github.com/carlosframework/platform/internal/objstore	0.315s
ok  	github.com/carlosframework/platform/internal/ops	0.207s
ok  	github.com/carlosframework/platform/internal/park	0.312s
ok  	github.com/carlosframework/platform/internal/plans	0.006s
ok  	github.com/carlosframework/platform/internal/privatefile	0.004s
2026/10/25 10:46:03 provision: listing apps/bab/blog/instances/: list refused — its records are unseen this pass
2026/10/25 10:46:03 provision: listing apps/bab/: listdirs refused — its records are unseen this pass
2026/10/25 10:46:03 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:03 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:03 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:03 provision: listing apps/bac/tito/instances/: list refused — its records are unseen this pass
2026/10/25 10:46:03 provision: listing apps/bac/tito/instances/: list refused — its records are unseen this pass
2026/10/25 10:46:03 provision: skipping record apps/bac/tito/instances/one.example.com.json: unreadable: read refused
2026/10/25 10:46:03 provision: listing apps/bac/tito/instances/: list refused — its records are unseen this pass
2026/10/25 10:46:03 provision: an app's records could not be listed: they are skipped
2026/10/25 10:46:03 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 10:46:03 provision: remove retired instance route shop.example: provision: claim admission unavailable
2026/10/25 10:46:03 provision: remove retired instance route shop.example: provision: claim admission unavailable
2026/10/25 10:46:03 provision: remove retired sidecar route worker.sidecar.internal: provision: claim admission unavailable
2026/10/25 10:46:03 provision: remove retired sidecar route worker.sidecar.internal: provision: claim admission unavailable
2026/10/25 10:46:03 provision: claim install acme.go.tito.io: provision: claim admission unavailable
2026/10/25 10:46:03 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:03 provision: claim install acme.go.tito.io: registry: claim row ownership changed or unknown
2026/10/25 10:46:03 provision: claim install bot.eleven.bac.sidecar.internal: provision: claim admission unavailable
2026/10/25 10:46:03 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/25 10:46:03 provision: claim install bot.eleven.bac.sidecar.internal: registry: claim row ownership changed or unknown
2026/10/25 10:46:03 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 10:46:03 provision: acme.go.tito.io: not minting this pass: the box's layout intent could not be read: no sealed config
2026/10/25 10:46:03 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:03 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:03 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 10:46:03 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/25 10:46:03 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/25 10:46:03 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 10:46:03 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:03 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 10:46:03 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/25 10:46:03 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/25 10:46:03 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:03 provision: claim install acme.go.tito.io: registry: claim row ownership changed or unknown
2026/10/25 10:46:04 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: claim install acme.go.tito.io: registry: claim row ownership changed or unknown
2026/10/25 10:46:04 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 10:46:04 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/25 10:46:04 provision: claim install bot.eleven.bac.sidecar.internal: registry: claim row ownership changed or unknown
2026/10/25 10:46:04 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/25 10:46:04 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/25 10:46:04 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 10:46:04 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 10:46:04 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:04 provision: skipping record apps/bac/tito/instances/new.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:04 provision: not removing acme.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/25 10:46:04 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:04 provision: skipping record apps/bac/tito/instances/new.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:04 provision: minted instance route re.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route rf.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route rh.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route ri.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route rj.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route rk.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route ra.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route rc.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route rd.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route rg.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route rl.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route rb.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route rc.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route rd.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route ra.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route rb.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: skipping record apps/bac/tito/instances/rb.go.tito.io.json: read failed: read refused
2026/10/25 10:46:04 provision: skipping record apps/bac/tito/instances/rb.go.tito.io.json: read failed: read refused
2026/10/25 10:46:04 provision: minted instance route re.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route x.appb.example (app "appb" acct "bac")
2026/10/25 10:46:04 provision: minted instance route x.appd.example (app "appd" acct "bac")
2026/10/25 10:46:04 provision: minted instance route x.apph.example (app "apph" acct "bac")
2026/10/25 10:46:04 provision: minted instance route x.appa.example (app "appa" acct "bac")
2026/10/25 10:46:04 provision: minted instance route x.appc.example (app "appc" acct "bac")
2026/10/25 10:46:04 provision: minted instance route x.appe.example (app "appe" acct "bac")
2026/10/25 10:46:04 provision: minted instance route x.appf.example (app "appf" acct "bac")
2026/10/25 10:46:04 provision: minted instance route x.appg.example (app "appg" acct "bac")
2026/10/25 10:46:04 provision: minted instance route x.appi.example (app "appi" acct "bac")
2026/10/25 10:46:04 provision: minted instance route x.appj.example (app "appj" acct "bac")
2026/10/25 10:46:04 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/25 10:46:04 provision: minted instance route r0115.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0032.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0033.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0053.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0102.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0041.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0035.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0086.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0122.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0013.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0037.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0042.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0058.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0085.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0105.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0123.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0023.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0027.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0047.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0107.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0119.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0025.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0051.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0071.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0073.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0103.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0109.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0125.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0043.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0108.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0114.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0045.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0049.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0063.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0067.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0070.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0087.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0121.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0075.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0084.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0089.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0124.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0005.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0117.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0044.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0052.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0112.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0019.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0020.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0022.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0031.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0065.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0066.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0068.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0024.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0004.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0050.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0057.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0061.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0088.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0040.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0062.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0080.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0081.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0092.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0076.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0090.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0007.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0118.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0002.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0018.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0003.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0011.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0016.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0074.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0091.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0094.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0095.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0100.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0000.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0029.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0046.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0096.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0001.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0028.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0034.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0056.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0064.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0077.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0093.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0098.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0038.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0111.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0110.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0012.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0069.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0101.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0036.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0078.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0099.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0126.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0104.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0120.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0009.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0014.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0021.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0030.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0060.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0106.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0113.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0128.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0010.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0015.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0055.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0116.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0127.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0129.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0006.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0017.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0048.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0008.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0039.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0054.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0059.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0072.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0079.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0082.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0083.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0026.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:04 provision: minted instance route r0097.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:05 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:05 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:05 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 10:46:05 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:05 provision: minted instance route console.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:05 provision: minted service route ha.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:05 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:05 provision: minted service route svc.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:05 provision: minted instance route whole.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:05 provision: minted instance route shared.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:05 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:05 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:05 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:05 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:05 provision: converged acme.go.tito.io channel stable -> edge
2026/10/25 10:46:05 provision: converged acme.go.tito.io channel edge -> canary/rehearsal
2026/10/25 10:46:05 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:05 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: empty channel
2026/10/25 10:46:05 provision: not removing acme.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/25 10:46:05 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:05 provision: converged acme.go.tito.io environment "" -> "staging"
2026/10/25 10:46:05 provision: converged acme.go.tito.io environment "staging" -> ""
2026/10/25 10:46:05 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:05 provision: converged acme.go.tito.io steering "" -> "latency"
2026/10/25 10:46:05 provision: converged acme.go.tito.io steering "latency" -> ""
2026/10/25 10:46:05 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:05 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:05 provision: converged acme.go.tito.io hibernate false -> true
2026/10/25 10:46:05 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:05 provision: converged acme.go.tito.io hibernate true -> false (replication "daily" cleared: only a hibernating route's rung is read)
2026/10/25 10:46:05 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: converged acme.go.tito.io status-named false -> true
2026/10/25 10:46:06 provision: converged acme.go.tito.io status-named true -> false
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted service route ha.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 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 10:46:06 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 10:46:06 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 10:46:06 provision: minted service route whole.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 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 10:46:06 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 10:46:06 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 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted service route whole.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: skipping accounts/bac/account.json: malformed account manifest: invalid character 'o' in literal null (expecting 'u')
2026/10/25 10:46:06 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: manifest bac/tito: read failed: provision: manifest bac/tito: invalid character 'o' in literal null (expecting 'u')
2026/10/25 10:46:06 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 10:46:06 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 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 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 10:46:06 provision: not removing acme$evil.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/25 10:46:06 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 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 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 10:46:06 provision: not removing bad-service.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/25 10:46:06 provision: skipping record apps/bac/tito/instances/no-channel.go.tito.io.json: empty channel
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: skipping record apps/bac/tito/instances/no-channel.go.tito.io.json: empty channel
2026/10/25 10:46:06 provision: not removing no-channel.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:06 provision: not removing acme.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/25 10:46:06 provision: removed retired instance route ghost.go.tito.io (record gone)
2026/10/25 10:46:06 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 10:46:06 provision: minted instance route dup.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/25 10:46:06 provision: removed retired instance route acme.go.tito.io (app in the trash)
2026/10/25 10:46:06 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/25 10:46:06 provision: removed retired static route site.go.tito.io (app in the trash)
2026/10/25 10:46:06 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 10:46:06 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/25 10:46:06 provision: removed retired instance route acme.go.tito.io (app in the trash)
2026/10/25 10:46:06 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/25 10:46:06 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 10:46:06 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/25 10:46:06 provision: converged acme.go.tito.io channel stable -> edge
2026/10/25 10:46:06 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/25 10:46:06 provision: converged acme.go.tito.io channel canary/rehearsal -> edge
2026/10/25 10:46:06 provision: converged acme.go.tito.io environment "staging" -> ""
2026/10/25 10:46:06 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/25 10:46:06 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 10:46:06 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 10:46:06 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 10:46:06 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 10:46:06 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 10:46:06 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 10:46:06 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/25 10:46:06 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/25 10:46:06 provision: dry-run: would mint instance route acme.go.tito.io (app "tito" acct "bac" channel "stable")
2026/10/25 10:46:06 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 10:46:06 provision: dry-run: would converge adopt.go.tito.io channel stable -> edge
2026/10/25 10:46:06 provision: dry-run: would converge adopt.go.tito.io environment "" -> "staging"
2026/10/25 10:46:06 provision: dry-run: would converge owned.go.tito.io channel stable -> edge
2026/10/25 10:46:06 provision: dry-run: would converge owned.go.tito.io environment "" -> "staging"
2026/10/25 10:46:06 provision: dry-run: would converge owned.go.tito.io hibernate false -> true
2026/10/25 10:46:06 provision: dry-run: would converge owned.go.tito.io seed
2026/10/25 10:46:06 provision: dry-run: would remove retired instance route gone.go.tito.io (record gone)
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: adopted existing route adopt.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/25 10:46:06 provision: converged adopt.go.tito.io channel stable -> edge
2026/10/25 10:46:06 provision: converged adopt.go.tito.io environment "" -> "staging"
2026/10/25 10:46:06 provision: converged owned.go.tito.io channel stable -> edge
2026/10/25 10:46:06 provision: converged owned.go.tito.io environment "" -> "staging"
2026/10/25 10:46:06 provision: converged owned.go.tito.io hibernate false -> true
2026/10/25 10:46:06 provision: removed retired instance route gone.go.tito.io (record gone)
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: adopted existing route story.carlosframework.com (app "story" acct "bad") — this record now owns its channel and environment
2026/10/25 10:46:06 provision: story.carlosframework.com exists but is not the route this record describes (kind "instance"/"static") — leaving it alone
2026/10/25 10:46:06 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted service route pub.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted service route pubs.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted service route loop.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted service route named.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted service route priv.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted instance route unit.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted instance route exec.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted static route pisite.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: removed retired static route site.go.tito.io (record gone)
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted instance route acme-uk.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: converged acme.go.tito.io replicas "ie,uk" -> "uk"
2026/10/25 10:46:06 provision: converged acme.go.tito.io replicas "uk" -> ""
2026/10/25 10:46:06 provision: minted instance route acme-uk.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: converged acme-uk.go.tito.io replica mark true -> false
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 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 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:06 provision: acme.go.tito.io: not minting this pass: the box's layout intent could not be read: store down
2026/10/25 10:46:06 provision: router.go.tito.io: not minting this pass: the box's layout intent could not be read: store down
2026/10/25 10:46:06 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/25 10:46:06 provision: converged acme.go.tito.io channel stable -> edge
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac")
2026/10/25 10:46:06 provision: not removing acme.go.tito.io (record gone): participant of a running operation
2026/10/25 10:46:06 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/25 10:46:06 provision: minted instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac")
2026/10/25 10:46:07 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 10:46:07 provision: held acme.go.tito.io landing by mv_acme (was ready)
2026/10/25 10:46:07 provision: acme.go.tito.io: held restoring by rb_other, not by mv_acme; leaving it
2026/10/25 10:46:07 provision: acme.go.tito.io: the row is not this pass's (app "other" acct ""); not holding it for mv_acme
2026/10/25 10:46:07 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/25 10:46:07 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 10:46:07 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 10:46:07 provision: held acme.go.tito.io landing by mv_acme (was ready)
2026/10/25 10:46:07 provision: minted instance route acme.example.com (app "shop" acct "bac")
2026/10/25 10:46:07 provision: minted instance route plain.example.com (app "shop" acct "bac")
2026/10/25 10:46:07 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:07 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 10:46:07 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:07 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 10:46:07 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:07 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 10:46:07 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:07 provision: listing apps/bac/shop/instances/: list refused — its records are unseen this pass
2026/10/25 10:46:08 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:08 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:08 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/25 10:46:08 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:08 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/25 10:46:08 provision: minted sidecar route bot.shop.bac.sidecar.internal (app "shop" acct "bac" args ["run"])
2026/10/25 10:46:08 provision: removed retired sidecar route bot.shop.bac.sidecar.internal (record gone)
2026/10/25 10:46:08 provision: minted sidecar route bot.shop.bum.sidecar.internal (app "shop" acct "bum" args ["run"])
2026/10/25 10:46:08 provision: minted sidecar route bot.shop.bum.sidecar.internal (app "shop" acct "bum" args ["run"])
2026/10/25 10:46:08 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 10:46:08 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 10:46:08 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 10:46:08 provision: removed retired sidecar route bot.shop.bum.sidecar.internal (record gone)
2026/10/25 10:46:08 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 10:46:08 provision: removed retired sidecar route bot.shop.bum.sidecar.internal (record gone)
2026/10/25 10:46:08 provision: a.shop.example.com: swapped for import sd_fsa7xm6vsnl3rp4h4d5cmoo67i (the original route is journaled)
2026/10/25 10:46:08 provision: a.shop.example.com: import sd_fsa7xm6vsnl3rp4h4d5cmoo67i committed: its gate is cleared and its journal row dropped
2026/10/25 10:46:08 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 10:46:09 provision: a.shop.example.com: import sd_5euytspwrpxmeo5fy2omvxapui rolled back to its original route
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_5euytspwrpxmeo5fy2omvxapui: the host's replica is left alone: the record apps/bac/shop/instances/a.shop.example.com.json holds the host
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_5euytspwrpxmeo5fy2omvxapui is cleaned up and its journal row retired
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_5nuzbz4debwuhdkubbhmftdrgu rolled back to its original route
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_5nuzbz4debwuhdkubbhmftdrgu: the host's replica is left alone: the record apps/bac/shop/instances/a.shop.example.com.json holds the host
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_5nuzbz4debwuhdkubbhmftdrgu is cleaned up and its journal row retired
2026/10/25 10:46:09 provision: dry-run: would redo a.shop.example.com's swap record CAS for import sd_vri4vgqqghc5dfotps6yf23mv4
2026/10/25 10:46:09 provision: dry-run: would clear a.shop.example.com's import gate
2026/10/25 10:46:09 provision: dry-run: would converge a.shop.example.com seed source
2026/10/25 10:46:09 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 10:46:09 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 10:46:09 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 10:46:09 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 10:46:09 provision: a.shop.example.com: import sd_olphse3zepidujbprj3inftzyq cannot roll back on this box: the activator is not wired; it stays journaled and gated
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_tzgxqxjiv43jr7m566ngksnv2m cannot roll back on this box: the activator is not wired; it stays journaled and gated
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_2yau3kgtryarnb4w466synpq5a is journaled, but this box cannot act on imports; its row is left alone
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_igia7mywfsohjybyx2hi4rgc5y is journaled, but this box cannot act on imports; its row is left alone
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_4t5ifs4jhdqi7w676ojj2iknwa is journaled, but this box cannot act on imports; its row is left alone
2026/10/25 10:46:09 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 10:46:09 provision: b.shop.example.com: import sd_xkocrbq7gnpc7k2q6vbi7md3s4 left alone this pass: the import journal could not be read
2026/10/25 10:46:09 provision: c.shop.example.com: import sd_yfhj3jsc6qqfn4zrvrpxhybheq left alone this pass: the import journal could not be read
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_wgghwwyvlqzvv2jhmxowaplbfe committed: its gate is cleared and its journal row dropped
2026/10/25 10:46:09 provision: a.shop.example.com: not converging import sd_sbth3fqib7qfffwkhkhwnislti: it is swapped but not committed, and the row on this box has no import gate
2026/10/25 10:46:09 provision: a.shop.example.com: not converging import sd_qvcawsw4x2okm5jdeyto6fggaq: it is swapped but not committed, and the row on this box has no import gate
2026/10/25 10:46:09 provision: a.shop.example.com: not converging import sd_yrtcpuyqkernpgrxk7r5v25zvy: it is placed but not committed, and the row on this box has no import gate
2026/10/25 10:46:09 provision: a.shop.example.com: not converging import sd_zeriefgh5wl7t7ayr6vax34is4: it is placed but not committed, and the row on this box has no import gate
2026/10/25 10:46:09 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 10:46:09 provision: converge seed source on a.shop.example.com: constraint failed: seed_source is read-only here (1811)
2026/10/25 10:46:09 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 10:46:09 provision: a.shop.example.com: import sd_kbujneandpgzv2vdrpaekd5xsa committed: its gate is cleared and its journal row dropped
2026/10/25 10:46:09 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 10:46:09 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:09 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 10:46:09 provision: acme.go.tito.io: not minting a seeded instance: this box does not mint nested (<nil>)
2026/10/25 10:46:09 provision: acme.go.tito.io: not minting a seeded instance: claim control is on for this box
2026/10/25 10:46:09 provision: acme.go.tito.io: aborted seed sd_scmzwsvygbucsnftny6ri6bzia: this box cannot read seed markers, and places no seed; nothing local is removed
2026/10/25 10:46:09 provision: acme.go.tito.io: aborted seed sd_scmzwsvygbucsnftny6ri6bzia rolled back (no box had swapped it)
2026/10/25 10:46:09 provision: acme.go.tito.io: not minting a seeded instance: its record does not describe a hibernating instance
2026/10/25 10:46:09 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:09 provision: removed instance route acme.go.tito.io (its seed sd_u7zrh6vclka5fmwy3cvvmeywxe was aborted); the next pass rolls it back
2026/10/25 10:46:09 provision: acme.go.tito.io: aborted seed sd_u7zrh6vclka5fmwy3cvvmeywxe: this box cannot read seed markers, and places no seed; nothing local is removed
2026/10/25 10:46:09 provision: acme.go.tito.io: aborted seed sd_u7zrh6vclka5fmwy3cvvmeywxe rolled back (no box had swapped it)
2026/10/25 10:46:09 provision: acme.go.tito.io: aborted seed sd_b6boofi4ft2fppqnslvrncxvqm has a row this pass may not remove; leaving the seed aborted
2026/10/25 10:46:09 provision: acme.go.tito.io: aborted seed sd_rg4xmzq4skxkia7sot6ou4hlni rolled back (no box had swapped it)
2026/10/25 10:46:09 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:09 provision: removed instance route acme.go.tito.io (its seed sd_r2obgza7k25zty3px4h4yuthby was aborted); the next pass rolls it back
2026/10/25 10:46:09 provision: acme.go.tito.io: aborted seed sd_r2obgza7k25zty3px4h4yuthby has no route on this box: its local data is removed
2026/10/25 10:46:09 provision: acme.go.tito.io: aborted seed sd_r2obgza7k25zty3px4h4yuthby rolled back (no box had swapped it)
2026/10/25 10:46:09 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:09 provision: a.shop.example.com: swapped for import sd_aivkyqqjibhsr3si6k2cqwdz4a (the original route is journaled)
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_aivkyqqjibhsr3si6k2cqwdz4a rolled back to its original route
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_aivkyqqjibhsr3si6k2cqwdz4a is cleaned up and its journal row retired
2026/10/25 10:46:09 provision: a.shop.example.com: swapped for import sd_2f2pxfg7wp4cvqpzuhpdtp73fy (the original route is journaled)
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_2f2pxfg7wp4cvqpzuhpdtp73fy rolled back to its original route
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_2f2pxfg7wp4cvqpzuhpdtp73fy is cleaned up and its journal row retired
2026/10/25 10:46:09 provision: a.shop.example.com: swapped for import sd_ngcjpzbg7pbfrljry5ivldufcm (the original route is journaled)
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_ngcjpzbg7pbfrljry5ivldufcm rolled back to its original route
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_ngcjpzbg7pbfrljry5ivldufcm: the host's replica is left alone: its record no longer names this seed
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_ngcjpzbg7pbfrljry5ivldufcm is cleaned up and its journal row retired
2026/10/25 10:46:09 provision: a.shop.example.com: swapped for import sd_yeqdr5neab64wg2rwu44dh75ze (the original route is journaled)
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_yeqdr5neab64wg2rwu44dh75ze rollback deferred: the host is not fenced and stopped yet (<nil>)
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_yeqdr5neab64wg2rwu44dh75ze rolled back to its original route
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_yeqdr5neab64wg2rwu44dh75ze is cleaned up and its journal row retired
2026/10/25 10:46:09 provision: a.shop.example.com: swapped for import sd_dnqypmmrwp67kkpawzncf4pltm (the original route is journaled)
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_dnqypmmrwp67kkpawzncf4pltm rollback deferred: the host is not fenced and stopped yet (stop unproven)
2026/10/25 10:46:09 provision: a.shop.example.com: swapped for import sd_wob3iewa6m52gj2kussyxr7z4e (the original route is journaled)
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_wob3iewa6m52gj2kussyxr7z4e is cleaned up and its journal row retired
2026/10/25 10:46:09 provision: a.shop.example.com: swapped for import sd_2k6c4bhsv2jnede32zlzjssknu (the original route is journaled)
2026/10/25 10:46:09 provision: skipping record apps/bac/shop/instances/a.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:09 provision: a.shop.example.com: import sd_2k6c4bhsv2jnede32zlzjssknu left alone this pass: its record could not be read
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_5iuhvgvnnd52m2adtcjnn6bkve (the original route is journaled)
2026/10/25 10:46:10 provision: skipping record apps/bac/shop/instances/a.shop.example.com.json: read failed: connection reset
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_5iuhvgvnnd52m2adtcjnn6bkve left alone this pass: its record could not be read
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_74jsd6tgxn72bk6gb5bhndmxia (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_74jsd6tgxn72bk6gb5bhndmxia: close the import gate: constraint failed: injected (1811)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_74jsd6tgxn72bk6gb5bhndmxia rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_74jsd6tgxn72bk6gb5bhndmxia is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_t7n3p5kf6htkexhhowfpg5yyea (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_t7n3p5kf6htkexhhowfpg5yyea: close the import gate: constraint failed: injected (1811)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_t7n3p5kf6htkexhhowfpg5yyea rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_t7n3p5kf6htkexhhowfpg5yyea is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_ed3wsmijnyg76hdwy2g4vyny5m (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_ed3wsmijnyg76hdwy2g4vyny5m rollback deferred: the host is not fenced and stopped yet (injected failure at fence)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_ed3wsmijnyg76hdwy2g4vyny5m rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_ed3wsmijnyg76hdwy2g4vyny5m is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_ftcamwsuyzxyhssh76mqmpecdi (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_ftcamwsuyzxyhssh76mqmpecdi rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_ftcamwsuyzxyhssh76mqmpecdi is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_mv2p32dloo5nxqg254ktawk5qy (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_mv2p32dloo5nxqg254ktawk5qy: retire its instance key: injected failure at retire-key
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_mv2p32dloo5nxqg254ktawk5qy rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_mv2p32dloo5nxqg254ktawk5qy is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_fbtefq5eni6xd7qvryqzicmvjq (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_fbtefq5eni6xd7qvryqzicmvjq rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_fbtefq5eni6xd7qvryqzicmvjq is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_o6kqw5t4qcgrhzr6x6mtnjhjwm (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_o6kqw5t4qcgrhzr6x6mtnjhjwm: remove its local data: injected failure at remove-local
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_o6kqw5t4qcgrhzr6x6mtnjhjwm rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_o6kqw5t4qcgrhzr6x6mtnjhjwm is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_ekowqz3gdyg4yxdkhj6xzt75om (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_ekowqz3gdyg4yxdkhj6xzt75om rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_ekowqz3gdyg4yxdkhj6xzt75om is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_7q3zstb3vxwthl7usbnix2pvdi (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_7q3zstb3vxwthl7usbnix2pvdi: remove its local data: injected failure at remove-local-done
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_7q3zstb3vxwthl7usbnix2pvdi rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_7q3zstb3vxwthl7usbnix2pvdi is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_btdurgcpxwprbpyvxl74p6o6jm (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_btdurgcpxwprbpyvxl74p6o6jm rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_btdurgcpxwprbpyvxl74p6o6jm is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_i3nfzczadcaykcjn2bsj5jocwi (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_i3nfzczadcaykcjn2bsj5jocwi: restore the original route: constraint failed: injected (1811)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_i3nfzczadcaykcjn2bsj5jocwi rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_i3nfzczadcaykcjn2bsj5jocwi is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_ltm2uad2lok4d2ogdktnxjhz3q (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_ltm2uad2lok4d2ogdktnxjhz3q: restore the original route: constraint failed: injected (1811)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_ltm2uad2lok4d2ogdktnxjhz3q rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_ltm2uad2lok4d2ogdktnxjhz3q is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_ohwql4wu4ryunorkk3om5mcxhy (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_ohwql4wu4ryunorkk3om5mcxhy is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_tubravbxwvse4wmqr3kfpsrh34 (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_tubravbxwvse4wmqr3kfpsrh34 rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_tubravbxwvse4wmqr3kfpsrh34: delete its snapshot: injected failure at delete-snapshot
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_tubravbxwvse4wmqr3kfpsrh34 is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_3wp2qm4q4nruvlo5b2bzhnng3m (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_3wp2qm4q4nruvlo5b2bzhnng3m rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_3wp2qm4q4nruvlo5b2bzhnng3m is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_3lz62opee3owysekqcgry65z2a (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_3lz62opee3owysekqcgry65z2a rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_3lz62opee3owysekqcgry65z2a: delete the host's replica: injected failure at delete-replica
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_3lz62opee3owysekqcgry65z2a is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_itk7egpni3unwwt4e7odnxvi74 (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_itk7egpni3unwwt4e7odnxvi74 rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_itk7egpni3unwwt4e7odnxvi74 is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_kv6i43ohzmbk7f5d3e36mcrqjy (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_kv6i43ohzmbk7f5d3e36mcrqjy rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_kv6i43ohzmbk7f5d3e36mcrqjy: retire its journal row: constraint failed: injected (1811)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_kv6i43ohzmbk7f5d3e36mcrqjy is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_5a52eadyvchzltwjcdpukp32au (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_5a52eadyvchzltwjcdpukp32au rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_5a52eadyvchzltwjcdpukp32au: retire its journal row: constraint failed: injected (1811)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_5a52eadyvchzltwjcdpukp32au is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_iqjpsela6o4ppj2lh4s6uhz5mi (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_iqjpsela6o4ppj2lh4s6uhz5mi rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_iqjpsela6o4ppj2lh4s6uhz5mi is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: mark import sd_iqjpsela6o4ppj2lh4s6uhz5mi rolled back: injected failure at cas
2026/10/25 10:46:10 provision: a.shop.example.com: aborted seed sd_iqjpsela6o4ppj2lh4s6uhz5mi rolled back (no box had swapped it)
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_tpkhea4bjnofx34rogblvz3ccu (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_tpkhea4bjnofx34rogblvz3ccu rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_tpkhea4bjnofx34rogblvz3ccu is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: aborted seed sd_tpkhea4bjnofx34rogblvz3ccu rolled back (no box had swapped it)
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_kzg4c2dcgmostslsikd5ajosiq (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_kzg4c2dcgmostslsikd5ajosiq rollback deferred: the host is not fenced and stopped yet (<nil>)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_kzg4c2dcgmostslsikd5ajosiq rollback deferred: the host is not fenced and stopped yet (<nil>)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_kzg4c2dcgmostslsikd5ajosiq rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_kzg4c2dcgmostslsikd5ajosiq is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_fmzj6bgkg3bgbuqiqp6teowgga (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_fmzj6bgkg3bgbuqiqp6teowgga rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_fmzj6bgkg3bgbuqiqp6teowgga is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_ih6y2ycctum2npjbei36en75ge (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_ih6y2ycctum2npjbei36en75ge rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_ih6y2ycctum2npjbei36en75ge is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_3x3lqpm4vketpjscwp4u5wny4m (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_3x3lqpm4vketpjscwp4u5wny4m rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_3x3lqpm4vketpjscwp4u5wny4m is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_e6cogqnir4bocagmhmczcc66gq (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_e6cogqnir4bocagmhmczcc66gq rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_e6cogqnir4bocagmhmczcc66gq is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_l3lf6fodctnpsrxecgqnzb2bgq (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_l3lf6fodctnpsrxecgqnzb2bgq rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_l3lf6fodctnpsrxecgqnzb2bgq is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: minted instance route a.shop.example.com (app "other" acct "bac")
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_tumtkcmuhnamcwqj66o67i423e (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_tumtkcmuhnamcwqj66o67i423e rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_tumtkcmuhnamcwqj66o67i423e is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: minted instance route a.shop.example.com (app "other" acct "bac")
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_yyyfsrhuq5ppkxepf3jkzbfode (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_yyyfsrhuq5ppkxepf3jkzbfode rolled back to its original route
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_yyyfsrhuq5ppkxepf3jkzbfode is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: minted instance route a.shop.example.com (app "other" acct "bac")
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_dmuze7bj5ztuxxzgwxygbyrkvu (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_dmuze7bj5ztuxxzgwxygbyrkvu has no route on this box: its local data is removed and no route is put back
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_dmuze7bj5ztuxxzgwxygbyrkvu is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_g2lp5tifxtjlquwgkrang4m6na (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_44aza3tl64kytpury2h5mq3dfq (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_xythtz26izw5xxpv67so3c5fhy (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_xythtz26izw5xxpv67so3c5fhy cannot roll back on this box: the activator is not wired; it stays journaled and gated
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_pymitqh6zis7fekkjg5byag53i (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_pymitqh6zis7fekkjg5byag53i is not rolled back: the route changed under the fence, so nothing there is touched
2026/10/25 10:46:10 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 10:46:10 provision: a.shop.example.com: import ../not-a-seed is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_lym2ht7mzsgxk7f45c5j7b3jvy (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_zn4s2pfrg2k5t5tiz4ao7b4fwy (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_pqci5tw4xspds7djevsptkjgzu (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_5emzlye5uesvesr63pleliggtq (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_w6jadtennafz6klglcrhpzpyzq (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_w6jadtennafz6klglcrhpzpyzq rollback deferred: the host is not fenced and stopped yet (stop evidence unreadable)
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_sjslx5ppl2q32mgaz3oyhhyd24 (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_sjslx5ppl2q32mgaz3oyhhyd24 has no route on this box: its local data is removed and no route is put back
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_sjslx5ppl2q32mgaz3oyhhyd24 is cleaned up and its journal row retired
2026/10/25 10:46:10 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_fxsws2qbo74p3pmnd3bsvd3lfi (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_fxsws2qbo74p3pmnd3bsvd3lfi: remove its local data: injected failure at remove-local
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_fxsws2qbo74p3pmnd3bsvd3lfi is not rolled back: the route at the host is not the import's, so nothing there is touched
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_hajqozfrqr6rf7u4rlq7ljgvbm (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_hajqozfrqr6rf7u4rlq7ljgvbm: a route appeared at the host, so its local database is left and the rollback waits
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_qtk4mqfbi7tu5omuf55ht3chqm (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_qtk4mqfbi7tu5omuf55ht3chqm rollback deferred: no fence generation: registry busy
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_cvr5k7uasugfcz3jo4ptbnc2ea (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: import sd_cvr5k7uasugfcz3jo4ptbnc2ea rollback deferred: no fence generation: the generation source answered 0
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_pqjfbwyyopexzjiecsrbzdsfmm (the original route is journaled)
2026/10/25 10:46:10 provision: a.shop.example.com: swapped for import sd_3bjtxurr3m5hatbwi4k2gq7jxa (the original route is journaled)
2026/10/25 10:46:11 provision: a.shop.example.com: swapped for import sd_5ejnig4e346vxamnqc2jv2ihpu (the original route is journaled)
2026/10/25 10:46:11 provision: a.shop.example.com: import deferred: the instance's env file could not be read: a symlink
2026/10/25 10:46:11 provision: a.shop.example.com: import deferred: this box cannot read the instance's env file
2026/10/25 10:46:11 provision: a.shop.example.com: swapped for import sd_bcr2hw2vltlvcaelyqljqncw2a (the original route is journaled)
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_bcr2hw2vltlvcaelyqljqncw2a rolled back to its original route
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_bcr2hw2vltlvcaelyqljqncw2a is cleaned up and its journal row retired
2026/10/25 10:46:11 provision: a.shop.example.com: swapped for import sd_gx7cjcwjrhtamv6en3e5zog3f4 (the original route is journaled)
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_gx7cjcwjrhtamv6en3e5zog3f4 rolled back to its original route
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_gx7cjcwjrhtamv6en3e5zog3f4 is cleaned up and its journal row retired
2026/10/25 10:46:11 provision: a.shop.example.com: swapped for import sd_lsrbjfhx72odhgf5wf7z6n2z2i (the original route is journaled)
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_lsrbjfhx72odhgf5wf7z6n2z2i rolled back to its original route
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_lsrbjfhx72odhgf5wf7z6n2z2i is cleaned up and its journal row retired
2026/10/25 10:46:11 provision: a.shop.example.com: swapped for import sd_35l7vvbrbngzujfr3g2b2f37lm (the original route is journaled)
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_35l7vvbrbngzujfr3g2b2f37lm: retire its instance key: the env file is a symlink
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_35l7vvbrbngzujfr3g2b2f37lm rolled back to its original route
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_35l7vvbrbngzujfr3g2b2f37lm is cleaned up and its journal row retired
2026/10/25 10:46:11 provision: a.shop.example.com: swapped for import sd_dgzbyvp3l3co2olqwwez762sp4 (the original route is journaled)
2026/10/25 10:46:11 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 10:46:11 provision: a.shop.example.com: swapped for import sd_btlloezibpig54zjqrmeab6r7m (the original route is journaled)
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_7ki3hu6j4btsg4ijtgghyiv7uu refused: there is no route at a.shop.example.com to replace
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_z2tnvwvoqiymysibkjspmdh54i refused: the route's address is 127.0.0.1:9, not 127.0.0.1:8401
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_pvubzi4kju6nbsastyiejdztdi 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 10:46:11 provision: a.shop.example.com: import sd_7a3wz3udmbyupamzbtyzldenxq refused: the route's address is 127.0.0.1:9, not 127.0.0.1:8401
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_5ymi2cxkxruffzu7bepggxxcyq refused: the route belongs to app other
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_4ekaajnq765kuiw5ynvmtkygey refused: the route is filed under another account
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_7yx6vpjvnxajnly3vs4cy5uka4 refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_aznuzx7tdrwadlv6o3wmslzrgq refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_rn25l2v6vgzydegrjvi2e75oee refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_p47pvz7tqyktiyqqvxzroit7ry refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_p4bgni4rlu3sp6hdezeqiy5ehi refused: the route is not an address route this import can take over (socket)
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_walnft6o4neaeohigyuy3i3gye refused: the route is not an address route this import can take over (no address)
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_uyjiictfmgmetjeevhie4x3ive refused: the route is not an address route this import can take over (provisioned)
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_kdf62oooiiqmtlelyghp755ixy refused: the route is not an address route this import can take over (kind static)
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_w5sjfz6d4osz3xhuszbv2egcoa refused: the route is not an address route this import can take over (backing)
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_e3obipep7wtk2jhgttil7smb4u refused: the route is not an address route this import can take over (tunnel)
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_qtyrqbdu57ss4f7kfipibeoqpi refused: the route is not an address route this import can take over (caps)
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_gobp6kbduc42rigzgfjnzymzii refused: the route is not an address route this import can take over (platform)
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_t57ka4fb4v2mabztn2j6etrdmy refused: the route is not an address route this import can take over (canary)
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_rmi3lr4qpzaca7maysggripkde refused: the route is not an address route this import can take over (kind sidecar)
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_grhdaibjypvgdmn36w6jp7i6kq refused: the route is not an address route this import can take over (region)
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_w22xnllkkpyiwinmdub64yfhgm refused: the route is not an address route this import can take over (fleet_box)
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_pdljsc4au7aa5h5ndwjqgfp65u refused: the route is not an address route this import can take over (hibernate)
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_ouajvhjqcht5b4kyykgh7zrtjy refused: the route is not an address route this import can take over (claim_owner)
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_6geukpnnvkdfs3qxhnyiz7e7kq refused: this box does not run instances nested
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_o56uyjuv357orxpj3gqgeh5j2m refused: this box does not run instances nested
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_qqtkofr64rxfnixdjfuujldts4 refused: claim control is on for this box
2026/10/25 10:46:11 provision: a.shop.example.com: swapped for import sd_h7wjxf5uofax4nt3mtsv26c2sa (the original route is journaled)
2026/10/25 10:46:11 provision: a.shop.example.com: swapped for import sd_4vn4uclxtlumaqtkpr43sdvnvy (the original route is journaled)
2026/10/25 10:46:11 provision: a.shop.example.com: import deferred: this box cannot read the legacy route assignments
2026/10/25 10:46:11 provision: a.shop.example.com: import deferred: the legacy route assignments could not be read: store down
2026/10/25 10:46:11 provision: a.shop.example.com: not swapping for import sd_ussx4opsijjz53axgw7qdxvtcu: its verify hash is not a sha256
2026/10/25 10:46:11 provision: a.shop.example.com: not swapping for import sd_eha3wpyxnkxrcgbqwkltgu3uf4: its verify hash is not a sha256
2026/10/25 10:46:11 provision: a.shop.example.com: not swapping for import sd_5fd2idhskhuiun33hoophnwooq: its verify hash is not a sha256
2026/10/25 10:46:11 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 10:46:11 provision: A.shop.example.com/..: not swapping for import sd_6fy2y2hap5eyovh4kk7kf74wga: its host or seed id is malformed (seeds: not a host)
2026/10/25 10:46:11 provision: a.shop.example.com: not swapping for import sd_hlmalfqyeti2grdiiypgsuy5om: its record does not describe a nested, hibernating instance
2026/10/25 10:46:11 provision: a.shop.example.com: not swapping for import sd_6unf6or7dzahyqi5jj2csxy7um: its record does not describe a nested, hibernating instance
2026/10/25 10:46:11 provision: a.shop.example.com: not swapping for import sd_kieehzsjexxlkl7acbk7zu7p3m: its record does not describe a nested, hibernating instance
2026/10/25 10:46:11 provision: a.shop.example.com: not swapping for import sd_cnrmvvp2mm456zp2jxbc4djicq: its record does not describe a nested, hibernating instance
2026/10/25 10:46:11 provision: a.shop.example.com: import deferred: the box's layout intent could not be read: store down
2026/10/25 10:46:11 provision: a.shop.example.com: swapped for import sd_okhhh6uypd6s7fwpgq3jigwmzy (the original route is journaled)
2026/10/25 10:46:11 provision: a.shop.example.com: import deferred: the box's nested probe did not answer: ready probe timed out
2026/10/25 10:46:11 provision: a.shop.example.com: swapped for import sd_baafqckwr4exajtyrky3i63il4 (the original route is journaled)
2026/10/25 10:46:11 provision: a.shop.example.com: swapped for import sd_yi2ruv3mxo3hujh6pgamx7byrq (the original route is journaled)
2026/10/25 10:46:11 provision: a.shop.example.com: import deferred: the route is held by operation op_1
2026/10/25 10:46:11 provision: dry-run: would consider swapping a.shop.example.com for import sd_ikqgkafoemantcdp5d67i6mfuu
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_5yceuu6cqjnjaejujawccwlgmi rolled back to its original route
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_5yceuu6cqjnjaejujawccwlgmi: the host's replica is left alone: the record apps/bac/shop/instances/a.shop.example.com.json holds the host
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_5yceuu6cqjnjaejujawccwlgmi is cleaned up and its journal row retired
2026/10/25 10:46:11 provision: a.shop.example.com: import sd_4nu7c27bayy7hshzfhokna6eoa left alone: the import journal holds seed sd_b4zsfi3c2chmssy3ycpi3rbchq at swapped
2026/10/25 10:46:11 provision: a.shop.example.com: not minting import sd_h6ueg4ukvabxp7tfqbqndx7xui: it is swapped but not committed, and only its swap makes its row
2026/10/25 10:46:11 provision: a.shop.example.com: not minting import sd_orm2kkruqrow4db5wowomvkaeq: it is placed but not committed, and only its swap makes its row
2026/10/25 10:46:11 provision: a.shop.example.com: swapped for import sd_jshg3rz25cetkbv34gbth2wcc4 (the original route is journaled)
2026/10/25 10:46:11 provision: a.shop.example.com: not minting import sd_jshg3rz25cetkbv34gbth2wcc4: it is swapped but not committed, and only its swap makes its row
2026/10/25 10:46:11 provision: a.shop.example.com: not minting import sd_jshg3rz25cetkbv34gbth2wcc4: it is placed but not committed, and only its swap makes its row
2026/10/25 10:46:11 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/25 10:46:11 provision: removed retired sidecar route gone.eleven.bac.sidecar.internal (record gone)
2026/10/25 10:46:12 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 10:46:12 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 10:46:12 provision: converged sidecar bot.eleven.bac.sidecar.internal args ["sidecar","run"] -> ["worker","run"]
2026/10/25 10:46:12 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 10:46:12 provision: converged sidecar bot.eleven.bac.sidecar.internal ceilings 300/3600 -> 60/120
2026/10/25 10:46:12 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 10:46:12 provision: converged sidecar bot.eleven.bac.sidecar.internal channel stable -> canary/eleven
2026/10/25 10:46:12 provision: converged sidecar bot.eleven.bac.sidecar.internal environment "other" -> "relay"
2026/10/25 10:46:12 provision: converged sidecar bot.eleven.bac.sidecar.internal hibernate true -> false
2026/10/25 10:46:12 provision: skipping sidecar record apps/bac/eleven/sidecars/bot.json: read failed: failStore: reads disabled under apps/bac/eleven/sidecars/
2026/10/25 10:46:12 provision: skipping sidecar record apps/bac/eleven/sidecars/bot.json: malformed: invalid character 'n' looking for beginning of object key string
2026/10/25 10:46:12 provision: not removing sidecar bot.eleven.bac.sidecar.internal: its record exists but could not be read cleanly this pass
2026/10/25 10:46:12 provision: skipping sidecar record apps/bac/eleven/sidecars/bot.json: empty channel
2026/10/25 10:46:12 provision: skipping sidecar record apps/bac/eleven/sidecars/held.json: empty channel
2026/10/25 10:46:12 provision: not removing sidecar held.eleven.bac.sidecar.internal: its record exists but could not be read cleanly this pass
2026/10/25 10:46:12 provision: removed retired sidecar route old.eleven.bac.sidecar.internal (record gone)
2026/10/25 10:46:12 provision: bac/eleven has sidecar records but no sidecars manifest — not minting
2026/10/25 10:46:12 provision: bac/eleven is in the trash — not minting sidecar routes for it
2026/10/25 10:46:12 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 10:46:12 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 10:46:12 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 10:46:12 provision: minted sidecar route hub.relay.bac.sidecar.internal (app "relay" acct "bac" args ["relay"])
2026/10/25 10:46:12 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 10:46:12 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 10:46:12 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 10:46:12 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 10:46:12 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 10:46:12 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 10:46:12 provision: removed retired sidecar route bot.eleven.bac.sidecar.internal (record gone)
2026/10/25 10:46:12 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 10:46:12 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 10:46:12 provision: skipping sidecar record apps/bac/relay/sidecars/hub.json: read failed: failStore: reads disabled under apps/bac/relay/sidecars/
2026/10/25 10:46:12 provision: REFUSING to mint sidecar bot.eleven.bac.sidecar.internal: bot.eleven.bac.sidecar.internal-sidecar.env is staged on this box — the legacy file co-spawn and a native sidecar row are two mechanisms for one host; remove the file to migrate this host onto sidecar records
2026/10/25 10:46:12 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/25 10:46:12 provision: dry-run: would mint sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" channel "stable" args ["sidecar","run"])
2026/10/25 10:46:12 provision: dry-run: would remove retired sidecar route gone.eleven.bac.sidecar.internal (record gone)
2026/10/25 10:46:12 provision: bot.eleven.bac.sidecar.internal exists but is not a sidecar row this pass owns (kind "sidecar" provisioned false app "eleven" acct "bac") — leaving it alone
2026/10/25 10:46:12 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:12 provision: converged acme.go.tito.io update settings "{\"updates\":\"manual\",\"channel\":\"stable\"}" -> ""
2026/10/25 10:46:12 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:12 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:12 provision: manifest bac/tito: read failed: provision: manifest bac/tito: unexpected end of JSON input
2026/10/25 10:46:12 provision: manifest bac/tito: read failed: provision: manifest bac/tito: unexpected end of JSON input
2026/10/25 10:46:12 provision: acme.go.tito.io: not minted this pass: the app's update policy could not be read
2026/10/25 10:46:12 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/25 10:46:12 provision: manifest bac/tito: read failed: provision: manifest bac/tito: unexpected end of JSON input
2026/10/25 10:46:12 provision: acme.go.tito.io: not minted this pass: the app's update policy could not be read
2026/10/25 10:46:12 provision: minted instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac")
2026/10/25 10:46:12 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 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: listing apps/bqd/: listdirs refused — its records are unseen this pass
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: listing apps/bqd/: listdirs refused — its records are unseen this pass
2026/10/25 10:46:12 provision: listing apps/bqd/: listdirs refused — its records are unseen this pass
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: listing apps/bqd/: listdirs refused — its records are unseen this pass
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: listing apps/bqd/: listdirs refused — its records are unseen this pass
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: record view: change index unusable (release: change index malformed: invalid character 'n' looking for beginning of object key string): walking
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: record view: re-reading apps/bqc/shop failed: retrying on the next refresh
2026/10/25 10:46:12 provision: listing apps/bqc/shop/instances/: context canceled — its records are unseen this pass
2026/10/25 10:46:12 provision: record view: change index unusable (get refused): walking
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: record view: re-reading apps/bqc/shop failed: retrying on the next refresh
2026/10/25 10:46:12 provision: listing apps/bqc/shop/instances/: list refused — its records are unseen this pass
2026/10/25 10:46:12 provision: listing apps/bqc/shop/instances/: list refused — its records are unseen this pass
2026/10/25 10:46:12 provision: an app's records could not be listed: they are skipped
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: skipping accounts/bqd/account.json: malformed account manifest: invalid character 'n' looking for beginning of object key string
2026/10/25 10:46:12 provision: skipping accounts/bqd/account.json: malformed account manifest: invalid character 'n' looking for beginning of object key string
2026/10/25 10:46:12 provision: skipping accounts/bqd/account.json: malformed account manifest: invalid character 'n' looking for beginning of object key string
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: record view: re-reading accounts/bqd failed: retrying on the next refresh
2026/10/25 10:46:12 provision: skipping accounts/bqd/account.json: read failed: list refused
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: minted instance route one.example.com (app "shop" acct "bum")
2026/10/25 10:46:12 provision: minted instance route one.example.com (app "shop" acct "bum")
2026/10/25 10:46:12 provision: skipping record apps/bum/shop/instances/one.example.com.json: empty channel
2026/10/25 10:46:12 provision: not removing one.example.com: its record exists but could not be read cleanly this pass
2026/10/25 10:46:12 provision: skipping record apps/bum/shop/instances/one.example.com.json: empty channel
2026/10/25 10:46:12 provision: minted instance route one.example.com (app "shop" acct "bum")
2026/10/25 10:46:12 provision: not removing one.example.com: its record exists but could not be read cleanly this pass
2026/10/25 10:46:12 provision: removed retired instance route one.example.com (record gone)
2026/10/25 10:46:12 provision: removed retired instance route one.example.com (record gone)
2026/10/25 10:46:12 provision: record view: change index unusable (context deadline exceeded): walking
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/25 10:46:12 provision: record view: change index unusable (context deadline exceeded): the walk records no generations
2026/10/25 10:46:12 provision: skipping record apps/bqe/store/instances/bad.store.example.com.json: malformed: provision: invalid maintenance projection or protected fields
--- FAIL: TestPlan14RootReadCensus (17.71s)
    plan14_root_reads_test.go:600: root read census: 1 discrepancies
        changed root source envelope internal/instancectl
        
        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	26.525s
ok  	github.com/carlosframework/platform/internal/publicrelease	0.008s
?   	github.com/carlosframework/platform/internal/regionname	[no test files]
ok  	github.com/carlosframework/platform/internal/registry	5.633s
ok  	github.com/carlosframework/platform/internal/relay	7.235s
ok  	github.com/carlosframework/platform/internal/release	27.808s
ok  	github.com/carlosframework/platform/internal/rollout	3.728s
ok  	github.com/carlosframework/platform/internal/rolloutwords	0.004s
ok  	github.com/carlosframework/platform/internal/rootaws	0.008s
ok  	github.com/carlosframework/platform/internal/rootfsimage	0.237s
ok  	github.com/carlosframework/platform/internal/rootparticipation	0.071s
ok  	github.com/carlosframework/platform/internal/rootstate	0.031s
ok  	github.com/carlosframework/platform/internal/runs	0.589s
ok  	github.com/carlosframework/platform/internal/s3compat	0.008s
ok  	github.com/carlosframework/platform/internal/safefile	0.006s
ok  	github.com/carlosframework/platform/internal/schedule	2.620s
ok  	github.com/carlosframework/platform/internal/seeds	0.012s
ok  	github.com/carlosframework/platform/internal/sim/engines	2.084s
ok  	github.com/carlosframework/platform/internal/sim/hostlife	11.031s
ok  	github.com/carlosframework/platform/internal/sim/litestreamfacts	3.466s
ok  	github.com/carlosframework/platform/internal/status	0.061s
ok  	github.com/carlosframework/platform/internal/steering	0.007s
ok  	github.com/carlosframework/platform/internal/stopevidence	0.109s
ok  	github.com/carlosframework/platform/internal/svcrole	0.002s
ok  	github.com/carlosframework/platform/internal/telemetry	0.005s
ok  	github.com/carlosframework/platform/internal/termfence	0.005s
ok  	github.com/carlosframework/platform/internal/tunnelclient	0.003s
ok  	github.com/carlosframework/platform/internal/unixdial	0.003s
ok  	github.com/carlosframework/platform/internal/updatewords	0.004s
ok  	github.com/carlosframework/platform/internal/usage	0.007s
ok  	github.com/carlosframework/platform/internal/version	0.002s
ok  	github.com/carlosframework/platform/internal/vet	1.601s
FAIL
=== internal_console@0 (71 s)
ok  	github.com/carlosframework/platform/internal/console	69.545s
=== internal_console@1 (48 s)
ok  	github.com/carlosframework/platform/internal/console	46.479s
=== internal_console@2 (43 s)
ok  	github.com/carlosframework/platform/internal/console	41.716s
=== internal_console@3 (45 s)
ok  	github.com/carlosframework/platform/internal/console	43.593s
=== internal_console@4 (45 s)
ok  	github.com/carlosframework/platform/internal/console	43.807s
=== internal_console@5 (45 s)
ok  	github.com/carlosframework/platform/internal/console	43.880s
=== internal_console@6 (48 s)
ok  	github.com/carlosframework/platform/internal/console	46.280s
=== internal_console@7 (54 s)
ok  	github.com/carlosframework/platform/internal/console	52.323s
=== internal_host@0 (65 s)
ok  	github.com/carlosframework/platform/internal/host	63.067s
=== internal_host@1 (32 s)
ok  	github.com/carlosframework/platform/internal/host	30.618s
=== internal_host@2 (31 s)
ok  	github.com/carlosframework/platform/internal/host	29.172s
=== internal_host@3 (32 s)
ok  	github.com/carlosframework/platform/internal/host	30.145s
=== root@0 (71 s)
ok  	github.com/carlosframework/platform	69.268s
=== root@1 (49 s)
ok  	github.com/carlosframework/platform	47.629s
=== root@2 (62 s)
ok  	github.com/carlosframework/platform	60.347s
=== root@3 (54 s)
ok  	github.com/carlosframework/platform	52.455s
=== root@4 (58 s)
ok  	github.com/carlosframework/platform	56.286s

Failure summary:
--- rest
--- FAIL: TestPlan14RootReadCensus (17.71s)
    plan14_root_reads_test.go:600: root read census: 1 discrepancies
FAIL	github.com/carlosframework/platform/internal/provision	26.525s

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/instancectl/names.go b/internal/instancectl/names.go
index 2dd8a4f1c..12cace848 100644
--- a/internal/instancectl/names.go
+++ b/internal/instancectl/names.go
@@ -13,6 +13,7 @@
package instancectl
import (
+ "errors"
"fmt"
"path/filepath"
"strconv"
@@ -20,9 +21,10 @@ import (
"time"
"github.com/carlosframework/platform/internal/provision"
+ "github.com/carlosframework/platform/internal/release"
)
-// Role is which of the four template units a request or a file is about.
+// Role is which template unit a request or a file is about.
type Role string
const (
@@ -32,12 +34,16 @@ const (
// RoleCmd is one `carlos run` command (run spec §5.4). "run" is the
// serving role already, so the command's role is cmd.
RoleCmd Role = "cmd"
+ // RoleWorker is one declared worker process of a rootfs release. It
+ // has a rootfs template only, never a binary unit (UnitName answers ""
+ // for it).
+ RoleWorker Role = "worker"
)
-// ParseRole accepts exactly the four literals.
+// ParseRole accepts exactly the five literals.
func ParseRole(s string) (Role, bool) {
switch Role(s) {
- case RoleRun, RoleSeed, RoleSidecar, RoleCmd:
+ case RoleRun, RoleSeed, RoleSidecar, RoleCmd, RoleWorker:
return Role(s), true
}
return "", false
@@ -77,6 +83,17 @@ const (
UnitPrefixCmd = "carlos-instance-cmd@"
)
+// The rootfs templates and the rootfs probe unit. A rootfs instance has
+// its own templates, never the binary ones: IsRootfsUnit tells them apart
+// by name alone.
+const (
+ UnitPrefixRootfs = "carlos-instance-rootfs@"
+ UnitPrefixRootfsGen = "carlos-instance-rootfs-gen@"
+ UnitPrefixRootfsWorker = "carlos-instance-rootfs-worker@"
+ UnitPrefixRootfsCmd = "carlos-instance-rootfs-cmd@"
+ RootfsProbeUnit = "carlos-instance-rootfs-probe.service"
+)
+
// CmdExeApp and CmdExeLive are the cmd template's executable mount
// sources under <ExeRoot>/<instance id>, apart from the app and live the
// other original templates bind (merge ruling M4). They are bound at the
@@ -86,6 +103,9 @@ const (
CmdExeLive = "cmd-live"
)
+// prefixFor is the binary template of a role. It stays binary-only: a
+// worker has no binary template, so it answers "" rather than falling to
+// the run prefix (preflight 1.1), which would name the host's run unit.
func prefixFor(role Role) string {
switch role {
case RoleSeed:
@@ -94,14 +114,22 @@ func prefixFor(role Role) string {
return UnitPrefixSidecar
case RoleCmd:
return UnitPrefixCmd
+ case RoleWorker:
+ return ""
}
return UnitPrefixRun
}
// UnitName is the template instance for a role and a host:
// carlos-instance[-seed|-sidecar|-cmd]@<Escape(InstanceID(host))>.service.
+// It is "" for RoleWorker, which has no binary unit; a caller handed ""
+// refuses.
func UnitName(role Role, host string) string {
- return prefixFor(role) + Escape(provision.InstanceID(host)) + ".service"
+ prefix := prefixFor(role)
+ if prefix == "" {
+ return ""
+ }
+ return prefix + Escape(provision.InstanceID(host)) + ".service"
}
// SliceName is the per-host slice every role of a host runs in (design
@@ -134,12 +162,18 @@ func ParseGenInstance(s string) (iid string, n uint64, ok bool) {
if err != nil || n == 0 || strconv.FormatUint(n, 10) != num {
return "", 0, false
}
- if strings.ContainsAny(iid, ":/\x00") || iid == "." || iid == ".." {
+ if !validInstanceIDPart(iid) {
return "", 0, false
}
return iid, n, true
}
+// validInstanceIDPart is the rule every "<iid><sep><suffix>" parser applies
+// to its iid: non-empty, no ':', '/' or NUL, and neither "." nor "..".
+func validInstanceIDPart(iid string) bool {
+ return iid != "" && !strings.ContainsAny(iid, ":/\x00") && iid != "." && iid != ".."
+}
+
// GenUnitName is carlos-instance-gen@<Escape(GenInstance(host, n))>.service.
func GenUnitName(host string, n uint64) string {
return GenUnitNameOf(provision.InstanceID(host), n)
@@ -191,6 +225,147 @@ func GenLogSocket(host string, n uint64) string {
return filepath.Join(provision.SocketDir, "logs", GenKey(host, n)+".run.sock")
}
+// RootfsUnitName is the rootfs template instance for RoleRun or RoleCmd:
+// carlos-instance-rootfs[-cmd]@<Escape(InstanceID(host))>.service. It is ""
+// for any other role: seed and sidecar have no rootfs template, and a
+// worker's unit is WorkerUnitName.
+func RootfsUnitName(role Role, host string) string {
+ var prefix string
+ switch role {
+ case RoleRun:
+ prefix = UnitPrefixRootfs
+ case RoleCmd:
+ prefix = UnitPrefixRootfsCmd
+ default:
+ return ""
+ }
+ return prefix + Escape(provision.InstanceID(host)) + ".service"
+}
+
+// RootfsGenUnitName is generation n of a rootfs host's run role:
+// carlos-instance-rootfs-gen@<Escape(GenInstance(host, n))>.service.
+func RootfsGenUnitName(host string, n uint64) string {
+ return RootfsGenUnitNameOf(provision.InstanceID(host), n)
+}
+
+// RootfsGenUnitNameOf is RootfsGenUnitName keyed by the instance ID.
+func RootfsGenUnitNameOf(iid string, n uint64) string {
+ return UnitPrefixRootfsGen + Escape(iid+":"+strconv.FormatUint(n, 10)) + ".service"
+}
+
+// ParseRootfsGenUnitName recognises a rootfs generation unit and returns
+// its ESCAPED instance ID and its generation, under ParseGenInstance's
+// rules.
+func ParseRootfsGenUnitName(unit string) (esc string, n uint64, ok bool) {
+ body, found := strings.CutSuffix(unit, ".service")
+ if !found {
+ return "", 0, false
+ }
+ inst, found := strings.CutPrefix(body, UnitPrefixRootfsGen)
+ if !found {
+ return "", 0, false
+ }
+ return ParseGenInstance(inst)
+}
+
+// WorkerInstance is the worker template's unescaped instance string,
+// "<iid>:<name>" (%I inside the unit). No instance ID holds ':'.
+func WorkerInstance(iid, name string) string { return iid + ":" + name }
+
+// ParseWorkerInstance splits "<iid>:<name>" at the last ':'. name is a
+// release.ValidWorkerName, which starts with a letter, so a generation's
+// "<iid>:<n>" is never a worker; iid follows ParseGenInstance's rules.
+func ParseWorkerInstance(s string) (iid, name string, ok bool) {
+ i := strings.LastIndexByte(s, ':')
+ if i < 0 {
+ return "", "", false
+ }
+ iid, name = s[:i], s[i+1:]
+ if !validInstanceIDPart(iid) || !release.ValidWorkerName(name) {
+ return "", "", false
+ }
+ return iid, name, true
+}
+
+// WorkerUnitName is a worker's unit:
+// carlos-instance-rootfs-worker@<Escape(WorkerInstance(iid, name))>.service.
+func WorkerUnitName(host, name string) string {
+ return WorkerUnitNameOf(provision.InstanceID(host), name)
+}
+
+// WorkerUnitNameOf is WorkerUnitName keyed by the instance ID.
+func WorkerUnitNameOf(iid, name string) string {
+ return UnitPrefixRootfsWorker + Escape(WorkerInstance(iid, name)) + ".service"
+}
+
+// ParseWorkerUnitName recognises a worker unit and returns its ESCAPED
+// instance ID and its (unescaped) worker name. Only the canonical escape
+// of a valid worker instance is accepted: a name WorkerUnitNameOf could
+// not have built is not ours.
+func ParseWorkerUnitName(unit string) (esc, name string, ok bool) {
+ body, found := strings.CutSuffix(unit, ".service")
+ if !found {
+ return "", "", false
+ }
+ inst, found := strings.CutPrefix(body, UnitPrefixRootfsWorker)
+ if !found {
+ return "", "", false
+ }
+ raw, valid := Unescape(inst)
+ if !valid {
+ return "", "", false
+ }
+ iid, name, ok := ParseWorkerInstance(raw)
+ if !ok || Escape(WorkerInstance(iid, name)) != inst {
+ return "", "", false
+ }
+ return Escape(iid), name, true
+}
+
+// WorkerKeyOf and WorkerKey key a worker's files, its executable mount
+// directory and its log socket: "<iid>@<name>", for GenKey's reason (':'
+// is BindPaths='s field separator). A generation key's suffix is digits
+// and a worker name starts with a letter, so the two never meet, and a
+// host's own directory has no '@'.
+func WorkerKeyOf(iid, name string) string { return iid + "@" + name }
+
+func WorkerKey(host, name string) string { return WorkerKeyOf(provision.InstanceID(host), name) }
+
+// ParseWorkerKey is WorkerKeyOf's inverse: split at the last '@', no
+// second '@' in iid, then ParseWorkerInstance's rules.
+func ParseWorkerKey(key string) (iid, name string, ok bool) {
+ i := strings.LastIndexByte(key, '@')
+ if i < 0 || strings.ContainsRune(key[:i], '@') {
+ return "", "", false
+ }
+ iid, name = key[:i], key[i+1:]
+ if !validInstanceIDPart(iid) || !release.ValidWorkerName(name) {
+ return "", "", false
+ }
+ return iid, name, true
+}
+
+// WorkerLogSocket is a worker's log socket:
+// /run/carlos/logs/<WorkerKey>.worker.sock.
+func WorkerLogSocket(host, name string) string {
+ return filepath.Join(provision.SocketDir, "logs", WorkerKey(host, name)+".worker.sock")
+}
+
+// IsRootfsUnit reports whether unit is an instance of any rootfs
+// template. The probe unit and the templates themselves are not.
+func IsRootfsUnit(unit string) bool {
+ body, found := strings.CutSuffix(unit, ".service")
+ if !found {
+ return false
+ }
+ for _, prefix := range []string{UnitPrefixRootfs, UnitPrefixRootfsGen, UnitPrefixRootfsWorker, UnitPrefixRootfsCmd} {
+ if inst, found := strings.CutPrefix(body, prefix); found && inst != "" {
+ return true
+ }
+ }
+ return false
+}
+
// Unescape is Escape's inverse for the names this platform produces:
// "\xHH" becomes the byte and "-" becomes "/". It reports false on a
// malformed escape.
@@ -217,9 +392,10 @@ func Unescape(s string) (string, bool) {
return b.String(), true
}
-// ParseUnitName recognises the four templates' instances and returns the
-// role and the ESCAPED identifier (systemd reports names escaped). Anything
-// else, including a template with no instance, is not ours.
+// ParseUnitName recognises the instances of the binary and rootfs
+// templates and returns the role and the ESCAPED identifier (systemd
+// reports names escaped). Anything else, including a template with no
+// instance, is not ours.
func ParseUnitName(unit string) (Role, string, bool) {
if !strings.HasSuffix(unit, ".service") {
return "", "", false
@@ -228,11 +404,24 @@ func ParseUnitName(unit string) (Role, string, bool) {
// A generation unit runs in its host's slice, as the run role.
return RoleRun, esc, true
}
+ if esc, _, ok := ParseRootfsGenUnitName(unit); ok {
+ return RoleRun, esc, true
+ }
+ if esc, _, ok := ParseWorkerUnitName(unit); ok {
+ return RoleWorker, esc, true
+ }
body := strings.TrimSuffix(unit, ".service")
+ // The longer prefixes first. carlos-instance-rootfs@ is not a prefix of
+ // carlos-instance@, but the order stays explicit so no future prefix
+ // can be shadowed by a shorter one.
for _, p := range []struct {
prefix string
role Role
- }{{UnitPrefixSeed, RoleSeed}, {UnitPrefixSidecar, RoleSidecar}, {UnitPrefixCmd, RoleCmd}, {UnitPrefixRun, RoleRun}} {
+ }{
+ {UnitPrefixSeed, RoleSeed}, {UnitPrefixSidecar, RoleSidecar}, {UnitPrefixCmd, RoleCmd},
+ {UnitPrefixRootfsCmd, RoleCmd}, {UnitPrefixRootfs, RoleRun},
+ {UnitPrefixRun, RoleRun},
+ } {
if strings.HasPrefix(body, p.prefix) {
esc := strings.TrimPrefix(body, p.prefix)
if esc == "" {
@@ -244,9 +433,14 @@ func ParseUnitName(unit string) (Role, string, bool) {
return "", "", false
}
-// LaunchSchema is the only launch-file schema this release understands.
+// LaunchSchema is the launch-file schema of a binary launch.
const LaunchSchema = 1
+// LaunchSchemaRootfs is the tenant-side launch file of a rootfs launch:
+// env only, no argv. What runs is root's to say (RootfsLaunch), never the
+// instance directory's.
+const LaunchSchemaRootfs = 2
+
// Launch is what the agent writes into the instance directory before a
// start and what the trampoline execs (design §6.2). Env is the complete
// environment, one entry per key, exactly as the agent composed it; the
@@ -254,10 +448,69 @@ const LaunchSchema = 1
type Launch struct {
Schema int `json:"schema"`
Host string `json:"host"`
- Argv []string `json:"argv"`
+ Argv []string `json:"argv"` // empty under LaunchSchemaRootfs
Env []string `json:"env"`
+ // Runtime is registry.RuntimeRootfsV1 under LaunchSchemaRootfs.
+ Runtime string `json:"runtime,omitempty"`
+ // Process is the manifest process this launch is.
+ Process string `json:"process,omitempty"`
}
+// RootfsLaunchSchema is the only RootfsLaunch schema this release
+// understands.
+const RootfsLaunchSchema = 1
+
+// RootfsLaunchPath is where a rootfs unit sees its RootfsLaunch, bound
+// read-only from the control service's exe root.
+const RootfsLaunchPath = "/opt/carlos/launch.json"
+
+// RootfsLaunch is the root-resolved half of a rootfs launch (C4): the
+// control service writes it under its exe root from the staged manifest,
+// so the instance can read what it runs and never choose it.
+type RootfsLaunch struct {
+ Schema int `json:"schema"`
+ Host string `json:"host"`
+ Process string `json:"process"`
+ Argv []string `json:"argv"`
+ Env map[string]string `json:"env,omitempty"`
+ WorkingDir string `json:"working_dir,omitempty"`
+ Version string `json:"version"`
+ Digest string `json:"digest"`
+ // JIT is the manifest's jit (R11): root's record of why the unit
+ // lacks MemoryDenyWriteExecute.
+ JIT bool `json:"jit,omitempty"`
+}
+
+// StagedImage is what the agent names on a rootfs start: the staged image
+// and the process to run from its manifest, or an operator argv for a cmd.
+type StagedImage struct {
+ Path, Version, Digest string
+ Process string
+ Argv []string
+}
+
+// ErrStagedImage is root refusing to start a staged image it cannot vouch
+// for. Nothing is mounted.
+var ErrStagedImage = errors.New("instancectl: staged image refused")
+
+// The exe layout of one rootfs start:
+// <ExeRoot>/<key>/rootfs/<role>/{image, launch.json, resolv.conf}.
+const (
+ RootfsExeDirName = "rootfs"
+ RootfsExeImage = "image"
+ RootfsExeLaunch = "launch.json"
+ RootfsExeResolv = "resolv.conf"
+)
+
+// RootfsExeDir is <root>/<key>/rootfs/<role>, where key is a host's
+// instance ID, a GenKey or a WorkerKey.
+func RootfsExeDir(root, key string, role Role) string {
+ return filepath.Join(root, key, RootfsExeDirName, string(role))
+}
+
+// RootfsReadyPath is the control service's rootfs readiness verb.
+const RootfsReadyPath = "/ready/rootfs"
+
// LaunchFileName is "launch.<role>.json" inside the instance directory.
func LaunchFileName(role Role) string { return "launch." + string(role) + ".json" }
@@ -265,6 +518,10 @@ func LaunchFileName(role Role) string { return "launch." + string(role) + ".json
// directory: "launch.gen.<n>.json".
func GenLaunchFileName(n uint64) string { return "launch.gen." + strconv.FormatUint(n, 10) + ".json" }
+// WorkerLaunchFileName is a worker's launch file in the instance
+// directory: "launch.worker.<name>.json".
+func WorkerLaunchFileName(name string) string { return "launch.worker." + name + ".json" }
+
// ExitRecord is the advisory record the unit's ExecStopPost leaves in the
// instance's run directory (design §6.5). It decides the wording of the
// member-facing event line and nothing else.
@@ -290,6 +547,15 @@ func GenExitRecordName(n uint64, invocation string) string {
// GenExitPrefix is every exit record of generation n.
func GenExitPrefix(n uint64) string { return "exit.gen." + strconv.FormatUint(n, 10) + "." }
+// WorkerExitRecordName is a worker's exit record:
+// "exit.worker.<name>.<inv>.json". It is never under "exit.run.".
+func WorkerExitRecordName(name, invocation string) string {
+ return WorkerExitPrefix(name) + invocation + ".json"
+}
+
+// WorkerExitPrefix is every exit record of the named worker.
+func WorkerExitPrefix(name string) string { return "exit.worker." + name + "." }
+
// ProbeDirName is the instance directory the readiness probe runs in. It
// starts with an underscore, which no valid host does, so it can never
// collide with a real instance's directory.
diff --git a/internal/instancectl/names_test.go b/internal/instancectl/names_test.go
index 50b33f0f8..58cde1f36 100644
--- a/internal/instancectl/names_test.go
+++ b/internal/instancectl/names_test.go
@@ -95,3 +95,162 @@ func TestFileNames(t *testing.T) {
t.Errorf("ProbeDirName %q is a valid host; it must never collide with one", ProbeDirName)
}
}
+
+func TestWorkerInstanceRoundTripsAndNeverParsesAsAGeneration(t *testing.T) {
+ iid := provision.InstanceID("shop.example.com")
+ s := WorkerInstance(iid, "jobs")
+ if s != "shop.example.com:jobs" {
+ t.Fatalf("WorkerInstance = %q", s)
+ }
+ gotIID, name, ok := ParseWorkerInstance(s)
+ if !ok || gotIID != iid || name != "jobs" {
+ t.Fatalf("ParseWorkerInstance(%q) = %q %q %v", s, gotIID, name, ok)
+ }
+ // Review Focus 4: the two domains never meet. A worker name starts with
+ // a letter (release.ValidWorkerName); a generation is canonical digits.
+ if _, _, ok := ParseGenInstance(s); ok {
+ t.Errorf("%q parses as a generation", s)
+ }
+ if _, _, ok := ParseWorkerInstance(GenInstance("shop.example.com", 7)); ok {
+ t.Errorf("a generation parses as a worker")
+ }
+ for _, bad := range []string{"shop.example.com:", ":jobs", "shop.example.com:7", "shop.example.com:Jobs", "shop.example.com:a/b", "shop.example.com:" + strings.Repeat("a", 17), "..:jobs"} {
+ if _, _, ok := ParseWorkerInstance(bad); ok {
+ t.Errorf("ParseWorkerInstance(%q) accepted", bad)
+ }
+ }
+}
+
+func TestWorkerKeyIsNeverAGenerationKeyOrAHostDirectory(t *testing.T) {
+ key := WorkerKey("shop.example.com", "jobs")
+ if key != "shop.example.com@jobs" {
+ t.Fatalf("WorkerKey = %q", key)
+ }
+ if _, _, ok := ParseGenKey(key); ok {
+ t.Errorf("%q parses as a generation key", key)
+ }
+ if _, _, ok := ParseWorkerKey(GenKey("shop.example.com", 3)); ok {
+ t.Errorf("a generation key parses as a worker key")
+ }
+ if _, _, ok := ParseWorkerKey("shop.example.com"); ok {
+ t.Errorf("a host's own exe directory parses as a worker key")
+ }
+ iid, name, ok := ParseWorkerKey(key)
+ if !ok || iid != "shop.example.com" || name != "jobs" {
+ t.Errorf("ParseWorkerKey = %q %q %v", iid, name, ok)
+ }
+}
+
+func TestRootfsUnitNamesAndParse(t *testing.T) {
+ host := "shop.example.com"
+ esc := Escape(provision.InstanceID(host))
+ cases := map[string]struct {
+ role Role
+ esc string
+ }{
+ RootfsUnitName(RoleRun, host): {RoleRun, esc},
+ RootfsUnitName(RoleCmd, host): {RoleCmd, esc},
+ RootfsGenUnitName(host, 4): {RoleRun, esc},
+ WorkerUnitName(host, "jobs"): {RoleWorker, esc},
+ }
+ for unit, want := range cases {
+ role, got, ok := ParseUnitName(unit)
+ if !ok || role != want.role || got != want.esc {
+ t.Errorf("ParseUnitName(%q) = %s %q %v, want %s %q", unit, role, got, ok, want.role, want.esc)
+ }
+ if !IsRootfsUnit(unit) {
+ t.Errorf("IsRootfsUnit(%q) = false", unit)
+ }
+ }
+ if RootfsUnitName(RoleRun, host) != "carlos-instance-rootfs@shop.example.com.service" {
+ t.Errorf("rootfs run unit = %q", RootfsUnitName(RoleRun, host))
+ }
+ if WorkerUnitName(host, "jobs") != `carlos-instance-rootfs-worker@shop.example.com:jobs.service` {
+ t.Errorf("worker unit = %q", WorkerUnitName(host, "jobs"))
+ }
+ if RootfsUnitName(RoleSeed, host) != "" || RootfsUnitName(RoleSidecar, host) != "" {
+ t.Error("seed and sidecar have no rootfs template")
+ }
+ if IsRootfsUnit(UnitName(RoleRun, host)) || IsRootfsUnit(GenUnitName(host, 1)) {
+ t.Error("a binary unit reports as rootfs")
+ }
+ e, name, ok := ParseWorkerUnitName(WorkerUnitName(host, "jobs"))
+ if !ok || e != esc || name != "jobs" {
+ t.Errorf("ParseWorkerUnitName = %q %q %v", e, name, ok)
+ }
+ e, n, ok := ParseRootfsGenUnitName(RootfsGenUnitName(host, 4))
+ if !ok || e != esc || n != 4 {
+ t.Errorf("ParseRootfsGenUnitName = %q %d %v", e, n, ok)
+ }
+}
+
+func TestWorkerFileNamesFitAndAreKeyed(t *testing.T) {
+ long := strings.Repeat("a", 60) + ".example.com"
+ name := strings.Repeat("w", 16)
+ if p := WorkerLogSocket(long, name); len(p) > provision.MaxUnixPath {
+ t.Errorf("worker log socket %q is %d bytes", p, len(p))
+ }
+ if got := WorkerLogSocket("shop.example.com", "jobs"); got != "/run/carlos/logs/shop.example.com@jobs.worker.sock" {
+ t.Errorf("WorkerLogSocket = %q", got)
+ }
+ if got := WorkerLaunchFileName("jobs"); got != "launch.worker.jobs.json" {
+ t.Errorf("WorkerLaunchFileName = %q", got)
+ }
+ inv := strings.Repeat("ab", 16)
+ if got := WorkerExitRecordName("jobs", inv); got != "exit.worker.jobs."+inv+".json" || !strings.HasPrefix(got, WorkerExitPrefix("jobs")) {
+ t.Errorf("WorkerExitRecordName = %q", got)
+ }
+ // A worker's record is never under the run role's sweep prefix.
+ if strings.HasPrefix(WorkerExitRecordName("jobs", inv), "exit.run.") {
+ t.Error("worker exit record collides with the run role's")
+ }
+}
+
+func TestRootfsExeDirAndRoles(t *testing.T) {
+ if got := RootfsExeDir("/run/carlos-control/exe", "shop.example.com", RoleRun); got != "/run/carlos-control/exe/shop.example.com/rootfs/run" {
+ t.Errorf("RootfsExeDir = %q", got)
+ }
+ if r, ok := ParseRole("worker"); !ok || r != RoleWorker {
+ t.Error("ParseRole does not accept worker")
+ }
+}
+
+// Preflight 1.1: a worker has no binary unit. Before this, prefixFor's
+// default arm made UnitName(RoleWorker, h) the host's binary RUN unit, so a
+// stop or reset naming role=worker would have ended the run unit.
+func TestAWorkerHasNoBinaryUnitName(t *testing.T) {
+ if got := UnitName(RoleWorker, "shop.example.com"); got != "" {
+ t.Fatalf("UnitName(RoleWorker) = %q, want \"\"", got)
+ }
+ if UnitName(RoleRun, "shop.example.com") != "carlos-instance@shop.example.com.service" {
+ t.Error("the run unit's name moved")
+ }
+}
+
+// Hosts and worker names both hold '-', which Escape turns into \x2d. The
+// worker unit parses back only from the escape WorkerUnitNameOf builds.
+func TestWorkerUnitNameEscapesHyphensAndRefusesOtherSpellings(t *testing.T) {
+ host := "bill-2.example.com"
+ unit := WorkerUnitName(host, "bg-jobs")
+ if unit != `carlos-instance-rootfs-worker@bill\x2d2.example.com:bg\x2djobs.service` {
+ t.Fatalf("WorkerUnitName = %q", unit)
+ }
+ esc, name, ok := ParseWorkerUnitName(unit)
+ if !ok || esc != Escape(host) || name != "bg-jobs" {
+ t.Errorf("ParseWorkerUnitName(%q) = %q %q %v", unit, esc, name, ok)
+ }
+ for _, bad := range []string{
+ `carlos-instance-rootfs-worker@bill\x2d2.example.com:bg\x2Djobs.service`, // upper-case hex
+ `carlos-instance-rootfs-worker@bill\x2d2.example.com:b\x67\x2djobs.service`, // an escaped letter
+ `carlos-instance-rootfs-worker@bill-2.example.com:jobs.service`, // '-' is '/'
+ `carlos-instance-rootfs-worker@shop.example.com:4.service`, // a generation
+ `carlos-instance-rootfs-worker@.service`,
+ } {
+ if _, _, ok := ParseWorkerUnitName(bad); ok {
+ t.Errorf("ParseWorkerUnitName(%q) accepted", bad)
+ }
+ if role, _, ok := ParseUnitName(bad); ok {
+ t.Errorf("ParseUnitName(%q) = %s, want not ours", bad, role)
+ }
+ }
+}