Added hosts don't come back unless their window was saved in this browser #194
Open
opened 2026-10-12 17:59:40 +00:00 by kayg
·
63 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#194
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Owner 2026-10-12 asked how to see already added hosts and open a terminal on production. Production (release-prod-5) registers remote hosts in the canvas only (a) when add-host enrols them and (b) from this browser's saved canvas layout (product.ts resolve → sessions.registerHost). ⌘K 'Open shell on ' lists only those. A host whose window was closed, or added from another device or browser, is missing. Fix: on sign-in (and on each welcome) load the account's admitted hosts from the server and register them; offer them in ⌘K and in + / New window. Job: hosts-from-server.
Started hosts-from-server at
efac27a598(origin/dev base). #194 has no comments and names no parent issue. Tracing remote_hosts and terminal admission before changing the data path. D16/D198/D250/D256 apply; task explicitly authorizes branch pushes and perf VM measurements.Finding: websocket.rs:1680 authorizes remote terminal routing with remote_hosts.id + owner_id + revoked_at IS NULL. mesh.list uses numeric mesh node IDs and has no admitted UUID mapping; it is not a terminal inventory. remote_host_bootstrap already stores the display destination; host.facts.read is collected at readiness but discarded (bootstrap_remote.rs:272). Proposed additive contract: remote.host.list {after?: canonical UUID} returns <=128 account-scoped admitted rows {id,name,user?,os?,address?,online} and next cursor; remote.hosts subscription invalidates that same source after admission/removal/connectivity changes. Reuse enrollment/bootstrap records; cache OS on the bootstrap row. No host RPC or first-terminal dependency during browser listing. D16/D198/D214.
Step 1 committed and pushed:
a62f27eaenables existing bytes/socket-host types only for the remote server feature. fmt and remote clippy passed; remote server-feature library tests: 11 passed, 0 failed. Client regression reproduced before implementation: hosts.test.ts could not load the absent synchronization module. The new implementation passes 7 focused storage-independent admission/routing tests. Perf VM access confirmed (infraternal-perf-test); no measurement run yet.Steps committed/pushed:
f993ee99adds the remote plugin read action, bounded JSON decoder, idle-free subscription worker and cancellable node observation; 12 remote library tests and all-target clippy passed. Schema commit adds nullable bounded OS on remote_host_bootstrap; deployed-v11 migration/idempotence and real SQLite preservation tests passed. Server inventory tests pass at 1,001 hosts with maximum-length destinations: complete unique pages below 64 KiB, account isolation, offline rows, revocation and invitation exclusion. Production-bundle browser test at 300 ms RTT passes fresh-storage discovery, UUID open routing, reconnect deduplication and live removal; screenshot evidence/hosts-from-server/admitted-offline-host.png. Author review found refusal must withdraw stale admission: failing-before client-refusal-red.log captured; fixed test passes.Author review finding (fixed before handoff): the new plugin originally bounded authorization around SQL but sent Result outside that operation. A saturated outbound queue could release the host inventory after socket authority ended. A failing-before regression revocation_cancels_a_result_waiting_for_socket_credit reproduced the delivery (server-refusal-red.log). Keep the live-authority operation active through result serialization and queue admission; initial subscription events use the same guard. This is a new-code defect, not an inherited production behavior.
Completed/pushed steps:
b99d6dd2OS migration;3660150aaccount-ledger source and server plugin integration (3 SQLite tests, 1,001-host bounded pagination; server all-target clippy);c646c0f1atomic sessions adapter (27 session tests);3518cee5welcome/change synchronization;b4ba213bexisting palette/product data wiring and browser regression;2f045ea7compiling cursor JSON fuzz target.6dd4da46fixes the author-review outbound-authority finding; 13 remote library tests and all-target clippy pass. Full fast milestone gate is running. Baseline and candidate browser artifacts plus the real-server measurement harness are staged on the perf VM; no timing claim before the locked run.Full fast milestone found a new-code startup failure: inventory descriptor id remote-inventory does not prefix remote.host.list, so PluginDescriptor::validate rejects the server configuration (remote_server_tests.rs:238). Direct inventory tests did not run startup validation. New failing-before inventory_descriptor_is_valid_for_server_startup reproduces it (descriptor-red.log). Fixed the plugin id to remote.host, matching its action namespace and remaining distinct from the existing remote transport descriptor. Rerunning startup and full gates; no baseline exemption.
Static x86_64 milestone artifact is 22,510,544 bytes; the frozen fast gate allows 16,404,816, so this row is red. No budget change or exemption taken. Building the exact starting dev commit
efac27a598to attribute the size delta. origin/dev has advanced in the shared repository during this run; comparisons use the recorded base SHA, not the moving remote ref. The descriptor and original HTTP startup regression now pass. The VM harness preflight refused a too-long Unix socket path before starting a fixture; rerunning with owned short runtime path /root/infraternal-bench/h194.VM integration finding: the palette caches provider rows at opening, so opening before the 1,000-host paged snapshot completed left the host absent even after data arrived. A failing-before production-bundle browser test also retained a removed host while the palette stayed open (open-palette-red.log). Fixed in
79679f4aby refreshing the existing palette from sessions changes while preserving query and selected action; hidden/scoped palettes stay idle. The 300 ms RTT browser regression now passes without closing/reopening.2052fbaaalso fixes explicit embedded identity/split routing when an admitted remote shares the server name; failing-before embedded-red.log, 28 session tests pass. Rebuilding/staging the corrected client for the VM rerun.VM first-frame run (12 fresh contexts/variant, 1,000 hosts, fixed 300 ms RTT): baseline p50 1400.2 ms / worst 1635.3 ms; candidate p50 1380.3 ms / worst 2220.4 ms. Load 0.63/0.85/0.60 before, 1.54/0.99/0.66 after. This does not establish no first-frame delay. Moved inventory module and RPC behind the first terminal paint (or unavailable/blank attached terminal recovery); functional browser ordering now passes. Rerunning on VM with public request timestamps. Exact-base x86_64 static artifact
efac27a5is 22,464,880 bytes; candidate pre-latest-event repair is 22,510,544 (+45,664), both above frozen 16,404,816. No size exemption. Head fast also hit three unchanged transport timing tests in the host daemon under parallel execution; rerunning the full transport library serially, without treating them as an allowed #118 exemption. Author review additionally found private events missing their generation stamp; failing-before event-generation-red.log fixed in62ecc817, 15 remote library tests pass.Completed
787181f0: a failing-before offline transition test exposed an unsent inventory call queued after socket loss; refresh now checks welcome state before each page. All 29 sessions tests pass.Completed
c41a753band940b2c4f: kept the existing discovery provider ordering and adapted existing removal fixtures to additive OS metadata; targeted discovery, withdrawal, removal tests and server clippy pass.Completed
171448cd: attachment can precede the first visible glyph. Inventory now waits for nonempty rendered terminal text, with a one-shot quiet-session fallback. Production-bundle browser test passes with fresh storage, offline admission, UUID shell opening, reconnect and removal while the palette is open.Perf VM evidence: 1,000 hosts, 12 fresh browser contexts per variant, 300 ms RTT, real server/PTY, 4 vCPU/7 GB, shared lock held only for measurement. Baseline
efac27a5bundle: median 1371 ms, sample max 2430.6 ms. Candidate: median 1379 ms, sample max 2406.7 ms. Inventory preceded the first glyph in 0/12 candidate samples. Load before 1.67/1.18/0.81, after 1.32/1.13/0.82. Evidence and reproducible harness are on the branch.Blocked gate: original fixed dev base
efac27a5x86 static binary is 22,464,880 bytes against frozen max 16,404,816. Current candidate is 22,512,464 bytes. No budget was changed. Final full branch-head gate is still running; this is not reported as done.Completed
945ff59b: the final transfer gate exposed promotion of a lazy module entry point and shared sessions imports into critical transfer. A failing-before graph test records it; the inventory source is now a deferred root because it loads after terminal readiness. Budgets are unchanged. Full TypeScript gate: 185 tracer tests and 36 protocol tests pass; critical gzip 295313/307200, brotli 245723/256000; deferred gzip 50985/51200, brotli 45056/45056 bytes. Evidence is under evidence/hosts-from-server/.Repeated the perf run with final native server SHA-256 97e2413499a2cf574f68ac9c49d097f67ea8b5359460204eddbf5fd1aa75a6b4 (server source through
940b2c4f), frontend readiness171448cd. Same fixed baseline, 1000 hosts, 12 fresh contexts/variant, 300 ms RTT, real PTYs. Median 1367.8 ms for both variants; sample max baseline 2430.6 ms, candidate 1586.4 ms. Inventory preceded first glyph in 0/12 candidate samples. VM load before 2.22/1.76/1.14, after 1.21/1.55/1.12. Lock released after the run. Raw samples and provenance retained under evidence/hosts-from-server/. Final branch-head full gate follows; inherited size budget remains a blocker.Final handoff: hosts-from-server, head
fa2f3f2d35, pushed. Implementation and functional review complete; full verification BLOCKED by inherited static size budgets. No deployment and issue remains open.Final branch-head scripts/verify fast exit 1: all non-size rows PASS; workspace tests include 416 server tests. x86 22,512,464 / 16,404,816 bytes; arm64 19,935,768 / 13,817,816. Fixed original dev base
efac27a5x86 is 22,464,880 bytes; lane delta 47,584 bytes. Budgets unchanged. Owner/orchestrator must resolve the existing shipping size budget before merge.Independent TypeScript fast gate: 185 tracer and 36 protocol tests pass; unchanged production transfer budgets pass. Host browser test passes (fresh storage, offline host, UUID routing, removal while open, reconnect). Real SQLite account isolation and 1,001-row bounded-page tests pass; remote plugin authorization/backpressure and subscription generation tests pass; decoder fuzz target compiles (no campaign claimed). Author checklist and screenshot are in evidence/hosts-from-server/.
Final perf VM run: 1,000 hosts, 12 contexts/variant, 300 ms RTT. Equal 1,367.8 ms medians; baseline max 2,430.6 ms, candidate max 1,586.4 ms. Inventory precedes first glyph in 0/12 candidate trials. Raw samples, binary checksum, load and limited-tail interpretation retained on the branch. Shared VM lock released and owned VM fixtures removed.
Final scripts/verify fast output, verbatim:
Independent verification started on review-hosts-from-server, detached target
fa2f3f2d35. Merge base with local dev:8e7467c07c; implementation starts at recorded origin/devefac27a598. Read all 14 issue comments; no parent named. Reviewing full ancestry diff and isolating #194 behavior. No pushes, implementation fixes, deployments or perf VM access, per review brief; existing VM measurements will not be independently remeasured. Functional gates and failing-test evidence follow.P2 H194-R1 confirmed and committed: New window offers an admitted host without a saved window fails after + is clicked; Cmd-K already shows the admitted offline host. toolbar/row.ts:46 still opens hosts()[0].name directly, so #194's + / New window entry point remains incomplete. Local review commit contains the production-browser test and raw output at evidence/hosts-from-server-review/new-window-browser.log. No implementation change or push. Existing author browser removal assertion also failed; investigating before classification.
P2 H194-R2 committed as
a3842670: valid bounded inventory pages discover 10,000 offline hosts, but at 10,001 the fresh-browser loader silently publishes zero hosts. Boundary control: 1 pass / 1 fail; 79 pages in both cases. Test hosts-scale-review.test.ts and raw scale-red.log retained on review branch. The server ledger listing has no total bound; live transport capacity does not bound offline admissions. No performance claim. R1 commit is31a1380e. A separate removal test waiting for an empty reply passes after reconnect; now checking the additional open-shell transition from the author fixture.Completed independent reconnect/withdrawal check, commit
8e098e5c: production-browser test passes with UUID shell routing, offline refusal, reconnect, a completed empty inventory reply and removal from the open palette. The author browser spec twice fails its removal row count: it forwards offline remote opens into mock-server.ts:806-811, which replaces the single embedded connection session; reconnect cannot resume both. No production removal finding is assigned from that fixture failure. 185 original tracer tests pass; both review findings remain P2. Strict TypeScript checking passes. Fast gate and bounded instrumented fuzz build continue; no VM or push used.P3 H194-R3 committed as
07638d38: deterministic production build with reviewed public SHAfa2f3f2dand timestamp 2026-10-13T00:00:00.000Z fails the unchanged deferred Brotli transfer gate, 45,102 / 45,056 bytes (+46). Ordinary review-head metadata produced 45,121 bytes. Same Bun 1.4.2 as author. The failing transfer-metadata-review.test.ts invokes existing build.ts and transfer-budget.ts, fixes only public metadata, and cleans its scratch. Raw test and gate outputs committed. No timing claim or limit change. Counts so far: P0=0 P1=0 P2=2 P3=1. Full fast native gate and bounded decoder fuzz run continue.R1 repeated with zero simulated RTT and retained production-canvas screenshot: evidence/hosts-from-server-review/new-window-no-host-choice.png; final assertion still fails after successful admission and + click. Screenshot/test-output commit recorded on local review branch. Original native gate continues through real process tests; strict TypeScript checking passes including review tests. No visual-quality or performance-timing judgment claimed.
Native fast gate: server library 415 passed / 1 failed / 45 ignored. The unchanged CA audit capture test at auth/ca_unlock_audit_tests.rs:97 expected 4 events but captured 0 under parallel suite execution. The SAME workspace binary passes that exact test in isolation (1 passed / 460 filtered). No #118 baseline exemption used; preserve the full gate failure. New SQLite inventory tests (account isolation, unredeemed exclusion/canonical cursors, 1,001-row bounded pagination) pass, as do plugin input/descriptor and outbound-authority/generation tests. Static shipping builds and bounded sanitizer fuzz build continue. P0=0 P1=0 P2=2 P3=1 remains the confirmed inventory-slice tally.
Sanitizer fuzz build could not link with production release LTO: undefined _sancov_gen symbols in the host_inventory_json target (nightly). Retrying the SAME existing target with CARGO_PROFILE_RELEASE_LTO=false only for the fuzz harness; production configuration and limits remain unchanged. Seeds cover empty input, canonical cursor, unknown account selector, arrays, duplicate fields and oversized input. No successful campaign claimed yet. Final TypeScript check passed after the screenshot update. Static gate builds still running.
Committed native gate/evidence milestone
e5843ef6. scripts/verify fast exit 1: fmt, VT fmt, CLI compile-out, clippy and cargo-deny PASS; test FAIL (101), static builds FAIL (1). Server library 415 pass / 1 audit capture fail / 45 ignored; same workspace binary isolated audit: 1 pass. Static x86 22,512,464 / 16,404,816 bytes, arm64 19,935,768 / 13,817,816; both match author candidate sizes, PT_INTERP absent. Raw full transcript: evidence/hosts-from-server-review/head-fast.log. Original tracer 185 pass, protocol 36 pass, strict TS pass; separate deterministic deferred transfer failure retained (+46 Brotli bytes). Confirmed tally P0=0 P1=0 P2=2 P3=1. Only bounded no-LTO sanitizer fuzz retry remains; no pushes, VM access or implementation changes.Independent verification finished: MERGE (no P0/P1), per the owner verdict rule. Counts P0=0, P1=0, P2=2, P3=1. Review target
fa2f3f2d35; final LOCAL review headd96dbe26e5on review-hosts-from-server. No push, deployment, implementation fix, perf VM access or owner fixture change.Confirmed failing regressions: R1 P2 + / New window offers no admitted-host choice; R2 P2 10,001 offline admissions produce zero inventory rows (10,000 boundary control passes, 79 pages each); R3 P3 fixed public build metadata produces deferred Brotli 45,102 / 45,056 bytes. Tests, screenshot, findings index, scope/checklist and full raw outputs are committed under evidence/hosts-from-server-review/. P2/P3 are fixed forward; this is not a claim that the complete gate is green.
Original tracer tests 185 pass, protocol differential tests 36 pass, strict TypeScript check passes. Independent production-browser UUID open/offline refusal/reconnect/empty-snapshot removal passes. The authored browser spec twice fails after replacing the embedded session in its single-session fixture; that fixture failure is not classified as an implementation access defect.
Existing decoder sanitizer campaign: 3,313,220 inputs, exit 0, no crash. The original harness LTO link fails on _sancov_gen symbols; the SAME target passes with LTO disabled only for the fuzz harness. Production settings unchanged. Build-host test durations/fuzz rates/RSS are diagnostics, not performance evidence; VM claims were not independently remeasured because the review brief forbids it.
scripts/verify fast on untouched target product source: exit 1. Server library 415 pass / 1 audit capture fail / 45 ignored; same workspace binary isolated audit test passes (1 / 460 filtered), with no baseline exemption. x86 static 22,512,464 / 16,404,816 bytes; arm64 19,935,768 / 13,817,816 bytes, matching author candidate sizes. PT_INTERP absent. No budgets changed. Full fast output below VERBATIM; owned scratch targets/corpus are removed at handoff. Issue remains open.
Round 2 started on hosts-from-server at
fa2f3f2d35(original dev baseefac27a598). Read all 24 comments; no parent issue named. Importing review tests fromd96dbe26. Repair R2 client inventory cutoff and R3 deferred transfer margin (D170/D188/D214/D256). R1 UI remains for designers; will document/test the existing sessions adapter data seam. Explicit round-2 brief authorizes atomic pushes and perf VM measurements. Frozen static size failure is inherited, no budget change planned.Imported review test commits
55c9cc74,9c8e5acd,dc782c13,8f20e907and pushed. Reproduced R2 and R3 before fixes (round2/review-red.log).Completed/pushed
1ba38b50: removed client total-count cutoff; 128-row pages, duplicate/cursor validation, atomic replacement and welcome fencing remain. 31 sessions tests pass, including 10,000 and 10,001 offline hosts (79 pages each); strict TypeScript check passes. No server/schema change: remote_inventory.rs already pages the authoritative ledger without a total bound. R1 UI regression is intentionally retained for designers under the round-2 scope.R1 designer handoff: toolbar/row.ts createToolbar already receives cx.adapters.sessions (SessionService). sessions.hosts() returns the embedded entry plus every admitted UUID with {id,name,user?,os?,online?}; false online means the infraternal agent is offline, never an excluded host. sessions.onChange(listener) invalidates after complete paged inventory, removal, connectivity changes and reconnect. cx.win.open(host.id) routes through sessions.open(id) and binds the shell using host_id; use identity, not display name (duplicate labels are allowed). No new surface/style is implemented. The imported New window UI regression remains pending for the designers per this round's brief.
Completed/pushed
bca017fa: canvas palette dispatch/Settings navigation loads only on selection; host row generation and live refresh remain synchronous. No UI surfaces/styles changed and no budget/classification limit changed. Fixed review metadata passes: deferred gzip 50,736/51,200, Brotli 44,801/45,056 bytes; ordinary head metadata also passes: gzip 50,733, Brotli 44,818 (238 bytes margin). Critical and each on-demand chunk pass. Strict TS and 157 canvas/graph tests pass; production browser offline UUID opening, reconnect, completed empty inventory and open-palette removal pass. Full native/static milestone gate is building in job-owned scratch.Completed/pushed
6207c15a: test uses only the toolbar's SessionService to verify offline admission, UUID opening, connectivity updates and removal with three notifications. Six live sessions tests and strict TS pass. R1 API documented in previous comment; designer-owned New window UI regression remains pending.Completed/pushed
ac876168: existing real-server harness accepts 1,000/10,000 host scale and configurable samples, checks the last host appears, records sample max (not p99), and fails if inventory requests precede the visible first glyph. Harness TypeScript parses; no timing run on build host. Prepared fixed original-dev frontend baselineefac27a5and candidate artifacts. Waiting for native/static gate build before VM runs.Completed/pushed
769a1b3e: repaired the original browser fixture (review's author-browser-repeat.log is failing-before evidence). Offline admitted UUID shell opens now refuse rather than replacing the mock's embedded session; reconnect waits for the new subscription and removal waits for a completed empty inventory reply. Fresh-storage/offline state/UUID route/reconnect/live removal regression passes; strict TypeScript passes. No production behavior change in this commit.Completed/pushed
8d5cb4c9: contract and author checklist describe every bounded page (no total host cutoff), toolbar SessionService hosts/onChange and UUID opening, and on-demand action dispatch. No wire/API or authority changes. Additional functional browser checks pass for palette Settings/About selection and the macOS lock action. Ordinary metadata at implementation head769a1b3epasses D188: deferred gzip 50,733/51,200 and Brotli 44,837/45,056 (219 bytes margin). VM artifacts are staged; native/static full gate build is still in progress.Independent TypeScript fast milestone passes: 188 tracer tests, 36 protocol tests, strict TS, production precompression and all unchanged JavaScript/font budgets. Deferred Brotli 44,886/45,056 bytes (170 bytes margin), gzip 50,735/51,200; fixed review metadata passes separately. Artifact inspection confirms the action dispatcher is a 1,624-byte on-demand chunk; inventory remains deferred account data, not misclassified as action-only code. Functional durations in logs are build-host diagnostics, not VM performance evidence.
Native milestone test row failed in three unchanged CLI process tests: remote_server_tests.rs:249 HTTP startup deadline, restart_tests.rs:150 restart audit child deadline, and the same file's native stdin probe compiler deadline. The gate ran these concurrently with shared-host builds; its raw log retains the SQL startup warning and failures. These are NOT #118 exemption rows; no baseline exemption or green claim taken. Final gate will rerun the full suite serially (RUST_TEST_THREADS=1), preserving the earlier failure. fmt/clippy/cargo-deny passed; static builds continue. No native code changed in round 2.
Completed/pushed
836a4054: imported fixed-metadata transfer regression now owns hosts-from-server-r2/transfer scratch rather than recreating the completed review lane's directory. Strict TS and the actual builder/gate regression pass; fixed metadata remains 44,801/45,056 deferred Brotli. Only this run's old scratch files were removed. All implementation commits are pushed; no deployment or new UI surface.VM first run at 1,000 hosts: 12 fresh contexts/variant, 300 ms RTT, real static server/PTY, baseline
efac27a5frontend. Baseline median 1,369 ms / sample max 1,569.5; candidate median 1,555.7 / sample max 2,400.8. Candidate inventory preceded first glyph in 0/12 trials. VM load 0.60/0.46/0.46 before, 0.77/0.51/0.48 after; lock released. This run does NOT establish unchanged first-frame latency; samples retained and 10,000-host run/follow-up attribution continue. New x86 static artifact matches prior size exactly (22,512,464 / frozen 16,404,816); no native source or budget changed in round 2.VM 10,000-host run completed: 6 fresh contexts/variant, 300 ms RTT, same static binary and staged production bundles. Final admitted host appears in every candidate trial; inventory precedes first glyph in 0/6. Baseline median 1,339.1 ms / sample max 1,601.7; candidate median 1,361.6 / sample max 2,414.2. Load before 1.58/0.81/0.58, after 0.61/0.63/0.55. Lock released. Raw samples retained. Reverse-order 1,000-host follow-up with existing public mount/client/attach/paint marks is running under a new lock acquisition (
879a4674harness commit, pushed). No slow sample is removed and no statistically established p99/zero-cost claim is made.Reverse-order VM follow-up at 1,000 hosts completed (12 contexts/variant): candidate median 1,379.9 ms / sample max 2,415.7; baseline median 1,552.2 / sample max 2,416.7. Direction flips from the first ordered run. Existing marks show slow client initialization (~1,450 ms in both variants) before attachment/inventory, with similar mount stages. Inventory precedes first glyph in 0/12 reverse candidate trials, and 0/30 across both 1,000-host runs plus the 10,000-host run. Load 0.50/0.60/0.54 before, 1.30/0.85/0.64 after. Lock released. This supports excluding inventory from the initial glyph path, not an exact zero-cost/p99 claim; no slow sample is dropped. Raw samples and public phase marks retained under round2/.
Author check found a new-code delayed-selection race from the R3 split: window-targeting palette actions read activeWin only after loading the chunk, so a focus change could redirect split/new/close. Three failing-before tests reproduce it (round2/action-target-red.log). Fix captures the selected WinRec synchronously and dispatches only if it remains in its owning window map; a removed selection cannot redirect. No new UI or style. Validation and final-build measurements follow this repair.
Completed/pushed
d18da979: preserve selected window identity through the deferred action load, ignoring removed/replaced records rather than redirecting split/new/close. Three failing-before tests now pass with both changed focus and closed targets. 35 focused actions/sessions tests, strict TS, fixed public metadata production transfer and three browser checks pass. Fixed-metadata deferred Brotli 44,811/45,056 (245 bytes margin). Final artifact measurements follow; no native source, UI surface, style or budget change.Final frontend artifact
d18da979at 1,000 hosts: 6 fresh contexts/variant, real static server/PTY, 300 ms RTT. Baseline median 1,565.6 ms / sample max 2,423.3; candidate median 1,558.7 / sample max 1,626.3. Inventory precedes first glyph in 0/6; final admitted host appears in every candidate trial. VM load 1.43/1.43/0.99 before, 1.76/1.54/1.05 after. Lock released. All earlier samples remain retained; final 10,000-host artifact run is underway under a new lock acquisition. The delayed-selection fix runs only after selecting an action; its final bundle passes unchanged D188 with 222 bytes deferred Brotli margin.Completed/pushed
e06f5f50: raw red/green regressions, browser checks, transfer gates, native milestone and all five VM cohorts are committed under evidence/hosts-from-server/round2. Finald18da979artifact at 10,000 hosts (6 contexts/variant): baseline median 1,413.1 ms / max 2,461.1, candidate median 1,583 / max 2,456.7; load 0.87/1.31/1.01 before, 1.66/1.55/1.16 after. This is not an equal-latency claim. All final hosts appear, and inventory precedes first glyph in 0/42 candidate trials across both scales and every retained run. Slow client initialization appears in both variants before attachment/inventory. VM fixtures/artifacts removed; lock released between every measurement. Full serial scripts/verify fast is running one06f5f50; native/static budgets unchanged. Designer R1 picker remains pending, existing adapter API is ready/documented.Serial head gate
e06f5f50reports auth::tests::server_setup_terminal_echo_and_resume_preserve_offsets_once FAILED (auth/tests.rs:1254); the remaining server tests are still running, so detailed failure output is pending. This is not a #118 exemption and no green/native-baseline claim is made. Running that exact test against the same compiled workspace binary in isolation (round2/echo-isolated.log), without changing source or limits. Round 2 changes no native source. Final TypeScript head gate passes 191 tracer + 36 protocol tests, all unchanged budgets; deferred Brotli 44,822/45,056 (234 bytes margin).Completed/pushed
64a43d72: retain serial head gate (415 server pass / 1 unchanged echo/resume fail / 45 ignored), unexpected close detail auth/tests.rs:1731, isolated repeat failure and next exact-run pass. No #118 exemption, source fix, raised deadline or green claim. All other executed rows pass except the inherited static sizes; full head gate repeats with two test threads on64a43d72. Passing TypeScript head log is committed (191 tracer, 36 protocol, deferred Brotli 44,822/45,056). Both native gate failures and every VM timing sample remain in the record.The two-thread gate on
64a43d72stopped before Rust rows: loaded-host latency_proxy self-test outside its existing tolerance (two-thread-rtt-red.log retained). No #118 exemption or reduced RTT profile used. Repeating the complete functional gate in the supplied CPUWeight=10000 user scope, with two test threads, same code/deadlines/budgets and default 300 ms profile. Build-host timing output is diagnostic only; all performance claims remain from the named locked VM. The serial full failure, isolated failure/pass, and this failed preflight remain recorded.Two-thread scoped full gate: server library 415 pass / 1 fail / 45 ignored. Echo/resume passes; fresh_delete::review_mesh_delete_requires_fresh_passkey_tap fails its expected successful Result after the fresh timestamp update (fresh_delete.rs:131), not a reported timeout. This is NOT treated as a #118 exemption. No native source changed (git diff
fa2f3f2d-- crates is empty). Full failed output retained as two-thread-head-fast.log. Rerunning the complete scoped gate serially to avoid concurrent fixture interference; no test is skipped, no timeout/profile/budget changed, and every earlier failure remains in the record.Round 2 handoff: hosts-from-server head
64a43d7233, all atomic commits pushed. No deployment; issue remains open. R2 repaired (10,001 offline hosts through 79 bounded pages, no total cutoff). R3 repaired (action-only dispatch chunk, unchanged D188, final-head deferred Brotli 44,842/45,056: 214 bytes margin). Additional author-check target race repaired with three failing-before tests. R1 data seam is tested and documented: SessionService.hosts()/onChange(), UUID opening; New window picker UI remains for designers per brief.Final full scripts/verify fast on this head: exit 1, ALL non-size rows PASS, including 416 server tests. Run serially in CPUWeight=10000 user scope, same default 300 ms profile/code/deadlines/budgets. No #118 exemption or skipped test. Prior parallel CLI failures, serial echo failure, isolated failure/pass and two-thread fresh-delete assertion are retained/reported; final complete suite passes. Frozen static sizes remain the inherited blocker: x86 22,512,464/16,404,816 and ARM 19,935,768/13,817,816. Both exactly match prior branch artifact sizes; no native source changed in round 2 and no limit raised. Owner/orchestrator must resolve the existing shipping-size failure before a green handoff.
Independent final-head TypeScript gate: 191 tracer tests, 36 protocol tests, compiler/precompression/all JS/font budgets PASS. Critical Brotli 245,848/256,000; deferred gzip 50,743/51,200, Brotli 44,842/45,056; largest on-demand Brotli 14,108/18,432. Production-browser fresh storage/offline UUID opening/reconnect/withdrawal and Settings/lock actions pass.
VM evidence under evidence/hosts-from-server/round2: five retained cohorts at 1,000/10,000 hosts, 300 ms RTT, real static server/PTY, 42 candidate contexts total, inventory precedes first glyph in 0/42; final admitted host appears in every candidate trial. Final artifact: 1,000 median baseline/candidate 1,565.6/1,558.7 ms; 10,000 1,413.1/1,583 ms. Overall startup varies and the higher candidate 10,000 median is not hidden or called equal; public phases show slow pre-attachment initialization in both variants. Structural/request ordering excludes inventory from the first glyph; no exact zero-cost/statistically established p99 claim. VM load, raw samples and checksums retained. VM fixtures/artifacts removed, lock released between measurements. Author checklist run. Owned build/baseline scratch is removed after this comment.
Final scripts/verify fast output, VERBATIM:
Independent final-head TypeScript gate output, VERBATIM:
Started dev-merge-hosts from the clean worktree at
5d098cb828; current origin/dev base is5e383c3da8. The worktree is 21 commits behind and will be fast-forwarded before integrating origin/hosts-from-server64a43d7233. Read all 46 #194 comments; no parent issue is named. Round 2 includes review tests fromd96dbe26, fixes the pagination and transfer findings, and records MERGE. This task authorizes pushing only the integration branch.Fast-forwarded dev-merge-hosts to current origin/dev
5e383c3da8(21 commits; clean worktree). The integration candidate remains origin/hosts-from-server64a43d7233, based onefac27a598. Reviewing overlapping paths and migration numbering before the merge.Finding: both sides used server migration version 24: current origin/dev contains 0024_mesh_host_revocation.sql and the host branch contains 0024_host_inventory_os.sql. The migration set has a duplicate numeric version; crates/infraternal-server/src/auth/migration_compat_tests.rs::fresh_history_has_unique_versions_and_both_schemas asserts versions are unique. Renumbering the additive host OS column migration to 0025 preserves mesh revocation at 24 and runs the host addition afterward. No migration SQL or deployed migration is changed.
Finding during tracer validation: the broad 624-spec Playwright suite includes motion-audit, frame-time and reflow measurements, so I stopped it on the build host before those specs could run (performance measurements belong on the locked VM). At that point, 68 specs passed, 8 were skipped, and
test/addhost-wizard.spec.ts:421failed at 393px: expected the signed x86_64 payload refusal text, but the flow remained on “Installing on the host.” One additional spec was interrupted; 547 did not run. Raw output:/home/kayg/.cache/codex-scratch/dev-merge-hosts/logs/tracer-playwright.log. I’m isolating the functional failure and will run the admitted-host specs separately.Follow-up to the Playwright finding: reran
signed x86_64 payload refusal names its step at 393pxalone against the same tree on TRACER_TEST_PORT=46196; result 1 passed. The initial serial-suite failure and isolated pass are both retained under/home/kayg/.cache/codex-scratch/dev-merge-hosts/logs/. No source change and no #118 exemption; the broad suite was interrupted before performance specs.Focused functional Playwright run on TRACER_TEST_PORT=46198:
hosts-from-server.spec.tspassed andhosts-removal-review.spec.tspassed.hosts-new-window-review.spec.tsconfirms the retained R1 P2: after clicking New window, the admitted host is still not offered (failure at line 38). Round 2 explicitly assigns that UI regression to designer work and keeps the test; no UI/style change or test skip was made in this merge. Full output is in/home/kayg/.cache/codex-scratch/dev-merge-hosts/logs/hosts-playwright.log.Protocol validation completed on staged integration tree
bcf610fbb8: Rust protocol tests 7 passed, TypeScript protocol tests 37 passed, and the Rust/TypeScript differential test checked 134 streams across 11,439 schedules with zero divergences. No protocol test failures.Finding in the remote-enabled server test run: unchanged
auth::tests::ca_administration_tests::audit_tests::unlock_audit_records_principal_time_outcome_without_materialfailed during parallel execution. This same test’s intermittent audit-capture failure is recorded in the earlier #194 round-two gate evidence. The inventory migration/server paths are still running; no source change or exemption was applied. I’ll retain the complete output and rerun the exact test after the suite.Remote server tests:
cargo test --locked -p infraternal-server --features remotecompleted 418 passed, 46 ignored, 1 failed in 299.41s. The failure wasauth::tests::ca_administration_tests::audit_tests::unlock_audit_records_principal_time_outcome_without_material(ca_unlock_audit_tests.rs:97, captured 0 events vs 4). The exact test passed isolated immediately afterward (1 passed, 464 filtered). I’m rerunning the complete server suite serially to check for test interference; no source or timeout changes.Remote server suite rerun:
RUST_TEST_THREADS=1 cargo test --locked -p infraternal-server --features remotepassed: lib 419 passed, 0 failed, 46 ignored (492.11s); all 10 integration suites passed (including inventory pagination and host removal). The audit test passed in serial execution. The earlier parallel-only failure and isolated pass are recorded above; no test was skipped or source/timeout changed.Finding in
scripts/verify fast: the workspace test row failed once atcrates/infraternal-agent/src/remote_server_path_tests.rs:569,remote_client::server_path::tests::healthy_mesh_probes_do_not_inherit_the_previous_paths_rtt(healthy mesh path expired before its inherited keepalive).vt_creditpassed (1/1). I’m letting the remaining Rust gates finish, then I’ll isolate this test and run the tracer fast suite separately if the Rust failure stops dispatch before it.cargo test --workspace --lockedrerun completed and again hit the known parallel CA audit capture race (0 captured vs 4 expected; 418 passed, 1 failed, 46 ignored). The agent mesh freshness test passed isolated with--features remote(1 passed in 0.72s). The tracer/protocol fast slice passed: TypeScript tracer checks/build/budget and curated tests passed; protocol 37 passed, 0 failed, 34,463 expectations; differential corpus 134 streams / 11,439 schedules / 0 divergences. Transfer budget remained within D188: deferred JS Brotli 44,872 / 45,056 bytes. I’m running the complete workspace test row serially to remove the parallel audit-test interference.Complete workspace test row passed serially on staged tree
bcf610fbb871c0f0ff9a8c0e780300be4a3a48da: 997 passed, 0 failed, 135 ignored across 106 test summaries. Both the mesh freshness test and CA unlock audit test passed. Migration audit: 25 files, 25 unique versions, latest0025_host_inventory_os.sql. Remotedevis still5e383c3da87336df917720021436d3d4d82d3c5d.Merge commit created:
85368c7fdda186fa46b142be4d0546807357247a(first parent current dev5e383c3d, second parent feature head64a43d72). Worktree clean. The complete serial workspace test row passed (997/0/135 ignored); migration numbering is unique through 0025. Running the required head verification before pushing this branch.Finished and pushed
dev-merge-hostsat85368c7fdda186fa46b142be4d0546807357247a(first parent5e383c3d, second parent64a43d72).origin/devremains5e383c3da87336df917720021436d3d4d82d3c5d; the branch is a fast-forward from it (0 39). No deployment.Final verification on the pushed head:
RUST_TEST_THREADS=1 scripts/verify fastexited 1. Formatting, Clippy, workspace tests and cargo-deny passed; the only failing row is the expected D243 static binary size gate. No budget was raised.0025_host_inventory_os.sql, preserving dev's existing 0024.Final
scripts/verify fastsize and gate summary output (verbatim):"+" / New window host picker built on branch
ui-new-window-host(79006368, not merged): one host opens directly; several hosts open the palette scoped to "Open shell on " rows (online first, then recent), offline hosts explain and offer "Choose another". The previously failinghosts-new-window-review.spec.tspasses; newtest/new-window-host.spec.ts(4) passes. Budgets measured before the #210 headroom merge; rebase needed. Screenshots:desktop ink · desktop paper · filter · iPhone ink · 375 paper · offline toast iPhone · offline toast desktop
Preview review round (head
fbde4479): views button removed, hosts in palette search, Access grouped People then Machines.Top-right group (lock and +, no views button), 1440 ink:

Palette search "new window" lists every host, offline one with its state:

The + picker (paper):

Access, no selector, People then Machines (1440 ink, 1440 paper, 393 ink):



Contrast over the real window background: connectives 5.85:1 ink / 5.36:1 paper; can and verb 16.4 / 15.6; built-in words 5.85 / 5.36 (opacity fade removed, it was 2.5:1 on paper); source text 7.5 / 6.8.
kayg referenced this issue2026-10-28 17:53:56 +00:00