SSH bootstrap: add a real host end to end (demo, D138-D141) #87
Open
opened 2026-10-07 19:02:04 +00:00 by kayg
·
336 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#87
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?
Demo-critical (10 October): add a real host end to end. The server connects over SSH, runs a read-only system check, installs the infraternal agent (rootless by default; root only after explicit consent, D139), and the agent joins with a one-time token over the #78 transport. Per-host progress streams to the UI, N hosts run concurrently (D138 H4), failures are human and retryable (D140), and an SSH failure caused by a mesh policy is reported as such (D141 H12).
Foundational-choice note: the SSH client library is not decided. For the demo the job builds behind a
SshTransporttrait with an adapter that runs the system OpenSSH client (no new dependency; the server's own keys, known_hosts and ssh config are used in place, per H12) and measures a pure-Rust candidate for the owner to decide.Started ssh-bootstrap at base/head
1ce3ed3b57, sole writer. Read repository contract/process, owner decisions from local main, all #87/#78 and parent #5 comments. Base contains enrollment storage/signing and QUIC/TLS primitives but no production agent join command, enrollment listener or remote online registry (crates/infraternal/src/main.rs; runtime.rs). Keep bootstrap in new modules and use narrow integration interfaces for the later #78 merge. No push, deployment or host modifications.Additive contract proposal before code: contracts/ssh-bootstrap.md records strict OpenSSH host-key checking, bounded concurrent per-host WebSocket progress, trusted discovery/credential resolution, explicit root consent, and #78 Enrollment/online/facts integration seam. D156 replaces broad SSH probing with a tiny read-only sniff; facts come from the authenticated infraternal agent. The brief explicitly authorizes server-identity OpenSSH for bootstrap, differing from older bootstrap §1/D9 execution wording; scope this adapter to bootstrap and record the exception rather than change owner decisions. Install into D17 data slots with ~/.local/bin or /usr/local/bin launcher, preserve existing installations on failed retry. No TOFU/key acceptance or new SSH engine. Join stdin shape remains a versioned proposal for #78 integration, never a claimed implemented CLI.
Real-host read-only finding: o1/o2 short names fail DNS on infraternal-dev. Discovery reports both peers Connected, addresses 10.69.69.51/52. Plain SSH to both IPs is blocked by strict host-key checking: "No ED25519 host key is known ... Host key verification failed." No key accepted/changed, no installation. Evidence evidence/ssh-bootstrap/{o1,o2}-ssh-probe.txt. Full proof needs owner-provisioned verified known_hosts entries or an already-trusted mesh SSH route, plus #78 production join/listener/online/session wiring. Continue independent adapter/parser/concurrency work.
Confirmed mesh SSH by IP with strict checking: netbird ssh --no-browser --strict-host-key-checking=true kayg@10.69.69.51/52 succeeds for read-only uname/id (Linux aarch64, uid1002). Short/FQDN names fail local DNS; system OpenSSH to IP rejects missing known_hosts entries. Therefore mesh operator access exists, but the selected OpenSSH adapter still needs verified host trust provisioned in place. Bootstrap must not substitute another SSH engine or accept keys. Base fast encountered toolchain wrapper hardcoded worktree/target/auth-tools; fixed local target symlink into job home scratch, gate rerunning. No source threshold changes or host mutations.
Completed contract step
9275b28403: additive strict bootstrap contract, proposal posted before code. Scoped scripts/verify fast exit0; full log evidence/ssh-bootstrap/contract-fast.log. Static sizes: x86_64 16170000 B; architecture-specific records in log. Verbatim gate summary:Completed dependency step
a0f21d883f: reused existing workspace packages and already-locked zeroize1.9; zero new transitive packages and no SSH engine selected. Full scoped fast exit0, evidence/ssh-bootstrap/dependencies-fast.log. Verbatim:Diagnostic regression RED→GREEN in draft adapter: remote command stderr "Host key verification failed" was misclassified as SSH trust refusal, and stderr SHA256-shaped words were copied to fingerprint data. Isolated failing test evidence/ssh-bootstrap/diagnostics-red.log; now command failures are install failures, raw stderr is withheld, and fingerprints come only from independently bounded ssh-keyscan/ssh-keygen observations (never acceptance). Draft strict Clippy passes; 11 deterministic tests pass, including concurrency8 across two batches/10hosts, retry/credential precedence and filesystem rollback preserving prior binary/state/unit. These are pre-registration checks, not full lane acceptance; per-module gates/commits continue.
model: Validate bootstrap addresses and explicit root consent (#87). HEAD
2020726b90. Reject option/shell-active destinations and unbounded host/credential references before SSH. Keep typed per-host events and content-free failure categories; never use sudo availability as consent. Reject raw credential fields and client-provided mesh evidence. Decisions 139 and 141; draft parser/admission tests pass.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/model-fast.log. Verbatim summary:
probe: Parse a bounded read-only SSH system check (#87). HEAD
4318020716. Gather only OS, architecture, init, uid, sudo, user systemd, linger and existing-install hints. Require one exact256-byte-max versioned record; reject all truncations, suffixes, unsupported platforms and noncanonical uids. Refuse rootless uid0 or unavailable user systemd; facts remain on the authenticated infraternal agent. Decisions 139 and 156; draft check tests pass.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/probe-fast.log. Verbatim summary:
transport: Separate SSH bootstrap from the client engine (#87). HEAD
83c3469e18. Define the object-safe SshTransport/session boundary and private stdin inputs without an SSH library dependency. Keep decrypted values nonserializable and erase their buffers through the existing zeroize implementation. Reject private keys/passwords in argv, files or progress. Decisions 23, 40 and 141; only the OpenSSH adapter follows.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/transport-fast.log. Verbatim summary:
lifecycle-dependencies: Reuse process-group signals for SSH child cancellation (#87). HEAD
e5198320db. Reuse the existing nix dependency to retire owned OpenSSH process groups on cancellation. Killing only the parent leaves proxy and askpass descendants alive; unsafe signal bindings and a new process library were rejected. D23, D141.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/lifecycle-dependencies-fast.log. Verbatim summary:
process: Bound SSH child I/O and retire descendants on cancellation (#87). HEAD
17ddfddc49. Bound helper input/output and total active deadlines. Cancellation retires the owned process group, including proxy and askpass descendants; the failing real-process oracle showed parent-only termination leaked a child. Reject unbounded pipe reads, raw diagnostics and parent-only cleanup. D23, D141.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/process-fast.log. Verbatim summary:
Transport findings: real descendant cancellation oracle failed with parent-only termination (process-cancellation-red.log), then passed with owned process-group retirement. First password helper preparation failed when the trusted scratch root was absent (credentials-root-red.log); private owned-root preparation passes (credentials-root-green.log). Strict host-key observation now resolves effective SSH-config ports: real rootless sshd test passed, check147768us;10 simultaneous checks207ms local/2674ms RTT300ms. No host-key writes, raw stderr or credential files. Logs evidence/ssh-bootstrap/ssh-config-current-green.log and draft-clippy-recovery.log (strict Clippy exit0).
Research diagnostic on infraternal-dev/8cores, CPUWeight10000, initial load1.42/2.54/5.63: n25 authentication RTT300ms OpenSSH p50/p991867761/1940834us, russh0.63.1 1578093/1645273us. 200 retained client connections OpenSSH private318044KiB/PSS321776KiB (RSS1821684KiB repeats shared pages); russh private delta11756KiB/RSS delta12204KiB over3972KiB baseline. Isolated stripped GNU probe2578728B vs baseline487280B, +2091448B; not a production-musl delta. OpenSSH stays the product adapter. Report research/ssh-client/REPORT.md; log research-final-measurements.log. Concurrent repository gates mean diagnostic, not unloaded acceptance.
Read all77 current #78 comments. Latest417e1972 remains transport/readiness work; this base still lacks production join/listener/online routing. End-to-end o1/o2 acceptance remains blocked by that integration and externally verified OpenSSH known_hosts/auth; NetBird strict access is available. No o1/o2 installation was attempted and no unknown host key accepted.
credentials: Scope SSH credentials to private memory-only helpers (#87). HEAD
556897a179. Create owned 0700 helper directories with an ephemeral ssh-agent or askpass socket. Secret material goes only through private stdin/socket pipes, and supplied-key passphrases retire after loading. The fresh-root regression failed first. Reject secret files, argv, copied server identity and raw helper diagnostics. D23, D141.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/credentials-fast.log. Verbatim summary:
openssh: Run bootstrap through strict system OpenSSH (#87). HEAD
8b9bb46525. Preserve server SSH configuration and identity in place while disabling host-key admission, forwarding and persistent control sockets. Observe fingerprints independently at the effective configured endpoint; never scan a proxy hop. Refuse forged remote diagnostics and classify mesh policy only with trusted reachability evidence. Reject another SSH engine, TOFU and raw output logs. D4, D141 H12.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/openssh-fast.log. Verbatim summary:
install: Stage host-bound SSH installs with reversible activation (#87). HEAD
c082a4d861. Upload and verify the configured architecture binary under the data directory, enroll on private stdin and activate a marked systemd unit and launcher. Preserve existing binary/state/unit until authenticated readiness, and restore only the owned transaction on failure. Retain nonsecret cleanup coordinates for retries without retaining credentials. Reject overwriting unrelated files and accepting SSH exit as online proof. D17, D139, D156, D168.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/install-fast.log. Verbatim summary:
API security RED→GREEN in an isolated copy using real loopback WebSockets and software passkeys: logout during a backpressured send left the socket permit live past2s (api-draft-red.log); duplicate Cookie headers admitted a handshake (api-authority-red.log). New send path keeps one pinned write across unrelated revocations and retires immediately when this owner loses authority; single Origin and Cookie headers required. All3 authority/consent/order/idle-logout/stalled-send tests pass,1.52s (api-authority-green.log). Production registration/gate follows after the separate owner module.
Fixture finding: concurrent passkey setup hit the existing process-wide two-slot Argon2 admission, correctly returning401. Reused auth tests' SERIAL guard only during owner creation, preserving the production quota and parallel socket checks. No crypto or quota changes.
Integration seam will receive the exact live Auth and SQLite pool via BootstrapFactory, so #78 can bind enrollment, CA unlock, authenticated facts and terminal routing without duplicate session state. Default runtime admits read-only manual/server-identity checks but refuses enrollment before any upload. Credential-vault and discovery resolvers also need trusted backend wiring; no fake success or facts. Full acceptance remains blocked as recorded above.
bootstrap: Stream independent bootstrap attempts under one global limit (#87). HEAD
8cfd31a07a. Validate complete batches before scheduling, apply shared or per-host credential references, and bound work and rollback to eight hosts globally. Keep a bounded replay history of trusted phase breadcrumbs and require authenticated facts plus terminal routing before done. Retry only failed owner-bound hosts and cancel disconnected batches. Reject batch-wide failure, per-socket concurrency multiplication and redeemed-token readiness. D138 H4, D139, D156, D168.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/bootstrap-fast.log. Verbatim summary:
server-dependencies: Connect server, CLI and fuzzing to the SSH bootstrap package (#87). HEAD
371b001705. Reuse the workspace SSH plugin package for server scheduling, the private askpass CLI and production parser fuzzing. No transitive dependency or foundational SSH engine is added. Reject duplicate transport implementations and exposing credential helpers over HTTP. D4, D23, D141.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/server-dependencies-fast.log. Verbatim summary:
authorization: Require unlocked owner authority for SSH bootstrap (#87). HEAD
ef120b5ac6. Reuse passkey session validation and recheck the owner row before bootstrap admission. Explicit root consent remains a separate request requirement; neither pending local unwrap nor ordinary membership grants installation authority. Reject a parallel authenticator and sudo-derived consent. D23, D28, D139.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/authorization-fast.log. Verbatim summary:
Review RED→GREEN: systemd sniff used show-environment only as a readiness query. The real-shell service-manager oracle rejects that private-environment request (probe-environment-red.log). Querying only the public Version property passes (probe-environment-green.log); safety correction is gating.
Strict-hop finding: outer ssh -o StrictHostKeyChecking=yes does not enforce the same options inside arbitrary configured proxies. The real ssh config parser fixture reproduces admission of an unchecked ProxyJump before any network is attempted (proxy-policy-red.log). Proposed additive constraint: this adapter supports direct SSH destinations using existing config/identity in place; configured ProxyJump/ProxyCommand is unsupported until every hop can be guaranteed strict. It must fail before credential helpers/network, and force direct-hop options afterward. This avoids accepting/changing a proxy host key. No proxy host was contacted and no key accepted.
Integrated isolated x86_64-musl diagnostic:16518896B, then16516048B after sharing the asynchronous writer across event/error serialization. Existing maximum16404816B; still111232B over. Baseline16170000B. Measuring a compiler size setting for the SSH package against check/hash costs; no budget or baseline has been changed. The candidate-library probe is separate and unused by the product.
probe-safety: Probe public systemd readiness without requesting environment (#87). HEAD
cb00057560. Detect the user manager through its public Version property. Reading the manager environment was unnecessary for availability and could expose private values; reject that diagnostic and retain the bounded read-only check. D23, D156.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/probe-safety-fast.log. Verbatim summary:
Rollback retry finding: a real-file regression fails before the correction (evidence/ssh-bootstrap/rollback-retry-red.log: missing restored state), then all five installer tests pass after retiring replacement markers before backup restoration (rollback-retry-green.log). A service-manager daemon-reload failure after restoring backups previously left replacement markers that deleted the originals on retry. The fix preserves retry coordinates and originals. D17, D139.
Additive contract clarification, D139/D156: the approved rootless brief includes requesting own-user linger where host policy permits. Replace the earlier separate-authorization sentence with loginctl --no-ask-password enable-linger for the execution uid, without sudo; denial is a warning. Record intent under the host transaction before changing policy and reverse only a change from previously disabled linger on rollback. Existing enabled linger remains untouched. Six real-file fixture tests pass, including policy denial/restoration and interrupted rollback; fake loginctl prevents modifying infraternal-dev. Parser accepts only exact yes/no receipts and will join the fuzz target. evidence/ssh-bootstrap/linger-tests.log.
rollback-retry: Preserve restored installation files across cleanup retries (#87). HEAD
ef968d711a. Retire replacement markers before moving original binary, state and unit back. If a later service-manager action fails, retry must not delete already restored originals. A real-files failure reproduced missing restored state before the correction and all installer regressions passed after it. Reject leaving mutation markers until final cleanup. D17, D139.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/rollback-retry-fast.log. Verbatim summary:
PROCESS section7 intentional binary growth measurement before baseline change: integrated review build with strict OpenSSH, shared WebSocket writer, scoped askpass CLI, transactional install/linger and runtime factory is stripped static musl x86_64 16518896 bytes (+376224 versus #57), aarch64 13880168 (+324496). Both have no PT_INTERP; build exit0: evidence/ssh-bootstrap/runtime-measured-size.log, infraternal-dev Debian13 8cores CPUWeight10000. New routing/auth/process lifecycle is intentional #87 scope, with no embedded SSH engine dependency. Keep release opt-level3 and the existing 262144-byte allowance. Measured opt-level=s for the SSH package saved24384 bytes but still exceeded the old x86 budget; reject it because it neither solves the allowance nor meets performance-first justification. Shared writer saved2848 bytes without serialization duplication. Propose target baselines from the measured integrated feature build, not a larger allowance; final production gate will record actual sizes. Component evidence: real ss hd check preparation25160us/check122683us; ten checks185ms local/2561ms at300msRTT, controller peak4796KiB (real-final-measurements.log); controlled1000-target admission activepeak8, heldRSS7164KiB vsbaseline4400, 38ms completion (admission-scale.log), excludes full server. Full install/facts/connect timings, server memory and o1/o2 terminal proof remain blocked by #78 runtime and verified OpenSSH trust/auth. D4/D23/D63/D138/D139/D141/D156/D167/D168/D170.
Re-read all current #78 comments and remote-agents contract: HTTP enrollment now registered optionally at166858df, CLI join and remote routing remain WIP. Stable private handoff is the /remote/invitations response {host_id,mode,execution_uid,token,ca_der,endpoint,server_name}; root maps to #78 rootful. The SSH JoinMaterial stdin is opaque and can carry that response unchanged; no alternate token parser or CA state is added. Factory receives this server exact Auth+SQLite for later integration. Update the additive bootstrap doc from its older provisional envelope to this settled #78 contract. No branch merge or deployment performed. Missing operator join/routing and verified plain-SSH trust/auth still prevent D170 installation and terminal proof. Files evidence/ssh-bootstrap/remote-latest-contract.md and remote-latest-comments.txt.
rollback-links: Resume interrupted installation link restoration (#87). HEAD
539a12b8a5. After moving the original binary back, interruption before recreating its links left retry unable to restore the launcher. Preserve original-presence markers and recreate missing links independently of backup presence. A real-files failing test preceded this fix. Reject deleting restored originals or treating backup movement as completed restoration. D17, D139.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/rollback-links-fast.log. Verbatim summary:
Integration contract clarification before code: #78 issue_for_session atomically rechecks the exact live unlocked browser cookie, so owner id alone is insufficient for its backend. Add an opaque Authority carrying nonsecret owner id and an optional zeroizing session capability, passed to all backend operations. The WebSocket uses start_authenticated with the already validated cookie; owner-only start remains for controlled component tests and trusted nonbrowser adapters, and production enrollment must reject missing live-session authority. No session/credential Debug or serialization; progress remains content-free. This permits the factory to reuse exact live Auth+SQLite and #78 atomic issuance without weakening it to owner-only authorization. D23/D63/D139/D168. No missing enrollment adapter is claimed implemented.
prompt-policy: Restrict private askpass replies to authentication prompts (#87). HEAD
1a6e6c8c7e. Allow only password and key-passphrase prompts in the generated private helper. A trust-confirmation fixture failed before this correction. Reject replying to host-key or permission questions, even when a supplied password happens to be yes. Prompt and secret never enter helper argv or logs. D23, D141.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/prompt-policy-fast.log. Verbatim summary:
Installer review: writable existing installation root was admitted before upload (private-base-red.log); require nonsymlink directory owned by execution uid with mode0700 before reading/mutating/cleaning it (private-base-green.log). Rejoin also discarded existing staged identity data, incompatible with #78 immutable host-key binding (rejoin-state-red.log); copy existing enrolled state only inside the private host-local transaction before private-stdin join, suppress join output, preserve live state until activation (identity-private-tests.log green). These are real-file regressions using a synthetic CLI, not proof of #78 operator join or running-daemon handoff. Both fixes will be separate source slices, with retained regression coverage. D17/D23/D139/D141/D156/D168. Browser session capability now reaches the trusted backend in scratch component/API tests; Authority has no Debug/serialization and the cookie is zeroized on scope retirement. authority-component-tests.log and authority-api-tests.log green.
proxy-policy: Refuse SSH proxy hops without enforceable host-key policy (#87). HEAD
589fb1644c. Preflight the effective destination with bounded OpenSSH configuration output, then disable proxies for the actual direct session. A real ssh -G regression first admitted an unchecked jump hop. Reject assuming outer strict options protect child proxy clients, or silently admitting any hop key. Direct host configuration and identity remain in place. D141 H12.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/proxy-policy-fast.log. Verbatim summary:
linger-policy: Request reversible own-user linger through host policy (#87). HEAD
28fb94abd1. Request rootless linger without sudo or interactive authorization, report exact bounded yes/no receipts, and journal intent before policy mutation. Restore only initially disabled linger on rollback; existing enabled policy remains. Real-file policy denial and restoration tests use a fake loginctl, avoiding host mutation. Reject root daemon promotion and treating denied policy as installation success with persistent uptime. D139, D156.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/linger-policy-fast.log. Verbatim summary:
linger-progress: Report policy-denied rootless linger during installation (#87). HEAD
2848fd5130. Perform the authorized own-user linger request after activation and immediate erasure of the enrollment capability, and expose a static warning on denial. Reject a preinstall warning that never attempted the approved policy request and any root escalation fallback. D23, D139, D156.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/linger-progress-fast.log. Verbatim summary:
ssh-tests: Exercise SSH admission, secrets, recovery and real process lifetime (#87). HEAD
bcb7236c50. Add strict parser/admission and classification tests, global eight-host scheduling tests, real subprocess cancellation/bounds, private credential prompt tests, and real-file rollback/policy interruption regressions. Register the real-sshd synthetic-key oracle separately as an explicit harness run, including ten concurrent checks at 300ms RTT. Reject mocks as proof of SSH authentication or authenticated remote readiness. D23, D40, D138 H4, D139, D141, D156, D167, D170.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/ssh-tests-fast.log. Verbatim summary:
bootstrap-api: Expose owner-authenticated bounded bootstrap progress sockets (#87). HEAD
8467bd27fe. Mount an additive WebSocket router using the existing live authenticator, strict pinned Origin and one session-cookie header. Bound admission/messages/replay and interrupt a stalled write on revocation while preserving the original write across unrelated revocations. Reject parallel auth, raw request echo, SSE protocol divergence and revoked socket work. Real TCP passkey tests pass. D23, D63, D138 H4, D139.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/bootstrap-api-fast.log. Verbatim summary:
Private-root guard measured on infraternal-dev 8cores CPUWeight10000, initial load1.84/1.75/1.70, n500/profile: plain shell p50/p99=1002/1506us; stat uid+mode plus id (two forks)3827/5791us; builtin -O plus stat mode (one fork)2521/3593us. Retain the one-fork ownership+0700 guard, saving1306us median versus the equivalent two-fork check. Median added1519us per remote script is justified to reject a writable/wrong-owner root before identity operations; this excludes SSH/full-stage latency. Real-file private-root and rejoin regressions remain green. evidence/ssh-bootstrap/private-guard-measurements.log. Read-only NetBird checks against both named hosts now confirm Linux/aarch64/systemd, uid1002, sudo=no, user_manager=yes, linger=yes, existing=no; evidence/ssh-bootstrap/named-host-checks.log. No installation or trust-store modification. Verified plain OpenSSH known_hosts/auth and #78 production join/routing remain the prerequisites; systemd/linger are available on o1/o2.
askpass-cli: Provide the private synchronous SSH prompt CLI helper (#87). HEAD
fcacc0b04d. Add a hidden helper that answers only the scoped Unix socket protocol without a Tokio runtime or diagnostics. Secret reply belongs solely to the OpenSSH stdout pipe. Reject secret argv/environment/files and an HTTP credential endpoint. D23, D141.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/askpass-cli-fast.log. Verbatim summary:
control-frames: Keep bootstrap sockets alive through WebSocket control frames (#87). HEAD
0c8361f63f. Ignore valid Ping and Pong as commands while continuing progress delivery; the transport supplies heartbeat replies. A real-TCP unsolicited-Pong regression first retired the live socket and passes after correction. Reject treating control traffic as disconnect or extending authenticated session expiry on heartbeat alone. D63, D138 H4.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/control-frames-fast.log. Verbatim summary:
Two review regressions: real-TCP Pong retired a live bootstrap socket before Start (control-frames-red.log), now control frames preserve progress and heartbeat replies (control-frames-green.log:4/4). Active service stop failure also replaced live artifacts in a real-file manager fixture (stop-failure-red.log); require acknowledged stop for an active service, with originals unchanged on error (stop-failure-green.log). Runtime backend must prove this batch newly enrolled certificate/generation, not an old connection for the same host UUID. Full session-context gate had one existing daemon oracle failure at restart22, terminal command queue full (session-context-fast.log); same seed20 standalone rerun passed24/24 in39.01s (session-context-daemon-recheck.log), and unchanged full gate rerun is in progress. Clippy/static both passed in the failed run. Extended ASan target includes diagnostics and65536/65537-byte seeds:1467476 runs/61s, no crash (ssh-parser-extended-fuzz.log). D17/D23/D40/D63/D139/D156/D168.
session-context-recheck: Carry live browser authority privately to bootstrap backends (#87). HEAD
4095b792ad. Pass owner id, nonsecret batch identity and an opaque zeroizing session capability to trusted backend operations. Browser batches use authenticated admission so #78 can atomically recheck its exact live cookie; cleanup remains bound to this batch and preserves previous authority. Migrate existing consumers without introducing parallel session state. Reject owner-only issuance, cookie serialization and invalidating other batches. D23, D63, D139, D168.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/session-context-recheck-fast.log. Verbatim summary:
Updated integrated prototype measurement on infraternal-dev, eight logical cores, opt-level3/LTO/stripped static musl: x86_64 16,521,648 bytes; aarch64 13,881,576 bytes. Relative to the previous baselines, intentional bootstrap routing, live authority, bounded progress and owned SSH lifecycle add 378,976 / 325,904 bytes. No SSH library is embedded. PROCESS section7 permits a measured intentional baseline update with rationale; the upcoming atomic baseline slice retains the 262,144-byte allowance and release optimization unchanged. The isolated opt-level=s experiment saved only 24,384 bytes and still exceeded the old limit; its execution speed was not measured and it is rejected. Final production build sizes will be recorded separately. Full remote acceptance and phase/whole-server benchmarks remain blocked on #78 integration and verified o1/o2 OpenSSH prerequisites.
private-install-root: Refuse writable or foreign installation roots before mutation (#87). HEAD
fdc1a86ea8. Require a nonsymlink private 0700 directory owned by the execution uid before existing-state reads, upload or cleanup. A real-files regression first accepted a group-writable root. Use the measured builtin ownership test and one stat child: median2521us versus3827us for two children, n500 on infraternal-dev. Reject trusting a public host marker alone or accepting writable identity directories. D17, D23, D139.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/private-install-root-fast.log. Verbatim summary:
rejoin-identity: Preserve host identity during staged re-enrollment (#87). HEAD
5cd373d385. Clone existing enrolled state only inside the private host-local transaction before joining, retaining the same host key required by #78. Reject discarded identity and overwriting live state before authenticated readiness. Suppress join output so neither diagnostics nor a hostile echo can carry its stdin capability into buffers or logs. A real-files identity-loss regression failed first and passes after preservation. D17, D23, D139, D168.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/rejoin-identity-fast.log. Verbatim summary:
Production-crate ASan run: the isolated fuzz manifest now links directly to crates/plugins/ssh, not diagnostic draft-module registration, and invokes the registered ssh_check_decode source. 1,366,902 runs in 61s, max_len65537, no crash; scope CPUWeight10000. Log evidence/ssh-bootstrap/ssh-parser-production-fuzz.log. Check/config/destination/linger/allowlisted diagnostics are production functions. Instrumented fuzz RSS is not server memory. Earlier campaigns retained as development evidence.
stop-active-service: Require an acknowledged stop before replacing an active daemon (#87). HEAD
c08c41e8c4. A real-files manager fixture first ignored an active service stop failure and replaced live artifacts. Require successful stop for a previously active service, preserving inactive/fresh-unit tolerance and rollback. Reject an old authenticated connection masking a failed upgrade or altering live binary/state after a denied stop. D17, D139, D156, D168.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/stop-active-service-fast.log. Verbatim summary:
Additive integration clarification before final contract update: #78 backend must reserve a host attempt from invitation issuance through readiness/cleanup, so two batches targeting the same host cannot replace each other's invitation. Bind new authority to the batch and preserve prior authority on failure. If issuance fails before returning JoinMaterial.host, it must remove its own partial authority before returning Err; the bootstrap runner cannot identify that record. Facts/terminal proof must bind the current attempt certificate/generation. This tightens the already proposed authority seam; no parallel enrollment/CA engine is introduced.
identity-authority-recheck: Cover private roots, same-key state and session capability isolation (#87). HEAD
7970489a6c. Retain the real-file writable-root and identity-loss regressions in the existing installer fixture, and exercise authenticated batch capability bounds and content-free progress with the existing held backend. Reject duplicated fixtures and treating these controlled tests as actual operator-join evidence. D17, D23, D40, D139, D168. Initial gate tests passed but Clippy rejected three equality assertions; corrected public comparisons and kept capability assertions nonformatting. Recheck passed unchanged production code.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/identity-authority-recheck-fast.log. Verbatim summary:
api-authority-tests: Test bootstrap authority and revocation over real TCP (#87). HEAD
11130b3f62. Register software-passkey WebSocket tests for owner/unlock/Origin/cookie/root admission, ordered progress, idle logout and backpressured write cancellation. Reuse the existing serial auth-fixture gate because the process-wide two-slot Argon2 budget is intentional. Assert that the trusted backend receives its live session. Reject weakening quotas to hide fixture races or testing only router mocks. D23, D63, D139.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/api-authority-tests-fast.log. Verbatim summary:
askpass-cli-tests: Test real private password and encrypted-key CLI handoffs (#87). HEAD
714c97f2fb. Run the hidden CLI against an owned private prompt socket and unlock an encrypted synthetic RSA key through real ssh-add and ssh-agent. Generate key and passphrase only in memory and private pipes, then verify cleanup. Reject credential files, secret argv and using existing server identities as test fixtures. D23, D141.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/askpass-cli-tests-fast.log. Verbatim summary:
Process ownership regression: a real helper leader exits while a descendant leaves its process group but retains output pipes. Before correction, the leader was reaped while owned I/O remained pending (process-identity-red.log, FAILED in .22s), releasing the numeric id still armed in cancellation. This proves early identity release, not an observed unrelated-process kill. Keep the leader unreaped until pipe I/O completes, then await status and synchronously disarm. All three subprocess tests pass in .17s in the isolated draft check. Interleaved normal completion benchmark n500/profile, infraternal-dev8cores CPUWeight10000 load2.16/1.74/1.60: original p50/p99 767/1181us, pinned762/1179us; excludes SSH/full phases. Logs process-identity-green.log and process-lifetime-measurements.log. Applying this one logical fix plus its regression after the current adapter gate, then running full fast before committing.
foreground-policy: Keep configured SSH clients in the owned foreground lifecycle (#87). HEAD
cd041d83fe. Force foreground operation for effective-config preflight and bootstrap commands. A real OpenSSH config-parser fixture with ForkAfterAuthentication enabled first failed admission; the corrected adapter overrides it without altering identity/config files. Reject configured backgrounding of an owned bootstrap child and silently dropping that server config. D23, D141.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/foreground-policy-fast.log. Verbatim summary:
process-identity: Retain SSH group identity until inherited pipes finish (#87). HEAD
40e43e3386. A real helper regression first released its leader id while a separately grouped descendant kept inherited output open. Wait for owned pipe I/O before reaping the leader, then disarm synchronously; retain the regression in the existing subprocess fixture. Reject reaping early and signalling a potentially recycled numeric group id. This proves early identity release, not an observed unrelated-process kill. Interleaved n500/profile helper completion measured p50/p99 767/1181us before and 762/1179us after on infraternal-dev8cores CPUWeight10000, load2.16/1.74/1.60; full SSH phases excluded. D23, D40, D141.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/process-identity-fast.log. Verbatim summary:
foreground-tests: Exercise configured SSH foreground precedence with the real parser (#87). HEAD
61553bb285. Register the real OpenSSH option-parser fixture proving a backgrounding server configuration is overridden for commands. Generated public configuration never contacts a peer or reads a real identity. Reject checking only a copied argument array. D23, D40, D141.Full CPUWeight10000 scripts/verify fast exit0; log evidence/ssh-bootstrap/foreground-tests-fast.log. Verbatim summary:
Continuation started: sole writer on ssh-bootstrap, base/head
61553bb285. Read CLAUDE.md, DECISIONS.md, ARCHITECTURE.md, PROCESS.md, all #87 and parent #5 comments and prior commit history. Preserve inherited runtime/fuzz/research work; evidence/, target/ and scripts/pycache/ stay uncommitted. Runtime draft has obsolete Backend signatures and is not registered in production. Batch scheduler, retries and authenticated WebSocket already committed. Latest #78 comments describe join/remote routing as uncommitted WIP; committed remote-agentsc0815d2does not yet provide that runtime. Continue available integration/fuzz/research steps; no host-key acceptance or external checkout mutations.Additive contract clarification before runtime wiring: document exact implemented WebSocket JSON (start targets address {kind,value}, retry target, replay after; event sequence/target/attempt/step/message/elapsed_ms/log_tail and optional failure; error/resync envelopes). One batch per socket, replay on same live socket only; disconnect cancels, no reconnect-resume claim. Incorporate already-recorded own-user noninteractive linger policy, #78 invitation stdin response, and host-attempt/session/generation reservation invariant. Mount existing router through BootstrapFactory receiving exact live Auth+SQLite; default backend permits manual server-identity read-only checks but refuses invitations before upload. No substitute CA/remote engine or owner decision changes.
Continuation finding: /v1/bootstrap/ws is defined in bootstrap_api.rs but runtime.rs build_router never merges it; ordinary server requests cannot reach the existing batch API. bootstrap_runtime.rs is untracked/unregistered and implements obsolete owner-string Backend methods instead of Authority. Correct by registering the trusted runtime module, carrying live Auth+SQLite into the factory, and mounting one global runner. Add a failing real-TCP production-router admission test before the wiring fix. End-to-end remains blocked by #78 production join/online/facts/terminal integration; committed remote-agents head
c0815d2contains no operator CLI runtime activation.Runtime route RED: ordinary real-TCP /v1/bootstrap/ws returned HTTP404 instead of required unauthenticated401; evidence/ssh-bootstrap/continuation-runtime-route-red.log (1 failed, .02s). Before activating that runtime, apply PROCESS §7 measured intentional bootstrap baseline update already proposed twice on #87: x86_64 16521648 B (+378976), aarch64 13881576 B (+325904), opt-level3/LTO/stripped/static, no embedded SSH library. Rationale: reachable owner-authenticated progress, runtime factory, bounded lifecycle/rollback and private askpass. Preserve 262144 B allowance; reject opt-level=s and a larger allowance. Source measurement evidence/ssh-bootstrap/runtime-measured-size.log and preceding integrated-size issue comments. Final reachable binaries will be measured separately.
ASan production-parser campaign completed: 4256482 executions in181s, max_len65537, seed1694043920, no crash; evidence/ssh-bootstrap/continuation-parser-fuzz.log. First continuation fast: fmt/VT fmt/test/cargo-deny/static PASS, Clippy FAIL on two inherited fuzz assertion/style patterns (assert_is_empty, collapsible_if). Corrected equivalent assertions; complete fast recheck running. Real-TCP missing production route RED404 vs401 confirmed separately. Fresh n25/profile authentication: OpenSSH local/RTT300 p50 95348/1885910us; russh 83778/1553840us. At200 connections OpenSSH private318012KiB; russh private delta11484KiB, RSS4016→15884KiB. Machine infraternal-dev8cores CPUWeight10000 initial load0.95/0.75/1.09, fast/ASan concurrent. research/ssh-client/REPORT.md includes limits and owner recommendation; production-path authentication remains unmeasured.
Completed parser-fuzz:
b7e535041c. ASan4256482 executions/181s max_len65537 no crash; final equivalent assertion source100000 executions/4s no crash. Logs continuation-parser-fuzz.log and continuation-parser-final-source.log. Exact CPUWeight10000 scripts/verify fast exit0; evidence/ssh-bootstrap/continuation-fuzz-recheck-fast.log. Verbatim:Completed contract:
753b98a4b2. Contract proposal posted before implementation;32KiB commands,100 targets,8 global active hosts,1024 events,8 attempts. No UI code or frozen wire change. Exact CPUWeight10000 scripts/verify fast exit0; evidence/ssh-bootstrap/continuation-contract-fast.log. Verbatim:Completed size-baseline:
00254867f8. Measured integrated deltas+378976/+325904 B recorded before update; unchanged262144 B allowance. Runtime activation follows separately. Exact CPUWeight10000 scripts/verify fast exit0; evidence/ssh-bootstrap/continuation-size-baseline-fast.log. Verbatim:Completed runtime:
fe65e3ddf0. Real-TCP route RED404 vs401 before fix; targeted route/default-backend tests GREEN. Default cannot complete provisioning until #78 supplies production join/facts/terminal integration. Exact CPUWeight10000 scripts/verify fast exit0; evidence/ssh-bootstrap/continuation-runtime-fast.log. Verbatim:Completed research-probe:
02db8afdfb. Locked release build, isolated fmt and pedantic Clippy PASS;178 packages with compatible license alternatives.25 samples/profile,200 retained connections. Probe2578408 B; no product dependency added. Evidence continuation-research-final-build.log, continuation-research-metadata.json. Exact CPUWeight10000 scripts/verify fast exit0; evidence/ssh-bootstrap/continuation-research-probe-fast.log. Verbatim:Completed research-baseline:
2c770861cf. Stripped isolated baseline487280 B vs probe2578408 B, delta2091128 B; opt-level3/LTO/one codegen unit. Excludes future interactive functionality and product LTO sharing. Exact CPUWeight10000 scripts/verify fast exit0; evidence/ssh-bootstrap/continuation-research-baseline-fast.log. Verbatim:Runtime completed at
fe65e3ddf0: ordinary server mounts /v1/bootstrap/ws; real-TCP route and fail-before-upload tests GREEN; full fast exit0. Final stripped static sizes x86_64 16520048 B, aarch64 13881064 B, no PT_INTERP (continuation-runtime-fast.log). Final strict isolated probe: forbid unsafe, pedantic Clippy and isolated cargo-deny advisory/bans/licenses/sources PASS; GNU probe2578408 B vs baseline487280 B (+2091128). Repeated final-source n25/profile measurement: OpenSSH local/RTT300 p50/p99 92644/99015 and1878221/1948598us; russh80050/94246 and1569817/1660197us.200 retained: OpenSSH private318052KiB; russh private delta11460KiB, RSS3992→15900KiB. CPUWeight10000/infraternal-dev8cores initial load2.01/1.83/1.52; static builds concurrent. evidence/ssh-bootstrap/continuation-research-final-measurements.log.End-to-end acceptance blocked: committed remote-agents remains
c0815d2, whose production runtime has no agent join CLI activation or remote terminal runtime; #78 records those as uncommitted WIP. The #78 writer/orchestrator must provide committed join/listener/online/facts/terminal adapters for BootstrapFactory. Then run disposable local installation/terminal/removal first, ten complete local targets with per-phase/server-RSS numbers, and only then o1 with preexisting verified OpenSSH trust/auth. Previous #87 plain-SSH key refusal is historical evidence; this continuation has contacted no named remote host and has not checked or changed its trust. Research fixture checks and transport primitives are not that proof. Continue remaining report/harness atomic gates; no issue closure.Completed research-harness:
ff031f1733. Python syntax PASS; real rootless sshd checks PASS: preparation23884us/check118522us,10 concurrent checks180ms local/2602ms RTT300. Load1.44/1.37/1.27, CPUWeight10000; these are checks, not full provisioning or whole-server RSS. Evidence continuation-real-ssh.log. Exact CPUWeight10000 scripts/verify fast exit0; evidence/ssh-bootstrap/continuation-research-harness-fast.log. Verbatim:Completed evidence-docs:
ac2ee4be5f. Report paths committed; ASan4256482 executions/181s then100000/4s without crash. Controlled1000-target run active_peak8;RSS4432/7452/7884KiB in45ms, load0.69/1.10/1.19. Full host installation/terminal/uninstall and server memory unproven; no named remote host contacted in this continuation. Exact CPUWeight10000 scripts/verify fast exit0; evidence/ssh-bootstrap/continuation-evidence-docs-fast.log. Verbatim:UI gaps against contracts/ssh-bootstrap.md, recorded by the UI side (demo-preview
8a83aa1). Please address in the API where they make sense:Add-host flow: gaps in the provisioning contract
The add-host mockup now speaks
contracts/ssh-bootstrap.md(branchssh-bootstrap)through
apps/tracer/src/provisioning-client.ts, and the test double(
apps/tracer/test/provisioning-double.ts) implements the same requests and events.This file lists what the UI wants that the contract does not give it. None of it is
invented in the double; each item says the exact field and why. Where the UI cannot
work without a field, it carries a fallback, named below.
Wanted by the UI
Per-step human text that matches a fixed vocabulary. Contract:
messageisfree human text and "clients must display the server's actual text". The UI shows
exactly that, so the row's step label is whatever the server says. The double uses
short phrases ("Checking the system", "Installing the agent", "Gathering host
facts", "Connecting", "Ready", "Ready · root"). Wanted: the real server's
messagefor each step stays a short present-participle phrase of under 30 characters,
because it sits on one line beside a progress bar on a phone. Longer prose belongs
in
log_tail.Facts on the
doneevent, for the window header and popover. The checkalready collects OS, architecture, init, uid, sudo, user systemd and linger, but
events carry only text. The UI wants on
done:host: { host_id, os: "ubuntu"|"debian"|..., os_name, os_version, architecture, uid, mode }. Why: the new window's header shows the OS mark, name and version, andthe popover shows architecture and mode. Today the UI falls back to the discovery
inventory entry, which does not exist for a manually typed
user@host(it shows"Linux", no architecture).
The host id the new terminal belongs to.
doneshould carryhost_id(theUUID bound after the check) so the window can open that host's terminal through
the session router. Without it the UI cannot tell the canvas which host the new
window is.
A structured failure for the "what to do" copy.
failure.kindselects thetitle and next-step text in the UI, which is enough for six kinds. Wanted per kind
that the UI cannot derive:
failure.phase(which of check/install/facts/connectwas running; today the UI keeps the last phase it saw) and, for
host-keyandunsupported, a field naming what was observed (the contract hasfingerprintsfor host keys only; unsupported needs
reason: "no-systemd" | "arch" | "os").Queued versus started. The server admits eight active hosts; the rest of a
100-host batch have no event until a slot frees. The UI shows "Waiting" for a host
with no events, which is indistinguishable from "the server never heard of it".
Wanted: one
queuedstep (or aqueuedevent) per target at admission, withqueue_position. The UI would then show "Waiting" only for queued hosts and couldreport a rejected target.
A pasted credential becomes a reference how? The credentials page lets the
person paste a key or password and says it is encrypted with their passkey. The
contract only accepts an opaque
credentialreference, and defines no request thatturns pasted bytes into one (that is the vault adapter's job). Wanted: the vault
request (path, body, response
{credential}) so the UI can store the paste firstand send the reference. Today the UI sends no credential, and the double refuses
nix-cacheregardless.Discovery and inventory. The host list (names, sources, OS, "already added",
"SSH ready" / "No answer" / "Blocked", root available) comes from a mock endpoint,
/__mock/proto/addhost. The contract resolvesdiscoveredids but defines norequest that lists them. Wanted: a read-only listing with, per entry:
id,Vocabulary (CLAUDE.md): user-facing step messages must say "infraternal agent", never "agent" alone. The test double currently shows "Installing the agent" mirroring the contract's example messages; please make the server's messages read e.g. "Installing the infraternal agent" and update contracts/ssh-bootstrap.md examples. The UI side will match.
Continuation checkpoint, head
ac2ee4be5f, ssh-bootstrap. Eight atomic commits finish the inherited runtime/fuzz/research source: the ordinary server mounts authenticated bounded start/retry/replay progress, the default refuses enrollment before upload, and contracts/ssh-bootstrap.md gives UI JSON shapes. Comparison and own reviewer checklist are committed in research/ssh-client/REPORT.md and docs/ssh-bootstrap-evidence.md. Every commit ends Refs: #87 and passed exact scripts/verify fast; the final committed head was tested again. Evidence/target/scripts/pycache were excluded from commits.Evidence: ASan4256482 executions/181s, max_len65537, no crash; equivalent final assertions100000/4s, no crash. Real TCP route regression RED404→GREEN401. Real sshd check preparation23884us/check118522us; ten concurrent checks180ms local/2602ms RTT300 (not ten installations). Controlled1000 targets held active_peak8, RSS4432/7452/7884KiB,45ms, load0.69/1.10/1.19 (not full server memory). Final-source n25/profile SSH comparison and200 retained connection private/RSS/PSS numbers are in REPORT.md, initial load2.01/1.83/1.52, CPUWeight10000. Isolated research pedantic Clippy/cargo-deny/build PASS. Final artifact sizes+SHA256 saved in evidence/ssh-bootstrap/continuation-final-artifacts.json.
Full provisioning acceptance remains BLOCKED. Final dependency recheck found remote-agents advanced to3a92ea2 via a dev merge; git show of its committed main.rs/runtime.rs still has no agent join CLI activation or remote terminal runtime. Latest #78 comments explicitly retain complete-feature WIP uncommitted, pending static-budget resolution, production administrator-envelope adapter and default server-startup wiring. This updates the earlier
c0815d2inspection in the evidence guide. The #78 writer/orchestrator must supply committed production join/listener/online/facts/terminal adapters. Then perform disposable local install/join/terminal/removal, full ten-target phase timings and server RSS, and o1 only after local proof and verified existing OpenSSH trust/auth. Prior key-refusal evidence is historical; this continuation contacted no named remote host or trust store. No full local/o1 installation or cleanup proof and no whole-server memory number are claimed. Issue remains open.Scratch cleanup removes the24GiB job cache and worktree target symlink; all logs/findings remain under evidence/ssh-bootstrap/. Future builds must recreate their own HOME scratch target/toolchain setup. No pushes or deployments.
Exact final CPUWeight10000 scripts/verify fast exit0; evidence/ssh-bootstrap/continuation-final-fast.log. Verbatim gate output:
Orchestrator: run 2 complete at
ac2ee4b(API wiring, UI contract, 4.26M fuzz executions, SSH comparison report). Full provisioning waits on #78 production integration (in progress, run 6). Owner decision pending on the SSH client choice and o1 host-key trust.Owner answer (2026-10-08): o1 host key may be trusted on first use (nobody else has logged in); record the fingerprint here when pinning. SSH client: the owner asks whether russh can use OpenSSH known_hosts, config and existing keys, and how well audited it is; decision pending.
Run 3 launched: merge dev, server's own key on first start, D183 auth auto-detection order, host-key handling, end-to-end against #78 when its join API lands.
Run3 started: sole writer ssh-bootstrap, resumed
ac2ee4be5f(inherited runtime/fuzz/research already committed). Read repository contracts, main D181/D183, #87/#78 history and parent #5. Merge current local devf27b3fefirst; D183 dedicated Ed25519 key and ordered auth supersede inherited ambient-local-identity fallback. Exclude evidence/target/scripts/pycache; no push/deploy/perf VM/credential inspection.Additive D181/D183 contract proposal before code: GET /v1/bootstrap/ssh-key requires exact pinned Origin and unlocked owner cookie, returns public_key/fingerprint/locked (public trust remains usable cold-locked), 503 if dedicated key custody is unavailable. Persist one dedicated Ed25519 public identity plus opaque administrator-wrapped ciphertext in SQLite; initialization/unlock uses an SshKeySource/administrator-vault boundary parallel to CaKeySource. Existing dev has no production administrator CA envelope adapter; no plaintext adjacent unlock key or ambient-local-key fallback will be introduced. Trusted configured startup creates the dedicated key exactly once through that vault; default cold startup retains public metadata only.
Ordered auth: network-only BatchMode connection with local keys/agents/passwords disabled, then dedicated server key, then browser-unwrapped user key, then typed-once password. Lazy providers expose each secret only when its turn is reached, helper stdin/socket paths retain current bounds; unknown/changed host keys or unreachable targets stop the sequence. Report only trusted auth method/provider metadata and typed choose-method on auth exhaustion. Existing strict host-key refusal and independently observed fingerprint API remain; do not auto-pin o1 under this brief. #78 join/listener/runtime not landed on merged dev; keep invitation shape stable and test fixture integration independently.
Completed dev merge
62a2c4be11(devf27b3fe). Keep shared auth fixture lock crate-visible; move unpublished remote schema0010 to0012, preserve deployed recovery0010/0011. Exact CPUWeight10000 scripts/verify fast exit0, TRACER_TEST_PORT4787; log evidence/ssh-bootstrap/run3/merge-fast.log. x86/ARM16327664/13734784 bytes, limits unchanged; shared8core load at final TS check21.47/20.07/19.13. Verbatim:Failing-first D183 regression on merged62a2c4b: the production OpenSSH adapter accepted the disposable fixture through its inherited authorized ssh-agent during the intended network-only attempt. Expected auth refusal; actual check succeeded. Real sshd oracle0passed1failed in0.42s, exit101; evidence/ssh-bootstrap/run3/network-red.log and .scratch/run3/real_ssh_red.rs. No existing key/config/known_hosts inspected or modified; fixture keys stayed in memory/pipes. Fix will isolate network auth from identity files/agents and reuse the read-only check as the ordered authentication oracle.
Completed D183 additive contract
743385eb24: dedicated key custody/API, lazy ordered auth and typed method/exhaustion events. Existing trust and #78 join shape unchanged; missing administrator custody explicit. CPUWeight10000 scripts/verify fast exit0, port4787, final shared8core load40.17/33.97/28.73; evidence/ssh-bootstrap/run3/auth-contract-fast.log. Verbatim:Schema0014 gate red only in unchanged vt_credit.rs:22 (credit probe t1-gate-approximate-1;0/1,10.22s). Other Rust rows/static builds pass; x86/ARM16327728/13734880 B. Log evidence/ssh-bootstrap/run3/key-schema-fast.log; shared8core load reached40.17/33.97/28.73 earlier. No threshold changed; isolated oracle then exact full rerun. Version0013 is reserved for #78 committed remote_sessions, so dedicated SSH row uses0014.
Current #78 CLI integration finding (source inspection of committed remote-agents02f37b2): main.rs Agent data/state flags belong before Join; run_remote_agent always calls remote::run after join. Installer install.rs:201 currently uses agent join URL --state STAGE and expects return, and its service omits --data and run. Thus this installer cannot drive that CLI yet; it would fail argument parsing or wait on the running supervisor, and identity/shim directories need explicit separation. No upload/installation attempted. Additive proposed bootstrap CLI: agent --data STAGED_IDENTITY join URL --enroll-only returns after pinned enrollment; service agent --data LIVE_IDENTITY --state RUNTIME_STATE run. Default public join-and-run stays unchanged and stdin JSON remains contracts/remote.md. Need #78/orchestrator integration on dev; test the fixture before claiming full local/o1 provisioning.
UI-3 (add-host wizard on real provisioning) started by the UI engineer. Branch canvas-addhost, base canvas-product
bdfcad2. Plan: ProvisioningService adapter (real = contracts/ssh-bootstrap.md, mock = ?mock=1 only), D183 detect-first wizard, five-stage stepper from bootstrap events, enrolled hosts handed to the canvas through one hook. I will post contract gaps I find here (ssh-key route, choose_method, credential minting, host-key pinning, offline install command are in the contract or needed by it but not mounted on ssh-bootstrap743385e).UI-3 finding (contract gaps for the wizard). Evidence:
git grepon ssh-bootstrap743385e(crates/infraternal-server/src, crates/plugins/ssh/src) finds only/v1/bootstrap/ws; no/v1/bootstrap/ssh-keyroute and nochoose_methodfield exist in code, though contracts/ssh-bootstrap.md specifies both. bootstrap_runtime.rs refuses discovery and vault requests ("Host discovery is unavailable in this build").The UI adapter (apps/tracer/src/canvas/addhost/real.ts) speaks the contract as written and treats anything else as "unavailable" (never as success). It needs these ADDITIVE endpoints; proposing them here before the UI relies on them:
GET /v1/bootstrap/ssh-key(in the contract, not mounted yet):{public_key, fingerprint, locked}. Shown with a copy cell when auth falls to "choose".GET /v1/bootstrap/discovery->{"hosts":[{id,user?,address,os?,operating_system?,architecture?,sources[],reach?: ready|unreachable|mesh-policy,evidence?,already_added?,root_available?}]}. Authorized inventory only; same admission as the socket. 404 = no discovery, the wizard then shows "type user@host or paste an ssh config".POST /v1/bootstrap/credential{kind:"private-key"|"password", secret, passphrase?}->{reference}. One use, bound to the live session, expires with it; the reference goes instart(per-targetcredential). Needed because the contract says requests carry only references but gives the browser no way to create one for the D183 "user's key / password typed once" steps.retrycannot change a credential, so after the person supplies one the UI starts a new single-target batch with the reference.POST /v1/bootstrap/host-key{host, fingerprint}-> 204. Owner action that pins an observed key (the contract says observations never update known_hosts, so the UI needs a deliberate way to). The UI only calls it after the person compares the fingerprint and clicks "Trust this key"; it then retries.POST /v1/bootstrap/install-command{host}->{command, expires_in_seconds}for unreachable hosts. Note the tension in the contract: "a token never enters an URL or argv" vs a one-line command that must carry something; the UI only displays whatever string this returns, with its 900 s lifetime.authenticationand failure fieldchoose_methodare parsed exactly as in the contract; both are optional so older servers work.Also needed for TASTE (typed host without a login name):
manualaddresses are sent ashostoruser@host[:port]as typed; if the server requiresuser@, say so and the wizard will ask for it.Schema step committed:
bfe6c80751. D183 singleton public identity/admin-wrapped ciphertext, migration 0014 preserves #78 migration 0013. First unchanged VT credit failure was followed by isolated and full passing reruns. Evidence: evidence/ssh-bootstrap/run3/key-schema-fast-recheck.log. scripts/verify fast exit 0; summary verbatim:TypeScript: 7 pass, 0 fail, 34390 expect() calls, 3.70s. Static binary x86_64 16,327,728 bytes; aarch64 13,734,880 bytes.
Key custody source compiles and passes clippy/deny/static checks. First full gate was interrupted (exit 143 after both release compilations); the cached rerun failed an unchanged terminal-credit snapshot test: crates/infraternal/tests/agent_review.rs:13, repeated_tiny_credit_pauses_preserve_shell_progress, scripts/verify-agent-snapshot.py:48 assertion len(client.snapshots) == count and client.out == cursor. Five sibling tests passed; key module is not yet wired into runtime, static sizes unchanged. Evidence: evidence/ssh-bootstrap/run3/key-custody-fast-snapshot-failure.log. Shared load 24.77/24.18/24.01. Re-running the unmodified full gate with RUST_TEST_THREADS=1; no assertions or budgets changed.
Additive D183 API shapes proposed before implementation: retry may include auth:{key,passphrase,password} for one existing failed target only; never on start, never in replay/history/Debug/logs. Browser-unwrapped key and password are bounded transient inputs, lazy after network/server key and erased when this attempt ends; queued credential admission expires after 60s. Existing reference-only retries remain valid.
First-contact confirmation: action:"confirm-host-key", target and displayed SHA256 fingerprint, bound to the current failed attempt of this owner/socket batch. Only an explicitly classified unknown-key refusal is confirmable; changed/revoked/generic trust failures remain refusals. Re-scan and require the same displayed fingerprint before retaining a dedicated public pin, then permit explicit retry. The system OpenSSH verifier remains the trust engine; confirmation never rewrites system known_hosts or accepts o1 during this job. Missing production #78 invitation/CA custody remains an explicit integration gap.
Dedicated SSH custody module committed: cold lock, durable first identity, matching authorized unwrap, memory-only handoff. Production administrator adapter remains absent from dev (#78); no plaintext fallback.
Head:
1e5910f75f. Evidence: evidence/ssh-bootstrap/run3/key-custody-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [3.99s]
Real Chromium same-origin fetch found GET omits Origin (origin:null, Sec-Fetch-Site:same-origin); POST sends the exact page Origin. Evidence: evidence/ssh-bootstrap/run3/public-key-browser-headers.log (disposable loopback browser/header fixture, TRACER_TEST_PORT=4787). A GET-only endpoint requiring pinned Origin would reject Settings' ordinary browser fetch. Additive contract correction: also accept POST /v1/bootstrap/ssh-key with empty body, identical owner/Origin/cookie checks and public-only no-store response. Keep strict GET available for nonbrowser callers supplying Origin; do not weaken Origin admission to repair browser compatibility.
Security finding for D183 key isolation: OpenSSH command-line IdentityFile=none and CertificateFile=none do not remove configured entries; they append. Public-only synthetic ssh -G fixture returned both none and /nonexistent/infraternal-fixture-identity (likewise certificate), evidence: evidence/ssh-bootstrap/run3/identity-precedence.log. No real credential/config store was inspected. A dedicated ephemeral ssh-agent alone therefore cannot guarantee that supplied-key authentication avoids configured system key files.
Implementation choice: resolve the trusted effective destination with existing bounded ssh -G/proxy refusal, then invoke the same system OpenSSH with an empty config and an explicit allowlist of public addressing, host-trust and crypto/network policy. Preserve known_hosts/revocation/cert-authority behavior; exclude identity/certificate/agent/provider paths. This keeps the existing engine and avoids copying credentials or rewriting system SSH config. Add parser and real-SSH regressions, and measure the D183 ordered-check overhead.
Custody tests committed: six real-crypto tests pass (0.36s targeted), covering durable first identity, concurrent start, wrong unwrap, corrupted storage, algorithm refusal, cold lock and update handoff. Evidence: evidence/ssh-bootstrap/run3/key-custody-targeted-tests.log.
Head:
28ee6abf53. Evidence: evidence/ssh-bootstrap/run3/key-custody-tests-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [3.70s]
UI-3 finding: integration run of the add-host adapter against the REAL server binary (musl build of ssh-bootstrap, HEAD
1e5910fplus its working tree, built 17:06). Harness: apps/tracer/test/addhost-real-server.mjs on branch canvas-addhost (starts the server on a free port with a throwaway data dir and a self-signed localhost cert, registers the owner through the real sign-in UI with a virtual passkey, then runs the product adapter in the signed-in page). No real host was contacted; no credential of the owner's was used.Verbatim result:
(serverKey is undefined and absent from the JSON: GET /v1/bootstrap/ssh-key is not mounted yet.)
What this proves: the wire format of start, the event stream (check -> failed/unreachable with the server's human text), the typed refusal of root without consent, and the 401/403 admission all match what the UI parses. What it cannot prove yet: any
authenticationevent,choose_method,done, because the default backend cannot sign in or enrol (as the contract's runtime-status section says).Finding fixed on the UI side: the server serves the web app (HTTP 200, text/html) for every unknown GET, so an unmounted endpoint such as /v1/bootstrap/ssh-key does not answer 404. The first run threw a JSON syntax error; the adapter now treats a non-JSON answer as "not available".
Open contract question for the ssh-bootstrap lane (D183 steps 3 and 4): the contract runs "the user's browser-unwrapped key" and "a password supplied once" as automatic steps, but gives the browser no way to hand the server a secret at the moment the server reaches that step (a credential reference must exist at
start). The UI therefore asks only afterchoose_method, mints a one-use reference (proposed POST /v1/bootstrap/credential) and starts a single-target batch with it. If you would rather have the server ask lazily over the socket (aneed-credentialevent answered by acredentialcommand), say so and the adapter will follow.Browser-compatible public key contract committed: POST and strict GET share owner/Origin checks. Real Chromium GET had no Origin; POST sent pinned Origin. Evidence: evidence/ssh-bootstrap/run3/public-key-browser-headers.log.
Head:
1fbeab2143. Evidence: evidence/ssh-bootstrap/run3/key-browser-contract-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [3.30s]
D168 custody race reproduced before fixing: a valid administrator unwrap can finish after an explicit lock and reinstall private material. Deterministic regression lock_during_administrator_unwrap_cannot_reinstall_private_material failed 0/1 in 0.03s (stale unlock must not win an explicit lock). Evidence: evidence/ssh-bootstrap/run3/key-lock-race-red.log; ssh_key_tests.rs:239. Fix in progress: capture/check a lock generation around unwrap and installation; every explicit lock invalidates earlier unwraps. Counter exhaustion remains permanently locked. Public identity and encrypted storage stay unchanged.
Custody lock race fixed and committed. Failing-first regression: 0/1 in 0.03s; all eight custody tests pass in the full gate. Lock generation invalidates in-flight unwraps, including permanent refusal at counter exhaustion. Evidence: evidence/ssh-bootstrap/run3/key-lock-race-red.log and key-lock-race-green.log.
Head:
6f303af916. Evidence: evidence/ssh-bootstrap/run3/key-lock-race-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [4.80s]
D183 connection-lifetime finding: OpenSsh Session::run currently spawns an independent SSH child for every command and forces ControlMaster=no/ControlPath=none. CredentialSession lives across those commands, so a browser-unwrapped key would be reused across multiple physical connections in one provisioning attempt (openssh.rs command/run). Before accepting transient retry credentials, retain one process-owned OpenSSH master per host attempt, with a private control socket, no ControlPersist, prompt/key helpers erased after authentication, and mux clients forbidden from reconnecting if that master disappears. No engine/library change. Existing rollback coordinates remain retryable with a fresh connection/credential. Measure direct vs scoped connection wall time and ten-target resource use, and run real-SSH lost-master/cleanup tests before claiming one-use scope.
Dev advanced to
4ab8ffce0c(canvas integration); #78 join/runtime/custody remains absent from dev. remote-agents isdb3c872077(renewal), still a separate lane. Refresh dev after the endpoint commit; keep conditional local #78 fixture work distinct from production proof.Authenticated public SSH key endpoint committed: strict GET/POST admission, public key/fingerprint/locked only, no-store on all statuses, 503 without custody. Source injection shares the runtime-owned identity; no system key/private load.
Head:
04403a6575. Evidence: evidence/ssh-bootstrap/run3/key-api-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [2.92s]
UI-3 finished. Branch canvas-addhost, head
bf5b412(dev4ab8ffcmerged in).Gate, scripts/verify fast (TRACER_TEST_PORT=4897), exit 0: Rust fmt/VT fmt/clippy/test/cargo-deny/static builds all PASS; tracer 57 bun tests pass (23 new in src/canvas/addhost), JavaScript transfer critical gzip 280601/307200 brotli 232639/256000, deferred gzip 47174/51200 brotli 40973/45056; protocol 7 pass. (An earlier run failed once in vt_credit.rs:22, the load-dependent probe the ssh-bootstrap lane already reported; it passed on rerun.)
Specs: test/addhost-wizard.spec.ts 20/20, mock window prototype specs 14/14. Captures: 84 PNGs in apps/tracer/captures/addhost-wizard (21 states x 1440x900, 393x852 x ink, paper), read against TASTE; fixes in
9a94558.Integration against the real server binary: see the earlier comment (test/addhost-real-server.mjs).
Needs the owner: wiring the wizard into product.ts (6 lines, kept as a patch) takes the deferred budget to 62,812 B gzip vs 51,200 (D188 limit); I left it out rather than change the limit. Until sessions/live.ts lists remote hosts (#78) the enrolled-host sink has nothing to open.
Also fixed on the way: base
bdfcad2was already red on the bundle budget because preview-only code shipped in production (dev has the same stub now).Public-key API admission tests committed. Real software-passkey matrix passes (1.06s), covering strict GET/POST, no-store, cold metadata, absent custody, duplicate Origin/Cookie, browser lock, owner demotion and logout; private load panics if called. Evidence: evidence/ssh-bootstrap/run3/key-api-targeted-tests.log.
Head:
4e12db3d10. Evidence: evidence/ssh-bootstrap/run3/key-api-tests-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [4.28s]
Dev refresh to
4ab8ffceis staged as a merge, without conflicts. First serial fast gate failed only repeated_tiny_credit_pauses_preserve_shell_progress (agent_review.rs; verify-agent-snapshot.py:48 assertion); fmt, clippy, licenses, static builds passed. Evidence: evidence/ssh-bootstrap/run3/dev-refresh-fast.log. Load average during retry: 15.58/21.11/20.72. Re-running unchanged with RUST_TEST_THREADS=1 before committing; no test budget/assertion changes.Completed conflict-free merge of dev
4ab8ffce. All fast gates passed unchanged on the serial retry; first-run terminal snapshot failure was reported separately. Dedicated SSH custody/API remains intact; no unrelated source edits.Head:
75b078da5c. Evidence: evidence/ssh-bootstrap/run3/dev-refresh-retry-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [4.26s]
Failing-first SSH configuration regression reproduced: configured_identity_paths_are_not_inherited_by_the_command_child failed 0 passed/1 failed in 0.10s (evidence/ssh-bootstrap/run3/config-isolation-red.log). Synthetic -G output names only nonexistent identity/certificate paths; no credentials were read. Fix uses empty child configuration plus bounded public-policy reconstruction, preserving canonical endpoint/trust and putting explicit credential options first. Real OpenSSH accepted reconstructed public known-host lists/host alias (public-options-roundtrip.log). Expanded parser tests/fuzz follow this fix.
Public-config isolation passed the real rootless sshd oracle, including strict unknown-key fingerprint refusal and helper cleanup: 1 passed/0 failed, 4.48s. infraternal-dev, 8 cores, load 55.73/35.88/25.58, CPUWeight=10000; evidence/ssh-bootstrap/run3/config-isolation-real.log. Read-only check preparation 72,711us, check 385,249us. Ten concurrent checks: local 753ms, controller peak 4,908KiB/owned SSH children peak 91,484KiB; 300ms profile 3,001ms, controller peak 4,940KiB/children 91,580KiB. These are transport correctness observations under shared build load, not full-server provisioning or a performance comparison. No installed infraternal agent/remote enrollment claimed.
Config-isolation fast gate again failed the unchanged repeated_tiny_credit_pauses_preserve_shell_progress test (verify-agent-snapshot.py:48), before the remaining Rust tests ran. fmt/clippy/cargo-deny/both static builds PASS. Evidence: evidence/ssh-bootstrap/run3/config-isolation-fast.log; three targeted SSH regressions and the real rootless sshd oracle PASS separately. No unrelated assertion/deadline changes. Serial unchanged retry running; shared load ranged 24.69 to 55.73 during build/tests.
Completed public SSH configuration isolation with failing-first regression. Targeted isolation/foreground/proxy tests 3 passed, real rootless sshd 1 passed/0 failed (4.48s), including unknown-key refusal and helper cleanup. Transport observations under shared load were posted separately; no full provisioning claim.
Head:
d5728942b4. Evidence: evidence/ssh-bootstrap/run3/config-isolation-retry-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [3.40s]
Public SSH policy validation: 3 production-parser tests pass (0 failures), covering excluded identity/certificate/provider paths, public trust and original-host tokens, malformed/duplicate/control-byte/oversized inputs, and refusal of an existing flattened quoted public filename. ASan production parser with workspace dependency versions: 4,948,495 executions/181s, max_len=65,537, no findings. Final pure-parser invariant source: 100,000 executions/4s, no findings. Earlier extra command-argument invariants ran 5,021,766 executions/181s with newer isolated dependencies; reported separately, not substituted for the version-matched run. CPUWeight=10000 on infraternal-dev; logs evidence/ssh-bootstrap/run3/public-policy-{tests,fuzz-locked,final-source}.log. Full fast gate running before the validation commit.
Local fixture prerequisite: direct Docker API access is denied at unix:///var/run/docker.sock; noninteractive sudo -n docker info succeeds, ServerVersion 29.8.2. No credential files were inspected and no daemon configuration changed. Container setup remains future work; this is availability evidence only.
Dedicated key interoperability check: production SshKeyMaterial::generate().credentials() was accepted by the real /usr/bin/ssh-add through CredentialSession; owned helper directory removed. No private file/argv material, no encoding/library change needed. Evidence: evidence/ssh-bootstrap/run3/server-key-interop-red.log (the pre-change oracle PASS, despite its reserved red filename). Full real-sshd generated Settings-public-key match remains in the ordered-auth integration step.
Dedicated generated key real-path fixture proof: StoredSshKey initialized once in memory SQLite with AES-GCM fixture vault, cold load refused, Settings public key installed only in the rootless fixture authorized_keys, administrator fixture unlock enabled the exact retained identity, and real sshd accepted CHECK_SCRIPT via that generated key at local and 300ms RTT. Helper directories removed. infraternal-dev, 8 cores, CPUWeight=10000, load37.58/26.12/22.93. Evidence: evidence/ssh-bootstrap/run3/server-key-real-identity.log; disposable probe under .scratch/run3/key-interop. This proves key/public-match interoperability, not production CA-envelope integration, installer/enrollment or terminal readiness. Parser-validation fast gate passed Rust tests/static sizes but caught clippy::assert_is_empty in the new fuzzer; replaced with equivalent assert_ne!, clippy now PASS, full gate rerunning.
Completed public-policy parser validation: 3 production unit cases pass; ASan 4,948,495 executions/181s, boundary65,537/no findings; final assertion100,000 executions/4s/no findings. Version/dependency details and generated server-key real-sshd proof were posted separately. Full fast gate PASS.
Head:
3e1eaa33e8. Evidence: evidence/ssh-bootstrap/run3/public-policy-validation-retry-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [3.00s]
D183 ordered-auth module precommit evidence: 4 controlled production-module tests pass/0 fail (0.01s), covering successful-method reporting/lazy later-secret exclusion, immediate stop on trust/network/remote-command failures, typed choose_method only after exhaustion, and failed-scope non-reuse/no mutating replay. Real inherited-agent regression now PASS (1/0,4.56s): network-only attempt refused the authorized ambient helper, explicit memory-only fixture key still authenticates; strict unknown-host-key refusal/cleanup pass. infraternal-dev,8 cores,CPUWeight=10000,load28.03/23.40/23.08; ten explicit-key checks local800ms/controllerpeak4900KiB/ownedchildren95964KiB,300ms2964ms/controller4932KiB/children95960KiB. These are transport observations, not whole-server adds. Logs auth-order-controlled.log/network-green.log. Full fast gate running; browser transient API remains deferred until one physical SSH connection/lifetime proof.
Failing-first physical-lifetime regression reproduced against real rootless sshd: two successive commands on the same production SshSession report different SSH_CONNECTION endpoints. 0 passed/1 failed,0.34s; evidence/ssh-bootstrap/run3/single-connection-red.log and .scratch/run3/single_connection.rs. infraternal-dev,8 cores,CPUWeight=10000,load16.82/21.13/22.45. This confirms the recorded one-connection gap before any browser-transient API is wired. Next transport slice will own one foreground nonpersistent master, erase auth helpers after authentication, and refuse reconnection after master loss; the regression also checks cleanup and lost-master behavior.
Completed ordered-auth module/network identity isolation. Controlled production module 4 passed/0 failed; real sshd inherited-agent regression1 passed/0 failed4.56s. Unknown-key refusal/cleanup and explicit-key local/300ms checks pass; transport-only scale/load observations posted separately. Physical one-connection regression remains red and browser-transient API is deliberately not wired yet.
Head:
c6b7f13257. Evidence: evidence/ssh-bootstrap/run3/auth-order-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [2.86s]
Failing-first no-prompt regression reproduced on an owned disposable controlling terminal. Production CredentialSession with an encrypted memory-only synthetic key and absent passphrase printed Enter passphrase for (stdin), then returned Install after its 10s helper deadline instead of Auth. 0 passed/1 failed,10.10s; no passphrase entered and owned helper scope retired. Evidence: evidence/ssh-bootstrap/run3/missing-phrase-red.log; production test draft .scratch/run3/ssh_askpass_red.rs and controlling-terminal harness .scratch/run3/tty_test.py. Fix will force the private askpass path even when the passphrase is absent, yielding an immediate content-free authentication refusal. No browser transient API has been wired yet.
Completed six registered ordered-auth cases: lazy successful-method reporting, stop-on-trust/network/command faults, exhaustion, no mutation replay/failed-scope reuse, cancellation and no restart after later command failure.6 passed/0 failed0.02s; fast gate PASS. Missing-passphrase controlling-terminal regression red0/1,10.10s and physical-connection red0/1,0.34s are the next transport fixes, already recorded with evidence.
Head:
abfd733260. Evidence: evidence/ssh-bootstrap/run3/auth-order-tests-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [5.83s]
Missing-passphrase fix real CLI proof: disposable controlling-terminal regression now1 passed/0 failed0.07s, with no operator prompt; before fix0/1,10.10s and visible prompt. Supplied private-pipe password/encrypted-key handoff2 passed/0 failed0.33s; clippy PASS. Evidence: missing-phrase-green.log,askpass-supplied-green.log,missing-phrase-clippy.log. First full gate stopped before Rust at existing latency-relay selftest p50=319.59ms/p99=378.64ms, outside the300ms profile bound (missing-phrase-fast.log); unchanged gate retry running, no jitter/budget relaxation.
UI-3 update, head
0bf00d0(canvas-productf2041aamerged).Done: wizard is a
flowwindow kind (cx.win.openFlow, next to the focused window, never saved, closes itself when done; closing it from its frame cancels the run); its code is on demand (add-host.on-demand.ts, loaded with onDemand() from index.ts); mounted in product.ts with the real adapter. Also fixed a canvas bug it exposed: a click on the last fully visible window was swallowed by the tap-a-neighbour rule (gestures.ts,0c52881).Budgets (production build, measured): critical gzip 281,833/307,200 brotli 233,856/256,000; deferred gzip 50,066/51,200 brotli 43,889/45,056; on demand gzip 16,233/20,480 brotli 14,407/18,432. The on-demand limit was 11/10 KiB, based on an estimate of about 6 KiB for the wizard; it measures about 14 KiB. I raised it to 20/18 KiB by the deferred rule in its own commit (
206ec6b, marked PROPOSED) for you to keep, tighten or revert.Gate: scripts/verify fast was exit 0 on the previous commit (Rust all PASS, tracer 58 tests, three budgets above). On the last commit the Rust
testrow failed only in vt_credit.rs:22 (credit probe) at machine load average 53; the TS gate, run by hand on the same commit, passes: tsc, 57 bun tests, budgets.Plain-words pass (#112), before -> after:
The mock window prototype now takes its failure wording from the same guideFor. My close confirmation is inline, not the shared confirm: it names no anchor to attach to.
Physical-connection prototype: real rootless sshd regression changed from 0/1 in 0.34 s (different SSH_CONNECTION endpoints) to 1/0 in 0.30 s. Two commands reuse the same authenticated connection; signing/prompt helpers are removed before commands; closing the master refuses another login and drop removes the scope. Evidence: evidence/ssh-bootstrap/run3/master-candidate-real.log; infraternal-dev, 8 cores, CPUWeight=10000, load 32.18/28.73/30.90. Prototype remains scratch pending production tests/gate.
Missing-passphrase full gate retry passed fmt/clippy/deny/static but failed the pre-existing repeated_tiny_credit_pauses_preserve_shell_progress oracle (scripts/verify-agent-snapshot.py:48); unchanged serial retry is running, with no assertion/budget change. Evidence: missing-phrase-retry-fast.log; static sizes x86_64=16350128, aarch64=13758336 bytes.
Completed missing-passphrase no-prompt fix and controlling-PTY regression. Red 0/1 at 10.10 s; green 1/0 at 0.07 s without a prompt; supplied credential pipes 2/0 at 0.33 s. Static x86_64=16350128, aarch64=13758336 bytes. Full unchanged serial retry green; no limits changed.
Head:
04be134011. Evidence: evidence/ssh-bootstrap/run3/missing-phrase-final-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [4.52s]
Production-path connection prototype tests: one_physical_connection_erases_helpers_and_refuses_reconnect PASS1/0,0.42s; actual_ssh_authentication_check_and_strict_host_key_rejection PASS1/0,4.63s. Network-only rejects ambient agent; supplied key works; unknown host key fails with observed fingerprints; scopes removed. Public-policy/foreground/proxy/helper tests5/0. Machine infraternal-dev,8cores,CPUWeight10000,load18.59/25.53/28.03. Ten concurrent read-only checks: local369ms,300ms profile982ms; controller peak5020/5032KiB, owned SSH children peak92896/92800KiB. These measure ten commands on one connection, NOT ten complete server provisioning runs or comparative performance. Logs evidence/ssh-bootstrap/run3/master-{production-real,authentication-real,policy-final}.log. New master module gated separately before activation to preserve atomic module history. No new engine/dependency, no host trust changes.
Local container infrastructure proof: disposable Debian13 image (base sha256:a29215f6a35e51e22adffa17f89e9d2ef06214e64a2bad10d765c46aea49f11f) built with ten normal users uid1101–1110 and package-created SSH host keys suppressed. No host directory mounts. Default read-only cgroup startup exited255; private cgroup namespace plus a container-only remount allowed actual systemd257.13 startup in768ms. Nonroot fixture1 systemctl --user show --property=Version --value returned257.13-1~deb13u1 (container-user-systemd.log). Own trial container stopped/removed; no infraternal binary installed, no SSH listener or remote enrollment proof yet. Image retained for the complete local fixture and will be removed afterwards. Evidence under evidence/ssh-bootstrap/run3/container-*.log.
Owned-master module gate: fmt/clippy/deny/static PASS; test FAIL101 in existing unaffordable_repaints_park_until_sufficient_credit (vt_credit.rs:22, t1-gate-approximate-1). Module is not activated yet; transport/credentials/runtime remain unchanged from green04be134. Static sizes unchanged16350128/13758336 bytes. Raw master-module-fast.log. Unchanged serial full gate retry running; no assertions, deadlines or size limits changed. Local container infrastructure trial was stopped/removed. No production host contacted.
Completed owned foreground-master module separately from transport activation. No new dependency or persistent/background master; unreaped leader retained until group retirement, bounded zeroizing diagnostics, private socket checks and no healthy polling. Real prototype reuse/loss/helper-erasure PASS1/0 at0.42s. Static sizes unchanged16350128/13758336 bytes. Unchanged full serial gate retry green.
Head:
93d8d51ff0. Evidence: evidence/ssh-bootstrap/run3/master-module-retry-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [4.23s]
Additive UI contract proposal before implementation (D183; no wire-frame changes): retry may optionally contain auth_once:{key?,passphrase?,password?}, only on a failed target in this socket's batch, with the existing32KiB total-message bound. These browser-unwrapped/typed bytes are never persisted, logged, serialized in events or reused by another attempt. Material is consumed lazily in network/server-key/user-key/password order, erased when unused, and expires while queued. Replay and ordinary retry contain no plaintext material. Successful check and later phase events add public authentication metadata; host_id becomes available after invitation binding.
First-contact confirmation will echo a displayed SHA256 fingerprint for one failed target, preserving its exact effective endpoint/public config. Existing known_hosts entries and previously confirmed pins always prevent approval of a changed/revoked key. Scan output remains untrusted observation until this explicit authenticated confirmation; no automatic TOFU, no system-known_hosts rewrite and no production o1 confirmation in this job. Public pins record approving owner/time. Tests will cover revoked sessions, wrong/expired fingerprint, changed existing trust, cross-target/socket scope and connection loss. #78's join JSON remains unchanged; custody/startup hook uses its CA-style administrator envelope boundary, with no ordinary-session automatic unlock.
Completed single-connection transport activation and failing-first real-sshd regression. Helpers erased before commands, no implicit TCP fallback after master loss, strict trust retained. Reuse/loss PASS1/0 at0.42s; authentication/unknown-trust PASS1/0 at4.63s; policy/helper tests5/0. Static x86_64=16389232 (+39104), aarch64=13789120 (+30784) bytes versus04be134, within unchanged budgets. Full serial fast green.
Head:
c025cc180b. Evidence: evidence/ssh-bootstrap/run3/master-activation-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [3.93s]
Owned-connection before/after release comparison:93d8d51 transport versusc025cc1, same system OpenSSH engine/fixture/key,25 alternating pairs per profile; no own compilation overlapped measurement. Machine infraternal-dev/8cores/CPUWeight10000/startload15.58/29.25/31.73. Local first-command p50/p99:before150.183/267.467ms,after158.908/247.499ms; two commands271.879/426.365 ->176.498/271.557ms.300ms RTT first2583.833/2670.262 ->2611.797/2680.577ms; two commands5115.436/5237.205 ->3273.698/3340.256ms. First-command median increases8.725ms(local)/27.964ms(300ms), while two-command median falls95.381ms/1841.738ms (35.1%/36.0%). Startup phase boundaries move authentication into open, so preparation alone is not comparable. D183 requires one connection and erasure of one-use signing/prompt helpers; reuse saves later authenticated command round trips. p99 is maximum of25 samples, not a reliable tail estimate; functional rootless-sshd fixture, not o1 or full provisioning. Scope cleanup assertion passed. Raw evidence/ssh-bootstrap/run3/connection-perf.log; static increment39104/30784 bytes already recorded.
Shared-key runtime source gate: fmt/clippy/deny/static PASS; existing Snapshot-credit oracle failed at scripts/verify-agent-snapshot.py:48 after two successful12MiB catches. Source changes are only server startup/default auth; infraternal-agent/shim/probe source unchanged. Raw key-runtime-fast.log; x86_64=16433968 and aarch64=13826160 bytes, both below unchanged maxima. The preflight clippy and pending-runtime targeted test1/0 passed. Unchanged serial full retry running; no gate assertions, deadlines or budgets altered. Configured-startup/Settings cold-lock shipping-path test prepared for a separate test slice after source gate.
Completed configured first-start dedicated-key custody hook, cold-load/Settings source sharing and default ordered authentication. Ordinary owner login does not unlock; live owner capability is rechecked before key export; vault selectors no longer block earlier methods. #78 administrator-envelope adapter remains absent fromdev; configured custody interface is the explicit D168 fallback. Clippy/pending-runtime1/0 and unchanged serial fast retry green. Static16433968/13826160 bytes.
Head:
6d20521ed4. Evidence: evidence/ssh-bootstrap/run3/key-runtime-retry-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [3.63s]
Configured custody/startup and fresh key-export tests are committed. Six selected real-auth/key tests passed in 4.51s; ordinary owner login stays cold-locked, restart retains the public identity, and revoked/locked/expired/deleted sessions cannot export. Static sizes remain x86_64 16433968 / aarch64 13826160 bytes. Production administrator wrapping/unlock still requires the #78 adapter; no plaintext fallback was added.
Head:
5b2cdfe88b. Evidence: evidence/ssh-bootstrap/run3/key-tests-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [2.75s]
Public provisioning events now retain the successful authentication method and trusted invitation host UUID, scoped to the attempt. A deterministic regression passes (1/1): unsupported compatibility preserves authenticated method evidence; a failed retry has no stale method/host metadata; old replay stays immutable. Workspace clippy passes. Evidence: event-metadata-tests.log / event-metadata-clippy.log under evidence/ssh-bootstrap/run3/.
Measured release Rust Event layout: before 160 bytes (
93d8d51), after 176 bytes. Increment is 16 bytes × 1024 retained events = 16384 bytes per maximum history, × 16 maximum batches = 262144 bytes. This excludes the separate bounded current metadata map (at most 100 target rows per batch) and existing string/vector allocations. No credentials/providers enter history. Evidence: event-layout.log / event-layout-build.log. Full fast gate is running; this is not complete provisioning or whole-server memory evidence.The first event-metadata full fast gate failed in the unchanged standalone VT credit test: crates/infraternal/tests/vt_credit.rs:22, marker t1-gate-approximate-1 (0/1, 8.38s). The event regression passed separately (1/1), workspace clippy and both static builds passed. Retry began with unchanged code, assertions and thresholds at load 31.87 / 28.56 / 27.40 on infraternal-dev (8 cores). No causal claim or test-budget change. Evidence: evidence/ssh-bootstrap/run3/event-metadata-fast.log; retry: event-metadata-retry-fast.log. No source commit until a full green gate.
Public per-attempt authentication and trusted invitation UUID fields are committed. The unchanged full-gate retry passed, including the VT credit test that failed at t1-gate-approximate-1 in the first run. Static sizes: x86_64 16440880 / aarch64 13831664 bytes. Event layout grows 160 to 176 bytes (16 KiB per maximum history; 256 KiB across 16 batches), excluding the bounded current target map. Separate replay/reset regression passed 1/1; its formal test commit follows.
Head:
7e7f69e8d7. Evidence: evidence/ssh-bootstrap/run3/event-metadata-retry-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [5.18s]
The allowed two-process local #78 component fixture passed 1/1 in 1.61s, using snapshot remote-agents
1f6e39b8cband exclusive port 4787. It performed real pinned HTTPS invitation redemption, mutual-TLS registration, browser-to-PTY I/O and foreign-owner refusal. A fixture-only native host.facts action returned authenticated Linux/x86_64, uid 1001, 8 CPUs, version 0.1.0; uid matched the executing user. Fixture-only enroll-only shaping preserves contracts/remote.md's invitation JSON.Printed join/terminal/facts boundary: 885636us (includes the facts query after first terminal open); canary keystroke round trip: 9047us, output_bytes=352, lost=0, duplicated=0. Machine infraternal-dev, 8 cores, CPUWeight10000; load 32.01 / 30.12 / 28.76; debug build; not a performance budget claim. Exact OpenSSL 3.6.3 GNU archives were reused from this job's existing target after both lockfiles matched openssl-src 300.6.1+3.6.3 / openssl-sys 0.9.117.
Evidence: evidence/ssh-bootstrap/run3/remote-component-proof.log / remote-fixture-build-cached-ssl.log. This validates components only: full SSH installation/service activation/removal and ten-target server measurements remain. No o1 access, no container presently running, and no production administrator custody adapter was added. #78 remains absent from dev.
The separate formal event-test commit is pending an unchanged full-gate retry. Its first gate failed in the existing VT reconnect harness: vt_reconnect.rs:20, 0/1 in 45.89s. The specific harness assertion is verify-vt-reconnect.py:43, "emitter did not finish detached output", while running the less case after the wrapped cases and less replay checks passed. Both static builds, clippy and cargo-deny passed. No thresholds or assertions changed. Evidence: evidence/ssh-bootstrap/run3/event-tests-fast.log and target/review-vt2-fixes/reconnect.stderr.log. Retry: event-tests-retry-fast.log.
The unchanged formal event-test gate retry again failed in the existing VT reconnect harness (0/1, 36.87s), this time at verify-vt-reconnect.py:115: "legacy Snapshot rejection must leave daemon live". It is a different assertion from the preceding detached-emitter deadline. No source or thresholds changed; all other gate columns passed. A further unchanged full gate is running (event-tests-final-fast.log). Machine load before that run: 37.29 / 39.36 / 35.47 on 8 cores; evidence event-tests-retry-fast.log and target/review-vt2-fixes/reconnect.stderr.log. This does not implicate or exonerate the SSH feature; no causal claim is made. The formal test remains uncommitted until a full green gate.
Additive D183 wire refinement before implementation: Start may supply per-target one-use material as auth_once:[{"target":"host-1","auth":{"key":"","passphrase":"","password":""}}]. Retry retains auth_once:{key?,passphrase?,password?}. Start validates every target/material pair, membership and uniqueness before scheduling any connection; absent material preserves the existing request.
Each input is transferred only to its target's attempt future, never Target/HostState/history/SQLite/logs or another connection. Existing 32 KiB request/frame bounds, lazy network/server-key/user-key/password order, private pipes, helper retirement and 60-second queued-input expiry apply. Earlier success erases unused material. This lets an already-unwrapped browser key participate in the first attempt and avoids an extra network/server-key retry. Per-target inputs preserve the one-connection boundary; the server does not retain a shared plaintext key for a batch. No new engine, storage policy or interactive prompt is selected.
With this job's other build finished, the next unchanged formal-test fast gate failed in another existing terminal test: repeated_tiny_credit_pauses_preserve_shell_progress, agent_review.rs:13 (suite 5 passed / 1 failed, 104.42s). All other gate columns passed. No SSH source/test or terminal assertions/thresholds changed. Machine load observed afterwards: 78.95 / 71.01 / 61.48 on 8 cores. Evidence: evidence/ssh-bootstrap/run3/event-tests-idle-fast.log. The SSH source remains at green-gated
7e7f69e; the separate event regression remains uncommitted. Work continues on isolated local installation fixtures; a fresh green full gate is still required before the pending test commit/final completion.The real two-process local fixture now reaches the production bootstrap WebSocket, authenticates with the dedicated server key and receives a #78-bound invitation. The first actual installation attempt fails at 2291 ms after entering install at 406 ms; test 0/1 in 2.65 s. Evidence: evidence/ssh-bootstrap/run3/provision-cli-red.log. Inspection finds the installer invokes
agent join URL --state STATE, while #78's CLI requiresagent --data DATA join URL; a join that remains foreground would also prevent unit activation. Testing the compatible enrollment-only command and explicit daemonrunin the disposable snapshot before changing production source. This is a failing real-engine regression, not an end-to-end success claim.Real rootless local target passed through the authenticated production bootstrap WebSocket plus source-identical #78 invitation/join/mTLS registry/browser terminal fixture (remote snapshot
1f6e39b). Target execution uid 1101, dedicated server-key authentication, container user systemd service. Cumulative per-host events: check start 0 ms, install 366 ms, authenticated facts 2557 ms, terminal connect 2593 ms, done 2717 ms; test 1/1 in 3.20 s. Evidence: evidence/ssh-bootstrap/run3/provision-cli-green.log. The required compatible enrollment-only CLI flag and native host.facts handler are fixture additions pending #78 integration; this is not production dev integration. Normal uid 1101 then disabled/stopped the marked service and removed its unit, launcher and private installation: installation_absent/unit_absent/launcher_absent all true (provision-removal.log). Next: ten disposable user targets and whole fixture server CPU/RSS.After the local rootless installation/enrollment/terminal/removal passed, inspected only the server account's effective public OpenSSH endpoint and known_hosts trust for o1. Effective endpoint o1:22, user kayg; existing_public_trust=false. Evidence: evidence/ssh-bootstrap/run3/o1-public-trust.log. Per the brief, stopped the o1 path before any connection or installation. No SSH host key was accepted, changed or written. Owner-provided verified trust for o1 is needed before that host can be provisioned. Continuing the remaining API, fixture scale, contracts and gates locally.
Ten actual normal-user targets (uids 1101–1110) passed production bootstrap WebSocket → real SSH/rootless user unit → pinned #78 enrollment/mTLS → native authenticated facts → browser PTY → done. Same two-process snapshot fixture, infraternal-dev 8 cores, CPUWeight10000, default eight active attempts; the two queued hosts include admission in check timing. Debug controller/test process, 10 ms RSS sampling, excludes external SSH/target children; other work/full gate on the shared machine remained active, so these are diagnostics, not release budget acceptance. Batch 9153 ms; peak server RSS 46740 KiB (45.64 MiB total / 4.56 MiB per target as aggregate arithmetic, not marginal memory); server CPU 1491 ticks at 100 Hz = 14.91 s. Load 10.99/9.43/15.56. Evidence: evidence/ssh-bootstrap/run3/provision-ten.log and provision-ten-times.md. All ten exact marked installations, units and launchers removed by their normal uid before fixture teardown; test 1/1 in 14.25 s.
PROVISION_SCALE targets=10 concurrency_limit=8 elapsed_ms=9153 peak_server_rss_kib=46740 server_cpu_ticks=1491 clk_tck=100 load=10.99 9.43 15.56 17/1767 694110
Committed the deterministic retry-event regression: unsupported authenticated check retains server-key evidence; later pre-auth failure resets current metadata; immutable replay retains earlier evidence. Test 1/1 in 0.00 s. Prior unchanged full-gate failures are recorded separately; this full retry passes.
Head:
f658b2d252. Evidence: evidence/ssh-bootstrap/run3/event-tests-low-load-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [2.94s]
#87 local two-process rootless provisioning fixture exposed a CLI integration mismatch before production source changes. Proposed additive CLI boundary:
infraternal agent --data DATA join URL --enroll-onlyconsumes the existing invitation JSON on stdin, persists pinned enrollment identity and returns without starting the foreground daemon. The installer then activatesinfraternal agent --data DATA --state SESSIONS runas the normal-user service.--enroll-onlyis additive; ordinary join retains its current foreground behavior. The exact #78 invitation/remote wire shapes remain unchanged. Isolated snapshot1f6e39bplus this fixture addition passed actual installation, pinned mTLS, native facts and browser PTY on ten uids; all marked installations removed. Evidence on #87: provision-cli-red.log (failing first), provision-cli-green.log and provision-ten.log. Production dev still lacks #78; owner/runtime integration must provide this boundary before production provisioning can be enabled.Installer correction: rollback tests 10/10 in 0.29 s and actual local/ten-target provisioning+removal pass. First complete scripts/verify fast attempt failed in unchanged VT credit test:
credit probe failed: t1-gate-faithful-1, 0/1 in 8.01 s; all other Rust gate columns PASS. Evidence: evidence/ssh-bootstrap/run3/install-cli-fast.log. No terminal assertions or budgets changed. Retrying the identical installer source with cached static builds; correction remains uncommitted until full green.Prepared additive per-target Start and per-host Retry one-use credential input. Tested through the real authenticated bootstrap WebSocket against the #78 two-process fixture with dedicated server custody explicitly locked: supplied browser-side user key selected
user-key, installed/enrolled/queried native facts/opened browser PTY and removed installation, 1/1 in 5.47 s (done 3785 ms). Retry fixture: attempts 1 and 2 without material returned typed auth choose_method; attempt 3 with fresh one-use user key passed complete provisioning/removal, 1/1 in 3.82 s. Evidence: evidence/ssh-bootstrap/run3/provision-user-once.log and provision-retry-once.log. Private key only entered JSON/TLS and scoped helper stdin, never files/argv/logs; replay events contain public method metadata only. Unit consumption/expiry/input validation 2/2 in 0.00 s (once-draft-tests.log). Production activation is not committed yet: earlier installer correction must pass its own full gate first.Prepared once-only password fallback passed through the real bootstrap WebSocket, OpenSSH/private askpass pipe, normal-user unit, pinned #78 enrollment, authenticated native facts and browser PTY. Dedicated server key was cold-locked; no user key was supplied; selected method password. Cumulative done 2426 ms; test 1/1 in 3.25 s. The normal uid then disabled/stopped/removed the exact marked installation/unit/launcher (all absence checks true). Evidence: evidence/ssh-bootstrap/run3/provision-password-once.log. Fixture password generated in memory and set only in the disposable target through chpasswd stdin; target stores its ordinary password hash, never plaintext. Server-side credential input never enters files, argv, replay or SQLite. No production activation claim yet.
Installer unchanged full-gate retry failed in the unrelated tiny-credit snapshot assertion
len(client.snapshots) == count and client.out == cursor, agent_review 5 passed/1 failed in 129.44 s; other Rust gate columns PASS. Evidence: install-cli-retry-fast.log. Identical-source third full attempt running; no test assertion/deadline/budget changes.Committed compatible staged enrollment and explicit live user-service CLI, keeping identity and shim state separate. Rollback tests 10/10 in 0.29 s; real local and ten-user installation/enrollment/facts/browser terminal/removal passed. Earlier unchanged VT failures are recorded separately; this complete retry passes. Both static binary sizes remain 16440880/13831664 bytes.
Head:
8673266563. Evidence: evidence/ssh-bootstrap/run3/install-cli-final-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [3.23s]
Before implementation: additive first-contact trust request/response proposal. A host-key failure may include a public
host_key_challengeUUID plus already observed SHA256 fingerprints only when no existing configured trust or dedicated pin matches that effective endpoint.{"action":"confirm-host-key","target":"host-1","challenge":"<UUID>","fingerprint":"SHA256:..."}is bound to the same authenticated socket/batch/failed target. Re-resolve and bind effective endpoint/alias/port/public policy; recheck the exact live owner capability immediately before recording the public pin in private server data. Successful acknowledgement{"host_key_confirmed":{"target":"host-1","fingerprint":"SHA256:..."}}; UI explicitly retries. Never write system known_hosts, trust a caller-supplied key, overwrite a recorded pin, or allow this action for changed/revoked/already-known keys. Bounded short-lived pending public observations, cleaned on access without idle timers. Wrong/foreign/expired challenge, changed configuration and logout refuse. Existing request/event shapes remain valid without these additive fields.Corrected fixture cleanup finding: earlier
REMOVEDlines proved installation/unit/launcher absence, but their shallow JSON glob did not prove shim/shell retirement. A /proc status/comm-only check (no argv/credentials inspected) found live canary processes in the disposable container. The canary input sequence length is 27 bytes and was correct; the actual issue was closing the browser socket immediately after sending exit, before upstream delivery/exit acknowledgement, plus intentionally retained exited shims. Removed the exact owned old container to retire its leftovers; no host account/service changed.Added failing real lifecycle assertion first: provision-removal-red.log, 0/1 in 5.41 s,
fixture still has live canary shims/shells. Fixture now awaits this session's terminal.exited status 0 before closing, then reuses repository scripts/agent_fixture.py authenticated-rendezvous cleanup after stopping the exact host-marked daemon. Recovery removal reports uid1101 installation/unit/launcher absent AND live_canaries=0 (provision-red-recovery-removal.log). Rerunning local and ten-target evidence with this stronger check before final acceptance. Prior timing numbers remain diagnostics for their recorded earlier boundary.Committed bounded input-only Secret decoding: 24576-byte maximum, owned strings transfer into the existing zeroizing buffer, no Debug/Display/output serialization. Isolated bounds/type/diagnostic test 1/1 in 0.00 s. First unchanged VT-credit gate failure is recorded; complete identical-source retry passes.
Head:
ba68f811ad. Evidence: evidence/ssh-bootstrap/run3/secret-input-retry-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [4.07s]
Stronger ten-target lifecycle run did not pass: nine reached done; local-2 remained at connect (14334 ms) and the fixture timed out after 233.23 s, with no final failure/done event for that host. Evidence: evidence/ssh-bootstrap/run3/provision-ten-lifecycle.log. The fixture now waits for actual terminal.exited before browser close, unlike earlier diagnostics. Adding public per-session opened/marker/exited/closed instrumentation to locate the stall; no timeout/budget/engine assertions loosened. All ten exact bound installations then removed by their normal uid through authenticated-rendezvous cleanup: installation/unit/launcher absent AND live_canaries=0 for every uid1101–1110 (provision-ten-recovery-removal.log). This failed run is not acceptance evidence.
Formal private-input decoder tests full gate failed in unchanged VT credit
t1-gate-approximate-1, 0/1 in 8.47 s; every other Rust gate column PASS (secret-input-tests-fast.log). Same-source retry running; formal test remains uncommitted.Stronger instrumented local ten-target lifecycle run passed: every host reached actual canary marker and terminal.exited status0 before browser close; all ten exact marked installations then removed as normal uid with installation/unit/launcher absent AND live_canaries=0. Source fixture at pinned #78 plus current prepared API/transport overlays; protocol client, not a browser rendering test. Debug diagnostic run, infraternal-dev 8 cores, CPUWeight10000; excludes helper/target process CPU/RSS. Test 1/1 in 23.37 s. Evidence: evidence/ssh-bootstrap/run3/provision-ten-instrumented.log and provision-ten-lifecycle-times.md. The earlier stalled run remains separately recorded; instrumentation did not loosen any deadline/assertion.
PROVISION_SCALE targets=10 concurrency_limit=8 elapsed_ms=14558 peak_server_rss_kib=47900 server_cpu_ticks=2124 clk_tck=100 load=14.90 14.15 17.98 24/1791 1396457
Merged dev gate stability #118. Sole auth test conflict retains crate-visible serialization plus upstream FrozenSocketTime. Fast gate green: server 132 passed, native credit and fidelity green; static x86_64 16440880 bytes, aarch64 13831664 bytes.
Head:
ff027512f7. Evidence: evidence/ssh-bootstrap/run3/dev-refresh-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [2.38s]
First-contact draft real-sshd oracle: initial repeated scans eventually returned no public key (host-trust-real.log, host-trust-diagnostic.log). Same source passes with PerSourcePenalties=no explicitly in the disposable rootless fixture: 1/1 in 2.87 s (host-trust-unpenalized.log). Checks: revoked confirmation authority and foreign target produce no pin; existing normal, CA and revoked records refuse confirmation unchanged; explicit confirmation authenticates a command; replay refuses; a later configured revoked record refuses pin use without changing it. No production SSH policy changed; missing observations continue to fail closed. Diagnostic machine infraternal-dev 8 cores, CPUWeight10000, load recorded in log. Draft not yet activated in root production. Latest #78
cfe80534states join/invitation shape unchanged; #78 still absent dev.Real first-contact draft regression: HostKeyAlias on a nondefault port must be queried verbatim, not [alias]:port. Existing @revoked fixture-alias wrongly produced a first-contact challenge before fix (host-trust-alias-red.log: 0/1, 1.66 s). Correct lookup passes entire real-sshd oracle (host-trust-alias-green.log: 1/1, 2.04 s); no pin written for existing alias. Draft remains isolated, not root activation.
Pending private-input decoder full gate failed unchanged user_scope_survives_parent_unit_stop: shim socket No such file or directory at crates/infraternal/tests/shim.rs:106; 6 passed/1 failed, 16.89 s. Other Rust columns PASS; secret-input-tests-dev-fast.log. Same-source full retry starts; no assertions/budgets changed.
HostKeyAlias draft corrected after failing real-sshd test: alias on nondefault port is the full lookup, never [alias]:port. Red 0/1 in1.66 s, green1/1 in2.04 s with actual revoked alias and no pin publication (host-trust-alias-{red,green}.log). All prior authority/replay/CA/revoked/command/immutable-pin cases remain green. Production draft still not activated. Initial challenge-absence failure was fixture source-penalty behavior, not a missing normal first-contact implementation; explicit PerSourcePenalties=no is confined to disposable research fixture. No production SSH trust policy loosened.
Same-source decoder test gate retry failed unchanged auth::tests::socket_tests::expired_handshake_releases_user_permits at socket_tests.rs:151: before-deadline seventeenth socket did not yield HTTP503. Server131 passed/1failed/10ignored in115.79s; all other Rust gate columns PASS. Evidence secret-input-tests-dev-retry-fast.log. Decoder focused test green; no pending source committed. Running direct handshake regression and another full same-source gate; no budgets or assertions changed.
Additive native facts contract proposal (D145,D156): authenticated control stream action host.facts, empty JSON object only, request <=256 bytes; no arrays, fields, network scans, listeners or workloads. Return bounded cheap platform facts {os,arch,execution_uid,version,logical_cpus}; server must bind response to invited host/uid and actual authenticated remote channel, not caller-selected identity. Existing frozen frames and join/invitation shape unchanged. Reuse native OS/std queries and existing serde/nix; no library/engine choice. Current isolated fixture red test proves derived empty structs accept [] (facts-input-red.log:0/1), corrected explicit map visitor passes (facts-input-green.log). Source module, dispatch, formal tests and parser fuzz are separate gated steps before root activation.
Formal private-input decoder test committed: bounded string-only admission and content-free oversized error; focused1/1 in0.00s. Full gate green after recorded unrelated failures; direct unchanged handshake test1/1 in0.87s.
Head:
92339d61d5. Evidence: evidence/ssh-bootstrap/run3/secret-input-tests-dev-final-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [2.82s]
Completed auth-once-provider; optional private input never enters public history. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
440fd2c1be. Evidence: evidence/ssh-bootstrap/run3/auth-once-provider-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [2.73s]
One-use provider source committed440fd2c1 with green fast. Formal test slice gate failed unchanged t1-gate-faithful-1 at initial terminal.open, before credit assertions: terminal open refused (auth-once-tests-credit-stderr.log; fast0/1 in9.94s). Isolated same-binary startup diagnostic20/20 passed, observed339.672–387.836ms (terminal-open-diagnostic.log), CPUWeight10000; diagnostic did not record initial load and is not budget acceptance. Cause of intermittent startup refusal remains unconfirmed. No readiness deadline or assertions changed. Formal test slice uncommitted; full same-source retry starts.
Three formal one-use tests committed; consumption, expiry, type/bounds, prompts and unknown/caller-clock fields. Full retry green; earlier unchanged terminal-open refusal remains unconfirmed with20/20 isolated starts green.
Head:
440fd2c1be. Evidence: evidence/ssh-bootstrap/run3/auth-once-tests-retry-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [3.22s]
Correction: previous update claimed test commit before a missing message file prevented git commit. Now committed three formal tests against the same green full gate. Earlier terminal-open refusal remains unconfirmed;20/20 isolated starts passed.
Head:
27d6d00d52. Evidence: evidence/ssh-bootstrap/run3/auth-once-tests-retry-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [3.22s]
Pending one-use runner slice: full fast tests/static builds passed, but Clippy rejected run107/100 lines. Extracted bounded lazy credential resolution and grouped installation/host rollback handles as one attempt-owned resource state; no lint waiver or auth/cleanup policy change. Direct plugin all-targets Clippy passes1.44s (auth-once-runner-clippy.log). Full retry starts; no pending runner/API commit yet.
Bound one-use material to selected attempts and 60-second queue/resolution waiting; attempt-owned resources preserve rollback/retirement. Full gate green; direct plugin Clippy1.44s. No plaintext retained in batch/history or reused by retry.
Head:
037bf12b1c. Evidence: evidence/ssh-bootstrap/run3/auth-once-runner-retry-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [2.88s]
Completed auth-once-api; optional private input never enters public history. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
3f93d28d00. Evidence: evidence/ssh-bootstrap/run3/auth-once-api-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [3.86s]
Trust schema remains uncommitted: Clippy/static builds passed, but unchanged vt_reconnect failed its legacy Snapshot/Ping ordering assertion (0/1, 15.43s; trust-schema-fast.log and preserved trust-schema-reconnect-{stdout,stderr}.log). Earlier wrapped case passed; less case reached approximate recovery before the assertion. Cause is unconfirmed; no VT code, budget, deadline or assertions changed. Same-source full gate retry follows.
One-use SSH admission ASan fuzzer completed 8,676,141 executions in181s, peak RSS520MiB, max_len32768, no findings/artifacts. Five synthetic seeds; exact current production decoder/provider and standalone copy of the forthcoming workspace target. CPUWeight10000/nightly2026-09-30, log ssh-one-use-fuzz.log; gate compilation/other jobs overlapped, not a performance acceptance measurement. No actual credentials entered the corpus.
Additive manual-install proposal for D183, before implementation: a failed socket-owned target may request a rootless manual plan with explicit execution uid and architecture. Trusted backend authorization issues the existing #78 host-bound 900-second invitation; no fake SSH Check is used. The public one-line command downloads an artifact and detached signature from the trusted configurable release catalog and verifies the embedded/catalog release public key before execution (D184/D185); the invitation is separate, read quietly and passed only on stdin. Reuse Installation transaction scripts, including rollback, instead of duplicating install logic. The server waits for authenticated native facts and the terminal canary, then commits through the enrolled host control path; socket revocation/cancellation cannot authorize commit. The target rolls back a bounded unacknowledged transaction.
Production dependency: dev has no signed release/catalog implementation; #102 records D184/D185 but currently has only the owner signing/source decision. Default backend must refuse before invitation issuance or mutation until that trusted adapter exists. Fixture artifacts/signature policy must be explicitly test-only and cannot be reported as production signing. #78 R3 administrator envelopes also remain incomplete; existing CA/SSH interfaces stay cold-locked by default. No unsigned production downloader, release private key on the server, new crypto engine or fabricated execution uid will be introduced. Continue local proof and publish the stable additive boundary.
Completed trust-schema-retry; optional private input never enters public history. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
79da0ce33c. Evidence: evidence/ssh-bootstrap/run3/trust-schema-retry-fast.log. scripts/verify fast exit 0; summary verbatim:7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [2.96s]
Trust configuration remains uncommitted: fast failed unchanged expired_handshake_releases_user_permits (server131/1/10,145.78s; trust-configuration-fast.log), same pre-deadline admission assertion as the earlier gate. Public-only isolated diagnostics reproduced failure on sample9: virtual0ms before jump,4999ms after, watchdog false, pool idle0, seventeenth upgrade succeeded (.handshake-public-time-repeat.log); preceding8 samples returned503 with idle1. Source sends Hello before the next live-authority read. Explicit clock advancement can cancel that pending read and retire the old socket before its handshake deadline. A transport-Pong fence after each Hello settles that phase without completing application Hello or changing limits/timeouts. Focused fenced diagnostic20/20 PASS, virtual4999ms/503/pool idle1; CPUWeight10000, recorded initial load in handshake-pong-fence-repeat.log. Remove instrumentation and gate this test-only correction separately before restoring the trust slice. Production auth code/deadlines unchanged.
Manual transaction preview: interrupted public receipt cleanup red0/1 .21s (manual-receipt-red.log); isolated fix green all11 filesystem transactions2.62s plus2 plan-admission tests. Public one-line plan12986bytes excludes private invitation, requires signed artifact verification and exact readiness receipt. This is isolated source construction/filesystem evidence, not signed-download or production provisioning proof.
Real OpenSSH emits no HostKeyAlias field when unset, but emits literal hostkeyalias none when explicitly configured. The draft incorrectly treated that literal as absence and could offer first-contact admission despite an existing revoked alias. Real-sshd regression red0/1 2.24s (host-trust-literal-none-red.log), draft fix green1/1 3.57s including ordinary/nondefault/literal-none aliases, existing normal/CA/revoked refusal, fresh-authority/foreign-target/replay refusal, confirmed command and immutable pins (host-trust-literal-none-green.log). No existing key was accepted or overwritten. Add ordinary parser regressions and retain every explicit alias verbatim before landing the configuration slice. The disposable listener alone disables scan penalties to isolate repeated negative oracles; production policy is unchanged.
Completed Fence the half-open handshake oracle before advancing time. Server Hello is delivered before the next live-authority read completes. The expired-handshake test could jump 4999ms while that SQL read was pending, cancelling authorization and freeing a user permit before handshake expiry. Reuse the existing RFC transport-Pong fence to observe the client-Hello wait before advancing the clock; retain all admission, exact deadline and database survival assertions. No production auth code changes (D168, #118). Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
d896d16baa. Evidence: evidence/ssh-bootstrap/run3/handshake-pong-fence-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16493552 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13869232 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [6.86s]
Proposed native facts decoder/target ASan proof:11,308,896 executions/181s, peak RSS496MiB, max_len257; no findings/artifacts. Seven synthetic seeds include object/array/scalar/unknown-field and exact256/257-byte boundaries. Fuzzer independently requires accepted input to be an empty JSON object <=256 bytes; production collect is never called. Exact proposed facts source copied into an isolated narrow standalone crate using the same selected serde_json/nix/libFuzzer versions, CPUWeight10000/nightly2026-09-30. Gate compilation/other work overlapped; this is robustness evidence, not latency acceptance. Log native-facts-fuzz.log, owned HOME-cache corpus/target. Ordinary workspace module/dispatch and fuzz registration get independent full gates after host trust.
#11308896 DONE cov: 757 ft: 2074 corp: 781/26Kb lim: 257 exec/s: 62480 rss: 516Mb
Done 11308896 runs in 181 second(s)
Completed Retain exact public SSH trust identity for first-contact checks. Retain bounded known-host paths and a digest of effective policy. Use Every explicit HostKeyAlias, including literal none, verbatim at any port, matching the real-engine red/green oracle. Ambiguous expansions refuse admission instead of omitting existing trust. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
c2d18881cc. Evidence: evidence/ssh-bootstrap/run3/trust-configuration-fixed-alias-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16493104 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13869488 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [5.39s]
Manual fallback plan admission: actual JSON escaping is checked against the 32-KiB socket limit before readiness scheduling. Isolated exact-source plan tests: 2 passed, 0 failed, 0.10 s; public command 12,986 bytes, one line, invitation absent. Evidence: evidence/ssh-bootstrap/run3/manual-plan-frame-bound-green.log. This is construction/admission evidence, not signed-download execution. Production release/enrollment adapters remain required from #102/#78.
Completed Test exact SSH aliases and reconstructable public trust paths. Assert explicit aliases including literal none are used verbatim at a nondefault port. Refuse unresolved or relative public paths for first-contact confirmation. Real OpenSSH regression evidence fails before the fix and passes afterwards. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
8b7c071734. Evidence: evidence/ssh-bootstrap/run3/trust-configuration-tests-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16493104 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13869488 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [5.34s]
Prepared verified manual fallback passes combined trust/manual plugin Clippy. Real-files transaction oracle: 11 passed, 0 failed, 12.39 s; private/public plan oracle: 2 passed, 0 failed, 0.04 s; missing signed catalog boundary: 1 passed, 0 failed, 0.03 s. The last oracle panics on invitation issue, SSH mutation, facts or canary, checks foreign/root refusal, and proves repeated failed-host admission remains available. Evidence: evidence/ssh-bootstrap/run3/manual-integrated-clippy.log, manual-integrated-tests.log, manual-runner-boundary-tests.log. Tests run on the owned pinned fixture with current trust/manual source drafts; root slices still receive separate full gates. No signed-artifact execution or production #78/#102 adapter integration is claimed.
D185 selects minisign-style Ed25519 format, not a new foundational crypto library. The prepared manual prototype invokes the minisign reference executable only after trusted catalog admission; the production catalog default remains unavailable. This reference-tool prototype is not selection of the server release-verification engine: #102/owner still owns that integration and engine decision. No cryptography dependency is added and no release signing private key enters the server or fixture. Signed-reference execution compatibility still needs a real oracle before the fallback can be described as available.
Completed Define a fresh authority boundary for public SSH pin confirmation. Keep the credential engine independent of server sessions. Adapters must recheck the exact live owner capability immediately before publication; unsupported engines refuse confirmation by default. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
c92c9c4039. Evidence: evidence/ssh-bootstrap/run3/trust-boundary-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16493776 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13870240 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [4.21s]
Current worktree x86_64 type-layout probe: Event 192 bytes; Failure 88 bytes. Actual admission limits are 1,024 retained events per batch, 16 batches, 100 targets per batch. Event arrays project to 196,608 bytes/batch and 3,145,728 bytes globally; +16 bytes/event from the prior 176-byte layout adds 262,144 bytes globally. Planned per-target last Failure values project to 8,800 bytes/batch and 140,800 bytes globally. These are fixed-value projections, excluding strings/vectors/hash-table capacity/allocator overhead, not measured RSS. Evidence: evidence/ssh-bootstrap/run3/event-layout-worktree.log. Final ten-target process RSS remains a separate measurement.
Combined prepared trust/manual API now passes server+tests Clippy and the actual loopback software-passkey/socket suite: 7 passed, 0 failed, 6.64 s. New cases prove the exact confirmation capability refuses owner removal/logout and missing signed catalogs return typed error plus failed attempt, without private plan or additional SSH resolution. Evidence: evidence/ssh-bootstrap/run3/manual-and-trust-api-tests-fixed.log and manual-api-final-assembly-clippy.log. The earlier 6/1 run (manual-and-trust-api-tests.log, 11.34 s) caught a fixture assembly omission: the manual action was absent. The helper was repaired and syntax-checked before rerunning; no production assertion/deadline was relaxed. Packaged additive fixture patch applies cleanly to pinned #78 base
1f6e39b; root slices still receive separate full gates.Completed Reuse effective SSH configuration for explicit public trust pins. Split already-resolved engine setup from endpoint resolution so trust checks and the connecting child use identical public policy. Credential materialization and cancellation-safe child ownership remain in the existing implementation. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
b29373784b. Evidence: evidence/ssh-bootstrap/run3/trust-openssh-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16495824 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13871440 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [4.32s]
Manual fallback refinement before implementation: D185 fixes the signature format, while PROCESS section 3 leaves foundational crypto-engine selection to the owner/#102. Delegate the bounded public offline verification script and required executable names to the trusted verified-release catalog; request fields never choose either. The installer supplies only public payload/signature paths and the catalog public key. Synthetic plan tests can model the minisign reference invocation without making it a production engine choice. Keep the existing manual request/private-reply shape and fail-closed default catalog before invitation issuance.
Completed Record explicitly confirmed first-contact SSH pins without replacement. Observe only targets without matching configured trust, retaining at most 128 public challenges for 120 seconds. Bind confirmation to exact destination, policy and fingerprint, then recheck current trust and live authority. Publish owner-only public pins with create_new/fsync, never overwrite changed keys. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
21baed4745. Evidence: evidence/ssh-bootstrap/run3/trust-store-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16495888 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13871440 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [4.28s]
Manual offline verification is now catalog-provided: bounded public script, at most four safe executable names, public artifact/signature paths and compiled public key. The installer selects no crypto engine. Prepared plugin Clippy passes; verifier/plan tests 3/3 in 0.02 s, missing-catalog admission 1/1 in 0.00 s, real passkey/socket API suite 7/7 in 6.58 s, server+tests Clippy green. Evidence: evidence/ssh-bootstrap/run3/manual-delegated-verifier-tests.log, manual-delegated-api-tests-fixed.log, manual-delegated-api-clippy.log. A fixture policy-reporting compile error (count declared too late) was fixed before rerunning, preserved in manual-delegated-api-tests.log. Single-target packaged proofs retain default SSH source penalties; ten-user shared-listener proofs record explicit isolation and permit comparison. The driver copies production native facts source/tests instead of duplicating the decoder. No signed-download execution or production catalog/remote-adapter availability is claimed.
Completed Forward public host-key confirmation through ordered SSH authentication. Keep the shared trust store underneath every lazy authentication method. Confirmation carries no private authentication material and preserves the network/server/user/password selection order. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
0c5e41f798. Evidence: evidence/ssh-bootstrap/run3/trust-ordered-auth-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16495792 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13871280 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [3.18s]
Completed Bind SSH host-key confirmation to the failed host attempt. Retain the last public failure per target and require owner/batch membership, failed idle state, nonce and observed fingerprint. Resolve the trusted destination again before transport admission; retries clear the prior observation. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
7797415f81. Evidence: evidence/ssh-bootstrap/run3/trust-runner-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16496496 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13872048 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [2.61s]
Exact proposed public-keyscan syntax hook (body unchanged from production): AddressSanitizer, nightly-2026-09-30, CPUWeight=10000; 407,807 executions in 181 s, no findings, zero crash artifacts, peak ASan harness RSS 428 MiB. Ten synthetic public-format seeds include supported/unknown algorithms, malformed blob/UTF8, extra fields, exact/over-4-KiB blobs and 64-KiB whitespace. max_len=65,536 deliberately exceeds the actual 4-KiB scan envelope. This validates syntax bounds only; selected system SSH still validates cryptographic keys. Compilation/other jobs overlap, so counts/RSS are robustness diagnostics, not production performance acceptance. Evidence: evidence/ssh-bootstrap/run3/host-record-fuzz.log and host-record-fuzz-environment.txt. Root hook/target remain separate gated slices.
Completed Confirm first-contact SSH keys with fresh browser authority. Add ConfirmHostKey to the authenticated bootstrap socket. Publication rechecks the same live session owner after asynchronous trust lookups; acknowledge only a successful public pin. A separate explicit Retry resumes provisioning. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
e2479e9b72. Evidence: evidence/ssh-bootstrap/run3/trust-api-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16513392 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13886256 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [5.47s]
Completed Share persistent SSH host pins in the default provisioning runtime. Wrap the selected system SSH adapter in one trust store under server data. All automatic methods and batches share immutable owner-only public pins. Missing enrollment integration continues to fail closed before host mutation. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
e967242ce6. Evidence: evidence/ssh-bootstrap/run3/trust-default-runtime-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16555888 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13916288 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [5.24s]
Fast gate for the fresh SSH confirmation authority test failed before reaching server tests: vt_reconnect 0/1, 8.32 s, immediate-Pong assertion after legacy snapshot-unavailable. Preserved evidence: evidence/ssh-bootstrap/run3/trust-authority-reconnect-{stdout,stderr}.log and trust-api-authority-test-fast.log. The standalone observer passed wrapped/less and recorded stream=0 kind=9 twice; timing-sensitive immediate-frame assumption remains. Reuse existing Binary.fence to validate queued terminal frames and exact Pong nonce without extending deadlines. Separate regression slice under gate before resuming trust tests; no daemon behavior change.
Reconnect fence evidence: full fast reconnect 1/1 in 16.33 s; two additional complete wrapped+less runs passed in 18.972/18.760 s. Third repetition failed earlier at retained replay (verify-vt-reconnect.py:79), before the changed fence: terminal command queue full (frame kind 15). Full Rust auth suite was running concurrently. Keep this distinct from the immediate-Pong failure; do not weaken queue checks or claim repeat 3/3. Evidence: reconnect-fence-repeat.log; root change remains only reuse of existing exact-nonce Binary.fence.
Completed Fence reconnect liveness after queued terminal events. The #87 fast gate reproduced a legacy reconnect failure: its assertion expected the next multiplexed frame to be Pong immediately after seeing a snapshot-unavailable event. Already queued terminal frames may arrive first. Use the existing Binary.fence to validate those frames and the exact Pong nonce while retaining the existing bounded socket deadline. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
e9446aedfd. Evidence: evidence/ssh-bootstrap/run3/reconnect-queued-frame-fence-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16555888 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13916288 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [5.09s]
Verified codex.job=ssh-bootstrap-run3 on exact container infraternal-ssh-bootstrap-run3-target. Checked disposable normal uids 1101–1110: all installation/unit/launcher absent, all live canary counts zero. Removing only this owned container and infraternal-ssh-bootstrap-run3:fixture image before reproducible final-source runs. Earlier proof cleanup remains intact; no host installations or other job resources affected.
Completed Test exact live browser authority before SSH host pin publication. Use the real software-passkey capability and in-memory auth database. Confirm admission, remove owner authority, restore it, then logout the exact session; the same confirmation proof must immediately refuse after either revocation. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
fe9776d5c1. Evidence: evidence/ssh-bootstrap/run3/trust-api-authority-test-after-fence-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16555888 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13916288 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [4.25s]
Completed Make repeated negative SSH trust policy isolation explicit. Retain default listener penalties for normal client benchmarks. Allow only an explicit negative-trust oracle flag to isolate repeated keyscan/early-close throttling, and record the chosen policy in the environment measurement. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
9a1a498977. Evidence: evidence/ssh-bootstrap/run3/trust-negative-fixture-policy-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16555888 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13916288 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [3.92s]
Integration refresh: #78 now records real CA unlock authority commits 473c2fb7/70878389 and HTTP preview, but explicitly says shipping HTTP/CLI/provisioning/role lifecycle remains separate. Current dev=63b1f10e has newer UI work; no production provisioning adapter has landed there. Main=eecf6ace adds D198 (removable/switchable role plugins); #87 transport/plans remain in infraternal-plugin-ssh. Production #78/#102 backend binding must use that declared plugin lifecycle instead of adding persistent core background work. Continue the approved stable-contract two-process proof; do not claim production join/release/manual fallback availability. The o1 trust prerequisite remains unsatisfied as recorded earlier.
Completed Prove first-contact admission and immutable pins against real SSH. Exercise revoked authority, foreign destinations, normal/CA/revoked records, nondefault aliases including literal none, replay refusal and an actual confirmed private-key command. Introduced configured trust must supersede a pending challenge and later revoked trust cannot broaden stored acceptance. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
4c6bbbbe47. Evidence: evidence/ssh-bootstrap/run3/trust-real-engine-tests-after-lint-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16555888 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13916288 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [6.26s]
Committed canonical real-SSH oracle PASS 1/1 in 4.48 s at
4c6bbbbe47. CPUWeight=10000, infraternal-dev/8 cores, load30.84/23.12/21.02; explicit negative-test source_penalties=isolated. Fresh authority required; foreign target refused; introduced normal/CA/revoked trust refused; nondefault aliases including literal none respected; replay refused; confirmed private-key command succeeds; persistent pin unchanged and later revoked trust cannot broaden acceptance. Evidence: evidence/ssh-bootstrap/run3/committed-trust-oracle.log. This is a correctness oracle, not latency acceptance. Full fast commit gate output already attached above.Gate execution setting: subsequent separately gated slices use RUST_TEST_THREADS=2 instead of the earlier serial diagnostic setting. No tests are skipped, no assertions/deadlines/budgets are changed; scripts/verify fast still runs the full workspace and both static targets. Current in-flight parser hook/target retain the already loaded setting=1. CPUWeight=10000 and TRACER_TEST_PORT=4787 remain. Per-slice logs record full output and failures remain preserved rather than retried silently.
Completed Expose exact public keyscan syntax to robustness tests. Add only a hidden decoder hook and role comments; no parser or runtime behavior changes. Preserve the already validated lookup boundary and delegate actual key validation to the selected system SSH engine. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
a60ce4a83f. Evidence: evidence/ssh-bootstrap/run3/host-record-parser-hook-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16555888 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13916288 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [3.60s]
Completed Fuzz bounded SSH keyscan record syntax. Check arbitrary synthetic output up to the 64-KiB process-output envelope. Independently assert exactly three reconstructed fields, fixed lookup, supported algorithm, bounded base64-shaped blob and terminated public record. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
1bffd0061e. Evidence: evidence/ssh-bootstrap/run3/host-record-parser-fuzzer-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16555888 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13916288 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [6.53s]
Fixture reproduction review found obsolete facts dispatch: after copying the exact strict production/proposed module, snapshot cargo check failed E0603 private struct Input. Preserve private map-only input type; change only fixture dispatch to crate::facts::accepts_request(input_json), the same bounded decoder production uses. Corrected cargo check PASS33.14s; fixture.patch applies cleanly to fresh owned git archive1f6e39b. Logs: evidence/ssh-bootstrap/run3/fixture-strict-facts-dispatch-{red,green}.log. Patch remains an independent forthcoming gated fixture slice; no remote-agents worktree changes.
Completed Collect bounded native host facts without discovery. Expose platform, architecture, execution uid, release version and OS concurrency policy. Share a 256-byte empty-object decoder that explicitly requires map syntax: derived empty structs also accepted arrays in the recorded failing real-source regression. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
ad2cc7d588. Evidence: evidence/ssh-bootstrap/run3/native-facts-module-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16555888 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13916288 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [2.46s]
Completed Test native facts object syntax and exact admission bounds. Exercise array/null/scalar/parameter/concatenated JSON refusals and the exact 256-byte boundary. Keep the earlier array regression red/green evidence in the issue instead of broadening the accepted request shape. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
9dbb73a8b8. Evidence: evidence/ssh-bootstrap/run3/native-facts-tests-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16555888 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13916288 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [2.43s]
Completed Serve cheap host facts on the authenticated control stream. Handle host.facts only on stream zero using the shared bounded decoder. Return a short content-free error for invalid requests and native facts from the actual execution uid; preserve terminal and transport framing. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
f9bfabcb91. Evidence: evidence/ssh-bootstrap/run3/native-facts-dispatch-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16559888 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13920160 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [2.30s]
Completed Reuse the workspace JSON decoder in admission fuzz targets. Use the already selected serde_json version to fuzz the exact production credential and native-facts decoders. No new foundational parser is selected. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
77afe3d935. Evidence: evidence/ssh-bootstrap/run3/parser-fuzz-json-dependency-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16559888 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13920160 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [2.98s]
Completed Fuzz one-use SSH credential decoding and content bounds. Exercise arbitrary synthetic input through bounded zeroizing input-only material. Assert valid key/prompt sizes, no control bytes, field relationships and a server-controlled 60-second lifetime within the real 32-KiB frame bound. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
6e7f0f75a1. Evidence: evidence/ssh-bootstrap/run3/ssh-one-use-fuzzer-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16559888 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13920160 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [3.76s]
Completed Fuzz the exact native facts empty-object admission decoder. Call the shared production decoder and independently assert accepted inputs are empty JSON objects no larger than 256 bytes. The prior array regression remains refused without executing discovery or host subprocesses. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
390e92d919. Evidence: evidence/ssh-bootstrap/run3/native-facts-fuzzer-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16559888 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13920160 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [2.88s]
Completed Document one-use SSH inputs and first-contact confirmation for the UI. Specify per-target Start material, fresh Retry material, bounds and lifetime. Document owner-bound public challenge confirmation followed by explicit retry, pin persistence and unchanged/CA/revoked refusal, including external trust-edit races and missing production enrollment integration. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
bd7532e8ae. Evidence: evidence/ssh-bootstrap/run3/browser-private-and-trust-contract-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16559888 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13920160 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [3.85s]
Completed Reuse the selected JSON encoder for private manual reply bounds. Move the existing workspace JSON dependency into production scope so the private response can be bounded after actual escaping, before task admission. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
87110934f9. Evidence: evidence/ssh-bootstrap/run3/manual-json-dependency-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16559888 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13920160 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [3.54s]
Completed Publish a host transaction readiness receipt for manual installation. Add a public exact-transaction receipt before manual lock release. Remove it on fresh rollback, including interruption before commit, while preserving existing upgrade state and the ordinary SSH commit path. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
8c0c24620e. Evidence: evidence/ssh-bootstrap/run3/manual-readiness-receipt-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16559888 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13920160 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [2.61s]
Completed Test interrupted manual readiness publication against real files. Preserve the recorded failing orphan-directory regression and exercise rollback after receipt publication but before lock release. Full fast gate green; fixture evidence remains diagnostic until production integration.
Head:
b0481a6387. Evidence: evidence/ssh-bootstrap/run3/manual-readiness-regression-fast.log. scripts/verify fast exit 0; summary verbatim:PT_INTERP: absent; size: 16559888 bytes (baseline 16521648 + allowance 262144 = max 16783792)
PT_INTERP: absent; size: 13920160 bytes (baseline 13881576 + allowance 262144 = max 14143720)
7 pass
0 fail
34390 expect() calls
Ran 7 tests across 2 files. [2.66s]
ssh-bootstrap run stopped by a provider filter after 126 commits (head
b0481a63; a one-line WIP saved asd0290f6e). A verification review starts now on the head before the next run.Independent verification started on review-ssh-bootstrap at target
d0290f6e; merge base with dev459070fe3b. Read contract/process, main decisions, #87 and parent #5 history. Requested author result.md is absent; using committed evidence and issue claims. Only review tests/evidence will change; no implementation fixes, push, deployment or host-key acceptance.R01 P1: target
d0290f6eadds pub mod manual at crates/plugins/ssh/src/lib.rs:10, but neither src/manual.rs nor src/manual/mod.rs exists. Dependency-free Rust test declared_public_modules_have_committed_sources fails (exit101) with declared public module manual has no source file. All Cargo consumers are blocked by E0583. Evidence: /home/kayg/.cache/codex-scratch/ssh-bootstrap-review/R01.log. Review tests will be committed without implementation fixes.R02 P1 confirmed, review commit
1db8f64025: rollback ignores service stop refusal (install.rs:328), deletes identity/binary/transaction and reports success while the activated daemon may remain live. Existing real-file manager fixture regression rollback_stop_refusal_retains_artifacts_for_later_cleanup: 0 passed/1 failed, 0.34s. Testedb0481a63, source-identical tod0290f6eexcept the missing manual module declaration; target itself cannot compile (R01). Evidence /home/kayg/.cache/codex-scratch/ssh-bootstrap-review/R02.log. No implementation changed.Review steps committed: R03
b0b2f59f(P2, normal helper completion leaves pipe-detached real child live; oracle 0/1, 0.00s, birth-checked child cleanup); R04a7fdd548(P2, denied linger intent reverses later external enable; 0/1, 0.16s); R050f9e525b(P2, interrupted fresh rollback loses cleanup after lock removal; 0/1, 0.24s). All reuse normal Rust fixtures onb0481a63diagnostic checkout; target differs only by its missing manual module declaration. Evidence R03.log/R04.log/R05.log under /home/kayg/.cache/codex-scratch/ssh-bootstrap-review. Each test committed separately; no implementation fixes. Target fast gate is running; Cargo already reports E0583 for manual.Diagnostic control checks complete: 29 passed, 0 failed, 1 ignored; four confirmed behavioral regressions excluded explicitly. Two setup retries corrected Unix socket path length, not product policy. Real rootless sshd (synthetic memory-held keys): authentication/trust/cleanup 1/1, 3.81s; single-connection/helper-erasure/lost-master 1/1, 0.46s. Ten read-only commands: local232ms/300ms-RTT851ms; controller5032/5044KiB peak, SSH children92316/92120KiB. Controlled1000 targets/10batches: active_peak8, RSS4636→7976→8468KiB,56ms; load28.10/28.61/23.93, infraternal-dev8cores CPUWeight10000. Component/debug observations on
b0481a63; not full provisioning, terminal latency or whole-server acceptance. Target missing manual module still blocks Cargo; exact-head gate and delayed-confirmation regression pending builds. Requested author result.md remains absent.R06 P1 confirmed, review commit
1ea28db7a5: bootstrap_api.rs awaits confirm_host_key inside its receive branch; a stalled backend lookup prevents logout/revocation from retiring the socket. Real software-passkey/TCP test logout_interrupts_a_stalled_host_key_confirmation_lookup logs out after the confirmation lookup starts; its socket permit stays occupied past2s. 0 passed/1 failed,2.99s; lookup released after observation, no pin published. Diagnosticb0481a63has identical implementation tod0290f6eexcept the missing module declaration. Evidence /home/kayg/.cache/codex-scratch/ssh-bootstrap-review/R06-retry.log. No implementation fix.R07 P1 confirmed, review commit
ca67875459: config.rs drops KnownHostsCommand and openssh.rs forces KnownHostsCommand=none. Normal system OpenSSH refuses a synthetic host key marked @revoked by that configured public trust command; TrustedOpenSsh instead returns a first-contact challenge for the same revoked key. Real-sshd differential regression configured_known_hosts_command_revocation_cannot_offer_first_contact: 0 passed/1 failed,0.37s; load17.49/22.15/22.62, CPUWeight10000, default listener penalties. No pin was confirmed and no real host contacted. Evidence /home/kayg/.cache/codex-scratch/ssh-bootstrap-review/R07-retry.log. Diagnosticb0481a63implementation matches target except missing module declaration.R08 P2, review commit
b6f5bd9a1c: D198 build-time removal is absent. CLI/server depend unconditionally on infraternal-plugin-ssh and expose no Cargo feature for removal. Standalone Rust test build_without_default_plugins_excludes_ssh_dependency checks cargo tree --offline --locked --package infraternal --no-default-features --edges normal: SSH remains in the binary dependency closure (0 passed/1 failed,1.29s). Evidence R08.log under /home/kayg/.cache/codex-scratch/ssh-bootstrap-review. No dependency/manifests changed. Counts now P0=0/P1=4/P2=4/P3=0.Verdict: do not merge. P0=0, P1=4, P2=4, P3=0. Eight failing Rust tests committed separately on review-ssh-bootstrap; review head
e2901a0e97. Targetd0290f6e46; merge base459070fe3b75548382e8e19fba86af20439cf607. Findings: missing module; ignored rollback stop refusal; retained helper child; external linger reversal; incomplete fresh rollback recovery; stalled confirmation survives logout; command-supplied revocation discarded; missing D198 build-time removal. No implementation fixes/push/deploy/real host-key acceptance.Exact detached target scripts/verify fast exit1 (E0583 missing manual); TypeScript gates not reached. Verbatim gate output summary:
Full raw output and test/measurement evidence committed in docs/reviews/ssh-bootstrap-87-evidence.md; verdict/checklist in docs/reviews/ssh-bootstrap-87.md. Diagnostic behavior tests use
b0481a63, whose only difference from target is the missing-module declaration.29 control tests pass; real SSH trust/lifecycle checks pass; ASan1129630 executions/21s/no crash;1000 targets active_peak8/RSS7976KiB held;200 SSH clients private318000KiB. These are component diagnostics, not production #78/latency acceptance. Review-only formatting and diagnostic plugin/server Clippy pass. Requested author result.md absent. Owned scratch targets/fixtures/checkouts are being removed; issues remain open.Repair round started on ssh-bootstrap at
d0290f6e46, sole writer. Read #87/parent #5 history, repository contract/process, git log -30, and all eight review findings ate2901a0e. Inherited untracked manual.rs draft exists locally but was absent from committed review target. Drop unfinished declaration first, preserve draft, merge dev, then reproduce/fix P1 before P2 in separate gated commits. No push/deploy/remote host changes. Evidence under HOME cache ssh-bootstrap.R01 reproduced on an archived committed source tree: declared_public_modules_have_committed_sources fails 0/1 with manual missing; passes 1/1 after dropping only the unfinished declaration. Inherited untracked manual.rs remains preserved and unregistered. Full fast gate building from fresh HOME cache; native terminal compilation ongoing. Logs r01-red.log/r01-green.log/r01-fast.log under ~/.cache/codex-scratch/ssh-bootstrap.
First R01 fast attempt: Clippy passed; test row stopped at initial_attach_requires_explicit_credit_before_replay because inherited target symlink referenced deleted ssh-bootstrap-run3 cache (FileNotFoundError creating target/ac...). Repointed only untracked target link to this job build cache. Direct unchanged real-PTY harness now PASS: no Output/Snapshot for350ms, control responsive, funded replay149bytes in644.1ms. r01-fast.log/r01-attach-recheck.log. Remaining static builds still running; full gate will be rerun after setup repair. No assertions/deadlines changed.
Independent scratch reproductions against the current compiled source (only R01 declaration removed, dev merge still pending): R02 rollback_stop_refusal_retains_artifacts_for_later_cleanup FAIL0/1 in0.21s, rollback reports success after refused stop. R07 configured_known_hosts_command_revocation_cannot_offer_first_contact FAIL0/1 in0.60s: normal real OpenSSH enforces synthetic command revocation, bootstrap offers a first-contact challenge. Disposable rootless sshd, default source penalties, infraternal-dev8cores CPUWeight10000 load34.51/30.58/27.27; no pin confirmed. Logs r02-red.log/r07-red.log under HOME cache ssh-bootstrap. Gated checkout was unchanged during these standalone review-test builds.
R06 independently reproduced before merge: logout_interrupts_a_stalled_host_key_confirmation_lookup FAIL0/1; exact review assertion revoked bootstrap retained its socket during confirmation lookup. Built scratch server tests with the completed workspace test dependency fingerprints and only the review test addition; production sources unchanged. Real software passkeys/loopback WebSocket, held lookup released after observation, no pin published. r06-red.log and r06-build-matched.log under HOME cache ssh-bootstrap. All three behavioral P1 findings now reproduced while R01 first full gate completes static builds.
R01 fixed: drop the unfinished manual export; archived committed-head oracle RED0/1, repaired source GREEN1/1. Retain review oracle and preserve inherited draft. Full gate green; scratch setup failure and direct recheck recorded separately.
Head:
599c3cf495. Evidence: evidence/ssh-bootstrap/repair-round/r01-recheck-fast.log. scripts/verify fast exit0. Verbatim gate summary:Dev merge integration finding before source repair: every Rust fast row PASS, tracer production transfer gate FAIL. Deferred gzip51871/51200 bytes (+671), Brotli45276/45056 (+220); critical283430/307200 and235012/256000 pass. New live details adapter imports its formatting code eagerly although popover renderer is already on demand. Move that existing formatter to the same demand boundary, keep round-trip subscription timing and budgets unchanged. Evidence merge-fast.log, apps/tracer/src/canvas/sessions/details-live.ts and windows/details-handle.ts.
Dev
7d6df447merged without conflicts. Integration budget failure repaired by reusing demand-loaded details reader/formatter: deferred gzip51871→51023/51200 and Brotli45276→44612/45056. Browser4/4 in32.4s; screenshots evidence/ssh-bootstrap/repair-round/screenshots/details-{desktop,phone}.png (1440x900/393x852), no author visual judgement. Full gate green.Head:
5c428697ea. Evidence: evidence/ssh-bootstrap/repair-round/merge-recheck-fast.log. scripts/verify fast exit0. Verbatim gate summary:R02 merged-source review test RED0/1 in0.11s. Repair requires activation ownership after the previous service stop, before the first replacement: an old-service stop refusal made no live change and must allow staging-only cleanup. New rollback requires acknowledged stop before removing artifacts or reversing owned linger. Strengthened regression checks policy receipt survives refusal and later cleanup reverses it. Prepared installer controls12/12; actual installer suite is green (r02-policy-green.log). Full r02-fast.log running; source commit follows gate.
R02 repaired: refused service stop retains owned setup artifacts and linger; retry finishes cleanup. Installer regressions: 12/12, 0.42s. Exact review test failed before repair (0/1, 0.11s).
Head:
1d99f6c33a. Evidence: evidence/ssh-bootstrap/repair-round/r02-fast.log. scripts/verify fast exit0. Verbatim gate summary:R06 P1 reproduced after dev merge: review logout_interrupts_a_stalled_host_key_confirmation_lookup fails 0/1 in 2.63s (r06-actual-red.log). bootstrap_api.rs awaited confirmation lookup outside the revocation/socket select. Repair keeps the pending future under revocation, expiry and disconnect lifetime; existing LiveConfirmation still checks authority before pin publication. No polling timer added.
R07 P1 confirmed again on merged production dependencies with the exact review oracle: configured_known_hosts_command_revocation_cannot_offer_first_contact fails 0/1 in 0.18s against a disposable rootless real sshd; load 6.14/7.78/8.66, 8-core infraternal-dev, normal source penalties. System OpenSSH refuses the synthetic command revocation, but provisioning offers a first-contact challenge because config.rs omits knownhostscommand and openssh.rs forces KnownHostsCommand=none. Evidence: r07-merged-red.log; no real SSH host contacted or key accepted.
R06 repaired: pending first-contact lookup is cancelled on logout, expiry or disconnect. Exact review test RED0/1 2.63s; bootstrap API GREEN7/7 4.89s. No new timer.
Head:
77f5eefc5c. Evidence: evidence/ssh-bootstrap/repair-round/r06-fast.log. scripts/verify fast exit0. Verbatim gate summary:R07 verification: real command-revocation oracle GREEN1/1 0.33s with normal source penalties; both real trust oracles GREEN2/2 4.11s with negative-trust fixture penalties isolated. Ordinary plugin tests 49 pass/0 fail/5 ignored. Coverage-enabled ASan public-policy fuzz: 914448 executions/46s, 2612 counters, final cov666/ft2276, RSS476MiB, max_len65537, zero crashes. The first manually built ASan run lacked coverage instrumentation and is excluded from coverage evidence. Same source and dependency versions as workspace lock. Full fast gate running.
R07 repaired: configured KnownHostsCommand retained; dynamic policy blocks first-contact admission and stored-pin bypass. Exact real review test RED0/1 0.27s, GREEN1/1 0.33s; real trust2/2 4.11s. Parser ASan: 914448 executions, cov666/ft2276, zero crashes.
Head:
9239c052ff. Evidence: evidence/ssh-bootstrap/repair-round/r07-fast.log. scripts/verify fast exit0. Verbatim gate summary:R03 P2 exact review regression RED0/1 0.02s on current branch: a completed helper leaves a same-group closed-pipe child alive. Repair observes natural exit with waitid(WNOWAIT|WNOHANG), retires the group before reaping, and awaits existing Tokio SIGCHLD without polling or a blocking pool. The original immediate assertion races asynchronous SIGKILL delivery; changed it to the existing cancellation oracle's 1s termination bound. That bound also fails against the original source (0/1 1.01s); final actual process tests4/4 0.30s. Eight-helper debug-controller comparison, 800 commands/run under CPUWeight10000 on 8-core infraternal-dev, load24.86–28.38: normal p50 before16.805–18.749ms/after18.001–18.229ms; p99 before75.195–96.883ms/after62.692–64.504ms. Early-pipe-close p50 before45.298ms/after48.666ms, p99 128.476/138.391ms; correctness requires acknowledged natural exit before group retirement. Both retain1 controller thread, RSS early4144/4136KiB. A measured blocking-pool candidate retained10 threads/4308KiB and was rejected. Raw r03-scale-async-*.log; these are a relative controller pilot under shared load, not end-to-end provisioning acceptance. Full gate running.
R03 repaired: natural exit observed without reaping; owned descendants retired before releasing group identity. Exact review RED0/1 .02s; bounded original RED0/1 1.01s; final process4/4 .30s. Eight-helper pilot retains1 thread, ~4.1MiB RSS; raw timings and load on issue.
Head:
14b70d8eb6. Evidence: evidence/ssh-bootstrap/repair-round/r03-fast.log. scripts/verify fast exit0. Verbatim gate summary:R04 P2 reproduced on branch: denied_linger_request_does_not_undo_a_later_external_enable RED0/1 .05s. Additional acknowledged-no-op case RED0/1 .06s. enable_linger previously retained intent after an acknowledged no-change result and reversed a later external enable. Repair clears intent after acknowledged refusal or a confirmed no state; interrupted/unknown replies retain it. All installer15/15 .93s, including interrupted reply cleanup. Full fast gate running.
R05 additive internal recovery journal proposed before implementation: a private, transaction-bound public receipt outside the installation base survives removal of the stage and owner marker. It binds host, transaction, fresh kind and original directory device/inode; bounded read, same uid/mode and protected parent checks precede recovery. Pending receipts refuse new staging. Existing wire messages and Cleanup coordinates stay unchanged. Committed/unowned roots remain preserved; an older attempt that already lost its only stage proof cannot be inferred fresh safely and needs operator review. Exact current-source review oracle RED0/1 .21s (r05-current-red.log). Prepared real-file control14/14 passes before adding further boundary/ownership tests.
R04 repaired: acknowledged denial/no-op retires linger intent; interrupted/unknown reply retains it. Review RED0/1 .05s, no-op RED0/1 .06s; installer15/15 .93s, including interruption cleanup.
Head:
5bc14bca74. Evidence: evidence/ssh-bootstrap/repair-round/r04-fast.log. scripts/verify fast exit0. Verbatim gate summary:R05 P2 exact review RED0/1 .21s on branch; four additional restart/admission boundaries RED0/4 .11s before repair. Fresh cleanup now retains a bounded private receipt outside the base, binds original directory identity and refuses replacement staging while pending. Final installer23/23 2.82s: stage/owner/base removal, fresh session, replaced unowned directory, symlink/mode/length/binding tampering and protected-parent checks. Self-review found rollback initially followed a linked owner marker and retired the stage before refusing it; public-data regression RED0/1 .11s, fixed by matching the existing staging no-link guard before the read. Interrupted the partial gate for that concrete finding; restarted full r05-final-fast.log on final source. Cherry-pick conflict was adjacent additions; all prior tests retained.
D198 additive interface proposal for the approved repair: fill the existing plugin-api stub with the draft static descriptor/action/schema-reference data, plus instructions (D202), defaults, declared role dependencies and a controller status/enable interface. The SSH crate supplies the declaration and uses existing Tokio/nix primitives to cancel and drain batches, confirmation work and socket lifetimes when off; starting it has no I/O and cannot create a server (D201). A feature-controlled static catalog exposes the declaration to core. No foundational library or schema/adapter engine is selected. Existing bootstrap wire shapes and compatibility entry points remain additive; production remote integration and general adapter generation remain the existing #78/#10 boundaries. Implement API, dependency additions and SSH lifecycle as separate gated steps after the review fixes.
Delta review (orchestrator's independent reviewer) at
14b70d8e: all four P1s fixed (R01, R02, R06, R07 pass; R03 fixed, test race accepted). No new P0/P1 → merge per D206. Fix-forward: new P2 (any message during a pending host-key confirmation cancels the whole batch, bootstrap_api.rs:285), P3 interrupted upgrade can leave the previous service stopped (install.rs:229), P3 configured KnownHostsCommand inherits the agent/askpass sockets (openssh.rs, config.rs:39, credentials.rs:391 — will be fixed before release), plus open R04, R05, R08. Failing tests saved for the next run.R05 repaired: bounded private transaction/directory-bound receipt survives stage, owner and base removal; pending cleanup refuses replacement staging. Exact review RED0/1 .21s; four boundaries RED0/4 .11s; linked-owner RED0/1 .11s. Final installer23/23 2.82s. Earlier full run caught a test semicolon lint; fixed and complete rerun green.
Head:
230fe3e462. Evidence: evidence/ssh-bootstrap/repair-round/r05-recheck-fast.log. scripts/verify fast exit0. Verbatim gate summary:R08 confirmed on actual source: retained review graph regression failed0/1 (.25s). Made SSH optional in both infraternal-server and infraternal, disabled dependency defaults, and feature-gated key/runtime/API plus hidden prompt-helper paths. Graph regression now checks both normal dependency closures. Both packages pass no-default all-target check (38.92s), tests (13 test-result rows), strict clippy (12.06s), and CLI build (42.61s); no-SSH CLI help has no SSH helper. Full default gate pending. Evidence: crates/plugins/ssh/tests/build_removal.rs and evidence/ssh-bootstrap/repair-round/r08-* logs. No public CLI command added.
R08 completed: optional SSH feature removes normal dependencies and runtime/helper paths from both core entry packages. No-default check, tests, clippy and CLI build pass; extended review graph checks both packages.
Head:
4dd4fd7fa2. Evidence: evidence/ssh-bootstrap/repair-round/r08-fast.log. scripts/verify fast exit0. Verbatim gate summary:D198 pre-change controller scale: actual ignored concurrency test, 1000 admitted targets/10 batches, eight active backend calls; elapsed55ms, RSS baseline4644/held8008/completed8500KiB. Held delta3364KiB for1000 targets (~3.364KiB/target). CPUWeight10000 on local8-core infraternal-dev; load recorded in plugin-lifecycle-before-scale.log. Controlled unavailable backend only; excludes full server, live installation, signed catalog and phase-latency acceptance. Existing transport, Tokio and shared API crate retained; no foundational engine selected.
Additive shared plugin API completed: static action/default/dependency declarations, ordered instructions, validation against implicit server creation and trusted lifecycle trait. Two contract tests pass. Initial test-only clippy placement failure corrected before this green rerun; no lint suppressed.
Head:
9fb6a2f01c. Evidence: evidence/ssh-bootstrap/repair-round/plugin-api-recheck-fast.log. scripts/verify fast exit0. Verbatim gate summary:Shared API dependency edges completed: workspace path dependency for SSH and server, two lock edges, no external library added. Workspace all-target check23.02s and full fast gate pass.
Head:
5c34de1a2d. Evidence: evidence/ssh-bootstrap/repair-round/plugin-deps-fast.log. scripts/verify fast exit0. Verbatim gate summary:SSH manifest completed: seven actions with ordered instructions, shared defaults, existing-server dependency and only infraternal agent component enablement. Feature-selected static catalog validates through existing configuration validator. Contract test and full fast gate pass; preflight line-limit finding resolved by reuse, without suppression.
Head:
dff31f784b. Evidence: evidence/ssh-bootstrap/repair-round/plugin-manifest-fast.log. scripts/verify fast exit0. Verbatim gate summary:SSH component controller completed: admission closes on off, queued/active batches cancel, confirmations retire and control waits for cleanup. Interrupted shutdown remains closed; reenable drains prior leases and never resumes cancelled batches. Six actual controller tests pass0.01s, including real native helper retirement. No idle task/timer added.
Head:
063e75b62a. Evidence: evidence/ssh-bootstrap/repair-round/plugin-controller-fast.log. scripts/verify fast exit0. Verbatim gate summary:D198 controller scale after commit (actual workspace binaries, two alternating pairs): 1000targets/10batches, peak8 backend calls throughout. Before elapsed56/49ms; after65/95ms. Held RSS minus each process baseline before3480/3552KiB; after3736/3736KiB: +184–256KiB/1000targets. At the declared1600target maximum, held queue estimate
5.84MiB, incremental0.29–0.40MiB. ScopeCPUWeight10000, infraternal-dev8cores, load10.68/10.20/10.17; debug current-thread controlled unavailable backend. Fixed binary/fixture RSS differs; not a full-server or phase-latency claim. Cost adds explicit admission/retirement accounting and acknowledged cleanup, with no idle task/timer. Evidence: evidence/ssh-bootstrap/repair-round/plugin-lifecycle-paired-scale.log; concurrency.rs. Full controller gate is green; server socket lifetimes are the next separate integration step.SSH server-adapter shutdown completed: leases span socket teardown and permit release; off interrupts idle/blocked sockets and lookups, refuses admission and returns no-store unavailable key responses. Core owner authentication remains valid. Actual API10/10 pass6.95s; both no-default CLI/server suites and strict clippy pass. Full fast gate exits0.
Head:
1c84f91a17. Evidence: evidence/ssh-bootstrap/repair-round/plugin-adapter-fast.log. scripts/verify fast exit0. Verbatim gate summary:Final documentation-only gate failed the daemon restart oracle at iteration22/24 (before-forward468224bytes): all468224bytes received,17input bytes unacknowledged; terminal command queue returned its reattach/replay error. Prior adapter full gate passed the same oracle, and no runtime source changed between runs. Host load24.14/17.73/12.88 at inspection. This row is NOT covered by #118 exceptions; not waived. Running the unchanged targeted test before a full gate rerun. Evidence: evidence/ssh-bootstrap/repair-round/final-first-failed-fast.log; scripts/verify-agent.py:113 / agent_fixture.py:253, crates/infraternal/tests/agent_daemon.rs:18. No assertions or budgets changed.
Restart-oracle finding: scripts/verify-agent.py:110–113 refunds output while an attachment already has1MiB credit; restart payloads are<=512KiB plus17byte fence. Those unnecessary64KiB refunds compete with replay/fence in the existing8-command admission queue (daemon.rs:292,315). The production close-and-replay response is intentional and separately tested by verify-agent-queues.py. Two actual red runs: documentation gate22/24 failure38.19s, targeted rerun1/24 failure11.79s at load34.03. Proposed fixture correction uses process(credit=False) only for the already-funded restart drain; exact full payload/fence, full input Ack, deadlines, stream errors and separate saturation coverage remain unchanged. No #118 exception claimed. Existing tests are the failing oracle; one separately gated harness commit before docs.
Restart oracle correction completed after two actual failures: use existing1MiB attachment credit for <=512KiB replay/fence rather than injecting unnecessary64KiB refunds into the eight-command queue. Production, assertions, deadlines and admission bounds unchanged. Actual targeted restart40.41s and saturation35.95s pass; full fast gate now exits0, no #118 exception.
Head:
487ef1ef0d. Evidence: evidence/ssh-bootstrap/repair-round/restart-credit-fast.log. scripts/verify fast exit0. Verbatim gate summary:Finished the repair round: all eight review regressions have failing-before/fixed-after evidence and separate gated commits; dev merged. Report: docs/reviews/ssh-bootstrap-87-repair.md. Production screenshot artifacts await independent visual review. Controlled lifecycle accounting adds 184–256 KiB per 1000 queued targets and 9–46 ms in paired runs; full live-installation/catalog acceptance (#78) and generated adapters (#10) remain unproven. No load-sensitive exception used; no push or deployment.
Head:
b7b0018f07. Evidence: evidence/ssh-bootstrap/repair-round/final-recheck-fast.log. scripts/verify fast exit0. Verbatim gate summary:Fix round 3 started on ssh-bootstrap, base
b7b0018f07. Read #87 history and parent #5; retain prior R04/R05/R08 repairs. Apply delta regressions, then fix credential isolation, pending confirmation requests, and interrupted service stop in separate gated commits. No host contact, push or deployment.Round 3 RED evidence: unrelated same-uid prompt peer receives login material (credentials.rs regression, 2 pass/1 fail, 0.00s); native trust command lacks environment isolation (diagnostics regression 0/1); pending replay closes socket (exact delta test 0/1, 0.76s); interrupted acknowledged stop leaves previous service stopped (exact delta test 0/1, 0.09s). Logs: ~/.cache/codex-scratch/ssh-bootstrap/{credential,trust,request,stop}-red.log. Repair retains configured dynamic trust via /usr/bin/env sanitization, SO_PEERCRED plus exact helper executable/direct owned parent, and one reply. No new dependency or idle timer. Full first gate running.
Credential isolation real-engine evidence: disposable rootless local sshd, supplied synthetic key, configured KnownHostsCommand produces host trust only when SSH_AUTH_SOCK, INFRATERNAL_SSH_ASKPASS_SOCKET and SSH_ASKPASS are absent. Test passes 1/1 in 0.25s; verifies same physical connection for two commands, helpers erased after authentication, and no reconnect with erased material. infraternal-dev, 8 cores, CPUWeight=10000, load 8.56/8.36/9.58. Unit peer/one-use oracle passes; no external host or host key touched. Evidence: ~/.cache/codex-scratch/ssh-bootstrap/{real,prompt,credential}-green.log. No dependency additions; cargo tree -d recorded.
First full gate exposed an outdated CLI test: ssh_askpass.rs launched a password helper without an owned login parent and expected success. Under the required peer check it is correctly refused; update the test to assert refusal/no reply/cleanup. The actual encrypted synthetic-key test already passes with registered ssh-add parent (1/1); synthetic key/passphrase stay on pipes. Rerun the full gate before committing, no waived failures. Evidence: credential-fast.log, cli-green.log under job scratch.
Completed credential isolation:
e315331c0b. SO_PEERCRED + exact helper/direct parent, one reply, sanitized native trust lookup. Real SSH reuse 1/1 in 0.25s; real trust/revocation 2/2 in 1.62s; real CLI password-peer refusal/encrypted-key handoff 2/2. R04/R05/R08 pass. Size delta +7424/+5680 B versusb7b0018f; no dependency added (cargo tree -d). First outdated direct-helper test corrected; complete scripts/verify fast rerun exit0. Evidence: ~/.cache/codex-scratch/ssh-bootstrap/credential-recheck-fast.log. Verbatim:Completed pending-confirmation handling:
db699df210. Text requests get busy without dropping the lookup/batch; close/error/EOF still retire it, with authority/off/expiry priority unchanged. Exact delta RED0/1 0.76s; strengthened real-TCP API suite GREEN11/11 8.22s, busy followed by separate confirmation answer. No request queue or retained retry material. Size delta +1344/+1152 B versuse315331c; no dependency changes. Corrected preflight Clippy pattern warning, complete scripts/verify fast rerun exit0. Evidence: ~/.cache/codex-scratch/ssh-bootstrap/request-recheck-fast.log. Verbatim:Fix round 3 finished. Head:
06d063acf6; branch ssh-bootstrap. Three separately gated commits:e315331ccredential isolation,db699df2pending-confirmation busy handling,06d063acinterrupted-stop recovery. Final installer25/25 0.76s, including refused restart retaining its journal for retry and refused stop cleaning only staging; RED delta0/1 0.09s. R04/R05/R08 pass in final full gate. Real SSH reuse1/1 0.25s, trust/revocation2/2 1.62s, CLI handoffs2/2, API11/11 8.22s. Last commit size delta0/0 B; total +8768/+6832 B versusb7b0018f. No dependencies added; reviewer checklist checked ownership/authority, revocation/off, helper retirement, prior-service preservation and feature removal. No waived failures, push, deployment or external host contact. Evidence retained at evidence/ssh-bootstrap/round3/{credential-recheck-fast,request-recheck-fast,stop-fast}.log; scratch targets are being removed.How to test:
scripts/verify fast exit0, verbatim summary:
Release integration started on release-addhost at production base
db8c527042. Read source histories and issue/parent records; integrate remoteca8a09d4, SSH06d063ac, then canvas-addhost0bf00d07. Preserve deployed Mesh/host-facts and shipped migration checksums. Local container-only SSH proof, port 47591; no external VM contact, push or deployment. Gates, migration rehearsal, static artifacts and operator steps follow.Integration findings at production
db8c5270: shipped migrations are 0001–0014 (0012_mesh_api, 0013_mesh_node_identity, 0014_plugin_settings). Remote source also declares 0012–0014; append its unchanged SQL as 0015_remote_identity, 0016_remote_sessions, 0017_ca_administrators. Shared plugin API reconciles Mesh socket/role metadata, host-facts node registry and remote channel constants using integrate-network reference declarations. Preserve one descriptor type, add node lifecycle/default/action fields rather than replacing production dispatch. UI source apps/tracer/src/add-host-prototype.ts still fetches /__mock/proto/addhost even when mounted in the product; production discovery/manual flow needs wiring. SSH bootstrap_runtime.rs default backend deliberately refuses invitations/readiness; local end-to-end requires live #78 adapters. Docker29.8.2 is accessible locally via sudo, no external hosts needed.Correction to previous UI finding: add-host-prototype.ts is the older mock-only flow. canvas-addhost product.ts mounts createAddHost with canvas/addhost/real.ts (real /v1/bootstrap/ws and optional discovery). Actual missing seams: sink.enrolled is a no-op in product.ts, no CA bootstrap/unlock step, and real.ts proposes /credential + /host-key endpoints while SSH backend uses one-attempt auth_once and socket host-key confirmation. Preserve the newer approved wizard and wire its service/canvas adapters.
Integration finding: ssh-bootstrap default_runner still uses PendingRemoteRuntime (bootstrap_runtime.rs), whose invitation, connected_facts and terminal_canary refuse the operation. Proposed additive seam: inject the remote EnrollmentService and live RemoteHosts into the SSH Backend; bind a fresh UUID to each owner/session/batch attempt, authorize invitation issuance against the exact unlocked session, wait for admitted authority, request compiled host-facts and verify a real PTY echo before reporting success. Retirement must affect only that attempt UUID, even after logout. Browser completion must use the trusted BootstrapEvent.host_id (already emitted by SSH), not the human target label. Preserve the frozen bootstrap/wire formats and existing CA passkey policy [168,198].
Local proof environment finding: real systemd+sshd container is active (SSH 127.0.0.1:1024; user@1000.service active), but its real PTY allocation fails:
script: failed to create pseudo-terminal: No space left on device. Host /proc/sys/kernel/pty/{nr,max,reserve} = 4023,4096,1024. A private devpts instance cannot allocate above max-reserve (3072), so the shared host currently prevents the container terminal oracle. No host sysctl or other job was changed. Integration/gates continue; the local container terminal/scale proof needs free shared PTY capacity or a fixture using the initial devpts namespace. Current load recorded separately in gate logs.PTY fixture resolution: rebuilt the local oracle with libpam-systemd and mounted the host initial /dev/pts into this controlled container. The same real
script -q -c true /dev/nulloracle now succeeds; ssh.service is active and user linger is enabled. No host sysctl or other process changed. Container still has its private cgroup namespace and real systemd service manager. This lets the local proof use the host reserved PTY capacity; scale runs must record remaining global capacity and load.SSH merge findings: retain production host-facts plugin (host.facts.read/configure), details loader and all Mesh/remote paths; remove SSH branch older duplicated daemon facts collector and its obsolete fuzz adapter. Append server_ssh_key at 0018; preserve production SQL 0001–0014 and remote 0015–0017. BootstrapFactory/KeyInitialization now compose through the same live Auth/pool and shared runtime.
Additional seam: install.rs invokes
agent --data ... join ... --enroll-only, but remote CLI Join currently accepts only its URL and always proceeds into foreground run. Installation will refuse the unknown flag or never reach service activation without an additive enroll-only mode; a failing CLI test will precede that integration fix.Server no-default check passes (2.83s). Initial fast retry stopped at latency_proxy self-test: p50=314.47 ms, p99=364.15 ms at configured300ms RTT; this is not one of #118 allowed exemptions. Retrying the full gate under CPUWeight=10000; no thresholds or RTT changed. Neither source branch nor production changed.
Release integration proposal (D16/D198): preserve the frozen binary Call envelope. Add an optional JSON routing envelope for node-target actions: {"target":{"host_id":""},"input":}. The server verifies current session ownership of the active remote host before stripping routing metadata and forwarding unchanged plugin input. Calls without routing metadata keep the embedded route. Remote and SSH lifecycle adapters will share production plugin_settings and plugins.set_enabled; disabled components retire all owned work before reporting Off. No separate authentication, CA, enrollment or feature-switch store. Tests will cover foreign/revoked hosts, disabled/restarted components and production Mesh switches.
SSH merge gate finding: tests/install.rs pending_fresh_cleanup_refuses_replacement_staging_until_finished correctly refuses staging while a rollback receipt exists, but the Local transport panicked at line 45 on BrokenPipe when /bin/sh exited before reading the payload. Evidence: ssh-fast-weighted.log (24 passed, 1 failed). Repair records stdin write result, waits for command exit, and refuses either nonzero status or incomplete write; no production policy or threshold changes. The existing failure is the red regression; targeted install tests and full fast gate are rerunning. Initial latency-proxy self-test exceeded its fixed p99 bound under host load; weighted rerun passed at p99 314.82 ms, configured 300 +/-30 ms. No load exception used.
Completed SSH merge:
408b26f4b1(06d063aconto production+remote). Preserved production Mesh/host-facts, shared API/channel daemon and shipped SQL; appended SSH key migration 0018 after remote 0015-0017. Used integrate-network key initialization composition without merging its old base. Fixed imported install test BrokenPipe race from captured red gate.544 Rust tests pass (59 diagnostics ignored); fmt/native fmt/clippy/cargo-deny PASS. Server no-default PASS. 67 tracer and 36 protocol tests, compiler/build/transfer PASS. Fast exits 1 only for unchanged static-size ceilings (D205): stripped/static x86 19,541,776 B (+554,240 vs remote), ARM 17,429,952 B (+476,608). Dependency duplicates recorded; no new heavy engine.
Production-binary restart expired its normal browser resume leases; then stopped-data upgrade preserves all remaining values across 22 tables/9 rows, owner/passkeys/wraps/session/terminal/Mesh intact, integrity/foreign keys OK, SQL versions 1-18. Startup 60.06 ms, infraternal-dev load 12.07/16.20/18.29. Logs in release-addhost scratch/logs/ssh-fast-final.log, ssh-ts-fast.log, ssh-arm-static.log, migration-ssh.log. Canvas merge and missing runtime/UI seams remain; not deployable yet.
Canvas merge browser finding: addhost-wizard.spec.ts network enrollment opens w-remoternal, but the sidebar assertion fails because production now reads authorized session inventory (D178) rather than canvas windows. Evidence: test-results/addhost-wizard-network-acc-a29e0--in-Console-and-the-sidebar/error-context.md, expected remoternal, received only embedded current shell. Imported mock sink now adds the host to the current mock person and session inventory; newly enrolled host windows bind their first inventory session. Test explicitly opens the sidebar before inspecting it, preserving production's no-render-while-closed optimization. Other resolutions retain Mesh/details/inventory/session lifecycle and disposal; transfer-budget.ts is byte-identical to production. Targeted red case and full browser set rerunning on TRACER_TEST_PORT=4791.
Completed canvas merge
401c917e(0bf00d07). Retained production Mesh/details/inventory, all window session operations and disposal; added lazy flow window. Production transfer-budget.ts remains byte-identical. Imported mock sink adapted to authorized session inventory after captured browser failure. All 21 add-host browser cases pass including phone/cancel/one-use credentials/trust prompts. Mesh/details/clusters full 97-case run continues on port4791.Fast: fmt, native fmt, clippy, 544 Rust tests (59 ignored), cargo-deny PASS; unchanged size-only failure remains x86 19,541,776 B / ARM 17,429,952 B (no Rust code/dependency delta). Tracer check and 92 unit tests (10,092 assertions) PASS, 36 protocol tests PASS. Build/transfer: deferred gzip48,576/51,200 B, br42,877/45,056 B; largest on-demand gzip13,947/20,480 B, br12,414/18,432 B. Logs canvas-fast.log, canvas-unit-final.log, canvas-ts-fast.log, canvas-browser-final.log. Runtime/CA/UI seams and real installed remote proof remain. Next fix is installer's --enroll-only CLI mismatch, with a red CLI parser test before implementation.
Browser rerun without an own build: motion, sharing and toolbar regressions passed; split still took 1125 ms against unchanged <1000 ms gate (canvas-browser-rerun.log; load 21.97/25.12/24.68). Shared packages/ui/src/spring.ts discards elapsed time beyond 64 ms. Deterministic red test: a 1200 ms frame left value 1.0181914172575377 and scheduled another frame; logs/spring-red.log. Replacing substep integration with the closed-form solution of the same existing oscillator, preserving configuration and velocity. Green: 2 tests, 8 assertions, all three damping regimes and frame partition consistency; performance/browser validation pending. No new engine/library or budget change.
Integration contract proposal (D138/D168/D198): default SSH backend will use the existing HTTPS invitation checks and the very same EnrollmentStore event scope as the admitted remote transports. Each new attempt receives a fresh server UUID and a bounded (owner,batch,host) ownership record; failed cleanup can revoke only that record, including after logout. Add an additive default Backend.completed hook after Installation.commit to retire the ownership record without retaining secrets or leaking it per successful host. No source request or SQL 1–18 renumbering. Readiness will require admitted transport, host.facts.read matching the probed execution UID/remote mode, then an actual PTY output marker; redemption alone is insufficient. Existing unconfigured builds retain the fail-closed adapter.
Completed finite CLI enrollment:
f745ed9c29. Exact installer argv failed before the fix; parser now accepts --enroll-only, default foreground join remains covered. Shared action steps updated (D16/D168/D202). Workspace Rust tests/clippy/deny/fmt passed. Stripped static x86_64 = 19,543,312 B (+1,536 B for the CLI flag/output vs SSH merge; +3,108,000 B vs production). Unchanged size ceiling alone fails under D205; no limit changes. TypeScript 94 tracer tests/10,100 assertions and 36 protocol tests/34,462 assertions passed; build/transfer passed. ARM finite-command size measurement follows after browser timing run.Motion validation, no own compilation during browser runs: first elapsed-time rerun still exceeded the split gate at 1023 ms (draw max 0.80 ms). Scale the existing two-phase spring frequency 1.5x, preserving damping ratios/overshoot and the documented ~600 ms duration. Subsequent red found first animated draw max 4.30 ms despite 624 ms completion; context construction now prepares one pixel and finishes deferred shader work before animated drawing (desktop construction already occurs at idle). Final 4/4 unchanged specs pass: split 564 ms, 22 frames, average draw 0.123 ms, max 0.50 ms; view jump 1.10 ms, window step 4.40 ms, lock toggle 1.40 ms. Load at finish 8.25/18.65/24.55; machine infraternal-dev; CPUWeight=10000; port4791. One shared GL context serves all windows, zero recurring idle work. Logs spring-browser*.log; failure evidence retained artifacts/browser-spring-{first,second,third}. Full scripts/verify fast and final TS gate running before the motion commit.
Production UI seam evidence: 3 deterministic red tests against HEAD
f745ed9c; logs/ui-seams-red.log. (1) createRealProvisioning.mintCredential calls /v1/bootstrap/credential, which the real server does not mount, and returns unavailable. Use the source SSH contract's existing target-bound auth_once over /v1/bootstrap/ws; keep only short-lived in-memory UI references, never a new secret vault or URL/file/argv material. (2) provisioning-client.ts drops Event.host_id, so the canvas sink cannot select the admitted machine. (3) model/document.ts discards host identity when saving/restoring a remote session. Proposal: additive optional canonical hostId metadata in the runtime/document session target, retaining old embedded documents; the server still checks durable ownership and session affinity. Production canvas sink currently does nothing (product.ts:76). Extend existing session/inventory adapters and use shared terminal bindings; no alternate renderer.Completed motion correction:
0dedffa7bc. Existing oscillator now accounts for complete elapsed time; inert/under/critical/overdamped cases and frame partition consistency pass (2 tests, 10 assertions). 4/4 focused browser regressions PASS: split564 ms, avg draw0.123 ms, max0.50 ms; view1.10 ms/window4.40 ms/lock1.40 ms. Single pooled GL context; no recurring idle work. Local weighted microbenchmark normal update0.576 us vs0.620 us; 50 springs/60Hz1.73 ms CPU/sec. Tracer94 tests/10,102 assertions; protocol36 tests/34,462 assertions. Unchanged transfer ceilings pass: critical286,648/307,200 gzip238,170/256,000 br; deferred48,575/51,200 gzip42,844/45,056 br; largest on-demand13,947/20,480 gzip12,411/18,432 br. Native size unchanged19,543,312 B. Logs spring-*.log.Finite-enrollment ARM verification completed at f745ed9c/0dedffa7 (UI commit has no native changes): cargo release aarch64-unknown-linux-musl succeeded in 3m34s; stripped static executable, no PT_INTERP; 17,431,120 B (+1,168 B vs SSH merge; +3,588,976 B vs production
db8c5270). x86_64 remains 19,543,312 B (+1,536 B for finite CLI enrollment). No dependency additions. Existing size ceilings remain unchanged and fail as the measured D205 feature delta; all other fast rows pass. Logs enroll-only-arm.log, spring-fast.log. Production SSH/remote adapter now compiles with all features; authority/cleanup regressions and lifecycle wiring still in progress, not release-ready yet.Production SSH/remote wiring now builds with all features; server --no-default-features remains green. Shared InvitationIssuer reuses the HTTPS admission/owner/session checks and exact EnrollmentStore event scope. Fresh UUID ownership is bounded at1600 records; unpublished future cancellation drops its record synchronously, and serialized capability copies are erased before return. Six focused tests PASS in0.90s: cold CA refuses before issuance/upload, foreign/revoked authority never opens SSH, unpublished cleanup preserves another batch, failed upload revokes only the new UUID even when SSH rollback is unavailable, and retained pending/key-authority tests. Backend waits for admitted transport, then checks production host.facts.read mode/UID and a real PTY marker before Installation.commit. Additive completed hook only releases bookkeeping after commit; housekeeping cannot revoke a proven installed host. Actual container install/certificate/canvas path and full gate still pending; not release-ready. Logs bootstrap-wiring-check.log, bootstrap-no-default.log, bootstrap-wiring-tests.log.
Dialog credential and host-key seams: source adapter called unmounted POST /v1/bootstrap/credential and /host-key; existing authenticated bootstrap socket already accepts start.auth_once and confirm-host-key. Red proof: logs/ui-seams-red.log (credential endpoint unavailable). Adapter now consumes a target-bound local reference once into auth_once, enforces backend byte bounds, discards queued private frames on close, and waits for exact confirmation acknowledgement. 27 unit tests pass, 90 assertions (logs/credential-tests.log); tracer compiler passes. Mock server now accepts the production socket commands and rejects the nonexistent HTTP paths. Browser verification follows after the native gate releases the compiler load. No credentials were written to disk or logged.
Add-host CA preflight proposal (additive D168): retain POST /remote/ca/status.locked and add initialized:boolean, derived from the existing in-memory public issuer projection after the same live-administrator check. The dialog uses this to distinguish first setup from cold unlock, then runs the existing purpose-bound /remote/ca/bootstrap/* or /unlock/* passkey ceremony. No account DEK or passkey PRF is transmitted; only the specified HKDF-scoped CA wrapping key goes to finish. Unconfigured CA endpoints must produce a plain setup/configuration message before opening SSH, not an opaque installation failure.
Completed production SSH-to-CA/remote adapter:
01e6497004. 6 focused tests and 550 full Rust tests pass (59 ignored). No-default server check passes (logs/bootstrap-no-default.log). Migrations unchanged 1–18. x86 static stripped binary 19,573,872 bytes: +30,560 vs preceding head, +3,138,560 vs productiondb8c5270; added adapter authorization/issuer/readiness/canary code, no dependencies. D205 feature-only size exception reported; ceilings unchanged. Actual container UI proof remains pending. logs/bootstrap-wiring-fast.log:Integration review caught a compatibility mistake in merge
4fdaa491: it removed production's public serve_with_plugin_descriptors adapter. The new regression test fails to compile against that head (logs/catalog-red.log, E0432). Restore the public export and pass the caller's exact compiled catalog through the shared startup/router path; ordinary startup still discovers this binary's compiled infraternal agent descriptors. No duplicate startup path or ServerConfig shape change. Verification is running before the correction commit.Real TLS browser fixture incorrectly forwarded every upgrade to /v1/ws and turned text frames into binary. Corrected-route regression on the actual static release server: baseline bootstrap retry receives no usable text reply (logs/bridge-red.log: bootstrap_text_route=false); corrected fixture receives the exact no-batch refusal (logs/bridge-green.log: bootstrap_text_route=true). Preserve requested route and isBinary both ways, and exclude bootstrap frames entirely from protocol diagnostics because they may contain private sign-in inputs. Queue cancellation erases retained buffers. No production transport change.
Credential review found two concrete browser-lifetime bugs: local references accepted the same target id with a changed SSH address (red: logs/credential-address-red.log), and a saved-key prompt finishing after flow disposal could mint a reference/start another run (red: logs/credential-late-red.log). References now bind both id and address; disposed prompts return before minting, and late mint completion clears custody before return. Pre-open commands are capped at eight 32 KiB messages; late socket events cannot revive a closed run (red/green: logs/credential-queue-{red,green}.log). Current credential slice compiler, 99 unit tests/10113 assertions and unchanged transfer ceilings pass. 21 browser cases passed before these additional guards; targeted repeat follows after native compilation.
Completed public startup API restoration:
bcae834d95. Compile regression red/green at logs/catalog-{red,green}.log; full gate 551 tests passed, 59 ignored. Configured remote fixture calls updated; migrations unchanged 1–18. Static x86 19,574,000 bytes (+128 vs01e64970, +3,138,688 vsdb8c5270); no dependency change. D205 size-only exception; limits unchanged. logs/catalog-fast-final.log, verbatim:Completed production socket credential/trust wiring:
7a11db9be9. Compiler PASS; 99 unit tests, 10113 assertions; 36 protocol tests, 34462 assertions. 21 add-host browser cases passed, then final guard repeat 4/5 passed under load31; pasted-key case hit the overall30s deadline and passed unchanged in12.9s under CPUWeight10000 (logs/credential-browser-weighted.log). No timeout/budget raised. Red/green address substitution, late passkey completion, bounded queue and exact acknowledgement tests retained. Transfer: critical gzip286635/307200, br238088/256000; deferred gzip49508/51200, br43694/45056; largest on-demand gzip13967/20480, br12421/18432 (logs/credential-slice-build.log). Native binary unchanged19,574,000 bytes; no deps or migration changes. Fast gate (logs/catalog-fast-final.log), verbatim:Remaining host-affinity/CA UI work is saved as source-only checkpoints in $HOME/.cache/codex-scratch/release-addhost/ui-future/manifest.json, ready to restore after this atomic credential slice. Actual container proof is still pending.
Host-affinity seam: provisioning-client.ts discarded done.host_id, product.ts's enrollment sink did nothing, and live.ts opened every terminal on the embedded host. Source-only prototype is now restored from the earlier checkpoint: canonical admitted UUID reaches the canvas, TerminalClient's existing hostId option, splits and persisted v1 documents; unknown/ambiguous labels fail closed. The browser inventory remembers each session's host instead of attributing all rows to the server. Red evidence logs/remote-session-red.log and logs/ui-seams-red.log; focused20 tests/68 assertions and compiler pass (logs/host-affinity-tests.log, host-affinity-check.log). Transfer remains within original ceilings: critical286666gzip/238127br, deferred50092gzip/44237br; largest on-demand14004gzip/12482br. Full fast gate is running; remote container/canvas proof and remote details dispatch remain pending. These changes will be committed by model/wire/session/inventory/composition step.
Completed identity helper
58bfec5cand additive saved-canvas affinity840cef88on release-addhost. UUID predicate is shared; v1 documents retain UUID/user/address and reject malformed identities instead of routing locally. Prior document implementation fails both new regressions; current model tests and compiler pass. Native code is unchanged: scripts/verify fast logged at /home/kayg/.cache/codex-scratch/release-addhost/logs/host-affinity-fast.log, 551 passed / 59 ignored across 65 suites, all native rows except documented D205 size-only exception. x86 static 19,574,000 bytes, no delta. Aggregate prototype tracer unit gate: 103 passed / 10,127 assertions, compiler and unchanged transfer budgets pass; subsequent module commits are being checked individually. Real remote UI proof remains pending.Completed separate UI modules on release-addhost:
19956b0ecarries the admitted host_id only from canonical completion events (new regression: 19 tests / 70 assertions);e7c96110routes terminals and splits by UUID and refuses unknown/ambiguous labels (2 tests / 8 assertions); af-inventory SHA follows in the next comment. Each tracer compiler passes; native source is unchanged by these commits, sharing the host-affinity-fast.log Rust gate (all rows PASS except unchanged D205 size-only exception at 19,574,000 bytes). Saved-document, session and inventory regressions fail against the prior implementations. No dependency or migration. Production composition and real-container proof remain pending.Completed inventory module
a6f468c2and production compositionf9778cb605. The enrolment sink now registers the admitted UUID and opens its terminal; saved canvases restore UUID affinity first, and historical unknown labels are not rebound locally. Inventory reload/cross-host regression passes (1 test / 4 assertions). Each compiler passes; final aggregate compiler, 104 tracer unit tests / 10,131 assertions and unchanged transfer budgets pass. Logs host-product-{check,unit,build}.log. Native unchanged: x86 19,574,000 bytes; host-affinity-fast.log all Rust rows PASS except documented D205 size-only exception. No migrations/dependencies. Local real-SSH UI proof and CA setup UI remain pending; not a release-completion claim.Completed CA trust-state helper
8aada65b, additive HTTP statusc027e6a9, browser crypto reuse744cdca9, on-demand CA ceremony6e350f7band provisioning hooks71999cf11f. Status exposes initialized + locked only, behind existing live administrator/same-origin checks; finish responses unchanged. Regression fails before and passes afterward for fresh/retained trust; existing 4 CA HTTP tests pass. Browser uses the existing purpose-bound passkey proof and prescribed HKDF scope; transient PRF/account/scoped byte buffers are erased and only the scoped key is sent. Native fast gate: 552 passed / 59 ignored, 65 suites; all rows except D205 size-only exception. x86 19,578,352 bytes (+4,352 from previous head; no dependency/migration). Log /home/kayg/.cache/codex-scratch/release-addhost/logs/ca-status-fast.log.Completed CA UI
f7fe41269c: before SSH the flow offers plain first-time setup or retained-trust unlock, both using the existing administrator passkey ceremony. Root consent is retained; late confirmation after disposal cannot start SSH. Compiler, 108 tests / 10,140 assertions and unchanged transfer budgets pass (critical gzip 286,763 / 307,200; deferred 50,118 / 51,200; largest on-demand 14,438 / 20,480). Browser: both new CA states pass, 22/23 cases pass together; the existing install-failure case passes unchanged weighted repeat in 16.5 s (logs ca-wizard-browser{,-repeat}.log). Native fast table previously posted; no-default server check passes.Local container proof first startup exposed a fixture path issue: owned container/ui-state prefix produced a 112-byte setup-token Unix socket (maximum 107). Changed only scratch fixture state prefix to job/u (95 bytes), rerun underway. Actual SSH trust is preseeded from the controlled container public key; no host key acceptance/change. Software-passkey and SSH inputs remain memory-only; no recovery screenshots/traces. Local auxiliary remote listener is 10.69.69.125:47592 alongside requested static web front :47591.
Completed
fe0761aa: only an overlay fallback is aria-modal and traps Tab; canvas flows participate in ordinary keyboard focus order. Two browser regressions fail before and pass after; palette Escape stays correct (3 tests / 11 s). Compiler, 108 unit tests / 10,140 assertions and unchanged transfer limits pass: critical gzip 286,761, deferred 50,115, largest on-demand 14,453 bytes. Native unchanged at 19,578,352 bytes; native fast table posted on the CA step. Logs flow-{focus,tab}-*.log.Local container proof also reached actual software-passkey CA setup, but SSH failed before private input because the fixture data prefix exceeded the existing credential helper's Unix socket bound (credentials.rs:93–98, temporary ControlPath suffix 17 bytes). Shortened only scratch fixture state/data layout; temporary control path is now exactly 107 bytes, without changing any socket bound or production code. Fourth run underway. No SSH key acceptance/change; no private input entered in the failing runs.
Finding: Wizard.rootCandidates (wizard.ts:423) considers only discovery sudo metadata, so a manually typed root@host skips consent and starts rootless installation. Check::authorize_mode correctly refuses UID 0 for rootless; the new wizard test fails against the previous code (manual-root-red.log). Manual root logins now require the existing explicit checkbox before mode=root; Back lets the operator change the SSH user, and the impossible Install as user choice is omitted. Existing discovered sudo/rootless behavior is retained. Browser and compiler gates underway; no protocol or permission change.
Local real UI proof has created a CA with a software passkey, supplied one-use SSH password in memory, installed the payload and issued a real certificate: owned fixture public counts show 1 remote host / 1 certificate. Readiness still failed afterward; the next run captures the plain failure details after clearing private-input fields. No completion claim. No host key accepted or changed.
Local UI → software passkey → fresh CA → one-use SSH password → uploaded static binary → real systemd service → remote admission and host facts reached the terminal-readiness step. The readiness input incorrectly used even leg-B stream 2; AttachmentHandle requires odd leg-A input, and the actual actor retired the connection. Added an actual EmbeddedAgent/socket-peer regression: red timed out and reset the peer; odd-stream correction passes and a subsequent host.facts.read still succeeds (logs/canary-stream-{red,green}.log). Full gate/release rebuild underway.
The same failure exposed conservative rollback retaining an unjournaled sessions directory; retry then refused the incomplete fixture. Investigating without deleting unknown remote data. The UI also overstates cleanup success; it must describe incomplete installation without claiming all changes were undone.
Completed manual SSH root-consent correction, SHA
573cc303: typing root@host now requires the existing explicit administrator-consent checkbox before installation. A failing unit regression preceded the correction; compiler and 109 unit tests / 10,142 assertions pass, and both manual-root and non-root network/rootless browser cases pass (23.6 s). Production transfer: critical 286,765 B gzip / 238,248 B Brotli; deferred 50,116 / 44,267; largest deferred 14,538 / 12,895. Native code unchanged from ca-status-fast: 552 pass, 59 ignored; only documented D205 size ceiling fails at 19,578,352 B. Evidence: logs/manual-root-* and ca-status-fast.log in release-addhost scratch.Completed readiness routing at
89a6ace9, honest cleanup guide ate80055b3, and real-server WebSocket fixture correction atdbd0d5c0. Actual actor regression red→green; 553 native tests pass / 59 ignored / 65 suites. No-default server check passes (0.50 s). x86_64 static 19,578,352 B, unchanged from the previous native commit; production delta +3,143,040 B. The immutable size ceiling is the sole fast-gate failure, reported under D205; no limits changed.Model tests: 20 pass / 74 assertions; tracer compiler and transfer budgets pass. Critical JS 286,768 gzip / 238,248 Brotli B, deferred 50,112 / 44,258 B, largest on-demand 14,587 / 12,942 B. Real-server bootstrap route/frame-type regression fails before fixture correction, passes after (5.9 s); private bootstrap frames are excluded from protocol diagnostics. Full output: release-addhost/logs/canary-fast.log.
Verbatim fast-gate summary:
Readiness still failed after correct leg-A input. The controlled target ran an actual systemd terminal shim and its canary shell exited; the check accepts only Output and ignores authoritative Snapshot frames. Added a snapshot-emitting actual-actor regression: red timed out at 5 s; accepting both confirmed output forms now passes both actor tests. Rebuilding static binary before claiming container success.
Fresh rollback regression: empty sessions/sessions blocks root removal; unexpected data and symlink cases lose the owner marker. Three real-files tests fail before the correction; all 28 installer tests pass afterward (1.86 s). Cleanup now removes only empty owned runtime directories without following a link, and preserves the owner marker plus exact inode-bound receipt when unknown data remains. It never recursively deletes runtime/session data.
Local actual UI → fresh software passkey CA → private one-use password → static upload → systemd user service → certificate → admitted remote host → usable canvas terminal succeeded. Controlled container rootless UID 1000; certificate validity 604,800 seconds; Continue→ready 6,875.99 ms; Continue→confirmed terminal output 8,528.22 ms; SQL remote terminal count 1. Screenshot artifacts/remote-terminal-desktop.png; safe phases/public-ledger metrics logs/container-ui-eleventh.log. Static x86_64 now 19,578,416 B (+64 B across pending rollback/runtime + snapshot corrections).
Fixture correction: shared host devpts has a mode-000 pts/ptmx; the container inherited a symlink and unprivileged PTY creation failed with Permission denied. Replaced only the owned container /dev/ptmx symlink with its own 0666 c5:2 device; no host devices or limits changed. The preceding failed real attempt now rolls back completely: installation root and unit absent, demonstrating empty-runtime cleanup on real files.
Remote echo benchmark pending: Chromium alone had the fixture hostname resolver rule; the independent measurement client failed DNS. Use the named local listener IP with unchanged pinned Origin, then repeat the fresh proof. No external VM contacted or host key accepted/changed.
Complete local UI/container proof (logs/container-ui-thirteenth.log): Continue→ready 6,276.50 ms; Continue→confirmed remote terminal 8,208.85 ms; rootless UID 1000; certificate 604,800 seconds; public SQL remote terminal count 1; canvas layout restores after reload. Actual remote echo through browser protocol + admitted transport + real PTY: n=1,000, p50 5.670 ms, p99 28.148 ms, max 66.740 ms; machine infraternal-dev / 8 cores / load 21.33,24.49,19.43; CPUWeight=10000 scope; no synthetic CPU or output load.
Local scale proof (logs/echo-scale-first.log): 50 real PTYs × 20 samples = 1,000 echoes; echo p50 0.33 ms / p99 5.29 ms (350 ms budget PASS), input Ack p50 0.24 ms / p99 3.10 ms. Load start 32.24,25.03,18.67 and finish 31.98,25.10,18.73; same 8-core machine / CPUWeight=10000 / zero injected RTT. Fixture cleanup restored PTY usage; no host limits changed. Screenshots artifacts/ca-setup-desktop.png, ssh-install-ready.png, remote-terminal-desktop.png, remote-reload-desktop.png. Native source has pending atomic snapshot/readiness + rollback corrections; full gate running before committing them. D198 generic lifecycle integration, target-specific host details, full suites, final upgrade/artifacts/operator record remain outstanding.
Completed atomic slices: SSH rollback
117dcc19retains ownership and cleanup receipts around unknown files and removes only empty owned runtime directories; three real-filesystem regressions red→green, all 28 install tests pass (1.86 s). Actual failed-container retry now removes its fresh root and unit. Snapshot readinessa5dea8ccaccepts the same bounded split marker in Output or Snapshot; actual actor regressions pass for both forms.Native checkpoint: 557 tests passed, 59 ignored; fmt, clippy, tests and dependency policy pass. Static x86_64 is 19,578,416 B, +64 B across those native changes; only the immutable size ceiling fails under D205. Installed payload SHA256 c83cdc5cbd6340ad5a4439dbc2e0a1e2a72767288369ab193780b7287b629178.
Cancellation wording
2dd4451bno longer claims rollback completed: two browser cases pass (40.4 s), compiler and units pass. Reusable primary/secondary buttons98913b33and dialog reuse153dad0aremove duplicated states [D160]; compiler, 25 unit tests/84 assertions and unchanged transfer ceilings pass. 27-case browser run: 26 passed; obsolete policy fixture stopped at the required root consent. Corrected consent-aware testbefc4585passes (16.1 s total). Real fixture optionsd8ecd870support the isolated release proof already recorded; all private material remains in memory.Current finding: details-live.on-demand.ts sends bare host.facts.read even for a remote window, presenting the server's login/address and facts. A new unit regression fails on that bare input. Additive bounded node addressing (proposal already recorded) now selects the canonical enrolled UUID, verifies ownership/revocation via the existing terminal selector, and refuses malformed/unknown routes without local fallback. Parser regressions red→implementation underway; full native/browser gates running. No deploy.
Node-addressing checkpoint (uncommitted): a clean scripts/verify fast run passed 562 tests / 59 ignored, fmt, native fmt, clippy and dependency policy. Only D205 size fails: stripped static x86_64 19,587,184 B (no PT_INTERP). Core-only cargo check passes. The real owner-socket regression refuses unknown/partial targets without forwarding to embedded leg B. Tracer: 111 tests / 10,150 assertions, compiler and unchanged transfer budgets pass.
Strict addressing regressions: positional target arrays were accepted by Serde structs; red test then explicit nested-object guard passes. A second red test shows JSON-map normalization drops duplicate inner plugin fields. Fix underway: retain the original inner bytes using the existing serde_json raw_value feature, so each plugin keeps its frozen validation/duplicate policy. No new library or version. Parser smoke executed 10,000 inputs; it was not coverage-instrumented, so this is not a coverage claim.
The earlier browser/native overlap hit two overall browser deadlines; that run is retained, not waived. It will be repeated without this job compiling concurrently. Two overlapping native attempts also shared a log path; their mixed log is discarded as gate evidence. The independent clean checkpoint above is logs/node-target-clean-fast.log. Runtime plugin lifecycle integration and final real-server/browser/migration/artifact gates remain outstanding. No deploy.
Checkpoint gates are not green yet. node-opaque-isolated-fast.log failed SSH config_isolation because its new job-local cfg-* root made the OpenSSH temporary socket path exactly 108 bytes; shortened only that fixture prefix, focused test now 4/4 PASS. node-array-isolated-fast.log then failed Mesh review_liveness with "server closed websocket unexpectedly: None" (auth/tests.rs:1728), server suite 270 PASS/1 FAIL/30 ignored, 337.82 s. Its standalone unchanged repeat passed in 11.75 s: initial_live=true current_live=false revision=0 expiry_event_received=true. Host load 42.89/29.04/21.89, 8 cores. This Mesh failure is not among #118's allowed baseline waivers; final fast gate will be repeated without concurrent owned builds/browser and with serialized test scheduling, without extending any timeout or budget.
Node parser's explicit canonical UUID + input-array case failed before the object guard; original duplicate inner fields remain byte-for-byte opaque via serde_json's existing raw_value feature. UI details: compiler/build/transfer checks PASS; 4 focused tests/12 assertions PASS, including unknown-host no-RPC/no-server-login/address.
Real end-to-end test of
d8ecd870against a stock Debian 13 VM (perf VM, temporary sshd :2222). Verdict: NOT ready.fingerprints[0](RSA), the connection negotiates ED25519 and fails, and the dialog loops. A second trust is refused, andtrust.rsis create-only, so the host stays stuck. The job's local proof pre-seeded trust and missed this.scripts/build-vtneeds zig on PATH. Host processes show ascurrent/live.Evidence:
~/.cache/codex-scratch/addhost-e2e/evidence/. The VM was cleaned up afterwards.Round 2 started from
d8ecd870(Sol), with exactly these fixes. The previous round's unrelated lifecycle WIP is parked onrelease-addhost-wip(f7d90427).Round 2 started on release-addhost at
d8ecd870fa, sole writer. Read contract, decisions, architecture/process and issue history. Scope is the seven real-VM findings; release-addhost-wip stays excluded. First findings: trust.rs observes multiple keys but configure_pin does not pin an algorithm; credentials.rs puts Unix sockets below data-dir scratch. docs/design/TASTE.md and D168/D211/D213 are absent at this head; use explicit brief and recorded issue requirements. No push/deploy or remote VM access.Round 2 findings: terminal.ts:738 accepts terminal.exited without changing browser lifecycle; websocket.rs:654 forwards it but no production code writes terminal_sessions.closed_at/exit_status. Transport already emits and routes the event. Remove-host will delete visible inventory and application-owned bootstrap trust while retaining the public remote_hosts revocation tombstone required by contracts/remote-agents.md and ON DELETE RESTRICT certificate/session references. Additive proposal: remote.host.remove is declared in the remote plugin, with purpose-bound fresh owner passkey start/finish and authenticated owned-installation uninstall. First build gate failed initial_attach_requires_explicit_credit_before_replay with FileNotFoundError target/ac162575 (verify-agent-attach-credit.py:17), not a protocol failure; prepare ignored target symlink to job home build target and rerun unchanged test/full gate. Pinned-Zig regression failed first with zig: command not found, then passed using auth-tools/zig/zig without ambient Zig.
Completed pinned-Zig recipe
2fcc2c70and separate regressioneff6ea06. No ambient compiler is selected by build-vt or verify; no new dependency. Regression red: zig command not found; green: PASS build-vt selects pinned Zig without Zig on PATH. Full repeat native fmt/clippy/tests/deny pass; static x86 19,578,400 B (baselined8ecd870measured by the first gate 19,578,400 B; delta 0 across the script set), no PT_INTERP. Existing D205 size ceiling is the sole remaining gate failure. First gate test failure was missing target/ac162575; unchanged attach-credit repeat passed funded replay 149 B in 686.2 ms and complete repeat passed. Full log evidence/addhost-round2/build-fast-repeat.log. Verbatim gate:+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | FAIL (1) |
+---------------------------+--------------+
Completed host-key transport fix
5e80afd2. Real rootless sshd offers RSA2048, ECDSA p256 and ED25519; no preseeded trust. One displayed ED25519 key, one confirmation, two authenticated connections; explicit changed-pin replacement and stale confirmation refusal PASS, 0.89 s. Stripped static binary 19,608,384 B, +29,984 B; no added dependency. scripts/verify fast output verbatim:+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | FAIL (1) |
+---------------------------+--------------+
Round-two trust contract correction authorized by brief: replace create-only pins with explicit-confirmation-only atomic replacement. Bind a challenge to the old pin and effective algorithm policy, prefer one allowed ED25519 key, pin negotiation to that type, retain external known_hosts/KRL untouched. Failure adds optional host_key_type and host_key_changed. Helpers use a short owned runtime directory, independent of persistent data-path length. Browser production-build regression and four desktop/phone captures pass; captures are fixture-layout evidence, not live installation proof. Broader add-host run: 36/41 pass; obsolete blur expectation, three footer measurements during hidden progress, and one proxy keep-alive failure (repeat passes) need correction/evidence.
Completed short-runtime helper fix and real sshd regressions. Branch release-addhost; native gate clean except D205 size 19,608,896 B (+512 B from runtime selection). Long data-path and all-three-key tests: 2 PASS in 0.90 s. Machine infraternal-dev, 8 cores; latest load 1.27/1.44/3.17. Gates verbatim:
+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | FAIL (1) |
+---------------------------+--------------+
Completed commits: runtime helpers
15685d47, multi-key real sshd regressionsff65f75c; process namingf0d24564+ regression2f58a607; durable shell-exit publicationb00f0a06+ migrated database/passkey regression5c8da17e. Process regression failed with live, now /proc/comm infraternal. Exit regression first failed missing closed_at, now idempotence, status7, binding and logout checks PASS. Static binary 19,616,096 B, +7,200 B for process naming and durable exit checks; no added dependencies. Gate output verbatim:+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | FAIL (1) |
+---------------------------+--------------+
Deployed to production:
0d93a502.ff65f75c, plus production webd82d0fb9, plus ui-platform, with the provisioning service loaded on demand.remote-listen.conf, adds--remote-listen 10.69.69.50:7443 --remote-ca-dir /var/lib/infraternal/remote-ca. That is D64's port, QUIC on UDP plus the TCP/TLS fallback, on the NetBird address only. The server is healthy, and the CA ispendinguntil the owner runs the passkey setup.Real VM gate (
ff65f75c, stock sshd offering RSA, ECDSA and ED25519, no pre-trust): PASS.Open:
The round-2 job continues on these.
Restarted round 2 on release-addhost at
ada55317(based8ecd870), sole writer. Read current #87/#78/parent #5 history and repository rules. Existing committed trust/socket/Zig/process/exit work retained; uncommitted removal and diagnostic draft retained. Resume removal first, then remaining diagnostics, payload shipping and real-container gates. Latest brief authorizes per-item pushes; no deployment or external host access. TASTE.md and later decision entries remain absent at this branch.Removal checkpoint: fresh passkey/offline revocation/replay regression PASS (0.94 s); 25 UI model/routing tests PASS, 89 assertions; dev
d82d0fb914→19 migrations PASS with ownership, foreign keys and integrity retained. Private uninstall action excluded from browser catalogue; handler is installed only for a validated managed remote installation, with no idle worker. Cleanup response reports requested vs unreachable rather than claiming completion. Additive migration retains certificate denial tombstones. Full native gate and all-three-key/no-pretrust container proof running.Additive removal contract refinement before final registration: remote.host.remove supplies its label/help once; /remote/hosts/actions exposes that definition only to a live owner. /remote/hosts/remove/start binds host UUID, uninstall choice, original session hash, owner and 300-second deadline in a bounded private purpose registry. /finish requires the same host UUID and real UV passkey proof, refuses ordinary-login/CA challenges, replay, logout and role loss; a writer transaction serializes final authorization, bounded uninstall handoff, visible inventory deletion and the existing revocation fence. Public certificate tombstones remain. Internal node uninstall is absent from browser descriptors. after_write is an additive generic plugin API continuation: dropping a failed writer discards its effect; successful transmission starts it. No idle worker when disabled.
Round-two worktree gate: fmt, VT native fmt, clippy, tests and cargo-deny pass. Sole failure is D205 size: stripped static x86_64 is 19,885,856 bytes, +269,760 bytes over the process/exit commit set (19,616,096), from removal handoff, owned uninstall and bounded CLI/HTTP adapters. No new dependency versions (Cargo.lock adds existing shim/nix edges). TypeScript fast separately passes: 114 UI tests / 793 assertions and 36 protocol tests / 34,462 assertions; critical JS gzip 287,064/307,200 B, deferred 50,497/51,200 B. Migration: dev
d82d0fb914→19, ownership/FKs/integrity clean. Browser and real container gates in progress.+---------------------------+--------------+
| Rust gate | Result |
+---------------------------+--------------+
| fmt | PASS |
| VT native fmt | PASS |
| clippy | PASS |
| test | PASS |
| cargo-deny | PASS |
| static builds | FAIL (1) |
+---------------------------+--------------+
Correction to the preceding comment: the 114 UI tests performed 10,156 assertions (not 793). The protocol count is unchanged: 36 tests / 34,462 assertions. Evidence: logs/round2-ts-fast.log lines 175–178 and 311–314 under the job scratch directory.
Completed atomic implementation steps (still awaiting real-container gate before the whole removal item is pushed):
fce16692remote: enable existing shim and Unix support for owned uninstall3f2e5ab0plugin-api: defer destructive effects until acceptance is writtenbd8472c5plugin-api: verify deferred effects require successful reply deliveryd19e4fedremote: remove only a validated bootstrap-owned installationc4d2a1c7agent: register uninstall only for a checked managed remote installation7541d662agent: write control acceptance before releasing plugin effects67a0ea22agent: prove failed acceptance writes cannot start cleanup1027253fremote-client: forward managed installation identity to authenticated dispatch7ad54ab2server: retain public removal receipts and forget bootstrap coordinates95b37843ssh: describe failed install steps and missing architecture payloadsc3449659ssh: expose the effective trust lookup for removal0cecbfe9ssh: forget an owned host pin under the publication lockff20b544ssh: preserve upload install join and start error boundaries82d88494ssh: report allowlisted host diagnostics from authenticated commands0006fea5ssh: name unavailable payload architecture and expected executable pathba55167fssh: cover truthful step errors without reflecting private outputcde29c5aserver: share the revocation fence with fresh host removal1ae608d9server: bind host removal to fresh owner passkey authorityd64f7692server: admit bounded same-origin host removal requestsd62f08f5server: mount removal behind the optional remote feature18bdfc6fserver: test real fresh-passkey removal and authority loss3b3e8263server: persist bootstrap lookup and refuse duplicate host enrollmentEvidence: scripts/verify fast: fmt/VT fmt/clippy/test/cargo-deny PASS; static-size-only FAIL under D205 (x86_64 19,885,856 B, +269,760 B). UI fast: 114 tests / 10,156 assertions; protocol 36 / 34,462. Fresh remote-feature removal subset: four pass in 2.58 s. Migration dev
d82d0fb9: 14→19 clean. Decoder smoke: 10,000 runs without panic; this ordinary libFuzzer build has no coverage instrumentation, so it is not coverage evidence. Browser attempt interrupted after 15 pass / five timeout failures under load 38 on eight cores; all will be rerun, none waived.Completed CLI/UI/distribution steps:
bd8ef5e3cli: pass managed uninstall context and report authored join failuresd3a34a4ecli: test public join diagnostics never include private transport detail4438a361cli: implement host removal with private-stdin passkey proof9e5a3568cli: expose removal and registry-derived skill instructions14fe1b59tracer: confirm named host removal with a fresh passkey833a393atracer: forget removed remote host inventory0fd6500dtracer: cover explicit remote inventory removal02ea5e94tracer: load removal on demand and close the removed host windowse2c769bdtracer: expose registry-named removal in the command palette44f55817tracer: offer shared removal confirmation from machine detailse6ad09a7tracer: show the failed install step and an already-added host plainly0f3b7b7dtracer: cover install boundary missing payload and duplicate-host wording3204880arelease: package the server with both static host payloadsf0ef39a2release: verify complete payload bundles and dev-shape migration72bf1181fuzz: exercise production removal and private uninstall decoders9eefd3b5contracts: document fresh removal and complete host payload distributionGates unchanged: Rust fast all rows PASS except D205 size; UI fast 114 tests / 10,156 assertions. Bundle test PASS, both architectures are present beside the server in /home/kayg/.cache/codex-scratch/release-addhost/round2-bundle (no deployment). Real container test is being corrected for shared-footer controls and revealed password state; no product trust blocker observed. Browser finding: saved/pasted-key specs still expected the obsolete saved-key wording; actual product says “Signed in with your key”. Spring-direction sampling after a delayed round trip caught intentional overshoot (+2.12615 px); regression now records each arriving pane before the next frame. Full browser rerun follows these assertion corrections.
Real-container finding: the owned uninstall helper returns 1 while a retained shell socket exists. Authenticated local protocol probe receives Hello (59 B), Output (267 B) and Exited (13 B), then the shim closes the peer. Evidence: crates/infraternal-shim/src/session.rs:653 rejects Signal when the PTY already exited; uninstall sends Signal(9) after Attach/ReadFrom and therefore races an already retained exit. Additive contract proposal: an allowlisted Signal after exit is an idempotent no-op, preserving the retained Exited/ExitAck exchange; unsupported signals remain refused. This is needed to remove hosts that have closed terminal sessions, within #87 scope. A real-PTY failing regression will precede the fix. No lifecycle/WIP branch is imported.
Started independent robustness audit on review-addhost-breakit, base/head
ada5531737. Tests/findings only; push this branch after each atomic commit. #87/parent #5 history retained in job scratch. This head lacks docs/design/TASTE.md and D168/D181/D212–D218; explicit brief and issue requirements govern. Docker direct socket denied; sudo -n docker info succeeds (29.8.2). Only disposable local containers/namespaces will be contacted; no external host access. Unique browser port 4287; build/fixture scratch under HOME cache.P0 B01 confirmed at
ada55317: Installation rollback deletes pre-existing unowned .new publication files after link/noclobber creation refuses them. Real-filesystem regressions: 0 pass / 3 fail in 0.83 s, all print cleanup_ok=true foreign_survives=false. Paths: ~/.local/bin/infraternal.new, ~/.config/systemd/user/infraternal-agent.service.new, ~/.local/share/infraternal/bin/current.new. install.rs rollback unconditionally removes these paths without creation ownership. Tests in crates/plugins/ssh/tests/install.rs; evolving evidence docs/verification/addhost-breakit.md. No product code changed. Real-sshd Debian reproduction and full gate are in progress; commit/push follows gate. Required: preserve unowned paths/bytes and report truthful recovery.P1 B02 recovery finding at
ada55317: losing batch memory after a completed upload leaves .bootstrap-lock/transaction permanently blocking a fresh attempt, even reusing the same host binding and before any service activation. Rust real-filesystem oracle restart_can_recover_an_interrupted_upload_without_old_batch_memory: 0 pass / 1 fail in 0.17 s; AUDIT restart_retry_ok=false journal_survives=true. Cleanup coordinates exist only in HostState.cleanup (bootstrap.rs), and Installation::new picks a new transaction; stage cannot recover the old journal. No product code changed. Required: securely retain/recover interrupted transaction ownership across restart or provide an explicit actionable recovery path. Evidence is being appended to docs/verification/addhost-breakit.md; tests will be committed/pushed separately after gate.Load-window comparison (#118): full worktree test gate at load up to 60.62/50.15/40.47 failed three auth socket rows (two received error instead of changed/snapshot, one Elapsed). Detached dev
b9b61d07passed those exact three rows with its default features; remote is absent there. This does NOT justify a waiver. Unchanged current compiled test binary rerun passed all three at load 45.08/38.00/38.04: 12.21 s, 1.47 s, 2.71 s. Extra baseline scale test was stopped after the required comparisons; baseline checkout removed. A fresh complete gate is running with the final clippy fix. Browser final 300 ms RTT run is in progress; corrected animation direction passed individually in 12.8 s. Logs: baseline-auth-sockets.log, current-auth-socket-rerun.log, round2-fast-release.log, round2-browser-300-final.log under job scratch.Completed decoder correction:
1c69786f; socket regression:5d8520fe. Real stock three-key SSH container reached terminal and restored the same session, then exposed already_added=true being discarded in apps/tracer/src/provisioning-client.ts. Missing payload architecture/path was discarded by the same decoder. Regression failed with undefined before correction, now passes (1 test, 2 assertions); TypeScript check passes. Earlier real 1000-echo measurement: p50 3.42 ms, p99 15.60 ms, load 15.51/20.08/26.19 on infraternal-dev, 8 cores. Remaining full container flow being completed. Remote details currently uses local host facts; recorded as outside this brief, without importing parked lifecycle/registry work.Real container proof now passes second add (already added, no key loop, no second certificate) and remote shell exit (window closes without more input, durable status 0). Removal revoked server access but retained host files. Finding: Signal(9) targets the PTY foreground process group, so it killed raw cat and left the login shell alive; first cleanup timed out, a second cleanup then succeeded. Added failing socket regression (1.00 s timeout), corrected helper to signal the restored foreground group every 100 ms within its existing 2 s deadline, preserving partial frame reads across ticks. Regression now passes in 0.20 s, including a split frame across a tick; no protocol or engine changes. Full fast gate and fresh real cleanup proof in progress.
Real packaged container reached successful second add and durable remote exit, then remove receipt said host_cleanup=unreachable although the terminal was live. Startup finding: crates/infraternal-agent/src/plugins.rs creates the uninstall plugin while SSH bootstrap still holds .bootstrap-lock (crates/plugins/ssh/src/install.rs removes it after service readiness). Full constructor validation rejected the handler permanently. Registration now validates owned identity/artifacts without requiring bootstrap completion; every action and cleanup still requires the lock to be absent. Added rootless owned-files fixture: handler exists during bootstrap, dry-run is refused while locked and accepted only after unlock. Corrected fixture files to installation modes 0600 under this host umask. Full gate and packaged real retest running. Earlier helper correction
e77efe06and regressionf32ca7d5are pushed; both static payloads rebuilt and checksummed, pending this startup fix rebuild.Completed startup registration source
8353e388and locked-request regression83952d86. Real three-key container now reports host_cleanup=requested and removes unit, enable link, binary and data in one removal. Its final assertion found a remaining trust pin. Cause: crates/plugins/ssh/src/auth_order.rs Pending forwarded authentication but not the selected SshSession trust_lookup, leaving remote_host_bootstrap.trust_lookup NULL. Failing authentication regression returned None; forwarding the selected public lookup now passes all six ordered-authentication tests. No trust-path reconstruction or broad trust deletion; server removal retains the existing exact lookup/shared-reference guard. Both static payloads and final full gate are being rebuilt.Finished round 2 on release-addhost, head
8b69ba22b1; pushed, no deployment. Source fixes through72fff910; following commits attach real proof and reproduction records. Parked release-addhost-wip was not imported.Implemented registry-defined Remove host across UI/CLI/API/skills with fresh owner passkey, existing revocation fence, inventory/trust deletion and owned host uninstall; prompt durable remote exit; honest install/payload/copy diagnostics; process names; complete server + x86_64/aarch64 static payload packaging. Real-container findings additionally fixed foreground job retirement, handler registration during bootstrap lock, and authentication fallback dropping the trust lookup.
scripts/verify fast final output (verbatim table; complete stdout in evidence/addhost-round2/verify-fast.log):
PT_INTERP: absent; size: 19892640 bytes (baseline 16142672 + allowance 262144 = max 16404816)
binary exceeds the 16404816-byte size budget: 19892640 bytes
Size failure reported under D205, no profile weakening. x86 growth +314240 B from
d8ecd870; removal set +269760 B, late helper/registration/lookup corrections +6784 B. ARM 17729832 B, both stripped/static. Existing dependency versions and engines reused.Separate TypeScript gate PASS (combined gate stops at size): critical JS 287065/307200 gzip B; deferred 50562/51200. Decoder socket regression PASS, 1 test/2 assertions. Add-host browser coverage: 40/41 in the default 300 ms run, fixture-reset ECONNRESET before cancellation; fresh cancellation rerun PASS, completing all 41 cases. Both outputs committed; no claim of a single clean 41-case run.
Real no-pretrust stock Debian container with RSA/ECDSA/ED25519 PASS: one ED25519 trust click, rootful UID 0, enabled service, 604800-second cert, actual terminal, reload same session, duplicate says already added without another key prompt/cert, shell exit closes its window without more input and persists status 0, fresh-passkey removal revokes live access and deletes inventory/trust plus unit/enable-link/binary/data. evidence/addhost-round2/container-pass.log and production screenshots are committed. Functional 20 echoes p50 2.68 ms/p99 12.00 ms at load 12.43/12.82/17.93. Separate 1000 echoes p50 3.42 ms/p99 15.60 ms/max 311.49 ms at load 15.51/20.08/26.19; that earlier run stopped at the later-fixed duplicate decoder, recorded explicitly. infraternal-dev, 8 cores, weighted local scope. No perf VM or SSH to another host.
PASS: dev
d82d0fb9shape (14 migrations) upgrades to 19 migrations; ownership retained, foreign keys and integrity cleanPASS: release includes server + both executable host payloads; checksums match; incomplete bundle never publishes
Production decoder fuzz target: 10000 ordinary smoke runs, no panic, without coverage instrumentation. Author checklist completed.
Tested bundle: /home/kayg/.cache/codex-scratch/release-addhost/round2-tested-bundle (infraternal, infraternal-x86_64-musl, infraternal-aarch64-musl, SHA256SUMS). Full record and reproduction: evidence/addhost-round2/README.md at this head. Temporary build targets/fixture removed; review evidence and release bundle retained.
Preexisting remote details fetch local host facts, outside this brief, recorded with evidence; no parked lifecycle/registry work imported. Issues left open for orchestrator's VM rerun.
kayg referenced this issue2026-10-28 17:53:56 +00:00