Skip to content

Sync lgse/strata#1831–#1871: tabs from drags, G-code and route previews, privacy fixes - #40

Merged
wmfeht merged 20 commits into
claude/friendly-cray-scx3zbfrom
claude/friendly-cray-f9fxd3
Oct 28, 2026
Merged

wmfeht merged 20 commits into
claude/friendly-cray-scx3zbfrom
claude/friendly-cray-f9fxd3

Conversation

@wmfeht

@wmfeht wmfeht commented Oct 25, 2026

Copy link
Copy Markdown
Owner

Closes #39

Stacked on #38

This PR is stacked on #38 (the sync for lgse/strata#1830, #1834, #1838, tracked in #37) and targets that PR's branch. My branch is claude/friendly-cray-f9fxd3. The routine's assigned branch let me extend #38 only by stacking on it, not by pushing to it. Merge #38 first; GitHub then retargets this PR to main. The diff below covers only the 9 PRs from #39.

Upstream range

2218357c2e91c0c3e6cd02638356f7a91c08bcae (watermark after #38) → d6c74746cdb27e506a08e8cdefa3bc8cef7d10f9. That is 9 commits and 9 PRs, with no direct pushes. sources.yaml holds the new watermark.

GitHub GraphQL and gh are not available in this session. So drift ran on scratch data/prs.jsonl rows built from the upstream git log: title, squash SHA, files. Those rows are not committed. Their dates are committer-local, so History dates use GitHub mergedAt in UTC instead.

PR Type Merged History row on
lgse/strata#1831 open sidebar locations in new tabs feat(tabs) 2026-10-24 browser/tabs
lgse/strata#1840 explain password-protected PDF failures fix(preview) 2026-10-24 preview/preview-panel
lgse/strata#1864 embedded G-code thumbnails feat(preview) 2026-10-25 preview/preview-panel
lgse/strata#1842 offline GPX/FIT/KML route playback, saved units feat(preview) 2026-10-25 preview/preview-panel
lgse/strata#1866 private downloads, orphaned preview-folder sweep fix(security), triage, batch 2026-10-25 integration/portal-file-chooser/url-download, …/image-conversion, preview/preview-panel/sandbox
lgse/strata#1870 TAR hard link copied where the destination can't hold one fix(archives) 2026-10-25 operations/archives
lgse/strata#1869 keep valid entries of a list/map with one bad value fix(settings), triage 2026-10-25 settings/preferences/storage
lgse/strata#1865 cancel file drags on Escape fix(drag) 2026-10-25 operations/drag-and-drop
lgse/strata#1871 Shift+arrow from the Ctrl+clicked item fix(selection) 2026-10-25 browser/selection

Per node

New nodes (preview)

  • preview/preview-panel/gcode, "G-code thumbnails".
    • Origin {issue: lgse/strata#1863, pr: lgse/strata#1864}.
    • code: [src/sandbox_helper/model/gcode.rs], tests: [src/sandbox_helper/model/gcode/tests.rs].
    • Behavior: comment and binary-block thumbnails, PNG/JPEG/QOI, the largest decodable image, header limits.
  • preview/preview-panel/routes, "Route previews".
    • Origin {issue: lgse/strata#1841, pr: lgse/strata#1842}.
    • Code: src/services/route_preview.rs, src/sandbox_helper/route*, src/ui/preview/route*.
    • Behavior: showing a route, playback, units, errors.
    • Five Known gaps from the maintainer's merge comment.
  • Their History tables are empty. Drift names preview/preview-panel for both PRs, so the rows stay there, as with the ODT child in Sync lgse/strata#1830, #1834, #1838: ODT previews, run directory fallback, icon tile #38.
  • Both are listed in site/unguided.yaml as "New since v1.0.0…".

browser

  • browser/tabs (row #1831):
    • New ### Opening from drags: a sidebar row or folder-only drag shows an insertion line, and releasing opens a new tab at that gap. Also a single-tab strip, folder drops on tab headers, and a sidebar drop leaving the order unchanged.
    • New ### Drag cancellation (#630, #1843, #1831, #1865). Moved here from operations/drag-and-drop, because tabs.rs and tabs/strip.rs implement it.
    • Design: #1823 declined, a single drop target, the all-folders flag (#1692) used by #1831, and GdkDrag::cancel vs drag_cancel().
    • Gains docs/keyboard-navigation.md and the escape-cancels-file-drag.jsonl test.
  • browser/sidebar: middle-click and Open in New Tab on place, pin and mounted device rows, none in the chooser. Recent gets a menu (#1831).
  • browser/selection (row #1871): Ctrl+click then Shift+arrow in List/Icons. Two Design bullets.
  • Known gaps citing #1871's "Not changed" list:
    • browser/selection/marquee: marquee leaves a stale range origin.
    • browser/search/filter: filter selection does the same.
    • browser/view-modes: so do position-based updates.
  • browser/thumbnails: G-code icons show the embedded thumbnail, whatever STL model thumbnails is set to (#1864). Gains docs/preview-sandbox.md.
  • browser/thumbnails/workers: G-code joins the admission bullet and is exempt from the 512 MiB limit (#1864).
  • reviewed_at only: sidebar/pins, view-modes/columns, view-modes/list, folder-customization, view-modes/density, list/column-layout.

operations

  • operations/archives (row #1870): 4 Behavior bullets. A hard link becomes a copy on vfat, exFAT, exfat-fuse and SMB without links. Mode and mtime are kept, and other link errors still fail.
    • 2 Design bullets.
    • 2 Known gaps citing #1870: a hard link to an extracted symlink, and unwritten members not named.
  • operations/drag-and-drop (row #1865):
    • The Escape bullets moved to browser/tabs. The release-outside bullet (#630) stays.
    • New: a breadcrumb under a file drag shows the accent tint and ring, not GTK's green border (#1831).
  • operations/clipboard: reviewed_at only. #1831 changed only an internal signature.

preview

  • preview/preview-panel (rows #1840, #1864, #1842):
    • Password-protected PDFs: the message, the Open button (hidden in the chooser), and the print error.
    • Remote .gcode previews as text. Routes refuse remote files, .kml/.gpx never preview as text, and hidden models and routes reload with the current theme.
    • A route file cannot be printed. The model size limit is scoped to STL/3MF/FreeCAD.
    • Design: no unlock prompt (#1636, #1840), and routes share the heavy-preview permit.
  • preview/preview-panel/sandbox (row #1866, batch fix 2): the lock-based sweep of orphaned strata-preview-* folders, from the code. The PR body still describes the earlier pid sweep.
    • Also: the password error, owner-restricted PDFs, G-code exempt from 128 MiB, and the 32 MiB route limit.
    • Known gap: preview folders are not removed at exit (#1866, #1847).
  • preview/preview-panel/model-views: G-code shows its image with no camera controls and gets a loading badge. Known gap: text G-code briefly shows the model loading view (#1864).
  • preview/quick-preview: Right (List/Columns) or Down/Right from the content box focuses a PDF message's Open button (#1840).
  • reviewed_at only: documents, find, layout.

integration

  • integration/portal-file-chooser/url-download (row #1866, fix 1): strata-download-* folders are 0700 and files 0600. Design: why downloads stay out of $XDG_RUNTIME_DIR. review went from reviewed to draft.
  • integration/portal-file-chooser/image-conversion (row #1866, fix 1): the converted PNG's folder is 0700 and the PNG 0600.
  • integration/10xer-mode/preview-keys: arrow and vim keys reach and leave a preview message's Open button (#1840, no row).

settings

  • settings/preferences/storage (row #1869):
    • Six salvage bullets: one bad list or map entry, omarchy_variants key, or nested path is dropped alone. Wrong-shaped values reset whole, *_list_columns records reset as a unit, and the next save writes back the kept entries.
    • Three Design bullets, including the linear salvage that fixed 6.6 s in a debug build.
  • settings/preferences: new ### Units: Metric/Imperial on General, saved as unit_system (#1842, no row). related gains preview/preview-panel/routes.

QA

Tier-1 plans; no PR has unmapped changes.

PR Primary nodes Forced sweeps
#1831 browser/tabs, sidebar, sidebar/pins, search/filter, view-modes, view-modes/columns, operations/clipboard, preview/preview-panel app, browser, settings
#1840 preview/preview-panel + documents, find, layout, model-views, sandbox; preview/quick-preview; integration/10xer-mode/preview-keys app, settings
#1864 preview/preview-panel, gcode, model-views, sandbox; browser/thumbnails, thumbnails/workers; app/infrastructure settings
#1842 preview/preview-panel + routes and 5 more children; preview/quick-preview; settings/preferences, storage; three browser preference nodes; app/infrastructure settings
#1866 url-download, image-conversion, preview/preview-panel/sandbox —
#1870 operations/archives —
#1869 settings/preferences/storage; browser/folder-customization, view-modes/density, list/column-layout (via the shared test file) settings
#1865 browser/tabs, operations/drag-and-drop —
#1871 browser/selection, browser/view-modes, view-modes/list —

Sweeps touched, all with reviewed_at moved to d6c74746:

  • browser:
    • Probes for tab-strip drops (overflow, mixed and multiple drags, cross-window, closing down to one tab mid-drag, modal) and sidebar middle-click.
    • Selection probes in grouped and sorted views, and G-code thumbnails with STL thumbnails on and off and on SMB. A 600 MiB G-code with one worker.
    • The Escape probes moved here from operations.
    • Scope and Hand-offs: drag cancellation stays in browser.
  • operations:
    • Hard-link TARs on real vfat/exFAT/SMB, a nearly full stick, and cancelling a 1 GiB copy.
    • New hand-off: Escape cancelling a file drag → browser.
    • No probes retired. The Escape steps moved to browser.
  • preview: Setup gains G-code, route and PDF samples, plus a toolbox sharing /tmp.
    • New gcode and routes subheadings.
    • Probes for sandbox sweep races, password PDFs over sftp and RC4, and themes with a model and a route hidden in two windows.
  • integration: umask 0000/0077 download and conversion modes checked with stat as a second user, and vim keys on the Open button.
  • settings:
    • Units across windows, invalid unit_system, and Units search in English and Japanese.
    • Salvage of one bad entry and of all bad entries, send_to_recent_destinations, chooser_list_columns, and a 5,000-entry folder_colors.

Needs a person

  • Triage mappings:
    • #1866 is a batch of two fixes listed under separate headings. Fix 1 (file modes) changed remote_download.rs and image_conversion.rs, so url-download and image-conversion each get a row. Fix 2 (preview-folder sweep) changed src/sandbox.rs, so sandbox gets a row.
    • #1869 is mapped to settings/preferences/storage, not the fallback. Its code, salvage_preferences in src/ui/preferences.rs, continues storage's existing salvage behavior (#671, #728). Read literally, the triage rule would put the row on app/infrastructure. Storage's code doesn't list src/ui/preferences.rs, because that file is a shared settings-sweep trigger.
  • Placement calls:
    • The #1871 bullet stays on browser/selection, next to the existing List/Icons modifier-click bullets. The fix is in src/ui/browser_modes.rs, which is browser/view-modes code.
    • The Escape-cancel Behavior moved to browser/tabs, because its code implements it, while drift keeps the #1865 row on drag-and-drop.
  • Optional: browser/search/exclusions ("Invalid rules in the saved preferences are ignored", #1064) could also cite #1869. A non-string entry is now dropped alone.
  • Follow-ups with no lgse/strata issue: issues were searched, open and closed, and nothing was filed.
    • The #1866 body and review say strata-diagnostics-* and .strata-update-* still use tempfile's default mode.
    • The #1870 review lists a hard link to an extracted symlink still aborting on sshfs without hard links. It is recorded as a Known gap citing #1870.
  • No bugs found by code reading, and no maintained upstream doc contradicts the code.
  • Site, for the next docs run: General now has a Units row. check still warns that the site describes v1.0.0 while v1.1.0 is out.
  • (unverified) claims added:
    • browser/sidebar:
      • The Recent menu items and Unpin.
      • Open in New Tab comes first, then a separator.
      • Unmounted device rows offer none.
      • The drag image is the row's icon and name.
    • browser/tabs:
      • Insertion at the first tab whose midpoint is right of the pointer.
      • A tab dropped on New tab moves to the end.
      • Folder drags from the preview header and Ctrl+F results.
      • Several folders open in drag order, and the last is selected.
      • The accent tint on New tab.
      • Hovering a tab doesn't select it.
      • Folders from other apps don't open tabs.
      • A modal dialog blocks strip drops.
    • browser/thumbnails/workers: G-code is exempt from 512 MiB.
    • integration/10xer-mode/preview-keys: j/l/h/k on the Open button.
    • preview/preview-panel/gcode:
      • thumbnail_JPEG.
      • The drawer never enlarges the image.
    • preview/preview-panel:
      • The remote route message.
      • .kml/.gpx never preview as text.
      • The password-PDF print error.
      • A route can't be printed.
      • The heavy-preview permit list.
    • preview/preview-panel/model-views:
      • The G-code badge text.
      • G-code counts toward the folder total.
    • preview/preview-panel/routes:
      • Marker and total distance.
      • The seek step is a third of the route.
      • Mute and volume do nothing.
      • A zero-length route can't be played.
      • The invalid-data message.
    • settings/preferences:
      • Units sits after Language.
      • It updates across windows.
      • The search aliases.

Review loop

Two rounds, with fresh reviewers per area each round.

  • Round 1:
    • operations: 1 blocking finding. Escape-cancel bullets sat on drag-and-drop (code: []) and duplicated browser/tabs, whose code implements them. I confirmed it and moved the bullets. Minors fixed: the #1865 row overclaimed, and the archives gaps had length and citation problems.
    • preview: 2 blocking findings.
      • (a) Move the #1864 and #1842 rows onto the new nodes. Refuted: these PRs aren't triage, since the preview scope is mapped, and drift names preview/preview-panel.
      • (b) Remote .gcode/.gco/.bgcode previews as text was too broad. Confirmed and narrowed to .gcode.
      • Nine minors fixed: model theme reload, route print, (unverified) marks, sentence length, sweep formatting, and others.
    • browser: minors only, all fixed:
      • The all-folders flag is credited to #1692.
      • Preview and filter folder-drag sources added.
      • The G-code thumbnail wording clarified.
      • The worker admission bullets folded together.
      • The missed breadcrumb drop highlight from #1831 added.
      • Long sentences split.
    • integration and settings: no blocking findings. Minors fixed: "in a debug build", related pointed at routes, and probe wording and duplicates.
  • Round 2:
    • browser + operations: no blocking findings. Seven minors fixed:
      • The Escape scenario added to tabs tests.
      • The Escape hand-off added to the operations sweep.
      • The pointer-only Design line dropped.
      • Sentence splits.
      • "selects only".
      • Recent's Open in New Tab.
      • A stray #1871 citation removed.
    • preview: no blocking findings. Minors fixed:
      • The route caption moved back to routes, since route.rs sets it.
      • thumbnail_JPEG.
      • The drawer-scaling wording.
      • The model limit scoped to STL/3MF/FreeCAD.
      • Quick-preview keys limited to List/Columns, plus Down.
      • Units persistence left to settings.
      • Sweep probes de-duplicated.
  • Disputed and unresolved: only round-1 preview (a), refuted as above. A person may still prefer rows on the new child nodes.

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


Generated by Claude Code

…ws, privacy fixes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UDGHgPPbPSoQNyPdmyFNpq
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UDGHgPPbPSoQNyPdmyFNpq
…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
Sync lgse/strata#1872–#1896: accessible names, menus past the window, shared settings saves
@wmfeht
wmfeht merged commit f883ef7 into claude/friendly-cray-scx3zb 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