Mesh view: connected nodes shown offline and named by internal id #236
Closed
opened 2026-10-17 08:56:06 +00:00 by kayg
·
276 comments
No Branch/Tag specified
main
j470b-server-mesh-rejoin
mesh-compat-382
j444b-d381-key-wins-flood
j461b-macos-utun-reader-thread
j475b-remove-host-motion
fix-reconnect-new-link
j481-d380
dev
j479-mesh-soak
fix/j476-host-facts
j475-motion-pill-split
j470-mac-node-join
root-upgrade-d376
j474-review-merge
latency-targets-120hz
nightly-suite-shards
gotatun-pin-j469
macos-utun-reader-thread
fix-flood-echo-stall
wip/j416
motion-fast-ease-out
mesh-addhost-j259
takeover-close-terminals-d368
kbd-instant-followups
fix-trust-key-double-click
nightly-suite-partial-report
appwin-icons-j207
rusqlite-slice1
swipe-content-first-d374
mesh-mtu-381
addhost-instant-open
glass-contrast-d365-mock
glass-contrast-d365
signout-followups-442
fix-startup-toast-red
research-gotatun-matrix-j317
themes-sync-j304
fix-load-flakes
fix-nix-zig-patch
fix-compute01-browser-baseline
ratchet-size-baseline-419
predict-auto-d130
revoke-coverage-d367
nightly-suite-queue-timeout
nightly-browser-suite
fix-rustsec-2026-0459
fonts-ioskeley-obel
log-retention-d375
fix-kbd-no-anim-427
fix-dev-red-specs-2
takeover-proof-305-j205
wip/j410-server-pump
ui-consistency-d372
fix-osc52-clipboard
libghostty-vt-1.0
forget-retired-host-d369
j404-merge-426
fix-setup-lock-race
fix-touch-select-426
revoke-access-report-ui
fix-predictive-echo-specs
fix-selinux-agent-exec
wip/j395-checkpoint2
wip/j395
j391-review-scratch
ui-consistency-j195-deferred-rebased
fix-rustc-paths-421
decisions-wording-341
fix-install-suite-red
fix-dev-rtt-specs
fix-pending-removal-align
fix-privileged-skip
fix-install-suite-404
review-j368
mesh-dns-j254
revoke-access-report-d356b
revoke-privilege-round5
fix-removal-confirm
review-j360
gotatun-rotation-367
deps-refresh-340
review-j354
review-J351
review-j350
addhost-takeover-d359
revoke-report-items-347
revoke-end-sessions-d362
review-j348
size-mesh-ssh-346
size-trim-337
revoke-access-diff-d356
j259-pre-rebase-b06c5a6
j305-ended-at-start-spec
addhost-sudo-consent
fix-layout-real-specs-411
fix-shell-open-411
fix-console-hosts-373
fix-shell-exit
fuzz-host-name-353
fix-host-details-410
macos-filter-j197
research-gotatun-tricks
revoke-p3-j216l
stale-state-pill
revoke-followups-j216k
revoke-progress-j216e
backup/macos01-20261106/lume/j197
backup/macos01-20261106/lume/appwin-icons-j207-stash0
backup/macos01-20261106/claude/stash-0
backup/macos01-20261106/claude/stash-1
backup/macos01-20261106/claude/J80-macos-s1
backup/macos01-20261106/claude/J80
backup/macos01-20261106/claude/J80-slice1-20261102
backup/macos01-20261106/claude/J16b-appwin-on-dev
backup/macos01-20261106/claude/appwin-launch-idle-146
backup/macos01-20261106/claude/J80-s1-run
wip/j259
trust-285-p3c
runtime-lock-j216f
mesh-ssh-p3-j175
tun-proof-p3b
trust-285-p3
terminal-polish-j271
tun-proof-p3
ssh-install-flakes-j216i
fuzz-fixes-j264
trust-285-a
trust-285-b
restart-oversized-fixture-j198
backup/macos01-20261106/lume/appwin-icons-j207
restart-bound-j216h
up-preflight-p3-j198
backup/macos01-20261106/lume/j251
up-preflight-j198
wip/up-preflight-j198-j245-p2
wip/up-preflight-j198-j245-p1
agent-fsync-offloop-j196
wip/up-preflight-j198-j245
settings-offscreen-j231
wip/up-preflight-j198-j226-inspection
wip/j103f
themes-j206
wip/up-preflight-j198-j226
flakes-j216c
backup/macos01-20261106/claude/j197
flakes-j216b
backup/macos01-20261106/claude/j197-red
wip/up-preflight-j198-review
flakes-j216
backup/macos01-20261106/claude/appwin-icons-j207
engineering-j208b
appwin-mock-j209
toast-stack-j165
engineering-j208
decisions-d351
decisions-d350
decisions-d349
appearance-presets-mock-j129
decisions-d348
docs-audit-spec
doc-coverage-baseline-raise
decisions-d347
decisions-d346b
decisions-d346
j88h-profile
ui-consistency-j195-deferred
ui-consistency-j195
engineering-practices-j194
preferred-login-ui-j166
signin-pools-263-j174
macos-node-265-s1
decisions-d345
decisions-d344
proxy-cgroup-j164
verify-quick-fuzz-329
proxy-start-io-j168
timing-flakes-j163
up-263-s1
mcp-events-j147
verify-quick-fuzz-j158
proxy-p3-j159
agent-resource-j157-detect
wip/j103d-final
remote-cancel-hang-j155
proxy-traefik-281-j62d
j149-verify-quick
proxy-traefik-281-j62b
j150-drop-unnamed
wip/j79d-red-r4
wip/j103d-d332
rootless-toast-j142
wip/j103d-head
wip/j103d
j125c-mcp
macos-build-j136
backup/macos01-20261106/claude/j136
wip/j79d-red-cli
wip/j79d-red-server
j121-link-liveness
j118c-tracer-failures
wip/j79c-head
release-desktop-j131
j124c-signed-macos
wip/j79c-red-p3
wip/j79c-red-p23
wip/j79c-red-p22
merge-j128-check
perf-deferred-j128
sidebar-toggle-260
j127-shortcut-changed-dot
j125-mcp
j118-tracer-failures
j126-account-summary
settings-sections-mock-j92
j120-pinch-lock
sidebar-292
backup/macos01-20261106/claude/j120
taste-2026-11-03
row-actions-242-215
backup/macos01-20261106/claude/stash-0-untracked
backup/macos01-20261106/claude/J80-265-s1-run
backup/macos01-20261106/claude/J80-macos-s1-20261102
j112-canvas-commands
ui-no-overshoot-scroll
fix-recovery-restart
backup/macos01-20261106/claude/stash-1-untracked
taste-2026-11-02
size-baseline-ratchet
machine-cards-structure-j108
j109-boot-copy-mockups
fix-dev-red
wip/up-263-s1
j95b-settings-rows
proxy-traefik-281
j95-option-rows
docs-human-j91
docs-keys-palette
fix-flood-1013-270-j38d
mesh-ssh-s1
mesh-ssh-s0
addhost-d291-tunnel
test-stability-load
mesh-relay-220
repro-296
shim-thp-off-24
mesh-pins-258-v2
mesh-dns
signin-d311-merged
docs-pages
ui-size-283
fix-ui-batch-specs
wip/j12b-edge-update
gate-on-arm
fix-rename-sync-293
trust-285-j60b
fix-focus-ring-clip
integ-ui-1101
edge-update-v2
signin-d311
taste-2026-11-01
layout-per-tab-250
ui-approved-splitopt-224
ui-approved-splitopt-224-on-dev
icon-text-centre-282
ui-approved-189-212-216
research-reverse-proxy
transfer-budget-320
review-mesh-pins-258-r2
sidebar-pill-259
review-mesh-relay-220
wip/j12-edge-update-v2
nix-package
status-crash-loop-237
fix-dev-test-failures
fix-fixture-socket-path
wip/mesh-relay-220-pre-dev-advance-rebase
fix-canvas-side-clip
research-head-to-head
frosted-real-256
review-mesh-pins-258
wip/mesh-relay-220-pre-final-rebase
review-layout-per-tab-250-r2
broad-suite-triage
nix-devshell
review-status-crash-loop-237-r3
wip/nix-devshell-pre-p3
taste-frosted-real
wip/code-serve-demo-2026-10-30
wip/code-serve-glass-2026-10-30
wip/code-serve-clusters-2026-10-30
wip/code-merge-release94-dev-2026-10-30
wip/rproxy-delta-scratch-2026-10-30
wip/stale-note-257-staged-2026-10-30
wip/d241-size-staged-2026-10-30
review-broad-suite-207
wip/mesh-pins-258-pre-split
wip/mesh-relay-220-pre-rebase
mesh-measure-220
plan-211-update
review-edge-autoupdate-r3
perf24-reconnect
review-stale-note-r2
release-prod-live
d241-shell-marker
review-mesh-pins-server-258
review-revocation-r3
review-setup-token-r2
review-sync-journal-r3
wip/review-mesh-pins-258-prune-review-1995fee46
frosted-scroll-256
sync-journal-r3
revocation-per-account-wip
review-tokio-asyncfd-0386
review-sync-p3s
wip/stash-8by64-stash0-2026-10-30
mesh-drag-r2
setup-token-data-wip
release-9-4
auth-busy-1013
mesh-view-overlap
sync-p3s
review-auth-busy-wake
review-readd-r8-wip
mesh-drag-bounds
audit-auth-93
app-windows-stream-start
review-authority-cap-r3
app-windows-r7-measure
readd-minimal-r6
readd-minimal-r5
app-windows-r7-soak
readd-minimal-r4
app-windows-r7
app-windows-r6
readd-minimal-r3
readd-minimal-r2
readd-minimal
merge-release8-dev
review-busy-page-liveness-r2
review-busy-page-liveness
mesh-view-trim
review-authority-read-retry-r2
review-remove-uninstall-r2
release-retry-reattach
release-retry
review-remove-uninstall
review-authority-read-retry
app-windows-ship
mesh-autoswitch-p2
mesh-ssh
mesh-relay
mesh-macos-node
screen-and-control
session-labels
review-real-logins-r5
review-real-logins-r4
review-real-logins-r3
shim-memory-r2
review-real-logins-r2
shim-memory
shadow-addhost-instant
shadow-real-logins
shadow-same-session-flood
shadow-prod-perf-fix
hosts-from-server
app-windows-real
app-windows-transport
release-prod-6w
mesh-policy-verify
quiet-close-toast
dev-merge-r4
review-mesh-agent-transport
review-app-windows-transport
settings-roundtrip
review-release-pipeline-r4
mesh-agent-transport
ended-strip-fix
review-audit-ca-update-d244
settings-rows
phone-width
signout-clear
fix-restart-tests
dev-merge-rp
signer-hardening
review-audit-ca-update
terminal-fidelity
review-audit-ca-update-wip
mesh-integrate
review-mesh-agent-transport-515d3712
review-mesh-dataplane-feec1988
mesh-dataplane
signout
research-canvas-node
wip/review-renderer-cost
wip/review-terminal-fidelity
padlock-glyph
review-release-pipeline-2e95b689
phone-polish
sidebar-polish
inbox-generic
review-mesh-dataplane-378d4055
prod-batch
ui-inbox
ui-ca-unlock
ui-machine-sections
review-mesh-dataplane-a5f744fb
tls-session-prod
session-bounds-prod
fix-dead-session
session-bounds
tls-session
palette-polish
shortcuts-d222
research-appmeta
phone-gutter
ui-centre-button
wip/ui-centre-button
wip/tls-session
review-addhost-breakit
ui-platform
renderer-cost
remote-agents
mesh-api
ssh-bootstrap
prod-hotfix2
prod-fixes
review-remote-agents
review-mesh-dataplane
session-life
research-browser
review-mesh-api
research-capture
review-mesh-api-round3
review-mesh-api-round1
gate-stability
review-gate-stability
review-relay-direct
review-mesh-api-findings
proto-sessions
font-picker
proto-addhost
proto-windows
mesh-core
latency-gate
research-bsd
research-discovery
keytray-mods
mock-core
ui-tweaks
fix-motion-sel
fix-motion
integrate2
fix-robust
t-web
t-server
vt-ghostty
fix-snap-echo
t-web-auth
review-vt2
t-agent
lane-protocol
lane-shim
lane-auth
s1-base
s1-contracts
s1-workspace
No results found.
No labels
launch-qa
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
kayg/infraternal#236
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Owner report (production, 2026-10-17), relates to #201.
After adding minipc01 the Mesh view shows two nodes, "server" and "mesh-c10909d1-6e81…", both "no tags · offline". On the production server
infraternal mesh peersshows node 3 = 10.254.0.3, endpoint 10.69.69.217:47823, path Direct, ~925 KB RX/TX;infraternal mesh statusshows State On, Peers 1.The view lies about state (TASTE: "Status tells the truth everywhere") and names the host by an internal id (TASTE: "Machines are called by their names").
Goal:
Branch: mesh-view-truth, base origin/dev
895bcdd23.Start: branch
mesh-view-truth, base origin/dev895bcdd23.Findings (code evidence):
crates/plugins/mesh/src/api.rsdecode_hostsetslive = last_seen within 30 s.last_seenis only written by themesh.node.observeaction (observe_node), and nothing in the server, the infraternal agent or the web app calls that action (grep: only tests, the descriptor and the protocol client). So every node islive:falseforever, andprotocol.tsmapslive:falseto "offline". The live WireGuard state thatinfraternal mesh peersprints (handshake time, RX/TX counters, read via netlink innode_actions.rs) never reaches the Mesh inventory.crates/plugins/mesh/src/store.rsStore::attachinserts a new node asformat!("mesh-{host}"), wherehostis the channel id (the host record UUID); the server is inserted as "server". Nothing renames it later. The host record's name (the part after@inremote_host_bootstrap.address, the same name the host inventory and the pills use) is never consulted, and the infraternal agent does not report a hostname at all (host facts have no hostname field).Production, read-only (
infraternal mesh status|peerson monitor01, 2026-10-17): State On, Peers 1, node 3 = 10.254.0.3 at 10.69.69.217:47823, Direct, RX 5224248 / TX 5414024 bytes, i.e. traffic flowing while the view says offline.Plan: (a) server-side presence kept in memory from the server's own WireGuard device (recent handshake => online, path direct) plus the server node itself while its mesh is On, pushed to viewers as a resync only on transitions (no DB write, no audit row, no revision bump per poll); (b) nodes named from the host record, falling back to a new
hostnamehost fact, and placeholder names replaced on the next attach; (c) client mock "today" mode sendspath, as the server now does.Finish (job): branch
mesh-view-truth, head183f72394bc6e7cad95dc19fb93e02ad1826d491(base895bcdd23). Not merged, not deployed.Commits:
19dbe843fhost-facts: report the machine's hostnamed0ec83deemesh: name nodes after their machines (host record name, else reported hostname; placeholdersserver/mesh-<id>renamed on next attach; a person's rename kept)6ecee6e73mesh: presence from the server's own WireGuard device (server online while its Mesh is On; peer online +path:"direct"while handshake ≤ 180 s; 5 s poll on the server only; in memory; viewers get one resync per transition)81a59c62btracer: test double sendspathlike the server; spec + captures5fd55e584lint fixes;183f72394revocation test double answers host.facts.readTests written first and shown failing without the fix (rename/overlay disabled):
placeholder_names_become_the_machines_namesleft["server","mesh-00000000-…"]vs right["monitor01","minipc01"];nodes_the_server_sees_are_online_…livefalse vs true.scripts/verify fast(second run, at5fd55e584), verbatim:remote_mesh_revocation_tests::committed_host_revocation_pushes_peer_withdrawal_without_pollingwas mine (strict test double, fixed in183f72394; rerun passes).restart_open_liveness_review::responsive_socket_survives_a_held_terminal_open_with_an_existing_attachmenttimed out under host load ~50; rerun alone 3/3 ok (1.2–1.5 s, load ~21).Browser:




