Skip to content

Sync lgse/strata#1898–#1908: Save stem selection, multi-word global search, preview fixes - #44

Merged
wmfeht merged 8 commits into
claude/friendly-cray-w1gznrfrom
claude/friendly-cray-qcvlz3
Oct 28, 2026
Merged

wmfeht merged 8 commits into
claude/friendly-cray-w1gznrfrom
claude/friendly-cray-qcvlz3

Conversation

@wmfeht

@wmfeht wmfeht commented Oct 27, 2026

Copy link
Copy Markdown
Owner

Closes #43

Stacked on #42

This PR is stacked on #42 (which stacks on #40 and #38). It targets #42's branch, claude/friendly-cray-w1gznr; my branch is claude/friendly-cray-qcvlz3. Merge #38, #40, then #42, and GitHub retargets this PR to main. The diff covers only the 6 PRs from #43.

Upstream range

be3343a5992a2a5497b1a2ee7faa525be18e988f (watermark after #42) → 923b39ddf4950227e0779ef5b6216af7f4773727: 6 commits, 6 PRs, no direct pushes. sources.yaml holds the new watermark, and every touched node and sweep is reviewed at 923b39d.

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

PR Type History row on
lgse/strata#1904: zstd crates past RustSec advisories fix(deps), ignored scope none
lgse/strata#1898: select the filename stem on Save fix(chooser) integration/portal-file-chooser
lgse/strata#1899: multi-word AND of terms in global search feat(search) browser/search/filter (drift)
lgse/strata#1906: round the confirmation file list fix(dialogs) app/dialogs (scope)
lgse/strata#1908: cap that radius at 6px fix(dialogs) app/dialogs (scope)
lgse/strata#1901: words, RTF emoji, raw H.264 fix(preview), batch preview/preview-panel; browser/properties/media

All merged on 2026-10-27 (UTC).

Per node

app

  • app/dialogs: rows for #1906 and #1908. No Behavior change, because this node's code does not build the list (see operations).
  • app/infrastructure: reviewed_at only. #1904 is in the deps ignore scope, matching earlier dependency PRs.

browser

  • browser/search: Behavior bullets for #1899, citing it without a row:
    • duck txt, subfolder txt, and quarterly txt examples.
    • Five match tiers that path length, depth, and bonuses cannot cross.
    • Multi-word typo tolerance only; one-word queries get none.
    • The fuzzy fallback is kept, so multi-word queries are not a strict filter.
    • The fallback keeps spaces, and terms match the root-relative path.
    • Summary updated. One Design bullet on fixed tiers and the deliberate fallback.
  • browser/search/filter: row for #1899. New bullet: a contiguous name hit ranks above non-contiguous matches at any depth (maintainer comment on #1899).
  • browser/properties/media: row for #1901 under the batch exception, since its own code changed. Two bullets:
    • An octet-stream file whose name classifies as media gets the MEDIA row.
    • alpha.h264 shows "320 × 180 pixels".
    • One Design bullet.
  • browser/view-modes/sorting: a .h264 file's Type reads "video/h264 type" instead of Other (#1901 maintainer comment). Name-only typing and Type-sort placement are marked unverified. No row.

integration

  • integration/portal-file-chooser: row for #1898. Four bullets:
    • 10xer off: only the stem is selected (report.draft of report.draft.pdf), and it survives the idle focus restore.
    • The last-dot rule, shared with rename.
    • 10xer on: Tab from the header selects the stem.
    • Two Design bullets.
    • tests += src/ui/chooser/tests/keyboard.rs.
  • integration/10xer-mode/file-chooser: reviewed_at only.

operations

  • operations/trash: new ### Confirmation file list. The list corners are square at roundness 0, 1.8px at 60, and 6px at 200 in the Shift+Delete, no-Trash, and Restore dialogs. "Move N items to Trash?" is listed separately as unverified. trash.rs attaches the class.
  • operations/filesystem-compatibility/leftovers: the same radii for the review list. leftovers.rs attaches the class.

preview

  • preview/preview-panel: one row for #1901. check rejects rows on both a parent and its child, so documents cites #1901 without a row. Changes:
    • .h264/.H264 previews as video by name.
    • notes.h264 stays text.
    • Other raw-stream names still depend on the MIME database.
    • Stepping keeps videos that have dimensions but no duration.
    • Print is hidden for .h264.
    • Two Design bullets.
    • Removed the bare .h264 "No visual preview" gap (#1861 closed).
  • preview/preview-panel/documents:
    • Line splitting rewritten: rows end after whitespace, space first. A window without whitespace ends at its limit. The last 4 KiB halves (#187). Words under 1,000 bytes stay whole. Copied text is unchanged.
    • RTF bullets: surrogate pairs render as emoji with the high unit's style. Unpaired or out-of-range units render as U+FFFD. An escaped newline inside {\*…} no longer ends the paragraph.
    • Two Design bullets.
    • Removed the mid-word split gap and the dropped-emoji gap.
  • preview/preview-panel/media:
    • The raw-stream bullet is limited to streams that reach the player.
    • New bullet: the player detects raw streams from the probed format, not the name (#1346).
    • Routing moved to the parent, which owns guess_content_type.
  • find, layout, media/video, model-views, quick-preview: reviewed_at only. They are touched through shared test globs only.

settings

  • settings/themes/icons: reviewed_at only. entry.rs changed only for printing support.

No new or promoted nodes. scopes.yaml is unchanged.

QA

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

  • Probes added:
    • browser: multi-word queries with three terms, a typo, CJK, Tab, and double space; root-only terms; Properties on the .h264/.h265/.hevc/.264 copies; Type sort with .h264 files. Setup gains raw H.264 and HEVC fixtures.
    • integration: Save stems for .bashrc, archive.tar.gz, noext, a., and résumé.pdf, with 10xer off and with 10xer Tab.
    • operations: list corners at roundness 0 and 200 across the delete, no-Trash, Move to Trash, Restore, and leftovers dialogs.
    • preview: raw-stream copies on hosts with and without a MIME type for them; Print and Quick preview menus; .h264 over sftp. Documents: tab, NBSP, and thin-space separators; an early space before a 5 KiB token; emoji at the cut; a 1–2 KiB word at the tail; RTF \tab/\cell between surrogate units; escaped newlines inside bold. Setup gains the copies and a real HEVC encode.
  • Probe reworded: preview "a word split across two rows" now uses a whitespace-free token over 2 KiB.
  • Probes retired: none.

Tier-1 plans (qa --pr N --tier 1). Every changed file landed on a primary node or a trigger; no plan had "Unmapped changes".

  • #1904: primary app/infrastructure.
  • #1898: primary integration/portal-file-chooser, integration/10xer-mode/file-chooser; sweep integration.
  • #1899: primary browser/search/filter, browser/search; sweep browser.
  • #1906, #1908: no primary node. The app sweep is forced by the src/style.css trigger.
  • #1901: primaries:
    • preview/preview-panel, preview/preview-panel/documents, find, layout, media/video, model-views
    • preview/quick-preview
    • browser/properties/media
    • settings/themes/icons
    • Sweeps: preview, browser, settings.

Needs a person

  • Row placement to confirm:
    • #1899's row follows drift to browser/search/filter, though most of its files and its behavior belong to browser/search. assign() keeps only leaf nodes, so any file under the child wins.
    • #1906 and #1908 map by scope to app/dialogs, whose code they do not touch.
  • Drift report gap: render_drift omitted #1906 and #1908 entirely. It lists PRs only under nodes their paths match, or under triage or ignored. A PR assigned by scope alone to a node it does not touch appears nowhere.
  • Batch exception vs check: AGENTS.md lets a batch PR take a row on each node whose code each fix changed. check still forbids a parent row plus a child row. So #1901 has one row on preview/preview-panel covering the documents fixes. Its other row, on browser/properties/media, is outside that subtree.
  • Ownership questions (pre-existing):
    • entry_supports_printing is in src/ui/browser/entry.rs, which is settings/themes/icons code. The Print bullets live on preview/preview-panel.
    • The permanent-delete and restore list bullets sit on operations/delete and operations/trash/restore, but trash.rs, which builds both dialogs, is operations/trash code.
    • src/ui/preview/tests/video.rs is in media/video tests but exercises entry_family, which is preview-panel code.
  • Uncovered upstream bugs. No lgse/strata issue covers these; I scanned all 995 issues, open and closed. None was filed:
    • The List Type column shows "video/h264 type" for .h264 instead of Other. Recorded as Behavior on browser/view-modes/sorting, from the #1901 maintainer comment ("harmless but unpolished").
    • Found by code reading: document_word_boundary uses char::is_whitespace on non-ASCII lines, so a rendered row can break after a no-break space (U+00A0, U+2007, U+202F), such as RTF \~. See src/services/document.rs:2045-2049.
    • Stale upstream doc: docs/document-previews.md:49,51 still describes "contiguous 2 KiB virtual rows". Rendered rows now end at whitespace.
  • Side effects of #1901 not recorded in nodes (code only; these files did not change). guess_content_type now returns video/h264 for any .h264 name, so:
    • src/ui/chooser.rs:312: a video/* chooser filter matches .h264 (integration/portal-file-chooser).
    • src/ui/actions.rs:119: video/* custom actions match .h264 (integration/custom-actions).
    • A remote .h264 on sftp, including text, no longer offers Quick preview, because it is certain media and not MOV/MP4 (src/ui/preview.rs:108-125, src/services/preview.rs:349-354).
  • #1898 out-of-scope paths: the arrow-key focus-recovery fallback and the refocus after an invalid name in accept_save_file still select the whole name. The reviewer judged both reasonable and filed no issue.
  • Untested sourced claim: the 10xer Tab-from-header stem selection (#1898) comes from the reviewer comment, with no test.
  • Every (unverified) claim added:
    • browser/properties/media: an octet-stream file whose name classifies as image, audio, or video gets the MEDIA row.
    • browser/search: typo tolerance in multi-word queries only (abc text → abc_tent.doc).
    • browser/search: the fuzzy fallback keeps spaces.
    • browser/search: terms match the root-relative path.
    • browser/search: #1899 is added to the existing unverified name-over-path bullet.
    • browser/view-modes/sorting: name-only typing for text or empty .h264 files.
    • browser/view-modes/sorting: Type-sort placement of .h264 files.
    • integration/portal-file-chooser: last-dot examples (archive.tar.gz, .bashrc, notes).
    • operations/trash: "Move N items to Trash?" list corners.
    • preview/preview-panel/documents: block types (heading, list item, quote, code) share the split.
    • preview/preview-panel/documents: space-before-other-whitespace priority.
    • preview/preview-panel/documents: last-4-KiB halving (#187).
    • preview/preview-panel/documents: words under 1,000 bytes are never split.
    • preview/preview-panel: .h265/.hevc/.264/extensionless streams need the MIME database.
    • preview/preview-panel: two stepping-skip bullets (audio without duration; video with neither duration nor dimensions).
    • preview/preview-panel: no Print for .h264, including notes.h264.
  • Proposed child nodes and triggers: none.

Review loop

Three rounds, one fresh reviewer per changed area, with a fresh verifier for each blocking finding.

  • Round 1: app+operations 0 blocking, integration 0 blocking, browser 2 blocking, preview 2 blocking.
    • Confirmed and fixed:
      • The typo bullet was false for one-word Ctrl+K queries.
      • The missed .h264 Type column change on browser/view-modes/sorting.
      • The .h265/.hevc routing bullet was on the media node, which does not own that code.
    • Refuted: the escaped-newline RTF bullet needing (unverified). The #1901 maintainer comment states it.
    • All agreed minors applied: wording, test paths, Summary length, and probes restating Behavior.
  • Round 2: browser 0 blocking (7 minors applied); preview 3 blocking, all confirmed and fixed:
    • "Each row ends after whitespace" was false for whitespace-free windows.
    • Whitespace-free tokens halve in the last 4 KiB.
    • The media bullet overstated playback "even without the extension"; it is now limited to the decoder, with routing on the parent.
  • Round 3 (preview only): 1 blocking, confirmed and fixed. A row ends after the last ASCII space before other whitespace. Minors applied: line scope, standalone bullets, 25-word limits, and a real HEVC fixture.
  • Unresolved or disputed: none blocking. One optional minor was not applied: a SaveFile name derived from current_file also gets stem selection (code only).

Generated by Claude Code

…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
@wmfeht
wmfeht merged commit 6094cff into claude/friendly-cray-w1gznr Oct 28, 2026
3 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