Terminal links: accent-coloured underline, text colour unchanged #232
Closed
opened 2026-10-16 07:27:35 +00:00 by kayg
·
84 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#232
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-16 ~13:00 IST: agreed. Terminal links (#214) get an accent-coloured underline; the link text keeps the terminal's colour. Proposal from the orchestrator: underline shown on hover (and while the modifier for opening is held), not permanently, so dense output stays quiet. Web-only.
Starting #232 on branch
link-underline, based onorigin/devat41a3a81abceaa4ea7457d84ee05297ca2244efcc. Read all 113 comments on #214 and the #232 brief; the worktree is clean.Finding: the existing renderer draws OSC 8 and detected URL underlines in hard-coded
#4A90E2(apps/tracer/vendor/ghostty-web/dist/ghostty-web.js:1941-1947), whilepackages/ui/src/themes.ts:247maps the terminal cursor colour to the theme accent. I’ll route hover/modifier underline painting through that existing theme colour and keep cell foreground colours untouched.Browser finding: the new underline check sees zero theme-accent pixels after hovering the first URL.
terminal-links.spec.tsfailed at line 183 after 5 seconds; the existing wrapped/OSC 8 click test and touch test passed (2 passed, 1 failed). Reproducer usedTRACER_TEST_PORT=4232. Attached Playwright context: error-context.md. I’m separating renderer behavior from the canvas pixel probe before changing the patch.The underline is rendered. The false negative was the probe: at 1× scale, accent
. The browser assertion now checks the renderer accent against
#7a9cffover backgroundrgb(13,14,16)produced antialiased edge pixelsrgb(67,85,135)andrgb(67,85,136)(244 and 250 pixels in the sampled link cells). Renderer cell geometry was 8×18 CSS px and the hover cursor waspointer. Attached diagnostic capture:--accentand detects the stroke's accent blend.Renderer step complete at
5bc724591c. Added theme.cursor row strokes and retained the singular renderer adapter. Build output:updated ghostty-web 5f0c6b7 with Ghostty 5714ed0 (Bun 1.4.2, Zig 0.15.2). SHA256SUMS check passed for JS, WASM and declarations.Controller integration complete at
258eb33308. Hover paints one focused link; the platform modifier paints visible links and releases them on keyup or blur. Rows and buffer invalidation clear stale ranges.bun run checkpassed; focused unit suite: 14 tests, 54,610 assertions.Browser coverage complete at
873f5d9aa6.TRACER_TEST_PORT=4232 bun x playwright test test/terminal-links.spec.ts: 3 passed in 50.4s. The new test checks both themes, hover/modifier show and hide, accent-token equality, unchanged link text, and captures 393x852, 375x667 and 1440x900 frames. Screenshot attachments follow after production capture review.Vendor documentation step complete at
7a902273d3. Updated the Ghostty Web patch notes with the active accent and batched-text behavior.git diff --checkpassed.Finding: a default non-preview bundle cannot accept the mock product terminal feed:
apps/tracer/src/main.ts:353gatesproductTestModeon__CLUSTERS_PREVIEW__. The standalone default-production capture therefore connected but did not render the injected URL; this is the intended compile-out path, not a link regression. The passing Playwright captures use the production-optimized bundle with its test bridge enabled byplaywright.config.ts.Visual review: the terminal link underline follows the theme accent, stays absent when hidden, and leaves the terminal text unchanged. Playwright passed 3/3 on unique port 4232. Captures cover both themes at 393x852, 375x667 and 1440x900:
Production bundle comparison against base
41a3a81abc:Both transfer-budget runs passed. Receipts: base, candidate.
Perf setup finding: the first base run sent all 10,000 URL rows (350,013 bytes) but the default mock terminal retained only 1,119 scrollback rows, so it aborted before recording any timing. The harness now requests the existing large-history test cap (
scrollback=40000000) and will verify that all 10,000 rows are retained before timing. No result from the aborted run is used.Follow-up: the
proto=producttest canvas still retained 1,119 rows with the explicit 40,000,000 scrollback cap (configured=10000), so that run also stopped before timing. The benchmark now uses the plain mock terminal mode used by the existing 10k-history renderer checks; it exercises the same TerminalClient, link controller and renderer while isolating terminal scrolling. Candidate and base use the same mode and cap.Perf harness finding: the plain terminal retained 9,957 scrollback rows plus its 44 visible rows for the 10,000-line workload, but the hover timer mixed the requestAnimationFrame timestamp with
performance.now()and returned negative deltas (-134 to -71 ms). That run is discarded; both timestamps now useperformance.now()before any timing is accepted.Candidate performance measurement did not start: Playwright requested
/root/.cache/ms-playwright/chromium_headless_shell-1248/chrome-headless-shell-linux64/chrome-headless-shell, while the perf VM only had Chromium 1228 cached. No timing was accepted. I am installing the runner-matched browser in the VM user cache and will repeat the candidate run.Perf comparison: origin/dev
41a3a81vslink-underline7a90227, measured oninfraternal-perf-test(x64, 4 CPUs, 8,262,770,688 bytes RAM) undersystemd-run --user --scope -p CPUWeight=10000. Each run sent 10,000 URL rows / 350,013 bytes and retained 9,957 rows. Origin load average was 0.08/0.42/0.64 at start and 0.22/0.44/0.64 at end; candidate was 0.51/0.39/0.57 at start and 0.62/0.42/0.58 at end.Hover-to-canvas-change latency (24 samples): origin mean 1.19 ms, p50 1.10 ms, p95 1.70 ms, max 3.30 ms; candidate mean 0.78 ms, p50 0.70 ms, p95 1.00 ms, max 2.00 ms.
Scroll frame intervals (3 x 2 s): origin per-run means 17.09/16.67/17.86 ms and p95 16.8/16.7/33.3 ms; candidate means 16.81/16.67/16.67 ms and p95 16.8/16.8/16.7 ms. Per-run maximums were 33.4/16.8/33.4 ms origin and 33.3/16.8/16.8 ms candidate. The sample does not show a scrolling regression; the third-run origin p95 was a 33.3 ms outlier. Raw receipts: origin, candidate.
Static size baseline setup: the direct cargo build failed before compilation because
.cargo/musl-cc.shcould not find the pinned Zig at$CARGO_TARGET_DIR/auth-tools/zig/zig.scripts/verifystages this repository-pinned toolchain throughscripts/auth-toolchain; I am staging it in the job target and will rerun the same x86_64 musl release recipe.Origin/dev static size baseline completed at
41a3a81abceaa4ea7457d84ee05297ca2244efcc. Using the repository release profile andcargo build --locked --release --package infraternal --target x86_64-unknown-linux-musl, the binary is static PIE, stripped, has no PT_INTERP, and is 21,422,096 bytes (the current size ceiling). Build and binary receipts: build log, binary details.verify iteratefinished with Rusttestfailing one case:infraternal-plugin-sshintegration testconfigured_identity_paths_are_not_inherited_by_the_command_childpanicked atcrates/plugins/ssh/tests/config_isolation.rs:67because the synthetic SSH command child could not start (Failure { kind: Install, message: "The SSH helper could not start." }). The remaining Rust summary rows were PASS, including Clippy and cargo-deny. Full gate receipt: verify-iterate.log. I am rerunning the failing test alone before proceeding.The isolated retry of
configured_identity_paths_are_not_inherited_by_the_command_childpassed (1 passed, 0 failed, 0.06 s; no code changes). The first failure occurred during the full workspace run; I will use the required finalscripts/verify fastresult to confirm the branch gate. Retry log.Finished at head
7a902273d3d072059d81fb338a4156776cf9375c.The final
scripts/verify fastexited 0. All Rust rows passed; the x86_64 static build stayed at 21,422,096 stripped bytes (origin/dev: 21,422,096; delta: 0). The aarch64 static size check also passed. Full 327,282-byte gate transcript: verify-fast.log. Candidate binary details: static-size-candidate.log.The production web bundle delta against origin/dev is +1,702 identity bytes, +741 gzip bytes, and +897 brotli bytes; the bundle transfer budget passed. Perf VM comparison and raw receipts are in the prior issue comment: 10,000 URL lines / 9,957 retained rows on the same 4-core x64 machine; hover p95 was 1.7 ms origin and 1.0 ms candidate; three scroll-run p95s were 16.8/16.7/33.3 ms origin and 16.8/16.8/16.7 ms candidate. Theme screenshots for all requested viewport sizes were attached earlier. The first
iteraterun had one SSH helper startup failure; the isolated retry and final fullfastrun passed unchanged.Final
scripts/verify fastgate summary, verbatim:Starting independent review on branch
review-link-underline, target head7a902273d3d072059d81fb338a4156776cf9375c, diff base41a3a81ab.Independent browser step at target
7a902273d3d072059d81fb338a4156776cf9375c:TRACER_TEST_PORT=4236 bun x playwright test test/terminal-links.spec.tspassed 3/3 (wrapped/OSC 8 links, underline states, touch). The production-optimized tracer build with its test bridge covered both themes at 393×852, 375×667 and 1440×900; six fresh captures are attached below.Exact-head verification completed on
7a902273d3(review-link-underline). No implementation files changed.Verbatim gate summary:
Finding LUR-1 (P2): revealed underline remains in the old screen-relative row after scrolling from absolute rows 100–101 to 500–501.
bun test src/terminal-links.on-demand.test.tsreports 13 pass, 1 fail; the new testclears a revealed underline as soon as scrolling moves it out of the viewportobserves the stale paint range{startX: 0, startY: 0, endX: 30, endY: 0}before idle scanning. Evidence:$HOME/.cache/codex-scratch/link-underline-review/evidence/scroll-review.log. Test-only commit on localreview-link-underline:c57a334bd073e82af4186c39aaa49f8af7ac7790.Vendor reproducibility check completed for target
7a902273d3.Verbatim result:
apps/tracer/vendor/ghostty-web/build.sh --checkcompared rebuilt dist and checksums successfully. Log:$HOME/.cache/codex-scratch/link-underline-review/evidence/vendor-rebuild.log.Finding LUR-2 (P2): the underline stops after the lead cell of a final CJK wide URL glyph.
revealed underline covers both cells of a wide final URL glyph at DPR 1, 2, and 3fails against the production renderer. At endpoint{x:20,y:3}, lead-cell accent pixels are 7/32/89 at DPR 1/2/3; continuation-cell pixels are 0/0/0 (minimums 4/8/12). Location:apps/tracer/vendor/ghostty-web/link-underline.patch:184-199. Evidence:$HOME/.cache/codex-scratch/link-underline-review/evidence/wide-review.log. Test-only commit on localreview-link-underline:389a967c6c139392fc69aeccd7f834a2b5fad75a.Attached raw review test output: scroll-review.log, wide-review.log.
Production renderer idle-pixel comparison completed between feature base
41a3a81aband target7a902273d. The terminal contained a long wrapped URL and CJK/emoji output; the pointer rested on a non-link row with no modifier held.The baseline and target PNGs and raw run log are attached. The Playwright run passed (one test covering all three DPRs).
Bundle comparison completed on the default non-preview builds of feature base
41a3a81aband target7a902273d. Identity delta is +1,702 B. The paired gzip totals differ by +715 B: +364 B critical, +24 B deferred, and +327 B on-demand. This run does not reproduce the report's +741 B gzip exactly; the change spans the critical path and on-demand code. The fast gate passed with critical at 298,037/307,200 B gzip and the largest on-demand chunk at 15,943/20,480 B gzip. Raw baseline and target output are attached.Perf VM timing is temporarily blocked by another run holding
/var/lock/perf-bench.lock. The review runner is queued withflock -w 3600; no new timing samples have been collected yet. The candidate harness and paired base runner are ready for the lock release.Perf VM recheck (4 vCPU, 7.7 GiB reported memory; locked systemd scope with CPUWeight=10000). Base: 200 hover samples p95 2.3 ms; scroll frame p95 33.4/33.4/33.4 ms; load averages 2.66/2.03/1.40 at start and 1.92/1.90/1.38 at end. Candidate: hover p95 0.6 ms; scroll frame p95 16.7/16.7/16.7 ms; load averages 1.18/1.57/1.31 at start and 1.30/1.56/1.31 at end. Raw runs: base, candidate.
This does not reproduce the reported 9,957-row scale: both builds received output sequence 620007 after 10,000 URL lines, configured scrollback 10,000, but retained 471 scrollback + 44 visible rows (515 total) and 43 visible links. The timings are supplemental; the baseline window had higher load. A second baseline attempt failed with a socket hang-up before samples and was excluded; its stored diagnostic line was redacted.
Verdict: merge. Counts: P0 0, P1 0, P2 2. The P2 failing review tests are committed on
review-link-underline:c57a334bd073e82af4186c39aaa49f8af7ac7790and389a967c6c139392fc69aeccd7f834a2b5fad75a. Review branch head:389a967c6c139392fc69aeccd7f834a2b5fad75a; reviewed job head:7a902273d3d072059d81fb338a4156776cf9375c. No implementation changes were made.scripts/verify fastexited 0 on the reviewed job head. Verbatim gate summary:Starting the review continuation on branch
link-underline, HEAD7a902273d3d072059d81fb338a4156776cf9375c, based onorigin/devat41a3a81abceaa4ea7457d84ee05297ca2244efcc. The worktree is clean. I have read all comments on #232 and #214; next I will reproduce both committed review tests and fix the stale-scroll and wide-glyph cases.Reproduced LUR-1 before the fix at
f64c04ddb:bun test src/terminal-links.on-demand.test.tsreports 13 pass / 1 fail. Scrolling the visible range from rows 100–101 to 500–501 leaves the old screen-relative underline{startX: 0, startY: 0, endX: 30, endY: 0}painted before idle scanning. Receipt: scroll-review-before.log.Reproduced LUR-2 before the fix at
563edbb55: production canvas pixels show the underline only in the lead cell of a final CJK glyph. At DPR 1/2/3, lead-cell accent pixels are 7/32/89 and continuation-cell pixels are 0/0/0 (minimum 4/8/12).TRACER_TEST_PORT=4233 bun x playwright test test/renderer-link-wide-review.spec.tsfailed as expected. Receipt: wide-review-before.log.LUR-1 is fixed in
3a1a077480a09ce90b188cbed850d501634ef590and pushed. Viewport updates now clear revealed screen-relative ranges immediately and let the existing idle scan recompute at the current pointer. Focused link tests: 14 pass, 0 fail, 30 assertions.apps/tracerbun run checkpassed. Receipts: unit output, TypeScript check.LUR-2 is fixed in
ebd62f98dd0493cf7a3f7b5f0cdcc5d705a15873and pushed. The renderer extends the final underline through the lead cell’s existing wide-cell width. The production pixel check passed at DPR 1/2/3: continuation-cell accent pixels 11/32/92 (minimum 4/8/12); lead-cell counts 7/32/89. The renderer build updated the pinned artifact, andbuild.sh --checkreproduced it.apps/tracerTypeScript check passed; focused link tests: 14 pass; browser link suite: 3 pass, covering hover/modifier show and hide, theme accent equality, unchanged text colour, and touch. Evidence: pixel test, build, reproduction check, browser run. Both themes captured at 393x852, 375x667, and 1440x900; the six screenshots are attached above.Perf VM wait: at 2026-10-17T00:20:55+02:00,
/var/lock/perf-bench.ownerreportedpill-flicker started=2026-10-16T22:15:31Z pid=1811191;systemctl --user is-active codex-pill-flickerreturnedinactive. Load average was1.07 1.24 1.31. I have not changed the lock and continue waiting withflock.Iterate finding: at
ebd62f9,scripts/verify iteratefailedcrates/plugins/ssh/tests/config_isolation.rs::configured_identity_paths_are_not_inherited_by_the_command_child(test gate reported FAIL (101)); the child helper could not start. The same compiled test rerun alone passed:test configured_identity_paths_are_not_inherited_by_the_command_child ... ok(1 passed, finished in 0.04s). No SSH files are changed. I will rerun the full iterate gate to check whether the failure repeats.Iterate rerun finding at
ebd62f9:crates/infraternal-server/src/remote_control_queue_tests.rs::saturated_native_control_queue_does_not_hide_primary_terminal_outputfailed. Receipt:CONTROL_SATURATION active=true queued=1 native_primary_live=true shadow_output=0; panic:full control FIFO prevented healthy primary terminal delivery. The server test group reported 448 passed, 1 failed, 48 ignored in 283.79s. It is outside the changed files; I will rerun this exact test alone to determine repeatability.The failed server test passed alone on the same compiled binary:
1 passed; 0 failed; 0 ignored; 496 filtered out; finished in 0.16s. The full iterate run remains failed, so this does not clear that gate. At the isolated rerun the build-host load average was 20.23/16.19/17.83. I will rerun the full iterate gate after shared host load drops.Third iterate finding at
ebd62f9:crates/infraternal/tests/agent_queues.rs::saturated_terminal_queues_preserve_every_byte_and_daemon_livenessfailed its queue saturation oracle. The fixture received{"error":"terminal unavailable","reason":"resource_unavailable"}; test result was 0 passed, 1 failed in 7.38s. Build-host load was 45.05/31.31/23.12. No infraternal/server sources are changed. I will retry after concurrent jobs clear.The isolated
agent_queuestest passed on the same compiled binary: 1 passed, 0 failed, finished in 36.72s. The full gate remains red; I will retry it only after the other workspace runs clear so all standard gate rows pass together.Fourth iterate finding at
ebd62f9:remote_runtime::tests::standby::control_queue::saturated_native_control_queue_does_not_hide_primary_terminal_outputfailed again (server group: 448 passed, 1 failed, 48 ignored; 293.78s). This run panicked atassertion failed: live_connection.close_reason().is_none()(crates/infraternal-server/src/remote_control_queue_tests.rs:216). The same exact test passed alone previously in 0.16s. Build-host load at gate completion was 16.58/19.08/20.54. I will rerun the full suite withRUST_TEST_THREADS=1so every test runs without competing sibling tests.The control-queue test passed again in isolation on the same binary: 1 passed, 0 failed, 496 filtered out, finished in 0.10s. I will rerun the full iterate gate with
RUST_TEST_THREADS=1to keep every test while avoiding concurrent sibling tests in one binary.At
ebd62f98dd0493cf7a3f7b5f0cdcc5d705a15873,scripts/verify iteratepassed withRUST_TEST_THREADS=1to serialize the host-sensitive suite. The previously intermittent server control queue and terminal queue cases passed. Final output:37 pass
0 fail
34463 expect() calls
Ran 37 tests across 10 files. [2.66s]
ITERATE gate passed. This is not the final gate: run scripts/verify fast before reporting done.
At
ebd62f98dd0493cf7a3f7b5f0cdcc5d705a15873, the final trimmed vendor bundle passed the focused production browser suite on unique port 4287: 4 passed (1.4m). Wide final-glyph underline coverage was positive at DPR 1/2/3: lead/continuation accent pixels 7/11, 32/32, and 89/92. The theme test verified accent color, unchanged text color, hover/modifier show and hide, and both themes.Fresh screenshots:


Vendor artifact check passed at
ebd62f98dd0493cf7a3f7b5f0cdcc5d705a15873. I supplied the job scratch Zig 0.15.2 path viaZIG; the PATH-only attempt had exited before the build because Zig was not on PATH. The check reproduced the checked-in artifacts:reproduced ghostty-web 5f0c6b7 with Ghostty 5714ed0 (Bun 1.4.2, Zig 0.15.2)
git diff --check passed.
Committed the four-file critical-path trim as
f25c5f0705c(Keep terminal link underlines within the critical transfer budget (#232)). It retains wide-glyph endpoint width while removing duplicate range clone/equality work; focused browser checks passed andbuild.sh --checkreproduced the pinned artifacts.Pushed
f25c5f0705ctoorigin/link-underline. The worktree was clean at push time.Post-commit production transfer measurement for merge base
41a3a81abceaa4ea7457d84ee05297ca2244efcc→f25c5f070b689496566f89f98a9663477bb7ed15:production-bundle-postcommit.log
Perf setup finding on
infraternal-perf-test: withscrollback=40000000in the URL, theorigin/devbuild ignored that test-only setting and reportedconfiguredScrollback=10000,scrollbackRows=1341,rows=42after the 10,000 LF-separated URL lines. That run produced no timing samples. I’m correcting the paired run to use the shared 10,000-row default on both builds and CRLF-delimited URL rows, then I’ll report the actual retained row counts from both buffer metrics and screen text.perf-origin-dev-40m-request-default-retention.log
The corrected
origin/devrun used the sharedscrollback=10000setting and CRLF-separated 10,000 URL lines (360,013 bytes). It reportedconfiguredScrollback=10000, 1,119 retained scrollback rows / 1,160 URL rows, 42 viewport rows, 53 columns, and confirmed the final URL rendered. Load average at start was[1.57, 0.74, 0.46]. The 24 hover-to-link-cursor samples had p95 0.30 ms. The first scroll capture stalled afterlink_scan_ready, so no scroll-frame result was recorded. I stopped this run’s PIDs 2158082 and 2158103; the systemd scope is inactive and the lock is released.perf-origin-dev-scroll-stall.log
I corrected the external perf harness so its frame sampler registers the requestAnimationFrame collector and returns before collection, reads viewport metrics from the product test API, and bounds each wheel command to 1 s. The paired baseline rerun uses fresh port 4392 and is queued behind the perf VM lock.
The
origin/devrun with 10,000-row default and CRLF URL rows reached the scroll phase, but alternating wheel direction on each event left the sampled viewport unchanged. No scroll p95 was produced. I changed the harness to keep one direction per 2 s run (starting upward from the bottom, then alternating direction between runs) and will retry on a fresh port.perf-origin-dev-scroll-no-movement.log
Perf harness correction: the product canvas routes wheel input to canvas movement until the terminal input lock is enabled (D177; apps/tracer/src/canvas/camera/gestures.ts and apps/tracer/test/lock-icons.spec.ts). The no-movement sample therefore measured no terminal scrolling. The harness now activates the existing input-lock control through the UI, verifies aria-pressed=true, and uses fresh ports 4442/4443 for origin/dev and 4452/4453 for the branch. No product code change. Rerunning the paired 10,000-line scroll sample on the perf VM.
Second perf harness correction: the input-lock toolbar button is present but hidden until the canvas toolbar row is rendered, so Playwright's visibility-checked click timed out. The existing lock-icons test activates the same button through DOM click after selecting the console window. I aligned the external harness with that established interaction; no product code change. Retrying on fresh ports 4462/4463 (origin/dev) and 4472/4473 (branch).
Origin/dev baseline completed on
infraternal-perf-test(4 vCPU, 8,262,776,688 bytes RAM), load average 0.72/1.74/1.33 at start and 0.91/1.76/1.33 at finish. Workload: 10,000 URL lines / 360,013 bytes; configured scrollback 10,000, retained scrollback 1,119 rows and screen URL rows 1,160. Hover-to-link-cursor p95 0.30 ms over 24 samples. Three scroll runs moved viewport; frame interval p95 16.8 ms in each run (run 1 p99 33.3 ms, max 50.1 ms; runs 2–3 p99/max 16.8 ms). Full raw log: https://git.kayg.org/attachments/b48ef74e-580b-4982-9086-4721789bfea1. Branch run follows against the same workload.Branch perf startup diagnostic: the candidate page rendered the plain
TEST DOUBLEscreen and never connected a product terminal. The served candidatemain.jshas the preview-only product test mode compiled out (useCanvasis false formock=1), so this is a mismatched preview artifact, not an app startup regression. The candidate directory was reused for the production transfer-size comparison; I will rebuild a fresh preview artifact withINFRATERNALE_CLUSTERS_PREVIEW=1, re-stage it on the perf VM, and retry on fresh ports. No timing result from this run.Branch-head fast gate completed at
f25c5f070b(exit 0;RUST_TEST_THREADS=1; full raw transcript: https://git.kayg.org/attachments/e271e054-1a2b-40b7-ab92-1657932975f2).Gate summary, verbatim:
Static-size rows: x86_64-unknown-linux-musl 21,422,096 B exact cap PASS; aarch64-unknown-linux-musl 19,594,856 B exact cap PASS. Proceeding with the fresh preview build and paired branch perf run.
Correction to the prior preview-build note: the latest candidate artifact still had product test mode disabled because my build command used
INFRATERNALE_CLUSTERS_PREVIEW(extraE);apps/tracer/build.tsreadsINFRATERNAL_CLUSTERS_PREVIEW. The served artifact was therefore not a valid product preview, and no branch timings were collected. Rebuilding with the exact repository variable and switching to fresh candidate ports 4502/4503.Branch perf completed at head
f25c5f070b. Both variants ran oninfraternal-perf-test(x86_64, 4 vCPU, 8,262,776,688 bytes RAM) with the same 10,000-URL-line, 360,013-byte workload andscrollback=10000query setting. Both reported configuredScrollback=10000, retainedScrollbackRows=1119, retainedUrlRows=1160, and a 42-row × 53-column viewport. The 1,119 value is the actual retained scrollback count; the earlier 9,957 figure was incorrect.Origin/dev (
650472b987dbd1fe7192248dd1367d0766c5fb79): load average 0.72/1.74/1.33 at start, 0.91/1.76/1.33 at finish. Hover to link cursor (24 samples): p95 0.30 ms, p99 0.40 ms. Three moving scroll runs each had frame p95 16.8 ms; p99 was 33.3 ms on run 1 and 16.8 ms on runs 2–3. Raw log: https://git.kayg.org/attachments/b48ef74e-580b-4982-9086-4721789bfea1Branch (
f25c5f070b689496566f89f98a9663477bb7ed15): load average 0.34/0.09/0.28 at start, 0.88/0.21/0.32 at finish. Hover to underline pixel (24 samples): p95 1.20 ms, p99 1.90 ms. Three moving scroll runs each had frame p95 16.8 ms and p99 16.8 ms; run 1 had one 133.4 ms maximum interval, while runs 2–3 maxed at 16.8 ms. Raw log: https://git.kayg.org/attachments/58607c25-4a64-4865-aa5e-0fcaa10dba06The hover endpoints differ by design: origin/dev has no underline pixel, so its measurement ends when link detection exposes the pointer cursor; the branch measurement ends when the accent underline pixels appear. Scroll p95 is unchanged. Critical JavaScript gzip growth remains +274 B against the +364 B limit. The screenshots and branch-head fast-gate transcript are attached above.
Finished and pushed. HEAD:
f25c5f070b(origin/link-underlinematches). The issue now has the two review fixes, wide-glyph evidence, paired perf logs, both theme screenshots, bundle-size receipt, and full fast-gate transcript.Performance result: on the perf VM, with 10,000 URL lines and
scrollback=10000, both variants retained 1,119 scrollback rows (1,160 URL rows including screen rows). Origin/dev hover-to-link-cursor p95 was 0.30 ms; branch hover-to-underline-pixel p95 was 1.20 ms. All three scroll runs on both variants had 16.8 ms frame p95. Branch critical JavaScript gzip grew by 274 B, within the +364 B limit. Machine and load averages plus p99/max details are in the preceding issue comment and attached raw logs.Fast gate output, verbatim:
Full raw output: https://git.kayg.org/attachments/e271e054-1a2b-40b7-ab92-1657932975f2
Demo video of
f25c5f070(production build, test data): hover underline, Ctrl held underlines all visible links, scroll leaves no stale underline, light theme.link-underline-demo.webm
Merge blocked only on a rebase onto dev (conflict with #228 tooltip placement in terminal-links.on-demand.ts); sent back to the job.
Separate gap noticed: URL detection ends at the first wide (CJK) character, e.g.
https://cjk.example.test/路径/文档links only up to/路. Not part of this change.Continuing #232 on
link-underline, current HEADf25c5f070b689496566f89f98a9663477bb7ed15, rebasing onto fetchedorigin/devatc47a438be76e8cb1e5a5328bd190520d6039b33f. Worktree is clean. Read the full #232 and #214 comment histories; next I will verify the two committed review tests fail before applying them.Confirmed both reviewer regressions before the existing fixes at test snapshot
c0183a899(pre-fix base7a902273d). The scroll unit suite failed 13/14: stale paint remained{startX:0,startY:0,endX:30,endY:0}after the viewport moved. The production wide-glyph Playwright check failed at DPR 1/2/3: lead pixels 7/32/89, continuation pixels 0/0/0 (minimums 4/8/12). Logs: scroll, wide.Rebase complete:
link-underlineis based onorigin/devc47a438be76e8cb1e5a5328bd190520d6039b33f, head221657f53. Both link-tooltip placement/wrapping and accent underline behavior are retained; the scroll-clear path now hides throughhideLinkTip(). During replay,bun run checkpassed, the focused scroll suite passed 14/14, and the merged tooltip/underline browser suite passed 5/5 at port 4232. Exact-head browser and gate reruns are in progress.Exact-head tracer checks passed at
221657f53:bun run check; focused link unit/property suites, 15 passed with 54,612 assertions;TRACER_TEST_PORT=4232 bun x playwright test test/terminal-links.spec.ts test/renderer-link-wide-review.spec.ts, 6 passed. The pixel test reports lead/continuation accent pixels 7/11, 32/32, 89/92 at DPR 1/2/3. Dev’s long-link tooltip checks passed at phone and desktop sizes; labels stayed within the tooltip and clear of the wrapped rows. Raw outputs: unit, browser.Final ink/paper captures (393×852, 375×667, 1440×900):



Production transfer-budget comparison completed at head
221657f535be94768f0e3285c00fcc2822cd80ee, againstorigin/devc47a438be76e8cb1e5a5328bd190520d6039b33f.Critical JavaScript: origin/dev 963,430 B identity / 298,149 B gzip / 247,962 B brotli; branch 963,816 B / 298,398 B / 248,239 B. Delta: +386 B identity, +249 B gzip, +277 B brotli. The critical-path gzip growth is within the +364 B limit. Both transfer-budget runs passed; largest on-demand chunk is 15,945 B gzip / 14,169 B brotli.
Receipts: origin/dev transfer report, branch transfer report.
The shared
origin/devref advanced to06be8b0000f7d476eeeeed3472a4605757151243during this job.git merge-base origin/dev link-underlineremainsc47a438be76e8cb1e5a5328bd190520d6039b33f, the base used for the rebase. I stopped the static baseline build as soon as it started against the moving ref; it produced no size measurement. The comparison is pinned toc47a438be76e8cb1e5a5328bd190520d6039b33fand will be rerun.The first static size baseline attempt produced no binary: I invoked
scripts/static-cargowithout the repository's pinned compiler bootstrap. The build log shows.cargo/musl-cc.sh:53: .../target/auth-tools/zig/zig: No such file or directorywhile compilingopenssl-sys. The worktree was restored tolink-underline; I’m runningscripts/auth-toolchainand repeating the baseline at the verified merge basec47a438be76e8cb1e5a5328bd190520d6039b33f.Receipt: static-baseline.log
The first perf VM lock window ended without a measurement. The bundled mock server started from the job root, so its evidence-path guard classified
/root/infraternal-bench/link-underline/evidenceas inside its checkout and exited before serving. Server PID 2578712 exited with status 1 and the perf lock was released. I’m placing the bundle under a test-tree-shaped directory and setting the evidence path to a sibling of that checkout root before retrying.Receipt: server startup error
The corrected origin/dev run reached the 10,000-line workload on
infraternal-perf-test(x64, 4 CPUs, 8,262,776,688 bytes RAM) withscrollback=10000. It retained 1,483 scrollback rows / 1,520 URL rows including the visible screen (38 viewport rows × 44 columns; 360,013 output bytes). Under start load average 2.29/1.87/1.45, 24 pointer-to-link-cursor samples had p95 9.7 ms and p99 21.0 ms. No scroll frames were measured: Playwright timed out because the input-lock button is present but not visible to its click action. Server PID 2580121 exited with status 143 and the perf lock was released. I’m switching to the existing DOM click pattern and will repeat the paired baseline/candidate run.Receipt: partial origin/dev run
Perf baseline run at
c47a438beon the perf VM reached 10,000 URL lines (360,013 bytes), with configured scrollback 10,000, retained rows 1,483, viewport 38×44 and 37 visible links; load at start was 2.38/2.36/1.77. It stalled before hover samples. The harness waited on the hover promise before sending pointer movement; I fixed that sequencing and added bounded phase waits. No timing result is claimed from this run. Receipt: perf-origin-dev-final-rebased.log. The harness/server PIDs were stopped and the run's lock released.Perf baseline completed on merge-base
c47a438be(infraternal-perf-test, x64, 4 vCPU, 7.7 GiB). Withscrollback=10000, the terminal retained 1,483 scrollback rows plus 38 viewport rows after 10,000 URL lines (360,013 bytes); 37 links were visible. Load average was 2.66/1.77/1.64 at start and 2.41/1.75/1.63 at end. Across 24 hovers, pointer-to-link-cursor p95 was 5.8 ms. Across three 2 s scroll runs, frame-interval p95 was 16.7 ms in each run. Receipt: origin-dev-perf-run.log. Candidate run follows with the same harness.D243 merge-base size measurement completed at
c47a438be. Recipe:scripts/static-cargo build --locked --release --package infraternal --target x86_64-unknown-linux-musl, then the built ELF was confirmed static-pie and stripped. Size: 21,308,208 bytes. Receipt: static-baseline-merge-base.log. Candidate size will be taken from the final fast gate build.Candidate perf run reached the same 10,000-line workload (
scrollback=10000, 1,483 retained rows, 38×44 viewport, 37 visible links) oninfraternal-perf-testat load 2.87/2.01/1.73, but the first hover sample timed out before yielding a measurement. The server exited and the lock was released; no candidate timing result is claimed. I’m instrumenting the pointer-event bounds and canvas pixel check before retrying. Receipt: candidate-perf-run-failed.log.The candidate pointer diagnostic confirmed one matching event at (33, 122) on the canvas and
cursor=pointer; the link was cached at column 0, visible row 0. The timeout came from the harness's exact-RGB pixel match, which missed the renderer's anti-aliased underline. I changed the measurement probe to use the accent-to-background pixel projection used by the browser assertions. No app change was made. Receipt: candidate-perf-diagnostic.log.Candidate perf completed on
infraternal-perf-test(x64, 4 vCPU, 7.7 GiB), with the same 10,000 URL lines andscrollback=10000: 1,483 retained scrollback rows, 38 viewport rows and 37 visible links. At start/end load 3.45/2.17/1.80 and 3.24/2.16/1.81, pointer-to-accent-underline p95 was 9.7 ms over 24 hovers. Three 2 s scroll runs had frame-interval p95 16.8, 16.8 and 16.7 ms. The baseline run started at load 2.66/1.77/1.64, so the hover numbers are not a load-matched delta; scroll p95 stayed at 16.7–16.8 ms in both. Receipt: candidate-perf-run-final.log.The final gate's x86_64 static size check reports 21,308,208 bytes against the 21,300,016-byte cap (+8,192). The independently built
c47a438bemerge-base binary measured the same 21,308,208 bytes with SHA-2567dfeac9024fc8706bbf2cbd9a5c35951c3ae2a3a10b5e90095c43c9a0e25217f; this lane changes no Rust files, so the measured binary delta is 0 bytes. The fast gate is continuing its remaining static checks; I’ll include the complete output at finish. Baseline receipt: static-baseline-merge-base.log.Finished and force-pushed
link-underlinewith lease. Head:221657f535be94768f0e3285c00fcc2822cd80ee(f25c5f070→221657f53). No deploy.Rebase keeps the #228 tooltip placement/wrapping and #232 accent underline, modifier hold, synchronous scroll clearing, and wide-glyph continuation. Tracer unit checks:
15 pass,0 fail,54,612 expect() calls.TRACER_TEST_PORT=4232 bun x playwright test test/terminal-links.spec.ts test/renderer-link-wide-review.spec.ts:6 passed; the tooltip suite:5 passed. Screenshots: ink 393×852, paper 393×852, ink 375×667, paper 375×667, ink 1440×900, paper 1440×900.Bundle budget passed: critical JS is 298,398 B gzip / 248,239 B Brotli; delta vs
c47a438beis +249 B gzip / +277 B Brotli, under the +364 B gzip limit.Perf VM (
infraternal-perf-test, x64, 4 vCPU, 7.7 GiB), 10,000 URL lines,scrollback=10000: 1,483 retained scrollback rows plus 38 viewport rows, 37 visible links. Baseline load start 2.66/1.77/1.64: pointer-to-link-cursor p95 5.8 ms; scroll frame p95 16.7–16.7 ms. Candidate load start 3.45/2.17/1.80: pointer-to-accent-underline p95 9.7 ms; scroll frame p95 16.7–16.8 ms. Loads differ, so the hover readings are not a load-matched delta. Raw receipts are attached in the preceding perf comments.D243 size: stripped x86_64 static binary is 21,308,208 bytes on both branch and merge base, delta 0 bytes; SHA-256 matches. The aarch64 binary is 19,508,568 bytes. No Rust files changed.
scripts/verify fastfinal output (full 325,692-byte transcript: verify-fast-final.log):The static gate failures are recorded on this issue: both binaries exceed their current caps by 8,192 bytes, and the metadata checks found the Cargo registry path in both images. The x86_64 binary is byte-for-byte identical to the
c47a438bemerge-base artifact, so these failures are present in the base as well as this branch.Merged to dev as
f627a2e09and deployed web-only to production (no restart). release-prod-live =f627a2e09. Owner saw the demo video. Follow-ups queued: URL detection stops at the first wide (CJK) character; last text column possibly clipped while the scrollbar shows.kayg referenced this issue2026-10-28 17:53:55 +00:00
kayg referenced this issue2026-10-28 17:53:56 +00:00
Closed by the orchestrator during the 2026-11-09 night housekeeping (owner order: "close stale prs/issues"). The work has landed on dev, and the latest note here is a finish or merge note (J387 inventory on #436). Reopen if anything is still missing.