mesh.spec.ts32 passed, 1 failed (snap-fitglide 260.5 ms vs < 260, timing under load; arrow drag, untouched here). Captures (test double,?meshserver=today), ink/paper, 1440 and 393:Deploy: needs a server deploy (Rust: mesh plugin), not web-only. Naming of minipc01 works from its host record if it was added by name; if it was added by IP, the hostname fallback also needs the new infraternal agent on minipc01. The server node becomes "monitor01" via the server's own (embedded) host facts on the new build. No migration; placeholders heal on the next attach (server restart / host reconnect).
Break-it review (Opus) started on
review-mesh-view-truth, baseorigin/mesh-view-truth2b527330f(dev895bcdd23). Focus: node naming authority, hostname leakage, stale presence, poll and fan-out cost, web compat.Break-it review (Opus): mesh-view-truth
2b527330f— HOLD (P1 3, P2 4, P3 4)Failing tests are on
review-mesh-view-truth(ceeba04dc), incrates/plugins/mesh/tests/review_mesh_view_truth.rs.cargo test -p infraternal-plugin-mesh --test review_mesh_view_truth→ 6 failed, 0 passed, 1 ignored (measurement).P1
minipc01and attaches first takesminipc01. The host the owner added asroot@minipc01becomesminipc01-2. After the upgrade every node is still a placeholder, so the reattach race decides names, and any compromised host can squat another machine's name.a_host_record_name_beats_another_machines_reported_hostname: leftminipc01-2, rightminipc01.a_remote_machine_cannot_take_the_servers_hostname: the server becamemonitor01-2.serveronce the server has renamed itself.a_remote_machine_cannot_be_called_server.observereturnsNoneon any call failure, andrunkeeps the last reading with no age limit.Clearfires only when the worker ends. A peer read at handshake age 175 s is stillliveonce that handshake is past 180 s.a_peer_does_not_stay_online_past_its_session_when_the_server_node_stops_answering.P2
A hand-set name equal to a placeholder is overwritten. "Placeholder" is decided by
name == "server", with no hand-set flag. If the owner renamesmonitor01back toserver, the next attach reverts it, and no audit row is written for the automatic rename.a_hand_set_name_equal_to_the_placeholder_is_kept: leftmonitor01, rightserver."Never an IP" has gaps.
root@fe80::1%eth0→fe80;root@10.69.69→10.an_address_that_is_an_ip_never_becomes_a_name.The poll costs milliseconds, not the "microseconds" in the module doc. Measured on the perf VM (4 vCPU, idle, flock held, 2 runs), userspace only: the
mesh.peerspaging as node_actions builds it (8 KiB pages, re-encode after every row, rescan to the cursor) plusread_peers.The real poll costs more:
Fan-out holds the shared
mesh_workpermit across socket sends. Production has 1–2 permits, and node coordination shares them. Every presence transition now runs a fullread_snapshotand a send per viewer under that permit, so a backed-up viewer delays config delivery to every host. Found by reading; no test.P3
hostnamewithoutbound_label, unlike every other fact.received_bytesthat stop moving under 25 s keepalives would detect it in about 30 s.Checked and fine
validate_name, which allows only ASCII[a-z0-9-], at most 63 bytes.nowuse the same wall clock."direct").HostFacts, so an old server with a new agent is fine.Review branch done: review-mesh-view-truth @
41500064fscripts/verify fast(exit 1). The only failures are the six review tests, which are meant to fail:Start (fix of the break-it review): branch
mesh-view-truth, base2b527330f+ review commits cherry-picked (head051e82adf). One commit per finding, citing #236.Fixes for the break-it review: mesh-view-truth @
8272bf635Base:
2b527330f. The review commits were cherry-picked first (997aff5f2,98179032c,051e82adf). Not merged, not deployed. Deploying it needs a server deploy and runs migration 0026.37b7678b5%25), shortened IPv4, or an all-digit label. These fall back to the hostname, else "unnamed".6500004f7name_source, ranked hand > server > record > reported > placeholder. A name set by hand is never overwritten, even when it is "server". The name the owner gave a host record beats any reported hostname. A reported hostname also yields to the record names of every other host. Remote machines are never named "server". The server's node takes the server's hostname when it attaches at startup, and that name outranks any claim from a host. In a collision the weaker claim gets the suffix. Every automatic rename writes amesh.node.nameaudit row.aa0b67180599af1888mesh.peers: one kernel dump per listing (later pages reuse it for up to 2 s). Pages are filled in linear time. New compactpresence:truerows.c443c980bTracker: if a reading is older than 15 s (two missed polls), nothing shows as online. The session window is checked against the age of the data. A peer with a keepalive is offline once its received bytes have not moved for 2×keepalive + 1 poll (55 s at 25 s). Two intervals so that one lost keepalive does not flap the peer. The poll runs every 5 s and no longer runs again on each revision.8272bf635P3-10: the hostname already goes through
bound_label(viaos_text), so no change was needed.All 6 review tests pass. New tests:
tests/naming.rs(a squatter yields to a host added later and both renames are audited; reported hostnames are hidden from a non-owner) andpeer_page_tests(every peer listed once, every page fits the frame, the compact form uses ≤⅓ of the pages). The presence unit tests now cover silence, expiry and the watch.Poll cost (perf VM, 4 vCPU, idle, flock held, 2 runs)
Kernel peer dump (
wg show dumpin a netns with real peers, net of process launch): about 1.5–2.6 ms at 500 peers and 2–3.3 ms at 1000. It now runs once per poll, where it used to run once per page (27 and 54 dumps).Size: still over the D301 cap
x86 +19,200 B (21,356,464 vs 21,337,264), ARM +12,992 B (19,545,352 vs 19,532,360). This is real growth, not registry-path noise. My first version was +38,656 / +27,456. To halve it I replaced the per-candidate queries with a pure naming planner (two queries per attach), merged the presence resync into the shared resync path, and parsed presence pages without a typed decoder. Symbol diff against the base: about +12 KB of text for naming, +3 KB for socket, +2.7 KB for the presence loop, +1.4 KB for paging. The caps are not raised. This needs a decision: accept the growth, or schedule a trim elsewhere.
scripts/verify fast(head8272bf635), verbatimBreak-it delta review round 2 (Opus) started on
review-mesh-view-truth-r2, baseorigin/mesh-view-truth6df86d28c. Focus: prior findings fixed or not, migration 0026 upgrade/rollback, suffix stability across restarts, 55 s / 15 s presence timing.Break-it delta review round 2 (Opus): mesh-view-truth
6df86d28c, HOLD (P1 0, P2 2, P3 5, plus 1 deploy gate)Failing tests are on
review-mesh-view-truth-r2(head17016a765), incrates/plugins/mesh/tests/review_mesh_view_truth_r2.rs. Runningcargo test -p infraternal-plugin-mesh --test review_mesh_view_truth_r2gives 7 failed, 2 passed. The 2 passing tests are evidence tests, namedevidence_*. The round-1 tests (6) andnaming.rs(2) all pass on the branch.Prior findings
a_host_record_name_beats_…passes. A reported hostname yields to every other host's record, enrolled or not.mesh.node.nameaudit rows are written.DUMP_REUSE2 s), linear pages, andrunsleepsPOLLonly, with no rerun on each revisiona_viewer_without_host_facts_…passesbound_labelevidence_a_silent_peer_with_a_fresh_handshake_is_offline_within_a_minute: offline 55–60 s after the last byte; one lost keepalive does not flap itNew P2
a. A Mesh manager can hand-name a remote machine
server, and non-owners then see twoservernodes.server, so the unique index blocked the name.monitor01in the database, and non-owners see it relabelled asserver.mesh.manage_nodesholder can rename a machine toserver. A non-owner then cannot tell the two apart. The DNS nameserver.<suffix>also points at the impostor.no_viewer_sees_a_remote_machine_called_server: left 2, right 1.b. The 55 s quiet rule trusts the server's own keepalive setting as evidence that the remote also sends.
persistent_keepalive_secsin the row is the server's peer entry.849c6c50e(#129, 2026-10-11), or any peer without one.an_idle_healthy_peer_without_its_own_keepalive_stays_online: offline at 60–115, 180–235, 300–355 s.New P3
a. A node moved aside takes a suffix of the claimant's name, so it renames again on its next restart.
web, so C becomesweb-2. The owner then adds the realweb-2by name.web-2-2, and on its next attach it becomesweb-3. That is one extra DNS change and one extra audit row.a_node_moved_aside_keeps_its_name_on_its_next_attach: left("web-3", 2), right("web-2-2", 1).b. A person cannot take a name a machine reported.
mesh.node.renamereturnsConflictinstead of moving the automatic holder aside, which contradicts the rank hand > reported.unnamed, reported that hostname.a_person_can_take_a_name_a_machine_reported:Err("Conflict").c. Hidden hostnames give non-owners duplicate names.
unnamedfor them.a_viewer_without_host_facts_still_sees_distinct_names:["server","unnamed","unnamed"].d. Hex IPv4 spellings become names.
root@0x0a.0x45.0x45.0x05gives0x0a.inet_atonand ssh accept this spelling as an address.a_hex_ipv4_spelling_never_becomes_a_name.e. A reading expires after up to about 20 s, not 15 s.
NodeBridge::callhas a 5 s timeout, and the loop is poll, then sleep 5 s.Migration 0026, suffix stability, rollback
Upgrade (evidence test passes). The test database is at v25 and holds:
servermesh-<host id>placeholdersminipc01on a by-IP host, whose name collides with another host's recordroot@minipc01After the migration:
placeholderhandFirst attach round, in an unlucky order (the colliding host first, the server last):
monitor01,minipc01-2,minipc01,lab07Second attach round in reverse order: no rename and no new audit row.
nameisCOLLATE NOCASE, so the placeholder match ignores case.Suffix stability:
web, or two records ofpi) stay with whichever node holds the name. A restart in any order changes nothing.Deploy gate (not a defect in this branch's code).
the_previous_release_starts_on_a_database_this_release_migratedfails withVersionMissing(26): the previous binary refuses a database that 0026 has migrated. D295 restores the database copy, but its implementation (#211) is not in dev.scripts/release/deploy_remote.pyon this base restarts the previous binary on the live database ("automatic rollback keeps its data"). So a health failure after 0026 ran ends in "rollback requires operator recovery" with no server running. Either deploy after #211 lands, or have the manual restore ofbackups/<stamp>/ready.Rollback with the copy is safe. The copy is taken before the switch, and 0026 is additive: ADD COLUMN with a default, plus one UPDATE.
Caveat. A database that ran the first build of this branch (
2b527330f, which renamed placeholders automatically) would have those automatic names markedhand. Prod did not run it. Staging and preview databases might have.scripts/verify fast(head17016a765), verbatimExit 1. The only failing binary is the round-2 review tests, which are meant to fail. cargo stops at the first failing test binary, so test binaries after it did not run in this gate run. The branch's own gate had them passing.
HOLD: P1 0, P2 2, P3 5, plus 1 deploy gate.
Round-2 fixes started (Claude, Opus) on
mesh-view-truth, base6df86d28cwith the round-2 review tests cherry-picked (0a2fcfed2,951f5c03e). Plan: one commit per finding (P2-a, P2-b, P3-a … P3-e); the deploy-gate test is marked as a deploy gate, not a code defect, because production deploys go throughdeploy-prod.sh, which restores the full/var/lib/infraternalcopy on a failed health check.Round-2 fixes done (Claude, Opus):
mesh-view-truthheadea6ed45e3Base
6df86d28c. Round-2 review tests cherry-picked (0a2fcfed2,951f5c03e). One commit per finding:a78f1d790server, or the server node's current name, to a remote machine through rename or enrol. The refusal is a newReservederror ("reserved for the server"), and the Mesh view says "that name belongs to the server". The server's node itself can still take either name.615ec1debf0340fae8mesh_nodes.name_claim. A node that is moved aside goes straight to the next free suffix of its own claim (web-3). A node that already holds a free suffix keeps it.b101071e1make_room: a person's name now moves an automatic holder (record, reported or placeholder) aside, and the move is audited asmesh.node.name. The moved node's viewers are notified. Only another person's name still refuses, with a bare conflict. That refusal reveals nothing a member cannot already read from DNS.8670fcfa0unnamed-<node id>. These labels are stable and distinct.unnamed/unnamed-<n>are kept out of all real names (hand and machine).96ea67537machine_namerefuses every IPv4 spellinginet_atonaccepts: 1–4 parts in decimal, octal or0xhex, with an optional trailing dot.669f180f0f198d5eeathe_previous_release_starts_on_a_database_this_release_migratedis marked#[ignore]with its reason. It still runs with--ignored.ea6ed45e3make_room, and attach shares one node read with it: −3.8 KB.Deploy note: production deploys use
deploy-prod.sh. It copies all of/var/lib/infraternalbefore the switch and restores that copy (withinfraternal.prev) when the health check fails. So rolling back 0026 and 0027 is safe there. Both migrations are additive.Review tests:
review_mesh_view_truth_r2has 8 passing and 1 ignored. Round-1 review tests: 6 of 6.naming.rs: 4 of 4 (2 new). Presence unit tests: 3 new or rewritten. Mesh UIbun test src/canvas/mesh/: 36 pass.tscclean.Size: over the cap, not raised
x86 +16,224 B (21,372,688 vs 21,356,464), ARM +9,312 B (19,554,664 vs 19,545,352). This is real code: naming planner helpers,
make_room, the IPv4 spelling filter, presence window. It is not registry-path noise. This needs a decision: accept it or schedule a trim.scripts/verify fast(headea6ed45e3), verbatimBreak-it delta review round 3 started (Claude subagent).
review-mesh-view-truth-r3fromea6ed45e3(head ofmesh-view-truth)6df86d28c..ea6ed45e3(round-2 base6df86d28cconfirmed bygit log; fix commitsa78f1d790..ea6ed45e3)Round-3 delta break-it review of
mesh-view-truth(#236): HOLDBase:
6df86d28c(round-2 base, confirmed bygit log). Head reviewed:ea6ed45e3. Review branchreview-mesh-view-truth-r3@93e22b904, test filecrates/plugins/mesh/tests/review_mesh_view_truth_r3.rs. All 5 tests fail atea6ed45e3(output below).Counts: P0 0 · P1 1 · P2 2 · P3 3
b101071e1).rename_nodeauthorizesMANAGE_NODESagainst the target's tags only. Thenmake_roommoves the automatic holder of the name, and the holder's tags are added toscopesonly afterauthorize, so they count for the change notice and nothing else. A manager limited todevrenames their dev node tominipc01. The prod node the owner added asminipc01becomesminipc01-2, and the dev node takes the name every node's config carries (Store::config→Node.host). That is a name hijack across scopes. Fix: authorize against the union of the target's tags and every moved node's tags (require_each_scope), or refuse the move when the actor can't manage the holder.a_scoped_manager_cannot_rename_a_node_outside_their_scope_by_taking_its_name: the direct rename of the prod node isDenied, but taking its name returnsOk(())and the prod node becomesminipc01-2.Reservedlets a non-owner confirm the server's hidden hostname (a78f1d790). Non-owners see the server's node only asserver(decode_host).make_room's own doc says a name a machine reported "never refuses anything", so a refusal is no oracle. Yet renaming a node to the server's real hostname answersreserved for the server, while a wrong guess succeeds. One call confirms a guess, and a second rename undoes it.a_non_owner_cannot_confirm_the_servers_hidden_hostname:monitor01→Err(Reserved),monitor02→Ok(()).615ec1deb). Received bytes now count only towards online, never towards offline. A host that sends a keepalive every 25 s and dies early in a session stays online until its handshake leaves the 155 s window. Round 2 recorded this as the owner's case: 55–60 s. The peer's habit is observable: its bytes moved every keepalive before it died. So the quiet rule could still apply to peers that showed their own keepalive, and quiet peers would not flash.a_dead_peer_that_sent_its_own_keepalives_is_offline_within_a_minute: "offline 155 s after its last byte (late in the session: 60 s)".an_idle_peer_that_started_its_session_stays_online_until_it_rekeys: offline at[160, 165, 330, 335, 340](the second cycle is the test repeating a peer-started rekey).audit_renameswrites the move under the first owner's user id. The log then says the owner renamed the node when another person caused it. The change's ownmesh.node.renamerow (same revision) does name the real actor.a_node_moved_aside_by_a_person_is_audited_under_that_person:["owner"]≠["guest"].deploy-prod.shcopies/var/lib/infraternalbefore the switch and restores it when the 20 s health check fails. The ignore reason is true for that path. A deliberate rewind later (ALLOW_REWIND=1to the previous SHA once a bug shows up in production) takes its backup after 0026/0027 ran. The old binary then hitsVersionMissing(26), health fails, and the script puts the new binary back. The rewind is impossible without hand-picking an older backup, which loses data, or hand-editing_sqlx_migrations(both migrations are additive, so that is safe). The ignore reason should say so, or a runbook line should. Not a code defect in this branch.--include-ignored:Err(VersionMissing(26)). Script lines: backupcp -a /var/lib/infraternal/. $B/aftersystemctl stop, restore of the same$Bon failure.Checked and sound (no finding):
nameisUNIQUE COLLATE NOCASE,validate_nameallows only[a-z0-9-], and the case/unicode bypasses are closed.IMMEDIATE) transactions, so they are serialized.free_namewithtaken, and the 61-character stem.is_ipv4_spellinghandles hex, octal, shortened and trailing-dot forms.0xygenstays a name.unnamed-<n>is refused for hand, record and reported names. Hidden viewers see distinct labels.ADD COLUMNonly. Neither 0026 nor 0027 is on dev orrelease-prod-live, so no legacy suffixed rows have a NULL claim.MANAGE_NODES, somake_room(None, ...)adds no scope bypass there.Gate (
scripts/verify faston93e22b904), verbatim:Test FAIL = exactly the 5 review tests above (expected on a review branch). Static builds FAIL = size: x86_64 +16,224 B, aarch64 +9,312 B over cap, within the D301 exception for #236. No unexpected bloat.
Round-3 fixes started (Claude subagent). Branch
mesh-view-truth, baseea6ed45e3; review tests cherry-picked from93e22b904asf10eb654e. Plan: P1 make_room authority, P2 reserved oracle, P2 keepalive fast-quiet rule, P3 responder gap (if cheap), P3 audit actor, P3 rewind runbook note.Round-3 fixes done. Branch
mesh-view-truth, head6cc36bcac(baseea6ed45e3), pushed.93e22b904(unchanged, all 5 pass)f10eb654ed1ad5c08arename_nodeauthorizes every moved holder's tags as for a direct rename; without that it refuses as a bareConflictand the transaction is rolled backe5f8b31d8serveris reserved. The server's hostname is an automatic name: a person's choice moves the server's node to<hostname>-2, which stays across restarts. Wrong and right guesses answer the same. DNS trade-off is explained in the commit.naming.rsexpectation updated (it encoded the round-2 rule).5871e9ea3handshake_windowis removed. Round-2 tests pass unchanged.36f28a980_sqlx_migrationsrows aside, then restoring them before rolling forward (SQL checked against SQLite)6cc36bcacSize (D301, caps not raised): x86_64 21,374,576 B, +18,112 over the cap (was +16,224, so this round adds +1,888 B). aarch64 19,556,360 B, +11,008 over the cap (was +9,312, so +1,696 B).
scripts/verify fast, verbatim:The static builds row fails only on the size caps (the known D301 overage, not raised). Log: ~/.cache/codex-scratch/mesh-view-truth/verify-r3.log
Round-4 delta review started on review-mesh-view-truth-r4, base/head
6cc36bcac(delta ea6ed45e3..6cc36bcac). Read #236 and reviewed parent #201 history; continuing the round-3 findings. Focus: refusal/rollback visibility, server-name authority and DNS, keepalive classification/restart, migration rewind SQL. Test-writing audit only; no deploy.R4 P2 reproduced: scoped managers still confirm hidden reported hostnames.
a_scoped_manager_cannot_confirm_a_hidden_reported_hostnamefails on6cc36bcac: correct hidden prod hostname -> Err(Conflict), unused guess -> Ok(()); prod node absent from dev manager's filtered list. Browser users need not be Mesh members (D123/D163), so private DNS is not an equivalent prerequisite. Path: api.rs:1041-1056.Controls: 3 pass (rollback preserves both names/audit/revision/no notification; server move requires server rename authority and suffix is stable; exact runbook SQL works with real SQLx metadata and v25/current migrators). No partial write or server authority bypass found. Test commit follows after lint.
API regression receipt
R4 steps committed and pushed only to review-mesh-view-truth-r4:
baebb2b05: hidden-name oracle regression (1 expected failure), rollback and server authority controls pass.a203879c9: P2 keepalive inference regressions (2 expected failures). A real kernel fixture with BOTH peers set to 25 seconds keeps server RX fixed at 212 from sample 30 through 105 while client RX grows 92 -> 124 -> 156 -> 188. Decreasing underlay delay lets authenticated server keepalives rearm the remote timer before it fires. Tracker incorrectly reads offline at logical [90,95,100,105]. This disproves the claim that false offline is limited to pre-#129 peers. The passive-reply case also fails at logical 70..125 (same inference finding). Functional counter evidence on Linux 6.12.111, not performance/timing acceptance.03e6a0f3d: P3 counter-reset regression (1 expected failure). After learned RX 1000 -> 1032, observe handshake=0/RX=0, then a fresh handshake/RX=180. The removed peer's habit persists and the live quiet replacement reads offline at logical 95..155. Reset must retire state independently of improving the inference.Fmt and touched Mesh all-target strict clippy pass. Full fast gate pending. No production changes. Kernel fixtures used private namespaces and ephemeral keys held only in memory; all three runs ended, no fixture process remains. Constant-delay controls did not reproduce suppression; the varying-delay fixture did.
Presence regression output · Public kernel counters and reproduction source, including controls
R4 P3 follow-up: the runbook SQL works but names chosen while rewound are lost after rolling forward. The earlier SQL-only control was extended to reconnect the node;
a_name_chosen_while_rewound_survives_rolling_forward_and_reattachingfails (actual minipc01, expected during-rewind). The previous release at895bcdd23api.rs:983 updates only name; the unknown name_source/name_claim columns keep record/minipc01. Restoring migration rows does not reconcile those columns, so attach overwrites the newer human choice. SQL defaults apply to inserts, not these updates. Both migrators and checksum restoration pass before the final failing assertion.The runbook control commit
4692b5016is pushed; a separate semantic regression extends it. Earlier reviews/naming tests freshly rerun: 23 pass, 1 documented ignored rewind gate, 0 fail. Fmt and touched Mesh strict all-target clippy pass. Final head fast gate now running.Runbook and scoped-name output
Completed and pushed
8e407051ab: the rewind semantic regression (during-rewind is overwritten by minipc01 after attach). This extends the SQL-only control from4692b5016; it is now named a_name_chosen_while_rewound_survives_rolling_forward_and_reattaching and intentionally fails. Five review assertions fail across four findings: P0 0, P1 0, P2 2, P3 2. Two R4 controls pass; earlier review/naming cohort 23 pass/1 documented ignored. Final head scripts/verify fast is active through the host build slot (fmt, VT fmt and CLI compile-out passed; workspace clippy in progress). No implementation, dependency, contract or UI change. Verdict will follow the gate; under D206 these severities are fixes to carry forward, not a P0/P1 merge block.Stronger R4 P2 kernel control on unchanged head
8e407051a: BOTH persistent intervals are 25 seconds from peer creation; no interval change. Install server peer first, client one second later to avoid competing initial handshakes. Under varying server-to-client delivery delay, server RX 180 -> 212 at sample 30, then fixed through 105; client RX 124 -> 156 -> 188 -> 220. This is the same failing Tracker sequence at logical [90,95,100,105], with the initial interval=0 removed. A separate simultaneous-start control had competing handshakes and later RX movement at 65, so did not reach the threshold within its window; retained in the archive. All fixture processes have exited. Functional counters, no performance claim.Both current-peer runs, reproduction sources and empty stderr receipts
Head fast gate: workspace clippy PASS, tests fail only the three intentional presence tests (Cargo stops at that binary), cargo-deny PASS, static builds in progress. The other two intentional failures and two passing controls are in the focused API/runbook receipt above.
Finish — R4 delta review: MERGE under D206 (no P0/P1; the findings below are fixes to carry forward). P0 0 / P1 0 / P2 2 / P3 2.
Reviewed
ea6ed45e3..6cc36bcac. Review head8e407051abc90b7790118bb2a6a68fcdbfe109c0, pushed only toreview-mesh-view-truth-r4. Five atomic test commits; no implementation, dependency, contract or UI change.a_scoped_manager_cannot_confirm_a_hidden_reported_hostname: hidden prod hostname ->Err(Conflict), unused name ->Ok(()), although prod is absent from the scoped viewer's list. Browser users need not have private Mesh DNS (D123/D163).a_peer_with_25_second_keepalives_stays_online_when_server_keepalives_suppress_its_sends: false offline at logical[90,95,100,105]. Real kernel control has both intervals at 25 from creation, server RX fixed at 212, client RX growing 124 -> 220. Authenticated server keepalives suppress remote sends under varying delay (kernel timer behavior).a_passive_keepalive_does_not_turn_later_silence_into_a_false_offlinealso fails (same inference finding).a_counter_reset_discards_the_previous_peers_keepalive_classification: RX 1000 -> 1032 -> 0, handshake 0, then a new live session. It inherits keeps_alive and incorrectly reads offline at logical 95..155.a_name_chosen_while_rewound_survives_rolling_forward_and_reattaching: both runbook SQL blocks, both migrators and checksum restoration succeed; the old release's name-only UPDATE leaves record provenance, and the first current attach overwritesduring-rewindwithminipc01.Evidence: API and runbook failures, presence failures, current-peer kernel reproduction, sources and control. Kernel receipts are functional observations, not performance measurements.
Controls: refused move preserves names, audit count, revision and notifications; server-name move needs direct server rename authority and survives reconnect. Earlier naming/R1/R2/R3 tests: 23 pass, 1 documented ignored, 0 fail (receipt). R4: 5 expected failures, 2 passing controls. Cargo stops the full workspace test run at the first R4 presence binary; later binaries are not claimed to have run in that gate.
Reviewer checklist: additive contracts and actions untouched; no new parser/engine/dependency; authorization and transaction boundaries exercised on the real schema; no production performance path changes; evidence outside the checkout.
Static comparison: x86 21,374,576 B, ARM 19,556,360 B; both byte-identical to the reviewed
6cc36bcacartifacts (0 B delta). Static FAIL is only the existing D301 cap overage (+18,112/+11,008 B); no unexpected bloat. Static trust/linkage/metadata and x86 key-memory checks pass. ARM runtime key-memory check is not executed on x86. Later TypeScript stages are not reached after Rust fails; no TypeScript changed.scripts/verify fastat the review head, exit 1, table verbatim:Full fast transcript · Final findings, size/hash comparison, focused logs and cleanup proof.
Cleanup complete: own build target and generated Python cache removed; no kernel fixture process remains; checkout clean; origin head matches. No deploy, no issue closed. Local findings:
/home/kayg/.cache/codex-scratch/review-mesh-view-truth-r4/findings.md.R4 fixes start: branch mesh-view-truth-r4-fixes, base
6cc36bcac, review head8e407051a. Read #236 history and parent #201; continuing the four recorded findings. Will cherry-pick the five review commits, reproduce failures, fix names/presence/rewind in logical commits, run head fast gate and compare static size. No deployment.Contract proposal before implementation: globally unique node renames require unscoped mesh.manage_nodes, as enrollment already does. Target-tag authority alone cannot provide identical answers for a hidden occupied name and an unused name while preserving uniqueness and authority over moved nodes. Check global authority before inspecting names; return Denied for scoped callers regardless of the requested spelling. Global managers can already rename automatic hidden holders directly. Reject silently suffixing the requested name (the suffix exposes the collision) and moving an unauthorized holder (round-3 authority regression). Update contracts/mesh-api.md and permission controls with this explicit restriction.
Presence choice: remove inferred sending classification entirely; a 32-byte receive cannot promise future peer sends, even with both configured intervals at 25 s. Preserve the full 180-second session window and stale-reader expiry. This also eliminates inherited classification on counter resets. The <=60 s death target cannot be guaranteed from these passive observations without false offline; prior timing-only assertions will be revised explicitly, with no-flapping tests retained.
Cherry-picked all five R4 test commits as
2b0eee1af,3917164ca,c6ef0ef20,fe86865bc,8ede27104. Reproduced all five failures on unchanged implementation: 3 presence failures and 2 API/runbook failures, with 2 passing controls. Kernel-derived sequences fail at logical seconds 90..105 (suppression), 70..125 (passive reply), 95..155 (reset). These are simulated protocol ages, not host timing measurements.Presence red receipt; API/runbook red receipt.
Contract step
c226640f5committed and pushed to mesh-view-truth-r4-fixes: document global node-management authority for renames, checked before name lookup. Scoped observe/delete retained. Fmt check passes. Implementation and role/source matrix are under per-step checks; no deployment.Naming fix
fbfe4de60committed and pushed to mesh-view-truth-r4-fixes (contractc226640f5). Global mesh.manage_nodes is checked before target/name lookup; scoped callers get Denied for every spelling. Automatic holders still yield to global managers; affected tag scopes still drive notifications. This intentionally narrows scoped rename, rather than changing uniqueness or moving unauthorized nodes.Fmt and strict all-target clippy for mesh/server pass. Naming/R2/R3/R4 cohort: 21 pass, 1 documented ignored, rewind regression excluded pending its step. Server Mesh API: 34 pass, 2 documented ignored. Added 32 refusal assertions across 4 name sources and 4 role combinations, including combined scoped node roles plus global access to another action. Per-step gate.
Completed and pushed:
d063ae61a: remove unsound keepalive classification and movement history; retain only the latest handshake per peer. Reset/recreation cannot inherit classification. Full 180-second session window prevents the R4 healthy-peer false offline. Explicit trade-off: dead peers may remain online up to 180 seconds plus a poll; the <=60-second target cannot be inferred safely from these counters. Only the two incompatible R2/R3 death assertions changed; their no-flapping controls and all three original R4 presence tests remain.0c743f423: rewind runbook snapshots names and revision; rolling forward reconciles changed names and audited rename choices to hand provenance, including same-spelling choices. Untouched automatic names retain provenance and still follow later record changes. SQL uses one audit scan rather than one per node. No new migration or runtime work.Per-step fmt/strict all-target mesh clippy pass. Full default-feature Mesh crate: 77 pass, 1 documented ignored; final API/runbook cohort after SQL refinement: 6 pass. Mesh gate, runbook gate. Real migrated SQLite used; no UI/parser/dependency changes.
Rebuilt merge base
6cc36bcacwith the standard static recipe: stripped x86_64 21,374,576 B, exactly the reviewed size, SHA-256 1ad4e80537f58c15eae64d6ddec8acffedf9f68cd0b5c9733d2b600e0534e06a. Baseline recipe receipt. Head scripts/verify fast is running through build-slot with TRACER_TEST_PORT=4296. Caps unchanged, no deployment.Head
0c743f423milestone fast gate: fmt, VT fmt, CLI compile-out and workspace clippy pass. Tests stopped at agent_daemon because the INFRATERNAL_TEST_STATE_ROOT I supplied made a Unix socket path 119 bytes long (limit <108). This is a job environment error, not a product change or a host-load exception. Prepared a short job-owned scratch alias; will rerun the complete head gate with it. Exact failure. Static builds still running; no final verdict or release-branch push yet.Author review identified another name path to test before completion: all 8 automatic suffixes plus the fixed mesh- fallback can be occupied, making a hidden automatic name conflict for a global manager while an unused name succeeds. A real-schema regression is prepared; source unchanged until it reproduces. This extends the requested every-role hostname invariant.
Additional #236 hostname invariant reproduced on
0c743f423before changing source: a_global_manager_cannot_probe_a_hidden_name_by_exhausting_move_aside_names fails with hidden guess Err(Conflict), unused guess Ok(()). Real migrated SQLite; 8 hostname suffixes and mesh- occupied. Global node managers still cannot read reported hostnames, so scoped refusal alone did not cover every role. Cause: store.rs move_aside returned the fixed fallback without testing uniqueness. Red regression.Fix under per-step checks: retain the ordinary suffix path and preferred fallback; on exhaustion use a borrowed set of occupied names plus the requested name, then choose a free mesh--. Finite inventory guarantees a free spelling before counter overflow, and generated names fit the existing limit. No new query, engine or dependency. The test also occupies the first generated alternative and verifies stable reattach.
Milestone static sizes at
0c743f423: x86 21,370,896 B (3,680 B smaller than rebuilt6cc36bcac); ARM 19,552,744 B. Both over their unchanged caps under D301; final sizes will include this extra correctness fix. The milestone test row failed only because of the supplied long scratch root; a short scratch alias is now used for the failed daemon test and final gate rerun.Supplemental hostname fix
842e8b0fccommitted and pushed to mesh-view-truth-r4-fixes. move_aside now checks the old fixed fallback and searches free bounded-length alternatives when it is occupied; only suffix exhaustion allocates the borrowed name set. The requested name is reserved too, so the holder can always move without returning a hidden-name-specific Conflict. Source/provenance, audit actor and stable reconnect behavior are unchanged.Fmt, strict all-target Mesh clippy and the full default-feature Mesh crate pass: 78 tests, 1 documented ignored. The added real-schema test passed after first failing with Conflict versus success, including an occupied first alternative and reconnect stability. The real-binary daemon 24-stop integration test now passes with the short owned scratch root, confirming the earlier failure was the environment path. Per-step gate.
Final scripts/verify fast restarted through build-slot on head
842e8b0fcwith TRACER_TEST_PORT=4296 and the corrected root. No release-branch push until that completes; no deployment.Head
842e8b0fcgate environment correction: the short symlink alias passed the daemon test but caused six restart/image-admission tests to reject or canonicalize fixture paths. These are expected safety checks, not product regressions; the earlier long real root passed those 79 CLI tests before hitting the daemon socket bound. Exact alias failures.Replaced only this job's alias with a real 0700 directory at /home/kayg/.cache/codex-scratch/mvtr4. The state path is now short and canonical. No source change. Current static builds are finishing; will rerun full fast with this actual short root. No release-branch push yet.
Size refinement
13e2149fdcommitted and pushed to mesh-view-truth-r4-fixes. The supplemental fallback at842e8b0fcmeasured x86 21,381,712 B, +7,136 B against rebuilt merge base (and +10,816 B against0c743f423). Replaced bulk borrowed-set construction with incremental inserts to avoid its sorting specialization, keeping the same names, lookup behavior, O(n log n) construction bound and ordinary suffix path. No new dependency. Final static measurement follows in the complete head gate; caps unchanged.The real short directory /home/kayg/.cache/codex-scratch/mvtr4/s resolves both environment mistakes: all 79 CLI unit tests pass (1 documented ignored), including all six restart/image cases that rejected the alias; daemon 24-stop integration passes. Fmt, strict all-target Mesh clippy and all 78 Mesh tests pass (1 documented ignored). Per-step validation.
Final scripts/verify fast now runs on
13e2149fdthrough build-slot with the real short root and TRACER_TEST_PORT=4296. Remaining work: complete workspace gate, final static delta, supplemental TypeScript stage if the accepted D301 size row stops the dispatcher, issue receipts and fast-forward push to mesh-view-truth. No deployment.Final head
13e2149fd: workspace Rust tests now PASS with no baseline/load exception; fmt, VT fmt, compile-out, strict workspace clippy and cargo-deny PASS. Static builds still running.Final stripped static x86_64: 21,374,480 B versus rebuilt merge base
6cc36bcac21,374,576 B: delta -96 B. Incremental name-set insertion saved 7,232 B versus842e8b0fcand kept all collision/role regressions green. Cap remains 21,356,464 B, overage +18,016 B under the existing D301 exception (base +18,112 B); no cap change. PT_INTERP absent; production trust/metadata and native key-memory initialization checks pass. Exact recipe, sizes and hashes.ARM build and remaining static checks pending, followed by the standard TypeScript stage because the accepted cap overage stops the fast dispatcher before it. Release-branch fast-forward and final verbatim output comment will follow those checks.
Finish — R4 fixes (#236). Head
13e2149fd8544a0f6f78f183448b5f09597a8c2c, base6cc36bcac. Atomically fast-forward-pushed to bothmesh-view-truthandmesh-view-truth-r4-fixes; remote heads verified. Push, refs. No deployment; issue left open.mesh.manage_nodesbefore name lookup. Scoped callers uniformly receiveDenied; global callers can move hidden automatic holders even after all normal suffixes and the old fallback are occupied. Contract proposed before implementation; scoped observation/deletion retained.All five original R4 failures reproduced before fixing and now pass. R4 cohort: 10 pass. Default Mesh crate: 78 pass/1 documented ignored; CLI: 79 pass/1 documented ignored; real-binary 24-stop daemon test passes. Final workspace tests pass without any load/baseline exception. Author checklist: authorization/transaction/audit/notification boundaries reviewed; existing removable plugin retained; no new parser, wire shape, dependency, engine, query or worker. No UI changes.
Size: rebuilt x86 merge base 21,374,576 B -> head 21,374,480 B, -96 B, same standard stripped static recipe. ARM head 19,555,176 B (reviewed base 19,556,360 B; -1,184 B against that reference). Caps unchanged. Static FAIL is only the accepted D301 overage; trust/linkage/metadata and native x86 key-memory checks pass. Size recipe/hashes.
Final
scripts/verify fast, exit 1, summary verbatim (full verbatim transcript):Static size output verbatim:
The accepted size failure stops the dispatcher before TypeScript; ran the standard
ts_verify_faststage separately: compiler/checks, unit tests, production build, transfer budget and protocol differential tests all PASS. Transcript.How to test:
Denied, without inventory/audit/revision changes.Worktree clean. Removed this job's target, baseline source/artifact and temporary fixture roots; retained evidence outside the checkout. Cleanup receipt.
Round-5 delta review start: branch review-mesh-view-truth-r5, base/head
13e2149fd8; delta 6cc36bcac..13e2149fd. Reviewing global rename authorization across adapters, presence bounds, real-schema rewind SQL, and all R1-R4 regression tests. Size accepted under D301; flag unexpected growth only. No deploy. Findings will be kept in the job findings.md and attached here.R5 finding — P3: hosts first attached while rewound retain UUID names after rolling forward. Committed/pushed regression
18dc39bfdon review-mesh-view-truth-r5; no runtime fix.hosts_first_attached_while_rewound_get_machine_names_after_rolling_forward executes both exact runbook SQL blocks, both SQLx migrators, the version-25 automatic INSERT, current attach_named and owner inventory. 0 pass / 1 expected fail: actual mesh-00000000-0000-4000-8000-00000000000a, expected minipc01. An existing server is present before rewind, so this is not an empty-snapshot artifact. Reproducer output.
Cause: deploy.md:142 snapshots existing nodes; :161 reconciles old changed rows/audited rename choices only. An old automatic INSERT gets migration 26 DEFAULT hand; restoring migration bookkeeping skips its one-time placeholder classification. store.rs:505 then never auto-names that row. Reconcile newly inserted automatic placeholders too, preserving audited human choices. Fmt and workspace strict all-target clippy pass; final head fast and full R1–R4 totals pending.
R5 review checkpoint at pushed head
18dc39bfd0: R1–R4 active regressions all PASS (29 passed; 1 documented ignored rollback guard), plus naming.rs 4/4 and enrollment binding/identity 5/5. Exact cohort output.Global-before-lookup rename checks, mixed roles, refusal rollback/audit/revision, fallback exhaustion and all retained healthy-peer sequences pass. Logical session-expiry assertions now require age >180 seconds; first completed poll publishes offline. No elapsed-time benchmark claim. Full workspace test phase stops at the sole intended R5 failure, so later package binaries are not claimed as executed by this run. Static builds pending; no final gate verdict yet.
Adapter review: canvas MeshSource has no node-rename operation for any user; it only renames arrows. CLI hosted authenticated transport is still unavailable (docs/CLI.md). Thus no existing scoped node-rename UI silently regresses, but there is no UI explanation or working CLI path to demonstrate. Generated rename instructions remain generic. Typed protocol calls route to the same checked handler; node-side reads/configuration remain owner-only and no public audit-read action exists.
Finish — round-5 delta review: HOLD. P0 0 · P1 0 · P2 0 · P3 1.
Reviewed
13e2149fdagainst6cc36bcac; review branchreview-mesh-view-truth-r5, pushed head18dc39bfd0(remote verified). One logical regression-test commit; no implementation fix or deployment. Checkout clean; issue left open.P3 — new hosts attached during a rewind keep internal UUID names after rolling forward.
docs/operations/deploy.md:140–170snapshots existing nodes and reconciles changed/audited rename choices only. Version-25 automatic attachment insertsmesh-<host UUID>without provenance columns, receiving migration 26'sDEFAULT hand. Restoring_sqlx_migrationsskips the placeholder-classification UPDATE, andstore.rs:505then permanently skips automatic naming. Reconcile new automatic placeholders too, preserving audited human choices.Failing test:
hosts_first_attached_while_rewound_get_machine_names_after_rolling_forwardincrates/plugins/mesh/tests/review_mesh_view_truth_r5.rs:32. Both exact runbook SQL blocks, both SQLx migrators, original version-25 INSERT, current reattach and owner inventory execute on the real schema. Existing server present before rewind. Actualmesh-00000000-0000-4000-8000-00000000000a; expectedminipc01. Focused red receipt.Other requested checks:
mesh.node.observe. These are logical protocol-age assertions, not fresh timing measurements.VersionMissing(26)refusal without the runbook/database restore: an existing guard, not another finding. Existing R4 real-schema rewind/name-choice tests all pass; the new case is outside their coverage.Static sizes from the standard head build: x86 21,374,480 B, ARM 19,555,176 B. Both equal the #236 recorded
13e2149fdsizes under the same recipe: review delta 0 B / 0 B. Against recorded6cc36bcac: -96 B / -1,184 B. References are the issue-recorded builds, not a new baseline rebuild. No unexpected bloat. Linkage/trust/metadata and native x86 key initialization PASS; ARM runtime key initialization is not executed on x86. Caps unchanged; D301 overage accepted by the brief.Final
scripts/verify faston the pushed head, exit 1, summary verbatim:Static size lines verbatim:
Test FAIL is only the deliberately failing R5 proof; static FAIL is only the accepted D301 cap overage. Full verbatim head transcript and supplementary receipts:
final-fast.log
server-api.log
typescript.log
size-comparison.json
ignored-rollback.log
findings.md
cleanup.json
Reviewer checklist completed: no production/schema/parser/engine/dependency/UI changes; existing authorization, transactions, audit and invalidations reviewed. Own target, canonical short fixture root and gate-generated Python cache removed; no executable from the job target remained before deletion. Findings retained in the job directory and attached above. No issue closed.
Starting release-4 integration on branch release-4 at base
5b2a1b9ee3. Read the full #236 and related #201 history, plus the #237 status-truth and #239 CLI histories. Next: merge reviewed mesh-view-truth13e2149fd, then completed cli-r3-fixescafd6d55d; no deploy or push.Iteration-gate setup corrections: the first run used a state root that made an AF_UNIX fixture path 116 bytes; rerunning with
/home/kayg/.cache/codex-scratch/r4spassedreal_binary_preserves_input_and_output_across_24_abrupt_stops(32.49 s). The rerun then reachedprevious_attempt_shelland reported missingINFRATERNAL_TEST_RUNTIME_HELPER. Release-3's verify recipe supplies the x86_64-musl debugrecovery-helper; building that helper and rerunning. Logs are under the release-4 scratch evidence directory.The SSH gate setup is corrected.
recovery_supportpassed with 11 passed / 1 ignored after pointingINFRATERNAL_TEST_STATE_ROOTat a short alias into the release-4 job scratch and setting the release-3-required x86_64-musl debugrecovery-helper. Fullscripts/verify iteratererun is underway.Merged reviewed
origin/mesh-view-truth13e2149fd. Merge commit:f4d3dca381cc67dc69da2ea86f72ea21291bcf54. Resolved thescripts/verify.d/rust.shcap conflict by retaining the reviewed D301 interim ceilings pending exact release measurements.scripts/verify iteratepassed: Rust fmt, VT fmt, CLI compile-out, clippy, workspace tests, cargo-deny; TypeScript reports 37 pass / 0 fail / 34,463 expectations. Mesh gate log: [attached]Correction to the prior step comment: the attached
scripts/verify iteratetranscript is mesh-iterate-final.log. Final summary: 37 pass, 0 fail, 34,463 expectations.Release-4 size guard: stopped after #236 as directed. Head
f4d3dca381cc67dc69da2ea86f72ea21291bcf54includes the reviewed mesh merge.scripts/verify iteratepassed (Rust fmt/VT fmt/compile-out/clippy/tests/cargo-deny; TypeScript 37 pass, 0 fail, 34,463 expectations). Same-recipe x86_64 static build: 21,170,512 bytes vs 21,096,144 base = +74,368 bytes, exceeding the brief's ~+40 KB ceiling by 34,368 bytes. The binary is stripped static PIE; PT_INTERP absent. #239 was not merged. ARM, artifact packaging, staging, and final fast gate were not run after the explicit stop threshold triggered. The imported D301 interim caps remain unchanged and are not final measured caps.Size table and hashes: size-stop-after-mesh.txt. Raw build: mesh-size-x86-build.log.
Release-4 stopped at the explicit x86 size guard. Branch head:
f4d3dca381cc67dc69da2ea86f72ea21291bcf54.Merges:
origin/mesh-view-truth13e2149fdmerged as f4d3dca38.origin/cli-r3-fixescafd6d55dwas not merged because the measured x86 growth exceeded the brief's stop threshold.5b2a1b9eeThe x86 result is +34,368 bytes past the ~40 KB limit. It is a stripped static PIE without PT_INTERP. The current interim D301 caps remain 21,356,464 x86 / 19,545,352 ARM; final exact caps were not set.
42d7332527b6a1c2d0f501d6d83c6a7f83710f853adde2b3d43baf224698b243scripts/verify iteratepassed;scripts/verify fastwas not run after the required stop. Rust gate table verbatim:TypeScript:
37 pass,0 fail,34463 expect() calls,Ran 37 tests across 10 files. [2.88s].Evidence: size table, x86 build log, iteration gate.
Correction: the gate command in my prior comment is
scripts/verify iterate; its Rust table and TypeScript summary are transcribed there, and the attached log is the verbatim output.Start: branch
mesh-view-trim, baseorigin/mesh-view-truth/13e2149fd8544a0f6f78f183448b5f09597a8c2c. Read all comments on #236 and parent #201. Starting matched static-size attribution and trim; no behavior changes or deployment intended.Matched baseline finding: rebuilt release-prod-live
5b2a1b9eewith the pinned static recipe is 21,096,144 B, exactly the production artifact size; SHA-256aacc763d…02a9; stripped static PIE, PT_INTERP absent, production-trust check PASS. Section sizes:.text15,994,408 B,.rodata1,795,440 B,.gcc_except_table597,832 B,.eh_frame1,522,800 B,.data.rel.ro865,304 B.nm --size-sortreturns “no symbols” because the shipping artifact is stripped; I’ll capture a diagnostic link map for function attribution.Evidence: release-prod-x86-build.log, release-prod-x86-sections.txt, release-prod-x86-summary.txt.
R5 finding carried from the prior review:
hosts_first_attached_while_rewound_get_machine_names_after_rolling_forwardexists only on review head18dc39b, not on13e2149fd, and fails there with actualmesh-00000000-0000-4000-8000-00000000000avs expectedminipc01. The runbook snapshots only existing rows; a newly attached version-25 placeholder receives migration 0026’s defaulthandand skips the later automatic-name classification. The review receipt is already attached above: red regression. I’ll add the exact test and update the runbook to reconcile new automatic placeholders while preserving audited human choices.The matched #236 merge build reproduces the prior measurement: x86_64 stripped static 21,170,512 B, versus production 21,096,144 B, delta +74,368 B. The binary is static PIE with no PT_INTERP; production-trust passes. ELF growth is
.text+62,528 B (84% of the file delta),.rodata+4,096 B,.gcc_except_table+3,508 B,.eh_frame+3,160 B,.eh_frame_hdr+336 B,.data.rel.ro+768 B,.relr.dyn+16 B;.relro_paddingshrinks 640 B. No Cargo manifest or lockfile change, so this lane enables no dependency or feature.Evidence: build log, artifact summary, section delta.
Baseline and feature linker maps are now comparable from the same scratch path. Mesh-named .text symbols account for 713,956 B -> 771,547 B (+57,591 B) of the total .text delta of +62,528 B. Largest added/expanded symbols: send_mesh_change +14,229 B; MeshPlugin::node_connected +11,363 B; node_coordination::run +9,621 B. No Cargo manifests or lockfile changed, so this lane adds no dependency or crate feature. Receipts: symbol delta, baseline map build.
The imported R5 real-schema rewind test fails before the docs fix: actual host name is mesh-00000000-0000-4000-8000-00000000000a, expected minipc01. Red test receipt. I will classify a newly inserted row as an automatic placeholder only when its generated name remains unchanged and no rename audit followed the saved revision; the existing audit update then retains person-selected authority.
The R5 rewind regression is fixed in the runbook. Its real-schema test now passes (1 passed, 0 failed), including a control row with a same-spelling rename audit that stays person-selected. Test receipt: r5-fixed-test.log.
cargo fmt --all -- --checkpasses. Crate Clippy and commit remain pending a build slot.Committed and pushed
ad9891837onmesh-view-trim. It fixes the additive rewind instructions and adds the R5 real-schema regression. The targeted test result was1 passed, 0 failed(0.06 s); touched-crate Clippy completed successfully;cargo fmt --all -- --checkandgit diff --checkpass. This docs/test commit changes no production binary bytes. Receipts: R5 test, Clippy.Revert-one size comparison for
96ea67537(IPv4 spelling guard): full feature is 21,170,512 B; with that commit reverted it is 21,169,680 B. The guard contributes +832 B, all in.text. The 3,520 Bmachine_namesymbol includes the earlier hostname parser and is not the commit delta. Receipts: build, size table.Historical parent-to-commit static x86 comparison for migration 0026/name provenance:
37b7678b5is 21,337,776 B;6500004f7is 21,351,248 B, a +13,472 B delta..textgrows 11,776 B; unwind sections 1,412 B;.data.rel.ro288 B. Reverting this commit at the final merge conflicts with later naming refactors, so these adjacent history points isolate the commit cleanly. Their absolute sizes are not comparable with release-prod-live. Receipts: parent build, commit build, section summary.Historical parent-to-commit static x86 comparison for migration 0027/name claims:
615ec1debis 21,359,312 B;f0340fae8is 21,366,480 B, a +7,168 B delta. Section deltas:.text+2,432 B,.rodata+4,096 B, unwind +492 B,.data.rel.ro+128 B, and 20 B of segment alignment. The final-merge revert conflicts with later naming refactors, so these adjacent points isolate the commit; their absolute sizes are not comparable with release-prod-live. Receipts: parent build, commit build, size summary.Owner decision D306 (2026-10-18, dev
1befb03e0): the Mesh view ships at its measured size (+74,368 B x86 vs production) and is trimmed later. Release 5 (queued after release 4) carries it; the trim job continues.Historical parent-to-commit static x86 comparison for initial presence tracking (
6ecee6e73):d0ec83deeis 21,311,120 B;6ecee6e73is 21,337,264 B, a +26,144 B delta..textaccounts for +22,784 B; unwind and metadata sections add +3,056 B; segment alignment adds 304 B. The current merge’s symbol map separately attributes later presence work to the worker and notification state machines. Historical absolute sizes are not comparable with release-prod-live. Receipts: parent build, presence build, summary.Final-merge revert-one size comparison for audit attribution (
d1ad5c08a): full feature is 21,170,512 B; removing that commit’s actor attribution in the scratch copy gives 21,170,320 B. The commit contributes +192 B, all in.text. Git’s direct revert conflicts with latermake_roomedits, so the scratch variant removed only the actor parameter, calls, query selection, and bindings. Receipt: build, summary.Final-merge revert-one comparison for reserved-name behavior (
5871e9ea3): the full feature merge and scratch build with the pre-commit server-hostname reservation rule restored are both 21,170,512 B. The measured net contribution is 0 B; all section sizes, including.textat 16,056,936 B, match. Receipt: build, summary.Finding: the first post-trim release build used branch HEAD 13e2149fd's newer dev tree, not the required production-plus-feature merge f4d3dca. It measured 21,373,392 B, but that value is not comparable to the 21,170,512 B production-plus-feature baseline because HEAD's ancestry has 325 files of unrelated changes relative to production. I will discard that measurement and rebuild the trim on the exact f4d3dca source tree. The trimmed socket file itself has no committed differences from f4d3dca before the pending edit.
Committed and pushed
9fb35eb42. The Mesh change worker now walks its owned subscription vector directly, eliminating the per-change snapshot copy and preserving event order.cargo test --locked -p infraternal-plugin-meshpassed (24 unit tests and all package integration tests, including R1-R5 and R4 presence); touched-crate Clippy and fmt passed. On the matched production-plus-feature tree, stripped x86_64 size is 21,169,520 B, down 992 B from 21,170,512 B and +73,376 B from release-prod-live. Receipts: size summary, build log.Map finding:
machine_nameatstore.rs:68performs separate colon counting and bracket/zone scans. The feature map adds twostr::Pattern::is_contained_inhelpers of 2,036 B and 2,033 B; I’m testing one byte scan to retain the same address checks with less code. Evidence.Committed and pushed
3f9d25f00.machine_namenow checks IPv6/zone/port markers in one byte pass; full mesh package tests (24 unit tests plus all integration tests, including R1-R5/R4 presence), Clippy and fmt pass. Matched stripped x86_64 size: 21,169,200 B, a 320 B reduction from the prior trim and +73,056 B over release-prod-live. Receipts: size summary, build log, checks.Candidate: the linker map reports the new
MeshPlugin::node_connectedjoin closure at 11,363 B; the server branch joins concrete coordination and presence futures insocket.rs:48-54. I’m testing type erasure before the join. It adds two one-time boxes per server channel and dynamic polling; I’ll measure the image before deciding whether to keep it. Evidence.Rejected the server-worker boxing candidate. On the matched tree it increased the stripped x86_64 image by 96 B (21,169,200 B → 21,169,296 B) and added two per-channel allocations plus dynamic polling. Full mesh tests and Clippy passed, but the size/runtime trade is not justified. Receipts: summary, build, checks.
The boxed-future variant increased size and was discarded. I’m now comparing the existing static
future::selectcombinator with thetokio::select!macro for the same concurrent server workers. This keeps concrete futures and adds no allocations; the matched image size will decide whether it is useful.Committed and pushed
47c6924d5. The server worker join now uses pinned concrete futures withfuture::select, preserving concurrent polling and early exit without allocations. Full mesh tests and Clippy pass. Matched stripped x86_64 size: 21,168,848 B, down 352 B from the prior trim and +72,704 B over release-prod-live. Receipts: size summary, build, checks.Candidate: the feature map attributes +9,621 B to the node coordination future; the production-to-feature source diff adds
read_hostnameatnode_coordination.rs:95. I’m testing type-erasing this host-facts future to reduce the parent state machine. It adds one allocation per node attach/reconnect; I’ll keep it only if the exact image reduction is meaningful.Rejected the host-facts future boxing candidate. On the matched tree it added 288 B (21,168,848 B → 21,169,136 B) and one allocation per attach/reconnect. Full mesh tests and Clippy passed; the unboxed implementation remains. Receipts: summary, build, checks.
store::free_nameis 2,348 B in the matched map. It currently formats every suffix once to recognize the current suffix, then again for the ordered first-free search. I’m testing a direct exact one-digit check for the retained suffix so that only the search formats candidates. Evidence.Start: branch
release-5, baseorigin/release-4a906ede87110465c08ecde0d811c8eca2cbe08cc. Read all comments on #236 and related #201 history. Selectingorigin/mesh-view-truth13e2149fd; the trim branch remains active at47c6924d5, and #236 has no trim finish comment or final review/gate receipt. The optional #230/#244 markers were absent at initial inspection.Merge finding:
scripts/verify.d/rust.shconflicted on size caps. Release-4 pins 21,144,112 / 19,370,696 B; the incoming branch carries interim D301 values 21,356,464 / 19,545,352 B. Resolved in favor of the release-4 values until matched release-5 builds establish exact caps. Rechecked at merge start:retry-join-timeandresume-refused-loopare absent; #230 and #244 are excluded.Committed and pushed
4e0cbe931.free_namenow checks the retained suffix directly and formats candidates only in the ordered search. Full mesh tests and Clippy pass. Matched stripped x86_64 size: 21,167,888 B, down 960 B from the prior trim and +71,744 B over release-prod-live. Receipts: summary, build, checks.move_asidebuilds aBTreeSet<&str>only after the ordinary suffixes are exhausted; the matched map attributes 2,475 B to its insert instantiation. I’m testing a sorted contiguous list and binary search. Membership and fallback candidate order remain the same, with O(n log n) construction/search. Evidence.Iterate finding: all rows passed except SSH
session_restaging_uses_one_compound_command(crates/plugins/ssh/tests/install.rs:2820):SetupRunning, exit 73; suite result 93 passed / 1 failed / 1 ignored. No SSH plugin files changed in this merge. I’m reproducing the fixture failure before proceeding. Receipt: iterate-ssh-failure.txt.Follow-up: the originally failing restaging test passes alone (1/1). The rerun of the full SSH install suite passed it but failed
review_inode_reuse_after_diagnostics_preserves_live_replacement(crates/plugins/ssh/tests/install.rs:3483): expected the fixture to reuse an inode within 256 allocations, but it did not. Suite result 93 passed / 1 failed / 1 ignored. Receipt: install-suite-rerun.log. No SSH plugin files changed in this integration.Reproduction result: all failures from the two parallel runs pass in an isolated serial SSH install suite: 94 passed / 0 failed / 1 ignored. This is diagnostic evidence only; final
scripts/verify faststill must pass on the branch head. Receipt: install-suite-serial.log.Rejected the sorted-vector fallback candidate. Although the linker map showed a BTreeSet insertion symbol, replacing it with sorting and binary search increased the final matched image by 3,008 B (21,167,888 B → 21,170,896 B). Full mesh tests and Clippy passed; the BTreeSet implementation remains. Receipts: summary, build, checks.
The new
BTreeMap<NodeId, Option<NodePath>>::insertspecialization is 2,289 B in the matched map. Presence has only server/no-path and direct-peer states, and callers only look up IDs or compare readings. I’m testing a server ID plus a direct-peerBTreeSet, preserving lookup results and giving direct membership precedence if IDs overlap. Evidence.Static release measurements for the Mesh merge: release-4 was 21,144,112 B x86_64 / 19,370,696 B aarch64; release-5 is 21,225,872 B / 19,427,688 B (+81,760 B / +56,992 B). Both binaries passed production-trust and static linkage checks. x86_64 remains under the +90 KB stop line. Exact caps and the PROCESS table now use these sizes. Receipt: static-build.log.
Committed
3b794faa31a43153037f0c2aefbd5bc2dfc5ffc4: compact Mesh live presence storage. Mesh package checks passed: 25 unit tests, integration and review rounds R1–R5, Clippy, andcargo fmt --all --check(one deploy-only test ignored). The matched stripped x86_64 artifact is 21,165,520 B: +69,376 B over production and -2,368 B from the previous accepted checkpoint. SHA-256:d0433b37c90015a160edd7a26b21e9a394fcf9afa8bd738b905c0fb5e2e3c590.Correction: the first scratch artifact still contained the rejected sorted-vector fallback in
store.rs; it was discarded. The attached build used the restored committed source. The target is 21,133,392 B, so another 32,128 B must be removed.Evidence: measurement summary, build log, checks.
verify iteratetest row failed only inprevious_attempt_shell: 32 Python cases errored becauseINFRATERNAL_TEST_RUNTIME_HELPERwas unset; the helper exists attarget/debug/examples/recovery-helper. This is a gate invocation requirement, not a Mesh failure. I’ll rerun the gate with that helper path set. Receipt: verify-iterate-helper-env-failure.txt.The
previous_attempt_shellgate setup issue is resolved: the exact test passed withINFRATERNAL_TEST_RUNTIME_HELPERset to the built helper (1 passed; 0 failed, 6.53 s). I’m rerunning the full iterate gate with this path and serialized tests. Receipt: previous-attempt-helper-test.log.Rejected the sink-erasure experiment. The matched stripped image grew from 21,165,520 B to 21,166,000 B (+480 B), with dynamic dispatch added at socket sends. Mesh package tests, review rounds R1–R5, Clippy, and cargo check passed (one deploy-only test ignored). The candidate is discarded. Evidence: size summary, build, checks.
The next
verify iteratetest row failed inrecovery_support: three fixtures exceeded Linuxsun_pathunder the job's long state-root path (AF_UNIX path too long). The target directory is already outside/tmp; I’ll use a short temporary root only for test state and remove it after the run. Receipt: verify-iterate-socket-path-failure.txt.Rejected
#[inline(never)]for the shared Mesh event sender. The matched stripped artifact increased from 21,165,520 B to 21,166,288 B (+768 B). All mesh tests and Clippy passed (one deploy-only test ignored); the candidate is discarded. Evidence: size summary, build, checks.Correction: my first short-root rerun had a typo in
INFRATERNAL_TEST_STATE_ROOT, so the recovery-support tests used their default path. With the variable spelled correctly and the root/tmp/r5-236, the targeted recovery-support suite passed (11 passed; 1 ignored). The current full gate run uses the corrected variable. Receipt: recovery-support-short-root-corrected.log.Final
scripts/verify iterateattempt 1: fmt, VT native fmt, CLI compile-out, Clippy, and cargo-deny passed; workspace tests exited 101. Elevennode_statetests failed atnode_state.rs:204creating their fixture directory withNo such file or directory. The test helper derives its parent fromCARGO_TARGET_DIRor the test working directory, and the invocation had no explicit target-dir override. I’m rerunning with the existing workspace target path set explicitly; this is outside the allowed host-load exception set. Evidence: failure summary, gate log.Mesh view source
origin/mesh-view-truth(13e2149fd8) is integrated in the staged merge;scripts/verify.d/rust.shanddocs/PROCESS.mdnow record measured static caps. The full iterate gate passed at base HEADa906ede871, before creating the merge commit. Mesh API/migration tests and the complete Rust and TypeScript suites passed.Evidence: verify-iterate-final-pass.log
Size at this step: x86_64 21,225,872 B (+81,760 B vs release-4 21,144,112); aarch64 19,427,688 B (+56,992 B vs release-4 19,370,696). The optional markers for #230 and #244 were absent at merge start, so neither branch is included.
Created the required no-ff merge commit on
release-5:c00c6364e6(merge: ship reviewed Mesh view (#236, D306)). This commits the reviewed truth branch, additive migrations 0026/0027, and measured release caps.scripts/verify iteratepassed before the commit; the finalscripts/verify fastand staging remain outstanding.Corrected
verify iteraterun: all rows passed except one auth socket timeout test,responsive_socket_survives_a_held_terminal_open_with_an_existing_attachment, which stopped before its observed event atsocket_clock.rs:81; 466 other server tests passed and 48 were ignored. Recorded load average after the run was 2.76 / 5.81 / 9.30. I’m comparing this test on detachedorigin/devat6055cd29ad93cb32dfcce2f7da641e152c47a2e8in the same load window, per the host-load rule. Evidence: summary, full log.Release artifacts were built from head
c00c6364e6. The package SHA256SUMS verified,web/index.htmlexists, and the production tracer transfer budget passed (265 web files).f8afe9bed532d7cf274a72aa9c7f89d1f4aa6d6ca1f8c73b05a7938c2e08da73a556b4242f93bb55eb40597069a195bea062d179880ddeffd9fc695b2ba1e908dc7e7b2eeb9f52ac6b8db6a2383cb1c22232db5a9c10932083b03f0941371e2ae774db0cce0a1b23bafa324f8a70e480c041d38f9a7ab6c2581b3a03a50c21afe619dbf82706a390666f2b37c81bf23531328f50d2a836879d4254aa849203de887475d130a9a3f088d4502ea8120ad085ac3b9815203aa1fc55a8f3cd6a26185489f111cc722950875a92784f8ac6ca0b97d5c241d1cd75e4b9054c41a8220924f652c770683fe25f80de12cae34ca3dde6965df6e00cb6f14a3bde1b829cfb0f357e9f573aaff647d7521eb22483f6b6a807f0967c0fb58656175a61d171e9Receipts: artifact build log, MANIFEST.txt.
The detached
devbaseline at6055cd29ad93cb32dfcce2f7da641e152c47a2e8passed the exact timeout test (1 passed, 365 filtered out; 0.81 s). The branch’s full workspace run failed that test atsocket_clock.rs:81while 466 other server tests passed. Since the baseline did not reproduce the failure, the host-load exception does not apply; I’m rerunning the exact test alone on the branch to isolate parallel-suite interference from a Mesh regression. Evidence: summary, baseline output, branch workspace output.Rerun on branch
3b794faa31: iterate still fails only the workspace test row. The prior auth socket timeout passes alone (1/1, 0.77 s). This run had 77 infraternal CLI tests pass, with two different failures:relative_recovery_after_atomic_install_keeps_live_install_pathgotExecutableFileBusyatcrates/infraternal/src/restart_deleted_path_review_tests.rs:67, andfailed_restart_endpoint_does_not_prevent_http_servingtimed out after 30.02 s after HTTP startup reported storage initialization failure. All other iterate checks passed; cargo-deny endedadvisories ok, bans ok, licenses ok, sources ok. Full log: verify-iterate-final.log. I’m isolating both failures before deciding whether they reflect this branch.Production tracer screenshot capture passed at desktop (1440×900) and phone (393×852) with
TRACER_TEST_PORT=4805(2/2). The real production web build was served against the isolated Mesh test fixture, as shown by the test-double badge in the captures. These are visual receipts; their build-host test durations are not performance measurements.Receipts: desktop, phone, large Mesh view, Playwright log.
On perf VM
infraternal-perf-test, copied the synthetic production-shaped v25 database (4 Mesh nodes; SQLite integrityok) into a private, disposable stage directory. With CPUWeight=10000, the release-5 server started, served/healthzand the production app shell (HTTP 200), and served the JS asset containingmesh.list. Startup applied migrations 0026/0027: database version 27; the hand-setminipc01name survived. The server PID and stage directory were both removed. Load average before/after:1.55 1.33 1.00.Evidence: migration-stage-perf.log
Finding: the first add-host stage preflight copied the 128,658,144 B test harness but the perf VM could not execute it (
sh: .../repo/server-tests-run: not found); cleanup verified no Docker containers or stage scratch remained. The payload and session files transferred, but the test harness needs its matching runtime loader/libraries. I’m adapting the release-4 staging transfer recipe to ship that runtime alongside this harness.Evidence: addhost-staging-perf.log
Correction to my prior add-host finding: the test executable wrapper did not reach the perf VM command at all. The tar archive already had a
repo/prefix, and extraction into$base/repoadded a second directory level; the preflight then failed at$base/repo/server-tests-run. The copied runtime is present in the archive, but this run did not test it. Cleanup again verified the unique stage tree and all three container names absent. I’m changing extraction to the base directory and will rerun the preflight plus all acceptance cases.Evidence: second add-host preflight log
Add-host preflight now starts the 128,658,144 B test harness through the copied Nix loader/libraries and lists exactly one live test. The first clean Docker fixture then stopped before SSHD because the transfer included
measure.pybut omitted its siblingsshd.py(FileNotFoundError); cleanup removed the fixture container and remote scratch. I’ll transfer the complete helper directory and rerun.Evidence: add-host helper-file failure log
The clean and duplicate add-host phases passed; the removal phase did not. The live test reported
host_cleanup=requested, but the 45-second removal receipt still showed an active rootless unit, one session scope, two infraternal processes, and the installation data/unit/launcher present.prove_removedfailed and the isolated Docker container and scratch were removed. I’m checking whether the harness’s still-open terminal session prevents teardown or whether the implementation needs a fix before repeating removal/re-add.Evidence: add-host acceptance log
Isolated the two failures from the second iterate run on branch
3b794faa31. Both pass alone:relative_recovery_after_atomic_install_keeps_live_install_path(1/1, 2.75 s) andfailed_restart_endpoint_does_not_prevent_http_serving(1/1, 0.27 s). This does not clear the full-suite failure; I’m running the required final gate to establish the branch-head result. Receipts: restart-path-isolated.log, restart-endpoint-isolated.log. The full iterate log is in the preceding comment.A removal-only rerun (no duplicate-terminal phase) confirms the teardown failure is independent of that step. The receipt reached zero user session scopes, but still showed the rootless service active, one infraternal process, and the owned files present after the 45-second wait. Docker container and stage scratch were removed. I’m capturing only the target user's systemd unit state and process names before cleanup on the next isolated run; no unit journal or private file contents will be collected.
Evidence: removal-only acceptance log
Rootless add-host removal still fails on release-5 in an isolated run without a duplicate terminal. The add completed in 1,118.684 ms; after the 45 s removal wait, the user unit remained active with one
infraternalprocess and its data, unit, and launcher still present. The transient uninstall service reportedResult=success, so the failure is in cleanup behavior rather than helper launch. Captured log: addhost-staging-perf.log. I’m narrowing down the target user-manager environment before the final staging report.Correction to the preceding finding:
Result=successwas reported forinfraternal-agent.service, not the transient uninstall helper. The helper's exit result has not yet been captured.An isolated rootless add-host removal rerun passed on the perf VM. Join completed in 1,255.725 ms; removal left the service inactive, zero sessions/processes, and no data directory, unit, or launcher. The 45 s assertion completed successfully; test runtime was 6.49 s and load was 1.17/1.10/1.19. Receipt: addhost-removal-environment.log. Earlier isolated attempts had failed, so I’m running the required remove-and-re-add sequence before closing staging.
A second rootless removal rerun failed after the same clean join (1,221.799 ms): after the 45 s bound the unit and files remained. The target manager environment had
HOME=/home/targetandXDG_RUNTIME_DIR=/run/user/1101; a separate diagnosticsystemd-run --pipeprobe reported no user scope bus, which does not yet establish the helper's failure cause. One isolated rerun passed and this one failed, so removal is intermittent; remove-and-re-add remains unverified. Receipt: addhost-remove-readd-perf.log.Signed handoff staging passed on the perf VM (load 0.05/0.45/0.85): 12 alternating handoffs retained the CA, 10,000 nodes, 50 users, 128 real PTY sessions, and 6 responsive browser sockets; bad deployment rolled back and refusal occurred before shutdown. Handoff transaction p50 4,929.6 ms; listener gap p50/p99 3,954.1/4,034.1 ms; maximum probe interval 103.2 ms; idle server CPU 6.799% of one core and RSS 21,696,512 B. Both signed-deploy and browser-probe tests passed and the remote stage was removed. Receipt: signed-staging-perf.log.
The named transient uninstall unit confirms the rootless cleanup helper exits with status 1/FAILURE while
infraternal-agent.serviceand its files remain. The clean join completed in 1,219.886 ms; the removal action was accepted, but the 45 s removal assertion failed. This run retained the helper result without changing its launch semantics; I’m capturing the by-hand error to identify the cleanup failure. Receipt: addhost-remove-readd-diagnostic-3.log.An uninstrumented rootless remove-and-re-add staging run failed at removal again. Clean add completed in 1,277.869 ms; after the 45 s bound the active daemon, data, unit, and launcher remained, so re-add did not run. This confirms the failure is reproducible without diagnostic wrappers; one earlier uninstrumented removal-only run passed. Receipt: addhost-remove-readd-perf.log.
The diagnostic run showed
infraternal-uninstall-debug.serviceexited 1/FAILURE and left the rootless installation active. Running the same installed binary's by-hand uninstall immediately afterward removed it successfully. This narrows the failure to the automatic plan-consuming helper path; the production helper still fails intermittently, and the receipt includes both outcomes: addhost-remove-readd-diagnostic-manual.log.The uninstrumented rootless remove-and-re-add staging sequence passed on the perf VM (load 0.59/0.86/0.93). Initial add: prompt 347.855 ms, fully joined 1,181.688 ms; removal left the unit inactive and zero session/process/file artifacts. Re-add to the same clean target: prompt 450.288 ms, fully joined 1,269.065 ms, with the installed full-image SHA matching. The disposable container and scratch were removed. Earlier removal-only runs were intermittent; the diagnostic helper failure and by-hand recovery are recorded above. Receipt: addhost-remove-readd-final.log.
Fast gate finding: x86_64 static artifact is 21,369,456 B against the 21,356,464 B exact cap (+12,992 B). It is stripped static PIE, has no PT_INTERP, production trust passes, and key-memory initialization passes. AArch64 checks are still running; full gate output will follow when complete. Receipt: x86-static-size-finding.txt.
Head
3b794faa31a43153037f0c2aefbd5bc2dfc5ffc4, pushed toorigin/mesh-view-trim. Full fast log: verify-fast-final.log.Matched x86_64 release sizes against production
5b2a1b9ee(21,096,144 B):Five measured trims saved 4,992 B; the head remains 32,128 B above target and 5,376 B above D243's 64 KiB threshold. The remaining code is concentrated in live presence delivery, name provenance/claims, and frame-bounded peer paging. The measured adjacent deltas are +26,144 B for presence, +13,472 B for migration 0026/name provenance, and +7,168 B for migration 0027/name claims; removing these would lose online-state truth/expiry, durable naming provenance, or collision-safe claims. Peer paging also protects the action-frame bound. I found no measured behavior-preserving cut large enough to reach +37 KB; erasing presence or the name rules would change behavior.
The branch-head static gate also exceeds the repository caps: x86_64 21,369,456 B vs 21,356,464 B (+12,992 B); AArch64 19,550,488 B vs 19,545,352 B (+5,136 B). Rust tests, fmt, clippy, cargo-deny, linkage, production trust, x86 key-memory, CLI stubs, and metadata checks passed. Final
scripts/verify fastsummary, verbatim:Correction to the size comment: +69,376 B is 5,376 B above a decimal 64,000 B threshold; if the intended threshold is 64 KiB (65,536 B), it is 3,840 B above. The shared contract states 64 KB; either interpretation leaves the head above that threshold.
Release 5 is finished and pushed to
origin/release-5atc00c6364e695c6676edb5d0dcc82a6388e5a1e59.Merges. Started from
origin/release-4ata906ede87110465c08ecde0d811c8eca2cbe08cc;origin/release-prod-livewas at the same SHA, so no additional merge was needed. Mergedorigin/mesh-view-truth(13e2149fd8544a0f6f78f183448b5f09597a8c2c, #236 / D306) with one merge commit.mesh-view-trimwas unfinished and had no finish comment/review gate. #230 and #244 were not included because their release-5 marker files were absent when merging began. Nothing was deployed.Static size.
The x86_64 increase is below the +90 KB stop limit. Both final binaries match their caps and have no
PT_INTERP.Artifact SHA256. Artifacts remain under
/home/kayg/.cache/codex-scratch/release-5/artifacts; bundleSHA256SUMSand webweb-SHA256SUMSwere verified.infraternal-x86_64-muslf8afe9bed532d7cf274a72aa9c7f89d1f4aa6d6ca1f8c73b05a7938c2e08da73infraternal-aarch64-musla556b4242f93bb55eb40597069a195bea062d179880ddeffd9fc695b2ba1e908web-dist.tardc7e7b2eeb9f52ac6b8db6a2383cb1c22232db5a9c10932083b03f0941371e2aweb-SHA256SUMSe774db0cce0a1b23bafa324f8a70e480c041d38f9a7ab6c2581b3a03a50c21afMANIFEST.txt34af9984143519f0eddafe5ec04b5fa2112f27c675be891cea3c69cea46073f5bundle/SHA256SUMSe619dbf82706a390666f2b37c81bf23531328f50d2a836879d4254aa849203debundle/infraternalf8afe9bed532d7cf274a72aa9c7f89d1f4aa6d6ca1f8c73b05a7938c2e08da73bundle/infraternal-aarch64-musl887475d130a9a3f088d4502ea8120ad085ac3b9815203aa1fc55a8f3cd6a2618bundle/infraternal-aarch64-session-musl5489f111cc722950875a92784f8ac6ca0b97d5c241d1cd75e4b9054c41a82209bundle/infraternal-x86_64-musl24f652c770683fe25f80de12cae34ca3dde6965df6e00cb6f14a3bde1b829cfbbundle/infraternal-x86_64-session-musl0f357e9f573aaff647d7521eb22483f6b6a807f0967c0fb58656175a61d171e9Staging.
ok, four nodes retained andminipc01name preserved; server health/app shell/Mesh asset returned HTTP 200. Perf VM load 1.55/1.33/1.00.Receipts: migration stage, signed handoff, clean/already-added, remove/re-add, add-host removal diagnostic, artifact build, manifest, full fast-gate transcript, desktop capture, phone capture, large-graph capture, capture log.
Final gate.
scripts/verify fastexited 0. The full 392 KB transcript is attached. Rust gate output:Static size output:
TypeScript protocol output:
Head:
c00c6364e695c6676edb5d0dcc82a6388e5a1e59(pushed asrelease-5).Release 5 deployed to production at 00:29 IST: release-prod-live
c00c6364e, /healthz ok. Honest Mesh view (#236, D306), migrations 0026/0027. CA locked after the restart until the owner unlocks it.Start: branch
mesh-name-placeholder, baseorigin/release-prod-live857823ce433bc3f729c04571e32813073b1cc37e. Continuing #236 naming repair; no production changes or deployment.Finding: the attach-time repair cannot heal an existing UUID placeholder when both sources are absent/invalid.
store.rs:225-228keeps any current name whenwantedisNone;wanted_nameatstore.rs:278-301derives the record name only fromaddressand uses only the current attach'sreportedhostname.node_coordination.rs:99-110reads that fact only during attach. Later,remote_inventory.rs:35-50reads host facts but persists only OS and publishes onlyremote.hosts, so Mesh never reconciles the node.Contract proposal for #236: cache a valid optional host hostname on the existing admitted-host inventory row; when its bootstrap address has no valid host name (including IP-only), use that cached hostname as the host inventory display name and Mesh's
reported-rank name. Reconcile an attached Mesh node immediately when inventory learns/changes the hostname, through the existing audited revision path. Missing facts from an older infraternal agent do not erase a cached name; if address and cache provide no name, Mesh displaysunnamed. Ranking stays hand > server > record > reported > placeholder, including yielding reported names to every other host's record name. The existingname/addressresponse fields remain unchanged.Reproduced:
cargo test -p infraternal-plugin-mesh --lib old_agent_and_ip_record_do_not_leave_a_uuid_mesh_name -- --nocapturefails on the pre-fix code. The release-4-era facts response omitshostname, the record isroot@10.69.69.217, and the attached Mesh name remainsmesh-00000000-0000-4000-8000-000000000001instead ofunnamed(crates/plugins/mesh/src/node_coordination.rs:553). This confirmsnaming()preserves the existing placeholder when no valid source is available.The reproduced release-4/IP case now passes after the naming fallback converts the persisted
mesh-<host UUID>placeholder tounnamed:cargo test -p infraternal-plugin-mesh --lib old_agent_and_ip_record_do_not_leave_a_uuid_mesh_name -- --nocapture—1 passed; 0 failed(0.12 s). The same change extends unnamed-label allocation past-9, and the migration now rewrites existing UUID placeholders with an audited revision so they disappear on upgrade before reconnect.Completed on #236:
7fbfed012adds the hostname column and migrates persisted UUID placeholders to audited unnamed labels.86af47f72shares host-name parsing without new dependencies.52190c380adds cached-name ranking and transactional Mesh rename/revision notification.ed258f099retains inventory hostnames, uses them for IP-added hosts, and shares the Mesh service with inventory.768905948adds the migration, legacy-host, late-inventory/live-notification, duplicate-name, and parser regressions.6339959c5documents the contracts and migration rewind procedure.15e9faa5favoids Mesh reconciliation when the hostname did not change.Focused real-engine tests pass: migration 1/1; late inventory and IP-added inventory 2/2; legacy host daemon/IP record 1/1; duplicate reported hostname 1/1; shared host-name parser 2/2. The pre-fix legacy/IP regression failure is recorded above. No production writes or deployment.
Finding: the branch-head
scripts/verify iterateclippy phase reportedclippy::type_complexityatcrates/infraternal-server/src/remote_inventory.rs:141for the admitted-host SQL row tuple. The lint output recommended factoring the type; I am adding a named row alias before rerunning the gate. The gate's workspace test phase is still running.Finding:
cargo test --workspace --lockedreachedcrates/plugins/mesh/tests/review_mesh_view_truth_r2.rs::evidence_migration_0026_upgrades_a_realistic_database_without_churnand failed because its expected post-migration rows still containmesh-<uuid>. Actual names areunnamed-2andunnamed-4after the new migration 0028 normalization; this is the requested no-UUID behavior. I will update the fixture expectation and rerun the test suite.Completed step: commit
7ce8881a3names the admitted-host query row type without changing query behavior.cargo fmt --all -- --checkpassed;cargo clippy -p infraternal-server --all-targets --locked -- -D warningspassed; the two targeted remote inventory tests passed (2 passed, 0 failed, 0.14s).Finding follow-up: after correcting the historical placeholder labels, the focused migration test reached
review_mesh_view_truth_r2.rs:195and found 5mesh.node.nameaudit rows instead of 3. Migration 0028 adds two audited placeholder normalizations; the later repeat-attach assertion still checks that it adds no further audit rows. I am updating the expected baseline and rollback note.Completed step: commit
ef907c65bupdates the realistic migration fixture for migration 0028: two legacy placeholders become distinct unnamed labels, the two migration audit rows are counted, and the rollback note describes the label rewrite.cargo fmt --all -- --checkpassed;cargo clippy -p infraternal-plugin-mesh --all-targets --locked -- -D warningspassed; the focused migration test passed (1 passed, 0 failed, 0.05s).Finding: the iterate test phase failed only in
crates/plugins/ssh/tests/previous_attempt_shell.rs::shared_ownership_shell_preserves_recovery_and_refusal_invariantsbecause the gate invocation did not setINFRATERNALE_TEST_RUNTIME_HELPER. Its Python setup raisedKeyError: 'INFRATERNALE_TEST_RUNTIME_HELPER'in 32 cases before assertions ran. I am rerunning with the helper path from this job's target directory.Gate invocation correction: the second iterate run still showed the same 32 missing-helper setup errors. The build-slot wrapper starts its child with a scrubbed environment, so parent exports do not reach
scripts/verify; the job must pass them asbuild-slot env KEY=value ... scripts/verify iterate, as used by other verification jobs. No product assertion failed in these setup cases.Finding: the correctly configured iterate run passed the Mesh naming/migration tests but
crates/plugins/ssh/tests/install.rs::review_inode_reuse_after_diagnostics_preserves_live_replacementfailed. Its fixture reportedfixture could not reproduce inode reuse in 256 allocations(expectedreused, gotabsent). This is outside the documented host-load exception list, so I am rerunning the single test with the job's isolated state root.Follow-up: the previously failing
review_inode_reuse_after_diagnostics_preserves_live_replacementpassed in isolation (1 passed, 0 failed, 0.41s) with this job's state root. This points to parallel filesystem fixture contention in the full install test binary. I will rerun the workspace gate withRUST_TEST_THREADS=1to remove that contention.Correction: I supplied the test variables with an extra trailing
E(INFRATERNALE_*). The code expectsINFRATERNAL_TEST_STATE_ROOTandINFRATERNAL_TEST_RUNTIME_HELPER, so the prior full-gate attempts still lacked the helper despite usingbuild-slot env. I will rerun with the exact names, the job-specific state root, andRUST_TEST_THREADS=1. The single inode-reuse test passed in isolation; its full-suite miss was separate from the missing-helper setup errors.Finding: with the correctly spelled
INFRATERNAL_TEST_RUNTIME_HELPER, the missing-helper setup errors are gone. The workspace test run instead failed 13 restart fixture tests because the job state root.../mesh-name-placeholder/test-statemade the fixture socket path 109 bytes, above Linux's 107-bytesun_pathlimit (crates/infraternal/src/restart_tests.rs:26). I will use the shorter job-scoped root.../mesh-name-placeholder/tand rerun with one test thread.The serial iterate rerun reached agent_daemon but its fixture socket path was 116 bytes, above Linux's 107-byte AF_UNIX limit, because the job-specific scratch path remains long after the
tsuffix fix. I will rerun with a short symlink pointing into the same job scratch directory; no product test assertion failed.The iterate rerun with the short scratch symlink reported 6 failures in unrelated restart tests (93 passed, 1 ignored). One path assertion compared
/home/kayg/.cache/codex-scratch/mnp/t/.../installedwith the canonical job path; the other failures were PermissionDenied while opening generated fixtures. The Mesh naming tests did not fail. I will rerun using the direct job path for Rust fixtures and route only the Python AF_UNIX fixture to the short alias. Full gate log: verify-iterate-final.log.Using the direct job path cleared the six unrelated restart failures (the infraternal binary reported 99 passed, 0 failed, 1 ignored), and
agent_daemonpassed.agent_queuesthen exposed the same AF_UNIX fixture path limit (114 bytes) because the short-path wrapper covered onlyverify-agent.py. I extended it to allscripts/verify-agent*.pyfixtures and will rerun iterate. Full log: verify-iterate-final2.log.The broadened wrapper allowed
agent_daemonandagent_queuesto pass. Two other scripts that import the same AF_UNIX helper,verify-session-bounds.pyandverify-session-exit-credit.py, still used the direct job root and each measured a 114-byte socket path. I will scope the short alias to any Python script that imports the shared fixture helper, then rerun iterate. Full log: verify-iterate-final3.log.The shared helper detector resolved all Python fixture path failures through
agent_review(8 passed).agent_sessionsbuilds AF_UNIX paths directly in Rust and three tests failed on the direct 115-byte job-root path. I will use a Cargo target runner that preserves the canonical path for the path-sensitiveinfraternalunit-test binaries and uses the short job-scratch alias for other test binaries. Full log: verify-iterate-final4.log.The Rust test runner fixed all three
agent_sessionspath failures. The SSH install suite then had one symlink-sensitive assertion: its lock path under the short alias differed from the same job-local path expected through the canonical spelling. 93 passed, 1 failed, 1 ignored in that test binary. I will preserve the canonical root for SSH install test binaries as well. Full log: verify-iterate-final5.log.A focused direct-path run confirmed six socket fixtures in
tests/install.rsexceed Linux's AF_UNIX bound under the long job path (88 passed, 6 failed, 1 ignored). The earlier short-alias run had 93 passed and only the raw/proc/<pid>/fd/7path string comparison failed, because the kernel reports the canonical spelling. I will make that assertion compare canonical paths and keep this test suite on the short alias. Focused log: ssh-install-focused.log.The SSH test now compares the canonical
/proc/<pid>/fd/7target with the canonical fixture path, preserving the lease identity check across the short scratch alias.cargo fmt --all -- --checkpassed andcargo clippy -p infraternal-plugin-ssh --all-targets --locked -- -D warningspassed (22.92s), at headef907c65b535039d5186b3779b4582eb13ef650f. Clippy log: ssh-install-clippy.log.The focused SSH install suite passed with the symlink-aware assertion: 94 passed, 0 failed, 1 ignored in 48.59s. Clippy and formatting are also green; current head is
ef907c65b535039d5186b3779b4582eb13ef650f. Test log: ssh-install-focused2.log. I will commit this test-only scratch-path correction separately.Committed
0735f1ef1(canonical SSH fixture path comparison). Gates before commit:cargo fmt --all -- --checkPASS;cargo clippy -p infraternal-plugin-ssh --all-targets --locked -- -D warningsPASS;cargo test --locked -p infraternal-plugin-ssh --test installPASS (94 passed, 0 failed, 1 ignored in 48.59s). The feature branch head is now0735f1ef1; size comparison and full fast gate remain.At branch head
0735f1ef1, the detached merge-base build (857823ce433bc3f729c04571e32813073b1cc37e) completed withscripts/static-cargo build --locked --release --package infraternal --target x86_64-unknown-linux-musl. Cargo's release strip setting produced the stripped static artifact at 21,225,872 bytes, equal to the configured cap. The final fast gate will record the branch size from this same target. Build log: base-static-build.log.The first full fast run reported the required Mesh naming and migration tests green, but its SSH
previous_attempt_shellfixture used a symlinked state root and returned status 71 where the shell oracle expects its invariant-specific statuses. I will run that one test binary from the real job scratch with a relative state path.Static sizes from this run: stripped x86_64 21,254,224 bytes (+28,352 over the measured merge base, 21,225,872); arm64 19,456,312 bytes (+28,624 over the current 19,427,688-byte cap). Both changes come from #236's shared hostname parser, retained inventory name, migration, and live audited reconciliation; no dependency was added. This is 0.13% and 0.15% growth respectively, each below D243's 64 KiB owner threshold. I will measure the arm64 merge-base artifact and update both caps to the measured branch artifacts, then rerun fast.
Fast log: verify-fast-final.log.
Measured the merge-base static release binaries with the same recipe: x86_64 21,225,872 bytes and arm64 19,427,688 bytes. The branch artifacts from the fast run are x86_64 21,254,224 (+28,352; 0.134%) and arm64 19,456,312 (+28,624; 0.147%). Both increases are below D243's 64 KiB limit; no dependencies were added. Merge-base arm64 build receipt: base-static-arm64-build.log. I will ratchet the exact size caps to the measured branch sizes and record the required naming/reconciliation behavior as their justification.
The shell fixture path setup is corrected: each case returns to the job scratch root, keeps its directory name short for Unix sockets, and passes a canonical absolute base to the shell’s symlink checks. The focused SSH ownership test now passes (34 Python cases; 1 Rust integration test, 6.19 s); SSH Clippy and workspace formatting pass. Receipts: focused test, Clippy.
Completed commits:
4d40a61d63623070c06639c7e91eadc701aad249fixes the SSH ownership fixture paths; its focused test passes (34 Python cases, 1 Rust integration test), Clippy and formatting pass.70b4706e751f21c4adb7c4a02826e5aaa832b083ratchets static caps to the measured branch sizes: x86_64 21,254,224 bytes (+28,352; 0.134%) and arm64 19,456,312 bytes (+28,624; 0.147%) against the merge base. Static cap script syntax passes. Finalscripts/verify fastis running.The full gate on
70b4706e75failed only inagent_review::local_session_counts_and_memory_refusals_follow_real_lifecycle:verify-session-bounds.pyraisedPermissionErrorwhile polling/proc/2349547/exeafter its socket disappeared. The daemon disables dumpability, so a live process can make that entry unreadable during retirement. The other test groups and both exact static caps passed. I changed the retirement poll to treat this permission result as still active and retain the existing one-second bound; I’m checking the focused regression now. Receipt: verify-fast-before-proc-fix.log.Committed
7a14bbc144e6e1b18...to keep the retirement poll waiting when dumpability protection makes/proc/<pid>/exeunreadable; the existing one-second bound remains. The previously failinglocal_session_counts_and_memory_refusals_follow_real_lifecyclefocused test now passes (1 passed). The original full-gate trace is attached above; focused receipt: session-bounds-focused.log. I’m rerunningscripts/verify faston the updated head.Correction to the previous comment: the full commit SHA is
7a14bbc140c09239ce3913737a8f6460b3bc309a.The full gate after the
/procfix passed the lifecycle test and both exact static size checks, but exposed three SSHrecovery_supportfixture failures: one stale-session socket bind atrecovery_support.rs:544and two live-session helper binds at:478exceedsun_pathunder this job's scratch root. These are fixture path lengths; the test cases need their socket binds shortened while retaining the intended newline-home path. Receipt: verify-fast-before-ssh-fixture-fix.log.Committed
0cd06857b1bb2d9e46c50b17e86ba14282de9c91: the recovery-support fixture now binds stale sockets through a directory descriptor and uses a short relative address for live sockets, retaining the newline-home check. Focused recovery-support output: 11 passed, 1 ignored; SSH Clippy and formatting pass. Receipts: recovery-support-focused.log, Clippy. The final full gate is running on this head.Finished #236. Branch
mesh-name-placeholderis pushed toorigin; head is0cd06857b1bb2d9e46c50b17e86ba14282de9c91.Root cause: release 5 marked persisted
mesh-<host id>values as placeholders, while attach naming only had the record address and its one-time reported hostname. An IP record yields no machine name; when an older infraternal agent did not report a hostname at attach, the node had no usable source. The release-5 inventory path saved OS facts but did not retain hostnames or ask Mesh to reconcile when inventory arrived. With no reattach from the older agent, the placeholder stayed visible. The read-only production query returned peer10.254.0.3, endpoint10.69.69.217:47823, direct path, and no machine-name field.The fix retains validated inventory hostnames, uses that retained value in Mesh naming, and reconciles plus notifies viewers when the hostname changes. Existing precedence remains hand > server > record > reported > placeholder, and reported names still yield to other hosts' record names. Migration 0028 normalizes old UUID placeholders to
unnamed; unknown names use theunnamedsequence. Tests cover an old agent with an IP record, inventory arriving after attach, and duplicate reported hostnames.Author review checklist: attachment authority remains the authenticated host identity; naming updates and audit revisions share the existing Mesh store path; hostname writes preserve older records when the agent omits the field; live changes publish through the existing Mesh notification; migration is additive; no dependencies or UI components were added.
git diff --checkis clean, the branch is clean, and the branch head matches the pushed ref. Production access was read-only; no deploy or infraternal-dev changes were made.Static stripped release sizes against merge base
857823ce433b: x86_64 21,225,872 -> 21,254,224 bytes (+28,352, 0.134%); arm64 19,427,688 -> 19,456,312 bytes (+28,624, 0.147%). Both remain below D243's 64 KiB limit; no dependencies were added.Final
scripts/verify fastoutput, verbatim:Full raw gate output: verify-fast-final-success.log.
Start: branch
review-mesh-name-placeholder, baseorigin/mesh-name-placeholder0cd06857b1bb2d9e46c50b17e86ba14282de9c91; comparison baseorigin/release-prod-live857823ce433bc3f729c04571e32813073b1cc37e. Reviewing #236 migration numbering/safety, hostname ranking and live reconciliation, and static size attribution. No production changes or deployment.Finding: #236 adds
crates/infraternal-server/migrations/0028_remote_host_hostname.sql, which conflicts with release 6's0028_canvas_layout.sqlas stated in the brief. The merge must renumber the hostname migration to 0029 before integration. Theorigin/release-6ref is absent from this checkout andgit ls-remote; the availableorigin/release-prod-6is a different branch and has migrations only through 0023, so the release-6 filename is not independently verified here.Correction: the local
release-6branch is present atb9ca6ced0229121a27261c84b6909a47bb95e268and containscrates/infraternal-server/migrations/0028_canvas_layout.sql. The earlier note that release 6 was not available was incorrect; only theorigin/release-6remote-tracking ref is absent. The migration collision is confirmed: integration must renumber0028_remote_host_hostname.sqlto0029_remote_host_hostname.sql.Finding: the new
machine_nameparser had no property-test target, although the Definition of Done indocs/PROCESS.md§2 requires parser property coverage. Added boundedhost_name_parsecoverage atfuzz/fuzz_targets/host_name_parse.rs. It reuses the existing libfuzzer-sys dependency and checks normalized, bounded, idempotent output. Compile/run is pending.Live update check: a
changedMesh event refetched the list and replacedbefore-namewithafter-namein the existing tracer view model; 19 API recovery tests passed, 0 failed. Regression test:apps/tracer/src/canvas/mesh/api-recovery.test.ts. Receipt: tracer-mesh-rename-watch-tests.log.Completed server inventory regression coverage.
SHA:
dcbce7a29b4 focused inventory tests passed, covering reported/record precedence, duplicate reports, server identity, hand-name preservation, one canonical rename event, and no normalized-repeat event. Scoped server Clippy passed.
Receipts: tests, Clippy.
Completed migration replay regression coverage.
SHA:
00b6076e0cThe production-shaped v25 fixture passed; the second SQLx migration run kept names, revision and automatic audit count unchanged. Scoped Mesh Clippy passed.
Receipts: migration test, Clippy.
Migration replay detail: the supported SQLx runner is idempotent because it records applied versions and wraps each migration transactionally; the v25 fixture's second runner call made no further name, revision or audit changes (receipt). The raw SQL file is not intended for manual replay: a second bare execution would fail on the existing
hostnamecolumn. Integration still needs this migration renumbered to 0029.Completed parser boundary and property coverage.
SHA:
46cdf0709330 plugin API unit tests and 2 integration tests passed; the bounded property target completed 10,000 cases with no assertion failure. Scoped plugin API and target Clippy passed. The run used
--sanitizer none: Rust 1.101 nightly's address-sanitized link failed on undefined__sancov_gen_symbols before the harness ran; input coverage remained enabled.Receipts: API tests, API Clippy, target Clippy, 10,000-case run.
Completed live Mesh view regression coverage.
SHA:
33cf0b533119 tracer Mesh API recovery tests passed, including a
changedevent replacingbefore-namewithafter-namein the existing view model.bun run checkpassed after frozen-lockfile install of the worktree's existing package set.Receipts: tracer tests, TypeScript check.
The first
scripts/verify iteraterun failed 13 restart tests because this run'sINFRATERNAL_TEST_STATE_ROOTproduced a 116-byte Unix socket path; Linux limits it to 107 bytes. The failures share that fixture-path assertion (crates/infraternal/src/restart_tests.rs:26). I am rerunning with a shorter root inside the job scratch directory. Gate log: verify-iterate.logThe four review commits add scoped regression coverage only. Corrected
INFRATERNAL_TEST_STATE_ROOTto keep the restart fixture socket within Linux's 107-byte limit; the prior 116-byte path caused 13 unrelated fixture failures. Full iterate gate passed at33cf0b53315344e797bee88ca60249cae64a0803:ITERATE gate passed. This is not the final gate: run scripts/verify fast before reporting done.The corrected root yielded 107 bytes. Full gate log
Static size baseline x86_64 completed at merge base
857823ce433bc3f729c04571e32813073b1cc37using the repository static-cargo release recipe. The stripped static PIE is 21,225,872 bytes at/home/kayg/.cache/codex-scratch/review-mesh-name-placeholder/release-baseline/x86_64-unknown-linux-musl/release/infraternal. Per-section comparison follows. Build logBoth merge-base static builds match the expected pre-change sizes. At
857823ce433bc3f729c04571e32813073b1cc37, the stripped static-cargo artifacts are x86_64 21,225,872 bytes and arm64 19,427,688 bytes. Per-section attribution follows after building the reviewed head. arm64 build logStatic size attribution is complete at
33cf0b53315344e797bee88ca60249cae64a0803, with the samescripts/static-cargolocked release recipe and pinned toolchain at merge base and branch head:.text+25,856,.eh_frame+1,952,.gcc_except_table+1,472;.rodataunchanged..text+19,968,.rodata+4,096,.gcc_except_table+1,992,.eh_frame+1,936.The x86_64 LLD map shows the shared parser replaces the Mesh-only parser at 2,953 vs 3,520 bytes (-567);
Store::refresh_host_nameadds 14,139 bytes whilenode_coordination::runfalls by 14,093 (+46 net); the inventory observe closure adds 4,403. The updated attach path adds 13,807. Other LTO changes includeWebSocketState::new_inner+19,261,Removal::finish+13,387 andruntime::build_router_core-19,847. The growth covers hostname validation, retained facts, precedence/collision reconciliation, transactional audit and revision, and the live update path; no dependency was added. No further safe trim was identified, so no trim commit was made.Branch x86 build · x86 section diff · branch arm64 build · arm64 section diff · x86 symbol diff
Finished break-it review for #236.
Verdict: MERGE (no P0/P1). The next-release merge must renumber this branch's 0028_remote_host_hostname.sql to 0029_remote_host_hostname.sql: release-6 already uses 0028_canvas_layout.sql.
HEAD:
33cf0b5331The migration passed a tracked SQLx upgrade/replay test against a production-shaped database with UUID placeholders and a hand-named node; replay left names, revision and audit unchanged. The normal SQLx runner records/applies it transactionally; do not manually replay the raw ALTER TABLE statements.
Name review covered record-name collision with a reported hostname, duplicate reports, odd characters and 200-byte input, changed inventory hostname without flapping, hand-assigned names, the server's own node, unnamed fallback and placeholder normalization. Mesh change publication was traced through the socket event and client refetch; the tracer test confirms the visible name changes in place without reload.
Static size, same locked recipe/profile at merge base and branch head:
The symbol/section attribution and size receipts are in the earlier issue comments. No further safe trim was measured. Reuse already reduces the name parser by 567 B; the rename reconciliation future offsets 14,093 B of the changed attach-name future (net +46 B for those futures). The remaining growth pays for preserving priority, collision protection, persistence/audit/revision and live refresh behavior.
scripts/verify fastexited 0. Full raw output: verify-fast.log.Final gate output (verbatim):
Correction to the finish comment's symbol attribution: the +14,139 B
Store::refresh_host_nameclosure offsets the -14,093 B change to the existingnode_coordination::runclosure (+46 B net).Store::attach_namedis a separate +13,807 B change. The shared name parser is 567 B smaller than the replaced Mesh-only parser. Total binary size deltas are unchanged. The linker-map symbol diff is attached in the earlier size comment.Release 7 started on release-7 at release-6 production base
8f8c84e37. Merging only retry-join-time-r4687863977, review-query-replies-r2b429e5664, and review-mesh-name-placeholder33cf0b533, one merge each. Preserve shipped 0028_canvas_layout; incoming hostname migration becomes 0029. Measure both static targets after each merge; stop above +45 KB x86. Final fast/reproducibility, D307/retry tests and signed perf-VM staging pending. No deploy; monitor01 and owner fixtures untouched. Push only release-7.STOPPED per release brief: the merged D307 gate failed eight browser-side review tests. No product or test fix made after the failure. Do not treat Release 7 as ready.
Committed/pushed head:
8bb6a06497on release-7 only. Retry merge51a74a300has second parent687863977; test-only inode correction8bb6a0649carries dev8a7a0dd50and passed its focused gate. D307 merge is resolved/staged but UNCOMMITTED, MERGE_HEADb429e5664f. Mesh33cf0b533is not merged. No deployment or monitor01 access.Observed failures:
Full merged gate output. Native workspace tests passed, including 600 server tests and the original D307 registry/reply-lane cases: selected native output. fmt, strict clippy, CLI compile-out, cargo-deny, compiler metadata, vendored checksums and TypeScript compiler passed before the browser-unit failure. The new capability regression passed after its documented merge resolution; original review tests were unchanged.
8f8c84e3751a74a300Intermediate D307 image SHA256 (NOT final release artifacts):
Exact static caps/linkage/trust checks passed. x86 remains below the +45,000 stop line.
Final scripts/verify fast and scripts/test-static-reproducibility.py: NOT RUN, blocked by required review failures. Production bundle/web artifacts: NOT BUILT. Migration 0029, database-copy staging, D307 Playwright/PTY, SSH Retry acceptance, signed handoff and screenshots: NOT RUN. Only earlier calibration used the locked perf VM; no staging processes were started there.
Verbatim failed review summary:
Worktree remains on release-7 with the pending D307 merge for review/resumption. Full pending patch and status are attached separately. No failing commit pushed. Needs a reviewed resolution of these review-test failures before continuing the brief.
Stopped handoff receipts: pending resolved D307 patch, staged status, verbatim failed review summary.
Cleanup complete: no running job executables, own build target/temporary fixtures/r7 alias removed, VM public calibration source removed. No staging process was started. Two explicitly labelled intermediate static images remain under /home/kayg/.cache/codex-scratch/release-7/intermediate/d307, with the hashes in the preceding comment. They are not a completed release bundle.
Resume state: worktree /home/kayg/Developer/infraternal/.worktrees/release-7, branch release-7, head
8bb6a06497, pending MERGE_HEADb429e5664f, no unresolved index entries. Upstream review must resolve the eight failed review tests before continuation; no post-failure product/test edits were made here. Native test path workaround for a later run: recreate scratch release-7/t (mode 0700) and the job-owned /home/kayg/.cache/codex-scratch/r7 symlink to it, then restore the pinned toolchain via scripts/auth-toolchain with CARGO_TARGET_DIR pointing at release-7/target. External gate drivers remain under the job scratch root. Final fast/repro, Mesh migration and all release staging remain pending. Issues left open.Resumed release-7 at clean head
8bb6a06497. Retry687863977is already merged as51a74a300; preserve that merge. D307 is excluded by the revised brief. Next: merge review-mesh-name-placeholder33cf0b533, renumber incoming hostname migration to 0029 without changing shipped 0028, prove SQLx migration paths, measure static sizes, run final fast/repro and retained-typing/Retry checks, package and signed perf-VM staging. Push only release-7; no deploy or monitor01 access.First resumed Mesh integration measurement: stripped static x86_64 is 21,385,264 B, +33,056 versus the committed Retry merge and +40,960 versus release 6 (21,344,304). This is 4,040 B below the +45,000 B release stop line. SHA256 e661d519dabb63b2a0874fd8571d3f283d1d38e2d13f00cf5d618d207b567ac9. The integrated delta is 4,704 B above the isolated Mesh review delta (+28,352); no dependencies were added. ARM and native/SQLx gates are still running under the same build slot. D307 remains excluded; merge not committed yet.
Mesh integration static builds completed. Exact caps: x86_64 21,385,264 B (+33,056 versus Retry, +40,960 versus release 6); aarch64 19,570,256 B (+27,952 versus Retry, +34,656 versus release 6). x86 remains 4,040 B below the release stop line. Growth retains hostnames for IP-added hosts and updates live Mesh names through the existing audited revision path, without new dependencies. All 28 shipped migration files are byte-identical to release 6; only incoming hostname migration 0029 is added. Strict clippy and SQLx/native tests are running before the merge commit. mesh-static-sizes-resumed.txt
shipped-migration-bytes.txt
SQLx migrator proof passes on the merged source: 4 migration tests passed, 0 failed. The 0028-to-0029 test preserves all 28 stored checksums, canvas revision/document/initialized state, the admitted host and null legacy hostname; its old UUID label becomes unnamed-42 and integrity_check returns ok. The second SQLx run is idempotent. Fresh schema applies versions 0001..0029 exactly in order. All 28 shipped files also match release 6 byte-for-byte. Hostname/inventory regressions pass 4/4. Strict touched-crate clippy passed. Full iterate remains running before commit. sqlx-migration-resumed.txt
Correction: the earlier migration command used the source filename as its filter and selected 0 tests; the inventory command correctly ran 4 tests. The Rust test-list shows the migrations under enrollment::migration_tests. I ran that actual compiled test module explicitly: 4 passed / 0 failed / 635 filtered out. The new 0028-to-0029 regression printed before=28 after=29 preserved_checksums=28 canvas_revision=7 placeholder=unnamed-42 integrity=ok. The corrected engine transcript replaces the earlier empty attachment; the external focused driver now uses the module filter. No product or test assertions changed. sqlx-migration-resumed.txt
External driver interruption, no product failure: after native focused checks and the TypeScript compiler, mesh-focused.sh exited 127 at
heck: command not found. I edited the running shell file to correct the migration filter; changing its earlier byte lengths shifted the shell reader. The correctly selected enrollment::migration_tests module was run explicitly and passes 4/4, including preserved 28 checksums and 0029. A fresh immutable resume-mesh-validation.sh is now queued through build-slot (PID 610927): rerun TypeScript/check + 27 focused tests, then full iterate before the merge commit. No assertions or product code changed; no commit made. Static sizes/caps remain 21,385,264 / 19,570,256 bytes. Earlier driver transcript: release-7/evidence/mesh-static-resumed.log; resumed gate transcript: release-7/evidence/mesh-validation-resumed.log.Completed Mesh integration:
93753c36ba, second parent33cf0b533, pushed only release-7. D307 excluded. Incoming hostname migration is 0029; shipped 0001..0028 unchanged. SQLx migration, inventory/name, Mesh, plugin API, TypeScript and strict clippy checks passed; all iterate rows passed. Exact static sizes: x86_64 21,385,264 (+40,960 versus release 6); aarch64 19,570,256 (+34,656). Exact-cap and one-byte boundary checks pass. Final fast/repro, packaging and perf-VM staging remain pending.Verbatim iterate final line:
mesh-static-resumed.log
mesh-validation-resumed.log
Final release head:
1d8e23a05a, pushed only release-7; worktree clean. Both #246 recipe rebuilds exactly match the Mesh merge sizes (0 / 0 B tooling delta). Exact-cap, +1 byte rejection and shrink-ratchet controls pass on both targets.8f8c84e3751a74a30093753c36b1d8e23a05x86 is 4,040 B below the brief stop line. scripts/verify fast is now running on this committed head; reproducibility, final focused checks, artifacts and staging follow in the same slot. No production deployment or monitor01 access.
P1 migration finding on release head
1d8e23a05: migration 0029 assigns unnamed- without reserving existing hand-set names, while mesh_nodes.name is UNIQUE COLLATE NOCASE (0012_mesh_api.sql:10). A production-shaped database initialized by the actual release-6 binary at 0028 contains placeholder node 42 and a separate hand-set name unnamed-42. Starting the candidate on a copy exits 1 and rolls back to schema 28 (hostname column absent). A paired copy differing only in that hand-set name starts healthy at schema 29. Both runs use the real server SQLx startup, not a raw SQL replay. The CLI hides the SQLite detail; a Rust regression will assert the exact cause.Stopped only this job's build tree by pinned PID descriptors before source changes. No staging or deployment occurred. I will preserve the hand name and allocate a collision-free unnamed label in the unshipped 0029 migration; shipped 0001..0028 remain untouched. Then remeasure sizes and rerun the head gates before packaging. Earlier green gates did not cover this valid naming collision. migration-name-collision-paired-before.log
The new Rust regression reproduces the exact P1 cause through SQLx before the correction: enrollment::migration_tests::hostname_migration_allocates_around_retained_names ran 1 test and failed with ExecuteMigration(Database(SqliteError { code: 2067, message: "UNIQUE constraint failed: mesh_nodes.name" }), 29). It reserves case-folded hand, reported and record labels, then upgrades two legacy placeholders.
The unshipped 0029 correction now reserves free labels using the existing NOCASE name index, shares the allocation with the audit, and drops its temporary table in the same migration. It never changes an existing hand/record/reported label. The regression rerun is compiling. Shipped 0001..0028 remain unchanged. Existing
1d8e23a05artifacts are baseline-only under release-7/intermediate/before-name-allocation-fix; they are not a release handoff. name-allocation-regression-before.logThe unshipped 0029 correction now passes all 5 SQLx migration tests (0 failed), including the prior SQLite 2067 regression, case-insensitive reserved base/suffix chain, retained hand/reported/record names, one revision increment, matching audit labels, replay and temporary-table cleanup. Workspace clippy passes. Shipped 0001..0028 remain unchanged. Static rebuild/size stop-line and real-binary copied-database checks are in progress before the schema and test commits.
name-allocation-migration-module.log
Pushed schema correction
03db2d286576dfb9c12fcadc8441cfb590d3e518and separate regression commit173a9ba14f458a8451d31c6e72e86cd73b8911f3to release-7 only. Each passed fmt, workspace clippy and all 5 migration tests. Real release-6 database copy now starts healthy at 0029 with the existingunnamed-42retained and legacy node 42 allocatedunnamed-42-1; the normal-name control also starts at 0029. Both processes stopped. Shipped 0001..0028 untouched.Stripped static sizes remain x86 21,385,264 (+40,960 over release 6), ARM 19,570,256 (+34,656): correction adds 0 bytes after layout. Exact caps remain; x86 has 4,040 bytes before the stop line. Production-trust checks pass for both. Final fast/repro/focused checks and replacement artifacts are running on
173a9ba14.migration-name-collision-after.log
Release 7 complete on pushed
release-7, head173a9ba14f458a8451d31c6e72e86cd73b8911f3. Worktree clean. No production deployment; monitor01 untouched. Issues remain open.Merge commits: Retry
51a74a300cc438747be590442b664473eface726(accepted687863977, already carried by the resumed base), Mesh93753c36ba280589e0f3e501c8281603d09b1634(review33cf0b533). The Mesh merge preserves the canvas and legacy-name tests, renumbers the incoming hostname migration to 0029, and rejects the incoming stale size ceilings. D307, #231 and #206 remain outside this integration. Four logical #246 build-normalization/reproducibility commits precede final qualification. Follow-up03db2d286repairs the unshipped migration;173a9ba14separately adds the regression.All 28 shipped migration files are byte-identical to resumed base
8bb6a0649. SQLx proves fresh 0001..0029, a copied production-shaped 0028→0029 database, retained canvas revision 7 and checksums, NULL legacy hostname, integrity and replay. The added regression first failed with SQLite 2067: an existing case-insensitiveunnamed-<id>could block startup. The fix reserves free labels through the existing index, retains hand/reported/record names, shares audit/update allocation, increments the revision once and drops its temporary table. 5 passing migration tests, real-binary collision upgrade, shipped SQL preservation, VM copied-database proof.Exact measured caps are set. x86 remains 4,040 bytes below the +45,000-byte stop line. Growth pays for accepted Retry commit-budget terms (+7,904/+6,704) and hostname validation/retention/audited reconciliation (+33,056/+27,952). No new dependency; normalization and the collision repair add zero shipping bytes.
scripts/verify fast, host build-slotThe browser review spec uses the repository's preview-enabled
proto=productharness; those test assets are separate from shipping assets. Production Mesh screenshots use the shipping build. Existing public Mesh inventory is seeded through the owner API because both shipping host images compile Mesh out; actual admitted host facts rename the IP record torelease7-ip-host, while the older image reports no hostname and keepslegacy-product-host. The hostname column is validated for both, and the view contains nomesh-<uuid>label. Managed runtime admission uses the required public 33-byte owner marker. The final three captures below wait for camera rest and supersede the earlier in-flight captures.Performance evidence is from locked, CPUWeight=10000
infraternal-perf-test(4 vCPU), with kernel/load in the raw receipts. Three paired SQLx upgrades per scale: 1,000-node migration median 12.856→16.123 ms; 10,000-node 56.023→81.532 ms, startup 67.025→94.201 ms. The one-time 25.509 ms cost at 10,000 nodes prevents a valid production database from failing its upgrade. Whole-process HWM ranges at 10,000 nodes: 16,676–18,708→17,428–19,448 KiB; no per-node extrapolation. Both collision matrices preserve reserved names. migration-scale-1000.log, migration-scale-10000.log.Signed staging: 50 users, 10,000 nodes, 128 real PTYs, 12 signed handoffs, 128 resumed input/output checks, six final browser-protocol sockets responsive; candidate refusal and automatic rollback preserve CA state and database integrity. Listener-gap bracket p50/p99 4018.697/4066.569 ms, max probe interval 101.699 ms; release-6 receipt
release-6/evidence/staging-proof-release6-attempt4.logrecorded 3927.363/4037.721 ms. Historical baseline receipt (not a paired rerun). This remains the existing ~4-second range, with no seamless-handoff or improvement claim. Current idle server RSS 21,987,328 bytes, sampled one-core CPU 2.800% over 5 seconds at 128 PTYs. Live SSH Retry retained the same session/writer, confirmed input/output, and left zero unconsumed live tokens.Artifacts retained at
/home/kayg/.cache/codex-scratch/release-7/artifacts, matching the requested layout: manifest, both full server images, package bundle with verified SHA256SUMS, 223-file web directory withindex.html, andweb-dist.tar. MANIFEST.txt.MANIFEST.txt9e21f78fe0703c88a2e56a53c906b27ea057b8c4d2736945b781a5f442932723infraternal-x86_64-musl6a8bba8918b8e9ccf192fb0661725a335af3014396417a8cbd8c5a2c7a9e034cinfraternal-aarch64-musl08aaea858efb8a227fb4fac359862c03e3d9165299de6a488a4ea76a0e219832bundle/infraternal6a8bba8918b8e9ccf192fb0661725a335af3014396417a8cbd8c5a2c7a9e034cbundle/infraternal-x86_64-musl2fde5decab5a35714ba03e059bc151378337fbef0eadf9a1ba6d5dad25f41397bundle/infraternal-aarch64-muslf60304004c1bb13f2cf226ed89340ab2e3eccb84ba5e56c98fc18c380c0ba499bundle/infraternal-x86_64-session-musl3df40232d527c0d96c69e0926233f3db2f4fc4bf535f6b1aab9a1f2667bdbde4bundle/infraternal-aarch64-session-musl7879c3293913fa6b69d9c8b88c881285165eafc70aa3d7bcaa4b168bba4ee875bundle/SHA256SUMS3648bd0e9584ae2c9d1041180fdfdd794acbf1f96535cff49129e1e871bfcba4web-dist.tarcbc405d319607b50af6caf8b2219f54cad6080f73d05d9217b232e2e1a3146daweb-SHA256SUMS7c00f4f6614390e1f3b50884db37ffe6472092b33227e5aa440faf531478d695scripts/verify fastcompletion output verbatim (the complete transcript is attached above):python3 scripts/test-static-reproducibility.pyoutput verbatim:Cache capture receipts: sccache-rust-args.json, sccache-native-x86-args.json, sccache-native-aarch64-args.json, environment.txt.
Cleanup passed: final Mesh PIDs 2155931, 2155933, 2155943, 2155945 and sshd 2153961 are gone; both signed units are unloaded/MainPID 0; no owned fixture or retired-UID processes, disposable account, fixture firewall table or own lock-owner marker remain. VM job/cache directories are removed. Host targets, comparison/public-signing fixtures, archives and short runtime alias are removed; temporary Git worktrees are zero. Shipping artifacts and local evidence remain. perf-cleanup-final.json, host-cleanup-final.json. Author checklist completed.
Repeatable qualification details: release-qualification-environment.txt, Gate driver source, Native runner source, VM calibration source, Mesh fixture source, Scale fixture source, Signed preparation source, Signed runner source, Memory signing source. Source attachments are exact plain-text copies; no private signing material is attached.
Deployed release 7 to production:
173a9ba14(06:34 IST). Contains #230 Retry commit budget and #236 Mesh host names (migration 0029_remote_host_hostname). D307 was dropped from this release after its merge broke #244 review tests; it is re-integrated on d307-on-release6 for release 8.Owner test: unlock the CA; open Mesh: minipc01 should show its hostname once its infraternal agent reports one (an old agent shows the product's host name instead of mesh-); SSH add-host Retry should complete.
Start: branch
mesh-unnamed-name, baseabedd62b068cbd0af0c51488abb0a6e0ddf4ce4e(production 9.3). Investigating the owner's report with read-only production inspection; no production changes or deployment.Finding (read-only production evidence): SQLite URI
mode=roquerySELECT id,name,name_source,last_seen FROM mesh_nodeson monitor01 returned(1, 'monitor01', 'server', NULL)and(3, 'unnamed-3', 'placeholder', NULL). Node 3's stored value is already the displayed placeholder, so this is not only owner hostname redaction. Migrationcrates/infraternal-server/migrations/0029_remote_host_hostname.sqlassignsunnamed-<id>to legacy placeholders;crates/plugins/mesh/src/api.rs::decode_hostleaves that label visible to both owner and viewers. No production data was changed. I’m checking whether minipc01’s current infraternal agent reports a hostname and whether the server applies a later report.Finding: node 3 is
minipc01, but its installed infraternal agent cannot report that hostname. From monitor01, read-only SSH to 10.69.69.217 returnedhostname=minipc01,infraternal --version=infraternal 0.1.0 (stable), andinfraternal-agent.service=active. The running binary SHA256 is5562e6d7d952926c81d1689f1a4a792aef9185a04320ff4576980f3c19e01c6a, matching the release-3 artifact recorded on #201. Release-3 host-facts source has nohostnamefield; current server code accepts that old response shape and keeps the neutral fallback. The CLI'shost facts readadapter is unavailable, so no direct action result was available.The current code already repairs the row on a later hostname report:
remote_inventory::save_factsretains the hostname,apply_factscallsmesh.refresh_host_name, and existing tests cover late reports plus preservation of names from old agents. No production data was changed. This production finding is a stale installed agent, not owner redaction or a current naming-path defect; there is no safe code-only patch that can make the running release-3 binary report a field it does not implement.Focused regression step complete at unchanged head
abedd62b06:node_coordination::testspassed 11/11 (0 failed). This includeslegacy_host_daemon_and_ip_record_do_not_leave_a_uuid_mesh_nameanda_reported_hostname_names_a_host_added_by_address; it confirms old facts keep the neutral fallback and hostname-capable reports name IP-added nodes. No source files changed; no code fix is justified by this production state.Fast-gate finding (pending baseline check):
auth::tests::socket_tests::review_authority_cap::every_socket_in_a_full_place_storm_fails_closed_without_a_replyfailed atcrates/infraternal-server/src/auth/socket_tests/review_authority_cap.rs:162, observing 11 closes against 16 expected within its 15-second socket deadline. It is the only failure reported so far; the other 621 server tests passed and 52 were ignored. I will run this exact test on a detachedorigin/devbaseline immediately after the current gate exits, as required for load-sensitive auth socket failures.Final fast gate on head
abedd62b06exited 1. Verbatim Rust summary:+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| CLI plugin compile-out | PASS |
| clippy | PASS |
| SSH runtime test helper | PASS |
| test | FAIL (101) |
| SSH inode reuse fixture | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
The only test failure was
auth::tests::socket_tests::review_authority_cap::every_socket_in_a_full_place_storm_fails_closed_without_a_reply(11/16 closes before 15 seconds); the server suite otherwise passed 621 tests with 52 ignored. Stripped static sizes: x86_64 21,389,296 bytes and aarch64 19,561,656 bytes, each at its cap. Since the branch is the exact base SHA, size delta vsabedd62b0is 0 bytes. Full raw gate output: verify-fast.log. Detachedorigin/devbaseline rerun for the socket failure is still queued behind the shared build slots.Detached
origin/devbaseline check completed atadee19da07cea19e538cb801858ce0d901841b3a. The exact testauth::tests::socket_tests::review_authority_cap::every_socket_in_a_full_place_storm_fails_closed_without_a_replypassed 1/1 in 2.24s; the baseline server suite was not run. Baseline compilation took 3m25s. Load at queue time was 24.15/22.08/22.07; a sample after the slot was granted was 25.40/24.11/23.09, and at test completion was 10.55/19.90/21.82. The baseline pass does not reproduce the branch failure under identical instantaneous load, so the branch fast-gate failure remains unresolved as a load-sensitive result. No source changes were made. Full baseline output: baseline-auth-socket.log.Finished investigation on
mesh-unnamed-name. HEAD:abedd62b068cbd0af0c51488abb0a6e0ddf4ce4e; pushedorigin/mesh-unnamed-nameat that SHA. The worktree is clean. No code change or production action was justified, so there is no new commit and no deploy.Cause: the read-only production query showed mesh node 3 stored as
name='unnamed-3', name_source='placeholder'. minipc01 reports OS hostnameminipc01, but its installed release-3 infraternal agent binary (SHA2565562e6d7d952926c81d1689f1a4a792aef9185a04320ff4576980f3c19e01c6a) predates the hostname field in host facts. This explains the placeholder; owner hostname redaction is not the cause. Current server code accepts legacy host-facts responses and renames an attached node when a hostname report arrives, so the existing row can recover on the next report without manual DB repair or a migration.Focused test:
node_coordination::testspassed 11/11 (0 failed, 65 filtered).Full
scripts/verify fast: exit 1. Only the host-load-sensitive auth socket test failed:review_authority_cap::every_socket_in_a_full_place_storm_fails_closed_without_a_replyobserved 11 closes instead of 16 within its 15-second deadline. The same test on detached origin/dev baselineadee19da07cea19e538cb801858ce0d901841b3apassed 1/1 in 2.24s; this does not establish that the failure reproduces on baseline. The gate remains failed and is reported as such. Full gate log: verify-fast.log. Baseline output: baseline-auth-socket.log.Static stripped sizes: x86_64 21,389,296 bytes vs 21,389,296 at
abedd62b0, delta 0 bytes; aarch64 19,561,656 bytes. Both static size caps passed. The aarch64 runtime key-memory check was skipped on the x86_64 host.Fast gate summary, verbatim:
Start: branch
agent-lockstep, baseorigin/devadee19da07cea19e538cb801858ce0d901841b3a. Continuing #236 after the read-only release-3 finding. I will inventory enrolled hosts and enrollment paths, trace lockstep triggers and legacy protocol coverage, then implement the smallest compatible repair if it fits D243; no production changes or deployment.Finding (read-only production inventory, monitor01): the
mode=roSQLite query at/var/lib/infraternal/infraternal.sqlitereturned 4 active certificate-backed host records. Three have stored SSH bootstrap coordinates; one has no stored SSH route. The server binary reportsinfraternal 0.1.0 (stable), SHA-256e98f7dfafe827f89fc94d442235f886000a253a0cfbd1213983b864db46b7bf0.Correction/blocker: my inventory script mistakenly attempted strict key-checked SSH probes for every stored coordinate, including
10.69.69.125, which is explicitly out of scope. Strict host-key checking rejected the connection before authentication or remote command execution; no host key was accepted or changed. I have stopped all contact with that address. The script also could not verify versions from other coordinates because their IP-form targets did not match the existing host-key entries. I will continue via the expressly authorized monitor01-to-hostname route only.Finding: the authorized
ssh minipc01read-only version probe failed with exit 255 underStrictHostKeyChecking=yes; no version or binary hash was read, and no host key was accepted or changed. I will not retry this connection. The latest verified host evidence already on #236 (2026-10-17) records minipc01 at release 3, binary SHA-2565562e6d7d952926c81d1689f1a4a792aef9185a04320ff4576980f3c19e01c6a; today’s monitor01 DB inventory records its active rootful host row with stored SSH bootstrap metadata. Other host-version probes from the inventory pass were also refused by strict host-key checking, so exact current per-host versions remain unverified.Source finding and design for #236 (branch
agent-lockstep, baseadee19da07cea19e538cb801858ce0d901841b3a).Production inventory: the server is monitor01, recorded as release 9.3 in the existing #236 history. Its current binary reports
infraternal 0.1.0 (stable), SHA-256e98f7dfafe827f89fc94d442235f886000a253a0cfbd1213983b864db46b7bf0. The read-only database has four active enrolled remote hosts:48fab25a: rootless, uid 1002, created 2026-10-10; no persisted SSH bootstrap coordinate; version and original enrollment route unknown.4f0fdbaf: rootless, uid 1002, created 2026-10-12; persisted SSH bootstrap addresso1, OS Ubuntu; version unknown.1b98a4cf: rootless, uid 1001, created 2026-10-14; persisted SSH bootstrap address10.69.69.125, Debian; version unknown. No more probes will be made to this build host.06561ae7(minipc01): rootful, uid 0, created 2026-10-17; persisted SSH bootstrap address10.69.69.217, Debian. The earlier #236 read-only evidence records release 3 and binary hash5562e6d952926c81d1689f1a4a792aef9185a04320ff4576980f3c19e01c6a; today's strict host-key check did not permit a fresh version read.The three persisted coordinates are SSH bootstrap records; the fourth row has no retained address, so its enrollment route cannot be recovered from this database. Version probes for hosts with stored routes were blocked by strict host-key checking. No host keys were accepted or changed. Raw receipts: inventory, routes, Mesh mapping, minipc probe.
Cause: current
origin/devhas neither the #211 host updater nor a persisted agent-version field. In the unmergedorigin/edge-autoupdatehead698f6aee3,crates/plugins/release/src/host_sender.rs:99-102returns without recording anything whensupports_machine_control()is false;crates/infraternal-server/src/remote_link.rs:624-628defines that capability from the new HELLO bit. The release-3 agent'sremote_client.rs:243-247advertises only the older HELLO capabilities, and its historical source has no Machine handler. It cannot receive that update offer. Currentcrates/infraternal-server/src/remote_inventory.rs:157-174lists OS/address/online but no agent version or update state. So today's server cannot identify the exact release of a silent legacy host, and #211's updater would silently leave a cap-less host behind.Smallest safe product direction: keep signed A/B updates for agents that support machine control; persist last reported version/capability for those agents and expose an explicit
update requiredstate when the capability is absent (version shown as unknown, not guessed). Add a visible Update action that uses the existing SSH install path while the owner is present, reuses the existing host identity, and installs the server's signed image.remote_host_bootstrapstores only address/trust lookup (crates/infraternal-server/migrations/0019_host_removal.sql:3-8,remote_http.rs:336-357), not credentials; D23/D148 prohibit unattended use of stored SSH secrets. The action therefore needs normal owner-present SSH authorization. Hosts without a saved route should show that SSH setup is needed and open the existing add-host/update flow to collect it. Test the cap-less HELLO classification, visible state, and repair path before changing behavior.Size boundary: D243's current x86_64 ceiling in
docs/PROCESS.mdis 21,389,232 B. The latest #211 measurement is 21,935,904 B (+635,888 B against its then-current 21,300,016 B ceiling; +546,672 B against today's ceiling). D301 accepts that measured size for the #211 scope, but the branch is not merged to dev and contains no legacy SSH fallback. This issue's additional path has no measured incremental size and would extend the existing exception, so I did not implement it onagent-lockstep; posting this design for the owner as requested. No production change or deployment was made.Finished investigation on
agent-lockstepatadee19da07cea19e538cb801858ce0d901841b3a, identical toorigin/devand the merge base; the checkout is clean. No code fit the D243 condition for this lane, so no commit or push was made. The inventory, cause, proposed owner-present legacy repair path, and linked production receipts are in the preceding #236 comment. No host was upgraded and nothing was deployed.Disclosure: an earlier inventory loop also attempted a strict host-key-only probe of
10.69.69.125, despite that build host being out of scope. Strict host-key checking rejected it before authentication or a remote command; no key was accepted or changed, and no further contact was made. This was already recorded in the issue./home/kayg/.local/state/codex-jobs/infraternal/orchestrator/build-slot scripts/verify fastcompleted. Exact static sizes match the caps: x86_64 21,389,232 B, aarch64 19,561,656 B; branch delta is 0 B because this head equals the base. The aarch64 key-heap check is not available on this x86_64 host. The release functional section reportedBuild deferred: host capacity limit reached; the static release builds later completed.Verbatim gate summaries:
Full
scripts/verify fasttranscript: gate-fast.log.Additional source finding for #236: the production 9.3 commit
abedd62b068cbd0af0c51488abb0a6e0ddf4ce4econtains nomachine_control,host_sender,agent_version, orUpgradeOfferimplementation incrates/infraternal-agent,crates/infraternal-server, orcrates/plugins(git grepreturned no matches). Thus production 9.3 has no host updater. Separately, the unmerged #211 updater skips peers without its capability, and release 3 has no handler for it. This fully explains why minipc01 stayed on release 3: the production update path is absent, and the pending path would still leave this legacy peer behind.Resume started: edge-autoupdate-r2 from
698f6aee3; merging origin/devadee19da07without rebasing. Initial merge reports 25 conflicted paths. Scope: D251 integration, measured D301 caps, update_recovery and locked perf VM handoff, persisted host version/update state and owner-present legacy SSH repair (D23/D148). No deploy; no contact with 10.69.69.125. Evidence under edge-autoupdate-resume scratch.Additive #236 contract before implementation: retain last reported infraternal-agent version and machine-update capability plus update state in admitted-host inventory; legacy capability absence yields needs_manual_update / "Needs a manual update", with unknown version rather than inference. Repair is an explicit owner-present bootstrap request bound to one existing admitted host, its mode/uid and authenticated SSH destination. It reuses add-host verification, transfer, activation and canary; it must preserve prior host/certificate/session identity on failure and never consume stored SSH secrets unattended (D23/D148). Missing saved SSH coordinates requires normal SSH setup. No new updater engine or dependency. Incremental repair size is measured separately from the D301 merge artifact. Merge finding: 25 conflicted paths; release-script fixtures pass 8/8 after preserving session binaries and SOURCE/review admission.
Legacy-repair safety finding: RemoteBackend::retire_failed currently cuts and retires a fresh bootstrap host; reusing that path unchanged for an existing enrolled host would revoke its working authority on a failed update (bootstrap_remote.rs:596-633). The explicit repair path will preserve the existing identity on failure and use the regular full-image installation transaction, without publishing another early shell or carrying repair authority into detached setup retries. Existing PTY shims remain owned by their sessions. This is required in addition to bypassing the duplicate-host refusal; no unattended SSH fallback is being added. The release signer interoperability fixture also passes with CARGO_TARGET_DIR supplied (1/1); the prior broad discovery had two missing INFRATERNAL_BIN imports and one missing CARGO_TARGET_DIR, not three CLI-module errors.
Prepared the #236 legacy-inventory and owner-present repair slices outside the checkout while the merge gate runs. These are resumable drafts, not applied changes or branch validation. The strict TypeScript overlay rehearsal reports 0 diagnostics; Rust drafts were syntax-checked only. Repair reuses the existing SSH install transaction, binds the admitted host identity, scopes each retry reservation separately, and never retires that identity on a failed repair.
legacy-preparation.tar.gz
draft-types.log
Repair-specific readiness finding: bootstrap_remote::wait_installed_actor admits an installed route by durable host UUID. A repair deliberately reuses that UUID, unlike fresh setup, so the predecessor route must not satisfy completion. The repair adapter will additionally wait within its existing link-scaled readiness budget for release.status to report the replacement version (bounded 4096-byte response), rechecking owner and reservation ownership. This uses the existing inventory watch; no polling task or unattended SSH sign-in.
Merged origin/dev
adee19da07into edge-autoupdate-r2 without rebasing. Merge commita9c8fc03ceis pushed. All 26 conflict resolutions and their alternatives are recorded in the commit body. Full Rust gate rows passed in merge-iterate-6.log (server 679 passed, 56 ignored). After the explicit standalone runtime feature fix, fmt and plugin-api socket-host clippy/tests passed (44 unit / 2 doc tests); the complete TypeScript gate passed: canvas/UI 348, connection 105, terminal query 17, protocol 39; production bundle transfer checks passed. Static production-trust x86/ARM artifacts and the dev size comparator are now building; final verify fast still pending.merge-feature-followup.log
Repair integration finding: SSH lifecycle Activity tracks component shutdown (crates/plugins/ssh/src/lifecycle.rs:34), while daemon handoff uses plugin-api activity::Activity; these are separate lifetimes. The host adapter must retain the daemon foreground fence through the actual installation and rollback, including socket cancellation, and release it before an idle wizard remains open. Reusing a defaulted backend resource hook and the existing D251 wait_enter fence; no new task, timer, library or persisted secret. The same installation path protects fresh setup as well as repair. Regression coverage will hold cleanup after cancellation to prove the fence remains active.
Legacy-state integration finding: remote_runtime::attach publishes node channels for temporary SSH setup routes as well as installed infraternal agents. Both a temporary route and a legacy daemon can lack MACHINE, so absence alone must not label the setup route as a legacy host. Proposing additive NodeChannel::is_provisioning() (default false), supplied from NodeBridge’s existing admitted AuthorityGuard rather than peer input. Sender and inventory skip capability/version observations for temporary routes; an outstanding bootstrap retirement intent also suppresses manual repair until setup completes. No wire change or dependency addition. This preserves unknown version during setup and avoids offering a second installation over an active one.
Updated resume checkpoint at pushed head
35f1107db. The immutable next runner is waiting for a host build slot; the latest implementation drafts, ownership/readiness/fence regressions and exact remaining gates are attached. Legacy slices remain unapplied until their separate gates run. No deploy.current-resume.txt
legacy-preparation-current.tar.gz
Pushed exact D301 cap ratchet
d3b5dc0b8e; unchanged shipping profiles, production trust passed. Both architectures passed exact-size validation, reject one byte above cap, and require a ratchet after shrink. This is the retained updater-only baseline for measuring #236 separately.x86_64: updater baseline 22,026,848 B; D303 integration delta from pure merge +2,112 B.
aarch64: updater baseline 20,127,592 B; D303 integration delta from pure merge +2,432 B.
control-static-sizes.txt
d301-caps.log
The first #236 migration gate stopped on a remote-only clippy configuration: infraternal-agent/src/plugins.rs kernel callbacks retain a fallible function-pointer signature with mesh compiled out, triggering unnecessary_wraps. No migration test ran or was waived. A separate correction scopes the allowance to non-mesh/non-Linux builds; queued remote-only clippy and tests precede the migration retry. D301 cap commit is pushed at
d3b5dc0b8e.Resume checkpoint: branch edge-autoupdate-r2, pushed head
d3b5dc0b8e. Mergea9c8fc03c, D303 correction35f1107db, exact updater-only caps 22,026,848 B x86_64 / 20,127,592 B aarch64. Migration 0031 is applied but uncommitted; gate first encountered a non-mesh callback lint, not a migration failure. Active immutable legacy-resume-v3.sh is waiting through the build-slot wrapper, then gates/commits that correction, schema, trusted setup scope, sender observations, durable inventory, SSH repair, server repair, UI and development-only coverage in separate steps. Each step stops before commit on a failed gate. Draft archive is continuation material, not landed code or test evidence. After that sequence, review-artifacts-v1.sh adds the docs commit, runs explicit update_recovery, builds the detached dev comparator, prepares a release warm-handoff harness, and rebuilds ordinary production-trust artifacts. VM measurements, separate #236 size review/cap ratchet, author review, final verify fast and cleanup remain. No deployment or acceptance-host contact.legacy-preparation-v3.tar.gz
Keep remote kernel callbacks lint-clean without mesh (#211)
Pushed
45367cb37b. fmt and touched-crate clippy passed.test result: ok. 149 passed; 0 failed; 20 ignored; 0 measured; 0 filtered out;
kernel-callback-gate.log
Pre-implementation contract review: inventory already suppresses repair while remote_bootstrap_retirement_intents retains a fresh setup, but a direct setup-socket repair also needs the same ledger predicate. The prepared bootstrap_repair.rs preflight now checks that table before SSH resolution and again at issuance; a real-SQLite regression requires zero SSH opens and the original intent retained. This keeps fresh-setup retirement distinct from repair cleanup, which must preserve admitted authority. No deployed behavior is inferred. Source/test will land with the separate server-repair slice.
Retain nullable host update observations across reconnects (#236)
Pushed
3f1b88a2f9. fmt and touched-crate clippy passed.test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 736 filtered out;
legacy-schema-gate.log
Verification correction for pushed schema commit
3f1b88a2f9: the runner used the source filename remote_migration_tests instead of the Rust module enrollment::migration_tests, so its test row matched zero cases. fmt/clippy passed, but that unit-test row is not evidence. The runner shell PID 2276652 is paused before the next commit while the correct module runs under this job’s already-held build slot. No source change or history rewrite; corrected output will follow. Future step helpers now reject a wholly zero-test Rust result.Corrected migration gate for
3f1b88a2f9now passes the actual enrollment::migration_tests module: 6 passed, 0 failed, including the v30→31 identity/unknown-version and constraints test. The existing release-6 copy retains all 28 original checksums, canvas revision 7 and SQLite integrity=ok. The earlier zero-test output remains attached as an explicitly invalid unit-test receipt. No migration source changed after the commit. Resuming the held runner; scope clippy has also passed.legacy-schema-tests-corrected.log
Distinguish temporary SSH setup from installed node capability (#236)
Pushed
34086298d5. fmt and touched-crate clippy passed.test result: ok. 44 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out;
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 736 filtered out;
legacy-scope-gate.log
Inventory review found a restart edge: release_updates.current_version is retained and can still identify the previous server before updater reconciliation. A stored up_to_date host must not be qualified by that stale target. The inventory slice now includes a failing-first SQLite test with retained target/host 0.0.0 versus this process’s compiled stamp; the guard rejects that target as unknown rather than filling either version from package metadata. It adds no task, timer, image read or query. The prepared runner will capture the assertion failure before applying the guard, then run the full inventory gate. This is a current-development finding, not evidence of deployed behavior.
Publish host identity and update phases from the existing sender (#236)
Pushed
b66e3f14d9. fmt and touched-crate clippy passed.test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 30 filtered out;
legacy-sender-gate.log
UI contract addition before implementation: the existing shared Hosts settings panel will show full retained versions and states through packages/ui createKeyValueList and statusBlock; one-line palette hints remain a shortcut, not the only readable facts. Extend StatusActionPref with optional facts and HostsApi with a changing status source/invalidation callback; existing consumers keep their defaults. Keyed entries retain unchanged controls and skip unchanged facts. Initial mounting is bounded to 16 status groups, with explicit expansion by 16 regardless of total inventory count; no new styles, timer or library. The production desktop/phone fixture will contain 32 remote rows, require 16→32 expansion without replacing the original host block, and start the same owner-present repair from its existing settings action. Raw screenshots remain for external visual review.
Current checkpoint: edge-autoupdate-r2 pushed head
b66e3f14d. New pushed slices:45367cb37kernel callbacks;3f1b88a2fschema;34086298dtrusted temporary-setup scope;b66e3f14dsender observations. Schema’s original filter matched zero tests; the corrected actual module passed all 6, attached separately. Scope passed 44 API cases plus the actual node bridge case. Sender passed 11. Pending inventory passed 3 observation tests and 12 inventory cases; its stale-server-target regression failed by assertion before the guard. The no-default-feature matrix then found two shared auth-fixture cfg assumptions, now corrected but not yet gated/committed.Active immutable legacy-resume-v6.sh is queued through build-slot (tool session 77738). It gates/commits the two fixture corrections first, then inventory, SSH repair, server repair, UI, request/scale coverage separately. No paused shell remains. The attached patch captures actual pending native files; do not blindly rerun source appliers. The bundle includes later prepared steps. Updated UI uses existing shared Hosts settings/fact rows with 16-group initial mounting and explicit 16-group expansion; production desktop/phone fixture covers 32 hosts and repair consent. Server repair now explicitly refuses a pending fresh setup and checks execution UID before invitation reissue.
After v6 succeeds, run review-artifacts-v1.sh through the same build-slot: docs commit, explicit update_recovery, exact detached dev static comparator, test-only dev inventory harness, candidate release warm-handoff preparation, ordinary production-trust final static builds. Then run warm handoff and paired 128-host inventory on the authorized perf VM outside the build-slot; inventory-perf-vm.py transfers only public test executables/libraries and runs both variants under one short shared lock/weighted scope. Separate #236 size delta/cap ratchet, author checklist, final verify fast, receipts and cleanup remain. No deployment or acceptance-host contact.
native-pending-v6.patch
legacy-preparation-v6.tar.gz
Keep shared auth fixtures buildable without mesh and updates (#211)
Pushed
d632949e6e. fmt and touched-crate clippy passed.test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 744 filtered out;
compileout-fixtures-gate.log
inventory-before-compileout-fix.log
Expose each host’s running version and update readiness in inventory (#236)
Pushed
6852b493ce. fmt and touched-crate clippy passed.test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 742 filtered out;
test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 733 filtered out;
legacy-inventory-gate.log
inventory-target-red.log
Repair completion review: after the running-version proof, an account session can remain valid while the host is concurrently removed. Completion must repeat the existing Auth::bootstrap_host active-owner predicate before publishing success; preserving the already admitted host is not permission to complete after its revocation. Added a real-SQLite completion probe that revokes the row between attempt reservation and completion. The prepared server-repair slice runs that probe to an assertion failure before applying the existing predicate, then runs the full backend gate. No new authority mechanism, query helper or background work.
Compile-out review found an actual capability mismatch: infraternal-agent/src/remote_client.rs client_greeting always ORs MACHINE, and daemon.rs does so for any managed execution UID, even with the optional release receiver absent. That makes agent_update_capable incorrect for a receiver-free build and suppresses manual repair. Prepared a separate failing-first greeting test for remote without release. The correction centralizes the existing bit in plugin composition, emits zero when the receiver is compiled out, and preserves runtime-disabled support/Off status and existing authority checks. Reject classifying status-call failures as legacy because a timeout is not evidence of missing support. No new bit, crate, feature or shipping-default behavior. This step follows request/scale coverage before documentation and artifact builds.
Reuse SSH installation for an owner-present single-host repair (#236)
Pushed
945bbc6ea6. fmt and touched-crate clippy passed.test result: ok. 46 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out;
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out;
test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out;
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out;
test result: ok. 6 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out;
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out;
test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out;
test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out;
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out;
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out;
test result: ok. 0 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out;
test result: ok. 95 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out;
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out;
test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out;
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out;
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out;
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out;
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out;
test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out;
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out;
test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out;
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out;
test result: ok. 11 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out;
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out;
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out;
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out;
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out;
test result: ok. 0 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out;
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out;
legacy-ssh-gate.log
installation-fence-red.log
Checkpoint: pushed head
945bbc6ea(SSH repair), following inventory6852b493cand compile-out fixture correctiond632949e6. SSH fmt/clippy and all-target tests passed: 221 passing executions, 14 ignored, 29 test binaries. Cancellation fence regression failed by the expected assertion before the worker fix. Attempts now share one private cookie allocation and use fresh public reservation nonces.Server repair is applied but uncommitted. Both intended regressions reached assertions: obsolete unpublished guard removed its successor; completion accepted a concurrently removed host. Corrections applied. First clippy then found wildcard imports, function length and branch ordering; these are fixed by explicit imports, a synchronous reserve_attempt helper preserving its lock boundary, and branch reordering. Immutable legacy-resume-v8.sh is queued through build-slot (tool session 74180); it runs the server gate then commits/pushes, followed by legacy-ui-steps.sh and coverage-steps.sh. Do not replay already applied native appliers. Attached patch captures all actual pending server files.
Prepared UI now also exposes full, wrapping version/state facts in shared Hosts settings; initial 16 status groups, explicit 16-group expansion, stable keyed controls. Strict overlay check of actual app configuration plus desktop/phone spec reports zero diagnostics; actual branch/production-browser gates still pending. Browser fixture has 32 hosts and checks 16→32 expansion, original control retention, unknown version, current edge version and explicit root consent. Browser temporary profiles stay under this job’s cache, with launch/exit receipts.
After v8 succeeds, slot-wrap review-artifacts-v1.sh. It first runs the separate failing-first receiver-capability correction: receiver-free infraternal-agent builds currently advertise MACHINE unconditionally; factor the existing bit through plugin composition, preserve runtime-disabled support, run both agent feature matrices. Then docs commit, explicit update_recovery, exact dev static comparator, test-only baseline inventory harness, candidate release warm-handoff preparation and ordinary production-trust final static builds. Outside the build-slot, measure warm handoff and paired 128-host inventory on authorized VM 208, with shared lock/CPUWeight and bounded lock hold. Then review separate legacy size delta, ratchet caps only from measured justified sizes, author checklist, final verify fast verbatim and cleanup. No deploy or acceptance-host contact.
server-repair-pending-v8.patch
legacy-preparation-v8.tar.gz
Bind manual repair to admitted host authority before SSH (#236)
Pushed
b0212568ac. fmt and touched-crate clippy passed.test result: ok. 42 passed; 0 failed; 2 ignored; 0 measured; 708 filtered out;
legacy-repair-gate.log
repair-reservation-red.log
repair-completion-red.log
Let shared mark loading resolve without a rendering document (#236)
Pushed
643a5af84d. fmt and touched-crate clippy passed.1 pass
0 fail
host-mark-document-gate.log
host-mark-document-red.log
Resume checkpoint: edge-autoupdate-r2 at
643a5af84d, pushed to origin. Native manual-repair commits throughb0212568aand the shared non-DOM mark-loader correction643a5af84are complete. Pending UI diff attached.The single owned build-slot wrapper PID 215909 is waiting to run legacy-resume-v11.sh. It reruns only production browsers after successful source checks (104 unit cases, typecheck, production build). Chromium desktop and WebKit phone are separate CLI invocations because Playwright rejects browserName inside describe; that prior configuration failure launched no browser. Successful UI checks commit/push and attach four screenshots, then coverage-steps.sh chains review-artifacts-v1.sh. Each slice stops on failure and commits only its own paths.
Next prepared scripts in the scratch job root: coverage-steps.sh; agent-capability-steps.sh; docs-steps.sh; review-artifacts-v1.sh; inventory-perf-vm.py. The documentation runner's embedded Python now compiles. No running shell file was edited.
After artifacts: run warm-handoff VM proof with reuse-only public fixture, then paired baseline/candidate inventory VM measurement. Review separate legacy size delta before an exact-cap commit. Run final scripts/verify fast through build-slot and attach verbatim output to both issues. Cleanup remains pending. No deployment or acceptance-host contact.
ui-pending-v11.patch
author-review.md
Resource wait at 2026-10-22T00:47:12.450083+00:00: the single edge-autoupdate-resume build-slot wrapper PID 215909 has waited 37:23 for a shared slot. It has not started the corrected browser rerun; no new gate result is claimed. The three normal slots are occupied by other jobs. The runner resumes automatically when a slot is free; no owner action requested. Head remains
643a5af84, with pending UI and remaining proofs recorded in resume-v11.Shared host free space reached 15 GB while this job remained queued. Reclaimed 8,046,137,410 bytes of this job’s incremental cache and 18 completed inactive test executables, under its Cargo cache lock. Active executable inodes were excluded. Raw evidence, source, target libraries, release artifacts and all other jobs were preserved. Free space afterward was 21 GB; later checks may relink removed test executables.
Free space fell again to 12 GB while the job remained queued. Cleared the remaining completed debug cache (21,983,287,521 bytes) under its exclusive Cargo lock, preserving the lock path, release artifacts, comparison cache, fixtures, source and all evidence. Free space afterward was 40 GB. Upcoming Rust gates must rebuild debug artifacts; this is cache loss rather than a code or test failure. Only this job’s target/debug was changed.
Production-build desktop Chromium flow: 1 passed, covering retained version/state, bounded host expansion, retained controls and explicit root consent. Phone WebKit launched PID 1109039 but rejected the shared Chromium-only --disable-renderer-backgrounding option before assertions; the existing TRACER_CHROMIUM_FLAGS override is now empty for that rerun. Chromium PID 1105027 and WebKit PID 1109039 are both absent; test servers terminated. No source behavior change was needed for the launch correction.
The replacement single wrapper is PID 1120904, running legacy-resume-v12.sh when a slot is free. It retains the passing desktop result and reruns phone only, then continues through coverage and artifact preparation.
ui-webkit-launch-before-fix.log
Closed by the orchestrator during the 2026-10-28 handover (#254), on the owner's request to close finished issues. Evidence: Honest Mesh view and host names deployed in release 5 (
c00c6364e) and release 7 (173a9ba14), both ancestors of dev and prod. Reopen if anything is still missing.kayg referenced this issue2026-10-28 17:53:55 +00:00
Resumed implementation on shared build VM as agent. Branch edge-autoupdate-r2, base
643a5af84d; recovered WIPd4a1bf6eawith soft reset for atomic split. Current dev is07c5da77b. Reading prior histories before continuing. Will preserve #255 Tokio/AsyncFd, push each gated slice, and prepare public artifacts plus exact perf-test-01 commands for orchestrator execution. No perf-host or acceptance-host contact, no deployment. #236 is closed by orchestrator; this continuation records the separately requested legacy updater work without changing issue state.Recovered WIP split and pushed:
be2d93c36shared keyed/bounded Hosts panel;c87b1c651authenticated browser inventory fields;6c9fa4178explicit owner-present repair wizard/socket;749e4e526Hosts/palette integration and production browser fixture. Typecheck passes; 104 focused tests pass. Production Chromium desktop passes (32 rows, expansion 16→32, retained controls, unknown/current versions, root consent). Phone WebKit initially could not launch because pinned webkit-2311 was absent; installed that browser and will rerun separately. Receiver-free capability assertion is compiling before the correction. No timing evidence from this host.Warm proof requirement found in the existing harness: signed_deploy_fixture asserts effective UID 0 and launches a system service with BindPaths=:/run, Restart=always and KillMode=control-group; helper deployment also requires UID 0. The current harness additionally restricts fixtures to retired /root/infraternal-bench paths. I will prepare public signed images/harness and adapt the fixture path to the authorized ~/infraternal-perf tree; the orchestrator must decide whether to permit privileged systemd execution on perf-test-01. Inventory measurements require neither root nor system services. No perf host contacted.
ui-check.log
ui-unit.log
browser-desktop.log
Production WebKit phone flow passes after installing pinned webkit-2311 (390×844, DPR 3, one worker). These screenshots are for external visual review; no visual-quality verdict by this implementation job. Source includes the current-dev merge result, which is undergoing its iterate gate.
browser-phone.log
Warm-proof requirement correction: the updater fixture uses STAGING_KILL_MODE="process" (deploy_staging_tests.rs), preserving PTY shims across handoff. My earlier note incorrectly said control-group; that applies to a different local probe, not this update proof. The required privilege is still effective UID 0 plus systemd transient-service creation and BindPaths=:/run. Normal teardown stops that exact unit and its owned shims. No UID1000 manager or runtime bind is required for the selected reconnect case; the optional managed-host proof is separate. Production WebKit phone assertions now pass; screenshots are attached to #236. Merge iterate is building the full workspace.
Merged dev
07c5da77b, preserving #255 Tokio 1.53.3 and exact owned AsyncFd sources (empty comparison). Merge resolutions are recorded in the commit. Fresh iterate passes all Rust rows except workspace test: 707 server cases passed, 56 ignored, one checkpoint parent failed because the invocation omitted its state-root variable. The exact parent and isolated child then both passed with the owned root restored. TypeScript full row passed. This is intermediate validation; final fast remains required.Pushed head
8ab6d783f6. No deploy or perf-host contact.merge-iterate-green.log
merge-checkpoint-green.log
merge-ts.log
Protocol integration finding, reproduced by the receiver-free remote greeting assertion after the composition correction: MACHINE CAPABILITY (infraternal-protocol/src/machine.rs:4) and dev REMOTE_PATH_BACKUP (plugin-api/src/channel.rs:54) both equal 1<<6. Native dev peers therefore falsely appear update-capable. Proposed additive correction before implementation: preserve dev transport bits 0–7 exactly and allocate MACHINE bit 8, with no bit-6 alias; retain all machine envelope bytes/limits and Hello.version=1. The task records production has no updater; pre-release branch fixtures must be rebuilt, while ordinary older hosts correctly require manual repair. Add a disjoint-capability regression and update the two protocol contracts. This avoids misclassifying a shipping dev transport capability or weakening negotiation.
Corrected Hello allocation collision: MACHINE uses bit 8; dev native path backup retains bit 6. Disjointness regression failed at overlap 64 before correction. Protocol and plugin API fmt, Clippy/all-targets and tests passed. No envelope or Hello.version change; no bit-6 alias.
Pushed head
df044123be. No deploy or perf-host contact.capability-collision-red.log
capability-collision-green.log
Receiver advertisement correction passed fmt, both all-target Clippy configurations, 151 receiver-free tests, 152 receiver-enabled tests, no-feature and release-without-remote compile checks, and runtime-disabled receiver reconstruction. Both greeting assertions failed before the composition correction, after the bit allocation collision was removed.
Pushed head
d559760b0d. No deploy or perf-host contact.receiver-isolated-red.log
daemon-receiver-bit8-red.log
receiver-green-bit8.log
Repair parser coverage passed fmt, server all-target Clippy, 16 bootstrap API tests, and the existing SSH input corpus target Clippy. Shipping named features are unchanged; test-only decoder entry point shares the existing 32 KiB socket bound.
Pushed head
2e6bdced51. No deploy or perf-host contact.request-coverage-gate.log
request-features.txt
Added ignored perf-VM-only inventory harness: 128 admitted hosts, complete snapshot/metadata bytes, changed and unchanged durable observations; SQLite WAL/Normal pool eight, runtime four workers. Fmt and server all-target Clippy pass; 12 inventory tests pass, measurement stays ignored. Ordinary release dev/candidate harnesses will use identical feature recipes; no local performance claim.
Pushed head
f4ccb9690b. No deploy or perf-host contact.inventory-harness-gate.log
Staging fixture portability passes failing-first current-root assertion, two Rust boundary tests, two Python scope/canonical escape tests, three existing artifact tests, fmt and server all-target Clippy. Explicit current base requires job/signed/run; privileged systemd proof still belongs to orchestrator.
Pushed head
6daea97a6d. No deploy or perf-host contact.staging-root-red.log
staging-root-green.log
Documented retained running identities and update states, shared Hosts/palette repair, owner/mode/UID/route checks, one-use sign-in, failure cleanup and D303 local refusal codes. Fmt and whitespace checks pass. Explicit recovery, final production browser reruns, static comparisons and final fast follow.
Pushed head
8ca9575ea7. No deploy or perf-host contact.host-docs-gate.log
Head
8ca9575ea: explicit update_recovery passes: 26 passed, 0 failed, 1 ignored. Production Chromium desktop (1280×900) and WebKit phone (390×844, DPR3) pass in separate invocations, one worker, port 44211, RTT simulation disabled. Checked Hosts/palette retained identity/state, 16→32 expansion, keyed control retention and unchecked root consent. No visual-quality judgment or timing claim; screenshots are for owner review. All logged browser PIDs 794759, 795042 and MiniBrowser 795048 are absent (ps exit 1); owned test port is closed; no browser profile remains. T3 preview blank tab used for availability check was closed. No perf host contacted.final-browser-desktop.log
final-browser-phone.log
final-browser-cleanup.txt
update-recovery-final.log
Build checkpoint at pushed head
8ca9575ea. Same-recipe dev07c5da77bcontrols complete: x86_64 21,400,400 B; aarch64 19,575,064 B. Production-trust checks pass. Wrapper/config hashes and all release profiles match across dev/updater-only/candidate. Updater-only builds now running; its source includes the same bit-8 and compiled-receiver corrections, so the later legacy delta excludes them. No cap changed yet. Warm runner also uses a short owned fixture root: the physical shim socket is 107 bytes; functional bind/connect succeeds at 107 and refuses the original 111-byte path. No perf VM contact or runtime performance claim. Candidate/staging artifacts, exact caps, final fast, archive handoff and cleanup remain.static-sizes.txt
static-recipe.json
warm-path-bound.txt
warm-path-functional.txt
author-review-current.txt
Same-recipe updater-only control on current dev
07c5da77b: x86_64 22,036,328 B versus dev 21,400,400 B = +635,928 B. Production-trust check PASS. This control isd3b5dc0b8merged with dev plus the same MACHINE bit-8/compiled-receiver corrections; legacy inventory/repair is excluded. This matches the approximately +636 KB updater scope accepted by D301. ARM control and both final candidate artifacts remain building; no cap changed and final fast remains pending.Both ordinary updater-only controls complete with production-trust PASS: x86_64 22,036,328 B (+635,928 B versus dev
07c5da77b), aarch64 20,139,648 B (+564,584 B). Same pinned static recipe/profiles; source control tree a6a1e4485b2f8de6deb79248771de192a96e0f3a. Both deltas fit the D301 updater exception. Baseline inventory harness is building next, followed by public warm fixtures and final ordinary candidate images/harness. Separate legacy delta, exact-cap commit and final fast are still pending.Release-profile warm fixtures prepared at source
8ca9575ea, prepare-only returned before remote execution. Public fixture is public-transfer-57cb3fb2; its exact ignored reconnect test lists successfully using the packaged loader/libraries. No perf proof executed. Ordinary candidate static builds now running. Dev inventory harness lists its exact measurement test; compiled server/API features exclude staging-trust and its exact compiled-authorities regression passes. The dev test binary contains the marker literal in that regression, so static-image marker scanning is unsuitable for that test executable. The archive will retain feature receipts and the verifier result.warm-handoff-prepare.log
inventory-harness-trust.txt
Ordinary production-trust x86_64 candidate at
8ca9575ea: 22,084,480 B; dev07c5da77b: 21,400,400 B; updater-only control: 22,036,328 B. Total +684,080 B = D301 updater +635,928 B + separately measured #236 legacy inventory/owner-present repair +48,152 B (below 64 KiB, above 16 KiB). Justification: authenticated retained version/capability/state, durable observation publication, owner/mode/UID/route-bound repair and existing SSH lifecycle authorization/reservation/cleanup safeguards. Same shipping dependency graph, Cargo features, profiles and compiler recipe; legacy-dependencies.diff is empty. No new polling worker or library. Do not attribute this additional cost to the updater-only exception. Existing recovery, observation, repair and production-browser gates are issue-attached; runtime scale evidence remains pending orchestrator. ARM candidate and final fast still building/pending; exact caps unchanged until both sizes are known.Pushed exact-cap commit
db7b79c6e1. Same-recipe stripped static production-trust sizes: x86_64 22,084,480 B (+684,080 against dev), aarch64 20,185,112 B (+610,048). Separate legacy inventory/repair costs: +48,152 / +45,464 B; updater-only costs: +635,928 / +564,584 B (D301). The separate legacy cost is justified by authenticated durable observations and owner/mode/UID/route-bound reuse of SSH installation/reservation/cleanup; no shipping dependency/feature/profile changes or polling task. PROCESS records all three variants, supersedes the old ceilings, and keeps the #211 trim follow-up.Fmt, Bash syntax and whitespace checks pass. Both architectures pass production trust, stripped/static linkage and exact-byte checks; +1 byte is refused and -1 byte requires a downward ratchet.
Final ordinary inventory harness is still building. Perf archive/handoff, final scripts/verify fast and cleanup remain.
final-cap-gate.log
static-sizes.txt
final-size-comparison.json
Perf handoff ready at pushed head
db7b79c6e1; final scripts/verify fast is running on that head. No runtime perf result is claimed yet. Artifact source is8ca9575ea7; the later cap commit changes only ceilings/documentation.Build host: 6by32-compute02
Archive:
/home/agent/.cache/codex-scratch/edge-autoupdate-r2/e211-proof-8ca9575ea753.tar.xzBytes: 69779616
SHA-256:
51fb06283fc8434af6733f2e6fc36ebb7244b27b25a2ef412c783609b3ea7c9cOrchestrator: copy this public archive to perf-test-01 under
/home/agent/infraternal-perf/, verify the SHA above, then extract as agent:Paired inventory command, as agent (no root):
Five adjacent alternating baseline/candidate pairs; 128 admitted records, zero connected channels; 128 snapshot samples each; candidate 128-way changed/unchanged observation bursts; metadata bytes separate from wait4 process peak RSS. Both ordinary harnesses use the same release profile/features and exclude staging-trust; source patches, feature receipts, loader/libs and machine/load capture are packaged. Each child is bounded at 120 seconds; total maximum remains below the 30-minute lock window.
Warm handoff requires the orchestrator's decision on privileged execution. The existing harness asserts effective UID 0 and creates its own transient systemd service with
BindPaths=<owned run>/r:/run,Restart=alwaysandKillMode=processso the 128 PTYs survive the handoff. The selected reconnect case uses one active stream and does not require a UID-1000 user manager. Python 3, systemd/systemd-run, procfs/cgroupfs and a working login shell are required. Agent should create the parent above before any root invocation. The fixture stays under/home/agent/infraternal-perf/e211/signed/r<4 hex>; its actual shim socket is 107 bytes. Runner checks the canonical root/path bound, uses only loopback HTTP, enforces a 1200-second harness deadline, and cleans only its own directory/bucket and services whose ExecStart is inside that exact root.If the orchestrator authorizes root/systemd, the exact command is:
Please attach both complete logs and command exit statuses to #211. All runtime timing/CPU/memory conclusions remain pending these VM runs. No perf host or acceptance host was contacted from this job; no deployment.
perf-archive.txt
MANIFEST.json
run-inventory.py.txt
run-warm.py.txt
baseline-inventory.patch.txt
updater-only.patch.txt
Final fast first attempt found eight CLI restart regressions under the runner-provided symlinked INFRATERNAL_TEST_STATE_ROOT. Protected executable checks refuse symlink ancestors; the reload test also compared the alias against canonical current_exe (e211 versus edge-autoupdate-r2/state), and the parent-escape test counted lexical depth. Two exact failing tests pass with the same compiled executable under a short, physical private root (rootless pinned-image admission and reload after inode replacement). This confirms runner configuration, not a shipping-code regression. No production check will be weakened. The corrected runner uses the owned physical ~/.cache/codex-scratch/e211r root; failed transcript will be retained, and full fast reruns on the unchanged pushed head
db7b79c6eafter this attempt exits. Perf archive/commands already on #211 remain unchanged.physical-root-probe.log
Pushed fixture-only correction
83db05b380. The first full fast run failed CLI plugin compile-out/workspace CLI tests on the runner symlink root, plus the isolated shipping recipe fixture. All other Rust rows passed. The recipe fixture omitted the merged real driver's remap helper, stubbed required inline Python and had not isolated the newly added CLI group artifact check. It now supplies the real helper/interpreter for driver snippets, records admission arguments after only the known target-remap configuration prefixes, and isolates unrelated artifact checks as before. The actual production wrapper and artifact checks are unchanged; four production-mode/version cases, fmt and whitespace pass.Full fast now reruns on this pushed head with the owned short physical root ~/.cache/codex-scratch/e211r. No production symlink checks relaxed, no test waived. The public perf archive remains valid: this commit changes only the isolated Python test, no shipping code or runtime harness. Exact archive/commands remain above; final gate and cleanup pending.
first-fast-symlink.log
static-recipe-fixture-red.log
static-recipe-fixture-green.log
Second full fast at
83db05b38: all Rust rows pass except workspace tests (server 706 passed, 3 failed, 57 ignored). The three failures are setup-token Unix sockets: runner TMPDIR plus the existing full UUID fixture name creates a 113-byte path, above Linux's 107-byte bound. All three exact tests pass with the same compiled executable using the owned physical ~/.cache/codex-scratch/e TMP root (0700, job marker); the longest setup-token path is exactly 107 bytes. The general test-state root stays physical ~/.cache/codex-scratch/e211r. No source/test change or waiver for this environment correction; the full gate is rerunning on the unchanged pushed head. Both roots are recorded for owned cleanup. Production-trust static builds/key checks and exact sizes passed in the second attempt; archive and perf commands remain valid.second-fast-long-tmp.log
compact-tmp-probes.log
Implementation handoff: pushed head
83db05b380, clean and equal to origin/edge-autoupdate-r2. Merged dev07c5da77b, preserved #255 exactly, split recovered UI/repair work into atomic commits, corrected disjoint/composed receiver capability, added parser/scale coverage and operations docs, and recorded exact size ceilings. The last commit completes only an isolated gate fixture; shipping code and public perf artifacts remain unchanged.Final
scripts/verify fastexit 0 on this head. Verbatim Rust summary and final TypeScript output below; the complete verbatim transcript is attached. No gate waiver. Earlier failed attempts remain attached with their runner path/root diagnoses.Ordinary stripped static sizes versus actual same-recipe dev: x86_64 22,084,480 B (+684,080); aarch64 20,185,112 B (+610,048). Separate legacy inventory/owner-present repair cost: +48,152 / +45,464 B; updater: +635,928 / +564,584 B (D301). Both exact caps have no allowance. Final built hashes match the public candidate images.
Explicit recovery previously passed 26 tests (1 VM-only ignored). Separate production Chromium desktop / WebKit phone functional reruns passed; screenshots are attached above for owner review. No self-assessed visual-quality claim.
Cleanup verified before deleting owned targets, comparison worktrees, private fixture roots and browser cache: no owned native executable running, browser PIDs 794759/795042/795048 absent, port 44211 closed. Public archive, expanded package, artifacts, evidence and runners retained. No deploy, issue closure, perf-host or acceptance-host contact.
Pending orchestrator: execute the exact paired inventory command and, if root/systemd is authorized, warm-handoff command already posted above. Archive
/home/agent/.cache/codex-scratch/edge-autoupdate-r2/e211-proof-8ca9575ea753.tar.xz; SHA-25651fb06283fc8434af6733f2e6fc36ebb7244b27b25a2ef412c783609b3ea7c9c. Independent code/screenshot review and runtime perf conclusions remain pending those external steps.final-fast.log
final-fast-summary.txt
final-cleanup.txt
author-review-current.txt
static-format-checks.txt
Implementation fix round started on edge-autoupdate-r2, base
83db05b380; merged review-edge-autoupdate-r28c14ef5558and its committed EAR2-01/02/03 regressions. Worktree moved from the clean previous job path to ~/wt-infraternal/edge-autoupdate-fix because the requested branch was already checked out there. Read the do-not-merge verdict and evidence. Will restore #240 by carefully merging origin/dev, repair disk-full recovery and interrupted selection, rerun #240 five times, remeasure exact static ceilings and run final fast. No external host contact or deployment; runtime VM proofs remain with orchestrator.Pushed atomic fixes:
5a4bca715(EAR2-01) verifies the saved copy, reclaims failed live SQLite storage before replacement, retains preimage/armed marker across interruptions, and repairs stable selection after freeing space. Recovery suite: 30 passed, 0 failed, 2 ignored (disk case and VM-only measurement); isolated 32 MiB disk case run explicitly: 1 passed, 0 failed, same initial 29,331,456 B / remaining 12,288 B / preimage 4,210,688 B as the red run. Earlier D295 clock and retained-copy tests pass.c37f8ce75(EAR2-03) uses a kernel-released directory lock, retires only owned abandoned temporary symlinks, and refuses live writers/unexpected objects. Release suite: 56 unit passed, 0 failed, 2 ignored; integrations 1 passed plus 2 passed/2 ignored. Original review regression and new writer-exclusion/reselection/file-preservation checks pass. Both touched crates pass all-target Clippy, formatting and whitespace checks. No new dependency/feature/profile or runtime worker. Exact static measurements and final fast remain pending; no VM/runtime claim.recovery-green.log
disk-full-green.log
recovery-clippy.log
release-green.log
release-clippy.log
Implementation finished and pushed: edge-autoupdate-r2, head
31053e59b1. Worktree clean; issues left open.8f88bf086in2a4bf9f0a. Merge commit records conflicted files and resolutions. Dev auth/WebSocket additions audited with no missing #240 lines; production commit-publication/account-events modules remain identical. Five reviewer-union repetitions: each 52 passed / 0 failed / 1 perf-only ignored. Final workspace server suite: 753 passed / 0 failed / 59 ignored.Pinned static images, one architecture at a time, production trust/static linkage pass. Exact caps with zero allowance: x86_64 22,096,232 B and aarch64 20,199,808 B. Against fresh dev controls: +675,640 / +607,304 B, below the previous complete envelope by 8,440 / 2,744 B. No new dependencies, features or release-profile changes. Final images preserved outside the target at ~/.cache/codex-scratch/edge-autoupdate-fix/artifacts/candidate-{x86_64,aarch64}-unknown-linux-musl; hashes attached.
Final scripts/verify fast on this head exits 0, including TypeScript. Earlier watchdog pool-count failure, passing detached-dev diagnostic, and subsequent native target-reuse failure remain recorded above. After clearing native workspace artifacts, the unchanged watchdog test and full gate pass; no assertion/deadline changed and no baseline-failure waiver claimed.
Verbatim final gate summary and final TypeScript test output (complete unedited stdout/stderr attached):
Cleanup verified: own CARGO_TARGET_DIR deleted, detached baseline worktree removed, owned short/bounded fixtures removed, no owned running executable before cleanup. Branch and origin head match. Evidence and final images retained. No perf/production host contacted or deployment performed. Runtime VM proofs remain owed by the orchestrator; this implementation handoff does not supply them.
final-fast.log
cleanup-proof.json
preserved-final-images.json
native-clean.log
final-size-comparison.json
cap-boundaries.log
static-recipe-tests.log
exact-static-gates.log
author-review.txt
Final delta review at review-edge-autoupdate-r3
6c64054c62(target31053e59b): local repair backend/API owner-origin-reservation filters 10 passed, SSH repair 2 passed. These checks do not establish full physical owner presence or replay security; VM-only cancellation, consumed owner proof, one-use SSH input and unattended repair scenarios are recorded on #211 for the orchestrator. No external hosts contacted. Lane verdict is redesign needed (2 P1 storage-recovery findings, 1 P2 dev #257 regression, 1 P3 exact-size mismatch). Full final-head gate transcript, test reproductions, size evidence and cleanup are recorded on #211: #211 . No implementation changed and no issue closed.Plan job started on plan-211-update from origin/dev
0c8639496. Research only: read #211/#236 histories, D251/D295/D217/D301/D23/D148, review branches and calternal PR #765; then write docs/plans/211-edge-update.md. No product code, deployment or edits to existing branches. Will compare durable known-good selection with reserve-only recovery and state explicit memory/storage limits.Design document committed and pushed: plan-211-update @
39f9a149b3, based on dev0c8639496. Only docs/plans/211-edge-update.md changed. Three A4 pages at 10pt prose / 9pt tables: print check.Coverage checks: 13/13 named independent review findings, 13 interruption rows with separate block-full/inode-full columns, memory limits, preserved D295 historical-state manual rollback (distinct from calternal), #236 owner-present repair, source/line counts, binary-size provenance and four owner questions. Whitespace and repository artifact gate pass. Full scripts/verify fast is running through the shared build-slot wrapper; no final-gate pass or VM proof claimed yet. Read-only startup, WAL preservation and owner answers are implementation prerequisites, not shipped behavior.
Research plan finished and pushed:
plan-211-update@c9c1877e9233f93afbeec7a7d3630c927b447ae1, based onorigin/dev@0c8639496b376362b27689122583c53ade4a4668. Onlydocs/plans/211-edge-update.mdchanged; three printed pages, 13 reviewer findings and 13 interruption rows with disk/inode outcomes.Recommendation: retain immutable known-good binary/database A throughout B’s trial, commit one prepared pointer only after real health, and make fallback startup read-only without mandatory persistent writes. Keep D217 handoff and #236 owner-present repair safeguards; shrink before extending D301. The document explicitly limits the guarantee to available execution resources and records four owner questions. It proposes, but does not run, the orchestrator’s VM proofs. No product code or existing branches changed.
Design source · Three-page print · Complete final gate output
Final
scripts/verify fastpassed after correcting the invocation’s AF_UNIX fixture path; the first failed invocation and corrected targeted check are recorded above on #211. Static sizes: x86_64 21,431,472 B and ARM 19,605,896 B, exact current-dev caps. No performance claim from this build host. Final gate summary/output verbatim:Implementation started on edge-update-v2 from origin/dev 2fb412d01b (fresh worktree; exact base from git rev-parse recorded below). Approved 2026-10-30 design: plan-211-update
c9c1877e9, owner accepts D301 overrun; root is allowed on build/QA VMs where needed. Preserve known-good selection through health, one prepared pointer commit, no mandatory recovery writes, read-only fallback, host lockstep and owner-present repair. Reference reuse will be selected deliberately from31053e59b, never a branch merge. No perf host contact or deployment; VM-only proof commands/artifacts will be handed to the orchestrator. Repository is public; no credentials will be posted.2fb412d01dIndependent dev-preservation regressions are committed/pushed at
4177bdab2(migration-journal isolation at3fdacaeb5). EAR2-02 cancelled-logout and EAR3-02 same-size idle replay assertions pass; production auth/websocket/replay are unchanged. The #240 account-revocation union passed 5/5: each run has 35 distinct passing tests, 43 executions across account_events, per_account_revocation, review_account_scope, logout_commit, review_edge_revocation_tests, and review_r2; only the existing publication measurement remains ignored. All external Cargo.lock records match task-base dev exactly. Tracer TypeScript check passes after installing its unchanged frozen dependencies. Exact pinned static baseline/head measurements are running serially on 6by32-compute02; full fast gate follows. The runtime/host redesign remains incomplete; this is not a MERGE-ready updater or #236 repair implementation.Reuse audit for later #236 implementation:
31053e59bbootstrap_repair.rs repair_identity accepts actor release.status current_version == crate::VERSION. Its repair_cannot_complete_using_the_predecessor_route test changes an AtomicBool version reply on the same controlled peer and publishes hosts.5; it does not replace a route. Preserve that trigger but also test a predecessor already reporting the current version and a stale route reconnecting after repair reservation. Actual completion must bind to the replacement's one-use enrollment/route, exact authenticated UID and reservation, rechecked after the status exchange. RemoteHosts already tracks Host.generation UUID and AuthorityGuard per route; inspect certificate identity in AuthorityGuard before choosing the binding. Do not treat a matching version string alone as replacement proof. No production #236 changes made in this continuation.#236 implementation audit, continuing edge-update-v2 from dev
2fb412d01d; current pushed head31c23dce5.The prior repair_identity implementation (
31053e59b, bootstrap_repair.rs:15-43) accepts release.status current_version==VERSION on the supplied actor. Current dev remote_join_tokens records the consumed timestamp, while EnrollmentStore::redeem (enrollment.rs:235-269) inserts the signed certificate fingerprint separately in the same transaction without recording which token minted it. Therefore a changed route UUID or matching version alone cannot prove this reservation's replacement, including an already-current predecessor or stale reconnect after reservation.Required binding for the approved plan: retain this reservation's one-use invitation digest, atomically bind its consumed certificate fingerprint at redemption, and require the active authenticated route to carry that fingerprint plus the fixed host UID and live reservation. Recheck owner/origin/route/UID/reservation/proof after the version exchange; reject replay/cancellation and preserve existing host authority on failure. This reuses the existing SQLite ledger and certificate admission. It is an implementation requirement, not a completed #236 repair. No production enrollment or repair change in this checkpoint.
Pushed schema slice
5cfbcca61on edge-update-v2 (base dev2fb412d01). Migration 0031 adds the exact consumed invitation → minted certificate binding required by the approved #211/#236 plan. Historical consumed tokens remain unknown; no inferred backfill. 0001–0030 are unchanged. Repair remains unwired.Red: SQLite reports no such column. Green: all 6 migration checks pass, including upgraded histories, old checksum retention, 32-byte blob constraints and refusal of unconsumed bindings; migration compatibility and 7 read-only checks pass. fmt and all-target server clippy pass.
Invitation certificate schema gates: PASS.invitation-certificate-schema-red.log
invitation-certificate-schema-gates.log
Pushed
a07b03746on edge-update-v2. Redemption now binds consumed invitation digest to the exact signer-produced certificate atomically with certificate insertion. Authorized reissue clears the previous binding; insertion failure rolls consumption back; predecessor certificates remain valid. This is a prerequisite for route-bound owner-present repair, not completed repair.Focused real-SQLite regression went red with missing fingerprint and now passes. Full server library:
688 passed; 0 failed; 52 ignored; fmt, all-target clippy and no-default/release-only checks pass.Invitation certificate writer gates: PASS. No prior review test obsolete.invitation-certificate-writer-red.log
invitation-certificate-writer-gates.log
invitation-writer-server-suite.log
Pushed
823d5d152on edge-update-v2. Added a single public-ledger read matching exact reserved digest + host + consumed certificate, with live certificate/host checks. It rejects an unrelated predecessor, renewal, stale token after reissue and unknown historical consumption while retaining prior public authority. This grants no repair authority; actual route/status and owner/origin/UID/reservation checks still require production coordinator wiring.4 binding tests + 3 authority tests pass; fmt, all-target clippy and compile-outs pass. The first remote-review filter selected zero tests; corrected to independent_review: 3 real transport tests pass, 1 measurement ignored.
Exact invitation certificate proof gates: PASS. No prior review test obsolete.invitation-certificate-proof-red.log
invitation-certificate-proof-gates.log
invitation-proof-remote-review.log