Skip to content

Sync lgse/strata#1872–#1896: accessible names, menus past the window, shared settings saves - #42

Merged
wmfeht merged 17 commits into
claude/friendly-cray-f9fxd3from
claude/friendly-cray-w1gznr
Oct 28, 2026
Merged

wmfeht merged 17 commits into
claude/friendly-cray-f9fxd3from
claude/friendly-cray-w1gznr

Conversation

@wmfeht

@wmfeht wmfeht commented Oct 26, 2026

Copy link
Copy Markdown
Owner

Closes #41

Stacked on #40

This PR is stacked on #40, which is itself stacked on #38. It targets #40's branch, claude/friendly-cray-f9fxd3, and my branch is claude/friendly-cray-w1gznr. Merge #38, then #40, and GitHub retargets this PR to main. The diff covers only the 16 PRs from #41.

Upstream range

d6c74746cdb27e506a08e8cdefa3bc8cef7d10f9 (watermark after #40) → be3343a5992a2a5497b1a2ee7faa525be18e988f. That is 17 commits: 16 PRs and one direct push, chore: release v1.1.1 (be3343a), which needs no map change. sources.yaml holds the new watermark.

GraphQL is blocked in this session, so drift and qa --pr ran on scratch data/prs.jsonl rows fetched over the REST API. Those rows are not committed.

PR Type History row on
lgse/strata#1887: reload themes written through a symlink fix(themes) settings/themes
lgse/strata#1888: single-click preview in filtered views fix, triage browser/search/filter
lgse/strata#1875: exFAT labels limited to 11 UTF-16 units fix(drives) devices/volumes/drive-dialogs
lgse/strata#1874: close a renamed folder's column when it becomes hidden fix(columns) browser/view-modes/columns
lgse/strata#1872: drive prefix refused only at the start fix(archives) operations/archives
lgse/strata#1873: URI secrets kept out of the log fix(logging), ignored scope app/infrastructure
lgse/strata#1876: 5 s deadline on ReloadConfig fix(installer) app/packaging/installer
lgse/strata#1878: activation outcome survives a Refresh fix(integrations) remote/file-providers/external
lgse/strata#1880: file symlinks sized without following fix(delete) operations/delete
lgse/strata#1892: matugen template doc docs(themes), triage settings/themes
lgse/strata#1891: no background halo on completion and peek popovers fix(theme) settings/themes
lgse/strata#1877: keep another process's settings when saving fix(settings), triage settings/preferences/storage
lgse/strata#1894: menus may extend past the window fix(context-menu) browser/context-menu
lgse/strata#1890: replaced rows and rename navigation fix(browser), triage, batch app/infrastructure (fix 1); operations/rename and browser/view-modes (fix 2)
lgse/strata#1895: name icon-only buttons fix(a11y) app/accessibility
lgse/strata#1896: name text fields and the thumbnail slider fix(a11y) app/accessibility

All merged on 2026-10-25 (UTC). Several PR bodies are stale because review commits changed the code before merge. The map follows the merged code:

  • #1874: the publish_rename early return was removed.
  • #1875: FAT32 is counted in bytes, exFAT and NTFS in UTF-16 units, and the field trims instead of disabling Continue.
  • #1876: systemctl and xdg-mime run under the deadline too.
  • #1877: repaired keys are merged, and the lock is best effort.
  • #1878: the 30 s cutoff was removed.

Per node

app

  • app/accessibility (rows #1895, #1896):
    • Two Design bullets on the shared helpers (set_tooltip_and_label, set_labelled_by).
    • Removed the #810 gap: the Ctrl+F filter field is now named.
    • New gap: GTK SpinButton inner buttons are unnamed (#1895).
    • The per-control name bullets live on the nodes whose code sets them (see "Accessible names" below).
  • app/infrastructure (rows #1890 fix 1, #1873):
    • Folder monitoring: an arrival and a removal of one name in one batch keep the row, so a no-Trash Replace stays listed. An exchange-then-delete still drops it.
    • #1873 added to the log redaction bullet.
    • Gap: Location::parent copies credentials (#1846, #1873).
  • app/packaging/installer (row #1876): timeout 5 on ReloadConfig and xdg-mime, timeout now required, and status 124 outcomes. Two Design bullets.
  • app/dialogs: form fields limited in bytes or UTF-16 units trim typed and pasted text, and the caption counts in that unit (#1875). Gap: the install command field is unnamed (#1896).
  • app/shortcut-reference: gap: the footer's selection size adds a file link's target size (#1853, #1880).

browser

  • browser/context-menu (row #1894):
    • Rewrote the Placement bullets that #1894 made false: window clamp, the below/above choice, anchor shifting, and the window-height cap.
    • Menus open at the click, extend past the window, and are capped at the monitor height less 16 px.
    • Design cites #1893 and #1894.
  • browser/search/filter (row #1888): a plain click on a filtered file now follows the click-count and single-click preview preferences. Enter and folder clicks still open. In the chooser and Trash, a click never opens a file. Design rewritten (#681, #697, #1881, #1888).
  • browser/view-modes/columns (row #1874): no Behavior here. #1874's code is directory-monitoring's, so its bullets live there.
  • browser/directory-monitoring (no row):
    • New ### Renaming to a hidden name: rename-to-dot with hidden files off acts as a removal. The cursor goes to the visible neighbor, deeper Columns close in place, and F2 works.
    • Design bullets for #1874.
    • Gaps:
      • Dot-files from other programs don't appear after Ctrl+H (#1862, #1874).
      • External removal of an open folder puts the cursor on the first row (#1874).
  • browser/view-modes (row #1890 fix 2): History only. It also takes the pane header names from #1895 and #1896.
  • browser/view-modes/folder-views: another process's default sort and size are adopted during an unrelated save (#1877).
  • Gaps from open Stale UI and cosmetic issues from QA sweep lgse/strata#1862:
    • browser/sidebar: stale or doubled location tint.
    • browser/navigation/location-bar: deep breadcrumbs shrink to "l…".
    • browser/view-modes/density: Compact and Airy buttons overlap.

operations

  • operations/archives (row #1872): a colon after the first component is a name, and a leading drive prefix is still refused, including through .. and ./. TAR hard links to such members work. One Design bullet; the docs link SHA was bumped.
  • operations/delete (row #1880):
    • The confirmation sizes a file symlink itself, and the total counts past 50 rows.
    • A link removed before it is measured shows "—" and an "At least" total.
    • The Move to Trash confirmation does the same.
    • The dangling-link bullet was narrowed.
    • tests gains delete-file-symlink-sizes-link.jsonl.
  • operations/rename (row #1890 fix 2): after a rename re-sorts List, Down moves to the next file and stays there.
  • operations/clipboard/conflicts: related gains app/infrastructure.

settings

  • settings/themes (rows #1887, #1891, #1892):
    • #1887: symlinked theme targets reload live, dangling links stay watched, and links are recomputed on each re-read. The re-read-trigger bullet was rewritten.
    • #1891: completion and folder peek popovers keep only the accent glow.
    • #1892: the matugen doc, added to the #1619 Design bullet.
    • Gap: an intermediate link in a chain isn't watched (#1887, from the maintainer's review comment).
  • settings/preferences/storage (row #1877):
    • New ### Saves from several processes: changed and repaired keys are merged over the file on disk, and unknown keys are kept.
    • Five maps merge per entry, while records like ListColumns stay whole. The later save wins.
    • Invalid TOML is left unchanged and the save fails.
    • The 500 ms folder lock falls back to an unlocked save.
    • Design: #1845 context; the #1729 stamp bullet was fixed.
  • settings/themes/omarchy: the legacy omarchy_variant key is removed only once an Omarchy theme is detected (#1816, #1877).
  • settings/preferences: auto_refresh_interval cites #1877.

devices, remote, integration, preview

  • devices/volumes/drive-dialogs (row #1875):
    • Limits are 11 bytes on FAT32, 11 UTF-16 units on exFAT, and 32 on NTFS. Typed and pasted text is trimmed, and switching filesystem re-trims it.
    • The false "11 chars FAT32, 32 NTFS and exFAT" bullet was replaced.
    • Gap: exFAT forbidden characters (#1875).
  • remote/file-providers/external (row #1878):
    • A provider that owes an activation answer retires instead of being dropped on Refresh.
    • Its reply, disconnect and unsent dialogs still appear.
    • The Registration, "one child process" and timer bullets were rewritten.
  • integration/portal-file-chooser/setup: on a silent bus, setup and restore finish after 5 s deadlines (#1876). Gap: a failed reload still reports success in Settings (#1876, maintainer review).
  • preview/preview-panel: gap: the media seek and volume sliders are unnamed (#1896).
  • reviewed_at only: the preview nodes drift listed (route QA timing in #1890), integration/open-with, and others listed by drift.

Accessible names (#1895, #1896, no rows)

Each name bullet sits on the node whose code sets it:

  • browser/view-modes: header buttons, Columns, filter fields, and the Thumbnail size slider.
  • browser/navigation/location-bar: Copy path and the sign-in fields.
  • browser/folder-customization: Default (Theme color) and Back to palette.
  • browser/search.
  • browser/sidebar/connect-to-server: Server address.
  • app/dialogs: the install copy button.
  • app/shortcut-reference: F1 search and the 10xer prompt.
  • preview/preview-panel: Play/Pause and Mute.
  • operations/archives/preview: Go up one level.
  • operations/archives: the Compress fields.
  • integration/portal-file-chooser: Cancel and Name.
  • integration/open-with.
  • settings/preferences: the shared "Clear search".
  • settings/themes: the editor.
  • devices/volumes/drive-dialogs: the label fields.
  • devices/volumes/release: Eject/Unmount.
  • devices/volumes/encrypted: Unlock/Lock. Its src/ui/window.rs has no owning node.

QA

Tier-1 plans: no PR has unmapped changes.

PR Primary nodes Forced sweeps
#1887 settings/themes + 4 children —
#1888 search/filter, view-modes, view-modes/columns, portal-file-chooser —
#1875 devices/volumes/drive-dialogs, app/dialogs —
#1874 app/dialogs, app/window, browser/directory-monitoring browser (src/app/browser.rs, src/app/navigation.rs)
#1872 operations/archives —
#1873 app/infrastructure, startup-arguments, browser/tabs, integration/open-with —
#1876 app/packaging/installer, portal-file-chooser/setup —
#1878 remote/file-providers/external —
#1880 operations/create, operations/trash, settings/themes/icons —
#1892 none (docs only) —
#1891 none app (src/style.css)
#1877 settings/preferences, storage; 5 browser preference nodes settings (src/ui/preferences.rs)
#1894 browser/context-menu, app/infrastructure (baseline PNG) —
#1890 app/infrastructure, keyboard-navigation, view-modes, clipboard/conflicts, rename, 6 preview nodes —
#1895 app/accessibility + 8 nodes app (src/ui/window.rs)
#1896 app/accessibility + 10 nodes —

All 8 sweeps moved reviewed_at to be3343a5.

  • Probes added:
    • Menus near window and screen edges, across GNOME, KDE, Hyprland and X11.
    • Filtered clicks during a result batch and with Ctrl+click.
    • Hidden-name renames with Ctrl+H toggled.
    • Archive colon members on vfat and exFAT.
    • Delete with link chains and more than 50 links.
    • Rename followed by arrow keys in Icons and Columns.
    • No-Trash Replace on tmpfs.
    • Theme link chains, dangling links and /dev/shm.
    • Browser plus chooser saving map keys.
    • A held flock with XDG_CONFIG_HOME on sshfs.
    • Drive labels with emoji, CJK and paste.
    • Refresh during an activation, and provider crashes.
    • A silent-bus installer and portal setup.
    • Accessible-name tree dumps per owning node.
  • Probes retired or narrowed:
    • The settings symlink-reload probe, which restated a Behavior bullet.
    • The remote pending-activation Refresh probe, narrowed to the open-menu case.
    • Probes that duplicated new tests or Behavior bullets.
  • Setup: settings now launches the portal chooser through scripts/chooser-dev.sh. Integration has a silent-bus socat fixture, and browser has more compositors.

Needs a person

  • Triage mappings:
    • #1877 goes on settings/preferences/storage, as #1869 did in Sync lgse/strata#1831–#1871: tabs from drags, G-code and route previews, privacy fixes #40. Most of its code is in src/ui/preferences.rs, a settings sweep trigger, and storage owns writer.rs and the test module.
    • #1888 goes on browser/search/filter. It is the node whose #697 bullet the fix rewrote, and its scope (filter) maps there.
    • #1890 is a batch of two fixes:
      • Fix 1 is merge_pending_change in local_files.rs, so the row goes on app/infrastructure.
      • Fix 2 changed inline_edit.rs and browser_modes.rs, so rows go on both operations/rename and browser/view-modes.
    • #1892 (docs only) goes on settings/themes, which owns docs/themes.md. It fails the Nest rule as a new node.
    • #1873's scope logging is ignored. drift lists it as "Ignored" but "in triage" on its nodes. The row went on the fallback app/infrastructure, following the Update feature map: lgse/strata#1644, #1761 #27 fix(logging) precedent there. Drop it if ignored scopes should get no row.
  • Tooling gaps:
    • drift drops PRs mapped by scope alone with no path match. #1891 (src/style.css only, scope theme) appeared in no section of the report.
    • The browser/view-modes/columns section omitted #1874's "History row here".
  • Proposed scopes.yaml: themes: settings/themes. #1887 and #1892 use the plural. Not added, because no new node owns it.
  • Ownership questions:
    • operations/delete owns none of #1880's files. The dialog is in trash.rs (operations/trash) and the size sum in entry.rs (settings/themes/icons). The confirmation Behavior stays on delete, as with #1134 and #1627.
    • Thumbnail-slider bullets on browser/view-modes/icons may belong to browser/view-modes, which builds the slider in browser_modes.rs.
    • The app/shortcut-reference Summary says 10xer prompts belong to integration/10xer-mode. Their names are set in shortcut_footer.rs.
  • Bugs and limitations with no lgse/strata issue: issues were searched, open and closed; the REST search endpoint is blocked, so this used issue listings. Nothing was filed.
    • The footer selection size counts a file link's target (shortcut_footer.rs). It is stated in a #1853 comment and the #1880 review, and recorded as a gap.
    • Symlinks inside a real folder count as 0 B in the directory summary (directory_summary.rs). Stated in a #1853 comment; not recorded.
    • Settings ignores a failed portal reload, so the "log out and back in" hint never shows. It comes from the #1876 review and is recorded as a gap.
    • An external removal of an open folder puts the cursor on the first row. It comes from the #1874 review and is recorded as a gap.
    • A theme link chain's intermediate link isn't watched. It comes from the #1887 review and is recorded as a gap.
    • Adapters that cannot run twice may contend after a Refresh until the old process exits. It comes from the #1878 review; not recorded.
    • When the settings lock times out, the unlocked save reopens the #1845 lost-update window. The review accepted this on purpose; not recorded.
    • .settings-search-popover and .jobs-popover keep the @strata_bg shadow that #1891 removed. Found by code reading; not recorded.
    • exFAT labels still reject *?:/\|<>", which mkfs.exfat accepts. Stated in the #1875 body and recorded as a gap.
    • mount_lanes lane keys hold full user info, though nothing logs them (#1873 body). Not recorded.
    • Five #1862 items fit other nodes: Omarchy colors.toml reload, raw GVfs errors, Updates ignoring the startup check, the g+pin flash, and the context-menu Gtk-CRITICAL from #1860. Not recorded.
  • Upstream docs that contradict the code, listed only:
    • docs/file-providers.md lines 72–74 still say each change and Refresh stop the running providers, but #1878 retires them.
    • docs/performance-baseline.md:24 says default logs carry no browsed locations. The INFO-level "target location unavailable" warning logs the location. This predates #1873.
  • Site, for the next docs run: site/src/reference/file-providers.md may still say Refresh stops every provider. check warns that the site describes v1.0.0, while v1.1.0 and v1.1.1 are out.
  • (unverified) claims added (37):
    • context-menu: the 16 px monitor cap, and the keyboard background menu.
    • directory-monitoring: the List/Icons hidden-rename cursor, the parent Columns scroll position, and the dot-file gap's restart claim was dropped after sourcing.
    • filter: no-preview files only select, and the previews-off click only selects.
    • folder-views: any unsaved key blocks all three.
    • delete: the "—" row, the Trash confirmation, 51 links, a removed link, and the dangling link.
    • storage: a deleted file writes the whole snapshot, theme and mode repairs, and the separate lock folders.
    • themes: the dangling link with a missing folder, the re-read trigger list, the candidates popover shadow, and the theme editor names.
    • omarchy: both migration bullets.
    • setup: the --install-portal and --uninstall-portal warning, and no reload warning in Settings.
    • Accessible names not reached by the PR author's test window:
      • install copy button
      • 10xer prompt
      • List filter
      • sign-in fields
      • Open With search
      • chooser Cancel and Name
      • drive label fields
      • Eject and Lock
      • Go up one level
      • media buttons
      • Clear search

Review loop

Three rounds, with fresh reviewers each round. Every blocking finding got an independent verifier or a direct code check.

  • Round 1 (5 reviewers):
    • Confirmed and fixed (8):
      • The settings lock was wrongly described as shared with folder-views.toml: different directories.
      • omarchy_variant was said to be removed on any save. It is removed only after migration.
      • The accessible-name bullets were on app/accessibility. They moved to their owning nodes.
      • #1873 had no History row.
      • Three #1862 gaps were missing.
    • Refuted (2): the theme link-chain gap and the missing-folder bullet are stated in l0gicgate's #1887 review.
    • Minors fixed (about 30): (unverified) marks, sentence length, probe duplicates, and stale wording.
  • Round 2 (3 reviewers), confirmed and fixed (3):
    • A rename-navigation bullet sat on both operations/rename and browser/view-modes.
    • A #1888 chooser bullet duplicated search/filter.
    • "until a restart" ignored the editor-save re-arm (theme.rs:456-458).
    • Plus minors: the setup gap, the archive : destination condition, and splits.
  • Round 3 (2 reviewers), confirmed and fixed (1): #1874's Behavior moved from view-modes/columns to browser/directory-monitoring, whose directory_changes.rs implements it. The row stays on columns, as drift said.
    • Plus minors: the vfat Trash probe, settings probes and Setup, theme and mode repairs, and partial error text.
  • Disputed, left as is:
    • The context-menu flip, shrink and slide bullets carry no (unverified). Round 1 cited the #1894 maintainer review as stating them. Round 3 read them as #1893's proposal, with the code leaving them to GTK and the compositor.
    • The doubled #1890 fix-2 rows on operations/rename and browser/view-modes follow the batch rule literally. One round-2 reviewer preferred one row.

scripts/featuremap.py check reports 0 errors. Its 25 warnings are all site and release staleness. The unit tests pass (39).


Generated by Claude Code

…d settings saves

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015rmfTXdVg1CEGCkG21C8Au
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015rmfTXdVg1CEGCkG21C8Au
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015rmfTXdVg1CEGCkG21C8Au
…robe and wording fixes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015rmfTXdVg1CEGCkG21C8Au
…earch, preview fixes

Syncs lgse/strata#1904, #1898, #1899, #1906, #1908, and #1901
(be3343a..923b39d) and advances the watermark.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23A9aNN8aT7Tpt3zouac
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23A9aNN8aT7Tpt3zouac
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23A9aNN8aT7Tpt3zouac
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23A9aNN8aT7Tpt3zouac
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23A9aNN8aT7Tpt3zouac
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23A9aNN8aT7Tpt3zouac
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23A9aNN8aT7Tpt3zouac
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RQ23A9aNN8aT7Tpt3zouac
Sync lgse/strata#1898–#1908: Save stem selection, multi-word global search, preview fixes
@wmfeht
wmfeht merged commit 5bfa586 into claude/friendly-cray-f9fxd3 Oct 28, 2026
2 checks passed
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