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#239
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, 2026-10-17: "The CLI needs to be much improved!" (after
infraternal statusprinted "Unknown / could not be read" on a running server and host).Scope of this issue: a read-only audit of every command and a redesign proposal (
docs/design/cli-proposal.mdon branchcli-proposal), then the build slices it lists. The status truth fix itself is on branchcli-status-truthand is not duplicated here.Relevant decisions: D27, D132, D146, D199, D201, D202, D237, D239, D260, D288, D297.
Started: branch
cli-proposal, based9f295dd2(origin/dev).Finished audit + proposal: branch
cli-proposal, head713bdbac0(based9f295dd2). Document:docs/design/cli-proposal.md.How it was audited (read-only): built
infraternal(debug) from origin/dev, walked every visible command with--help,-h, a bad flag, a bad flag with--json, and no args plus--jsonfor read-only commands. Commands that change state were never run. On production (monitor01, release build) I ranstatus,mesh status,mesh peers(each with--json),skill,--help, and timed each one 10×.Top findings (exact output is in the document, §2)
statuson monitor01 (unitinfraternal-serverisactive): "State Stopped / No infraternal server service is running on this node / Next: Runinfraternal server init", exit 0. It also calls plugins "components". (The fix is oncli-status-truth.)infraternalprints "Infraternal cli / Failed / The requested command is not registered in this build", exit 2. Every bare group does the same.skillfor AI tools.mesh status/peers --jsonprints raw objects, but their skill promises theschema_versionenvelope. Errors use{action,message,next,state}.mesh peers: node numbers instead of names, raw bytes, 130 columns, and "Next: Send traffic to establish an unproven direct path" even when the path is Direct.--input-file … NodeIdInput,--state,--finish).remove-hostneeds a UUID, and no command lists hosts. There are duplicates (server channel/release channel set,remove-host/mesh node delete). Nothing exists for machines, open, sessions, logs, update or whoami. The D239 aliasinfrais not installed.status36 ms (it startssystemctl).Proposal: noun-first tree (
machines,open,sessions,mesh,logs,update,access, componentup|down|status). One output kernel. One envelope and fixed exit codes. ≤50 ms for local reads. 16 slices; slices 1–6 (kernel, front door, hide stubs, status in the kernel, mesh output, diagnosing errors) need no owner answers.Owner questions (§7): 1 machines or hosts · 2 how the CLI acts as you (node link vs sign-in) · 3 what
opendoes in a terminal · 4 what bareinfraternalshows · 5 hide or show stubs · 6 access-rule words · 7 exit codes and the JSON promise.Gate: docs-only change.
scripts/verify fastwas not run, because the build host was at load ~30–40 and the coordinator throttled new cargo work. Nothing in this change compiles.Job cli-overhaul-1 started. Branch
cli-overhaul-1, baseorigin/cli-status-truth54231576d. Scope: proposal build steps 1-6 (one output style + one --json envelope, bare = overview, hide unbuilt commands, D303 exit codes, mesh peers, plain help). Baseline timings and before-output are captured from a debug build of the base.Job cli-overhaul-1 finished. Branch
cli-overhaul-1, head8683fe77a(base54231576d). Pushed.Commits (each cites #239):
9f58aae5eenvelope + one style;2092230afbare = overview, groups list commands;6bcb2ab92hide unbuilt commands;1bd07c362exit codes D303 (status exits 5);a255008e1mesh peers;a42334d7bplain help;08dc796c0docs;8683fe77alint fixes.scripts/verify fast, final table (verbatim):
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| CLI plugin compile-out | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | FAIL (1) |
+---------------------------+--------------+
Static builds fail only on the size ceiling: x86_64 21361680 bytes, cap 21317296, delta +44384; aarch64 19557816, cap 19500376, delta +57440 (the caps equal the base). D243 allows 16 KiB, so this is about 28 KB (x86_64) over. Tried: opt-level "s" for the infraternal package (+2.9 MB, rejected), #[inline(never)] on the new cold code (worse: +47.8 KB, dropped). Not tried: stop compiling the hidden placeholder declarations (about 40 actions: relay/backup/ssh/host-facts/release plugins, agent up/down/status, up, server features, mesh hosted stubs) into default builds, for example behind a
placeholdersfeature. That is the likely real saving, but it changes D16 "one source" tests, so it needs the owner. Caps not raised.Findings:
namefield when the record has one. Adding names is a change to the pushed mesh configuration (wire format) and needs a decision.infraternal up;upis an unbuilt placeholder and now hidden, so the hint saysinfraternal agent join <server-url>.additional_properties(proposal P4/slice 14); server subcommands still accept all server options (now under a "Server options" heading).Placeholder compile-out done. Head
a1d48bda9pushed to cli-overhaul-1. Static sizes vs caps (= base): x86_64 21327696 (+10400, within 16 KiB); aarch64 19527720 (+27344, 11 KB over). Caps not ratcheted (aarch64 over). Before the gate: +44384 / +57440. Remaining test-gate failures are 3 infraternal-server socket timing tests that fail under load in the full run and pass alone (not touched by this branch).Break-it review of origin/cli-overhaul-1 @
884f5f624(base cli-status-truth). Tests: branch review-cli-overhaul-1 @911a3a8dd, crates/infraternal/tests/cli_review.rs, 16 tests, all fail on the reviewed head for the stated reason. Nothing was fixed.What held up (no finding): all 8 cli_envelope tests and the placeholders-feature bin tests (D16) pass; hidden placeholders are absent from default help/skill; no argument value is echoed in any JSON error I tried (agent join / remove-host with a secret URL, bad option values, odd positional); status exits 5 for a unit that is installed and inactive; NO_COLOR=1 and pipes give no colour; release-build speed (median of 10, load ~5): status 16-18 ms, everything else 3-6 ms, all well under 50 ms.
P1 (0)
P2 findings (7)
--json mesh statusagainst a socket that never answers: SIGINT kills the process, stdout empty, no envelope.Exit::Interrupted/ error codeinterruptedexist but are never used. D303 fixes 130, and the contract says every result is an envelope. Test: ctrl_c_in_json_mode_ends_with_an_interrupted_envelope_and_exit_130.agent join --json(andagent run) print TWO envelopes on stdout: a progress{"ok":true,"state":"running"...}and then the final one. A reader taking the first envelope sees success for a command that exits 1. Test: a_failing_command_in_json_mode_prints_exactly_one_envelope.statusexit 5 on UNKNOWN. NodeStatus::down() counts Activity::Unknown, so an installed, healthy service whose manager cannot be asked (no XDG_RUNTIME_DIR/session bus: cron, sudo -u, ssh without linger; or no systemctl) gives exit 5,error.code: component_down, "is not answering". D303: 5 only for installed-but-down.infraternal status || alertpages falsely. Test: status_is_not_down_when_the_service_manager_cannot_be_asked.mesh status/peers/up/downsay "It sent a reply this command does not understand", exit 1. Cause is that the CLI cannot find the infraternal agent (any io error but four kinds falls into the catch-all in component_cli::refuse). Should be exit 5 with the true cause. Test: a_missing_runtime_directory_is_not_called_a_bad_reply.skill <unknown>exits 1 (should be 4);remove-host --server S not-a-uuidexits 1 "Invalid host identifier" (should be 2). Also agent-join failure class is chosen by substring match on the public error text ("DNS", "connection failed", "TLS verification" in run_remote_agent): a reworded message silently changes the exit code. Tests: an_unknown_skill_is_not_found_exit_4, a_malformed_host_id_is_a_usage_error_exit_2.server init --dry-runtext output flattens the unit file into one wrapped paragraph ("After=network.target [Service] Type=simple ExecStart=..."): the one thing a dry run exists to show is unreadable. JSON keeps the newlines. Test: a_dry_run_plan_keeps_its_line_breaks.P3 findings (6)
8. Vocabulary: "No agent socket was found..." and "The agent answers only the account that runs it." (component_cli.rs) use "agent" alone. Test: user_facing_text_never_says_agent_alone.
9. Text-mode usage errors echo the typed value (clap:
unrecognized subcommand 'https://user:SECRET@...'). The JSON path was built to avoid this (usage.rs); the text path logs it to shells and CI. Test: a_usage_error_in_text_mode_does_not_echo_the_odd_input.10.
--json --helpand--json -Vprint plain text, not an envelope; D299 "every command has --json" is kept only for runs, not help. Judgement call; decide and document. Test: json_help_and_version_are_envelopes_too.11. Help lies:
server setup-token --helpandserver channel --helplist a "Server options" block (--listen, --tls-cert, --remote-listen ...) that those commands accept and silently ignore. Test: a_subcommand_does_not_advertise_options_it_ignores.12. Root
--helpis 82 columns wide (remove-host line); help is wider than the 80-column default the renderer promises. Test: root_help_fits_80_columns. Also "infraternal server release has 1 commands." (test: a_group_with_one_command_says_so_in_the_singular), and bareinfraternal agent --jsonis stateunavailablewith error codeusageand exit 2, unlikemesh/servergroups that list their commands.13. Repo hygiene: commit
8027e82f7tracks four scripts/pycache/*.cpython-314.pyc files; running scripts/verify modifies them, so every gate run dirties the tree. Test: no_compiled_python_is_tracked. (Delete and gitignore.)Gate:
scripts/verify faston884f5f624(clean tree, own target dir, load 10-17 during run):+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| CLI plugin compile-out | PASS |
| clippy | PASS |
| test | FAIL (101) |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
The only failures were 3 timing tests in infraternal-server (restart_open_liveness_review::responsive_socket_survives_a_held_terminal_open_with_an_existing_attachment, review_input_credit::review_full_input_writer_preserves_browser_control_progress, review_liveness::review_mesh_watch_reports_liveness_expiry_without_another_edit). LOAD FLAKE: re-run alone at load 4, 3 passed. Unrelated to the CLI. Size caps passed (x86_64 21327696, aarch64 19527720 exact-cap checks PASS). The infraternal crate's own tests (cli_envelope 8/8, bin tests default, --no-default-features and --features placeholders) all passed.
Verdict: HOLD. 0 P0/P1, 7 P2, 6 P3. Items 1-3 and 5-6 are contract breaks of D303/D299 and are cheap to fix; 4, 7 and 13 are small too.
cli-overhaul-1 review fixes: head
7366153048, base884f5f624. All 16 tests in crates/infraternal/tests/cli_review.rs pass. 19 commits (git log 884f5f624..HEAD).scripts/verify fast (final table, verbatim):
Static size: x86_64 21348272 vs cap 21327696 (+20576); aarch64 19547472 vs cap 19527720 (+19752). Caps not raised; the owner/orchestrator decides the ratchet. The cargo registry path accounts for a few KB only.
Round-2 delta break-it review started (Claude subagent).
review-cli-overhaul-1-r2from73661530486d1133fbed18b9a25b141183d80e76(origin/cli-overhaul-1)884f5f624..73661530--jsonone-envelope contract on every path, D303 exit codes, no echoed values, rust.sh gate change, size breakdown (+20,576 B x86).Round-2 delta break-it review of
cli-overhaul-1@73661530: MERGE (no P0/P1), P2 to follow upReview branch
review-cli-overhaul-1-r2@decb6163d0299bf4ee552389d13025f0870344da. New filecrates/infraternal/tests/cli_review_r2.rs: 7 tests that fail on head, plus 2 regression tests that pass.Counts: P0 0 · P1 0 · P2 2 · P3 6
The round-1 fixes check out
All 16 round-1 tests (
cli_review.rs) pass on head. I also confirmed the parts round 1 only checked by the first line of output:--json -V,--version,-h,status -h,mesh --helpeach print exactly one envelope and exit 0. Usage errors (--bogus, an unknown command, missing args, a missing option value,agent joinwith no URL) each print one envelope with exit 2 andcode: usage. A closed stdout (EPIPE) exits quietly with the right code.SIGINT handler (unsafe boundary): the handler only does
OnceLock::get(an atomic acquire),write(2)and_exit(2), so it is async-signal-safe. It is not installed on the paths that daemons use: the embeddedagent --fdearly path,__shim(the infraternal agent never passes--jsonto it), and units, which run without--json. Children are safe:Command+reset_child_signalsand exec reset the handler. On a closed pipe it still exits 130. Daemons had no SIGINT handling before, so their Ctrl-C behaviour does not change.Findings
mesh peers --jsonfollowsnext_cursoritself and prints one envelope per page (component_cli::executeloop). The first envelope saysok:truebefore the listing is complete, and a failure on page 2 adds an error envelope after it. It only shows up past about 150 peers (pages are capped by bytes), but it breaks the one-envelope rule of D299.a_paged_listing_is_still_one_envelopeinterruptedone glued on, i.e. one line that is not JSON (4,293 bytes in the test, deterministic with a 4 KiB pipe). The same race gives two envelopes if Ctrl-C lands after the final write but before exit. Fix: set an atomic "final output started" flag inwrite_outputbefore the stdout write; when the flag is set, the handler_exit(130)s without writing.ctrl_c_while_the_result_is_being_written_never_leaves_a_broken_line_exit(130)tells the calling shell that the command handled Ctrl-C itself, sofor h in …; do infraternal --json …; donecarries on to the next item. RestoringSIG_DFLand re-raising (both async-signal-safe) still gives the shell$?=130 and stops the script. The trade-off: a non-shell caller sees "killed by signal 2" instead of exit 130. Owner call against D303.ctrl_c_in_a_script_loop_stops_the_looptokio::signal::ctrl_cinserver --json) is bypassed by_exit(130). Nothing in the tree depends on this today.a_later_runtime_handler_is_not_bypassed_by_the_interrupt_handlerskill <words>puts the words verbatim indetails(https://user:SECRETTOKEN@…).usage.rsword_likeechoes any lowercase word of up to 40 characters, which covers a pasted 40-char hex token, in JSON and in text.an_unknown_skill_does_not_echo_what_was_typed,a_mistyped_word_that_looks_like_a_token_is_not_echoeddown(): one active unit plus one that did not answer gives exit 0 with the text "Part of this machine's setup is not running." Useconfirmed_down()for the headline and its next steps, and say "not answering" for unknown units.status_text_does_not_call_an_unanswered_unit_not_runningscripts/verify.d/rust.sh(rust_check_cli_group): it still proves that the shipping binary has the infraternal agent group withjoincompiled in, so it is still worth having. But it uses2>&1and a substring match, so two envelopes or stderr noise would pass. Capture stdout only, assert exactly one line, parse it as JSON, and assert stderr is empty. The old check covered theagentno---fdrefusal path; in shipping builds that path is now unreachable (run_groupalways returnsSome).component_cli::run_actionreturns exit 1 with no envelope when the hosted registry fails.agent --fd N --json(internal) prints no envelope. Text-modeskill <cmd>to a closed pipe exits 1 with "could not be printed", whilewrite_outputignores EPIPE. Server logs still treat an emptyNO_COLORas set and ignoreTERM=dumb(runtime.rs:807).Exit codes: apart from the items above, the D303 table matches everywhere I looked (
Exit::code, skill 4/2, remove-host 2, runtime dir 5, join exit picked by typedFailure).statusexits 5 only forInactive|Failed. No secrets appear in argv or logs in the delta.Size (x86_64 static, built with the repo recipe, sccache + pinned Zig)
884f5f62421,327,696: +20,576 B. aarch64 is +19,752 B over its cap..text+19,392 ·.eh_frame+752 ·.gcc_except_table+312 ·.data.rel.ro+256 ·.eh_frame_hdr+232 ·.rodata0.320c8806c): −11,776 B (57%). LTO now has two copies of clap'sArg::clone(+7,033), plusVec<Arg>collect (+848) and duplicated Vec clones (+1,452).fc145d367): −2,720 B.parse_failure/help_resultenvelopes, typedFailure/Causeerrors,report_failure_as,run_groupforagent,output::done. The 51 KBdispatch_selected_actionbeing split into outlined functions is net neutral.eecf970a5): dev is 21,080,848 (its cap is 21,080,144, +704 from the known registry-path offset), so head is +267,424. That gap does not belong to this branch: the branch is not rebased, and dev's 438 commits includef0a88fe27(VT archive repackaging), which drops about 300 KB of Zig debug/unwind text that head still carries (debug.SelfInfo.unwindFrameDwarf,Io.Writer.printValue). The branch's own growth over its merge-base cap 21,317,296 is +30,976 (slice 1 +10,400, round 2 +20,576).Arg::clone()each inherited global arg into every subcommand. Either declare the server-only options non-global onserver(they are then neither shown nor accepted under its subcommands), or add a minimal hidden stub (Arg::new(id).long(..).hide(true)) instead of a full clone. That saves about 11.8 KB, more than half the overage.Gate (
scripts/verify faston the review branch)The test failures are exactly the 7 review tests. The static builds fail on size alone:
size: 21348272 bytes; cap: 21327696 bytes; delta: +20576 bytes(x86_64) and+19752(aarch64).agent group: exit 0, versioned JSON listing of its commands.Started round-2 CLI fixes on branch
cli-overhaul-r2-fixes, based at73661530486d1133fbed18b9a25b141183d80e76(origin/cli-overhaul-1). Read the issue history, CLAUDE.md, architecture/process docs, and D243/D299/D303/D304. Next: cherry-pick review tests, fix findings, size-check, and run the final gate.Baseline evidence on
5f5030f40:cargo test -p infraternal --test cli_review_r2 -- --test-threads=1reports 2 passed / 7 failed.component_cli.rsemitted 2 envelopes for the two-pagemesh peersfixture;usage.rsechoed a 40-character word inmessageanderror.detail;run_skillincluded a URL credential indetails;NodeStatus::headlinesaid “not running” for an unknown unit; the SIGINT pipe test captured a malformed 4,293-byte line; and the later Tokio handler test exited 130 instead of 42. The script-loop test also fails because_exit(130)lets its shell continue; leaving it ignored as the D303 owner question.Pagination fix committed as
24490111d:component_cli.rsnow accumulates page arrays and presents only after the last page succeeds. The regression verifies one envelope with 2 peers. Focused test: 1 passed;cargo clippy -p infraternal --all-targets --locked -- -D warningspassed;cargo fmt --all --checkpassed.Value-echo fix committed as
1628ef6e3: usage errors identify the command position, and missing-skill details no longer include the supplied path. The token-shaped typo and URL-path regression tests both pass (2/2); touched-crate clippy and fmt checks pass.Status wording fix committed as
90069006e: headline and next-step selection now use confirmed-down units; an unanswered unit produces an “unknown” headline. Focused status regression: 1 passed; clippy forinfraternalandinfraternal-statuspassed; fmt passed.SIGINT fix committed as
975699a6e: the final-write phase is atomic, signals during a blocked write let the one result line finish before exit 130, and a chained later handler receives the signal. Slow-pipe test and later-handler test pass (1/1 each); the script-loop test is ignored with the requested D303 owner-question reason. Clippy forinfraternal/infraternal-shimand fmt pass.Server log color fix committed as
45d459c19: emptyNO_COLORno longer disables ANSI when stderr is a terminal. The focused helper test passes (1/1);infraternal-serverclippy and fmt pass.Inherited-option trim committed as
227bdc67b: descendants now carry minimal hidden parser stubs instead of full ancestor argument clones. Both server option parsing checks pass; clippy and fmt pass. The review attributed 11,776 bytes to this path; final target sizes will be recorded from the branch gate.Owner decision D305 (2026-10-18, dev
e105b8cb6): Ctrl-C writes theinterruptedenvelope, then restores the default SIGINT action and re-raises it, so calling scripts stop and$?stays 130. Follow-up jobcli-sigint-reraiseis queued aftercli-overhaul-r2-fixes.Verification guard committed as
77010d5a8: it separates stderr and requires one parsed stdout JSON line with the expected command listing.bash -n scripts/verify.d/rust.shand the guard against the debug binary both pass.scripts/verify fastexposed an interaction with D303 output handling: the CLI review testa_failing_command_in_json_mode_prints_exactly_one_envelopefailed atcrates/infraternal/tests/cli_review.rs:110(stdout had 0 envelopes; expected 1). Reproduction:agent joinprinted its progress record, then exited 130 before the final JSON error. The progress writer is consuming the atomic final-output phase; I’m separating progress writes from final envelope writes and will rerun the affected checks.Static size finding from
scripts/verify fast: x86_64 artifact/home/kayg/.cache/codex-scratch/cli-overhaul-r2-fixes/target/x86_64-unknown-linux-musl/release/infraternalis 21,343,472 bytes vs the 21,327,696-byte cap (+15,776 bytes). PT_INTERP is absent; AES-128-GCM vector, production trust, and key-memory checks passed. aarch64 measurement is still running. No cap change.Static size finding from
scripts/verify fast: aarch64 artifact/home/kayg/.cache/codex-scratch/cli-overhaul-r2-fixes/target/aarch64-unknown-linux-musl/release/infraternalis 19,544,144 bytes vs the 19,527,720-byte cap (+16,424 bytes). PT_INTERP is absent and production trust passed. Native aarch64 key-memory execution was unavailable on this x86_64 host. No cap change.Committed
67da54f5b: progress records now use the shared renderer without consuming the final SIGINT output phase.a_failing_command_in_json_mode_prints_exactly_one_envelope: 1 passed; round-two suite: 8 passed, 0 failed, 1 ignored for the D303 owner question; infraternal clippy andcargo fmt --all -- --check: pass.Finished at head
67da54f5bc5207adba5ae366679e89839c724b6b, pushed tocli-overhaul-r2-fixes.The round-two suite passes: 8 passed, 0 failed, 1 ignored (
ctrl_c_in_a_script_loop_stops_the_loop, owner question D303). The existing JSON failure test also passes (1/1); the fullcli_reviewsuite passes (16/16). Touched-crate clippy and formatting pass. The optional panic-to-internal envelope was not added: a panic after output begins cannot safely be replaced with a single envelope without broader output transaction handling.The inherited-option clone removal is committed at
227bdc67b; review measured a −11.8 KB reduction. Final stripped artifacts remain over the unchanged caps: x86_64 is 21,343,408 bytes vs 21,327,696 (+15,712); aarch64 is 19,544,144 bytes vs 19,527,720 (+16,424). PT_INTERP is absent on both. Native aarch64 key-memory execution was unavailable on this x86_64 host.Final
scripts/verify fastexited 1 because the static-size gate rejected artifacts over the caps. All other Rust gates passed. Gate summary and size lines, verbatim excerpts:Full transcript: scripts-verify-fast.log
Started D305 follow-up on branch
cli-sigint-reraise, base67da54f5bc5207adba5ae366679e89839c724b6b(origin/cli-overhaul-r2-fixes). Read the full #239 history, D303/D305, and the repository contract. The script-loop regression is currently ignored pending D305.Finding: D305 is already owner-approved on
origin/devate105b8cb(one-file decision-record commit), while this branch starts at67da54f5band does not include it. I’ll cherry-pick that record before the implementation so the branch carries the decision it cites.Update: cherry-picking
e105b8cbconflicts because that commit also adds D299–D304, which are absent from this lane’s base. I’m aborting it and following the brief’s read-only instruction for D305 (git show origin/dev:DECISIONS.md); the implementation will cite the authoritative decision without importing unrelated decisions.Baseline reproduction (before handler changes): after removing the D303 ignore,
CARGO_TARGET_DIR=$HOME/.cache/codex-scratch/cli-sigint-reraise/target build-slot cargo test -p infraternal --test cli_review_r2 ctrl_c_in_a_script_loop_stops_the_loop -- --exact --nocapturefailed as expected. The loop printedcarried-on; the shell exited 0 (crates/infraternal/tests/cli_review_r2.rs:261). Build completed in 3m29s; 0 passed / 1 failed / 8 filtered.Finding/fix evidence: the re-enabled script-loop regression failed before the handler change (shell status 0 and
carried-onoutput). After the change, the same test passes (1 passed, 0 failed, 8 filtered; 0.82 s) atcrates/infraternal/tests/cli_review_r2.rs. Direct process-status coverage already accepts eitherstatus.code() == 130or SIGINT (status.signal() == 2) incli_review.rs.Shim test evidence:
cargo test -p infraternal-shim --lockedpasses after staging the repository’s pinned Zig toolchain into this job target and PATH: 79 unit tests passed / 13 ignored; detach 2/2, mouse 1/1, process-exit descriptor 2/2. The first direct run’s mouse probe failed only becausezigwas absent from PATH;scripts/auth-toolchainresolved it. Initial diagnostic, mouse output, build output.Touched-crate clippy finding: the first run reported
match_same_armsin the SIGINT phase match andborrow_as_ptrfor thesigemptyset,sigactionandsigprocmaskarguments. I collapsed the identical match arm and made the raw-pointer borrows explicit; clippy is rerunning.Committed and pushed shim behavior as
f1dfa0213.infraternal-shimnow restores SIG_DFL, unblocks SIGINT and raises it after the notice; an in-progress final envelope still completes first. Verification on this tree: fmt PASS; clippy forinfraternalandinfraternal-shimPASS; CLI review suites 16/16 and 9/9 PASS. The full shim suite passed with 79 unit tests, 2 detach, 1 mouse and 2 process-exit tests; 13 unit tests were ignored.Committed and pushed the test step as
47b35fdba. The previously ignoredctrl_c_in_a_script_loop_stops_the_loopis active; it failed before the fix (shell status 0 pluscarried-on) and passes after it. Final CLI review run: 16/16 and 9/9 passed, 0 failed or ignored.Committed and pushed docs as
69026ea29.docs/CLI.mdnow defines 130 as interrupted by Ctrl-C and terminated by SIGINT; source comments distinguish shell status 130 from direct wait status signal 2.scripts/verify iteratepassed on69026ea29: fmt, VT native fmt, CLI plugin compile-out, clippy, tests, cargo-deny, compiler metadata, asset checks, tracer checks and TypeScript protocol tests all passed. The CLI suites passed 16/16 and 9/9; shim unit tests passed 80 with 13 ignored, plus detach 2/2, mouse 1/1 and process-exit descriptor 2/2. Full transcript: verify-iterate.log.Static x86_64 size finding during
scripts/verify fast: strippedinfraternalis 21,343,760 bytes; recorded merge-base size is 21,343,408 bytes, a 352-byte increase. The branch is 16,064 bytes over the 21,327,696-byte cap, compared with the merge-base's 15,712-byte overage. The gate is continuing with the aarch64 build.Static aarch64 size finding: stripped
infraternalis 19,544,400 bytes versus the recorded merge-base size of 19,544,144 bytes, a 256-byte increase. The branch is 16,680 bytes over the 19,527,720-byte cap; the merge base was already 16,424 bytes over. The host cannot run the aarch64 key-memory check. Full gate transcript: verify-fast.log.Finished #239 on
cli-sigint-reraise, head69026ea29(docs(cli): explain Ctrl-C exit status), pushed to origin.scripts/verify fastfinal table (verbatim):The static build row fails the existing size caps. Relative to the recorded merge-base, stripped x86_64 grew 352 bytes (21,343,408 → 21,343,760); stripped aarch64 grew 256 bytes (19,544,144 → 19,544,400). The merge base already exceeded the caps by 15,712 and 16,424 bytes respectively. The x86_64 key-memory check passed; the host cannot run the aarch64 runtime check. All other final gate rows passed. Full transcript: verify-fast.log.
Round-3 delta review started on review-cli-overhaul-r3, base/head
69026ea298. Read all 37 comments on #239 (no parent linked). Scope: 73661530..69026ea29, D299/D303/D305, signal dispositions and final-output races, one-envelope paths, inherited options and size. Tests/findings will be committed on this review branch only.P2 confirmed on
69026ea29: exit_on_interrupt replaces inherited SIG_IGN unconditionally (crates/infraternal-shim/src/pty.rs:358-368). A real CLI child started byshwithtrap '' INT, held in its final JSON write by a 4 KiB pipe, terminates by signal 2 after SIGINT instead of finishing normally. Test: inherited_ignored_sigint_stays_ignored_during_cli_output (cli_review_r3.rs:65). Its complete envelope survives; the incorrect termination is the finding. Preserve inherited SIG_IGN before installing the handler. This behavior predates this delta but is explicitly in round-3 scope. Signal suite: 3 pass / 1 expected failure; blocked/pending-signal re-raise checks pass. Receipt.P2 confirmed in the delta: hidden_inherited_arg drops the integer value parser for --fd (crates/infraternal/src/cli/command_tree.rs:231-243). run_operator_action then discards the type mismatch via try_get_one::("fd").ok().flatten() (main.rs:1528-1532).
--json agent run --fd 999 --data <missing-identity>starts remote reconnect and exits 1/failed; before trimming it must reject the incompatible descriptor with 2/usage (main.rs:1426-1433). Non-numeric descriptors lose parser validation too. Test: inherited_fd_is_rejected_instead_of_ignored_by_remote_commands, cli_review_r3_arguments.rs. Keep the ancestor value parser in the hidden stub (or reject the option explicitly), rather than silently ignoring it. Receipt.Existing regressions: cli_review 16/16 pass; cli_review_r2 11/11 pass, including two added checks for a failed later page (one failure envelope, no partial rows) and ordered three-page accumulation.
Review test steps pushed on review-cli-overhaul-r3:
11bda0c0a: SIGINT disposition and blocked/pending-signal regressions, 3 pass / 1 expected failure.2d35ac6f4: inherited descriptor regression, 1 expected failure. Expanded manual matrix confirms run and join each ignore both numeric and non-numeric --fd: all 4 exit 1 after starting remote work, rather than 2/usage. Matrix.afaf44e82: later-page failure and ordered three-page tests, 2/2 pass; cli_review 16/16 and cli_review_r2 11/11 pass.Formatting passes; touched-crate clippy passes (receipt). Dry-run check preserves all 10 server configuration fields, including both trusted-proxy entries, before and after
init; the plans match exactly (receipt). No implementation fixes made. Full scripts/verify fast is running onafaf44e82.Round-3 delta review finished: MERGE under D206, with two P2 follow-ups. Counts: P0 0 / P1 0 / P2 2 / P3 0.
Reviewed:
69026ea298; delta 73661530..69026ea29.Review tests committed and pushed on review-cli-overhaul-r3, head
afaf44e829. Implementation unchanged.Findings:
inherited_ignored_sigint_stays_ignored_during_cli_outputfails: an ignored SIGINT terminates the real CLI by signal 2. The shipping static binary reproduces it too. This predates the delta but was explicitly requested in the signal audit. Test receipt, static-binary receipt.try_get_one::<i64>().ok().flatten()then silently discards the descriptor (main.rs:1528-1532). Testinherited_fd_is_rejected_instead_of_ignored_by_remote_commandsfails with exit 1/failed instead of 2/usage. Both run/join and numeric/non-numeric descriptors reproduce it (4/4). Test receipt, matrix.Checks: cli_review 16/16 and cli_review_r2 11/11 pass, including added
a_failed_later_page_emits_only_the_failure_envelopeandthree_pages_preserve_order_and_only_the_final_cursor. Blocked/pending-signal tests before/during final output pass. Static x86_64 checks confirm one valid envelope and signal 2 before/during final output. All ten server configuration inputs, including repeated trusted-proxy, survive before/after init with identical dry-run plans (receipt). Help/version/usage/value-redaction and quiet EPIPE matrix: 9 ordinary + 9 closed-stdout paths (receipt). Handler call graph uses lock-free atomics and async-signal-safe calls; production embedded-fd, shim and units avoid installation; exec/child reset paths checked. Reviewer checklist completed.Sizes: x86_64 21,343,760 B, aarch64 19,544,400 B, exactly matching author receipts. Independently rebuilt merge base
895bcdd23: x86_64 21,300,016 B, so whole-stack delta +43,744 B; requested delta from recorded73661530is -4,512 B. D305 adds only 352 B x86_64 / 256 B aarch64 over67da54f5b. No unexpected growth; accepted cap exceptions unchanged. Comparison, baseline build.scripts/verify fastonafaf44e82exited 1. Test row stops on the expected SIG_IGN review regression (the descriptor failure was verified separately); static row fails only the unchanged size caps. x86_64 key-memory check passed; aarch64 runtime check unavailable on this x86_64 host. Final output verbatim:Full gate transcript. Temporary baseline and own build target removed; evidence retained outside the checkout. No service started or deployment performed. Issue left open.
Started CLI review round-3 fixes on branch
cli-r3-fixes, base69026ea298f810d2da0215376add2ef0b586de8a(origin/cli-sigint-reraise). Read the full #239 history; it has no linked parent. I’m cherry-picking the round-3 regressions fromafaf44e82and will fix inherited SIGINT disposition and--fdvalidation while preserving D303/D305.Baseline regressions reproduced on
cli-r3-fixesafter cherry-picking the round-3 tests.cli_review_r3: 3 pass / 1 fail;inherited_ignored_sigint_stays_ignored_during_cli_outputobserves the child terminated by signal 2 while its final JSON write is blocked (crates/infraternal/tests/cli_review_r3.rs).cli_review_r3_arguments: 0 pass / 1 fail;agent run --fd 999returns exit 1 witherror.code=failed, expected exit 2 /usage(crates/infraternal/tests/cli_review_r3_arguments.rs). Receipts: signal, descriptor.SIGINT disposition fix committed as
6ba56116c.exit_on_interruptnow queries the inherited action before installation; it preservesSIG_IGNand leaves the current policy in place if the query fails. D303/D305 behavior remains for handled SIGINT. Verification: focused ignored-SIGINT regression 1/1 pass;infraternal-shim79 passed / 13 ignored, detach 2/2, mouse 1/1, process-exit descriptor 2/2; shim clippy and workspace fmt pass. Receipts: regression, shim suite.Inherited
--fdparser fix committed as5c6d449ebincrates/infraternal/src/cli/command_tree.rs. The hidden descendant stub retains the i64 parser, so malformed values reach the normal D303 usage path before action execution. The round-3 run/join descriptor regression passes (1/1);infraternalclippy and workspace fmt pass. Receipt: fd parser regression.Additional
--fdfinding, exposed after restoring integer parsing:agent run --fd 2147483648still downcasts the parsed i64 toNone, starts the remote path, and returns exit 1 /failedinstead of exit 2 /usage. The regression was added tocli_review_r3_arguments.rsand failed before the fix (0/1); receipt: fd overflow before fix. I’m making descriptor presence itself a usage error for every action except internal embedded startup.Descriptor handling fix committed as
1a8413f4cincrates/infraternal/src/main.rs; the regression now also covers--fd 2147483648, which failed before this fix with exit 1 /failed. Dispatch rejects an inherited descriptor unless the selected action declares it, soagent runandagent joinreturn one usage envelope for numeric, non-integer, and out-of-range values. CLI review suites pass: 16 + 11 + 4 + 1 tests; infraternal clippy and workspace fmt pass. Receipts: CLI suites, clippy.iterateexposed a minimal-build issue in the new--fdrefusal helper:cargo test -p infraternal --bin infraternal --no-default-featuresreports unresolvedoutputatcrates/infraternal/src/main.rs:271because that module is intentionally compiled out. The repository helper continued to later feature builds and emitted an overall ITERATE PASS, so I’m treating the compiler error as a real failure and adding the matching compile-time guard. Receipt: no-default build output.Minimal-build fix committed as
d6b6d03dc: the inherited-descriptor guard is compiled only when its output adapter exists. Direct--no-default-featuresverification passes (33/33 unit tests; two existing dead-code warnings); the CLI review suites pass 32/32; infraternal clippy and fmt pass. Receipts: minimal build, CLI suites, clippy.iterateond6b6d03dchad one test failure:responsive_socket_survives_a_held_terminal_open_with_an_existing_attachmenttimed out atcrates/infraternal-server/src/auth/socket_clock.rs:81; 467 tests passed and 48 were ignored. All other iterate rows passed, including CLI plugin compile-out. In the same load window (load average 18.07 / 13.88 / 12.34), the isolated test passed on detachedorigin/devata246f2b73(1/1, 0.70 s), and passed again isolated on this branch (1/1, 0.67 s). This points to a full-suite timing flake; no server/auth code is changed here. Receipts: iterate, dev baseline, branch rerun.Final fast-gate x86_64 static artifact: 21,347,344 bytes, +19,648 over the 21,327,696-byte cap. The previously measured branch base was 21,343,760 bytes (+16,064), so this change adds 3,584 bytes. I’m checking for a small reduction after the current aarch64 gate completes.
Committed and pushed
cafd6d55don cli-r3-fixes. The parentagentaction retains schema-based integer parsing;agent runandagent joinreject inherited--fdat the RemoteAgent handler. The 87 CLI binary tests and 5 round-3 integration tests pass; fmt and clippy pass. Static size growth versus merge base69026ea29is x86_64 +320 bytes (21,344,080 total, +16,384 over old cap) and aarch64 +256 bytes (19,544,656 total, +16,936 over old cap). Receipt: static size measurements.Finished #239 at head
cafd6d55d8on cli-r3-fixes; pushed. The final fast run passed every row except the static size row, which retains the branch's existing cap overage. Against merge base69026ea29, stripped sizes grew x86_64 by 320 bytes and aarch64 by 256 bytes. x86_64 is +16,384 bytes over the old cap, within the brief's accepted ~16 KiB; aarch64 is +16,936 bytes over its old cap. Full output: verify-fast-final.log.Static size output (verbatim):
PT_INTERP: absent; size: 21344080 bytes; cap: 21327696 bytes; delta: +16384 bytes
binary exceeds the 21327696-byte size budget: 21344080 bytes
PT_INTERP: absent; size: 19544656 bytes; cap: 19527720 bytes; delta: +16936 bytes
binary exceeds the 19527720-byte size budget: 19544656 bytes
Final Rust gate table (verbatim):
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| CLI plugin compile-out | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | FAIL (1) |
+---------------------------+--------------+
Starting release-4 integration on branch release-4 at base
5b2a1b9ee3. Read the full #239 and #237 histories, and the related #236/#201 mesh history. Next: merge reviewed mesh-view-truth13e2149fd, then confirm and merge completed cli-r3-fixescafd6d55d; no deploy or push.Release-4 integration stopped before merging #239, following the task's x86 size guard. Current head is
f4d3dca381cc67dc69da2ea86f72ea21291bcf54(the #236 mesh merge). Same-recipe x86_64 static build is 21,170,512 bytes against the 21,096,144 release-prod-live base: +74,368 bytes, 34,368 above the ~+40 KB stop threshold.origin/cli-r3-fixes(cafd6d55d) remains unmerged. No artifacts, staging, or final fast gate were run after stopping.Size table and hashes: size-stop-after-mesh.txt. Raw build: mesh-size-x86-build.log.
Release-4 stopped before the #239 merge at the explicit x86 size guard. Current branch head:
f4d3dca381cc67dc69da2ea86f72ea21291bcf54.origin/mesh-view-truth13e2149fdis merged as f4d3dca38. Finished CLI headorigin/cli-r3-fixescafd6d55dremains unmerged: after #236 the measured x86 artifact is 21,170,512 bytes vs 21,096,144 at release-prod-live, a +74,368-byte increase, which exceeds the ~40 KB stop threshold by 34,368 bytes.5b2a1b9eeOnly the intermediate x86 binary was built: stripped static PIE, PT_INTERP absent, SHA256
42d7332527b6a1c2d0f501d6d83c6a7f83710f853adde2b3d43baf224698b243. ARM, package bundle, web dist and final manifest were not produced. Staging and staged CLI checks were not run.scripts/verify iteratepassed;scripts/verify fastwas not run after the mandated stop. Rust gate table:TypeScript:
37 pass,0 fail,34463 expect() calls,Ran 37 tests across 10 files. [2.88s].Evidence: size table, x86 build log, iteration gate.
Starting release-4 integration on branch
release-4, base5b2a1b9ee32b37433a3a2ba1430973e9fc2b317d(origin/release-prod-live). Reset the rejected Mesh merge;origin/cli-r3-fixesiscafd6d55dand has nomesh-view-truthancestor. Read all #239 comments and the related #237 thread; #239 has no linked parent.Three-way merge preview found conflicts in
Cargo.toml,crates/infraternal/src/component_cli.rs, andscripts/verify.d/rust.sh.origin/cli-r3-fixeshas nomesh-view-truthancestor. Resolution keeps both production session and CLI status crates, combines the shared-reactor path with CLI runtime-directory diagnostics, and will set both size caps from measured release artifacts. Added owner-approved D303–D305 text verbatim fromorigin/dev; excluded unrelated D300–D302 and Mesh-view code.iteratestopped at the artifact gate before Rust/TypeScript checks: appending D303–D305 grewDECISIONS.mdfrom the release base's 209,359 bytes to 211,526 bytes, above the 200,000-byte changed-source limit. Restored the owner decision file to the release base (209,359 bytes); D303–D305 remain authoritative onorigin/devand are referenced by the CLI changes. The first iterate output is retained in scratch evidence; rerunning after this correction.The corrected
iteraterun passed artifact, deployment, fmt, VT fmt, CLI compile-out, clippy and cargo-deny. Its test row failed only incrates/plugins/ssh/tests/previous_attempt_shell.rs: the Python shell oracle raisedKeyError: INFRATERAL_TEST_RUNTIME_HELPER. The static musl helper exists at$HOME/.cache/codex-scratch/release-4/target/x86_64-unknown-linux-musl/debug/examples/recovery-helper; the gate log isevidence/verify-iterate-rerun.log. Checking test environment propagation before rerunning.Correction: the shell oracle expects
INFRATERNAL_TEST_RUNTIME_HELPER(with thenininfraternal). I supplied the misspelledINFRATERAL_TEST_RUNTIME_HELPER, so this was job environment setup, not a product failure. The static helper is built; rerunning the affected SSH suite with the correct variable, then the final full gate.With
INFRATERNAL_TEST_RUNTIME_HELPERset to the built static musl helper,cargo test --locked -p infraternal-plugin-ssh --test previous_attempt_shellpasses (1/1; 4.45 s). The earlier test-row failure was the variable-name typo only. Receipt:evidence/ssh-shell-helper-env.log.Stopped at the x86 size guard. The stripped static artifact from the same recipe is 21,144,112 bytes versus the
release-prod-liveartifact/cap of 21,096,144 bytes: +47,968 B (+46.84 KiB), 23,392 B above the +24 KiB stop threshold. Base SHA256aacc763dcffd8cfa3b7f9b56bec7ea8a4a7a179fe833df0fb157249dacce02a9; merged-tree SHA256c821a30a063b982c813ce7e5ca61eee7ee5f21e4f3bff29c95eb5c2f2ca193b1. Both are stripped static PIEs with no PT_INTERP.Section/segment breakdown:
.text+41,536 B;.gcc_except_table+1,920 B;.eh_frame+968 B;.eh_frame_hdr+384 B;.data.rel.ro+736 B;.relr.dyn+16 B;.got+8 B;.data+32 B;.rodataand.bssunchanged. Segment deltas: first read-only LOAD +5,632 B (3,288 B section growth plus 2,344 B layout/padding), executable LOAD +41,536 B, relro LOAD +744 B, writable-segment gap +24 B, data LOAD +32 B.cargo bloat --crateson the symbol-preserving branch build reports 344.4 KiB forinfraternal, 16.1 KiB forinfraternal_status, and 74.9 KiB forinfraternal_plugin_api(absolute approximate sizes, not deltas). Full receipt: size breakdown, cargo-bloat output, static build log.iteratepassed the artifact, deployment, fmt, VT fmt, CLI compile-out, clippy and cargo-deny rows. Its test row failed only because this run set the misspelled helper variable; with the correctedINFRATERNAL_TEST_RUNTIME_HELPER, the affected SSH oracle passed 1/1 (failing iterate log, focused pass). The full gate was not rerun after that environment correction.No aarch64 size, package artifacts, staging, final
scripts/verify fast, or push was performed after crossing the guard. Caps remain at the production values. Mesh-view files are absent. Worktree remains onrelease-4at HEAD5b2a1b9ee32b37433a3a2ba1430973e9fc2b317dwith the resolved CLI merge staged (MERGE_HEAD=cafd6d55d87cb59c1ef74c9d979f0cc984d63ab8); there is no merge commit.Starting release-4 continuation on branch
release-4, base5b2a1b9ee32b37433a3a2ba1430973e9fc2b317d, withorigin/cli-r3-fixes(cafd6d55d87cb59c1ef74c9d979f0cc984d63ab8) staged. Read all #239 comments and the related #237 thread; #239 has no parent. I’m verifying the staged tree excludes #236, then will commit, measure both targets, set exact caps, run the final gate and staging checks under the updated +64 KB guard.Staged-merge check:
origin/cli-r3-fixescontains the #239 CLI commits and #237 status probe;f4d3dca38(#236) is not an ancestor. The mesh-related edits in the staged diff are CLI action/presentation changes. Prior same-recipe x86_64 measurement for this staged tree is 21,144,112 B, +47,968 B vs release-prod-live, within the updated +64 KB stop rule. I’m proceeding with the approved D243 exception; the accepted reason is the versioned--jsonenvelope and D299/D303/D304/D305 exit behavior on every command, including #237’s status extraction (+17 KB).Merge committed as
e73772cbdb0409c6d9a403979da77022b2e816da(parents5b2a1b9eeandcafd6d55d). It integrates #237 status truth and the reviewed #239 CLI work; #236 is absent. The commit records the three conflict resolutions and D243 rationale. x86_64 size remains 21,144,112 B (+47,968 B vs production); next I’m building both static targets to set exact ceilings.Size finding on
e73772cbdb0409c6d9a403979da77022b2e816da, measured oninfraternal-dev(x86_64, 12 cores; load at start 3.38 / 5.31 / 6.73) with the pinned Zig static recipe:c821a30a063b982c813ce7e5ca61eee7ee5f21e4f3bff29c95eb5c2f2ca193b16427dd2bf328a3d3f17bbbba1482976ec9a0e3b62c6939c569eb99e7a3377541Both images are stripped static executables with
PT_INTERPabsent. Each delta is below the approved +64 KB stop rule. I’ll set both caps to these exact measurements, with D243 rationale recorded in the cap change.Finding:
scripts/verify iterateone73772cbdpassed artifact, deployment, fmt, VT fmt, CLI compile-out, clippy and cargo-deny, but its test row failed in threeinfraternal-plugin-ssh/tests/recovery_support.rscases. Their test hosts were underINFRATERNAL_TEST_STATE_ROOT=/home/kayg/.cache/codex-scratch/r4; the generated Unix socket paths exceededsun_path(AF_UNIX path too long, lines 2373–2415 in the attached log). This is test-environment setup, not a source failure. I’m rerunning the recovery-support suite and the later full gate with the documented short relative root.codex-r4.Receipt: verify-iterate-after-merge.log
Correction to the test-state finding: the relative root
.codex-r4resolved thesun_pathlength, but threelegacy_control_socket_*fixtures change their working directory and require an absolute home path; they exited before publishing theirreadymarker (UnexpectedEof, recovery_support.rs:325). The failed focused run is attached: recovery-support-short-root.log. I’m rerunning with/tmp/r4-239, a short absolute symlink to this job’s state directory under/home/kayg/.cache/codex-scratch/release-4/test-state; no test data is written into/tmp.Corrected the test-state path and reran the real SSH recovery suite on
e73772cbd: 11 passed, 0 failed, 1 ignored (the existing Docker image-dependentreview_stale_receipt_recovers_without_host_pythoncase). The short absolute alias/tmp/r4-239points to the job state directory in codex-scratch; no test data is stored in/tmp. Receipt: recovery-support-short-absolute.log. The finalfastrun will use this environment.Exact-cap change committed as
a906ede87on top of mergee73772cbd. The ceilings now match the measured x86_64 / aarch64 artifacts: 21,144,112 / 19,370,696 bytes (+47,968 / +45,176 vs production). Verification before commit:bash -n scripts/verify.d/rust.shPASS;git diff --checkPASS;CARGO_TARGET_DIR=... python3 scripts/test-static-size.pyPASS for exact caps, +1-byte rejection and shrink ratchet on both targets. Next: one fullscripts/verify faston this head.Finding from the first final
scripts/verify fastona906ede87: all rows passed excepttest(Rust 92 passed / 7 failed / 1 ignored); static builds passed at the exact caps. The seven failures are restart path-trust tests (restart::tests::{cold_exec_with_closed_stdin_keeps_the_image_pinned_and_maps_null,private_path_prefix_cannot_authorize_a_parent_directory_escape,real_fd_exec_pins_replacement_and_cold_rollback_uses_null_stdin,reload_reopens_install_path_when_the_running_inode_was_replaced,rootless_even_marked_replacement_is_cold_and_open_fd_pins_the_inode}andrestart_binary::audit_tests::{admitted_inode_cannot_change_in_place_before_execution,pathname_replacement_keeps_the_admitted_inode}). Cause:/tmp/r4-239resolves through a public/tmpparent; the fixtures correctly reject writable parents, and the escape test follows the resolved path. I’ll rerun the failing target and final gate with a short, private real directory under$HOME/.cache, then remove it. Receipt: verify-fast-final.logFinal corrected
scripts/verify fastpassed ona906ede87110465c08ecde0d811c8eca2cbe08cc. The test root is the real mode-700/home/kayg/.cache/r4; removing the/tmpsymlink fixed the earlier restart fixtures. Workspace summary: 563 passed, 0 failed, 52 ignored; the CLI binary tests passed 99 with 1 ignored. Full log: verify-fast-final-corrected.log.Rust gate output:
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| CLI plugin compile-out | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
Static stripped binaries at caps: x86_64 21,144,112 B / 21,144,112 B (+47,968 B vs production); aarch64 19,370,696 B / 19,370,696 B (+45,176 B vs production). Both are static with no PT_INTERP; x86 key-memory check passed. These deltas are within the recorded D243 acceptance band.
Release artifacts are complete under
/home/kayg/.cache/codex-scratch/release-4/artifacts.scripts/package-releaseproduced the bundle; all five bundle entries and all 265 web files passed checksum verification.web-dist.tarcontainsindex.html. Artifact build and transfer-budget receipt: artifacts-build.log.infraternal-x86_64-muslc821a30a063b982c813ce7e5ca61eee7ee5f21e4f3bff29c95eb5c2f2ca193b1infraternal-aarch64-musl6427dd2bf328a3d3f17bbbba1482976ec9a0e3b62c6939c569eb99e7a3377541web-dist.tar5e46109dd6b3bf9f2e78aa8a74f9cf346b49539b96d8792864fc6a760d7d9dc1web-SHA256SUMSc97cfa4140158a01ef94b6da5fb8b9226c1eb42a0896b4ac2b4b4678e459bee7bundle/SHA256SUMSb017b06870cd24332b95c7844a88befdb6aa0855bad5abfb1049fe0fbc9635dbbundle/infraternalc821a30a063b982c813ce7e5ca61eee7ee5f21e4f3bff29c95eb5c2f2ca193b1bundle/infraternal-aarch64-musl9c4847b50c07700727809b76b91ca4050d9b1f987c11698315f6f1b4bb8287c0bundle/infraternal-aarch64-session-musl5489f111cc722950875a92784f8ac6ca0b97d5c241d1cd75e4b9054c41a82209bundle/infraternal-x86_64-musl482484296bc552b3187b31924ecbc8edccb0ffe2c32cd52434f5f2eafa5f39aebundle/infraternal-x86_64-session-musl0f357e9f573aaff647d7521eb22483f6b6a807f0967c0fb58656175a61d171e9Pushed
release-4tooriginata906ede87110465c08ecde0d811c8eca2cbe08cc;git ls-remoteconfirms the remote head. The branch has only the #239/#237 merge and size-cap ratchet as first-parent commits after the production base; #236 is not an ancestor.Signed staging proof passed on
infraternal-perf-test(kernel6.12.111+deb13-amd64). Both named tests passed: signed deploy/handoff and browser-service probes. The proof retained 128 PTY sessions and 6 browser connections; refusal before shutdown and automatic rollback both passed, backup integrity wastrue, and the CA remained unlocked. It recorded 12 handoffs at 10,000 nodes / 50 users: listener-gap bracket p50 3,949.544 ms, p99 4,025.569 ms; server RSS 22,048,768 B, CPU 7.398% of one core. Load average was0.52 0.72 0.47before and1.77 0.99 0.58after. Lock released and unique remote directory removed. Full receipt: staging-proof.log.Docker add-host preflight caught a scratch archive layout mismatch before starting a container or measurement: the first extraction had one extra
repo/level and the expected runner was absent. I removed only that unstarted per-job directory, corrected the archive root, and verified the live test listing plus payload sizes/hashes before starting the run. Receipts: failed preflight, corrected preflight.The first Docker add-host invocation stopped during argument parsing: the single-case
measure.pyrunner does not accept the matrix flags--samplesand--venues. It started no container or add-host test; the locked scope released and cleanup confirmed the unique container and scratch directory were absent. I’m rerunning the same one-case flow without those flags. Receipt: addhost-docker-argument-preflight.log.The next locked-scope preflight found the staged fixture files absent because the earlier parser-only run’s cleanup trap correctly removed its entire remote scratch tree.
measure.pywas not found, so no container or test started; cleanup confirmed the tree absent. I’m combining upload, checksum preflight and the single-case measurement in one wrapped run. Receipt: addhost-docker-missing-files.log.Docker SSH add-host acceptance passed on
infraternal-perf-test(4 cores), undersystemd-run --scope -p CPUWeight=10000and the shared lock. The clean instant add reached the interactive prompt in 318.153 ms and fully joined in 1,179.241 ms; the repeat was refused as already added in 279 ms with the matching host id, then opened the named terminal. Result: 1 passed, 0 failed. Load average was0.00 0.21 0.37before and0.30 0.27 0.39after. The exact Docker container and remote scratch tree are absent, the transient scope is inactive, and fixture listeners on 4929/4930 are gone. Receipts: addhost-docker-perf.log, cleanup verification.Staged x86_64 release binary CLI smoke completed at
a906ede87110465c08ecde0d811c8eca2cbe08cc. Against the staged binary on the perf VM with isolated HOME/state, all six commands emitted exactly one schema-v1 JSON envelope and returned the expected D303/D305 result:status --json0;mesh peers --json5 (unreachable, no agent socket); unknown command 2 (usage); Ctrl-C in JSON mode 130 (interrupted); Ctrl-C in a shell loop 130 and the loop stopped;skill server init --jsonundernohupwith inherited SIGINT ignored completed with 0. The status envelope reported this isolated VM is not set up; no service was installed or changed. Cleanup trap and independent check both confirmed the exact scratch path absent and no CLI process remained.Receipts: CLI smoke, cleanup.
Release 4 staging is complete. Branch
release-4is pushed ata906ede87110465c08ecde0d811c8eca2cbe08cc; remoterefs/heads/release-4matches. The merge is based on5b2a1b9ee32b37433a3a2ba1430973e9fc2b317d; only the CLI #239/#237 merge and size-cap ratchet follow it. Mesh view #236 is not an ancestor. No deployment was performed.Static sizes
Both are statically linked, stripped, and have no
PT_INTERP. The accepted D243 band is 16–64 KB; both sizes are within it. ARM runtime key-memory verification was unavailable on this x86_64 host.Artifact SHA-256
All artifacts are under
/home/kayg/.cache/codex-scratch/release-4/artifacts. The bundle checksum file and all 265 web files verified;web/index.htmlis present.MANIFEST.txtd632d5844eb4b508bd1335614e1c877b9f5883d71546838227c187372d4938f7infraternal-x86_64-muslc821a30a063b982c813ce7e5ca61eee7ee5f21e4f3bff29c95eb5c2f2ca193b1infraternal-aarch64-musl6427dd2bf328a3d3f17bbbba1482976ec9a0e3b62c6939c569eb99e7a3377541web-dist.tar5e46109dd6b3bf9f2e78aa8a74f9cf346b49539b96d8792864fc6a760d7d9dc1web-SHA256SUMSc97cfa4140158a01ef94b6da5fb8b9226c1eb42a0896b4ac2b4b4678e459bee7bundle/SHA256SUMSb017b06870cd24332b95c7844a88befdb6aa0855bad5abfb1049fe0fbc9635dbbundle/infraternalc821a30a063b982c813ce7e5ca61eee7ee5f21e4f3bff29c95eb5c2f2ca193b1bundle/infraternal-aarch64-musl9c4847b50c07700727809b76b91ca4050d9b1f987c11698315f6f1b4bb8287c0bundle/infraternal-aarch64-session-musl5489f111cc722950875a92784f8ac6ca0b97d5c241d1cd75e4b9054c41a82209bundle/infraternal-x86_64-musl482484296bc552b3187b31924ecbc8edccb0ffe2c32cd52434f5f2eafa5f39aebundle/infraternal-x86_64-session-musl0f357e9f573aaff647d7521eb22483f6b6a807f0967c0fb58656175a61d171e9Staging
infraternal-perf-test(4 vCPU, 7 GB): 10,000 nodes, 50 users, 128 real PTYs, 6 responsive browser connections, 12 handoffs. Listener gap bracket p50 3,949.544 ms / p99 4,025.569 ms; idle server CPU 7.398% of one core and RSS 22,048,768 B. All 128 sessions survived with input/output resumed; refusal-before-shutdown, automatic rollback, backup integrity (10,000 nodes/50 users), and CA unlock passed. Load average before/after:0.52 0.72 0.47/1.77 0.99 0.58. Measurement lock released and test directory removed.0.00 0.21 0.37/0.24 0.26 0.38/0.30 0.27 0.39. Container, scratch, transient scope, and fixture listeners were removed.status --jsonexit 0;mesh peers --jsonexit 5 (unreachable, absent local agent socket); usage error exit 2; Ctrl-C with JSON exit 130 (interrupted); Ctrl-C in a shell loop exit 130 and the loop stopped;skill server init --jsonundernohupwith inherited SIGINT ignored exit 0. The isolated host status was “not set up”; no service was installed or changed. Cleanup trap and independent check found no remaining process or scratch directory.Receipts: artifact build and checksums, signed handoff proof, Docker add-host run, Docker cleanup, CLI smoke, CLI cleanup.
Final
scripts/verify fastTest summary:
test result: ok. 563 passed; 0 failed; 52 ignored; 0 measured; 0 filtered out. Both static targets met their exact caps; x86_64 key-memory check passed.Self-review covered the D299 one-envelope contract, D303 exit mapping, D305 shell-loop signal behavior, size caps and checksums, staging cleanup, and release scope. No new foundational dependency or UI change was introduced.
Final artifact recheck: all 265 entries in
web-SHA256SUMSverify from theweb/directory. Receipt.Release 4 deployed to production at 21:21 IST: release-prod-live
a906ede87, server sha256 c821a30a…, /healthz ok. CLI overhaul (#239, #237). CA locked after the restart until the owner unlocks it.kayg referenced this issue2026-10-28 17:53:56 +00:00