Launch QA: six first-time-user personas before launch #247
Open
opened 2026-10-19 11:01:53 +00:00 by kayg
·
49 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#247
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-19: "please save this as QA testing before launch", linking https://x.com/roundtablespace/status/2111717667228770611 .
The idea (from the post)
Before launch, run five AI subagents as first-time users. Each opens the product in a real browser, goes from the first page to a first success, and screenshots every moment of confusion, being stuck or annoyance. Merge the findings into one list ranked by how many users hit each problem, fix them in one pass, then rerun all five to prove the fixes.
Our version for infraternal
Every persona starts from nothing: a fresh server install (
/install, D258) and a first browser visit. The goal is the first real success: sign in, add a host, open a terminal and type a command.Rules for the run
When: before any public launch, and again before each major release. Not started yet; this issue records the plan.
Launch QA plan: six first-time-user personas (executable)
Written 2026-10-21 against
origin/dev@aba6d85ce(release 9.2 merged into dev). File:line references are to that commit. This is a plan only. Nothing has run yet.0. Ground rules for every run
scripts/auth-toolchain+ cargo, D213), with the web app it ships. Never a dev server. Record the version string and SHA in each report.infraternal-test-qa-serverVM that the orchestrator creates on minipc01 (Proxmox; only our owninfraternal-test-*guests). It gets a real DNS name and TLS, because passkeys need a secure origin with a domain (see prediction 1). Reset it to a clean snapshot before each persona so every persona really starts from nothing (no owner, no CA, no hosts).infraternal-test-qa-host-*guests on minipc01: Debian (sudo user), Alpine (root login only), plus one host with password-only SSH. No other hosts are touched.infraternal-test-*guest. Known_hosts entries for the test guests are cleaned after the run.10.69.69.208(ours, with flock). Network shaping usestc netemthere: 150 ms RTT, plus 2% loss for persona 3.--help, and the/installpage. It must not read the repo.1. The six personas
uptimefrom the PWA2. Fresh-install path (the same steps for all; each persona's twist is in brackets)
Each step is timed from its first input to its result. Pass means it was done without outside help, inside the budget, with no unexplained error. Fail means stuck for more than the persona's quit trigger, an error with no next step, or a state that needs a server shell or a DB reset.
infraternal --helpthatinfraternal server initis the command (docs/CLI.md:56). ≤2 mininfraternal server init --dry-run, then for real (needs a domain:--public-origin https://qa.<domain>)/healthzreturns OK. The persona knows which URL to open. ≤3 min [P1 skips--dry-run; P2 reads the dry-run plan line by line and records what runs as root; P5 runs init twice and presses Ctrl-C in the middle]crates/infraternal-server/src/auth/setup.rs:16) orinfraternal server setup-tokenapps/tracer/src/onboarding.ts:12,175)onboarding.ts:13,230-244)onboarding.ts:451). [P3 on iPhone Safari AND inside the PWA]onboarding.ts:15,91,139)apps/tracer/src/canvas/views/world.ts:366-371)canvas/addhost/wizard.ts:319-320)ssh debian@10.x; P5 pastes a URL and double-clicks Add]wizard.ts:534)wizard.ts:833-846)wizard.ts:815-818), root consent (wizard.ts:488-489)wizard.ts:43-46)uptime, thenls -la /onboarding.ts:387-390); host still therecanvas/addhost/authority-unlock.ts:40-43) ≤1 min3. What each persona records (per step)
step | what I expected | what I saw | what I did next | seconds lost.issue-attach(D262), namedp<N>-s<step>-<n>.png. They are never committed.4. Findings become fj issues
kayg/infraternal: titleQA #247: <problem>, body with the step, the exact UI text, file:line, the screenshot, the persona count, and a link back here. Labellaunch-qa. Duplicates of open issues get a comment on that issue instead.docs/design/TASTE.mdthe same day.5. Ten places predicted to confuse a newcomer (origin/dev @
aba6d85ce)crates/infraternal/src/main.rs:1353-1359: without--public-origin, the origin ishttps://<listen IP>:<port>. WebAuthn does not accept an IP address as the RP ID, so S5 fails late, after the token and name steps. Init should require a domain name or warn about it./downloadarrives "when apps ship" (D258).server initis documented only indocs/CLI.md:56-60. The legacyserver installis hidden and only prints migration guidance (CLI.md:59), and that is the first command people guess.crates/infraternal-server/src/auth/setup.rs:16prints it once at startup. The wizard tells people to runinfraternal server setup-token(apps/tracer/src/onboarding.ts:177,217), but not as which user (root or the service account), and not that the token expires after 24 h.onboarding.ts:233setsmaxlength="256", but the hint atonboarding.ts:244says 64 characters. P5 will type 65-256 characters and be blocked by a hint that appears only after typing.onboarding.ts:13,230-233). The username must be lowercase, 2-32 characters, and the hint appears only after a bad entry (:241-242). P4 will type "Ada Lovelace" into the username field. Step 3 says "Your SSH keys are sealed with it" (onboarding.ts:14) before the person has any SSH keys here. The recovery step is gated correctly: Continue needs the saved tick (onboarding.ts:91,322). Verify that P1 and P6 do not just tick it without saving the words.canvas/addhost/wizard.ts:315setsaria-hidden="true"on "Type user@host, for example kayg@o2", and the example hosto2means nothing to a newcomer. The parser (canvas/addhost/model.ts:199-203) accepts a bare IP, but it rejectsssh user@ip,user@ip -p 2222, a pastedssh://URL and a trailing space with a comment. P4 and P5 will paste exactly these, so check that the rejection explains itself. For a bare IP (P1), check which user is tried and whether the screen says so.wizard.ts:534asks for the passkey "to create the certificate authority for your hosts" in the middle of add-host. P4 and P6 will not know what they are approving. P2 will want to know where its key lives.canvas/addhost/authority-unlock.ts:40-43. Every server restart locks the CA. A newcomer whose VM rebooted sees hosts that cannot be reached and a wording that sounds like a security incident.canvas/addhost/setup-stages.ts:140: "Use Remove host in the command palette, then Add host to start again." There is no button. P6 never opens the palette, and P5 will reach this limit on purpose.wizard.ts:43-46: "Get the x86_64 binary", "Join the host to this server", "Check terminal readiness". With "Your terminal keeps working" in failure text (setup-stages.ts:141, it means the other terminals), P4 will read these literally and not know whether they have to act. P3 will see them on a 393 px screen where long host labels may truncate the stage row (wizard.ts:681-694).Also check (no prediction, just verify): passkey creation inside the installed iOS PWA; double-clicking "Add host" across two tabs (one tab is guarded by
canvas/addhost/index.ts:39-41, but two tabs may each start a setup for the same host); Back during S12.6. Order of the run
Day 1: create the VMs and the snapshot, and do a dry run with P1 only to check the harness. Day 2: P1-P6 in parallel (5 browser jobs on the perf VM; the iPhone and Mac VM under their lock), then the merged table and issues. After the fixes: rerun all six from the snapshot and post the comparison table here.
onboarding papercuts: branch
onboarding-papercuts, head0c6fbf8d7(baseaba6d85ce).Commits: ssh paste parser (model.ts), add-host hint described + neutral example + ssh paste (wizard.ts), display-name maxlength from one constant, username rule shown up front.
Targeted tests (apps/tracer):
Playwright: addhost-chips.spec.ts (new ssh paste and accessible-description tests) passed; onboarding.spec.ts identity test passed with the new hint and maxlength assertions (a separate invalid-token test hit a one-off socket hang up on one run and passed on the next).
scripts/verify fast: did not finish within 10 minutes (cold Rust build, still compiling crates); not run to completion.
Starting gate and screenshot pass on branch
onboarding-papercuts-gate, head0c6fbf8d74e4e5a83115d7b74853f8c61067032f, based onorigin/devaba6d85ce36abea9e69f34ed772cea049dac41fb. Worktree is clean. I’ll run the requested fast gate, targeted tests, and production screenshots for #247.Completed
scripts/verify fastononboarding-papercuts-gateat0c6fbf8d74e4e5a83115d7b74853f8c61067032f; command exit code 0. The complete raw transcript is attached: verify-fast.log.Rust gate output:
Static binary caps and tracer test summaries:
Completed
bun test src/canvas/addhostfromapps/tracerat head0c6fbf8d74e4e5a83115d7b74853f8c61067032f: 79 pass, 0 fail, 244 expect() calls, 8 files. Full output: addhost-unit.log. No failure to fix.Finding: the first
addhost-chips.spec.tsrun (port 5231) failed test 4,an invalid token shows the hint and never blocks the chips beside itatapps/tracer/test/addhost-chips.spec.ts:83. The run is continuing and the failure details are being collected; no change made.Finding confirmed on port 5231:
an invalid token shows the hint and never blocks the chips beside itfailed only becauseapps/tracer/test/addhost-chips.spec.ts:90still expectsType user@host, for example kayg@o2. The built UI returnedType user@host, or user@host:2222 for another port; hint visibility, adjacent chip, and Continue checks passed. This is stale test copy after the neutral hint change, not a product behavior change. I’ll confirm on the remaining repetitions and update the expectation only.Finding: onboarding run 2 (port 5235) passed
invalid setup token stays on step 1 with focused guidanceand failed the second test atapps/tracer/test/onboarding.spec.ts:209.expect.poll(() => page.evaluate(() => window.__tracerTestDouble?.isConnected() === true))timed out after 5 seconds with false. Run 1 passed both tests; run 3 is in progress to determine whether this recurs.The previously noted
/__mock/setup-tokensocket hang recurred on onboarding run 3 (port 5236), atapps/tracer/test/onboarding.spec.ts:85:apiRequestContext.get: socket hang upforGET http://localhost:5236/__mock/setup-token. The same request passed in onboarding runs 1 and 2. I’m tracing the test proxy/mock route and preserving the full run log.Completed the requested browser pass on the minified production tracer build with preview fixtures, all on distinct ports. Raw run logs are attached below.
addhost-chips.spec.ts, ports 5231–5233: each run was 11 passed, 1 failed, 4 skipped. The sole failure was the same stale exact hint copy assertion atapps/tracer/test/addhost-chips.spec.ts:90; the actual neutral port hint and all other chip cases passed. Logs: run 1, run 2, run 3.onboarding.spec.ts, ports 5234–5236: run 1 passed 2/2. Run 2 passed the invalid-token test but timed out at line 209 waiting 5 seconds for the mock connection. Run 3 passed the invalid-token test but gotsocket hang upat line 85 reading/__mock/setup-token. Logs: run 1, run 2, run 3./__mock/setup-tokenreset was isolated from port collision: the proxy/test-double pair was 5236/5237. The Bunnode:httpserver reports the defaultkeepAliveTimeoutas 5000 ms; the test held its API request context idle while rendering/capturing the first step. This points to a stale keep-alive socket as the cause. The reset response already includes the fresh setup token (apps/tracer/test/mock-server.ts:665–667), so I’ll consume it immediately and remove the later request.I’ll update the stale assertion and onboarding fixture request as separate test-only commits, without changing UI behavior.
#247 screenshots attached: 24 production-build captures (six states × desktop 1440×900 and iPhone 390×844 × dark and light). PNG dimensions were checked; no visual-quality judgment was made.
ssh -p 2222 user@hostas one chip: dark desktop, dark iPhone, light desktop, light iPhone.Committed and pushed
2453375a7c7e31865c13d772968ddbab67e93f7e(test(tracer): sync add-host hint expectation to neutral copy) toorigin/onboarding-papercuts. It changes only the stale browser expectation.Gate output:
bun run checkpassed;git diff --checkpassed;TRACER_TEST_PORT=5241 bun x playwright test test/addhost-chips.spec.ts: 12 passed, 4 capture-only tests skipped, 0 failed. Full browser output: addhost-chips-copy-fix.log.Post-fix onboarding repeat result:
--repeat-each=3on port 5242 had 5 passed and 1 failed. The setup-token hang did not recur; the remaining failure is the finalisConnected()poll atapps/tracer/test/onboarding.spec.ts:209, which hit its default 5000 ms timeout once in 3 repetitions. The same check timed out once in the baseline 3 runs. Nearby browser connection checks use 30000 ms (apps/tracer/test/cursor-blink.spec.ts:21), so I’ll align this functional wait to that limit and keep the test’s overall timeout sufficient.Committed and pushed
78baf848d85a58f54d4c02f7d140c6ab793b53e4(test(tracer): reuse reset response for onboarding token) toorigin/onboarding-papercuts. Both onboarding cases now consumesetup_tokenfrom the immediate/__mock/resetresponse; no UI or server behavior changed.Gate output:
bun run checkpassed;git diff --checkpassed; invalid-token test with--repeat-each=3on port 5243: 3 passed, 0 failed. Full browser output: onboarding-token-read.log.Correction and new evidence: after moving both setup-token reads to the reset response, the 3-repeat onboarding run had 5 passed and 1 failed. The failure was an immediate
apiRequestContext.post: socket hang uponPOST http://localhost:5245/__mock/resetatapps/tracer/test/onboarding.spec.ts:58(283 ms into that test), before page work. Therefore the earlier idle keep-alive explanation was incomplete. Existing tracer browser specs usemaxRetries: 1for idempotent mock reset requests (apps/tracer/test/addhost-start-fresh-captures.spec.ts:10,apps/tracer/test/addhost-wizard.spec.ts:26); I’ll apply the same retry to both onboarding resets and rerun the suite.Committed and pushed
c7b0524133f1522c28a93e5fb3bd8ae96337bc2d(test(tracer): tolerate fixture resets and connection delays) toorigin/onboarding-papercuts.Gate output:
bun run checkpassed;git diff --checkpassed; full onboarding spec with--repeat-each=3on port 5247: 6 passed, 0 failed (both tests passed 3/3). Full output: onboarding-connect-fix.log.Static x86_64 size comparison, same stripped static recipe and target: branch
c7b0524133f1522c28a93e5fb3bd8ae96337bc2d= 21,387,248 bytes; merge baseaba6d85ce36abea9e69f34ed772cea049dac41fb= 21,387,248 bytes; delta = 0 bytes. Both artifacts are stripped x86-64 static PIE binaries. The merge-base build completed successfully.Finished on
onboarding-papercuts-gateatc7b0524133f1522c28a93e5fb3bd8ae96337bc2d, pushed toorigin/onboarding-papercuts. Commits:2453375a7c7e31865c13d772968ddbab67e93f7e,78baf848d85a58f54d4c02f7d140c6ab793b53e4,c7b0524133f1522c28a93e5fb3bd8ae96337bc2d. No deploy.scripts/verify fastcompleted with exit 0. Verbatim gate summary:Final TypeScript protocol output:
VERIFY_EXIT=0Other requested runs:
bun test src/canvas/addhost: 79 passed, 0 failed, 244 expectations across 8 files.addhost-chips.spec.tsafter the assertion fix: 36 passed, 12 capture-only skipped, 0 failed across 3 repeats on port 5253.onboarding.spec.ts: 6 passed, 0 failed across 3 repeats. Initial repeats exposed one setup-token socket hang-up and one slow connection poll; a later reset POST also hung up, so both onboarding tests now use the reset response token and retry the reset POST once, and the connection poll has a 30s timeout. No recurrence in the final three repeats.The add-host copy assertion was stale; it now matches the neutral hint text. The add-host failure hint continues to use the existing component behavior. Display name limit is shared at 64 and the username rule is shown up front.
Stripped static x86_64 size: branch 21,387,248 bytes; merge base
aba6d85ce36abea9e69f34ed772cea049dac41fb21,387,248 bytes; delta 0 bytes.Evidence attachments: final fast gate log, fixed add-host 3-repeat log, onboarding 3-repeat log, add-host unit log, 24 screenshot links. Screenshots cover six requested states at desktop 1440x900 and iPhone 390x844 in dark and light; the pasted
ssh -p 2222 user@hostappears as one chip.Merged into dev as
adee19da0(merge of onboarding-papercutsc7b052413onto devee3dab018). Orchestrator reviewed the screenshots: pasted ssh command becomes oneuser@host:2222chip; add-host hint visible with neutral example; username rule shown up front. On the merge: add-host unit tests 79/0, tracer tsc clean. Not deployed yet; goes out with the next release.Starting the P1 impatient persona dry run on branch
launch-qa-dryrun, based onorigin/devadee19da07cea19e538cb801858ce0d901841b3a. Worktree is clean. I’ll create only the named test guests on minipc01, build the production release from thisorigin/devhead, and run the persona through the product,--help, and/install, recording evidence outside the checkout. No changes to product code and no deploy to production.Blocked venue access finding: monitor01’s local NetBird status, filtered to exclude 10.69.69.125, identifies minipc01 as 10.69.69.217. From monitor01,
ssh -o StrictHostKeyChecking=yes -o BatchMode=yes -o ConnectTimeout=8 root@10.69.69.217 'hostname -f'failed withNo ED25519 host key is known for 10.69.69.217/Host key verification failed.minipc01.vpn.kayg.orgdid not resolve, and no existing known_hosts entry was found for the short name, FQDN, or IP. No key was accepted or added. I cannot safely create/delete the requested guests until monitor01 has an existing trusted connection path for minipc01; please provide that path through the orchestrator/owner channel.Raw venue-access evidence: minipc01-hostkey.log.
Correction to my earlier venue blocker: I read the venue-specific rule as permitting first use on minipc01 while rejecting changed keys; the absolute no-add rule is under the separate perf/Mac lab-machine section. No Proxmox guest has been touched yet. I’ll make the first-use connection with
StrictHostKeyChecking=accept-new, which rejects later key changes, and remove only the new minipc01 entry from monitor01’s known_hosts during cleanup.Step: created the fresh test server guest on minipc01. CT 100 is
infraternal-test-qa-server(Debian 12.7, 2 cores, 2 GiB RAM, 16 GiB rootfs, DHCP10.69.0.250). No priorinfraternal-test-*guests existed. PID 1 is systemd;systemctl is-system-runningreportsdegraded(exit 1). Venue receipt: venue.md.Step: prepared the authorized SSH target guest CT 101 (
infraternal-test-qa-host-1, DHCP10.69.0.222). The Debian template already has OpenSSH 9.2p1; SSH is enabled.apt-get updatecould not resolve Debian mirrors through the guest's configured DNS (10.69.0.1), sosudocould not be installed; no password was set or retained. Host receipt and shaping availability: host-network-prep.md. Build-hosttcis unavailable, so no 150 ms/2% shaping is applied.First-run copy fixes, branch
firstrun-copy(pushed, not merged), headece6fc867on top of origin/devadee19da0.Commits (one per item, plus one layout fix found in review):
5a2148f90post-restart lock: "The server restarted. Confirm your passkey once to reconnect your hosts."f8ac54629visible "Remove host" in the setup failure popover at the retry limit (shared mountConfirmTip gains an optional quietsecondaryaction; wired to the existing host removal adapter)cb027b07eplain stage/failed-step names ("Download infraternal (x86_64)", "Connect the host to this server", ...)4e0a1a3ae"Your other sessions keep working."5c3b9f3cfsetup-token hint: run as the user the server runs as; expires after 24 hours (verified in auth/setup.rs; socket is 0600)a2ba5adc7one quiet line on why the certificate authority is createdece6fc867the confirmation stays inside a narrow window card (the third button clipped it at 390 px)Tests:
bun test apps/tracer/src packages/ui478 pass, 0 fail;tscclean; Playwright addhost-pill, addhost-wizard, addhost-pill-stream, inbox, ca-unlock, onboarding all pass (29 + wizard/pill run).Note: in the mock, Remove host only shows a toast (the passkey ceremony needs the real server). Item 4 uses the requested wording; the new host's own terminal also keeps working.
Screenshots (1 lock toast/inbox, 2 setup failure normal/exhausted, 3 wizard failure details, 5 token step, 6 first-time CA page; desktop 1440x900 and phone 390x844, ink and paper):
Build pending: the production stable release build from
adee19da07cea19e538cb801858ce0d901841b3ahas waited 27 minutes for a host build slot. All four slots are currently occupied. Load average at 20:22 UTC was 15.14 / 18.97 / 22.17. I’m continuing independent venue and capture preparation; no user action is needed.Correction to the prior queue comment: the load average sample was taken at 20:20 CEST (18:20 UTC), not 20:22 UTC. The recorded values remain 15.14 / 18.97 / 22.17.
Round 2 on firstrun-copy, head
5868ef5360.420128160: the shared stacked toast now lays out as mark | message | close on row one, actions on row two (cause: auto-placed grid at phone width; fixed in packages/ui/styles.css for every stacked toast; the short unlocked toast was checked and is unchanged).5868ef536: with three confirmation actions on a viewport up to 480 px they stack full width in priority order (Try again, Remove host, Dismiss); desktop keeps one row.Tests:
bun test apps/tracer/src packages/uiearlier 478 pass; Playwright addhost-wizard, addhost-pill, addhost-pill-stream, inbox, ca-unlock, onboarding: 72 passed (16.3m). There is no separate toast spec; inbox/ca-unlock cover toasts.Retaken screenshots (390x844 phone, 1440x900 desktop for toast and popover; ink and paper), all opened and checked:
dev fast-forwarded
adee19da0→5868ef536(firstrun-copy: calmer restart-lock toast, Remove host at the retry limit, plain stage names, token hint with user + 24 h expiry, one-line CA explanation, shared toast phone layout, stacked confirmation actions on phones). Orchestrator reviewed the retaken phone screenshots (toast and retry-limit popover). Specs: addhost-wizard, addhost-pill, addhost-pill-stream, inbox, ca-unlock, onboarding — 72 passed. Not deployed; next release.Build finding: while compiling the second static target,
scripts/package-releaseemitted adead_codewarning forwrite_outputatcrates/infraternal/src/cli/output.rs:616. The build is continuing; no source was changed. Receipt: release-build-warning-1.txt.Update: issue history shows the second #247 fix round has now landed on
origin/dev(5868ef5360770f0c634bd264b7ec5473a155decf) while the release build waited for a slot. I fast-forwarded this clean job branch to that same head. The first bundle built from the start-time headadee19da0will not be used for the persona; I’m rebuilding the currentorigin/devrelease. No code was authored in this dry-run branch.Step complete: built stable release
0.1.0from currentorigin/devhead5868ef5360770f0c634bd264b7ec5473a155decf;scripts/release/build --channel stableexited 0. The 43 MiB bundle contains a 21 MiB x86_64 server binary (SHA-2561e2046fc15d3687cc4f999780927f01a5c2fd07e385123c40ddc3adf70da073c). The repeatedwrite_outputdead-code warning atcrates/infraternal/src/cli/output.rs:616is non-fatal. Receipts: build summary, build log.P1 S0 completed: pass in 6.4 s (budget 2 min). Top-level
infraternal --helplists only theservergroup;infraternal server --helprevealsserver init. One extra help hop, no documentation or outside help. I recorded that 6.4 s as the confusion moment. Evidence: S0 result, CLI help.P1 S1 finding:
server initconfirmed and reported the service installed/enabled, theninfraternal statussaid the server was running. In fact, systemd hadMainPID=0,Result=exit-code, andSubState=auto-restart(45 restarts); there was no listener on 7443/7444, and/healthzreset through the tunnel. The direct server command returnedinvalid server configuration/Check configuration and retained public server trust.The init help calls out HTTPS certificate files or a trusted proxy; neither was supplied. I stopped the service to prevent further restart churn and am verifying whether this missing TLS setup caused the failure. Evidence: S1 record, sanitized journal, health check.S1 configuration isolation: with HTTPS and the same data/listen settings, the server starts and
/healthzreturns 200 when--remote-listenis omitted. Adding--remote-listenexits with the same generic “invalid server configuration” even with an empty--remote-ca-dir. The--dry-runstill says the plan is ready. Exact missing trust prerequisite is not yet established. Confirmed status bug: during the initial service crash loop,infraternal statussaid Running while systemd hadMainPID=0,Result=exit-code,NRestarts=45, and no listener. The minimal service is now healthy;/installis 404 because the stable binary bundle has no web assets and no--web-rootwas configured. Evidence: configuration isolation.Test server web assets are installed: production tracer build from
5868ef5360770f0c634bd264b7ec5473a155decf, 272 files / 4.1 MiB; guest hashes match. After restarting the service to load--web-root,/installand/return HTTP 200 (1,759 bytes), and/healthzreturns 200. Receipt: web build and install.Blocked on the shared build-slot queue for the required Chromium harness. The slot-wrapped process has waited about 10 minutes and has not launched a browser. Server, tracer assets, and host guest are ready; continuing as soon as a slot is available. No help is needed from the owner at this point.
S2 plan issue: on the system service, the literal
infraternal server setup-tokencommand exits 1 without a data directory.server setup-token --helplists--data <DATA>; adding--data /var/lib/infraternalexits 0. I discarded both command outputs to keep the token private. Update S2 to pass the configured--datapath (or tell the operator to find it in help). Evidence: S2 command check.The corrected Chromium harness is blocked on the shared build-slot queue for about 10 minutes. The wrapper has not launched Node/Chromium yet. Server and tracer assets remain ready; no owner action is needed, and I’m continuing to wait.
The corrected Chromium harness has waited 20 minutes in the shared build-slot wrapper and has not launched a browser. There is no process running inside the slot yet; the server and production assets are ready. Continuing to wait; no action is needed from the owner.
The corrected Chromium harness has waited about 30 minutes in the shared build-slot queue without launching a browser. The service/assets/venue are ready; no owner action is needed. Continuing to wait for the slot before WebKit or the fast gate.
The corrected Chromium harness has waited 45 minutes in the shared build-slot queue without launching. Wrapper PID 143895 remains in its 20-second polling loop; no browser process exists. The test guest and app are ready. Continuing to wait; no owner action is needed.
The corrected Chromium harness has waited one hour in the shared build-slot queue without launching. Wrapper PID 143895 remains in its wait loop, with no child browser process. The server and assets are ready. Continuing to wait; no owner action is needed.
S2 blocker confirmed: the
/installsetup screen tells the operator to runinfraternal server setup-token, which exits 1 on this system service. Adding--data /var/lib/infraternalexits 0. The P1 persona stops here because the displayed command fails. Opened #252, labelledlaunch-qa; the screenshot and safe exit-status evidence are attached there. Plan S2 also needs the configured data path in its command.Correction and browser results: the first S1 attempt was a test-fixture setup error (no TLS/proxy settings and an extra
--remote-listen);server initreported success in 9.8 s but the service crash-looped. After configuring HTTPS, omitting the dedicated remote listener, adding the web root, and restarting the service,/healthzreturned 200. Treating that as venue correction, P1 passes S0 in 6.4 s and reaches the setup screen. It stops at S2:/install's exactinfraternal server setup-tokencommand exits 1;--data /var/lib/infraternalexits 0. No token was exposed. S3-S15 were not reached. The separate crash-loop status false positive is being recorded on #237.Chromium 149 at 1440x900: setup screen loaded, 16/16 requests HTTP 200, 0 console errors. WebKit 26.5 at 1280x800: same screen, 16/16 requests HTTP 200; one error entry says the
interactive-widgetviewport key is ignored. Network shaping was unavailable (tcabsent). Summary: browser results. P1 blocker: #252.Separate launch QA P1 finding: in the initial S1 fixture trial,
infraternal statusreported Running during a systemd crash loop (MainPID=0,Result=exit-code,SubState=auto-restart, 45 restarts, no listener). I added the evidence andlaunch-qalabel to existing status-truth issue #237 rather than opening a duplicate.Venue cleanup complete: only CT100/101 (
infraternal-test-qa-server,infraternal-test-qa-host-1) were destroyed; filtered guest list is empty. monitor01 known_hosts no longer contains minipc01, the inner tunnel and both local NetBird sessions are gone, and local port 7443 is released. Browser harness/slot process is gone. Worktree is clean at5868ef5360770f0c634bd264b7ec5473a155decf=origin/dev; no code changes or deploy. Cleanup proof.Dry run complete on head
5868ef5360770f0c634bd264b7ec5473a155decf(origin/dev). No product code changes or commits.Persona outcome:
servergroup;server --helprevealsserver init.infraternal statusreported Running; evidence is on related issue #237./installshowsinfraternal server setup-tokenwithout--data; that command fails for the system service. Supplying--data /var/lib/infraternalexits 0. The token output was discarded. P1 stops here; S3–S15 were not reached. Opened #252 as alaunch-qaP1.Browser results: Chromium 149.0.7827.55 at 1440×900 loaded 16 requests, all HTTP 200, with no console warnings/errors. WebKit 26.5 at 1280×800 loaded 16 requests, all HTTP 200; its console reported one ignored
interactive-widgetviewport argument. Network shaping was unavailable (tcabsent), so the requested RTT/loss profile was not run. HARs, screenshots, console output and timings are attached in earlier comments.Plan updates: record the working HTTPS/proxy server-init setup and require a health check before the persona starts. Include
--data /var/lib/infraternalin the displayed setup-token command. The current run stops at S2 as specified by the P1 boundary.Cleanup is complete: both guests created for this run were destroyed and no
infraternal-test-*guests remain; the minipc01 entry was removed from monitor01's known_hosts; the browser, tunnels and test service were stopped. Cleanup proof is attached in an earlier comment. Network port 7443 was released.Final
scripts/verify fastresult: failed at the production JavaScript transfer budget after the Rust gate and both static builds passed. x86_64 static artifact: 21,389,232 bytes, cap 21,389,232, delta +0; aarch64: 19,561,656 bytes, cap 19,561,656, delta +0. Critical JavaScript gzip was 307,172/307,200 bytes; Brotli was 256,067/256,000, over by 67 bytes. Exact safe receipt: verify-fast-receipt.txt.Gate output:
scripts/verify fast exit=1.kayg referenced this issue2026-10-28 17:53:56 +00:00