J95: option rows: label left, description right, subtitle when narrow (shared choice list) #306
Open
opened 2026-11-02 07:13:12 +00:00 by kayg
·
8 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#306
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?
Job J95 (UI, small). Owner, 2026-11-02, on Settings → Appearance and Window Sizes (two production screenshots):
"Paper (left aligned) ... light (right aligned). same for the font section and the others. if the width is smaller ... 'light' becomes a subtitle to Paper."
Scope
The one shared option-row (
choiceBlock+fitHints+.ui-sp-list/.ui-sp-rowCSS inpackages/ui), so Theme, Font, Phones, Desktop and any future list change together:Plan and estimate (about 2 h)
j95-option-rowsfrom origin/dev. (done)choiceBlock/fitHintsrewrite in packages/ui; swatch-slot reservation inrenderAppearance. ~40 minapps/tracer/test/settings-rows.spec.ts(desktop: description right edges equal ±0.5, label left edges equal ±0.5, heading left = row left; phone: subtitle mode, no truncation). ~30 minscripts/verify fast, TS half first), screenshots 1440×900@2x and 393×852@3x on this issue. ~40 minNot touching: add-host
.ah-optionsradio cards (a different component, flow cards), switch/status rows in Hosts, the details-card danger row.Queues at start: compute01 3/4 slots busy, dev-02-std 2/3 busy → dev-02 has a free slot.
Start: branch
j95-option-rows, baseb0e79b31e3d0f3dc89ae3ca67b466d929c6d03ba(origin/dev). Plan and estimate (about 2 h) are in the issue body. Queues: compute01 3/4 busy, dev-02-std 2/3 busy; gate goes to dev-02.Finish (J95)
Branch
j95-option-rows, heade62d125e96, baseb0e79b31e(origin/dev when started). Three atomic commits:ui:(shared option row, packages/ui),test:(settings-rows spec),taste:(J66's "one aligned hint column" row struck through and replaced, owner quoted).What changed (one shared component, no per-list code)
@containercannot compare a container with its own text's width, and per-row decisions would recreate the "Comfortable / with margins" outlier, so the decision stays per list. Each row is now measured against its own two widths, not the widest name;.ah-optionsradio cards, switch/status rows in Hosts (their rows still sit 8 px in from their headings: visible next to Window Sizes in the 1440 capture; say if you want them aligned too), the details card's danger row.Tests (dev-02-std, production build through the latency proxy)
bun x playwright test test/settings-rows.spec.ts test/details-removal-row.spec.ts: 9 passed. (The first run of the new spec failed on my own measurement of the scaled-down unselected tick; fixed by measuring the layout box.) Spec measures at 1440×900 DPR 2, 393×852 and 375×667 DPR 3, ink and paper, ±0.5 px.Also run: font-switch.spec passes; sign-out.spec has 3 failures (
.cl-mockupnot found / split-right timeout) that fail identically on unmodified origin/dev (run in a clean worktree).Gate
scripts/verify faston dev-02-std (full, incl. x86 static cross-build). Final table:static buildsPASS (aarch64 +812216 bytes vs baseline, report only; no Rust changed).testFAIL (101) is not from this branch (no Rust, no build input touched). Fullinfraternal-server --libon my branch vs my exact baseb0e79b31e, same worktree and target: the same 8 tests fail on both (account_events::review_revocation_r2×4,socket_tests::review_subscription_refusal×2,release_manifest::signed_identity_and_exact_bytes_are_required,release_payload::resolver_startup_removes_only_owned_inactive_private_staging). The branch run additionally failedreviewer_disk_cancel_complete_racesandreviewer_disk_restart_and_concurrent_resume; rerun alone on the branch: both ok (load-sensitive on the shared VM; the first gate run failed yet another subset, the bootstrap_runtime / enrollment-migration tests). Becauseverifystops at the Rust failure, its TS half did not run there, so I ran it directly (ts_verify_fast): TS_EXIT=0 (tracertsc, bun tests, bundle transfer budget, protocol tests).Screenshots
1440×900 @2× and 393×852 @3×, ink and paper, whole page and the section's own window (attached below).
Follow-up (orchestrator, 2026-11-02): align the non-option rows too
Branch
j95b-settings-rows, base313d0dd63(origin/dev with J95 merged). Same rules.Rule to implement: every non-option row in Settings starts on its heading's left edge (no indent); any value, switch, key caps or action sits right-aligned on the same right edge as the option descriptions: before the ✓ column in a window that has option lists, at the row's far right where there is no ✓.
Row types found (Settings sections appearance, windows, hosts, toolbar, shortcuts, devices, account, about, users, access, found hosts): switch rows and status rows (
.ui-sp-switch,.ui-sp-status, Hosts and Account), toolbar items (.ui-ts-item: grip, icon, label, switch), shortcut rows (.ui-ss-row: label, key caps, reset), device rows (.ui-sp-device: kind icon, name, icon buttons), key/value facts (.ui-kv-row: About, Account, Users, Access, Found hosts), and Appearance's UI-size slider readout.Plan (about 2 h)
packages/ui(shared classes only): zero row indent with the bleeding hover fill for all.ui-sp-rows; a--ui-sp-endtoken (✓ column + gap) set by a window that has option lists; icon glyphs (grip, kind icon, icon buttons) aligned by their glyph, not their hit box, via negative margins. ~50 minsettings-rows.spec.ts; screenshots at 1440×900 DPR 2 and 393×852 DPR 3 on this issue. ~30 minverify fast; Rust failures known on dev are named. ~30 minOut of scope unless it falls out of the above: add-host
.ah-optionscards, the details-card danger row (lives in a popover, not in Settings).Follow-up finish: every Settings row on the two shared edges
Branch
j95b-settings-rows, head8904bb2835, base313d0dd63(origin/dev with J95 merged). Three atomic commits:ui:,test:,taste:.Measured first, then fixed
Before the fix,
settings-edges.spec.ts(diagnostic mode) measured each row type's first and last mark against the section's content edge and the descriptions' right edge (CSS px, 1440 / 393):What changed (shared classes in
packages/ui; no per-section code).ui-sp-rows lose their indent (hover fill stays as the bleeding pseudo-element; no fill on a status row);--ui-sp-endtoken = how far a row's last mark stops short of the far right: 0, or the tick column plus gap in a window with option lists (data-tickson Appearance and Window Sizes). Switch and status rows pad by it, the slider is inset by it;--ui-sp-tick, 1.125rem). Finding:.terminal-screen svg { width: 1.125rem }outranks.ui-sp-tick, so on desktop the column was 19.8 px while the old code assumed--ui-icon= 17.6 px; the visual size is unchanged;::before, content-box) is 1 px wider than its 3rem box: the box stops short by3px - 0.125remso the track is what sits on the edge;::afteris dropped because the box is already 44 px on touch). Side effect: on desktop those icon buttons are 30 px (was 24 px);minmax(0, 1fr)column and the source line wraps. The spec also asserts no sideways scrolling in any section.Tests (dev-02-std, production build)
settings-edges.spec.ts(new, 4 tests: ink/paper × 1440×900 DPR 2 / 393×852 DPR 3; sections Appearance, Window Sizes, Hosts, Toolbar, Shortcuts, Devices, Account, About; each must contain its expected row types) together withsettings-rows,details-removal-rowandfont-switch: 16 passed (PW_EXIT=0).bun run checkclean.Gate
ts_verify_fast): TS_EXIT=0 (tracer tsc, bun tests, transfer budget, protocol tests).scripts/verify faston dev-02-std: artifact gate PASS; table:testFAIL: no Rust changed. This run failed 5 tests in packageinfraternal(bin), each killed by its own 58 s watchdog (exceeded 58.1s; status=signal: 9) on the loaded VM:restart::tests::cold_exec_with_closed_stdin_keeps_the_image_pinned_and_maps_null,restart::tests::deleted_path_review::relative_recovery_after_atomic_install_keeps_live_install_path,restart::tests::path_review::late_recovery_from_path_invocation_keeps_install_target,restart::tests::reload_reopens_install_path_when_the_running_inode_was_replaced,restart::tests::restart_request_logs_kernel_peer_target_and_cold_outcome. Run alone in the same worktree: branch 18 passed, 0 failed; unmodified base313d0dd6318 passed, 0 failed. They are load timeouts, not code failures. (Different from the 8 server-lib failures named in the previous round on dev, which this run did not hit: the failing set changes from run to run on these shared VMs.)Screenshots
Each Settings section's window at 1440×900 DPR 2 (ink) and 393×852 DPR 3 (paper), attached below.
J127 start (UI, small). Branch
j127-shortcut-changed-dot, base7add12640(origin/dev).Owner decision 2026-11-03 ("agreed"), from J95b's finding that an overridden shortcut row's reset button pushed its key caps one button early: a changed shortcut shows a small dot on its key caps (tooltip "Changed from "); Reset moves into the row's shared menu (J106: right-click, long-press, Shift+F10/ContextMenu) and the keyboard; "Reset all" sits at the bottom of the list and asks in its own row (TASTE "A destructive row action asks in its own row"); every row keeps its caps on the shared right edge.
Plan and estimate (about 2.5 h)
packages/ui/src/shortcuts-settings.ts(+.ui-ss-*CSS inpackages/ui/styles.css) ~60 min.ui-ss-resetbutton; an overridden row gets a dot inside.ui-ss-keys(absolutely positioned on the caps' top-left corner, so the caps' box and right edge never move) carryingdata-tip="Changed from <default combo label>", and anaria-labelon the row button that says the same;attachRowMenu(row-menu.ts) to the list: one action, "Reset to " (only on changed rows; fixed rows and unchanged rows have no menu), so right-click, long-press and Shift+F10 / ContextMenu work as in every other list;mountRowAsk("Reset all shortcuts? Reset · Cancel").attachRowMenu,mountRowAsk, the shared tooltip (data-tip) and the settings row classes are reused.apps/tracer/test/shortcut-reset.spec.ts(Playwright, 1440×900 and 393×852): caps' right edges within 0.5 px with and without overrides (all rows equal), dot present on changed rows only + tooltip text, Reset via menu (right-click, Shift+F10) and via Delete, Reset all asks in its row (row height unchanged, no dialog) and resets; updatesettings-edges.spec.ts(it measures the reset button as the last mark of a shortcut row). ~45 minscripts/verify faston the emptier VM, screenshots at 2x of changed/unchanged rows and the in-row question. ~40 minNot touching: the capture flow (click row, press keys, swap/cancel warning), the
?panel, the registry.One interpretation to flag: "and the keyboard" is implemented as Delete/Backspace on the focused row plus the menu's keyboard route (Shift+F10). Say so if you want a different key.
J127 progress. Branch
j127-shortcut-changed-dot, headb95cc78f1(2 commits on7add12640: the UI + tests, then the TASTE row). Pushed.Implemented (reuse only, no new component): dot on the first cap's top-left (absolute, out of flow) with
data-tip="Changed from <default>"; Reset = the sharedattachRowMenuaction "Reset to " (right-click / long press / Shift+F10) and Delete/Backspace on the focused row; "Reset all" = last row, shown only while something is changed, asks through the sharedmountRowAsk.Finding 1 (decision, evidence in the commit message): on touch a long press on the caps would open the row menu (480 ms, row-menu.ts) and the tooltip (500 ms, tooltip.ts) together, so touch gets no tooltip; the menu item names the default ("Reset to Ctrl+Shift+K"). Pointer keeps the tooltip.
Finding 2 (not done, flagging): TASTE "Everything you can do is findable in search": a per-row Reset has no palette entry (the sidebar gets its rows' entries from focused-row plumbing in core-screen). Left out of this task on the scope leash; say if you want it.
First run on dev-02-std (
tsc+settings-edges.spec.ts+shortcut-reset.spec.ts):tscclean,settings-edges4/4 pass,shortcut-resetpassed every step through caps edges, dot, tooltip, menu Reset, Shift+F10 and Delete, then failed only on my own assertion about the Reset-all question text (the screen-reader-only effect line is part of the text; fixed by dropping the end anchor, same asrow-ask.spec.ts). Re-running now, thenscripts/verify fast; both are queued behind other jobs on dev-02 (queue position 5).J127 finish. Branch
j127-shortcut-changed-dot, head0a8a427ea806c0d57ea5904f3828feb5ee704d65(2 commits on2c58f76b5, origin/dev at the time of the final rebase): commit 1 the UI + tests, commit 2 the TASTE row. Pushed (own branch only).What changed
packages/ui/src/shortcuts-settings.ts,packages/ui/styles.css: no reset button beside the caps any more. A changed row gets a dot on its first cap's top-left corner (absolute, out of flow) + pointer tooltip "Changed from ". Reset = the sharedattachRowMenuaction "Reset to " (right-click, long press, Shift+F10) and Delete/Backspace on the focused row (focus returns to the row after the repaint). "Reset all" = last row, shown only while something is changed, asks in its own row through the sharedmountRowAsk. Reused only:attachRowMenu,mountRowAsk, the shared tooltip, the settings row classes. No new component.apps/tracer/src/core-screen.ts:shortcutsSection(stage).apps/tracer/test/shortcut-reset.spec.ts(new),settings-edges.spec.ts(no longer measures a reset button),docs/design/TASTE.md(new row beside "Every Settings row shares two edges").Evidence
shortcut-reset.spec.ts+settings-edges.spec.tson dev-02-std, final head: 6 passed (1.4m): settings-edges ink/paper × 1440×900/393×852, shortcut-reset 1440×900 and 393×852. shortcut-reset asserts: caps' right edges within 0.5 px with no override, with 3 overrides, after each reset and after Reset all (and equal to the original edge); labels keep one left edge; one dot per changed row, none elsewhere, absolute, on the cap's corner; tooltip text "Changed from " (pointer; touch has none, see below); Reset via right-click menu, via Shift+F10 + Enter, via Delete (focus lands back on the row); Delete on an unchanged row does nothing; an unchanged row's right-click stays the browser's; "Reset all" absent until a change, starts on the labels' x, asks in its row (every row's offsetTop/offsetHeight unchanged, no.ui-confirm-tip/alertdialog, question starts on the label's x ±0.5, row's own label fades to opacity 0), Cancel and Escape restore it, Reset resets everything.Screenshots at 2x (1440×900) and 3x (393×852) attached below: changed rows with dots, and the in-row question.
Findings
.bm-rowCSS). My "Reset all" row had no such rule, so "Reset all?" was drawn over "Reset all". Added the rule and a spec assertion on the label's opacity.scripts/verify fastrun (same head0a8a427ea) failed the Rusttestrow on 3 of 11 tests oftests/agent_daemon.rs(real_binary_rootless_private_readiness_does_not_refuse_person_revocation,..._person_preparation_honors_explicit_state_without_runtime_environment:resource_unavailable;real_binary_keeps_background_backend_probe_off_the_control_path: socket timeout) while the VM was loaded. This diff changes no Rust (TS, CSS, one Markdown row). Run alone on this head:cargo test --workspace --locked --test agent_daemon→ 11 passed; on a detached worktree of unmodified2c58f76b5(same command): 11 passed. The full gate was then rerun on the final head and is green (below). So it is a load-sensitive flake, not this change; the first run's failure was not hidden.Gate:
scripts/verify faston infraternal-dev-02-std, head0a8a427ea, exit 0 (verbatim rows)Static sizes (report only, D243 amended; no Rust changed, deltas are dev's drift against the recorded baselines): x86_64 22475824 bytes (baseline 22418256, +57568); aarch64 20495736 bytes (baseline 20453280, +42456). Key memory on x86_64 is SKIP (host aarch64), as the brief says for foreign execution.
Budgets: JS transfer critical gzip 319475/327680, brotli 266868/273408; deferred gzip 59733/61440, brotli 52764/55296; all passed.
How to test: Settings → Shortcuts → click a row, press a new chord: a dot appears on its caps, the caps do not move. Right-click it (or Shift+F10, or Delete on the focused row): "Reset to ". "Reset all" appears at the bottom, and asks in its own row.
J127 finish. Branch
j127-shortcut-changed-dot, head0a8a427ea806c0d57ea5904f3828feb5ee704d65(2 commits on2c58f76b5, origin/dev at the time of the final rebase): commit 1 the UI + tests, commit 2 the TASTE row. Pushed (own branch only).What changed
packages/ui/src/shortcuts-settings.ts,packages/ui/styles.css: no reset button beside the caps any more. A changed row gets a dot on its first cap's top-left corner (absolute, out of flow) + pointer tooltip "Changed from ". Reset = the sharedattachRowMenuaction "Reset to " (right-click, long press, Shift+F10) and Delete/Backspace on the focused row (focus returns to the row after the repaint). "Reset all" = last row, shown only while something is changed, asks in its own row through the sharedmountRowAsk. Reused only:attachRowMenu,mountRowAsk, the shared tooltip, the settings row classes. No new component.apps/tracer/src/core-screen.ts:shortcutsSection(stage).apps/tracer/test/shortcut-reset.spec.ts(new),settings-edges.spec.ts(no longer measures a reset button),docs/design/TASTE.md(new row beside "Every Settings row shares two edges").Evidence
shortcut-reset.spec.ts+settings-edges.spec.tson dev-02-std, final head: 6 passed (1.4m): settings-edges ink/paper × 1440×900/393×852, shortcut-reset 1440×900 and 393×852. shortcut-reset asserts: caps' right edges within 0.5 px with no override, with 3 overrides, after each reset and after Reset all (and equal to the original edge); labels keep one left edge; one dot per changed row, none elsewhere, absolute, on the cap's corner; tooltip text "Changed from " (pointer; touch has none, see below); Reset via right-click menu, via Shift+F10 + Enter, via Delete (focus lands back on the row); Delete on an unchanged row does nothing; an unchanged row's right-click stays the browser's; "Reset all" absent until a change, starts on the labels' x, asks in its row (every row's offsetTop/offsetHeight unchanged, no.ui-confirm-tip/alertdialog, question starts on the label's x ±0.5, row's own label fades to opacity 0), Cancel and Escape restore it, Reset resets everything.Screenshots at 2x (1440×900) and 3x (393×852) attached below: changed rows with dots, and the in-row question.
Findings
.bm-rowCSS). My "Reset all" row had no such rule, so "Reset all?" was drawn over "Reset all". Added the rule and a spec assertion on the label's opacity.scripts/verify fastrun (same head0a8a427ea) failed the Rusttestrow on 3 of 11 tests oftests/agent_daemon.rs(real_binary_rootless_private_readiness_does_not_refuse_person_revocation,..._person_preparation_honors_explicit_state_without_runtime_environment:resource_unavailable;real_binary_keeps_background_backend_probe_off_the_control_path: socket timeout) while the VM was loaded. This diff changes no Rust (TS, CSS, one Markdown row). Run alone on this head:cargo test --workspace --locked --test agent_daemon→ 11 passed; on a detached worktree of unmodified2c58f76b5(same command): 11 passed. The full gate was then rerun on the final head and is green (below). So it is a load-sensitive flake, not this change; the first run's failure was not hidden.Gate:
scripts/verify faston infraternal-dev-02-std, head0a8a427ea, exit 0 (verbatim rows)Static sizes (report only, D243 amended; no Rust changed, deltas are dev's drift against the recorded baselines): x86_64 22475824 bytes (baseline 22418256, +57568); aarch64 20495736 bytes (baseline 20453280, +42456). Key memory on x86_64 is SKIP (host aarch64), as the brief says for foreign execution.
Budgets: JS transfer critical gzip 319475/327680, brotli 266868/273408; deferred gzip 59733/61440, brotli 52764/55296; all passed.
How to test: Settings → Shortcuts → click a row, press a new chord: a dot appears on its caps, the caps do not move. Right-click it (or Shift+F10, or Delete on the focused row): "Reset to ". "Reset all" appears at the bottom, and asks in its own row.