Files: Finder keyboard model (Return renames, ⌘↓ opens, ⌘↑ parent, Space Quick Look, type-to-select) #466

Closed
opened 2026-09-29 16:20:02 +00:00 by kayg · 12 comments
Owner

Owner (2026-09-29): "Make Files behave like Finder, where Enter is rename instead of go in!"

Keyboard model (Finder), for list and grid, in Files, Recent, Shared and Trash where applicable

  • Return: rename the selected item (inline editor on the name; the name is selected without the extension, as in Finder; Return commits, Esc cancels). With several items selected, Return does nothing (Finder behaviour).
  • ⌘↓ / ⌘O: open (enter a folder, open a file). ⌘↑: go to the parent folder. ⌘[ / ⌘]: back and forward.
  • Space: Quick Look toggle. ⌘⌫: move to Trash (with Undo). ⌘D: duplicate. ⌘I: Info inspector (#465). ⌘C / ⌘V: copy and paste; ⌥⌘V: move.
  • Arrow keys move the selection (grid: 2-D); ⇧+arrows extend it; ⌘A selects all. Type-to-select: typing letters jumps to the first matching name.
  • Mouse: double-click opens. A slow second click on the name of an already selected item starts rename (Finder), with the standard delay so a double-click never triggers rename.
  • Touch: tap opens; rename is in the context menu and the swipe actions.
  • Every shortcut appears in the ⌘/ shortcuts card (registry) and in the menus with its key, with no duplicates or conflicts with global shortcuts. Windows and Linux use Ctrl equivalents and F2 for rename.

Proof

e2e for each key and mouse path, including a regression that Return renames and does not enter a folder, and that a double-click never enters rename. Screenshots of inline rename at 390 and 1440 px, light and dark. Web gates.

## Owner (2026-09-29): "Make Files behave like Finder, where Enter is rename instead of go in!" ## Keyboard model (Finder), for list and grid, in Files, Recent, Shared and Trash where applicable - **Return**: rename the selected item (inline editor on the name; the name is selected **without the extension**, as in Finder; Return commits, Esc cancels). With several items selected, Return does nothing (Finder behaviour). - **⌘↓ / ⌘O**: open (enter a folder, open a file). **⌘↑**: go to the parent folder. **⌘[ / ⌘]**: back and forward. - **Space**: Quick Look toggle. **⌘⌫**: move to Trash (with Undo). **⌘D**: duplicate. **⌘I**: Info inspector (#465). **⌘C / ⌘V**: copy and paste; **⌥⌘V**: move. - **Arrow keys** move the selection (grid: 2-D); **⇧+arrows** extend it; **⌘A** selects all. **Type-to-select**: typing letters jumps to the first matching name. - **Mouse**: double-click opens. A slow second click on the name of an already selected item starts rename (Finder), with the standard delay so a double-click never triggers rename. - **Touch**: tap opens; rename is in the context menu and the swipe actions. - Every shortcut appears in the ⌘/ shortcuts card (registry) and in the menus with its key, with no duplicates or conflicts with global shortcuts. Windows and Linux use Ctrl equivalents and F2 for rename. ## Proof e2e for each key and mouse path, including a regression that Return renames and does not enter a folder, and that a double-click never enters rename. Screenshots of inline rename at 390 and 1440 px, light and dark. Web gates.
Author
Owner

Owner refinement (2026-09-29): follow the convention of the OS the User runs. Detect it (userAgentData.platform, falling back to navigator.platform and the UA; keep the result in one shared platform module used by all shortcuts):

  • macOS / iPadOS: Finder. Return renames; ⌘↓ or ⌘O opens; ⌘↑ goes to the parent; Space is Quick Look; ⌘⌫ moves to Trash.
  • Windows: Explorer. Enter opens; F2 renames; Backspace or Alt+↑ goes to the parent; Delete moves to Trash; Ctrl shortcuts.
  • Linux: GNOME Files and Dolphin. Enter opens; F2 renames; Alt+↑ goes to the parent; Delete moves to Trash; Ctrl shortcuts.
    The shortcuts card, menus and tooltips show the keys for the detected OS. A Settings → Editor/Keyboard override ('Keyboard convention: Automatic / macOS / Windows / Linux') is optional and off by default. Tests cover each convention.
Owner refinement (2026-09-29): **follow the convention of the OS the User runs.** Detect it (userAgentData.platform, falling back to navigator.platform and the UA; keep the result in one shared `platform` module used by all shortcuts): - **macOS / iPadOS:** Finder. Return renames; ⌘↓ or ⌘O opens; ⌘↑ goes to the parent; Space is Quick Look; ⌘⌫ moves to Trash. - **Windows:** Explorer. Enter opens; F2 renames; Backspace or Alt+↑ goes to the parent; Delete moves to Trash; Ctrl shortcuts. - **Linux:** GNOME Files and Dolphin. Enter opens; F2 renames; Alt+↑ goes to the parent; Delete moves to Trash; Ctrl shortcuts. The shortcuts card, menus and tooltips show the keys for the detected OS. A Settings → Editor/Keyboard override ('Keyboard convention: Automatic / macOS / Windows / Linux') is optional and off by default. Tests cover each convention.
Author
Owner

Starting files-sel-keys on branch job/files-sel-keys, based at 369ab6a2f9 (origin/dev). Scope: #448 dynamic selection marks and #466 OS-specific Files keyboard conventions, including shared list/grid surfaces and their proof.

Starting files-sel-keys on branch job/files-sel-keys, based at 369ab6a2f9fc673e3564b94857fbecfeb04df404 (origin/dev). Scope: #448 dynamic selection marks and #466 OS-specific Files keyboard conventions, including shared list/grid surfaces and their proof.
Author
Owner

Finding: Cmd+D duplication has no safe implementation in the current Files API. TransferInput accepts only paths, destination and replace, and transfer() derives every target name from the source basename before checking that the target name is available. Copying an item into its own folder therefore conflicts. Supporting a Finder-style duplicate needs a destination-name mapping or a new server operation in crates/plugins/files, which changes another crate's API behavior under this job's ownership boundary. I will leave the duplicate action out and complete the other keyboard behavior against the existing API.

Finding: Cmd+D duplication has no safe implementation in the current Files API. `TransferInput` accepts only `paths`, `destination` and `replace`, and `transfer()` derives every target name from the source basename before checking that the target name is available. Copying an item into its own folder therefore conflicts. Supporting a Finder-style duplicate needs a destination-name mapping or a new server operation in `crates/plugins/files`, which changes another crate's API behavior under this job's ownership boundary. I will leave the duplicate action out and complete the other keyboard behavior against the existing API.
Author
Owner

Finding: the existing shared arrow helper moved focus without moving selection, which disagreed with #466's Finder keyboard model and could leave Return acting on a different row than the focused row. Commit 4c590965a now makes arrow and type-to-select navigation select the focused item; Shift+arrows extend from the anchor. bunx vitest run src/lib/files/selection.test.ts passed (1 file, 9 tests).

Finding: the existing shared arrow helper moved focus without moving selection, which disagreed with #466's Finder keyboard model and could leave Return acting on a different row than the focused row. Commit 4c590965a now makes arrow and type-to-select navigation select the focused item; Shift+arrows extend from the anchor. `bunx vitest run src/lib/files/selection.test.ts` passed (1 file, 9 tests).
Author
Owner

The production Files keyboard flow exposed a focus-loss bug after folder navigation. With Windows platform spoofing active, Enter changed the URL to the child folder, but the active element became BODY; Backspace then did not reach the listbox key handler, so the parent shortcut was ignored. I am restoring listbox focus after keyboard-driven folder and history navigation. This keeps subsequent Finder-style shortcuts usable without moving focus after touch or pointer navigation.

The production Files keyboard flow exposed a focus-loss bug after folder navigation. With Windows platform spoofing active, Enter changed the URL to the child folder, but the active element became `BODY`; Backspace then did not reach the listbox key handler, so the parent shortcut was ignored. I am restoring listbox focus after keyboard-driven folder and history navigation. This keeps subsequent Finder-style shortcuts usable without moving focus after touch or pointer navigation.
Author
Owner

The phone keyboard E2E showed that type-to-select could not select the Child folder: plain C was already bound to New folder, and the row stayed unselected. I moved New folder to Alt+Shift+N, kept the physical key match for layouts where Option changes the printed glyph, and extended the registry test so this binding is checked against the reserved browser shortcut list.

The phone keyboard E2E showed that type-to-select could not select the `Child` folder: plain `C` was already bound to New folder, and the row stayed unselected. I moved New folder to Alt+Shift+N, kept the physical key match for layouts where Option changes the printed glyph, and extended the registry test so this binding is checked against the reserved browser shortcut list.
Author
Owner

The production keyboard flow selected a folder with type-to-select and opened it with Cmd+Down. The next type-to-select key did not select the child file because the prior folder's typed prefix still lived in the 700 ms buffer across navigation. I now clear that buffer whenever the Files path changes, so a new folder starts with a fresh prefix.

The production keyboard flow selected a folder with type-to-select and opened it with Cmd+Down. The next type-to-select key did not select the child file because the prior folder's typed prefix still lived in the 700 ms buffer across navigation. I now clear that buffer whenever the Files path changes, so a new folder starts with a fresh prefix.
Author
Owner

The repeated keyboard flow also found that Escape left the previous typeahead prefix active. After selecting Child with C, renaming, and cancelling, the next C cycled to another C-prefixed item instead of selecting Child. Escape now ends the typeahead sequence as well as clearing selection.

The repeated keyboard flow also found that Escape left the previous typeahead prefix active. After selecting `Child` with C, renaming, and cancelling, the next C cycled to another C-prefixed item instead of selecting `Child`. Escape now ends the typeahead sequence as well as clearing selection.
Author
Owner

Completed #466 on job/files-sel-keys at HEAD 53732d97f6fa7982b2a05e8dd1d102e2e0c64780.

Built: Finder keyboard navigation and inline rename are implemented for Files and Recent, with the shared platform module selecting the OS convention. Return renames on macOS; Enter opens on Windows/Linux and F2 renames. The slow second name click starts rename after the native click interval; native double-click remains reserved for opening. The focused E2E flow also covers Quick Look, navigation history, parent/open shortcuts, Info, Trash/Undo, touch rename, and selection behavior.

Screenshots attached: 12 PNGs show Files and Recent inline rename at 390, 820, and 1440 px in light and dark.

All six screenshot keyboard flows passed:

PASS Finder keyboard and rename flow phone-light
PASS Finder keyboard and rename flow phone-dark
PASS Finder keyboard and rename flow tablet-light
PASS Finder keyboard and rename flow tablet-dark
PASS Finder keyboard and rename flow desktop-light
PASS Finder keyboard and rename flow desktop-dark

Web gates:

$ node scripts/check-type-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json
Text sizes use shared role tokens.
Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/files-sel-keys/apps/web
Getting Svelte diagnostics...

svelte-check found 0 errors and 0 warnings
 Test Files  136 passed (136)
      Tests  884 passed (884)
   Start at  11:55:35
   Duration  216.33s (transform 60%, environment 14%, import 13%, tests 9%, setup 4%)

  Transform  |component| transforming modules took 326.23s · 49% of tracked time, re-done on every run
             persist transforms across runs with fsModuleCache: true
             learn more: https://vitest.dev/guide/improving-performance#caching-between-reruns

Known gaps: The full bun e2e/files.mjs run passed the keyboard, slow-click rename, double-click-open, pin, and breadcrumb flows, then stopped at an existing whitespace assertion: computed white-space is nowrap, while the existing test expects pre. I kept that expectation unchanged. The separate selection-only E2E passed. The screenshot-only run passed all six keyboard/rename viewport and theme flows, then timed out on a later /api/v1/appearance request. Cmd+D duplicate remains blocked because the transfer API has no destination-name operation; this was recorded earlier on the issue.

Decisions: The OS behavior follows the owner's #466 refinement. DESIGN does not define the slow-click interval, so the bounded window is 250–1500 ms; the handler still requires native event.detail === 1, which keeps a real double-click on the open path. Bare letters remain type-to-select, so New Folder uses Alt+Shift+N instead of bare C.

Completed #466 on `job/files-sel-keys` at HEAD `53732d97f6fa7982b2a05e8dd1d102e2e0c64780`. **Built:** Finder keyboard navigation and inline rename are implemented for Files and Recent, with the shared platform module selecting the OS convention. Return renames on macOS; Enter opens on Windows/Linux and F2 renames. The slow second name click starts rename after the native click interval; native double-click remains reserved for opening. The focused E2E flow also covers Quick Look, navigation history, parent/open shortcuts, Info, Trash/Undo, touch rename, and selection behavior. **Screenshots attached:** 12 PNGs show Files and Recent inline rename at 390, 820, and 1440 px in light and dark. All six screenshot keyboard flows passed: ```text PASS Finder keyboard and rename flow phone-light PASS Finder keyboard and rename flow phone-dark PASS Finder keyboard and rename flow tablet-light PASS Finder keyboard and rename flow tablet-dark PASS Finder keyboard and rename flow desktop-light PASS Finder keyboard and rename flow desktop-dark ``` **Web gates:** ```text $ node scripts/check-type-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json Text sizes use shared role tokens. Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/files-sel-keys/apps/web Getting Svelte diagnostics... svelte-check found 0 errors and 0 warnings ``` ```text Test Files 136 passed (136) Tests 884 passed (884) Start at 11:55:35 Duration 216.33s (transform 60%, environment 14%, import 13%, tests 9%, setup 4%) Transform |component| transforming modules took 326.23s · 49% of tracked time, re-done on every run persist transforms across runs with fsModuleCache: true learn more: https://vitest.dev/guide/improving-performance#caching-between-reruns ``` **Known gaps:** The full `bun e2e/files.mjs` run passed the keyboard, slow-click rename, double-click-open, pin, and breadcrumb flows, then stopped at an existing whitespace assertion: computed `white-space` is `nowrap`, while the existing test expects `pre`. I kept that expectation unchanged. The separate selection-only E2E passed. The screenshot-only run passed all six keyboard/rename viewport and theme flows, then timed out on a later `/api/v1/appearance` request. `Cmd+D` duplicate remains blocked because the transfer API has no destination-name operation; this was recorded earlier on the issue. **Decisions:** The OS behavior follows the owner's #466 refinement. DESIGN does not define the slow-click interval, so the bounded window is 250–1500 ms; the handler still requires native `event.detail === 1`, which keeps a real double-click on the open path. Bare letters remain type-to-select, so New Folder uses `Alt+Shift+N` instead of bare `C`.
Author
Owner

Merge round 3 integration report

State: incomplete; do not fast-forward this snapshot to dev yet. The four-hour job limit ended while CLI Clippy was compiling. No completed final-tree gate failed. No source branch was dropped because the completed gates showed no failing branch.

  • Branch: job/merge-round-3
  • Head: 3e5056d485e9021d2d1f708613e783b0b901b447
  • Included in order: job/multiget-500, job/dav-delete-471, job/iso-435, job/admin-deny-483, job/attach-427, job/hidden-420, job/files-sel-keys, job/small-bugs-3, job/sweep-478.
  • Additional commits: 92f5803f3, 3ea69e317, 26b986bc4, 0948cffa1, 99c088193, df6b07a5a, 3e5056d48.

Completed gate output (verbatim excerpts)

cargo fmt --check exited 0 with no output.

  • DAV clippy: Finished \dev` profile [unoptimized + debuginfo] target(s) in 56.92s`
  • DAV tests:
    test result: ok. 40 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.37s
    test result: ok. 36 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.09s
    test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.31s
  • Notes Core clippy: Finished \dev` profile [unoptimized + debuginfo] target(s) in 14.97s`
  • Notes Core tests:
    test result: ok. 512 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.21s
    test result: ok. 19 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 8.21s
    test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s
    test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.35s
    test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
  • Notes plugin clippy: Finished \dev` profile [unoptimized + debuginfo] target(s) in 2m 55s`
  • Notes plugin tests: test result: ok. 127 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 151.26s
  • Files clippy (after comment fix): Finished \dev` profile [unoptimized + debuginfo] target(s) in 48.77s`
  • Files tests: test result: ok. 144 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 178.62s
    The dev-version migration test passed: test tests::dev_files_schema_upgrades_through_share_log_and_sidecar_migrations ... ok
  • Calendar clippy: Finished \dev` profile [unoptimized + debuginfo] target(s) in 1m 53s`
  • Calendar tests:
    test result: ok. 52 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.01s
    test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.12s
    test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.22s
  • Photos clippy: Finished \dev` profile [unoptimized + debuginfo] target(s) in 1m 13s`
  • Photos tests: test result: ok. 45 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 11.10s
  • Search clippy: Finished \dev` profile [unoptimized + debuginfo] target(s) in 55.79s`
  • Search tests:
    test result: ok. 36 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 46.71s
    test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.38s
    test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.09s
    test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 10.44s
    test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s
    test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s
    test result: ok. 1 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 5.66s
    test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
  • Embed clippy: Finished \dev` profile [unoptimized + debuginfo] target(s) in 27.32s`
  • Embed tests: test result: ok. 31 passed; 0 failed; 4 ignored; 0 measured; 0 filtered out; finished in 1.93s
  • Filesystem clippy: Finished \dev` profile [unoptimized + debuginfo] target(s) in 10.78s`
  • Filesystem tests:
    test result: ok. 50 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 9.04s
    test result: ok. 42 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.56s
  • Server clippy: Finished \dev` profile [unoptimized + debuginfo] target(s) in 1m 48s`
  • Server tests: test result: ok. 85 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 19.67s

Other completed checks:

  • Parity matrix: 190 web API actions, 122 shortcuts, 2 static commands, 136 menu actions, 31 settings groups, 172 actions with adapter gaps
  • Cross-User classification gate: 311 operations classified; its test suite printed Ran 5 tests in 0.246s and OK.
  • Admin coverage: 39 reviewed operations; contract and Rust guards agree; its test suite printed Ran 14 tests in 2.404s and OK.
  • Migration audit: ai: 4 migrations, no duplicate numbers; analytics: 2 migrations, no duplicate numbers; calendar: 3 migrations, no duplicate numbers; files: 18 migrations, no duplicate numbers; mail: 8 migrations, no duplicate numbers; notes: 19 migrations, no duplicate numbers; notifications: 4 migrations, no duplicate numbers; photos: 6 migrations, no duplicate numbers; video: 1 migrations, no duplicate numbers.

Remaining work

  • CLI Clippy was interrupted at the four-hour limit while checking dependencies; CLI tests and both Auth gates did not run.
  • The generated contract check, web bun run check, bun run test, and bun run build are pending.
  • The live two-User matrix, authz matrix, DAV round (including Apple’s 100-href and DELETE re-parent replays), sidecar probe, and attachment e2e are pending.
  • Production-browser screenshots for each affected screen at 390/820/1440 px in light/dark mode are pending. No visual review artifacts were produced.
  • The new benchmark profile was added, but its local run and comparison with docs/perf/baseline.json are pending.
  • cargo clean is running but has not returned yet; apps/web/build was removed.

Decisions

  • Files migration IDs follow merge order after dev’s 0015: 0016 share_search_invalidations, 0017 log_attachment_trash, 0018 sidecar_pairs. The populated dev-schema upgrade test passed.
  • Hidden-file Settings copy leads with the User-visible result and uses “Photo edit files (.xmp, .aae)”.
  • The parity exception snapshot was regenerated and reviewed for the newly merged API and Files UI actions.

The branch contains the merged code and commits, but the listed pending gates mean this is not a green merge candidate yet.

## Merge round 3 integration report **State: incomplete; do not fast-forward this snapshot to `dev` yet.** The four-hour job limit ended while CLI Clippy was compiling. No completed final-tree gate failed. No source branch was dropped because the completed gates showed no failing branch. - Branch: `job/merge-round-3` - Head: `3e5056d485e9021d2d1f708613e783b0b901b447` - Included in order: `job/multiget-500`, `job/dav-delete-471`, `job/iso-435`, `job/admin-deny-483`, `job/attach-427`, `job/hidden-420`, `job/files-sel-keys`, `job/small-bugs-3`, `job/sweep-478`. - Additional commits: `92f5803f3`, `3ea69e317`, `26b986bc4`, `0948cffa1`, `99c088193`, `df6b07a5a`, `3e5056d48`. ### Completed gate output (verbatim excerpts) `cargo fmt --check` exited 0 with no output. - DAV clippy: `Finished \`dev\` profile [unoptimized + debuginfo] target(s) in 56.92s` - DAV tests: `test result: ok. 40 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.37s` `test result: ok. 36 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.09s` `test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.31s` - Notes Core clippy: `Finished \`dev\` profile [unoptimized + debuginfo] target(s) in 14.97s` - Notes Core tests: `test result: ok. 512 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.21s` `test result: ok. 19 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 8.21s` `test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s` `test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.35s` `test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s` - Notes plugin clippy: `Finished \`dev\` profile [unoptimized + debuginfo] target(s) in 2m 55s` - Notes plugin tests: `test result: ok. 127 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 151.26s` - Files clippy (after comment fix): `Finished \`dev\` profile [unoptimized + debuginfo] target(s) in 48.77s` - Files tests: `test result: ok. 144 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 178.62s` The dev-version migration test passed: `test tests::dev_files_schema_upgrades_through_share_log_and_sidecar_migrations ... ok` - Calendar clippy: `Finished \`dev\` profile [unoptimized + debuginfo] target(s) in 1m 53s` - Calendar tests: `test result: ok. 52 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.01s` `test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.12s` `test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.22s` - Photos clippy: `Finished \`dev\` profile [unoptimized + debuginfo] target(s) in 1m 13s` - Photos tests: `test result: ok. 45 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 11.10s` - Search clippy: `Finished \`dev\` profile [unoptimized + debuginfo] target(s) in 55.79s` - Search tests: `test result: ok. 36 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 46.71s` `test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.38s` `test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.09s` `test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 10.44s` `test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s` `test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s` `test result: ok. 1 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 5.66s` `test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s` - Embed clippy: `Finished \`dev\` profile [unoptimized + debuginfo] target(s) in 27.32s` - Embed tests: `test result: ok. 31 passed; 0 failed; 4 ignored; 0 measured; 0 filtered out; finished in 1.93s` - Filesystem clippy: `Finished \`dev\` profile [unoptimized + debuginfo] target(s) in 10.78s` - Filesystem tests: `test result: ok. 50 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 9.04s` `test result: ok. 42 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.56s` - Server clippy: `Finished \`dev\` profile [unoptimized + debuginfo] target(s) in 1m 48s` - Server tests: `test result: ok. 85 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 19.67s` Other completed checks: - `Parity matrix: 190 web API actions, 122 shortcuts, 2 static commands, 136 menu actions, 31 settings groups, 172 actions with adapter gaps` - `Cross-User classification gate: 311 operations classified`; its test suite printed `Ran 5 tests in 0.246s` and `OK`. - `Admin coverage: 39 reviewed operations; contract and Rust guards agree`; its test suite printed `Ran 14 tests in 2.404s` and `OK`. - Migration audit: `ai: 4 migrations, no duplicate numbers`; `analytics: 2 migrations, no duplicate numbers`; `calendar: 3 migrations, no duplicate numbers`; `files: 18 migrations, no duplicate numbers`; `mail: 8 migrations, no duplicate numbers`; `notes: 19 migrations, no duplicate numbers`; `notifications: 4 migrations, no duplicate numbers`; `photos: 6 migrations, no duplicate numbers`; `video: 1 migrations, no duplicate numbers`. ### Remaining work - CLI Clippy was interrupted at the four-hour limit while checking dependencies; CLI tests and both Auth gates did not run. - The generated contract check, web `bun run check`, `bun run test`, and `bun run build` are pending. - The live two-User matrix, authz matrix, DAV round (including Apple’s 100-href and DELETE re-parent replays), sidecar probe, and attachment e2e are pending. - Production-browser screenshots for each affected screen at 390/820/1440 px in light/dark mode are pending. No visual review artifacts were produced. - The new benchmark profile was added, but its local run and comparison with `docs/perf/baseline.json` are pending. - `cargo clean` is running but has not returned yet; `apps/web/build` was removed. ### Decisions - Files migration IDs follow merge order after dev’s 0015: 0016 `share_search_invalidations`, 0017 `log_attachment_trash`, 0018 `sidecar_pairs`. The populated dev-schema upgrade test passed. - Hidden-file Settings copy leads with the User-visible result and uses “Photo edit files (.xmp, .aae)”. - The parity exception snapshot was regenerated and reviewed for the newly merged API and Files UI actions. The branch contains the merged code and commits, but the listed pending gates mean this is not a green merge candidate yet.
Author
Owner

Merge round 3 report addendum

Branch job/merge-round-3, HEAD 3e5056d485e9021d2d1f708613e783b0b901b447.

  • Cleanup completed after the main report: Removed 25367 files, 17.5GiB total.
  • apps/web/build removal check: web build output removed: True.
  • git diff --check exited 0 with no output; the worktree has no modified or untracked files.
  • The 4-hour cutoff also prevented a full re-read of documentation comments across all 234 changed files. This remains an audit gap alongside the pending gates listed in the main report.

The branch is still not a green merge candidate.

## Merge round 3 report addendum Branch `job/merge-round-3`, HEAD `3e5056d485e9021d2d1f708613e783b0b901b447`. - Cleanup completed after the main report: `Removed 25367 files, 17.5GiB total`. - `apps/web/build` removal check: `web build output removed: True`. - `git diff --check` exited 0 with no output; the worktree has no modified or untracked files. - The 4-hour cutoff also prevented a full re-read of documentation comments across all 234 changed files. This remains an audit gap alongside the pending gates listed in the main report. The branch is still not a green merge candidate.
Author
Owner

Merged in merge round 3 and deployed to calternal.cloud in cc25c441b (healthy).

Merged in merge round 3 and deployed to calternal.cloud in cc25c441b (healthy).
kayg closed this issue 2026-09-30 23:22:46 +00:00
Sign in to join this conversation.
No labels
No milestone
No project
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/calternal#466
No description provided.