Host facts for the machine popover (embedded and remote infraternal agent) #144
Closed
opened 2026-10-09 15:02:13 +00:00 by kayg
·
73 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#144
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?
The window details popover (#127) shows only what the server already knows (name, login, address, route). D120/D126/D156 call for a Machine tab with cheap host facts collected by the infraternal agent, embedded and remote:
Static facts are read at start and on reconnect; live numbers (memory, disk, load, uptime) refresh only while the popover is open (D120).
Starting #144 on branch
host-facts, based ondevat42e50d42c5e43dabc3da89de4b01dd92329bf030.Finding: this checkout's
DECISIONS.mdends at decision 112 (last numbered entry at line 485); D120, D126, D156, D198 and D205 are absent. The #144 body records the facts and on-demand boundary, and the job brief supplies D198/D205. I’m proceeding to that stated scope without changing decision text.Finding: this checkout has only the inherited-fd embedded daemon (
crates/infraternal-agent/src/daemon.rs::runandcrates/infraternal/src/main.rs::run_embedded); there is no remote-agent transport entry point to wire here. I’ll put collection in a shared plugin crate with embedded mode passed by the existing daemon, leaving its public collector API usable by the remote runner when that lane lands.Contract proposal for #144: add a minimal, additive plugin API descriptor for declared actions (including bounds, effect, target and permission), settings/defaults and role dependencies, plus a generic agent-plugin registry. The host-facts plugin will declare
host.facts.readandhost.facts.configure(enabled by default; configure can disable it at runtime). The server will authorize/route declared agent actions generically. Wire stays on existing boundedCall/Result; no new frame or decoder.Finding: the first
scripts/verify fastexited non-green.fmtfound one diff atcrates/plugins/host-facts/src/facts.rs:54; clippy rejected the new test'sexpectatsrc/tests.rs:6; all Rust tests passed and cargo-deny passed. Static build then failed because.cargo/musl-cc.shtried/home/kayg/Developer/infraternal/.worktrees/host-facts/target/auth-tools/zig/zig(missing) whileCARGO_TARGET_DIRwas/home/kayg/.cache/codex-scratch/host-facts/target. I’ll fix formatting/lint and stage the pinned Zig tool under job scratch before rerunning.Finding: the updated
scripts/verify fastrun passes formatting and clippy, but its Rust test row failedreal_binary_preserves_input_and_output_across_24_abrupt_stops: 21/24 checks passed, then iteration 22 stalled withterminal command queue full. The gate is still compiling the static targets; I will report its final status and investigate this failure before claiming completion.Gate finding: the completed
scripts/verify fastrun reports fmt PASS, VT native fmt PASS, clippy PASS, test FAIL (101), cargo-deny PASS, and static builds PASS. The failed row isreal_binary_preserves_input_and_output_across_24_abrupt_stops(21/24; iteration 22 hitterminal command queue full). Host load average at completion was 24.33, 21.57, 20.27. Both static size checks passed: x86_64 15,965,392 bytes (baseline 16,142,672); aarch64 13,426,064 (baseline 13,555,672). I will rerun after the feature changes and preserve the complete output.UI finding: the new Host row formatting check passes, and the four existing interaction cases in
details.spec.tstimed out or missed the copy tick in this run. The test process was running at host load average 51.30, 33.71, 23.76 (uptimeat 18:05 UTC); I will rerun this gate after the concurrent host work subsides. The only code defect exposed by the new check was the missing MB display unit; the formatter now includes MB.Step complete: added the D198 plugin descriptor/action/settings metadata and an 8 KiB bounded generic action registry.
cargo test -p infraternal-plugin-api: 2 passed, 0 failed. This API-only commit does not link into the CLI binary yet, so binary size change is 0 bytes. Commitf348b219.Finding: the first
cargo check --target aarch64-apple-darwin -p infraternal-plugin-host-facts --libexposed a missingSysctltrait import forkern.boottimeplus Linux-only helper warnings. Added the import and target-gated Linux parsers; the same Mac target check now passes without warnings. This is compile evidence only; runtime collection was measured on Linux.Finding: macOS
vm.loadavgis an opaque struct; reading it as a string loses the counters. The shared collector now decodes the bounded 64-bit layout (three fixed-point values and scale) and rejects an unexpected size or scale. Added a malformed-layout regression test. Evidence:cargo test --locked --all-targets -p infraternal-plugin-host-facts -p infraternal-plugin-apipassed (8 host-facts, 2 plugin API tests); implementation incrates/plugins/host-facts/src/facts.rs.Step complete:
.cargo/musl-ar.shand.cargo/musl-cc.shnow followCARGO_TARGET_DIRfor Zig and its cache, so gates can build under the required job scratch directory. Commit950bb421;bash -nandgit diff --checkpassed. The full gate will exercise both static targets.Step complete:
7935ba9aadds the shared bounded host-facts plugin, parser tests, a fuzz target and measurement example. Checks: 9 host-facts tests and 2 plugin API tests passed; fuzz target, agent--no-default-features, and aarch64 macOS cross-check compile cleanly.HostFactspreserves SSH bootstrap Rust fieldsos/arch/uid/version/cpus; the shared crate can replace the private collector, withHostFactsPlugin::new(AgentMode::Remote)for a remote runner. Its browser JSON keepsarchitecture/executionUid/logicalCpusvia serde names, so keep an adapter if the existing remote wire shape differs. Measured on infraternal-dev (8 cores, load 27.24/37.37/37.15): static 136.28/199.65 us p50/p95; live 23.09/37.27 us; two-leg call+result 782/1,180 bytes.History correction: the earlier scratch-helper comment named
950bb421; its corrected local commit hash is9e434f8f, with the same code change.Step complete:
592bf087routes bounded generic plugin calls over the existing browser/server/embedded-agentCall/Resultpath and builds the registry for embedded or remote mode. The multi-package Rust run passed: agent 14 tests plus 2 transport tests, server 100 passed/9 ignored, API 2, and host facts 8; after aligning bootstrap field names the latest host-facts/API run passed 9/2. The real-server browser spec remains the end-to-end check.Step complete:
7d4f0590maps the snapshot into the existing Host rows and polls only while the popover is open (max 1 request/s/window). No row component or data budget was added. Checks:bun run checkpassed; tracer unit suite passed 56 tests / 0 failures, including GB formatting and optional-row behavior. D188 transfer-budget gate remains to be recorded in the final gate.Step complete:
1d0ab6afadds Host-row formatting tests and a real-server spec that checks/etc/os-release,uname -r, read cadence, and stop-on-close, with optional popover screenshot capture.bun run checkand the 56-test tracer unit suite pass; browser specs and screenshot capture remain pending the production build.Step complete:
c380049fdocuments the bounded facts and host-file decoder target.cargo check --locked --offline --manifest-path fuzz/Cargo.toml --bin host_facts_decodepassed.Finding:
scripts/verify fastreachedcargo-denyand reportederror[wildcard]: found 1 wildcard dependency for crate 'infraternal-fuzz'atfuzz/Cargo.toml:17, the new path-only host-facts dependency. The package is version0.1.0; I will add the matching version constraint after the in-progress static build finishes, then rerun the gate.Fast-gate findings (captured at load average 15.80/22.41/29.34): fmt, VT native fmt, workspace tests and both static builds passed. Clippy failed because
AgentPlugin::calllacks a# Errorsdoc section (crates/infraternal-plugin-api/src/lib.rs:77).cargo-denyfailed on the wildcard path dependency atfuzz/Cargo.toml:17. Workspace tests also reported a non-failing example filename collision (measurewith infraternal-mesh). Static sizes: x86_64 16,031,568 bytes (+66,176 over 15,965,392 pre-plugin); aarch64 13,482,320 bytes (+56,256 over 13,426,064 pre-plugin); both below their limits. I will correct the lint/policy findings, give the example a unique target name, then rerun the complete gate including TypeScript.Clippy follow-up committed as
0551ea32: the plugin API now documents its bounded call errors. Focused warning-denied Clippy passes forinfraternal-plugin-apiandinfraternal-plugin-host-factsafter the collector lint fixes; the remaining manifest and benchmark target fixes are being checked separately.Collector lint fixes committed as
a69819a5. Focusedcargo clippy -p infraternal-plugin-api -p infraternal-plugin-host-facts --all-targets --locked --offline -- -D warningspasses; the macOS load parser now checks the sysctl scale range instead of relying on lossy casts.The fuzz dependency policy fix is committed as
fe87f840.cargo deny checknow exits successfully (advisories ok, bans ok, licenses ok, sources ok); existing duplicate-version warnings remain unrelated to this dependency.The measurement target fix is committed as
67e702ed. Focused tests pass: plugin API 2/2, host-facts 9/9, benchmark example 0 tests; focused warning-denied Clippy also passes. Cargo now names the measurement examplehost_facts_measure, avoiding the workspace output collision.Real-server harness finding: the first browser launch used the misspelled
INFRATERAL_BIN;real/server.ts:60readsINFRATERNAL_BIN. The helper therefore fell back to the missing worktreetarget/x86_64-unknown-linux-musl/release/infraternal(ENOENT). This is an invocation typo, not a runtime failure; rerunning with the declared variable and the scratch-built binary.The production real-server run now reaches the popover. Its OS row is
Debian GNU/Linux 13, but the spec'shasText: "System"row locator matched both that row and the Init valuesystemd, returning two.ui-kv-valueelements. I’m tightening the assertion to use the existing.ui-kv-keycell.Selector follow-up: Playwright's
filter({ has })treated the key locator rooted at.canvas-popoveras outside each row, so the second run found zero matching rows. The existingui-kv-keybutton is the right anchor; I’ll read the value from its parent row directly.Real production run passes:
real/host-facts.spec.tsreports 1/1 pass (15.2s), matching this machine's/etc/os-releaserowDebian GNU/Linux 13anduname -rrow6.12.111+deb13-amd64. The spec also verifies no read before open, at most one read per second while open, and no further reads after close. Screenshot:apps/tracer/real/host-facts-popover.png.D205 measurement on infraternal-dev (x86_64, 8 cores), run under
systemd-run --user --scope -p CPUWeight=10000, load average 19.92→19.19:cargo tree -d -p infraternal-plugin-host-facts -p infraternal-agentprinted no duplicate entries. Transfer-budget gate passes with no limits raised; largest on-demand chunk is gzip 8,488/20,480 B and Brotli 7,636/18,432 B.Finished on head
38b53f456d.scripts/verify fastcompleted with Result=success. Verbatim gate summary:Tracer unit output:
56 pass,0 fail,9946 expect() calls; stream differential:134 streams, 11439 schedules, zero divergences; protocol output:7 pass,0 fail,34390 expect() calls.bun run checkexits 0;details.spec.tspasses 4/4; real production host-facts spec passes 1/1. Screenshot:apps/tracer/real/host-facts-popover.png.The existing on-demand chunk limit remains unchanged and passes: largest on-demand chunk is gzip 8488/20480 B, Brotli 7636/18432 B. No IP fact was added. To switch the ssh-bootstrap branch, replace its private collector with
infraternal-plugin-host-factsand instantiateHostFactsPlugin::new(AgentMode::Remote); the Rust fields keepos,arch,uid,version, andcpus, while serde keeps the browser keysarchitecture,executionUid, andlogicalCpuson the wire. This branch has no remote transport route to wire yet.Independent review started on
review-host-facts, detached target now branched at38b53f456dcb0d7c2abb02e35a32a66bca88c101; merge base with dev42e50d42c5e43dabc3da89de4b01dd92329bf030. Read all #144 and related #127 comments, project contracts/process and author report. Verifying behavior and recording failing tests without implementation changes.Review step: committed HF-R1 (P2) as
a19cb139:default Host rows keep secondary facts behind morefails (2 existing tests pass, 1 new test fails).apps/tracer/src/canvas/windows/details-facts.ts:79puts Init/Virtualization/Shell/Locale directly in default Host rows, contrary to #144 and D126. Evidence log:/home/kayg/.cache/codex-scratch/host-facts-review/more-test.log. Pristine head fast gate initially lacked make; rerunning with the documented Nix make/perl/Zig environment.Review step: HF-R2 (P2), commit
687c9750af:a refused host facts action stops its recurring timerfails (0 pass / 1 fail; expected 0 timers, received 1). Atapps/tracer/src/canvas/sessions/details-live.on-demand.ts:79, Result(ok=false) for a disabled/build-removed plugin schedules another read indefinitely while open. D198 requires no timer/background work when off. Deterministic test observes the real details source after ActionRefused(action unavailable); no implementation changes.Review scale evidence committed as
859ecdb7ef:cargo run --release -p infraternal-plugin-host-facts --example review_scaleunder CPUWeight=10000 on infraternal-dev (x86_64, 8 cores), load 27.84→27.45. Worst-case 500 distinct hosts × 5 viewers: 500 collector initialization 120.32 ms; 2500 sequential live reads 132.12 ms; retained collector RSS delta 581632 B (1163 B/host); JSON 1340000 B/round. This measures real local collection/serialization, not concurrent end-to-end remote latency. Original example independently reproduces 357/538 B JSON and 782/1180 B two-leg frames; static p50/p95 137.94/297.97 µs, live 24.50/38.58 µs.Confirmed HF-R3 (P1), committed failing test
2046c247f8:non_owner_without_host_configure_permission_is_refused_before_leg_bfails (0 passed / 1 failed). A real unlocked non-owner session, with no role grant, sendshost.facts.configure/{"enabled":false}; the real WebSocket router forwards it over the embedded infraternal agent socket.crates/infraternal-server/src/websocket.rs:970checks body lengths and session liveness but never the declared action permission/host scope. This permits a non-owner to change host-wide settings affecting other users (D29; contracts/plugin.md §4; wire.md §7). Evidence log:/home/kayg/.cache/codex-scratch/host-facts-review/permission-test.log. No implementation fix.Review HF-R4 (P2), committed
53a37ca42d:pending_host_facts_read_keeps_control_ping_responsivefails (0 passed / 1 failed, 1.66s). Hold the facts Result on a real leg-B socket after confirming host.facts.read was forwarded; the same real browser socket cannot receive Pong for an independent Ping within one second.websocket.rs:973awaits plugin completion inside the main receive/output loop, blocking unrelated terminal/control traffic. Separate checks: pristine target fast gate first run failedinitial_attach_requires_explicit_credit_before_replay(existing test); native latency profile under load missed same-session flood p99 (416.76 ms vs 334 ms; growth 88.53 ms vs 16.67 ms). Investigating/replaying these gate failures, not treating the run as green.Gate clarification: the initial fast test failure was fixture setup, not a measured timeout:
verify-agent-attach-credit.pyattemptedtarget/ac3411167with notarget/parent in the pristine scratch checkout and raised FileNotFoundError. Build output remains under job scratch; an ignored target symlink now supplies the existing fixture path. The standalone latency run used the native debug binary (supplemental, not the prescribed optimized gate); release-profile latency remains pending static build. Production UI + real native server host-facts spec independently passes 1/1 in 15.0s; screenshotdocs/reviews/host-facts-popover.png.Review checks: committed the test-only clock naming correction as
e362fc8cf6; warning-denied all-target Clippy passes forinfraternal-serverandinfraternal-plugin-host-facts.cargo check --locked -p infraternal --no-default-featurespasses on the pristine target, verifying backend build-time removal. Seeded host-facts fuzz run completed 1740295 executions in 31s, max input 20000 B, RSS 261 MiB, no crash (valid and oversized request/file seeds included). Findings remain 1 P1 + 3 P2.Optimized gate evidence: x86_64 stripped static binary independently matches author report at 16031568 B, PT_INTERP absent. Native real-agent latency profile (20 samples, 300 ms RTT; CPUWeight=10000, load 17.46→18.15) passes baseline echo and other-session flood, but same-session flood fails: echo p99 427.10 ms vs 334 ms, growth 101.61 ms vs 16.67 ms. The full
scripts/verify latencyprofile is running with unique TRACER_TEST_PORT=4295. These budget failures are recorded without claiming a branch-induced regression; the confirmed mux-dispatch isolation gap has its own deterministic failing test HF-R4.D170 scale evidence committed as
e1dc889742. Optimized direct runs under CPUWeight=10000 on infraternal-dev (8 cores), load 5.41/14.22/18.91 recorded immediately around both runs: 1000 collectors initialization 151.22 ms, retained RSS delta 1028096 B (1028 B/node ×1000); 10000 initialization 1401.62 ms, RSS delta 7864320 B (786 B/node ×10000). For 200 active hosts ×5 viewers, 1000 live calls took 28.01/24.12 ms and produced 535000 B JSON each round. Example accepts only 1000/10000 nodes. Both static head binary sizes independently match the author: x86 16031568 B, ARM 13482320 B; static checks pass. Clean fast rerun and full latency profile continue.Pristine target
38b53f456dcb0d7c2abb02e35a32a66bca88c101: cleanscripts/verify fastexits 0. Full output committed verbatim asd762c7c0atdocs/reviews/host-facts-fast.mdon review-host-facts (including load, Rust tests and TypeScript/transfer outputs). Tracer 56 pass/0 fail; protocol 7 pass/0 fail; differential 134 streams/11439 schedules/zero divergences. Gate summary, verbatim:Review tests remain intentionally failing; no implementation fixes. Full latency run already fails native same-session flood and has reached an unrelated canvas scrolling browser failure; baseline comparison and final counts remain pending.
Verification setup correction: later canvas browser failures in the first full latency attempt are invalid. The concurrently finishing fast gate ran
bun run buildwithout INFRATERNAL_CLUSTERS_PREVIEW, replacing the preview assets served by Playwright from the same scratch checkout.build.ts:18-36removes mock canvas modules in that mode. Stopped that attempt and restarted fullscripts/verify latencyafter the fast gate completed, with unique TRACER_TEST_PORT=4297 and no concurrent UI rebuild. Earlier native latency metrics remain valid; no browser failures from the collided build are counted as findings. The separate optimized merge-base baseline build continues for latency attribution.Independent merge-base comparison: optimized x86_64 musl baseline at
42e50d42(same machine/toolchain, separate build target, CPUWeight=10000) is 15965392 B; head is 16031568 B, independently confirming +66176 B. Native latency default 100-sample baseline under load 4.67→3.51 also fails same-session flood: echo p99 523.79 ms vs 334 ms, growth 197.44 ms vs 16.67 ms; baseline echo and other-session flood pass. Head clean rerun native same-session echo p99 486.84 ms, growth 160.22 ms. The existing budget failure remains FAIL; it is not counted as a branch-induced finding. Preview browser cases invalidated by the first run’s asset collision now pass with no concurrent UI rebuild. Review findings remain 1 P1 + 3 P2.HF-R5 (P3): detected OS reaches the System row but not the existing popover OS mark (D126/D158). Live-source test confirms Debian GNU/Linux 13 then expects debian and receives undefined: 0 pass / 1 fail. Committed on review-host-facts at
81fd3d58; no implementation change. Findings now 1 P1, 3 P2, 1 P3.Completed independent baseline evidence, commit
c56ca190: docs/reviews/host-facts-baseline.md contains stripped size comparison and verbatim 100-sample native baseline output. Rebuilt x86_64: 15965392 → 16031568 B (+66176); aarch64: 13426064 → 13482320 B (+56256). Merge-base same-session echo p99 523.79 ms and growth 197.44 ms fail the same budgets as head (486.84 / 160.22 ms). This is an existing gate failure, not evidence of a branch-induced regression. Final review TypeScript check passes (exit 0).Clean canonical latency run (port 4297) has three browser failures so far: add-host wizard material, view-flight timing, toolbar gesture row. Final failure details and counts are pending. Running those identical tests on the independently built merge-base checkout to distinguish existing failures. Initial baseline port 4298 was already occupied; no process was touched, rerun uses free port 49217. No additional branch finding is inferred yet.
Browser attribution evidence committed in docs/reviews/host-facts-browser-comparison.md: wizard assertion fails identically on merge base (expected blur16px, received blur8px saturate1.6). Flight and toolbar pass there (2 pass/1 fail subset, 45.5s) and on an isolated head retry (2 pass/0 fail, 38.7s). Head retry pointerBack 308ms vs initial574ms; no branch-induced regression established. Original canonical gate failures remain recorded. Ports 49217/49218; separate production assets; CPUWeight10000 and loads retained.
Evidence archived:
89173fe9adds docs/reviews/host-facts-findings.md with all five failing test outputs.bb8493c2adds Source Code Pro fixture retries to browser-comparison evidence: baseline 1/1 pass (11.1s), head 1/1 pass (10.9s), ports49219/49220. The original canonical font failure was a mock text-output socket hang-up before the font assertion; it remains counted in that run. Full gate still running; no implementation changes.Comparison evidence in docs/reviews/host-facts-browser-comparison.md:
9d10458areproduces all4 DPR3 toast visibility failures on merge base.0199b600records unresolved mesh frame budget: canonical head pan p95 100.1ms vs60ms at load/core1.05; baseline33.4ms passes at1.11; head retry raw116.6ms passes only with higher load-adjusted allowance at1.59. The retry does not clear the original failure or establish causation. Keep this performance result unresolved, separate from the five confirmed failing-test findings. Full canonical browser suite remains running.Completed motion-audit comparison,
ad931f73: canonical head and merge base both expect tooltip width190px and receive169px. Baseline case fails in12.7s on port49224; load and verbatim failure excerpt retained in docs/reviews/host-facts-browser-comparison.md. This is an existing unchanged-tooltip assertion failure. Canonical full run remains in progress; five confirmed host-facts findings unchanged.Completed late browser comparisons,
52e2b6ed: baseline8/8 fail. Seven match head assertions (onboarding connection, palette filter budget, predictive-backspace per-key budget, four sign-in screenshots). Predictive capture fails at different stages: head visibility remains hidden on retry, baseline fixture GET or connection precondition fails. This case remains unresolved, alongside mesh frame budget; no new production-cause finding inferred. Loads, separate ports49225–49227 and redacted error logs retained in docs/reviews/host-facts-browser-comparison.md. Full gate still running.Canonical pristine-head scripts/verify latency completed: exit1; tracer293 passed/22 failed/26 skipped in1.0h. Full output (test-session headers redacted) archived at3ed32a66 in docs/reviews/host-facts-latency.md. Native same-session failure reproduces on merge base; auth browser4scenarios and native recovery2scenarios pass. Bulk-output prediction delta −1.31% passes −5% budget. Scene crash comparison/retry evidence was committed at8102a667 (baseline24.2s pass, head23.8s pass). Final access/mobile comparisons are still running; resume comparison stopped at an earlier baseline connection assertion. Five confirmed host-facts findings remain1P1/3P2/1P3.
Verdict: merge after fixes. Findings: 0 P0, 1 P1, 3 P2, 1 P3.
Reviewed target38b53f456dcb0d7c2abb02e35a32a66bca88c101 against merge base42e50d42c5e43dabc3da89de4b01dd92329bf030. Final local review-host-facts head:
19e1891915. No implementation fixes, pushes or issue closure.Confirmed tests: HF-R3(P1) non-owner configuration permission bypass; HF-R4(P2) pending facts read blocks socket control; HF-R2(P2) refused plugin keeps polling; HF-R1(P2) secondary fields exposed before more; HF-R5(P3) detected OS mark unset. Each has a committed failing test. Full test outputs: docs/reviews/host-facts-findings.md. Review and measurements: docs/reviews/host-facts.md. Production screenshot: docs/reviews/host-facts-popover.png. Findings index: /home/kayg/.local/state/codex-jobs/infraternal/review-host-facts/findings.md.
Pristine-target scripts/verify fast: PASS, exit0, entire output below verbatim, also committed in docs/reviews/host-facts-fast.md. Review TypeScript and warning-denied focused all-target Clippy pass; feature-removal check passes.
Canonical scripts/verify latency: FAIL, exit1. Native same-session budget failure reproduces on merge base; auth4scenarios and recovery2scenarios pass. Browser293pass/22fail/26skip in1.0h. Fifteen cases have matching baseline assertions or measured budget failures; five pass isolated head retries. Mesh frame budget and predictive-capture visibility remain unresolved. Full gate and comparisons are archived in docs/reviews/host-facts-latency.md and host-facts-browser-comparison.md. Retries do not clear the original gate. Final comparisons066c7afc; final report/screenshot19e18919.
D170: 1000/10000 retained collectors, RSS deltas1028096/7864320B; 200active hosts×5viewers, 1000sequential live reads28.01/24.12ms. Collector-only, not fleet/network/UI memory. Rebuilt stripped growth +66176B x86_64 / +56256B aarch64. Seeded fuzz1740295executions/31s, no crash. Machine/load and scope limits are in the report. Temporary builds/checkouts are being removed after evidence archival.
scripts/verify fast — complete pristine-head output, verbatim
Verdict: merge after fixes — 0 P0, 1 P1, 3 P2, 1 P3. Final local review branch:
review-host-facts, head19e1891915571a136f93bde7143b2a234a445753.Review, five failing tests, production screenshot and gate evidence are committed. Findings index updated. Owned temporary checkouts/builds/logs removed; worktree clean. No implementation fixes, push, deployment or issue closure.
Pristine target
38b53f45:scripts/verify fastPASS, exit 0. Complete verbatim output is in the preceding finish comment anddocs/reviews/host-facts-fast.md. Its summary, verbatim:Latency gate FAIL, exit 1: 293 browser tests passed, 22 failed, 26 skipped. Native same-session budget failure reproduces on merge base. Mesh frame budget and predictive-capture visibility remain unresolved. Full attribution and numbers:
docs/reviews/host-facts.md,host-facts-latency.md,host-facts-browser-comparison.md.Starting repair on branch
host-factsat38b53f456dcb0d7c2abb02e35a32a66bca88c101; currentdevisf9af8e0e. I’ve read all #144 and parent #127 comments plus the review report. Mergingdevfirst, then applying the five review regressions and fixing P1 first.Step complete: merged
devatf9af8e0eintohost-facts; merge commit8603b6f3996cd5b9a3af55d7c1b561fa073d1430. The merge applied cleanly (30 files, 922 insertions, 97 deletions). The review screenshot was preserved in job scratch before browser regeneration.Finding HF-R3 (P1): after cherry-picking the review regression,
cargo test --locked --offline -p infraternal-server --lib non_owner_without_host_configure_permission_is_refused_before_leg_b -- --nocapturefails atcrates/infraternal-server/src/auth/socket_tests.rs:595: the real signed-in non-owner configuration call reaches leg B. The focused test compiled with the documented Nix make/perl environment. I’m fixing the authorization path before the other findings.Verification finding: after HF-R3, the full server library suite completed 100 passed / 1 failed / 9 ignored;
expired_handshake_releases_user_permitsmissed its expected 503 in the parallel run. An isolated rerun of that test passed (1/1, 0.48s). This is a socket deadline case; I’ll apply the brief’s baseline comparison if it recurs inscripts/verify fast.Step complete:
df9d9b81adds server-side authorization from compiled action descriptors and the existing owner bit, with no extra query on each host-facts poll. The review test fails before the fix and passes after (1/1);cargo fmt --all -- --checkandgit diff --checkpass. Full server run: 100 passed, 1 timeout test failed, 9 ignored; that timeout test passes in isolation (1/1, 0.48s). The transient is recorded above for the final fast-gate baseline rule.Finding HF-R4 (P2):
pending_host_facts_read_keeps_control_ping_responsivefails after the real socketpair observeshost.facts.readon leg B; with its Result withheld, the same browser socket receives no Pong for an independent Ping within one second (0 passed / 1 failed, 6.60s). The test includes the compiled action descriptor, so this reproduces the receive-loop wait after the P1 authorization fix. I’m moving pending plugin calls off the receive loop and keeping the result bound to the live socket session.Step complete:
3694232droutes plugin reads through a bounded per-socket future set, preserves control dispatch, checks session authority before sending results, and drops waits when the socket closes. HF-R4 fails before the fix and passes after (1/1); HF-R3 still passes (1/1). Pending calls are capped at 4 per socket with 8 KiB input/output limits: at the 256-socket server cap, retained request/result bodies are bounded to 16 MiB plus small future state. Wire frames and protocol bytes are unchanged.Finding HF-R2 (P2):
bun test src/canvas/sessions/details-live.test.tsfails on the review test: after oneActionRefused("action unavailable"), expected 0 pending timers but received 1 (0 passed / 1 failed). The rejection is caught, thenfinallyschedules the next read. I’m stopping recurring reads on server refusals while preserving the retry path for transient connection errors.Step complete:
d6b6f64cstops the current popover poll loop on a structuredActionRefused; transport failures still retry after reconnect. HF-R2 failed before the fix (1 timer) and passes after (1/1, 0 timers).bun run checkexits 0;git diff --checkpasses. No dependency or wire change.Finding HF-R1 (P2):
bun test src/canvas/windows/details-facts.test.tsreports 2 pass / 1 fail. The failing disclosure test lists Init, Virtualization, Shell and Locale among the default nonempty Host rows; all four come from the secondary host-facts fields indetails-facts.ts. I’m checking the existing details/UI primitives before selecting the smallest fix that keeps those facts behind the documented More boundary.HF-R1 fixed in
6b38aa9c5e. Init, Virtualization, Shell and Locale now use the shared More capsule tab; the mock and live sources share the same section model.bun test src/canvas/windows/details-facts.test.ts: 3 pass, 0 fail;bun run check: exit 0. No binary size change (tracer UI only).HF-R5 reproduced: after a valid
host.facts.readresponse withos: "Debian GNU/Linux", the live detailsSystemrow showsDebian GNU/Linux 13butDetailsFacts.osis undefined.bun test src/canvas/sessions/details-live.test.ts: the new OS mark test fails (expecteddebian, gotundefined); refused-action timer regression passes.HF-R5 fixed in
827fb96dc6. The live source now maps detected OS labels to shared platform marks, and details refresh updates the header after facts arrive.bun test src/canvas/sessions/details-live.test.ts src/canvas/windows/details-facts.test.ts: 5 pass, 0 fail;bun run check: exit 0. No binary size change (browser TypeScript/UI only).Scripts/verify fastfinding: Clippy rejectsruntime.rs:247becausebuild_routerbecame unused after descriptor-aware dispatch, and rejectsruntime.rs:191becauseserve_with_plugin_descriptorshas no# Errorsdocumentation. These are compile-time issues in the server changes, not load-sensitive failures; I will remove the obsolete helper and document the returned error before rerunning the gate.Fast-gate Clippy finding fixed in
aef4f318c4: the compatibility router builder is now test-only and the public descriptor-aware serve entry point documents its errors.cargo fmt --all --checkandcargo clippy --locked -p infraternal-server --all-targets -- -D warningsboth pass. The full fast gate is being rerun before final browser checks.The requested mock details spec now reaches the popover and exposes the new shared
Moretab. The spec fails only because its old expected tab list is[Host, Connection, Session]; actual is[Host, More, Connection, Session]. Remaining 3/4 mock tests pass, including keyboard and phone placement. Updating the expectation and checking the tab selection.Updated the mock details browser spec in
022890a8afto expect and select the shared More tab.TRACER_TEST_PORT=4214 bun x playwright test test/details.spec.ts --reporter=list: 4 passed in 34.3s.Real-server popover spec passed in
5cf106de27with an explicit rendered-mark assertion.TRACER_TEST_PORT=4214 ... bun x playwright test -c playwright.real.config.ts real/host-facts.spec.ts: 1 passed (5.2s test, 29.6s total). Fresh production screenshot:apps/tracer/real/host-facts-popover.png(400×824, 113657 bytes); it shows the Debian mark after host facts load.Finished on
host-factsat5cf106de27379b116553fff3e2cfd754d021390f.Repair commits cover all five findings. P1 authorization is checked against the compiled action descriptor and persisted owner authority before leg B; pending plugin calls are capped at four per socket, time out after five seconds and drop with the socket. HF-R2 refusal stops polling, HF-R1 puts Init/Virtualization/Shell/Locale in More, and HF-R5 refreshes the rendered OS mark after live facts arrive. No protocol frames, schema or dependencies changed. Plugin removal check
cargo check --locked -p infraternal --no-default-features: exit 0.cargo tree --locked -dshows only the existing duplicate graph; Cargo.toml and Cargo.lock are unchanged.TRACER_TEST_PORT=4214 bun x playwright test test/details.spec.ts --reporter=list:4 passed (34.3s). Real-serverhost-facts.spec.ts:1 passed (29.6s)with the rendered mark assertion. Fresh screenshot:apps/tracer/real/host-facts-popover.png(400×824, 113657 bytes). It shows Debian's mark and the More control after facts load. Reviewer checklist: permission/refusal/pending-call paths, response bounds, plugin-off path, D126 disclosure, wire stability, feature removal, dependency diff and production screenshot checked. The host-facts parser is unchanged; its existing fuzz target was exercised in the independent review.Binary size versus the pre-repair host-facts head (
38b53f45): x86_64 musl 16031568 → 16046576 bytes (+15008); aarch64 musl 13482320 → 13494576 bytes (+12256). The combined increase comes from the two server repair commits; tracer and test commits add no static-binary bytes. Both remain below the configured fast-gate ceilings (16404816 and 13817816 bytes).scripts/verify fastat this head exited 0. Gate output, verbatim:Closed by the orchestrator during the 2026-10-28 handover (#254), on the owner's request to close finished issues. Evidence: Host facts for popover merged into dev and prod-live (
5cf106deancestor of both); extended info explicitly out of this slice; final review and gate were clean. Reopen if anything is still missing.kayg referenced this issue2026-10-28 17:53:55 +00:00