adopt: an agent that is not root hands named-unit routes to root's pass (#315)
The agent (carlos-edge.service, User=carlos) cannot restart a unit a route
names; systemd answers "Interactive authentication required". On Tito's
console roll it repointed the live link, failed the restart, read that as a
broken build, rolled back, poisoned the version and tried to start the old
build over a process that never stopped ("this host may be serving
nothing"). Root's pass fixed it a second later only by luck of timing.
release.RootRestartsUnits makes a pass hand any route with a Unit to root
before it stages or repoints: OnStageBlocked with ErrUnitRestartNeedsRoot,
the relay already used for builds it cannot stage. Holds, refusals and the
proof gate still run first, so root is only asked for a build this pass
would have installed. Nothing is poisoned or refused. The agent's hourly and
fast loops pass it when euid != 0; an agent run as root is unchanged, and
host-writes mode is untouched.
Human
Prompt
Can we take 315 and 316
From this commit's own message. The prompt ledger has no entries for it — which is what a squashed, rebased or amended commit looks like, and what every commit looks like in a repo without a ledger.
Summary
Named-unit routes go to the root pass from a non-root agent instead of a false failed-restart rollback.
Agent notes
Mutation-checked both tests (release hand-off and the fast loop's production options). TestPlan14GenerationPinsPrivateMount fails locally on unmodified main too (private mount permission), unrelated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4 files changed,
+277
−6
internal/host/agent.go+30 −6internal/host/rootunits_test.go+88 −0internal/release/adopt.go+45 −0internal/release/rootunits_test.go+114 −0
CI failed — run details
CI log
=== gate ===
cd launchctx && go vet ./... && go test ./... -count=1
ok amadan.net/carlos/platform.git/launchctx 0.011s
? amadan.net/carlos/platform.git/launchctx/controlname [no test files]
? amadan.net/carlos/platform.git/launchctx/wireid [no test files]
go vet ./...
gofmt -l .: clean
go test ./... -count=1 -timeout 30m
ok github.com/carlosframework/platform 322.387s
? github.com/carlosframework/platform/cmd/changelog [no test files]
ok github.com/carlosframework/platform/cmd/console 2.922s
ok github.com/carlosframework/platform/cmd/moveprobe 93.245s
ok github.com/carlosframework/platform/cmd/zddprobe 0.710s
ok github.com/carlosframework/platform/internal/activator 249.909s
ok github.com/carlosframework/platform/internal/agentsock 0.022s
ok github.com/carlosframework/platform/internal/alerting 0.004s
ok github.com/carlosframework/platform/internal/analytics 0.019s
ok github.com/carlosframework/platform/internal/appconfig 2.486s
ok github.com/carlosframework/platform/internal/apperr 0.081s
ok github.com/carlosframework/platform/internal/applog 0.158s
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.731s
? github.com/carlosframework/platform/internal/boxid/boxidtest [no test files]
? github.com/carlosframework/platform/internal/boxid/internal/signtest [no test files]
ok github.com/carlosframework/platform/internal/boxvolumes 0.009s
ok github.com/carlosframework/platform/internal/caps 0.014s
ok github.com/carlosframework/platform/internal/certwarm 0.004s
ok github.com/carlosframework/platform/internal/cgroup 0.691s
ok github.com/carlosframework/platform/internal/changelog 0.319s
ok github.com/carlosframework/platform/internal/claimactivation 0.805s
ok github.com/carlosframework/platform/internal/clamd 0.055s
? github.com/carlosframework/platform/internal/cliflag [no test files]
ok github.com/carlosframework/platform/internal/console 414.162s
? 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 6.260s
ok github.com/carlosframework/platform/internal/dbdoor/dbdoortest 0.009s
ok github.com/carlosframework/platform/internal/dbverify 0.004s
ok github.com/carlosframework/platform/internal/dnsrec 0.003s
ok github.com/carlosframework/platform/internal/docsite 0.005s
ok github.com/carlosframework/platform/internal/domains 2.474s
ok github.com/carlosframework/platform/internal/doorkey 0.006s
ok github.com/carlosframework/platform/internal/economics 0.004s
ok github.com/carlosframework/platform/internal/edge 46.058s
? github.com/carlosframework/platform/internal/edgeproof [no test files]
ok github.com/carlosframework/platform/internal/edgesfile 0.008s
ok github.com/carlosframework/platform/internal/fleetapi 0.131s
ok github.com/carlosframework/platform/internal/gate 1.658s
ok github.com/carlosframework/platform/internal/genselect 0.015s
ok github.com/carlosframework/platform/internal/geo 0.015s
ok github.com/carlosframework/platform/internal/geoip 0.035s
ok github.com/carlosframework/platform/internal/historyreadback 0.151s
ok github.com/carlosframework/platform/internal/host 192.847s
ok github.com/carlosframework/platform/internal/hostactors 5.820s
ok github.com/carlosframework/platform/internal/hostactors/awsmembership 0.009s
ok github.com/carlosframework/platform/internal/hostbox 3.226s
ok github.com/carlosframework/platform/internal/hostclaim 0.984s
ok github.com/carlosframework/platform/internal/hostenv 0.005s
ok github.com/carlosframework/platform/internal/hostevidence 0.009s
ok github.com/carlosframework/platform/internal/hostexec 5.812s
ok github.com/carlosframework/platform/internal/hostfence 0.072s
ok github.com/carlosframework/platform/internal/hostfiles 10.123s
ok github.com/carlosframework/platform/internal/hostfloor 0.023s
ok github.com/carlosframework/platform/internal/hostguard 1.090s
ok github.com/carlosframework/platform/internal/hostops 2.186s
? github.com/carlosframework/platform/internal/hostops/fencerelease [no test files]
ok github.com/carlosframework/platform/internal/hostops/internal/fencerelease 0.004s
ok github.com/carlosframework/platform/internal/hostquarantine 0.003s
ok github.com/carlosframework/platform/internal/hostrelocate 0.662s
ok github.com/carlosframework/platform/internal/hostresolve 0.225s
ok github.com/carlosframework/platform/internal/hostwrite 0.007s
ok github.com/carlosframework/platform/internal/infraview 0.006s
ok github.com/carlosframework/platform/internal/instancectl 5.290s
ok github.com/carlosframework/platform/internal/instanceexec 2.887s
ok github.com/carlosframework/platform/internal/instancefs 0.016s
ok github.com/carlosframework/platform/internal/instancekey 0.007s
ok github.com/carlosframework/platform/internal/instanceupdates 0.018s
ok github.com/carlosframework/platform/internal/layout 1.979s
ok github.com/carlosframework/platform/internal/lbhealth 0.007s
ok github.com/carlosframework/platform/internal/lease 9.930s
ok github.com/carlosframework/platform/internal/lease/leasetest 0.009s
ok github.com/carlosframework/platform/internal/ledger 0.044s
ok github.com/carlosframework/platform/internal/mail 0.337s
ok github.com/carlosframework/platform/internal/maintenance 0.096s
ok github.com/carlosframework/platform/internal/maintenanceexec 5.661s
ok github.com/carlosframework/platform/internal/maintenanceguard 0.133s
ok github.com/carlosframework/platform/internal/metrics 0.012s
ok github.com/carlosframework/platform/internal/moves 21.989s
ok github.com/carlosframework/platform/internal/moves/archive 1.261s
ok github.com/carlosframework/platform/internal/objstore 0.333s
ok github.com/carlosframework/platform/internal/ops 0.274s
ok github.com/carlosframework/platform/internal/park 0.285s
ok github.com/carlosframework/platform/internal/privatefile 0.014s
2026/10/19 23:27:03 provision: listing apps/bab/blog/instances/: list refused — its records are unseen this pass
2026/10/19 23:27:03 provision: listing apps/bab/: listdirs refused — its records are unseen this pass
2026/10/19 23:27:03 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:03 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:03 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:03 provision: listing apps/bac/tito/instances/: list refused — its records are unseen this pass
2026/10/19 23:27:03 provision: listing apps/bac/tito/instances/: list refused — its records are unseen this pass
2026/10/19 23:27:03 provision: skipping record apps/bac/tito/instances/one.example.com.json: unreadable: read refused
2026/10/19 23:27:03 provision: listing apps/bac/tito/instances/: list refused — its records are unseen this pass
2026/10/19 23:27:03 provision: an app's records could not be listed: they are skipped
2026/10/19 23:27:03 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/19 23:27:03 provision: remove retired instance route shop.example: provision: claim admission unavailable
2026/10/19 23:27:03 provision: remove retired instance route shop.example: provision: claim admission unavailable
2026/10/19 23:27:03 provision: remove retired sidecar route worker.sidecar.internal: provision: claim admission unavailable
2026/10/19 23:27:03 provision: remove retired sidecar route worker.sidecar.internal: provision: claim admission unavailable
2026/10/19 23:27:03 provision: claim install acme.go.tito.io: provision: claim admission unavailable
2026/10/19 23:27:03 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:03 provision: claim install acme.go.tito.io: registry: claim row ownership changed or unknown
2026/10/19 23:27:03 provision: claim install bot.eleven.bac.sidecar.internal: provision: claim admission unavailable
2026/10/19 23:27:03 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/19 23:27:03 provision: claim install bot.eleven.bac.sidecar.internal: registry: claim row ownership changed or unknown
2026/10/19 23:27: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/19 23:27:03 provision: acme.go.tito.io: not minting this pass: the box's layout intent could not be read: no sealed config
2026/10/19 23:27:04 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 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/19 23:27:04 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/19 23:27:04 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/19 23:27:04 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/19 23:27:04 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 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/19 23:27:04 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/19 23:27:04 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/19 23:27:04 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: claim install acme.go.tito.io: registry: claim row ownership changed or unknown
2026/10/19 23:27:04 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: claim install acme.go.tito.io: registry: claim row ownership changed or unknown
2026/10/19 23:27: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/19 23:27:04 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["run"])
2026/10/19 23:27:04 provision: claim install bot.eleven.bac.sidecar.internal: registry: claim row ownership changed or unknown
2026/10/19 23:27:04 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/19 23:27:04 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/19 23:27: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/19 23:27:04 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/19 23:27:04 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/19 23:27:04 provision: skipping record apps/bac/tito/instances/new.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/19 23:27:04 provision: not removing acme.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/19 23:27:04 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/19 23:27:04 provision: skipping record apps/bac/tito/instances/new.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/19 23:27:04 provision: minted instance route rk.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route rc.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route rd.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route rh.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route ri.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route rl.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route ra.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route rb.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route re.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route rf.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route rg.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route rj.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route rb.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route rc.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route rd.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route ra.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: skipping record apps/bac/tito/instances/rb.go.tito.io.json: read failed: read refused
2026/10/19 23:27:04 provision: skipping record apps/bac/tito/instances/rb.go.tito.io.json: read failed: read refused
2026/10/19 23:27:04 provision: minted instance route re.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route x.appe.example (app "appe" acct "bac")
2026/10/19 23:27:04 provision: minted instance route x.appi.example (app "appi" acct "bac")
2026/10/19 23:27:04 provision: minted instance route x.appb.example (app "appb" acct "bac")
2026/10/19 23:27:04 provision: minted instance route x.appc.example (app "appc" acct "bac")
2026/10/19 23:27:04 provision: minted instance route x.appd.example (app "appd" acct "bac")
2026/10/19 23:27:04 provision: minted instance route x.appf.example (app "appf" acct "bac")
2026/10/19 23:27:04 provision: minted instance route x.appg.example (app "appg" acct "bac")
2026/10/19 23:27:04 provision: minted instance route x.apph.example (app "apph" acct "bac")
2026/10/19 23:27:04 provision: minted instance route x.appj.example (app "appj" acct "bac")
2026/10/19 23:27:04 provision: minted instance route x.appa.example (app "appa" acct "bac")
2026/10/19 23:27:04 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/19 23:27:04 provision: minted instance route r0089.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0095.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0122.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0001.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0021.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0068.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0117.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0129.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0059.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0071.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0075.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0082.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0126.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0000.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0074.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0081.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0066.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0076.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0024.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0056.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0099.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0109.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0128.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0050.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0007.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0018.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0064.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0079.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0105.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0118.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0124.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0009.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0062.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0090.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0110.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0049.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0002.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0005.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0011.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0045.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0010.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0038.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0039.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0060.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0098.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0127.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0054.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0103.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0093.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0100.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0101.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0019.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0022.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0040.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0086.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0094.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0115.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0014.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0043.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0061.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0063.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0077.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0070.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0092.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0102.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0123.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0052.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0078.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0084.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0112.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0006.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0023.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0057.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0119.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0016.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0034.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0091.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0035.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0004.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0080.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0026.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0121.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0029.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0032.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0046.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0087.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0114.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0116.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:04 provision: minted instance route r0125.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0003.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0048.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0096.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0104.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0027.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0030.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0073.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0013.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0017.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0053.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0058.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0065.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0008.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0020.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0031.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0033.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0051.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0055.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0085.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0097.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0025.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0069.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0106.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0111.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0120.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0028.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0042.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0072.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0113.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0108.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0015.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0037.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0047.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0067.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0083.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0088.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0107.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0012.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0036.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0041.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:05 provision: minted instance route r0044.go.tito.io (app "tito" acct "bac")
--- FAIL: TestPlan14RootReadCensus (5.75s)
plan14_root_reads_test.go:940: root read census: 4 discrepancies
changed root read internal/release/adopt.go:adoptHost; review class, task, sites and digest
changed root source envelope internal/host
changed root source envelope internal/release
stale root read internal/release/adopt.go:type passConfig
2026/10/19 23:27:42 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:42 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:42 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/19 23:27:42 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted instance route console.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted service route ha.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted service route svc.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted instance route whole.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted instance route shared.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: converged acme.go.tito.io channel stable -> edge
2026/10/19 23:27:43 provision: converged acme.go.tito.io channel edge -> canary/rehearsal
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: empty channel
2026/10/19 23:27:43 provision: not removing acme.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: converged acme.go.tito.io environment "" -> "staging"
2026/10/19 23:27:43 provision: converged acme.go.tito.io environment "staging" -> ""
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: converged acme.go.tito.io steering "" -> "latency"
2026/10/19 23:27:43 provision: converged acme.go.tito.io steering "latency" -> ""
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: converged acme.go.tito.io hibernate false -> true
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: converged acme.go.tito.io hibernate true -> false (replication "daily" cleared: only a hibernating route's rung is read)
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: converged acme.go.tito.io status-named false -> true
2026/10/19 23:27:43 provision: converged acme.go.tito.io status-named true -> false
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted service route ha.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 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/19 23:27:43 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/19 23:27:43 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/19 23:27:43 provision: minted service route whole.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 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/19 23:27:43 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/19 23:27:43 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/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted service route whole.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: skipping accounts/bac/account.json: malformed account manifest: invalid character 'o' in literal null (expecting 'u')
2026/10/19 23:27:43 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: manifest bac/tito: read failed: provision: manifest bac/tito: invalid character 'o' in literal null (expecting 'u')
2026/10/19 23:27:43 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/19 23:27:43 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/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 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/19 23:27:43 provision: not removing acme$evil.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/19 23:27:43 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/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 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/19 23:27:43 provision: not removing bad-service.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/19 23:27:43 provision: skipping record apps/bac/tito/instances/no-channel.go.tito.io.json: empty channel
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: skipping record apps/bac/tito/instances/no-channel.go.tito.io.json: empty channel
2026/10/19 23:27:43 provision: not removing no-channel.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/19 23:27:43 provision: not removing acme.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/19 23:27:43 provision: removed retired instance route ghost.go.tito.io (record gone)
2026/10/19 23:27:43 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/19 23:27:43 provision: minted instance route dup.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/19 23:27:43 provision: removed retired instance route acme.go.tito.io (app in the trash)
2026/10/19 23:27:43 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/19 23:27:43 provision: removed retired static route site.go.tito.io (app in the trash)
2026/10/19 23:27:43 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/19 23:27:43 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/19 23:27:43 provision: removed retired instance route acme.go.tito.io (app in the trash)
2026/10/19 23:27:43 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/19 23:27:43 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/19 23:27:43 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/19 23:27:43 provision: converged acme.go.tito.io channel stable -> edge
2026/10/19 23:27:43 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/19 23:27:43 provision: converged acme.go.tito.io channel canary/rehearsal -> edge
2026/10/19 23:27:43 provision: converged acme.go.tito.io environment "staging" -> ""
2026/10/19 23:27:43 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/19 23:27:43 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/19 23:27:43 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/19 23:27:43 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/19 23:27:43 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/19 23:27:43 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/19 23:27:43 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/19 23:27:43 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/19 23:27:43 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/19 23:27:43 provision: dry-run: would mint instance route acme.go.tito.io (app "tito" acct "bac" channel "stable")
2026/10/19 23:27:43 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/19 23:27:43 provision: dry-run: would converge adopt.go.tito.io channel stable -> edge
2026/10/19 23:27:43 provision: dry-run: would converge adopt.go.tito.io environment "" -> "staging"
2026/10/19 23:27:43 provision: dry-run: would converge owned.go.tito.io channel stable -> edge
2026/10/19 23:27:43 provision: dry-run: would converge owned.go.tito.io environment "" -> "staging"
2026/10/19 23:27:43 provision: dry-run: would converge owned.go.tito.io hibernate false -> true
2026/10/19 23:27:43 provision: dry-run: would converge owned.go.tito.io seed
2026/10/19 23:27:43 provision: dry-run: would remove retired instance route gone.go.tito.io (record gone)
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: adopted existing route adopt.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/19 23:27:43 provision: converged adopt.go.tito.io channel stable -> edge
2026/10/19 23:27:43 provision: converged adopt.go.tito.io environment "" -> "staging"
2026/10/19 23:27:43 provision: converged owned.go.tito.io channel stable -> edge
2026/10/19 23:27:43 provision: converged owned.go.tito.io environment "" -> "staging"
2026/10/19 23:27:43 provision: converged owned.go.tito.io hibernate false -> true
2026/10/19 23:27:43 provision: removed retired instance route gone.go.tito.io (record gone)
2026/10/19 23:27:43 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: adopted existing route story.carlosframework.com (app "story" acct "bad") — this record now owns its channel and environment
2026/10/19 23:27:43 provision: story.carlosframework.com exists but is not the route this record describes (kind "instance"/"static") — leaving it alone
2026/10/19 23:27:43 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted service route pub.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted service route pubs.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted instance route exec.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted service route loop.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted service route named.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted service route priv.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted instance route unit.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted static route pisite.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:43 provision: removed retired static route site.go.tito.io (record gone)
2026/10/19 23:27:44 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:44 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:44 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:44 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:44 provision: minted instance route acme-uk.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:44 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:44 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:44 provision: converged acme.go.tito.io replicas "ie,uk" -> "uk"
2026/10/19 23:27:44 provision: converged acme.go.tito.io replicas "uk" -> ""
2026/10/19 23:27:44 provision: minted instance route acme-uk.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:44 provision: converged acme-uk.go.tito.io replica mark true -> false
2026/10/19 23:27:44 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:44 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:44 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/19 23:27:44 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:44 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:44 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:44 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:44 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:44 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:44 provision: acme.go.tito.io: not minting this pass: the box's layout intent could not be read: store down
2026/10/19 23:27:44 provision: router.go.tito.io: not minting this pass: the box's layout intent could not be read: store down
2026/10/19 23:27:44 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/19 23:27:44 provision: converged acme.go.tito.io channel stable -> edge
2026/10/19 23:27:44 provision: minted instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac")
2026/10/19 23:27:44 provision: not removing acme.go.tito.io (record gone): participant of a running operation
2026/10/19 23:27:44 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/19 23:27:44 provision: minted instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac")
2026/10/19 23:27:44 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/19 23:27:44 provision: held acme.go.tito.io landing by mv_acme (was ready)
2026/10/19 23:27:44 provision: acme.go.tito.io: held restoring by rb_other, not by mv_acme; leaving it
2026/10/19 23:27:44 provision: acme.go.tito.io: the row is not this pass's (app "other" acct ""); not holding it for mv_acme
2026/10/19 23:27:44 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/19 23:27:44 provision: dry-run: would mint instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac" channel "stable")
2026/10/19 23:27:44 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/19 23:27:44 provision: held acme.go.tito.io landing by mv_acme (was ready)
2026/10/19 23:27:44 provision: minted instance route acme.example.com (app "shop" acct "bac")
2026/10/19 23:27:44 provision: minted instance route plain.example.com (app "shop" acct "bac")
2026/10/19 23:27:44 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/19 23:27:44 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/19 23:27:44 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/19 23:27:44 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/19 23:27:44 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/19 23:27:44 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/19 23:27:44 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/19 23:27:44 provision: listing apps/bac/shop/instances/: list refused — its records are unseen this pass
2026/10/19 23:27:45 provision: a.shop.example.com: swapped for import sd_jovgyh535rwdyc7b4sdmonpcbu (the original route is journaled)
2026/10/19 23:27:45 provision: a.shop.example.com: import sd_jovgyh535rwdyc7b4sdmonpcbu committed: its gate is cleared and its journal row dropped
2026/10/19 23:27:45 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/19 23:27:45 provision: a.shop.example.com: import sd_v4oz5q7usynnfyohrkcqcyj4iy rolled back to its original route
2026/10/19 23:27:45 provision: a.shop.example.com: import sd_v4oz5q7usynnfyohrkcqcyj4iy: the host's replica is left alone: the record apps/bac/shop/instances/a.shop.example.com.json holds the host
2026/10/19 23:27:45 provision: a.shop.example.com: import sd_v4oz5q7usynnfyohrkcqcyj4iy is cleaned up and its journal row retired
2026/10/19 23:27:45 provision: a.shop.example.com: import sd_56qwrtoadn52vnykkaxc7oswgy rolled back to its original route
2026/10/19 23:27:45 provision: a.shop.example.com: import sd_56qwrtoadn52vnykkaxc7oswgy: the host's replica is left alone: the record apps/bac/shop/instances/a.shop.example.com.json holds the host
2026/10/19 23:27:45 provision: a.shop.example.com: import sd_56qwrtoadn52vnykkaxc7oswgy is cleaned up and its journal row retired
2026/10/19 23:27:45 provision: dry-run: would redo a.shop.example.com's swap record CAS for import sd_jwevelj7wdex2x4ajbvxdxegte
2026/10/19 23:27:45 provision: dry-run: would clear a.shop.example.com's import gate
2026/10/19 23:27:45 provision: dry-run: would converge a.shop.example.com seed source
2026/10/19 23:27:45 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/19 23:27:45 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/19 23:27:45 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/19 23:27:45 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/19 23:27:45 provision: a.shop.example.com: import sd_fyencud7npwn35twif2t5i6rdi cannot roll back on this box: the activator is not wired; it stays journaled and gated
2026/10/19 23:27:45 provision: a.shop.example.com: import sd_ld2mdyeofbw4xo5r7nkcbzjwae cannot roll back on this box: the activator is not wired; it stays journaled and gated
2026/10/19 23:27:45 provision: a.shop.example.com: import sd_sddzfbk4tbrvir2ey3twpvxzuy is journaled, but this box cannot act on imports; its row is left alone
2026/10/19 23:27:45 provision: a.shop.example.com: import sd_ynzgkahjyczw5kkqo4u7szqm24 is journaled, but this box cannot act on imports; its row is left alone
2026/10/19 23:27:45 provision: a.shop.example.com: import sd_2ibbphtswnimxwvb4tbvcsyr2m is journaled, but this box cannot act on imports; its row is left alone
2026/10/19 23:27:45 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/19 23:27:45 provision: c.shop.example.com: import sd_yuijelwcmz44uzqqqu7xcuin3i left alone this pass: the import journal could not be read
2026/10/19 23:27:45 provision: b.shop.example.com: import sd_6ntoz77ubhqv4kusnnlzpbkqme left alone this pass: the import journal could not be read
2026/10/19 23:27:45 provision: a.shop.example.com: import sd_koh67o3fyz4xe5opcygzjw5orm committed: its gate is cleared and its journal row dropped
2026/10/19 23:27:45 provision: a.shop.example.com: not converging import sd_s6g5azjlfwwrmh4xk4gxyae5ti: it is swapped but not committed, and the row on this box has no import gate
2026/10/19 23:27:45 provision: a.shop.example.com: not converging import sd_7x64exe6vptca5fad6avanaep4: it is swapped but not committed, and the row on this box has no import gate
2026/10/19 23:27:45 provision: a.shop.example.com: not converging import sd_ri7l3v5ej3a6ypoq7kt4rdvh34: it is placed but not committed, and the row on this box has no import gate
2026/10/19 23:27:45 provision: a.shop.example.com: not converging import sd_giyrfuhknv3pxhkp4zj2corf74: it is placed but not committed, and the row on this box has no import gate
2026/10/19 23:27:45 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/19 23:27:45 provision: converge seed source on a.shop.example.com: constraint failed: seed_source is read-only here (1811)
2026/10/19 23:27:45 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/19 23:27:45 provision: a.shop.example.com: import sd_2bks7ftpaeeop56ivi2vchkqxm committed: its gate is cleared and its journal row dropped
2026/10/19 23:27:45 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/19 23:27:45 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:45 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/19 23:27:45 provision: acme.go.tito.io: not minting a seeded instance: this box does not mint nested (<nil>)
2026/10/19 23:27:45 provision: acme.go.tito.io: not minting a seeded instance: claim control is on for this box
2026/10/19 23:27:45 provision: acme.go.tito.io: aborted seed sd_dz5btfplqqccfmn3cao5c5mpre: this box cannot read seed markers, and places no seed; nothing local is removed
2026/10/19 23:27:45 provision: acme.go.tito.io: aborted seed sd_dz5btfplqqccfmn3cao5c5mpre rolled back (no box had swapped it)
2026/10/19 23:27:45 provision: acme.go.tito.io: not minting a seeded instance: its record does not describe a hibernating instance
2026/10/19 23:27:45 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:45 provision: removed instance route acme.go.tito.io (its seed sd_dqfgj3gqcg2m4n4s7ywu324u3y was aborted); the next pass rolls it back
2026/10/19 23:27:45 provision: acme.go.tito.io: aborted seed sd_dqfgj3gqcg2m4n4s7ywu324u3y: this box cannot read seed markers, and places no seed; nothing local is removed
2026/10/19 23:27:45 provision: acme.go.tito.io: aborted seed sd_dqfgj3gqcg2m4n4s7ywu324u3y rolled back (no box had swapped it)
2026/10/19 23:27:45 provision: acme.go.tito.io: aborted seed sd_xrlf3j72vqabe33iqev2vkzeny has a row this pass may not remove; leaving the seed aborted
2026/10/19 23:27:46 provision: acme.go.tito.io: aborted seed sd_mtwyxeyyubalvtvlaaqetfpuu4 rolled back (no box had swapped it)
2026/10/19 23:27:46 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:46 provision: removed instance route acme.go.tito.io (its seed sd_r2soaxsjb3qullo3bxoap2acvi was aborted); the next pass rolls it back
2026/10/19 23:27:46 provision: acme.go.tito.io: aborted seed sd_r2soaxsjb3qullo3bxoap2acvi has no route on this box: its local data is removed
2026/10/19 23:27:46 provision: acme.go.tito.io: aborted seed sd_r2soaxsjb3qullo3bxoap2acvi rolled back (no box had swapped it)
2026/10/19 23:27:46 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_hdxnilrrqexcoqezn6mi57e7xa (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_hdxnilrrqexcoqezn6mi57e7xa rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_hdxnilrrqexcoqezn6mi57e7xa is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_cj6igaf7xdju6556poic2ckxiq (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_cj6igaf7xdju6556poic2ckxiq rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_cj6igaf7xdju6556poic2ckxiq is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_bvsvrxblvzaotdulrnbjib4av4 (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_bvsvrxblvzaotdulrnbjib4av4 rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_bvsvrxblvzaotdulrnbjib4av4: the host's replica is left alone: its record no longer names this seed
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_bvsvrxblvzaotdulrnbjib4av4 is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_ht6wkbncx5tidj75wfgzv6vyka (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_ht6wkbncx5tidj75wfgzv6vyka rollback deferred: the host is not fenced and stopped yet (<nil>)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_ht6wkbncx5tidj75wfgzv6vyka rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_ht6wkbncx5tidj75wfgzv6vyka is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_ugy2vncmashr457vbhotpkzsem (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_ugy2vncmashr457vbhotpkzsem rollback deferred: the host is not fenced and stopped yet (stop unproven)
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_wt6fyddv4nvpv5ep4ayvi3nr54 (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_wt6fyddv4nvpv5ep4ayvi3nr54 is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_5fmpqat677vgmwwnyjnlpsdfim (the original route is journaled)
2026/10/19 23:27:46 provision: skipping record apps/bac/shop/instances/a.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_5fmpqat677vgmwwnyjnlpsdfim left alone this pass: its record could not be read
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_owv2uqsgyqywpmssc22jmi5pku (the original route is journaled)
2026/10/19 23:27:46 provision: skipping record apps/bac/shop/instances/a.shop.example.com.json: read failed: connection reset
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_owv2uqsgyqywpmssc22jmi5pku left alone this pass: its record could not be read
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_nx4xsen4wmncep2b7ortb53bmm (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_nx4xsen4wmncep2b7ortb53bmm: close the import gate: constraint failed: injected (1811)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_nx4xsen4wmncep2b7ortb53bmm rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_nx4xsen4wmncep2b7ortb53bmm is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_3x6gvv2dsd4qopxhdmc5xf6sfq (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_3x6gvv2dsd4qopxhdmc5xf6sfq: close the import gate: constraint failed: injected (1811)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_3x6gvv2dsd4qopxhdmc5xf6sfq rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_3x6gvv2dsd4qopxhdmc5xf6sfq is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_2ae7jqcflo6src6kfg7zhh5etu (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_2ae7jqcflo6src6kfg7zhh5etu rollback deferred: the host is not fenced and stopped yet (injected failure at fence)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_2ae7jqcflo6src6kfg7zhh5etu rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_2ae7jqcflo6src6kfg7zhh5etu is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_64uckgbkb6j7ksvkmswzvz5wmm (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_64uckgbkb6j7ksvkmswzvz5wmm rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_64uckgbkb6j7ksvkmswzvz5wmm is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_cqqjr2qnwxqqgnkeiartbyjveu (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_cqqjr2qnwxqqgnkeiartbyjveu: retire its instance key: injected failure at retire-key
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_cqqjr2qnwxqqgnkeiartbyjveu rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_cqqjr2qnwxqqgnkeiartbyjveu is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_53fink7x33a3syq67ivxanj46a (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_53fink7x33a3syq67ivxanj46a rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_53fink7x33a3syq67ivxanj46a is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_hris6ik62qvqw2v5cnyj5ekixi (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_hris6ik62qvqw2v5cnyj5ekixi: remove its local data: injected failure at remove-local
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_hris6ik62qvqw2v5cnyj5ekixi rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_hris6ik62qvqw2v5cnyj5ekixi is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_eqweblptin5lu23bqhyn7lmuqy (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_eqweblptin5lu23bqhyn7lmuqy rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_eqweblptin5lu23bqhyn7lmuqy is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_jjackklttjevrgeyhouyxkm4k4 (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_jjackklttjevrgeyhouyxkm4k4: remove its local data: injected failure at remove-local-done
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_jjackklttjevrgeyhouyxkm4k4 rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_jjackklttjevrgeyhouyxkm4k4 is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_7bhgvair6v5dq2cxgtaf5sojbm (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_7bhgvair6v5dq2cxgtaf5sojbm rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_7bhgvair6v5dq2cxgtaf5sojbm is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_jaf4v6q4yin7te3pikkf7fdog4 (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_jaf4v6q4yin7te3pikkf7fdog4: restore the original route: constraint failed: injected (1811)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_jaf4v6q4yin7te3pikkf7fdog4 rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_jaf4v6q4yin7te3pikkf7fdog4 is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_ryf2ewz6pco6mrm27etjixh5gu (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_ryf2ewz6pco6mrm27etjixh5gu: restore the original route: constraint failed: injected (1811)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_ryf2ewz6pco6mrm27etjixh5gu rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_ryf2ewz6pco6mrm27etjixh5gu is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_mwbd22hxrvwqwode7fqtrate2e (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_mwbd22hxrvwqwode7fqtrate2e is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_dzntrl4crfuvtdcmp4z75psl3i (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_dzntrl4crfuvtdcmp4z75psl3i rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_dzntrl4crfuvtdcmp4z75psl3i: delete its snapshot: injected failure at delete-snapshot
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_dzntrl4crfuvtdcmp4z75psl3i is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_6qrzk5t3s7zksyxieq5v5fngxy (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_6qrzk5t3s7zksyxieq5v5fngxy rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_6qrzk5t3s7zksyxieq5v5fngxy is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_56zvmm3rdtecxv6swm6nqohdiu (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_56zvmm3rdtecxv6swm6nqohdiu rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_56zvmm3rdtecxv6swm6nqohdiu: delete the host's replica: injected failure at delete-replica
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_56zvmm3rdtecxv6swm6nqohdiu is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_k5r5vpzbkgqclguvzs46r7acsy (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_k5r5vpzbkgqclguvzs46r7acsy rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_k5r5vpzbkgqclguvzs46r7acsy is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_t2o3fkiwung3vg3gq5axhywanu (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_t2o3fkiwung3vg3gq5axhywanu rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_t2o3fkiwung3vg3gq5axhywanu: retire its journal row: constraint failed: injected (1811)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_t2o3fkiwung3vg3gq5axhywanu is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_iyoiasocnj5m34fta467khykwe (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_iyoiasocnj5m34fta467khykwe rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_iyoiasocnj5m34fta467khykwe: retire its journal row: constraint failed: injected (1811)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_iyoiasocnj5m34fta467khykwe is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_effc3mu4o5zdwfapi4coshr4xq (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_effc3mu4o5zdwfapi4coshr4xq rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_effc3mu4o5zdwfapi4coshr4xq is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: mark import sd_effc3mu4o5zdwfapi4coshr4xq rolled back: injected failure at cas
2026/10/19 23:27:46 provision: a.shop.example.com: aborted seed sd_effc3mu4o5zdwfapi4coshr4xq rolled back (no box had swapped it)
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_wmqtvlhp75nbkiqbgi5hvzcu5i (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_wmqtvlhp75nbkiqbgi5hvzcu5i rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_wmqtvlhp75nbkiqbgi5hvzcu5i is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: aborted seed sd_wmqtvlhp75nbkiqbgi5hvzcu5i rolled back (no box had swapped it)
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_qevsildfab2momvokscrtefknu (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_qevsildfab2momvokscrtefknu rollback deferred: the host is not fenced and stopped yet (<nil>)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_qevsildfab2momvokscrtefknu rollback deferred: the host is not fenced and stopped yet (<nil>)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_qevsildfab2momvokscrtefknu rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_qevsildfab2momvokscrtefknu is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_6lam6kqvsm6guyrvjdcbqzsk6e (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_6lam6kqvsm6guyrvjdcbqzsk6e rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_6lam6kqvsm6guyrvjdcbqzsk6e is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_wwr47pkfdxe4uxx2qj2wafjisi (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_wwr47pkfdxe4uxx2qj2wafjisi rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_wwr47pkfdxe4uxx2qj2wafjisi is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_oogokk6ap7il2s6ju4f7lc2rla (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_oogokk6ap7il2s6ju4f7lc2rla rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_oogokk6ap7il2s6ju4f7lc2rla is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_fb6etiq6pzyqpmvrtem3yniciy (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_fb6etiq6pzyqpmvrtem3yniciy rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_fb6etiq6pzyqpmvrtem3yniciy is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_jgfu5hcqv4t4qzaepd2tw6sq3a (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_jgfu5hcqv4t4qzaepd2tw6sq3a rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_jgfu5hcqv4t4qzaepd2tw6sq3a is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: minted instance route a.shop.example.com (app "other" acct "bac")
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_rcs4i55havmlw64bsttfzwtunm (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_rcs4i55havmlw64bsttfzwtunm rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_rcs4i55havmlw64bsttfzwtunm is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: minted instance route a.shop.example.com (app "other" acct "bac")
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_ciucvfd3gttektnbjl2viuz36i (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_ciucvfd3gttektnbjl2viuz36i rolled back to its original route
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_ciucvfd3gttektnbjl2viuz36i is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: minted instance route a.shop.example.com (app "other" acct "bac")
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_utudrf23u4czz2bfj4d2o2ccca (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_utudrf23u4czz2bfj4d2o2ccca has no route on this box: its local data is removed and no route is put back
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_utudrf23u4czz2bfj4d2o2ccca is cleaned up and its journal row retired
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_lfah2jqklf2oep6nlmnr77bypq (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_acjv6zzbdq6xccyk35gumlsr2m (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_ddspy3lb5gdi3hmkwocd764wcm (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_ddspy3lb5gdi3hmkwocd764wcm cannot roll back on this box: the activator is not wired; it stays journaled and gated
2026/10/19 23:27:46 provision: a.shop.example.com: swapped for import sd_fcn3ah2riovjbdcazqm23w2y5a (the original route is journaled)
2026/10/19 23:27:46 provision: a.shop.example.com: import sd_fcn3ah2riovjbdcazqm23w2y5a is not rolled back: the route changed under the fence, so nothing there is touched
2026/10/19 23:27:47 provision: a.shop.example.com: import "../not-a-seed" names no snapshot and no replica; only its journal row is cleaned up
2026/10/19 23:27:47 provision: a.shop.example.com: import ../not-a-seed is cleaned up and its journal row retired
2026/10/19 23:27:47 provision: a.shop.example.com: swapped for import sd_rnivsab6jieilvr2svt3jvwz5e (the original route is journaled)
2026/10/19 23:27:47 provision: a.shop.example.com: swapped for import sd_hy7cv4azapuqdlxbqxzhlpm2fq (the original route is journaled)
2026/10/19 23:27:47 provision: a.shop.example.com: swapped for import sd_5ppeddr5z3st2otud3pnxbnqmy (the original route is journaled)
2026/10/19 23:27:47 provision: a.shop.example.com: swapped for import sd_dhgpur6b3jqjze5y72xqfe26ou (the original route is journaled)
2026/10/19 23:27:47 provision: a.shop.example.com: swapped for import sd_5anwev754oxlfcent7vpxsezp4 (the original route is journaled)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_5anwev754oxlfcent7vpxsezp4 rollback deferred: the host is not fenced and stopped yet (stop evidence unreadable)
2026/10/19 23:27:47 provision: a.shop.example.com: swapped for import sd_gsu4wmoqtgadk4qzth5yjtqcey (the original route is journaled)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_gsu4wmoqtgadk4qzth5yjtqcey has no route on this box: its local data is removed and no route is put back
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_gsu4wmoqtgadk4qzth5yjtqcey is cleaned up and its journal row retired
2026/10/19 23:27:47 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/19 23:27:47 provision: a.shop.example.com: swapped for import sd_qmtsiqn2rjjlkoxt3lf7th6zy4 (the original route is journaled)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_qmtsiqn2rjjlkoxt3lf7th6zy4: remove its local data: injected failure at remove-local
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_qmtsiqn2rjjlkoxt3lf7th6zy4 is not rolled back: the route at the host is not the import's, so nothing there is touched
2026/10/19 23:27:47 provision: a.shop.example.com: swapped for import sd_dt746up6ch5ymm4ixskpnyare4 (the original route is journaled)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_dt746up6ch5ymm4ixskpnyare4: a route appeared at the host, so its local database is left and the rollback waits
2026/10/19 23:27:47 provision: a.shop.example.com: swapped for import sd_f7sh745k7uooieebihqtwtgbve (the original route is journaled)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_f7sh745k7uooieebihqtwtgbve rollback deferred: no fence generation: registry busy
2026/10/19 23:27:47 provision: a.shop.example.com: swapped for import sd_wapn7jszmuvyd4vjrf7wirykwe (the original route is journaled)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_wapn7jszmuvyd4vjrf7wirykwe rollback deferred: no fence generation: the generation source answered 0
2026/10/19 23:27:47 provision: a.shop.example.com: swapped for import sd_felzff6imsgu53mtscfydvnkcq (the original route is journaled)
2026/10/19 23:27:47 provision: a.shop.example.com: swapped for import sd_qtgzpsa6sxuxx3bijgq24y4xom (the original route is journaled)
2026/10/19 23:27:47 provision: a.shop.example.com: swapped for import sd_52vi7ybubzl4lglnfvsgr4iory (the original route is journaled)
2026/10/19 23:27:47 provision: a.shop.example.com: import deferred: this box cannot read the instance's env file
2026/10/19 23:27:47 provision: a.shop.example.com: import deferred: the instance's env file could not be read: a symlink
2026/10/19 23:27:47 provision: a.shop.example.com: swapped for import sd_g5qqflgypaemeqny6czh6npe6a (the original route is journaled)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_g5qqflgypaemeqny6czh6npe6a rolled back to its original route
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_g5qqflgypaemeqny6czh6npe6a is cleaned up and its journal row retired
2026/10/19 23:27:47 provision: a.shop.example.com: swapped for import sd_jgliulw74ygn2cj4w4qq2yyyzu (the original route is journaled)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_jgliulw74ygn2cj4w4qq2yyyzu rolled back to its original route
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_jgliulw74ygn2cj4w4qq2yyyzu is cleaned up and its journal row retired
2026/10/19 23:27:47 provision: a.shop.example.com: swapped for import sd_v2fgnjvku7fm6vavbmdcnpqapa (the original route is journaled)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_v2fgnjvku7fm6vavbmdcnpqapa rolled back to its original route
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_v2fgnjvku7fm6vavbmdcnpqapa is cleaned up and its journal row retired
2026/10/19 23:27:47 provision: a.shop.example.com: swapped for import sd_ianeutcjejcxeyf6uh4msjsvre (the original route is journaled)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_ianeutcjejcxeyf6uh4msjsvre: retire its instance key: the env file is a symlink
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_ianeutcjejcxeyf6uh4msjsvre rolled back to its original route
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_ianeutcjejcxeyf6uh4msjsvre is cleaned up and its journal row retired
2026/10/19 23:27:47 provision: a.shop.example.com: swapped for import sd_f5jasxthzpmtnakkrcvcdul45q (the original route is journaled)
2026/10/19 23:27:47 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/19 23:27:47 provision: a.shop.example.com: swapped for import sd_ki6qwcwo3kd24vtcfs5qp5ot4a (the original route is journaled)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_az4tb264wzwbfaf2o7and5jo6e refused: there is no route at a.shop.example.com to replace
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_px7r7bltf5xrcu7fkrqov73tcy refused: the route's address is 127.0.0.1:9, not 127.0.0.1:8401
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_ptxuhilhftu4xa3ygvko43vp54 refused: the route's address is 127.0.0.1:8401,127.0.0.1:8402, not 127.0.0.1:8401
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_vosf7qn5bwjlydrvxnxofdqwfm refused: the route's address is 127.0.0.1:9, not 127.0.0.1:8401
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_3ugt5ybcn5duib3wqyqnf7aiye refused: the route belongs to app other
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_veizje3lkpm7n43i73zvuvon6q refused: the route is filed under another account
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_4j7k7lxfc7fkyt4gg44i6bch3e refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_mszwat2k6j4nzvswcwakv64vfi refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_bh6pqazvempqi43hjmysbzux24 refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_f3enj7sorw3vloo4go5joifeii refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_7bfxdvgmponw5j4fk7jsvfqe7m refused: the route is not an address route this import can take over (socket)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_yddjpvo3gbhmkokjasdhxgrkuu refused: the route is not an address route this import can take over (no address)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_rkusrruetjhiozwhipwittyp24 refused: the route is not an address route this import can take over (provisioned)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_vlhmxbbntmioqtddfc44qxpafi refused: the route is not an address route this import can take over (kind static)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_wht6a4tqaikulncbgueuiwdeae refused: the route is not an address route this import can take over (backing)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_luew2lkftzeqts6uqo3jo3ew3e refused: the route is not an address route this import can take over (tunnel)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_fj7ze3umxyyy3jir64xmsu5fta refused: the route is not an address route this import can take over (caps)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_s45izhtpjdk6f5mjx2ikjaieaa refused: the route is not an address route this import can take over (platform)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_y2dhmbhqm4meny3sp2kcqgogoi refused: the route is not an address route this import can take over (canary)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_ymgiqod2i7clu6f43o7w3sfj4y refused: the route is not an address route this import can take over (kind sidecar)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_b5gk2kelrm6enideqnjcawl66u refused: the route is not an address route this import can take over (region)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_54pms2fdqgkzlnnov4hepkg4mq refused: the route is not an address route this import can take over (fleet_box)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_nncr5bgb476adokqtjkbm3jkty refused: the route is not an address route this import can take over (hibernate)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_bfsrzzr7yb63a5thwtzhfbfn2y refused: the route is not an address route this import can take over (claim_owner)
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_tbf36gobfmka3om33f4upza5dm refused: this box does not run instances nested
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_newrj5cqowww2k4st6yozc2nwq refused: this box does not run instances nested
2026/10/19 23:27:47 provision: a.shop.example.com: import sd_ntbcstgqrqofdz7q27ro37sxg4 refused: claim control is on for this box
2026/10/19 23:27:47 provision: a.shop.example.com: swapped for import sd_5l64yr6q4mh4l6x2wl4bntccxq (the original route is journaled)
2026/10/19 23:27:47 provision: a.shop.example.com: swapped for import sd_eapkbgvymcwzn72wpii7u4e6wa (the original route is journaled)
2026/10/19 23:27:47 provision: a.shop.example.com: import deferred: this box cannot read the legacy route assignments
2026/10/19 23:27:47 provision: a.shop.example.com: import deferred: the legacy route assignments could not be read: store down
2026/10/19 23:27:47 provision: a.shop.example.com: not swapping for import sd_lobd63ewrtx4yvhucnwtyv4rmq: its verify hash is not a sha256
2026/10/19 23:27:47 provision: a.shop.example.com: not swapping for import sd_nqjsdp4dvu5vwadtr7qimhwfgy: its verify hash is not a sha256
2026/10/19 23:27:47 provision: a.shop.example.com: not swapping for import sd_4aijhypqd2pglnyzszsqktz4xq: its verify hash is not a sha256
2026/10/19 23:27:47 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/19 23:27:47 provision: A.shop.example.com/..: not swapping for import sd_fq3qmj4qets25ibqltfmfpnufy: its host or seed id is malformed (seeds: not a host)
2026/10/19 23:27:47 provision: a.shop.example.com: not swapping for import sd_em5cipqtw7dukxd6qh3xnyel6q: its record does not describe a nested, hibernating instance
2026/10/19 23:27:47 provision: a.shop.example.com: not swapping for import sd_zji7n7iy4trbk7tsvqlpifnvtm: its record does not describe a nested, hibernating instance
2026/10/19 23:27:47 provision: a.shop.example.com: not swapping for import sd_gilltnyh77jc7fhy5bwf7v4rlq: its record does not describe a nested, hibernating instance
2026/10/19 23:27:47 provision: a.shop.example.com: not swapping for import sd_gbynllbdgr75kafyffjmaixzxe: its record does not describe a nested, hibernating instance
2026/10/19 23:27:48 provision: a.shop.example.com: import deferred: the box's layout intent could not be read: store down
2026/10/19 23:27:48 provision: a.shop.example.com: swapped for import sd_7xad5mmwxdtkgmq4qjkroy4rmm (the original route is journaled)
2026/10/19 23:27:48 provision: a.shop.example.com: import deferred: the box's nested probe did not answer: ready probe timed out
2026/10/19 23:27:48 provision: a.shop.example.com: swapped for import sd_c6ae3arwvggcjlqdpqluk35myq (the original route is journaled)
2026/10/19 23:27:48 provision: a.shop.example.com: swapped for import sd_thrsuekmqdr2bx4eobbtl6ztt4 (the original route is journaled)
2026/10/19 23:27:48 provision: a.shop.example.com: import deferred: the route is held by operation op_1
2026/10/19 23:27:48 provision: dry-run: would consider swapping a.shop.example.com for import sd_dvhvuiymfyzcbxnlt5lnzaxuui
2026/10/19 23:27:48 provision: a.shop.example.com: import sd_trwxe5vb5re7mgg5vacqqxatfy rolled back to its original route
2026/10/19 23:27:48 provision: a.shop.example.com: import sd_trwxe5vb5re7mgg5vacqqxatfy: the host's replica is left alone: the record apps/bac/shop/instances/a.shop.example.com.json holds the host
2026/10/19 23:27:48 provision: a.shop.example.com: import sd_trwxe5vb5re7mgg5vacqqxatfy is cleaned up and its journal row retired
2026/10/19 23:27:48 provision: a.shop.example.com: import sd_cz3dvzqwzvt6bienfsxztmmf4i left alone: the import journal holds seed sd_mh4drg5r5wblk5xwfci5o3jl4y at swapped
2026/10/19 23:27:48 provision: a.shop.example.com: not minting import sd_2psadcrpb6kijzwf55jtvwu57m: it is swapped but not committed, and only its swap makes its row
2026/10/19 23:27:48 provision: a.shop.example.com: not minting import sd_2jvig53ibdyqnllgjrixx3pz2y: it is placed but not committed, and only its swap makes its row
2026/10/19 23:27:48 provision: a.shop.example.com: swapped for import sd_qsiden2uwh2g3ozsmzpmbzq37e (the original route is journaled)
2026/10/19 23:27:48 provision: a.shop.example.com: not minting import sd_qsiden2uwh2g3ozsmzpmbzq37e: it is swapped but not committed, and only its swap makes its row
2026/10/19 23:27:48 provision: a.shop.example.com: not minting import sd_qsiden2uwh2g3ozsmzpmbzq37e: it is placed but not committed, and only its swap makes its row
2026/10/19 23:27:48 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/19 23:27:48 provision: removed retired sidecar route gone.eleven.bac.sidecar.internal (record gone)
2026/10/19 23:27:48 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/19 23:27:48 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/19 23:27:48 provision: converged sidecar bot.eleven.bac.sidecar.internal args ["sidecar","run"] -> ["worker","run"]
2026/10/19 23:27:48 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/19 23:27:48 provision: converged sidecar bot.eleven.bac.sidecar.internal ceilings 300/3600 -> 60/120
2026/10/19 23:27:48 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/19 23:27:48 provision: converged sidecar bot.eleven.bac.sidecar.internal channel stable -> canary/eleven
2026/10/19 23:27:48 provision: converged sidecar bot.eleven.bac.sidecar.internal environment "other" -> "relay"
2026/10/19 23:27:48 provision: converged sidecar bot.eleven.bac.sidecar.internal hibernate true -> false
2026/10/19 23:27:48 provision: skipping sidecar record apps/bac/eleven/sidecars/bot.json: read failed: failStore: reads disabled under apps/bac/eleven/sidecars/
2026/10/19 23:27:48 provision: skipping sidecar record apps/bac/eleven/sidecars/bot.json: malformed: invalid character 'n' looking for beginning of object key string
2026/10/19 23:27:48 provision: not removing sidecar bot.eleven.bac.sidecar.internal: its record exists but could not be read cleanly this pass
2026/10/19 23:27:48 provision: skipping sidecar record apps/bac/eleven/sidecars/bot.json: empty channel
2026/10/19 23:27:48 provision: skipping sidecar record apps/bac/eleven/sidecars/held.json: empty channel
2026/10/19 23:27:48 provision: not removing sidecar held.eleven.bac.sidecar.internal: its record exists but could not be read cleanly this pass
2026/10/19 23:27:48 provision: removed retired sidecar route old.eleven.bac.sidecar.internal (record gone)
2026/10/19 23:27:48 provision: bac/eleven has sidecar records but no sidecars manifest — not minting
2026/10/19 23:27:48 provision: bac/eleven is in the trash — not minting sidecar routes for it
2026/10/19 23:27:48 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/19 23:27:48 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/19 23:27:48 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/19 23:27:48 provision: minted sidecar route hub.relay.bac.sidecar.internal (app "relay" acct "bac" args ["relay"])
2026/10/19 23:27:48 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/19 23:27:48 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/19 23:27:48 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/19 23:27:48 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/19 23:27:48 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/19 23:27:48 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/19 23:27:48 provision: removed retired sidecar route bot.eleven.bac.sidecar.internal (record gone)
2026/10/19 23:27:48 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/19 23:27:48 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/19 23:27:48 provision: skipping sidecar record apps/bac/relay/sidecars/hub.json: read failed: failStore: reads disabled under apps/bac/relay/sidecars/
2026/10/19 23:27:48 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/19 23:27:48 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/19 23:27:48 provision: dry-run: would mint sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" channel "stable" args ["sidecar","run"])
2026/10/19 23:27:48 provision: dry-run: would remove retired sidecar route gone.eleven.bac.sidecar.internal (record gone)
2026/10/19 23:27:48 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/19 23:27:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:48 provision: converged acme.go.tito.io update settings "{\"updates\":\"manual\",\"channel\":\"stable\"}" -> ""
2026/10/19 23:27:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:48 provision: manifest bac/tito: read failed: provision: manifest bac/tito: unexpected end of JSON input
2026/10/19 23:27:48 provision: manifest bac/tito: read failed: provision: manifest bac/tito: unexpected end of JSON input
2026/10/19 23:27:48 provision: acme.go.tito.io: not minted this pass: the app's update policy could not be read
2026/10/19 23:27:48 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/19 23:27:48 provision: manifest bac/tito: read failed: provision: manifest bac/tito: unexpected end of JSON input
2026/10/19 23:27:48 provision: acme.go.tito.io: not minted this pass: the app's update policy could not be read
2026/10/19 23:27:48 provision: minted instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac")
FAIL
FAIL github.com/carlosframework/platform/internal/provision 44.935s
ok github.com/carlosframework/platform/internal/publicrelease 0.007s
? github.com/carlosframework/platform/internal/regionname [no test files]
ok github.com/carlosframework/platform/internal/registry 5.740s
ok github.com/carlosframework/platform/internal/relay 7.242s
ok github.com/carlosframework/platform/internal/release 25.423s
--- FAIL: TestAMoveOntoTheInstalledGoodBuildWaitsForASignedRollback (5.03s)
--- FAIL: TestAMoveOntoTheInstalledGoodBuildWaitsForASignedRollback/socket_instance (5.01s)
holdran_test.go:796: timed out waiting for the move onto v1
FAIL
FAIL github.com/carlosframework/platform/internal/rollout 8.830s
ok github.com/carlosframework/platform/internal/rolloutwords 0.006s
ok github.com/carlosframework/platform/internal/rootaws 0.016s
ok github.com/carlosframework/platform/internal/rootparticipation 0.061s
ok github.com/carlosframework/platform/internal/rootstate 0.043s
ok github.com/carlosframework/platform/internal/runs 0.583s
ok github.com/carlosframework/platform/internal/s3compat 0.007s
ok github.com/carlosframework/platform/internal/safefile 0.006s
ok github.com/carlosframework/platform/internal/schedule 2.855s
ok github.com/carlosframework/platform/internal/seeds 0.023s
ok github.com/carlosframework/platform/internal/sim/hostlife 11.112s
ok github.com/carlosframework/platform/internal/sim/litestreamfacts 3.578s
ok github.com/carlosframework/platform/internal/status 0.076s
ok github.com/carlosframework/platform/internal/steering 0.007s
ok github.com/carlosframework/platform/internal/stopevidence 0.301s
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.007s
ok github.com/carlosframework/platform/internal/unixdial 0.005s
ok github.com/carlosframework/platform/internal/updatewords 0.007s
ok github.com/carlosframework/platform/internal/usage 0.006s
ok github.com/carlosframework/platform/internal/version 0.006s
ok github.com/carlosframework/platform/internal/vet 1.811s
FAIL
make: *** [Makefile:18: test] Error 1
amadan: step gate failed: exit status 2
amadan: job failed at step gate — its output is above, not at the tail of this log
diff --git a/internal/host/agent.go b/internal/host/agent.go| index 5ccaa3955..bb9e33fea 100644 |
| --- a/internal/host/agent.go |
| +++ b/internal/host/agent.go |
| @@ -1295,14 +1295,19 @@ func adoptLoop(reg *registry.Registry, svc *activator.Service, sd *scheduleDeps, |
| // DO NOT add the platform self-update here either: the system leg |
| // lives in the fast loop and re-observes hourly on its own, so an |
| // hourly call here would only double the pointer read. |
| - if err := release.Pass(ctx, reg, store, pub, optDir, restart, |
| + // |
| + // agentUnitsOption hands named units to root when this process is |
| + // not root (issue #315), which leaves WithStartUnit and |
| + // WithRollbackRestart to an agent run as root. |
| + opts := append([]release.PassOption{ |
| release.BakeDir(dataDir()), release.OnStageBlocked(stageRequester(dataDir())), |
| release.RestartHibernating(restart), |
| release.WithStartUnit(makeStartRoute(reg, systemctlStartUnit)), |
| release.WithRollbackRestart(agentRollbackUnitRestart(reg, systemdUnits{}, optDir, os.Getenv)), |
| release.WithProofGate(agentProofGate()), release.WithHostWrites(writes), |
| release.WithDigestRatchet(pointerRatchet(false, optDir, dataDir(), os.Getenv)), |
| - updatesPassOption(dataDir(), false)); err != nil { |
| + updatesPassOption(dataDir(), false)}, agentUnitsOption()...) |
| + if err := release.Pass(ctx, reg, store, pub, optDir, restart, opts...); err != nil { |
| log.Printf("agent: adopt pass: %v", err) |
| } |
| // The schedule converge's hourly floor (schedule spec §6.2), AFTER the |
| @@ -1727,9 +1732,10 @@ func stageMarkerRequester(dd string) func(host, ver string, err error) { |
| } |
| // One line for every cause the marker relays (Task 12a): a build |
| // this process cannot stage, an install request only root |
| - // resolves (ErrInstallRequestNeedsRoot), and a held wake's target |
| - // only root installs. The throttle does not carry the cause. |
| - log.Printf("agent: %s needs a root pass for %s (a build only root can stage or install, or an install request only root resolves); asked for one", host, ver) |
| + // resolves (ErrInstallRequestNeedsRoot), a named unit only root |
| + // restarts (ErrUnitRestartNeedsRoot), and a held wake's target only |
| + // root installs. The throttle does not carry the cause. |
| + log.Printf("agent: %s needs a root pass for %s (a build only root can stage or install, a unit only root can restart, or an install request only root resolves); asked for one", host, ver) |
| }) |
| } |
| @@ -2020,8 +2026,11 @@ type restartFailure struct { |
| // did not already need, and it cannot fire for a sleeper: only an |
| // ERRORED restart reaches it, and every arm that can meet a sleeping |
| // route swallows its failure. |
| +// |
| +// unitsOption hands named units to root when this process is not root |
| +// (issue #315); see agentUnitsOption. |
| func fastPassOpts(dd string, stageReq func(host, ver string, err error), restart, start func(string) error) []release.PassOption { |
| - return []release.PassOption{ |
| + return append([]release.PassOption{ |
| release.BakeDir(dd), |
| release.OnStageBlocked(stageReq), |
| release.RestartHibernating(restart), |
| @@ -2031,7 +2040,22 @@ func fastPassOpts(dd string, stageReq func(host, ver string, err error), restart |
| // resolves. The book is opened per pass, not here: these options are |
| // built once per agent run. |
| updatesPassOption(dd, false), |
| + }, agentUnitsOption()...) |
| +} |
| + |
| +// agentRunsAsRoot is the agent's euid test, a seam for tests. |
| +var agentRunsAsRoot = func() bool { return os.Geteuid() == 0 } |
| + |
| +// agentUnitsOption is release.RootRestartsUnits for an agent that is not |
| +// root (issue #315). carlos-edge.service runs as User=carlos, and systemd |
| +// refuses that user a restart of any unit a route names, so a named-unit |
| +// route goes to the root pass through the stage relay before anything moves. |
| +// An agent run as root restarts the unit itself, as before. |
| +func agentUnitsOption() []release.PassOption { |
| + if agentRunsAsRoot() { |
| + return nil |
| } |
| + return []release.PassOption{release.RootRestartsUnits()} |
| } |
| // fastMembers computes the fast set for one tick — the routes with a reason |
diff --git a/internal/host/rootunits_test.go b/internal/host/rootunits_test.go| new file mode 100644 |
| index 000000000..6c2df491a |
| --- /dev/null |
| +++ b/internal/host/rootunits_test.go |
| @@ -0,0 +1,88 @@ |
| +package host |
| + |
| +import ( |
| + "context" |
| + "errors" |
| + "runtime" |
| + "testing" |
| + "time" |
| + |
| + "github.com/carlosframework/platform/internal/registry" |
| + "github.com/carlosframework/platform/internal/release" |
| +) |
| + |
| +// Issue #315, through the fast loop's production options: an agent that is |
| +// not root hands a named-unit route to root's pass rather than repointing it |
| +// and failing systemd's permission check. An agent run as root keeps |
| +// restarting the unit itself. |
| +func TestFastSweepHandsANamedUnitToRoot(t *testing.T) { |
| + for _, tc := range []struct { |
| + name string |
| + root bool |
| + }{{"agent user", false}, {"root", true}} { |
| + t.Run(tc.name, func(t *testing.T) { |
| + was := agentRunsAsRoot |
| + agentRunsAsRoot = func() bool { return tc.root } |
| + t.Cleanup(func() { agentRunsAsRoot = was }) |
| + |
| + env := newFastFixture(t) |
| + ctx := context.Background() |
| + plat := runtime.GOOS + "-" + runtime.GOARCH |
| + for _, v := range []string{"v1", "v2"} { |
| + m := release.Manifest{App: "fastapp", Version: v, Kind: "binary", |
| + Artifacts: map[string]release.Artifact{plat: {}}} |
| + if err := release.Ship(ctx, env.store, "bab", m, map[string][]byte{plat: []byte("build " + v)}); err != nil { |
| + t.Fatalf("Ship %s: %v", v, err) |
| + } |
| + } |
| + if err := release.Promote(ctx, env.store, env.priv, "bab", "fastapp", "canary/dev", "v1"); err != nil { |
| + t.Fatal(err) |
| + } |
| + if err := env.reg.Upsert(registry.Route{Host: "console.test", Kind: "instance", App: "fastapp", |
| + Channel: "canary/dev", Status: "ready", Addr: "127.0.0.1:8090"}); err != nil { |
| + t.Fatal(err) |
| + } |
| + if err := release.Pass(ctx, env.reg, env.store, env.pub, env.optDir, nil); err != nil { |
| + t.Fatal(err) |
| + } |
| + if err := env.reg.SetUnit("console.test", "console.service"); err != nil { |
| + t.Fatal(err) |
| + } |
| + if err := release.Promote(ctx, env.store, env.priv, "bab", "fastapp", "canary/dev", "v2"); err != nil { |
| + t.Fatal(err) |
| + } |
| + |
| + var unitRestarts []string |
| + restart := makeRestartRoute(env.reg, func(string) {}, |
| + unitOnly(func(u string) error { unitRestarts = append(unitRestarts, u); return nil }), nil) |
| + var relayed []error |
| + stageReq := func(host, ver string, err error) { |
| + if host == "console.test" && ver == "v2" { |
| + relayed = append(relayed, err) |
| + } |
| + } |
| + d := env.deps(nil) |
| + d.restart = restart |
| + d.passOpts = fastPassOpts(env.dataDir, stageReq, restart, nil) |
| + |
| + fastTick(ctx, d, time.Unix(1754640000, 0)) |
| + |
| + live, err := release.LiveVersion(env.optDir, "console.test") |
| + if err != nil { |
| + t.Fatal(err) |
| + } |
| + if tc.root { |
| + if live != "v2" || len(unitRestarts) != 1 || len(relayed) != 0 { |
| + t.Fatalf("root agent: live %q, unit restarts %v, relays %v; want v2, one restart, no relay", live, unitRestarts, relayed) |
| + } |
| + return |
| + } |
| + if live != "v1" || len(unitRestarts) != 0 { |
| + t.Fatalf("agent user: live %q, unit restarts %v; want v1 untouched and no restart", live, unitRestarts) |
| + } |
| + if len(relayed) != 1 || !errors.Is(relayed[0], release.ErrUnitRestartNeedsRoot) { |
| + t.Fatalf("relays = %v, want one ErrUnitRestartNeedsRoot", relayed) |
| + } |
| + }) |
| + } |
| +} |
diff --git a/internal/release/adopt.go b/internal/release/adopt.go| index da914a81c..2f790c3af 100644 |
| --- a/internal/release/adopt.go |
| +++ b/internal/release/adopt.go |
| @@ -86,6 +86,11 @@ type passConfig struct { |
| // is consulted for them at all. |
| restartHibernating func(host string) error |
| + // unitsToRoot hands every route that names its own unit to the root pass |
| + // before anything is staged or repointed (RootRestartsUnits). false, the |
| + // default and RunAdopt's, restarts the named unit in this pass. |
| + unitsToRoot bool |
| + |
| // startUnit is consulted ONLY on adoptHost's restart-failure rollback |
| // path, after the symlink has gone back (WithStartUnit). nil — every |
| // call site that does not pass the option, and every existing test — |
| @@ -154,6 +159,37 @@ type FailedBuild func(acct, app, build, host string, served bool) bool |
| // this pass sees it. Never shown to members. |
| var ErrInstallRequestNeedsRoot = errors.New("release: an install request waits for root's pass to resolve it") |
| +// ErrUnitRestartNeedsRoot is what a RootRestartsUnits pass hands |
| +// OnStageBlocked's callback for a route that names its own unit: nothing |
| +// failed, and the version is the build root's pass should install. Never |
| +// shown to members. |
| +var ErrUnitRestartNeedsRoot = errors.New("release: a route's named unit is restarted by root's pass") |
| + |
| +// RootRestartsUnits is for a pass whose process cannot restart a unit an |
| +// operator named (issue #315): the agent's in-process loops when they do not |
| +// run as root. carlos-edge.service is User=carlos, and systemd refuses it |
| +// ("Interactive authentication required") for console.service and every |
| +// other route.Unit. Before this option such a pass repointed the live link, |
| +// failed the restart, read the refusal as a broken build, rolled back, |
| +// poisoned the version and tried to start the old build over a process that |
| +// had never stopped. |
| +// |
| +// With it, a route that names its unit is handed to root before anything is |
| +// staged or repointed, through OnStageBlocked with ErrUnitRestartNeedsRoot, |
| +// the way a build this process cannot stage is. The live link keeps naming |
| +// the running build, nothing is poisoned and no refusal is recorded; root's |
| +// pass stages, repoints, restarts and stamps. Every hold, refusal and proof |
| +// check before the hand-off still applies, so root is only asked for a build |
| +// this pass would have installed. |
| +// |
| +// Lifecycle host writes (WithHostWrites) restart through the selected |
| +// receiver instead, so the option does nothing under them. Nor for a route |
| +// this pass would not restart (restart nil: a sleeper on a pass without |
| +// RestartHibernating, a sidecar). |
| +func RootRestartsUnits() PassOption { |
| + return func(c *passConfig) { c.unitsToRoot = true } |
| +} |
| + |
| // NagExpiredCanaries opts a Pass/PassFilter call into spec §5's nag: one |
| // line per expired canary/* route the call sees, written to w. |
| // |
| @@ -1483,6 +1519,15 @@ func adoptHost(ctx context.Context, work hostwrite.Work, reg *registry.Registry, |
| if !admitted { |
| return |
| } |
| + // A named unit this process cannot restart is root's (RootRestartsUnits): |
| + // ask for its pass and touch nothing. Silent on the tick; the requester |
| + // logs each request it writes. |
| + if cfg.unitsToRoot && rt.Unit != "" && restart != nil && !cfg.hostWrites.Enabled { |
| + if cfg.stageBlocked != nil { |
| + cfg.stageBlocked(rt.Host, ver, ErrUnitRestartNeedsRoot) |
| + } |
| + return |
| + } |
| // The evidence that authorizes ver (settings spec §4.1). Only today's |
| // adoption of the head, and a request whose T is still the head, rest on |
| // the signed pointer and its digest; everything else needs a promotion |
diff --git a/internal/release/rootunits_test.go b/internal/release/rootunits_test.go| new file mode 100644 |
| index 000000000..6310fa3cd |
| --- /dev/null |
| +++ b/internal/release/rootunits_test.go |
| @@ -0,0 +1,114 @@ |
| +package release |
| + |
| +import ( |
| + "context" |
| + "errors" |
| + "testing" |
| +) |
| + |
| +// Issue #315: a pass that cannot restart a named unit (the agent, User=carlos) |
| +// hands that route to root before it stages or repoints anything. The live |
| +// link keeps naming the running build, the version is not poisoned for the |
| +// other hosts in the pass, and root's pass then installs it normally. |
| +func TestRootRestartsUnitsHandsNamedUnitsToRoot(t *testing.T) { |
| + ctx := context.Background() |
| + s := NewDirStore(t.TempDir()) |
| + priv, pub := testKeys(t) |
| + opt := t.TempDir() |
| + reg := testRegistry(t) |
| + t.Cleanup(func() { reg.Close() }) |
| + const consoleHost, appHost = "console.example.com", "shop.example.com" |
| + for _, ver := range []string{"v1", "v2"} { |
| + shipRelease(t, s, "bab", "myapp", ver, adoptPlatform, []byte(ver)) |
| + } |
| + if err := Promote(ctx, s, priv, "bab", "myapp", "canary/x", "v1"); err != nil { |
| + t.Fatal(err) |
| + } |
| + addRoute(t, reg, consoleHost, "myapp", "canary/x", false) |
| + addRoute(t, reg, appHost, "myapp", "canary/x", false) |
| + if err := Pass(ctx, reg, s, pub, opt, nil); err != nil { |
| + t.Fatal(err) |
| + } |
| + if err := reg.SetUnit(consoleHost, "console.service"); err != nil { |
| + t.Fatal(err) |
| + } |
| + if err := Promote(ctx, s, priv, "bab", "myapp", "canary/x", "v2"); err != nil { |
| + t.Fatal(err) |
| + } |
| + |
| + var restarted []string |
| + restart := func(host string) error { |
| + restarted = append(restarted, host) |
| + if host == consoleHost { |
| + return errors.New("try-restart console.service: Interactive authentication required") |
| + } |
| + return nil |
| + } |
| + type req struct { |
| + host, ver string |
| + err error |
| + } |
| + var reqs []req |
| + relay := func(host, ver string, err error) { reqs = append(reqs, req{host, ver, err}) } |
| + |
| + if err := Pass(ctx, reg, s, pub, opt, restart, OnStageBlocked(relay), RootRestartsUnits()); err != nil { |
| + t.Fatal(err) |
| + } |
| + if len(reqs) != 1 || reqs[0].host != consoleHost || reqs[0].ver != "v2" || !errors.Is(reqs[0].err, ErrUnitRestartNeedsRoot) { |
| + t.Fatalf("relays = %+v, want one for %s v2 with ErrUnitRestartNeedsRoot", reqs, consoleHost) |
| + } |
| + if len(restarted) != 1 || restarted[0] != appHost { |
| + t.Fatalf("restarted = %v, want only %s", restarted, appHost) |
| + } |
| + if ver, err := LiveVersion(opt, consoleHost); err != nil || ver != "v1" { |
| + t.Fatalf("%s live = %q, %v; want v1 (untouched)", consoleHost, ver, err) |
| + } |
| + if rt, err := reg.Get(consoleHost); err != nil || rt == nil || rt.Version != "v1" { |
| + t.Fatalf("%s route = %+v, %v; want stamped v1", consoleHost, rt, err) |
| + } |
| + if ver, err := LiveVersion(opt, appHost); err != nil || ver != "v2" { |
| + t.Fatalf("%s live = %q, %v; want v2 (not poisoned by the hand-off)", appHost, ver, err) |
| + } |
| + if r, err := ReadRefusal(opt, consoleHost); err != nil || r != nil { |
| + t.Fatalf("refusal for %s = %+v, %v; want none", consoleHost, r, err) |
| + } |
| + |
| + // Root's pass, without the option, installs it. |
| + restarted = nil |
| + rootRestart := func(host string) error { restarted = append(restarted, host); return nil } |
| + if err := Pass(ctx, reg, s, pub, opt, rootRestart); err != nil { |
| + t.Fatal(err) |
| + } |
| + if ver, err := LiveVersion(opt, consoleHost); err != nil || ver != "v2" || len(restarted) != 1 || restarted[0] != consoleHost { |
| + t.Fatalf("root pass: %s live = %q, %v, restarted %v; want v2 and one restart", consoleHost, ver, err, restarted) |
| + } |
| +} |
| + |
| +// The option hands nothing over for a route this pass would not restart, and |
| +// leaves routes with no unit to the pass. |
| +func TestRootRestartsUnitsNeedsANamedUnitAndARestart(t *testing.T) { |
| + ctx := context.Background() |
| + s := NewDirStore(t.TempDir()) |
| + priv, pub := testKeys(t) |
| + opt := t.TempDir() |
| + reg := testRegistry(t) |
| + t.Cleanup(func() { reg.Close() }) |
| + const host = "console.example.com" |
| + shipRelease(t, s, "bab", "myapp", "v1", adoptPlatform, []byte("v1")) |
| + if err := Promote(ctx, s, priv, "bab", "myapp", "canary/x", "v1"); err != nil { |
| + t.Fatal(err) |
| + } |
| + addRoute(t, reg, host, "myapp", "canary/x", false) |
| + if err := reg.SetUnit(host, "console.service"); err != nil { |
| + t.Fatal(err) |
| + } |
| + relays := 0 |
| + relay := func(string, string, error) { relays++ } |
| + // restart nil: a pure repoint, which needs no unit restart. |
| + if err := Pass(ctx, reg, s, pub, opt, nil, OnStageBlocked(relay), RootRestartsUnits()); err != nil { |
| + t.Fatal(err) |
| + } |
| + if ver, err := LiveVersion(opt, host); err != nil || ver != "v1" || relays != 0 { |
| + t.Fatalf("live = %q, %v, relays %d; want v1 and no relay", ver, err, relays) |
| + } |
| +} |