CLI: pretty output by default and infraternal skill (D202) #143
Closed
opened 2026-10-09 10:55:12 +00:00 by kayg
·
95 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#143
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?
D202 (main
e968c207): a shared CLI layer: pretty, organised human output by default (sections, aligned columns, plain states and next steps, NO_COLOR/TTY aware), --json everywhere, andinfraternal skillgenerating concise agent skills (description + step-by-step instructions, inputs/outputs, --json shape, safety notes) for every command from the D16 action definitions. Every component (mesh, relay, ssh, backup, agent, server) uses it.Starting issue #143 work on branch cli-layer.
Base dev SHA:
7d6df4470c.Issue #143 currently has no comments or parent issue reference.
Read the contract files and D16/D198/D199/D201/D202; this worktree’s DECISIONS.md stops at D112, so owner decisions were read from main commit
e968c207.Finding during the first full gate:
agent_review::initial_attach_requires_explicit_credit_before_replayfailed before its assertion becausescripts/verify-agent-attach-credit.py:17callsstate.mkdir()ontarget/<id>while the required scratchCARGO_TARGET_DIRleaves the worktreetarget/parent absent (FileNotFoundError). The code change is only a manifest/lockfile dependency. For subsequent gate runs I will point an ephemeral ignoredtarget/symlink at the job scratch target so fixture state stays under$HOME/.cache/codex-scratch/cli-layer/.The same scratch-path issue also caused the static-build row to fail:
.cargo/musl-cc.sh:13resolves Zig via$root/target/auth-tools/zig/zig, whilescripts/auth-toolchainstages it underCARGO_TARGET_DIR. With the required external target directory, the wrapper could not find Zig. An ephemeraltarget/symlink now maps that wrapper path into the job scratch directory; I will rerun the affected test and the full gate.Step complete: added the plugin API
serdedependency and updatedCargo.lockso all--lockedgates resolve. Commit:67d09830.scripts/verify fastpassed after the external-target path was routed through an ephemeral symlink. Gate summary: fmt PASS; VT native fmt PASS; clippy PASS; test PASS; cargo-deny PASS; static builds PASS. Static binaries: x86_64 15,965,392 bytes (max 16,404,816); aarch64 13,426,064 bytes (max 13,817,816). TypeScript protocol: 7 passed, 0 failed; tracer: 54 passed, 0 failed. Load average at completion: 4.91 / 13.14 / 17.87.Finding after API metadata commit: Clippy rejected
ActionRegistry::newbecause its publicResultlacks a# Errorsrustdoc section (action.rs:380,clippy::missing_errors_doc). I stopped the gate after that deterministic lint failure; tests had no failures before interruption. I am adding the required error documentation and amending commit aa0042df before rerunning.Step complete: committed validated plugin action metadata and registry as
05a4c668. API tests: 3 passed, 0 failed.scripts/verify fastcompleted: fmt PASS; VT native fmt PASS; clippy PASS; test PASS; cargo-deny PASS; static builds PASS. Binary sizes remained x86_64 15,965,392 / 16,404,816 max and aarch64 13,426,064 / 13,817,816 max. Tracer tests 54 passed, protocol tests 7 passed. Load average at completion: 5.33 / 6.38 / 12.38.Step complete: registered optional mesh, SSH, relay, and backup plugin packages and wired agent/server packages to the action API. Commit:
1b0abcef.scripts/verify fastpassed: fmt PASS; VT native fmt PASS; clippy PASS; test PASS; cargo-deny PASS; static builds PASS. Binary sizes: x86_64 15,965,456 bytes (max 16,404,816); aarch64 13,426,064 bytes (max 13,817,816). Tracer 54/54 and protocol 7/7 passed. Load average at completion: 4.04 / 5.06 / 9.03.Step complete: added the shared action JSON result schema and its coverage test. Commit:
b78798e5.scripts/verify fastpassed: fmt PASS; VT native fmt PASS; clippy PASS; test PASS; cargo-deny PASS; static builds PASS. Binary sizes: x86_64 15,965,456 bytes (max 16,404,816); aarch64 13,426,064 bytes (max 13,817,816). API tests 4 passed; tracer 54/54; protocol 7/7. Load average at completion: 4.80 / 7.02 / 8.33.Finding: the fast gate's Clippy row flagged two
assert_is_emptylints incrates/plugins/ssh/src/cli.rs(assert!(!action.description.is_empty())and the equivalent instructions assertion). The implementation behavior is unchanged; adjusting test assertions before amending the SSH metadata commit.Finding: after the SSH test assertions were adjusted for Clippy, the next fast-gate run passed clippy but fmt reported only rustfmt layout changes in those two assertions in
crates/plugins/ssh/src/cli.rs. Stopped before completing tests; applying formatter and rerunning the full gate on the amended commit.Step complete:
crates/plugins/ssh/src/cli.rsregistersssh up|down|statuswith complete action metadata and explicit not-available placeholders. Commit:b6ef98a9.Fast gate passed. Rust workspace tests passed, including server 100 passed/9 ignored, shim 61 passed/12 ignored, plugin API 4/4 and SSH metadata 1/1. TypeScript build and tests passed (tracer 54/54; protocol 7/7). Static binaries: x86_64 15,965,456/16,404,816 bytes; aarch64 13,426,064/13,817,816 bytes. Tracer test port: 4261.
Gate summary (verbatim):
CLI shape choice from D201: keep bare
infraternal serveras the existing foreground service runner. Implementserver initas the explicit confirmed path (--yesfor scripts), reusing the existing user-service installer and private setup-token socket; retainserver installandserver setup-tokencompatibility. Runtime node lifecycle actions remain clearnot available yetresults where no component manager exists. No install/start command will be run during this job.Step complete:
JsonSchema::command_result_withnow declares required typeddatainside the stable CLI result envelope; generic actions use an empty object. Commit:1245760e.Fast gate passed (TRACER_TEST_PORT=4262). Plugin API tests 5/5; server tests 100 passed/9 ignored; shim tests 61 passed/12 ignored; tracer 54/54; protocol 7/7. Static binaries: x86_64 15,965,456/16,404,816 bytes; aarch64 13,426,064/13,817,816 bytes.
Gate summary (verbatim):
Step complete:
crates/plugins/relay/src/cli.rsregisters relay up/down/status with complete help/skill metadata and reports unavailable until runtime behavior exists. Commit:567c8733.Fast gate passed (TRACER_TEST_PORT=4263). Server tests 100 passed/9 ignored; shim 61 passed/12 ignored; relay metadata test 1/1; tracer 54/54; protocol 7/7. Static binaries: x86_64 15,965,456/16,404,816 bytes; aarch64 13,426,064/13,817,816 bytes. Aarch64 link took 7m02s while host load was 41.33/35.79/25.83 at 18:07 UTC; gate passed.
Gate summary (verbatim):
Step complete:
crates/plugins/backup/src/cli.rsregisters backup up/down/status with complete help/skill metadata and explicit unavailable placeholders. Commit:16cef84f.Fast gate passed (TRACER_TEST_PORT=4264). Backup metadata test 1/1; server tests 100 passed/9 ignored; shim 61 passed/12 ignored; tracer 54/54; protocol 7/7. Static binaries: x86_64 15,965,456/16,404,816 bytes; aarch64 13,426,064/13,817,816 bytes. Aarch64 link took 2m59s; host load at 18:27 UTC was 31.15/39.67/37.85.
Gate summary (verbatim):
Step complete:
crates/infraternal-agent/src/cli.rsregisters agent up/down/status with complete metadata and explicit unavailable placeholders until lifecycle management exists. Commit:b1adba69.Fast gate passed (TRACER_TEST_PORT=4265). Agent metadata test 1/1; server tests 100 passed/9 ignored; shim 61 passed/12 ignored; tracer 54/54; protocol 7/7. Static binaries: x86_64 15,965,456/16,404,816 bytes; aarch64 13,426,064/13,817,816 bytes.
Gate summary (verbatim):
Finding: the mesh commit's first fast-gate run passed formatting but Clippy flagged
assert!(up.input_schema.required.is_empty())incrates/infraternal-mesh/src/cli.rsasassert_is_empty. Focused mesh test passed; gate stopped during the test phase. Amending to compare the required-field list to an empty array, then rerunning the full gate.Finding: the fast gate on mesh commit
e0f68cadpassed fmt and Clippy but failedinfraternal/tests/agent_daemon.rs::real_binary_preserves_input_and_output_across_24_abrupt_stopsat iteration 22 withterminal command queue full; iterations 1–21 replayed exactly. Host load at 18:50 UTC was 13.20/17.16/24.49. This is outside the listed baseline-exception tests. Letting the gate finish, then isolating and rerunning the failure before deciding next steps.Follow-up to the queue-full finding: reran
real_binary_preserves_input_and_output_across_24_abrupt_stopsalone in the repository Nix shell. It passed all 24/24 restart positions over 4,710,396 payload bytes with zero replay divergences (47.73s). Host load at 19:00 UTC was 16.89/18.10/21.06. No runtime source changed. Rerunning fullscripts/verify fastone0f68cad.Finding: the full fast-gate retry on mesh commit
e0f68cadexited before any Rust rows because the three-sample loopback RTT precheck reportedp50=306.51 ms p99=416.72 msagainst configured 300 ms. Host load at 19:01 UTC was 16.23/17.83/20.86. No source changed. Rerunning the requested local fast gate undersystemd-run --user --scope -p CPUWeight=10000with a new tracer port.Mesh action metadata step complete:
crates/infraternal-mesh/src/cli.rsdeclaresmesh up|down|status, including the optional SSH input and explicit unavailable result. Commite0f68cadc41076e92ad1e218664950c5d1bfb1a2.The scoped
scripts/verify fastrun (TRACER_TEST_PORT=4269, load 19.19/17.59/19.34 at 19:08 UTC) exited 0. Gate table:Server tests: 100 passed, 9 ignored; shim: 61 passed, 12 ignored; tracer: 54 passed; protocol: 7 passed. Static binary sizes: x86_64 15,965,456 / 16,404,816 bytes; aarch64 13,426,064 / 13,817,816 bytes.
Finding: the first fast gate rejected the
serdedependency change becauseCargo.lockneeded its root package dependency list refreshed (--locked); both clippy and tests stopped before compilation.cargo check --package infraternal --offlineupdated only theinfraternallock entry and passed in 11.89s. The initial gate also completed both static builds within existing size budgets. Retrying the full gate now with the refreshed lockfile.Typed JSON serialization dependency step complete:
crates/infraternalnow declares workspaceserde, and Cargo.lock records it. Commit08658448ce5d187546e6b071f30e374d7848c89d.systemd-run --user --scope -p CPUWeight=10000 ... scripts/verify fastpassed (TRACER_TEST_PORT=4270; load 19.88/16.37/16.73 at 19:19 UTC). Gate output:Server: 100 passed, 9 ignored; shim: 61 passed, 12 ignored; tracer: 54 passed; protocol: 7 passed. Static sizes: x86_64 15,965,392 / 16,404,816 bytes; aarch64 13,426,064 / 13,817,816 bytes.
Shared result renderer step complete: the CLI now has a versioned typed JSON envelope, readable wrapped output with aligned details/tables, color only for TTY output without
NO_COLOR, and technical details under plain error sentences. Current server and agent output paths use the envelope. Commit2fc8c8fe905f79aadbcf5cac95735652035947aa.systemd-run --user --scope -p CPUWeight=10000 ... scripts/verify fastpassed (TRACER_TEST_PORT=4272; load 12.55/10.79/7.29 at 01:16 UTC). Gate table:Server tests: 100 passed, 9 ignored; shim: 61 passed, 12 ignored; tracer: 54 passed; TypeScript protocol: 7 passed. Static sizes: x86_64 16,027,216 / 16,404,816 bytes; aarch64 13,473,248 / 13,817,816 bytes.
Runtime-string dependency step complete: workspace Clap now enables its existing
stringfeature so the command tree can use plugin-owned command and option names. Commit46f9d91b81029d09fae0ce6d5d8a2244bffb791d.systemd-run --user --scope -p CPUWeight=10000 ... scripts/verify fastpassed (TRACER_TEST_PORT=4273; load 11.71/9.44/7.78 at 01:29 UTC). Gate table:Server tests: 100 passed, 9 ignored; shim: 61 passed, 12 ignored; tracer: 54 passed; TypeScript protocol: 7 passed. Static sizes: x86_64 16,055,760 / 16,404,816 bytes; aarch64 13,495,264 / 13,817,816 bytes.
Finding:
crates/infraternal-server/Cargo.tomlalready declaresinfraternal-plugin-apias a direct dependency. The server role can own its action metadata incrates/infraternal-server/src/cli.rsand expose it behind acli-pluginfeature forwarded by the binary'splugin-serverfeature.Skill generation tests found that command path parts were concatenated in filenames (
server initbecameserverinit, andagent upbecameagentup). The failing assertions are incrates/infraternal/src/cli/skills.rs; fixing the separator mapping before commit.Contract review found that hidden
server installstill reachesinstall_serverincrates/infraternal/src/main.rs, so it can create a service outside the D201server initpath. I am changing the legacy command to return a migration message and updatingdocs/CLI.md;server initwill remain the sole creation path.The daemon restart fixture failed twice with the current debug binary at iteration 1 (
before-forward, 470,784-byte replay; queue-full Close). At the second run's start, host load was 24.95/15.97/11.21. The previously built release artifact passed all 24 replay positions (4,710,396 bytes). The CLI change affects pre-dispatch parsing only; I am checking the current optimized build before classifying this debug-profile failure.Committed core metadata-driven CLI and D201 server/status skeleton as
9eacf057. Server actions now live in the server crate's feature-gated CLI plugin; compiled-out plugins register no commands, and legacyserver installonly redirects to confirmedserver init.scripts/verify fastpassed. Rust gate output:Static sizes: x86_64 16153328 bytes (max 16404816); aarch64 13574264 bytes (max 13817816). Rust/TypeScript stream differential: 134 streams, 11439 schedules, zero divergences; TypeScript protocol tests 7 pass.
Follow-up to the debug restart fixture failure: the weighted
scripts/verify fastrun passedreal_binary_preserves_input_and_output_across_24_abrupt_stops(24/24 positions, 4,710,396 bytes) and the saturated queue tests. No agent or daemon code changed. The earlier failure was limited to the unweighted debug run under high host load.Skill-generation step complete at
fcbfb3243d.infraternal skillnow lists registered commands, renders individual skills from action metadata, and writes Markdown skills atomically. The fullscripts/verify fastgate passed: Rust fmt, VT native fmt, clippy, tests, cargo-deny and both static builds passed; TypeScript protocol tests passed (7/7, 34,390 expectations), and tracer tests passed (54/54, 9,930 expectations).Static binaries: x86_64 16,202,480 / 16,404,816-byte maximum; aarch64 13,608,488 / 13,817,816-byte maximum.
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
Independent review findings verified against the implementation:
crates/infraternal/Cargo.tomldeclaresinfraternal-serverandinfraternal-agentunconditionally;plugin-serveronly toggles the servercli-pluginfeature andplugin-agentis empty. Disabling either plugin hides action metadata but still includes the role crate, so the D198 compile-out contract is incomplete.crates/infraternal/src/main.rs::run_server_initpasses a custom--nameintoInstallArgs, whilesystemd_server_statechecks onlyinfraternal-server.service. A custom-named initialized service can therefore be missed byinfraternal status.I’m adding regression coverage and correcting both before reporting completion. No server init or install command was invoked.
CLI guide committed at
2130449e9f.docs/CLI.mddocuments the metadata-backed command tree, stable JSON envelope, D201 shape, and generated skills.scripts/verify fastpassed (TRACER_TEST_PORT=4276): tracer 54/54, TypeScript protocol 7/7 with 34,390 expectations, Rust tests passed.Static binary sizes: x86_64 16,202,480 bytes (max 16,404,816); aarch64 13,608,488 bytes (max 13,817,816).
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
Status regression test added and run before implementation:
cargo test -p infraternal status_tests::custom_named_server_service_is_reported_as_running -- --exact --nocapturefailed as expected (left: None,right: Some(true)). The fixture uses the exactDescription=infraternal server (infraternal-edge)shape written forserver init --name infraternal-edge.Custom-unit status fix committed at 2b719a0db4efcaa9217859bf3878e87a3ec46fff. Status now scans service descriptions in both systemd scopes, detects the unit description generated by server init regardless of
--name, and avoids claimingStoppedwhen a manager cannot be queried. Focused regression tests pass: 3/3 (custom active, custom inactive, unrelated service). Fullscripts/verify fastis running for this commit.Status commit was amended for formatting; current SHA is
6779d0e6c1. The first full gate on the pre-amend SHA reportedfmt: FAIL (1); VT native fmt, clippy, tests, cargo-deny and static builds passed.cargo fmt --all --checknow passes, and the full gate is rerunning on the amended commit.Custom-unit status fix completed at
6779d0e6c1. The rerun ofscripts/verify fastpassed (TRACER_TEST_PORT=4278); the 19 CLI tests include 3 status discovery tests. Static sizes: x86_64 16,206,384 bytes (max 16,404,816); aarch64 13,611,192 bytes (max 13,817,816). Tracer tests: 54/54; TypeScript protocol tests: 7/7, 34,390 expectations.+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
Compile-out regression gate added and run before the manifest change. It failed with both actual no-default dependency leaks:
infraternal-agentandinfraternal-serverremain incargo tree -p infraternal --no-default-features -e normal. This directly verifies the D198 build-time removal gap.Plugin compile-out fix committed at
eebf0bcf83.infraternal-serverandinfraternal-agentare now optional Cargo dependencies activated by their plugin features; their CLI handlers are cfg-gated. The new fast gate checks that no-default builds omit all six role plugin crates and runs the no-default CLI suite. It passes: no plugin crates in the normal dependency graph and 15 CLI tests passed, including the no-default command registry assertion. Fullscripts/verify fastis running for this commit.Plugin compile-out fix completed at
eebf0bcf83.scripts/verify fastpassed (TRACER_TEST_PORT=4279): the no-default graph excludes all six role plugin crates, 15 no-default CLI tests and 19 default CLI tests passed, tracer tests passed 54/54, and TypeScript protocol tests passed 7/7 with 34,390 expectations.Static sizes: x86_64 16,206,384 bytes (max 16,404,816); aarch64 13,611,192 bytes (max 13,817,816).
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| CLI plugin compile-out | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | PASS |
+---------------------------+--------------+
infraternal skill --writewrites 22 files but its human result includes emptyDetails,Skill, andCommandssections. The skill result containsskill: ""andcommands: []; human rendering should omit empty values while preserving the JSON payload. Adding a regression snapshot and renderer fix.Committed
341b6beb(shared human renderer now omits empty strings and recursively empty collections). Regression snapshot confirms clean skill-write sections and unchanged empty fields in JSON. Focused output tests: 5 passed;cargo fmt --all -- --checkandgit diff --checkpassed.Finished on
cli-layer, HEAD341b6beb4ba46dab6b571f890ca5dbed1ea76690.scripts/verify fastpassed withTRACER_TEST_PORT=4280. Gate output:Evidence: no-default CLI 16 tests; default CLI 20; server 100 passed/9 ignored; shim 61 passed/12 ignored; tracer 54 passed/0 failed/9,930 expectations; TypeScript protocol 7 passed/0 failed/34,390 expectations, 134 streams/11,439 schedules/zero divergences. Static x86_64 size 16,207,664/16,404,816-byte cap; aarch64 13,612,088/13,817,816-byte cap.
Startup/RSS (31 runs,
systemd-run --user --scope -p CPUWeight=10000, infraternal-dev x86_64, kernel 6.12.111+deb13-amd64, load before/after 27.46/24.21/19.53): help p50/p95 6.050/10.509 ms, RSS p50/p95/max 9,120 KiB; status p50/p95 39.919/66.240 ms, RSS p50/p95/max 9,124/9,184/9,184 KiB.Pretty
infraternal statussample:infraternal skill upsample:infraternal skill --writewrote 22 files and now lists them without empty sections. Worktree diff check passed; no server initialization or install was invoked.Independent verification started on branch
review-cli-layerat target head341b6beb4ba46dab6b571f890ca5dbed1ea76690; diff base (merge-base withdev) is01a6d848242d8a4e723f5777942211ac4df12c6f. I read all 44 comments on #143; it has no parent issue. I am reviewing the final CLI layer and its recorded claims.F-001 (P2) is confirmed at
341b6beb.crates/infraternal/src/cli/output.rs::object_rowskeeps all-empty table columns and object rows. The committed regressioncli::output::tests::pretty_tables_omit_empty_columns_and_rowsfailed withDetails Name Stateand a blank row for[ {"name":"mesh","state":"running","details":""}, {} ]. Test commit:29ddd8b40d920fc8dc8959a74b37b4f8759e8bdc. Details are recorded inreview-cli-layer/findings.md.F-002 (P2) is confirmed.
cargo test -p infraternal --bin infraternal --no-default-features cli::actions::tests::server_only_dependencies_are_removed_with_server_plugin -- --exactfailed becausesqlx.workspace = trueremains unconditional;tokio.workspace = trueis unconditional as well. The no-default graph still includessqlx,sqlx-core,sqlx-macros,sqlx-sqlite, andtokio, while the role plugin crates are absent. This leaves server runtime dependencies in the core build graph despite D198 compile-out. Test commit:096da779970c365179c95a9031a96fe943d1cd41. Details are recorded inreview-cli-layer/findings.md.F-003 (P1) is confirmed against
contracts/plugin.md§3 and D16. The registeredmesh upaction serializes withouttarget,effect,permission, ordry_run, so the newActionDefinitionis CLI presentation metadata rather than the canonical permission-aware action contract;main.rsalso routes handlers with a hand-written path match. The committed regressioncli::actions::tests::registered_actions_include_plugin_permission_contract_fieldsfails on the missingtargetfield. Test commit:863d64fa75a73a9de9ab86b14eac199ec7bd1a21. Details are recorded inreview-cli-layer/findings.md.F-004 (P2) is confirmed.
cargo clippy --locked -p infraternal --all-targets --no-default-features -- -D warningsfails with E0433 atcrates/infraternal/tests/agent_sessions.rs:3becauseinfraternal-agentis now optional but this integration target still imports it unconditionally. The fast gate checks only--bin, so it misses the package all-target path. The committed regressioncli::actions::tests::agent_session_integration_target_is_gated_by_agent_pluginfails on the missing cfg. Test commit:8e2c1fddc5d3ed4874c267a9b252c86ab0af43e8. Details are recorded inreview-cli-layer/findings.md.Independent review finished on
review-cli-layerat8e2c1fddc5d3ed4874c267a9b252c86ab0af43e8. Verdict: merge after fixes. Findings: P0 0, P1 1, P2 3, P3 0. Four failing regression tests are committed on the review branch; details are appended to/home/kayg/.local/state/codex-jobs/infraternal/review-cli-layer/findings.md.scripts/verify faston job head341b6beb4ba46dab6b571f890ca5dbed1ea76690exited 0 (TRACER_TEST_PORT=4343, run undersystemd-run --user --scope -p CPUWeight=10000). Rust gate output:Gate metrics:
METRIC name=network_rtt_selftest configured_rtt_ms=300 jitter_ms=30 loss=unsupported transport=tcp-stream n=3 p50_ms=300.66 p99_ms=304.32 result=PASS; TypeScript protocol output:7 pass,0 fail,34390 expect() calls; differential:134 streams, 11439 schedules, zero divergences. Static binaries: x86_64 16,207,664 / 16,404,816-byte cap; aarch64 13,612,088 / 13,817,816-byte cap.Independent 31-run startup/RSS remeasurement on infraternal-dev (x86_64, kernel
6.12.111+deb13-amd64, load before/after3.52 / 8.75 / 13.62): help p50/p952.159 / 2.707 ms, RSS max7,028 KiB; status p50/p9519.899 / 22.974 ms, RSS p50/p95/max8,032 / 8,112 / 8,124 KiB.Starting review-fix round on branch
cli-layer.Base SHA:
341b6beb4ba46dab6b571f890ca5dbed1ea76690.Read #143's full comment history (50 comments); the issue has no parent reference. Review findings and four committed regression tests are in
~/.local/state/codex-jobs/infraternal/review-cli-layer/findings.md.F-003 reproduced after cherry-picking
863d64fa:cli::actions::tests::registered_actions_include_plugin_permission_contract_fieldsfails for registeredmesh up; serializedActionDefinitionhas notarget(and lackseffect,permission,dry_run). Focused command:nix shell nixpkgs#zig_0_15 nixpkgs#gnumake nixpkgs#perl -c env CARGO_TARGET_DIR=$HOME/.cache/codex-scratch/cli-layer/target cargo test -p infraternal --bin infraternal cli::actions::tests::registered_actions_include_plugin_permission_contract_fields -- --exact --nocapture. Fixing the action contract and registry dispatch.Action contract schema/migration committed as
994ee7345205ad527d7ec5e38b19d72c782ae351. Every registered action now serializes target, effect, permission, and dry_run; registry validation rejects empty permissions and destructive actions without required dry runs. Focused F-003 regression: 1 passed.scripts/verify fastpassed (TRACER_TEST_PORT=4281). Rust gate output:Static binaries: x86_64 16,212,912 bytes (base 16,207,664; +5,248; max 16,404,816); aarch64 13,615,672 bytes (base 13,612,088; +3,584; max 13,817,816). TypeScript tracer tests 54/54; protocol tests 7/7, 34,390 expectations, 134 streams/11,439 schedules/zero divergences.
F-001 reproduced after cherry-picking
29ddd8b4:cli::output::tests::pretty_tables_omit_empty_columns_and_rowsfails atcrates/infraternal/src/cli/output.rs:602. Input includes{"name":"mesh","state":"running","details":""}and{}; pretty output retains the emptyDetailscolumn and prints a blank row. Fixingobject_rows.Fixed pretty tables dropping rows with no visible values and columns whose values are all empty; JSON output is unchanged. Commit:
abd562c6f7. The new regression passed (1/1).scripts/verify fast(TRACER_TEST_PORT=4282) 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 binaries: x86_64 16,214,256 bytes; aarch64 13,616,440 bytes. Relative to
341b6beb, cumulative change is +6,592 and +4,352 bytes respectively. TypeScript protocol: 7/7 tests, 34,390 assertions, 134 streams / 11,439 schedules / zero divergences. Full log: /home/kayg/.cache/codex-scratch/cli-layer/f1-output-fast.log.Reproduced the no-default server dependency leak at
ace27cc4. The new regression fails becausesqlx.workspace = trueis unconditional (actions.rs:298reportssqlx remains available without the server plugin).cargo tree -p infraternal --no-default-features -e normalshows directsqlx v0.8.6andtokio v1.53.2entries. Fixing the declarations behindplugin-servernow.The dependency change passes its focused regression and the no-default tree check, but the full fast gate returned 1 due to
agent_daemon::real_binary_preserves_input_and_output_across_24_abrupt_stops(tests/agent_daemon.rs:6). At iteration 22/24, replay returnedterminal command queue full; 21 iterations passed. The test ran 45.37 s; host load was 25.08 on 8 cores. All other Rust gate rows, cargo-deny and both static size checks passed. Log: /home/kayg/.cache/codex-scratch/cli-layer/f2-deps-fast.log. Retrying the targeted daemon test to determine whether it repeats.Targeted retry also fails at iteration 22/24 with the same
terminal command queue fullresponse (40.29 s; 21 iterations pass). The current Cargo changes only remove the unused root SQLx edge and make root Tokio optional underplugin-server; the default feature set still enablesplugin-server. Host load was 24.77/21.22/17.60 at retry completion. Waiting for lower load before another full gate attempt; not treating this failure as an allowed baseline exception.The same targeted daemon test passed on the third attempt: all 24 abrupt stop/restart iterations passed in 46.02 s.
/proc/loadavgat completion was 15.17/17.78/16.80; earlier failures completed at about 25 load. I’m rerunning the full fast gate with TRACER_TEST_PORT=4284; the first full run remains recorded as a failure, not waived.The full fast retry passed the daemon replay test, then failed in
infraternal-serverwithauth::tests::server_setup_terminal_echo_and_resume_preserve_offsets_once:crates/infraternal-server/src/auth/tests.rs:1714panickedserver closed websocket unexpectedly: None. Server suite result was 99 passed, 1 failed, 9 ignored in 146.32 s; all other Rust gate rows, cargo-deny and static size checks passed. Log: /home/kayg/.cache/codex-scratch/cli-layer/f2-deps-fast-retry.log. This is not the auth socket/review3 timeout exception. I’ll run this test alone to determine whether it repeats.The isolated server test rerun passed: 1/1 in 2.79 s after 1m38s of compile work. The full-suite failure has not repeated in isolation; continuing with a third full fast run (TRACER_TEST_PORT=4285), rather than waiving it.
Third full fast run again failed
agent_daemon::real_binary_preserves_input_and_output_across_24_abrupt_stops, this time at iteration 1/24 (scripts/verify-agent.pyreports the replay stalled; the fixture then received the queue-full close)./proc/loadavgimmediately after was 27.85/21.33/18.53. Fmt, compile-out, clippy, cargo-deny and both static builds passed; Rust test row failed. Log: /home/kayg/.cache/codex-scratch/cli-layer/f2-deps-fast-third.log. The targeted test passed all 24 iterations at a lower load window; waiting for load to ease before another full run.Made SQLx absent from the CLI core dependency list and made Tokio optional under
plugin-server. Commit:a1b6f28a69. The new regression passed (1/1);cargo tree -p infraternal --no-default-features -e normalcontains nosqlxortokioentries. Full log: /home/kayg/.cache/codex-scratch/cli-layer/f2-deps-fast-fourth.log.Final
scripts/verify fastRust gate output (TRACER_TEST_PORT=4286):+---------------------------+--------------+
| 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 sizes: x86_64 16,214,256 bytes; aarch64 13,616,440 bytes (no size change from the previous commit; cumulative from
341b6beb: +6,592 and +4,352 bytes). TypeScript protocol: 7/7 tests, 34,390 assertions; 134 streams / 11,439 schedules / zero divergences. Earlier fast attempts hit daemon/server timing failures during high host load; the final full run passed all rows.Reproduced the no-default all-target Clippy failure at
4c4b8508.cargo clippy -p infraternal --no-default-features --all-targets -- -D warningsfails to resolveinfraternal_agentattests/agent_sessions.rs:3andtokioat lines 12 and 66. I’ll gate this integration target onplugin-agent; Tokio remains a normal optional dependency for the server and a dev dependency for the agent test when enabled.The fast gate for the agent-test fix passed all suites except
auth::tests::socket_tests::expired_handshake_releases_user_permits(socket_tests.rs:151): its expected HTTP 503 handshake rejection did not match; server result 99 passed, 1 failed, 9 ignored. This is the auth socket timeout case covered by the #118 gate rule, so I’m running it on a detached localdevbaseline under /home/kayg/.cache/codex-scratch/cli-layer/baseline in the same load window. Full log: /home/kayg/.cache/codex-scratch/cli-layer/f3-agent-test-fast.log.Baseline comparison at detached
deve704e5b8(the specified auth socket timeout test):test auth::tests::socket_tests::expired_handshake_releases_user_permits ... oktest result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 150 filtered out; finished in 0.64sCurrent branch isolated rerun also passed:
test auth::tests::socket_tests::expired_handshake_releases_user_permits ... oktest result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 108 filtered out; finished in 0.75sThe full fast run remains non-green: server suite 99 passed, 1 failed, 9 ignored in 94.34s; the assertion failed only within the parallel server suite. Since the baseline did not fail the same way, I am not waiving it under #118. Current
/proc/loadavgis 8.75/13.60/13.92. I’ll retry the full gate under this lower load window.Gated
tests/agent_sessions.rsonplugin-agentand retained Tokio as a dev dependency so agent-only integration builds still work. Commit:7c5bf52a67.cargo clippy -p infraternal --no-default-features --all-targets -- -D warningspassed; the agent-only session integration test passed 1/1. The no-default normal dependency tree has no SQLx or Tokio entries. Full log: /home/kayg/.cache/codex-scratch/cli-layer/f3-agent-test-fast-retry.log.Final
scripts/verify fastRust gate output (TRACER_TEST_PORT=4288):+---------------------------+--------------+
| 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 sizes stayed unchanged at x86_64 16,214,256 bytes and aarch64 13,616,440 bytes (cumulative from
341b6beb: +6,592 / +4,352 bytes). TypeScript protocol: 7/7 tests, 34,390 assertions; 134 streams / 11,439 schedules / zero divergences. The earlier full-suite auth socket timeout failure passed in isolation both ondeve704e5b8and this branch; the final complete gate passed.Added the registry-dispatch regression in commit
7413a59167. It fails against the handwritten router as expected:cargo test -p infraternal --bin infraternal hidden_session_shim_dispatches_from_the_registered_action -- --nocapturereportsunresolved import super::dispatch_selected_actionatmain.rs:989. Implementing the registry dispatcher next.The registry-dispatch full fast run passed every Rust row except the same auth socket timeout test,
expired_handshake_releases_user_permits: server suite 99 passed, 1 failed, 9 ignored in 95.95 s. Both static builds passed at x86_64 16,199,568 bytes and aarch64 13,604,536 bytes (down 14,688 / 11,904 bytes from the previous step). Log: /home/kayg/.cache/codex-scratch/cli-layer/f4-dispatch-fast.log. Repeating the required detacheddevbaseline comparison for this run.Detached
devbaseline comparison for the latest fast failure (baseline HEADe704e5b8):test auth::tests::socket_tests::expired_handshake_releases_user_permits ... oktest result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 150 filtered out; finished in 0.95sThe current branch isolated test also passed earlier (1/1 in 0.75 s). The full server suite still failed that one test (99 passed, 1 failed, 9 ignored in 95.95 s), so the #118 exception does not apply. Retrying the full fast gate with TRACER_TEST_PORT=4290.
Fast retry 4290 stopped at the RTT self-check before Rust gates:
latency proxy: configured 300 ms RTT did not arrive: p50=298.61 ms p99=403.41 ms(log/home/kayg/.cache/codex-scratch/cli-layer/f4-dispatch-fast-retry.log)./proc/loadavgwas 11.27/9.70/9.43 after completion. This is outside the #118 baseline exception list and is not waived; retrying when the host is quieter.Second RTT-only retry (TRACER_TEST_PORT=4291) also stopped before Rust gates:
p50=351.62 ms p99=385.78 msfor configured 300 ms;/proc/loadavgwas 12.75/10.56/9.79. Log: /home/kayg/.cache/codex-scratch/cli-layer/f4-dispatch-fast-rtt-retry.log. Rerunning in the prescribed CPU-weighted scope because the gate's latency self-check is the blocker.The CPU-weighted fast run passed RTT and daemon replay, then failed
tests/shim.rs::attached_backpressure_and_detached_progressat line 193:attached producer never stalled at head 1078 (minimum 1969)after 10.03 s. Server/static checks were not affected; gate log: /home/kayg/.cache/codex-scratch/cli-layer/f4-dispatch-fast-cpuweight.log./proc/loadavgafter completion was 21.13/15.90/12.01. This is outside the #118 exception list; isolating the test after load eases.The previously failing shim case passed when isolated in a CPU-weighted scope:
cargo test -p infraternal --test shim -- --exact attached_backpressure_and_detached_progress --nocapture=> 1 passed, 0 failed in 0.73 s (test compile 16.49 s). Host load at completion was about 32.86/20.29/14.38. This does not waive the failed full run; I’ll retryscripts/verify fastunder lower load.The CPU-weighted full retry passed RTT, daemon replay, shim tests and all other reported suites, but the server suite again failed only
auth::tests::socket_tests::expired_handshake_releases_user_permits(99 passed, 1 failed, 9 ignored in 127.19 s). Log: /home/kayg/.cache/codex-scratch/cli-layer/f4-dispatch-fast-lower-load.log. Repeating the detacheddevbaseline comparison for this load window under the #118 rule.Second detached
devbaseline comparison (HEAD7e8545c4, same load window):test auth::tests::socket_tests::expired_handshake_releases_user_permits ... oktest result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 150 filtered out; finished in 1.22sThe current full suite failed the same test (99 passed, 1 failed, 9 ignored in 127.19 s); current isolated reruns on both branches pass.
/proc/loadavgafter baseline was 33.40/24.78/18.45. The baseline did not fail the same way, so this remains non-waived under #118; I’ll rerun the full gate in a quieter window.Baseline comparison: serialized
cargo test -p infraternal-server --libon detached dev7e8545c4completed with139 passed; 0 failed; 12 ignored(225.88 s).expired_handshake_releases_user_permitspassed in that same suite. The cli-layer full gate has failed that row twice, so this is not a matching baseline failure and I am not waiving it.Gate finding at
TRACER_TEST_PORT=4295(load average 8.09, 11.22, 14.63): all Rust rows excepttests/vt_reconnect.rs::snapshot_limits_never_close_live_reconnectpassed. Its capturedtarget/review-vt2-fixes/reconnect.stdout.logshows three reconnect checks passing; stderr ends atlegacy Snapshot rejection must leave daemon live. I am isolating this row before retrying the full gate.Finished on
cli-layer, headab42b65f84378e9eb43bc66f84f95f84ed5ce043.TRACER_TEST_PORT=4296 scripts/verify fastexited 0. Verbatim Rust gate summary:The TypeScript protocol gate also ended with
7 pass,0 fail,34390 expect() calls,Ran 7 tests across 2 files. [2.10s]. The four review regressions passed in the full test gate.cargo clippy -p infraternal --no-default-features --all-targets -- -D warningspassed.cargo tree -p infraternal --no-default-features -e normalcontains neither Tokio nor SQLx.Startup benchmark: 31 runs per command in
systemd-run --user --scope -p CPUWeight=10000; load average was8.73 11.14 13.38before and8.43 11.03 13.33after.--help: p50 3.525 ms, p95 6.920 ms, RSS median/max 8,212 KiB.status: p50 24.066 ms, p95 30.571 ms, RSS median/max 8,212 KiB.Stripped static binaries: x86_64 16,199,568 bytes; aarch64 13,604,536 bytes. Relative to
341b6beb, the full fix set is -8,096 / -7,552 bytes. Registry routing reduced the preceding fix-set binaries by 14,688 / 11,904 bytes; the preceding metadata/table/dependency/test-gate fixes collectively added 6,592 / 4,352 bytes.cargo tree -dshows only existing duplicate versions; no dependency was added by the CLI routing change.Starting production-dev merge on cli-layer at
ab42b65f84; merge source dev7e8545c4b9. Read the full #143 history (79 comments); no parent issue is referenced. Preserving reviewed action contracts/registry routing and production plugin host, Mesh/host-facts lifecycle and core topics. Requested compile-out, real-server, startup and size evidence will follow. No deployment.Merge resolution: retained both plugin API action contracts and production descriptors/registries; optional socket-host gates bytes/Tokio/SQLx, enabled by server and Mesh. Cargo features preserve all CLI roles, production host-facts default and mesh alias, with optional role dependencies and weak server/mesh forwarding. Server foreground dispatch remains registry-driven and passes compiled agent descriptors to serve_with_plugin_descriptors (empty in server-only builds). Registry adapts every hosted descriptor, preserving exact source schema references and any-of permissions in skills, alongside existing mesh lifecycle placeholders. Hosted CLI paths deliberately return unavailable until an authenticated device-session adapter exists; no permission bypass or non-durable configure operation was introduced. Production server handlers and durable switches are unchanged. Added exhaustive registry/skill coverage for 18 hosted actions. No new dependency selected.
Contract documentation update proposed as part of the approved merge: contracts/plugin.md §9 currently says version 1 generates no CLI adapter. The merged CLI now adapts its const action descriptors into the shared registry for help, skills and unavailable hosted routes, retaining original wire schema references and permission alternatives. I will replace that stale statement with the implemented CLI behavior and authenticated device-session limitation. No wire schema, action id, permission check or runtime switch semantics change.
Compile-out evidence on the resolved merge: cargo check --workspace passed (8m30s cold build); cargo clippy -p infraternal --no-default-features --all-targets -- -D warnings passed (41.85s); cargo check -p infraternal-server --no-default-features passed (4m08s). cargo tree -p infraternal --no-default-features -e normal contains no Tokio or SQLx. Fast-gate no-default CLI suite passed 23/23; workspace Clippy also passed. Logs under /home/kayg/.cache/codex-scratch/cli-layer/merge/. Full tests/static builds/browser evidence pending; current host load 21.18/25.31/22.17 on 8 cores.
First fast run reached default CLI tests: 26 passed, 1 failed. The new production_descriptors_share_cli_registry_and_skills assertion incorrectly searched generated JSON for raw, unescaped host-facts schema text (actions.rs:431); skills correctly JSON-escape the original schema string. Fixed the test to search its serialized string representation; descriptor equality already verifies exact original metadata. Existing action-contract/table regressions passed in this suite. Full log: merge/fast.log. Rerunning the new test and full gate after current static builds finish.
First fast run static x86_64 build succeeded (6m33s), ELF static-pie stripped with no PT_INTERP, 16,691,600 bytes. The old fast-gate cap is 16,404,816: +286,784 bytes, so its static row fails. Per D205 I will report feature growth rather than change the cap or remove functionality; production Mesh/host-facts/generic-host plus CLI are all enabled. Measuring exact delta against dev
7e8545c4and aarch64 next. This run's test row failed only the new test's JSON escaping assertion (actual output schema assertion, actions.rs:425); corrected before retry. Fmt/VT fmt/CLI compile-out/clippy/cargo-deny passed. Full retry and real-server specs started on ports 4299/4300.Fast retry: 23/23 no-default and 27/27 default CLI tests pass, including all four reviewed regressions and the new hosted descriptor test. The daemon fixture now fails its unchanged idle RSS limit before replay (verify-agent.py:34). Direct weighted measurement: debug infraternal agent 16,664 KiB idle; stripped static release 5,976 KiB idle. The CLI eagerly materializes every enabled plugin's metadata before dispatch, retaining irrelevant Mesh/host-facts adapter allocations in the daemon. I will materialize only the requested plugin's definitions using plugin-owned ids/factories; help/status/skills still load the full registry, and handler routing stays registry-driven. The existing failing RSS assertion is the regression gate. Browser fixture launch also refused a 110-byte Unix socket path; retry uses a short scratch symlink resolving into this job's own r/ directory, not /tmp.
Real-server harness integration finding: apps/tracer/real/server.ts:160 invokes server setup-token as a machine caller but reads its human default output as the raw setup capability. cli-layer intentionally changed this to the D202 result envelope; the real-browser beforeAll cannot finish sign-in. Updated the harness to request --json and validate data.token in memory, without printing any response or capability. The original browser run is recorded as failed. Also refined lazy registry materialization to avoid constructing core discovery metadata at all for a plugin command; the first partial lazy change reduced debug idle RSS only from 16,664 to 16,244 KiB, still above the unchanged 15 MiB gate. Measuring the plugin-only registry before another full gate run.
Plugin-only metadata materialization fixes the unchanged daemon gate: debug idle RSS 13,968 KiB versus 16,664 KiB before (-2,696 KiB / -16.2%); zero scheduled idle slices over 2.201s; all 24 restart positions and 4,710,396 payload bytes pass in 40.72s. Factories use plugin-owned ids; help/status/skill retain full registry, and internal shim uses only core definitions. New ownership/discovery regression included.
Real-browser JSON-harness run: all 3 applicable production Mesh specs pass, including 452-host multi-frame inventory; 2 missing-Mesh specs correctly skip with Mesh enabled. Host-facts shows expected OS/kernel and captured production popover, then fails its unchanged refresh-count assertion: 2 calls during 1.2s versus <=1, after screenshot capture. No host-facts UI/runtime code changed. Will rerun with final binary without optional screenshot capture and record the result. Logs: merge/daemon-lazy-retry.log and merge/real-server-json.log.
Self-review refinement proposed for the additive CLI adapter: represent new hosted any-of authority as permission:{any:[...]} in ActionContract rather than a joined display string. Existing single permission actions keep their serialized permission string unchanged. This preserves D187 Mesh list authority as machine-readable alternatives in the shared registry; the original hosted descriptor remains retained verbatim for wire schemas. No existing action shape or server authorization behavior changes.
Final production-browser specs passed with this branch's stripped static x86_64 binary (16,692,464 bytes), TRACER_TEST_PORT=4307: 4 passed in 25.5s; 2 missing-Mesh cases skipped because Mesh is served. Host-facts OS/kernel, live Mesh inventory, grant arrow, and 452-host multi-frame paging all pass. The earlier optional-screenshot refresh-count failure did not repeat without screenshot capture. The harness now uses the CLI JSON setup-token envelope; its strict standalone TypeScript check also passed. Logs: merge/real-server-final.log and merge/real-harness-check.log.
Weighted local startup (31 runs/command), infraternal-dev, x86_64, 8 cores, kernel 6.12.111+deb13-amd64: --help p50/p95 4.213/9.257 ms; status 29.540/70.227 ms. Load before 27.88/29.94/24.68; after 28.61/30.06/24.74. Raw samples: merge/startup.log. Both static targets' exact delta against dev is next; final fast run still completing long server cases.
Final revision verification: default CLI 28/28; no-default CLI 23/23; plugin API 8/8 including any-of authority validation; server 139 passed/0 failed/12 ignored in 280.01s; shim 61 passed/0 failed/12 ignored in 77.18s. All workspace tests passed. Four review regressions remain green. Fmt/VT fmt/compile-out/workspace Clippy/cargo-deny passed; final static row waits for the separate aarch64 build lock. Final no-default all-target Clippy passed (5.93s) and server --no-default-features check passed (15.58s). cargo tree -d has exactly the same duplicated version roots as dev, with no new dependency versions. TypeScript: tracer 74/74 and protocol 36/36 (34,462 assertions), compiler/build/transfer checks pass. No listed #118 load exception was needed.
D205 size comparison, identical pinned toolchain/release profile and default production plugins, local weighted builds of exact dev
7e8545c4:Both pairs are stripped/static, no PT_INTERP. Growth is the requested pretty/JSON CLI renderer, dynamic help, schemas/contracts, skill generator and descriptor adapter. No new dependency versions or duplicate version roots. Preserve all features and report the old-cap failure per D205; no budget or release-profile change.
Final fast gate exited 1 only at the old x86_64 size cap; every other Rust row passed. TypeScript gate ran separately because fast stops on that size row: all compiler/build/transfer and 74 tracer/36 protocol tests pass. Standalone aarch64 build and both CLI static unavailable stubs passed. Evidence copied to /tmp/cli-layer-143-merge-evidence/ before scratch cleanup. API unit count correction: 11/11, plus 2 routing integration tests (the prior progress comment's 8/8 was inaccurate). Final idle RSS: debug 14,124 KiB, static 5,228 KiB; load 16.41/19.99/23.76 before and 15.50/19.74/23.66 after. New code has no per-session metadata allocation. No deployment.
Finished merge on cli-layer:
30487a0c4d.Parents: reviewed CLI
ab42b65f84and production dev7e8545c4b9. Worktree clean; no push or deployment.scripts/verify fast exited 1 solely on the old static size cap. Verbatim final gate summary:
Verbatim size gate output:
D205 exception recorded; no cap or release profile changes. Both architectures build stripped and static without PT_INTERP. Measured same-profile production dev comparison: x86_64 16,435,312 -> 16,692,464 bytes (+257,152, 1.565%); aarch64 13,842,144 -> 14,044,520 bytes (+202,376, 1.462%). Dev itself exceeds both old caps. Growth supplies reviewed CLI rendering, contracts, skills and production descriptors; no new dependency versions or duplicate-version roots.
Remaining requested gates: no-default clippy --all-targets -D warnings PASS; no-default normal cargo tree contains neither tokio nor sqlx; infraternal-server --no-default-features check PASS. Four review regressions PASS. Plugin API 11 unit + 2 routing tests PASS. Real-server Mesh/host-facts specs using this branch's static binary and unique port 4307: 4 passed, 2 expected missing-feature skips. Strict real harness type check PASS. Ran the TypeScript fast gate separately after Rust's size stop: tracer 74 passed, protocol 36 passed (34,462 expectations), checks/build/transfer PASS.
Weighted local startup (31 runs each, infraternal-dev, 8 cores): help p50/p95 4.2131/9.257217 ms; status 29.539628/70.227115 ms. Load average before 27.8838/29.9399/24.6777, after 28.6143/30.0576/24.7441. Debug/static idle daemon RSS 14,124/5,228 KiB; replay and idle CPU gates pass after constructing only the selected plugin registry for lifecycle commands.
Reviewer checklist: production host, durable switches and core topics retained; Mesh and host-facts actions and wire contracts share CLI/skill registry; no handwritten hosted routes or authentication bypass. Hosted execution still requires the existing authenticated CLI device-session adapter and returns the explicit unavailable result meanwhile. Optional socket-host dependencies preserve compile-out. No foundational engine choice, dependency version addition, or UI implementation change. Resolution rationale and rejected alternatives are in the merge commit.
Evidence retained at /tmp/cli-layer-143-merge-evidence/: fast-final.log, no-default-clippy-final.log, no-default-tree.log, server-no-default-final.log, real-server-final.log, typescript.log, sizes.log, startup.log, idle-final.log, mesh.png and host-facts.png. Build scratch will be removed. Issue remains open.
Merged into dev at
47f2b31b(cli-layer30487a0c: registry-driven CLI routing plus the production plugin host; Mesh and host-facts actions route through the registry).Follow-up: the binary grew 257,152 B against dev; that size is to be cut under D205.
kayg referenced this issue2026-10-28 17:53:56 +00:00
Closed by the orchestrator during the 2026-11-09 night housekeeping (owner order: "close stale prs/issues"). The work has landed on dev, and the latest note here is a finish or merge note (J387 inventory on #436). Reopen if anything is still missing.