Skip to content

Sync lgse/strata#1912, #1885: remappable per-map keys, uncomposited popovers, typed-path preview - #47

Open
wmfeht wants to merge 18 commits into
resync/full-auditfrom
claude/friendly-cray-rvlc98
Open

wmfeht wants to merge 18 commits into
resync/full-auditfrom
claude/friendly-cray-rvlc98

Conversation

@wmfeht

@wmfeht wmfeht commented Oct 28, 2026

Copy link
Copy Markdown
Owner

Stacked on #45

Closes #46

Read this first

Upstream range

86df474dc0e8352e0e2098637a017cc4c77a8c44 (#45's watermark) → 73b3258ff9da7fd5f8b279e442e4fbf576850deb: 2 commits, 2 PRs, no direct pushes. Every touched node and sweep is reviewed at 73b3258.

PR Type Merged (UTC) History row on
lgse/strata#1912: square uncomposited popovers and preview path-bar files fix(ui), batch of 2 fixes 2026-10-28 settings/themes (fix 1); browser/navigation/location-bar (fix 2)
lgse/strata#1885: make keyboard shortcuts remappable per map feat(keys) 2026-10-28 new node app/keyboard-shortcuts/remapping
  • drift put both PRs in triage because each touches several features.
    • #1912's body and its closing issue #1911 list two separate fixes. Under the batch rule it gets one row per fix, on the node owning most of each fix's lines.
    • #1885 passes the Nest rule, so its new node takes the row.

Per node

New and promoted

  • Promoted app/keyboard-shortcuts.md → app/keyboard-shortcuts/index.md. The id is unchanged.
  • New app/keyboard-shortcuts/remapping, origin {issue: lgse/strata#1884, pr: lgse/strata#1885}, shipped, draft.
    • code: src/ui/keys/{command,alias,capture,conflicts}.rs, src/ui/preferences/keymap.rs, src/ui/window/keyboard/direct.rs, src/ui/settings/keyboard.rs.
    • tests: their unit modules, keyboard_dispatch/{keymap_overrides,keymap_conflicts,structural_aliases,direct_commands}.rs, and tests/qa/scenarios/keymap.
    • docs: docs/keymap.md.
    • Behavior:
      • settings.toml [keymap.default]/[keymap.tenxer] overrides
      • live label, hint, and F1 updates
      • structural aliases, with physical Escape always cancelling
      • the conflict checker's errors and warnings
      • the Settings → Keyboard page
      • direct commands and Custom action 1–10 slots
    • Known gaps: default-table keys also fire in 10xer; on AZERTY, Ctrl+& records as <Control>ampersand. Both cite #1885.
    • Added to site/unguided.yaml.

app

  • app/keyboard-shortcuts: AltGr or a layout switch no longer cancels an armed chord. Labels leave out keys that never fire, with the type-to-search Rename example.
  • app/shortcut-reference:
    • F1 lists rebound keys and a default-map Custom actions section.
    • Close tab has a keyless tooltip.
    • The search palette footer drops its navigate hint when Up and Down are unbound.
    • Gap: the F1 note has no keyless form for an unbound command.
  • app/window/key-dispatch:
    • A rebound document zoom reset follows its own keys.
    • Stage order changed: direct commands, then the Tab stage, then inline editing.
    • Results-gate bullets: y copies no path while filter results show (#800, #1885).
  • accessibility, dialogs, window, infrastructure: reviewed_at only.

browser

  • browser/navigation/location-bar: #1912 row.
    • A typed file path selects the file and opens Quick Preview.
    • Navigating away drops the pending preview.
    • The portal chooser does the same (unverified).
    • Design notes.
    • Gap: a file with no previewer still opens the drawer, citing the maintainer's comment on #1912.
    • tests += tests/qa/scenarios/keyboard_navigation/list-typed-file-path.jsonl, moved from keyboard-navigation, which now lists its 12 other scenario files explicitly.
  • browser/navigation: Back, Forward, Parent, and Home bound to a Ctrl or Super key now fire with the file list focused. Covers which table each reads in 10xer, and the Shift-ignoring match (unverified).
  • browser/navigation/location-bar/completion: focus_next/focus_previous keys complete like Tab. Page Down/Up stay physical keys (unverified).
  • browser/context-menu: menu hints and accelerators follow default-table rebinds.
  • browser/view-modes/thumbnail-size: the Ctrl+Alt step keys come from [keymap.default] in both modes. This bullet moved from remapping.
  • browser/search/filter and browser/sidebar/pins: pre-existing bugs from #1885's body, as (unverified) Behavior (see Bugs).
  • Other drift-listed browser nodes: reviewed_at only.

integration

  • integration/custom-actions:
    • Slot N is the Nth listed action, and the run conditions.
    • Design: slot order follows Settings order.
    • Gap: adding or removing an action shifts later slots (#1885).
  • integration/10xer-mode/file-verbs:
    • Slot feedback: No action N, No matching actions.
    • Default-map direct verbs act on the selection only, with their Nothing to … flashes. The Columns fallback is unverified.
    • Shift reverses a rebound sort step.
  • integration/10xer-mode/preview-keys:
    • A rebound first_item/last_item works in document and archive previews.
    • Hidden-files pass-through: it toggles only when both tables hold the key (unverified; see Bugs).
    • A letter added to a listing command leaves a text preview.
    • Jump-to-folder and arrow-scope keys pass through.
  • integration/10xer-mode/places: gap: with g unbound, the pin flash ends in "as" with no key.
  • integration/portal-file-chooser: Back, Forward, Parent, and Home bound to a Ctrl key work in the chooser. In 10xer mode, the chooser reads them per command from the two tables (unverified).
  • Others: reviewed_at only.

operations

  • operations/trash:
    • The confirmation keys are now the left, right, activate, and confirm_trash entries (#1885).
    • Pre-existing bug: Columns Delete after Ctrl+click deselects the only selected row (unverified).
  • operations/clipboard: reviewed_at only. The y bug moved to key-dispatch, whose code blocks it.

preview

  • Ownership fix: the timeline key bullets moved from preview/preview-panel/media to preview/quick-preview, which owns src/ui/preview/keyboard.rs. Citations are unchanged.
    • New bullets: Home, End, and the page keys stay fixed seeks; media_seek_end; media_volume_step_up holds + and =.
    • Summary updated.
    • media's leftover slider bullets are renamed ### Slider keys.
  • preview/preview-panel/documents: Home and End keep moving the caret after first_item/last_item rebinds (docs/keymap.md).
  • preview/preview-panel/find: the tooltip follows a find_in_preview rebind (unverified).
  • Others: reviewed_at only.

settings

  • settings/themes: #1912 row.
    • New ### Uncomposited displays group: without a compositor, popovers, menus, and tooltips are square with no shadow.
    • It switches live when a compositor starts or stops.
    • A user popover rule wins.
    • The folder peek card is excluded.
    • Design: why, the provider, and its priority.
  • settings/themes/corner-roundness: caveat that uncomposited popups stay square at every value (#1912).
  • settings/preferences:
    • The nav adds Keyboard and its padding.
    • The stale "no Keybindings page" bullet is removed.
    • Search bullets: Rename/F2 opens the Default table, a custom action name finds its slot, the alias set, and the switch behavior.
    • The Ctrl+R broad match (unverified).
  • icons, preferences/storage: reviewed_at only.

scopes.yaml is unchanged.

QA

Sweeps touched: app, browser, integration, operations, preview, settings (reviewed_at set on all six).

  • Probes added:
    • app: an AltGr/layout-switch probe, and about 19 remapping probes:
      • bad hand-edited entries
      • keys shared within and across maps
      • rebinding with a chord armed
      • AZERTY/de/ch/ru captures and IME composition
      • Escape removed from escape
      • slot reordering and Reset all
      • unbound triggers
    • app, also: key-dispatch zoom reset and shortcut-reference probes. Setup gains keymap fixtures.
    • browser:
      • typed-path preview: file, folder, symlink, open parent, dismissed preview, no previewer, empty and 2 GB files, stalled sshfs mount, rapid Back and Forward, chooser
      • Ctrl/Super navigation rebinds in both tables
      • completion with a rebound page_down
      • context-menu live rebind
      • Columns filter and pin combinations
    • integration:
      • slot order after add, remove, and reorder; a broken manifest; a program off PATH; partial matches; second Columns column and Icons
      • chooser rebinds in both tables
      • preview-key rebinds
      • sort steps rebound to a digit, a Ctrl key, and fr
      • Setup: quoted dotted ids
    • preview:
      • document caret keys with first_item/last_item on F7/F8
      • a timeline rebind probe with last_item, media_seek_end, media_volume_step_up, and page_down
      • hand-offs to app and browser
    • settings:
      • uncomposited X11 Setup
      • popups uncomposited
      • compositor start and stop
      • a user popover rule
      • roundness 0–200 uncomposited
      • Keyboard search queries and nav alignment
  • Probes moved: three timeline probes moved from ### preview/preview-panel/media to ### preview/quick-preview. list-typed-file-path coverage now sits under location-bar.
  • Probes retired: none.
  • Tier-1 plans (qa --pr N --tier 1). No plan had "Unmapped changes".
    • #1912: primary app/infrastructure, browser/navigation/location-bar, settings/themes. Sweeps: app, browser, settings.
    • #1885: 42 primary nodes across all six areas, including app/keyboard-shortcuts/remapping. Sweeps: app, browser, integration, operations, preview, settings.

Needs a person

  • Tooling: the REST pagination bug in Full resync at lgse/strata 86df474: codified standards, tooling fixes, every node re-verified #45's fallback (see "Read this first").
  • Triage PRs: both are mapped as described above. No PR is left unmapped. There are no direct pushes.
  • Unmapped files: none. The 23 new #1885 files go to the new node.
    • Catalogs (src/ui/keys/bindings/**), settings.rs, clippy.toml, icons, and README stay on app/infrastructure.
    • Locales stay a settings trigger.
    • src/app/browser.rs stays a browser trigger.
  • Ownership questions (pre-existing):
    • src/ui/window/keyboard/items.rs carries Copy path, pin, and the navigation jumps. It is an app sweep trigger with no node, so its bullets sit on the features they serve.
    • The ### Slider keys bullets on preview/preview-panel/media are implemented in src/ui/preview.rs (preview/preview-panel code). They were left in place.
  • Proposed scopes.yaml: keys: app/keyboard-shortcuts/remapping. Its only PR landed there. Not added, because one PR is thin evidence.
  • Proposed children / triggers: none.
  • (unverified) claims added: 48. List them with git diff origin/resync/full-audit...HEAD | grep '^+' | grep '(unverified)'.

Bugs and upstream doc contradictions

None was filed upstream. Issue search (search/issues) is blocked in this session. For the four pre-existing #1885 bugs, research listed all 1007 lgse/strata issues, open and closed, over REST and searched titles and bodies; none covers them. The code-reading bugs below were not searched.

  • Pre-existing bugs stated in #1885's body, recorded as (unverified) Behavior on their code owners:
    • Columns: Delete trashes a row the user deselected (operations/trash).
    • Columns with a pane filter: names list in reverse sort order, and choosing a sort drops a multi-selection (browser/search/filter).
    • Columns: p after clicking a folder pins nothing (browser/sidebar/pins).
    • Default map: y copies no path while filter results show (app/window/key-dispatch).
  • Found by code reading:
    • Shift+Delete has the same Columns fallback as Delete: confirm_delete(permanent) serves both keys (src/ui/window/keyboard/items.rs:87-104). It opens the permanent-delete confirmation for the deselected row. Not recorded in a node.
    • Settings search for a key with a modifier is broad: "Ctrl+R" lists every row with a Ctrl key and a word starting with "r" (src/ui/settings/search.rs:419-522). Recorded (unverified) on settings/preferences.
    • A hidden-files key held only under [keymap.tenxer], such as Alt+H, is let out of a focused preview but toggles nothing.
      • Comment 6434407976 implies it should toggle.
      • Code: preview.rs:343, files.rs:87-89, commands.rs:273.
      • Recorded (unverified) on preview-keys.
    • With find_in_preview unbound, the find button's tooltip reads "Find in preview ()" (src/ui/preview/find.rs:326-329 uses raw t!; no keyless entry in shortcut_reference.rs). Not recorded in a node.
    • The notify::composited handler from #1912 is never disconnected. The maintainer called this harmless. Not recorded.
  • Upstream docs that contradict the code at 73b3258:
    • docs/preferences.md:105: says corner roundness applies live across menus. Without a compositor, #1912 squares popups. wmfeht flagged this on #1912.
    • docs/keymap.md:108-110: puts the Search keybinds field above the Default/10xer switch. The code puts the switch first (src/ui/settings/keyboard.rs:44-80).
    • docs/keymap.md:40-41: says the chooser's own keys use the default table in both modes. The chooser reads parent_folder and home_folder from the 10xer table in 10xer mode (src/ui/chooser.rs:2842-2847, 3074-3083).
    • docs/keyboard-shortcuts.md:376: gives Ctrl+A as an alias key that saves with a note. Ctrl+A on an arrow command is refused as a duplicate of Select all (src/ui/keys/conflicts.rs:720-809).

Site pages made stale (for the next release docs run; not edited)

  • guide/keyboard.md and reference/keyboard-navigation.md: remappable keys and the Settings → Keyboard page.
  • reference/10xer-mode.md and guide/10xer.md: rebindable 10xer tables and direct commands.
  • guide/settings.md: the Keyboard page and search.
  • guide/themes.md and reference/themes.md: uncomposited popups.
  • reference/custom-actions.md and guide/actions.md: Custom action slots.
  • guide/previews.md: typed-path Quick Preview and the timeline keys.
  • reference/portal-file-chooser.md: rebinds in the chooser.

Review loop

Three rounds, with one fresh adversarial reviewer per area each round (operations was paired with settings in round 3). A fresh verifier checked each blocking finding before any fix.

  • Round 1: 5 blocking findings.
    • Confirmed and fixed:
      • labels leaving out never-firing keys
      • the y bug on the wrong node (moved to key-dispatch)
      • Settings key search with a modifier
    • Refuted: two browser findings asked to move the pre-existing bugs to Known gaps. AGENTS.md's bug rule mandates (unverified) Behavior.
    • About 50 minor fixes applied.
  • Round 2: 4 blocking findings, all confirmed and fixed:
    • the file-verbs unselected-row flashes
    • the rebound sort-step exception
    • the remapping Ctrl+A example
    • the media-key refusal scope
    • Minor fixes, including the timeline-key ownership move.
  • Round 3: 10 blocking findings, triaged by evidence.
    • Fixed:
      • the thumbnail-size bullet placement
      • preview-keys hidden files
      • file-verbs map and condition
      • the pins sentence length
      • the Settings Rename/F2 table
      • two over-25-word sentences
      • the quick-preview Summary length
    • Refuted:
      • the app "missing slot-shift gap": it is on integration/custom-actions, whose listed order decides slots
      • preview "caret and seek bullets need (unverified)": docs/keymap.md:24-25 states them
      • integration "preview-keys first_item bullets need (unverified)": comment 6434407976 states them
  • Unresolved round-3 minors, left for a person:
    • settings/preferences: a Keyboard section heading with no matching row is hidden during search (search.rs:630-645).
    • settings/themes: Appearance text-size keycaps follow rebinds (src/ui/settings/theme.rs:424-466).
    • operations/trash:84: still names Escape, now the remappable escape entry. No probe covers rebound trash-dialog keys.
    • integration/portal-file-chooser:
      • no bullet that settings.toml overrides apply in the chooser (test chooser/tests/keyboard.rs:990-1031)
      • the 10xer chooser stage that matches Back and Forward first
    • file-verbs Summary does not mention default-map direct verbs.
    • The app sweep Scope's first sentence is over 25 words. This predates the sync.
    • One preview probe still mixes timeline and slider keys.

Generated by Claude Code

claude added 18 commits October 28, 2026 17:32
…rs, typed-path preview

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23ACnumbXzpecuKnNsx6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23ACnumbXzpecuKnNsx6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23ACnumbXzpecuKnNsx6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23ACnumbXzpecuKnNsx6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23ACnumbXzpecuKnNsx6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23ACnumbXzpecuKnNsx6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23ACnumbXzpecuKnNsx6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23ACnumbXzpecuKnNsx6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23ACnumbXzpecuKnNsx6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23ACnumbXzpecuKnNsx6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23ACnumbXzpecuKnNsx6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23ACnumbXzpecuKnNsx6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23ACnumbXzpecuKnNsx6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23ACnumbXzpecuKnNsx6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23ACnumbXzpecuKnNsx6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23ACnumbXzpecuKnNsx6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23ACnumbXzpecuKnNsx6

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants