port: rows, drop notes on tags, hide places, Empty Trash 3/3 #878

Open
kayg wants to merge 17 commits from port/rows-drop into port/rows-actions
Owner

Slice 3 of 3, stacked on slice 2 (base port/rows-actions).

Ships

  • Drag a note row (wide layout, mouse after 5 px) onto a tag in the sidebar: the tag lights in the accent, the drop edits the note's tags: (same real edit as bulk Tag), toast + Undo. Phone rows stay menu-only (no sidebar beside them), as in the mockup.
  • Sidebar places: Hide from sidebar in a row's menu (All notes cannot be hidden), "N hidden" under the list opens "Show X"; remembered on the device like the order; Move up/down keeps hidden rows' spots.
  • Empty Trash… in the Trash place's menu (asks in the bar first, then notes.empty-trash).
  • Icons hide / show from the mockup.

Not ported / why: Archive place and dropping on Archive (no archive on the server, see slice 2). Preview/drag for tasks and contacts (no such lists in the product yet).

Gates (head 233cef44): svelte-check 0 errors; web vitest 85 passed. Playwright (new press, bulk-tag, sidebar-drop + sidebar-band, sidebar-edge, tags, swipe-rows, select-rows, touch-select, list-chrome, phone-targets) chromium 1440+390: 127 passed / 61 skipped / 0 failed; WebKit 1440+390 (press, bulk-tag, sidebar-drop, tags): 28 passed / 10 skipped / 0 failed. All CI=1 --retries=0 --workers=1 through ~/bin/slot.
Screenshots for slices 2 and 3 (bulk Tag menu, drop highlight, hidden row, Empty Trash) were not taken yet; slice 1's pairs are on #875.

Slice 3 of 3, stacked on slice 2 (base `port/rows-actions`). **Ships** - Drag a note row (wide layout, mouse after 5 px) onto a tag in the sidebar: the tag lights in the accent, the drop edits the note's `tags:` (same real edit as bulk Tag), toast + Undo. Phone rows stay menu-only (no sidebar beside them), as in the mockup. - Sidebar places: **Hide from sidebar** in a row's menu (All notes cannot be hidden), "N hidden" under the list opens "Show X"; remembered on the device like the order; Move up/down keeps hidden rows' spots. - **Empty Trash…** in the Trash place's menu (asks in the bar first, then `notes.empty-trash`). - Icons `hide` / `show` from the mockup. **Not ported / why:** Archive place and dropping on Archive (no archive on the server, see slice 2). Preview/drag for tasks and contacts (no such lists in the product yet). **Gates** (head 233cef44): svelte-check 0 errors; web vitest 85 passed. Playwright (new `press`, `bulk-tag`, `sidebar-drop` + `sidebar-band`, `sidebar-edge`, `tags`, `swipe-rows`, `select-rows`, `touch-select`, `list-chrome`, `phone-targets`) chromium 1440+390: 127 passed / 61 skipped / 0 failed; WebKit 1440+390 (`press`, `bulk-tag`, `sidebar-drop`, `tags`): 28 passed / 10 skipped / 0 failed. All `CI=1 --retries=0 --workers=1` through `~/bin/slot`. Screenshots for slices 2 and 3 (bulk Tag menu, drop highlight, hidden row, Empty Trash) were not taken yet; slice 1's pairs are on #875.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
port(rows): sidebar drop spec fixes
Some checks failed
CI / server (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
CI / web (pull_request) Has been cancelled
Markdown extraction contract / markdown-native-contract (pull_request) Has been cancelled
Markdown extraction contract / markdown-editor-contract (pull_request) Has been cancelled
233cef444e
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Author
Owner

Shots, product vs mockup: dragging a note onto a tag (drop highlight), a place's menu with Hide from sidebar, the sidebar after hiding (N hidden), and Empty Trash asking first (product only; the mockup keeps Empty Trash in the Trash list's own menu and its flow did not run in my capture).

Shots, product vs mockup: dragging a note onto a tag (drop highlight), a place's menu with Hide from sidebar, the sidebar after hiding (N hidden), and Empty Trash asking first (product only; the mockup keeps Empty Trash in the Trash list's own menu and its flow did not run in my capture).
Author
Owner

Rebased onto #877 27abe224 (the Move fix). New head 353feeaa, no conflicts. Gates on dev-01: vitest 117/117; svelte-check = baseline (2 errors); sidebar-drop.spec + bulk-tag.spec 5 passed on chromium-1440 and webkit-1440 (390 projects skip). Bundle gate not re-run.

Rebased onto #877 `27abe224` (the Move fix). New head `353feeaa`, no conflicts. Gates on dev-01: vitest 117/117; svelte-check = baseline (2 errors); `sidebar-drop.spec` + `bulk-tag.spec` 5 passed on chromium-1440 and webkit-1440 (390 projects skip). Bundle gate not re-run.
Author
Owner

Heads-up from the BM15 first-paint diet lane (#947): I restacked the rows PRs on top of the #887 diet and pushed port/rows (#875), port/rows-actions (#877) and port/rows-drop (#878) with --force-with-lease. Your last commits on #877 (82b257f6, the Move menu through openMenuWith) and #878 (11e8ae1d, b68a61e5, the Undo and live-pick fixes) are kept: I cherry-picked them onto the new stack, so their SHAs changed. Please git fetch and reset your local branches to the pushed heads before pushing again; a plain push from an older checkout would drop the diet. Anything you change in first-paint code (index chunk) should stay behind the lazy chunks: the press engine, swipe engine, menu helpers, Archive/Hide actions and the tooltip engine now load with press/press.ts or on first use. Numbers are in the #947 comment.

Heads-up from the BM15 first-paint diet lane (#947): I restacked the rows PRs on top of the #887 diet and pushed `port/rows` (#875), `port/rows-actions` (#877) and `port/rows-drop` (#878) with `--force-with-lease`. Your last commits on #877 (`82b257f6`, the Move menu through `openMenuWith`) and #878 (`11e8ae1d`, `b68a61e5`, the Undo and live-pick fixes) are kept: I cherry-picked them onto the new stack, so their SHAs changed. **Please `git fetch` and reset your local branches to the pushed heads before pushing again**; a plain push from an older checkout would drop the diet. Anything you change in first-paint code (`index` chunk) should stay behind the lazy chunks: the press engine, swipe engine, menu helpers, Archive/Hide actions and the tooltip engine now load with `press/press.ts` or on first use. Numbers are in the #947 comment.
Author
Owner

First-paint diet (BM15, #947). Head ed8e3ff2 (restacked on #877; your 11e8ae1d, b68a61e5, 6e994016 fixes are kept).

First-paint bytes are brotli q11 from apps/web/scripts/bundle-size.mjs (JS of the first-paint closure = the index chunk; CSS of the first stylesheet). Dev baseline 41f2efa3: 238,797 B JS, 19,250 B CSS. A second figure, "hash-normalised", is the same chunk with the 8-character chunk-file hashes replaced by a fixed string: the hashes are random, and they move the real brotli number by ±300 B between two builds of identical code, so a few-hundred-byte claim is only meaningful in the normalised figure (dev: 238,804). Chunk budgets: every new lazy chunk's line is taken from the first-script line or the idle-screens line so the total stays 404.2; perf/web.sh --bundle-only --gate passes on this head.

first JS first CSS lazy JS
before (as in #947) +5,580 over dev (+2,375 over #877) +190
now (stack through this PR) 237,545 (−1,252 vs dev; normalised 237,356 = −1,448) 19,029 (−221) 139,125

Own effect over #877: +479 B JS real (normalised +307), +49 B CSS, down from +2,375 B. The big item was in Sidebar.svelte: dropTarget/dnd came from press/drag.svelte.ts, so the whole drag engine (4.2 KB raw) and lift.ts rode in the first script. The drop-target registry is now press/drop.svelte.ts (the engine imports it), and the tag-writing code (move-tags, note-tags, pending-tags) loads on the first drop (drop-on-tag.ts). What is left is the hidden-rows state and "N hidden" button, the sidebar menu's Hide / Empty Trash entries, and one class:over.

Specs: sidebar-drop, press on all four projects: 24 passed, 20 skipped, 0 failed. Lint ok, svelte-check = baseline (2 errors, 15 warnings as dev), web units 55 passed.

Budgets: drop-on-tag 0.15 from idle-screens (48.55); total 404.2.

**First-paint diet (BM15, #947).** Head `ed8e3ff2` (restacked on #877; your `11e8ae1d`, `b68a61e5`, `6e994016` fixes are kept). First-paint bytes are brotli q11 from `apps/web/scripts/bundle-size.mjs` (JS of the first-paint closure = the `index` chunk; CSS of the first stylesheet). Dev baseline `41f2efa3`: **238,797 B JS, 19,250 B CSS**. A second figure, "hash-normalised", is the same chunk with the 8-character chunk-file hashes replaced by a fixed string: the hashes are random, and they move the real brotli number by ±300 B between two builds of identical code, so a few-hundred-byte claim is only meaningful in the normalised figure (dev: 238,804). Chunk budgets: every new lazy chunk's line is taken from the first-script line or the idle-screens line so the total stays 404.2; `perf/web.sh --bundle-only --gate` passes on this head. | | first JS | first CSS | lazy JS | |---|---|---|---| | before (as in #947) | +5,580 over dev (+2,375 over #877) | +190 | | | **now (stack through this PR)** | **237,545 (−1,252 vs dev**; normalised 237,356 = −1,448) | **19,029 (−221)** | 139,125 | Own effect over #877: **+479 B JS real (normalised +307), +49 B CSS**, down from +2,375 B. The big item was in `Sidebar.svelte`: `dropTarget`/`dnd` came from `press/drag.svelte.ts`, so the whole drag engine (4.2 KB raw) and `lift.ts` rode in the first script. The drop-target registry is now `press/drop.svelte.ts` (the engine imports it), and the tag-writing code (`move-tags`, `note-tags`, `pending-tags`) loads on the first drop (`drop-on-tag.ts`). What is left is the hidden-rows state and "N hidden" button, the sidebar menu's Hide / Empty Trash entries, and one `class:over`. Specs: `sidebar-drop`, `press` on all four projects: **24 passed, 20 skipped, 0 failed**. Lint ok, svelte-check = baseline (2 errors, 15 warnings as dev), web units 55 passed. Budgets: `drop-on-tag` 0.15 from `idle-screens` (48.55); total 404.2.
Author
Owner

Drop on a sidebar tag now shares Move's pending tags and write line (closes the risk noted on #947). Head 6e994016, rebased on #877 a47cab78 after the BM15 lane's restack.

  • lib/drop-on-tag.ts (the lane's lazy loader) calls moveTag(...) with quiet set (a note that already has the tag is left alone, no toast, as before). So a drop and a Move share one overlay and one line of writes.
  • rows/plugins/pick-live.ts: picked notes are read live from the lists (getters), so an Undo's pending tags are not dropped by a stale edited stamp.
  • Undo records its pending tags when tapped, before its write waits in line. (Found by the unit test I added; without it a Move menu opened right after Undo read the lagging list.)
  • Unit tests, no timers (move-tags.test.ts, 9 cases): drop then Move at once (menu already shows the tag as on; writes [add, remove] in order); Move, remove, drop at once ([add, remove, add], nothing starts before the first ends); drop of a tag the note has is silent; a note the lists don't hold is still written; Undo while the list still has the tag shows it as off.

Also fixed on the way:

  • #877 bulk-note.ts called openMenu with an options argument after the lazy-menu split (svelte-check "Expected 3 arguments, but got 4", a third error over baseline). Now openMenuWith (#877 82b257f6).
  • The specs' tag was tg + the prefix's last 5 characters; about 1 run in 100 the prefix itself contained that text (e.g. btghbz06), so the id/title/heading counted as extra copies and bulk-tag failed ("Received length: 3", seen in the trace). The tag is now mv- + those characters; the prefix has no hyphen, so it can't collide. Same in sidebar-drop.spec (its not.toContain(tag) had the same hazard). No assertion was loosened.

Gates on dev-01 (~/bin/slot, CI=1 --workers=1 --retries=0 --repeat-each=20 --reporter=list, e2e/sidebar-drop.spec.ts e2e/bulk-tag.spec.ts):

  • chromium-1440: 100 passed (11.6 m)
  • webkit-1440: 100 passed (30.8 m)
  • vitest 122/122; svelte-check = baseline (2 errors, 15 warnings).
    Earlier head b68a61e5: chromium 99/100 (the prefix collision above), webkit not completed.
    Not run: bundle-size gate.
**Drop on a sidebar tag now shares Move's pending tags and write line** (closes the risk noted on #947). Head `6e994016`, rebased on #877 `a47cab78` after the BM15 lane's restack. - `lib/drop-on-tag.ts` (the lane's lazy loader) calls `moveTag(...)` with `quiet` set (a note that already has the tag is left alone, no toast, as before). So a drop and a Move share one overlay and one line of writes. - `rows/plugins/pick-live.ts`: picked notes are read live from the lists (getters), so an Undo's pending tags are not dropped by a stale `edited` stamp. - Undo records its pending tags when tapped, before its write waits in line. (Found by the unit test I added; without it a Move menu opened right after Undo read the lagging list.) - Unit tests, no timers (`move-tags.test.ts`, 9 cases): drop then Move at once (menu already shows the tag as on; writes `[add, remove]` in order); Move, remove, drop at once (`[add, remove, add]`, nothing starts before the first ends); drop of a tag the note has is silent; a note the lists don't hold is still written; Undo while the list still has the tag shows it as off. Also fixed on the way: - #877 `bulk-note.ts` called `openMenu` with an options argument after the lazy-menu split (svelte-check "Expected 3 arguments, but got 4", a third error over baseline). Now `openMenuWith` (#877 `82b257f6`). - The specs' tag was `tg` + the prefix's last 5 characters; about 1 run in 100 the prefix itself contained that text (e.g. `btghbz06`), so the id/title/heading counted as extra copies and `bulk-tag` failed ("Received length: 3", seen in the trace). The tag is now `mv-` + those characters; the prefix has no hyphen, so it can't collide. Same in `sidebar-drop.spec` (its `not.toContain(tag)` had the same hazard). No assertion was loosened. Gates on dev-01 (`~/bin/slot`, `CI=1 --workers=1 --retries=0 --repeat-each=20 --reporter=list`, `e2e/sidebar-drop.spec.ts e2e/bulk-tag.spec.ts`): - chromium-1440: 100 passed (11.6 m) - webkit-1440: 100 passed (30.8 m) - vitest 122/122; svelte-check = baseline (2 errors, 15 warnings). Earlier head `b68a61e5`: chromium 99/100 (the prefix collision above), webkit not completed. Not run: bundle-size gate.
Author
Owner

Warm-up commit on this stack (BM15 follow-up, #947): the press+swipe chunk is now fetched right after the list's first paint (at once on touch, first idle moment with a 150 ms cap elsewhere) and by the first pointer over the list; the tooltip engine at idle (200 ms cap) and by the first pointer movement. Heads: #875 259b5ab7, #877 53104962, #878 bef3b4f7 (restacked with --force-with-lease; reset local checkouts before pushing). Cold first-use numbers and the specs for these heads are in #947 (comment).

Warm-up commit on this stack (BM15 follow-up, #947): the press+swipe chunk is now fetched right after the list's first paint (at once on touch, first idle moment with a 150 ms cap elsewhere) and by the first pointer over the list; the tooltip engine at idle (200 ms cap) and by the first pointer movement. Heads: #875 `259b5ab7`, #877 `53104962`, #878 `bef3b4f7` (restacked with `--force-with-lease`; reset local checkouts before pushing). Cold first-use numbers and the specs for these heads are in https://git.kayg.org/kayg/calternal/issues/947#issuecomment-79453.
Author
Owner

Not gated yet: carries #887

This branch contains a merge of #887 (notes-archive-hide: the hide/archive/restore Rust and the contracts/actions.json changes). #887's write-path regression is being fixed by a separate lane, so gating this branch now would measure that regression, and merging it would land #887 through the back door. Once #887 is in dev, I merge dev here and run the full per-PR gates (I already merged origin/dev b5e8dcb2 into #875 and #904; #877 and #878 follow #875 as a stack). Also needs then: backend perf ABAB on the perf VMs (Rust), and for #904 the unchanged phone-bar fix f30e0bb7.

## Not gated yet: carries #887 This branch contains a merge of #887 (`notes-archive-hide`: the hide/archive/restore Rust and the `contracts/actions.json` changes). #887's write-path regression is being fixed by a separate lane, so gating this branch now would measure that regression, and merging it would land #887 through the back door. Once #887 is in dev, I merge dev here and run the full per-PR gates (I already merged origin/dev `b5e8dcb2` into #875 and #904; #877 and #878 follow #875 as a stack). Also needs then: backend perf ABAB on the perf VMs (Rust), and for #904 the unchanged phone-bar fix `f30e0bb7`.
Author
Owner

Compiles again: dev 258f3eac-era merge, Requirement::ExpectedOwners restored

The branch had lost the ExpectedOwners { digest } variant (reader half of #898, dev 72434e45) in an earlier dev merge, so home.rs, plan.rs and tests/tolerant.rs did not compile. Merged origin/dev 02cdf878 into port/rows (#875) 367c7d37, put the variant back in plan.rs next to #887's ScopedMetadata / ExactUndo, and merged forward: #877 a54f90f2, #878 d96ee32f. perf/budgets.json merged by the 3-way rule on each side's line moves (index 220.7 → 221.7, idle-screens 51.0 → 49.8 → 49.65, picker-list 9.7 from #975; total stays 404.2).
Checked on dev-01: cargo fmt --all --check rc 0 and cargo clippy -j4 --workspace --all-targets --locked -- -D warnings rc 0 (compiles every test target) on #875 alone and on the #878 tip (the whole stack). Full gates still wait for #887.

## Compiles again: dev `258f3eac`-era merge, `Requirement::ExpectedOwners` restored The branch had lost the `ExpectedOwners { digest }` variant (reader half of #898, dev `72434e45`) in an earlier dev merge, so `home.rs`, `plan.rs` and `tests/tolerant.rs` did not compile. Merged origin/dev `02cdf878` into `port/rows` (#875) `367c7d37`, put the variant back in `plan.rs` next to #887's `ScopedMetadata` / `ExactUndo`, and merged forward: #877 `a54f90f2`, #878 `d96ee32f`. `perf/budgets.json` merged by the 3-way rule on each side's line moves (index 220.7 → 221.7, idle-screens 51.0 → 49.8 → 49.65, `picker-list` 9.7 from #975; total stays 404.2). Checked on dev-01: `cargo fmt --all --check` rc 0 and `cargo clippy -j4 --workspace --all-targets --locked -- -D warnings` rc 0 (compiles every test target) on #875 alone and on the #878 tip (the whole stack). Full gates still wait for #887.
Author
Owner

housekeeping #1009: rebased+failing, left open for review.

restacked tag drop on #877; funded the drop chunk from idle screens.

head: 7369d6d6457766aa8962a364766511427f165649; based on dev cd7f84432febfc63b788fbb9b9f9950452982d74, pushed with the original exact force-with-lease.

frontend frozen install, check, lint, build and unit tests passed. bundle gate failed. first-paint brotli vs dev: JS 229503 B (-1274 B), CSS 18188 B (-198 B).

Rust gate results (Mac VM):

exit command
0 cargo fmt -p calternal-core -p calternal-engine -p calternal-notes -p calternal-perf -p calternal-search -p calternal-tasks -- --check
0 cargo check -j4 --locked -p calternal-core -p calternal-engine -p calternal-notes -p calternal-perf -p calternal-search -p calternal-tasks --all-targets
0 cargo clippy -j4 --locked -p calternal-core -p calternal-engine -p calternal-notes -p calternal-perf -p calternal-search -p calternal-tasks --all-targets -- -D warnings
101 cargo test -j4 --locked -p calternal-core -p calternal-engine -p calternal-notes -p calternal-perf -p calternal-search -p calternal-tasks

Engine idle-user fixture fails with missing file; the same failure reproduces on dev. targeted Chromium and WebKit specs at 1440 and 390 never started. the audit waited more than three hours behind the live daily-train-1107 locks (first queue at 23:45 IST, 7 November; final queue cleanup after 02:46 IST, 8 November). browser validation and UI captures are unrun. only this audit’s exact queued units were stopped; the train locks and owners were left intact. hot-path perf qualification is unrun.

all executed gates used the VM Nix environment, shared Mac lock and slot. exact commands, source heads, logs and dev baseline. frontend inputs are identical to the tested frontend tree when a Rust-only repair changed the head.

original-head cherry/patch inventory, pr-878.md; unmatched entries are missing-patch candidates, with semantic overlap/replacements noted above.

final queue, cleanup and source-verification evidence.

housekeeping #1009: rebased+failing, left open for review. restacked tag drop on #877; funded the drop chunk from idle screens. head: `7369d6d6457766aa8962a364766511427f165649`; based on dev `cd7f84432febfc63b788fbb9b9f9950452982d74`, pushed with the original exact force-with-lease. frontend frozen install, check, lint, build and unit tests passed. bundle gate failed. first-paint brotli vs dev: JS 229503 B (-1274 B), CSS 18188 B (-198 B). Rust gate results (Mac VM): | exit | command | |---|---| | 0 | `cargo fmt -p calternal-core -p calternal-engine -p calternal-notes -p calternal-perf -p calternal-search -p calternal-tasks -- --check` | | 0 | `cargo check -j4 --locked -p calternal-core -p calternal-engine -p calternal-notes -p calternal-perf -p calternal-search -p calternal-tasks --all-targets` | | 0 | `cargo clippy -j4 --locked -p calternal-core -p calternal-engine -p calternal-notes -p calternal-perf -p calternal-search -p calternal-tasks --all-targets -- -D warnings` | | 101 | `cargo test -j4 --locked -p calternal-core -p calternal-engine -p calternal-notes -p calternal-perf -p calternal-search -p calternal-tasks` | Engine idle-user fixture fails with missing file; the same failure reproduces on dev. targeted Chromium and WebKit specs at 1440 and 390 never started. the audit waited more than three hours behind the live daily-train-1107 locks (first queue at 23:45 IST, 7 November; final queue cleanup after 02:46 IST, 8 November). browser validation and UI captures are unrun. only this audit’s exact queued units were stopped; the train locks and owners were left intact. hot-path perf qualification is unrun. all executed gates used the VM Nix environment, shared Mac lock and slot. [exact commands, source heads, logs and dev baseline](https://git.kayg.org/attachments/870a0fef-2e31-425c-aea6-eb87a66d365a). frontend inputs are identical to the tested frontend tree when a Rust-only repair changed the head. [original-head cherry/patch inventory](https://git.kayg.org/attachments/e05a38dc-c028-4d77-8655-efa9d5c8ea50), `pr-878.md`; unmatched entries are missing-patch candidates, with semantic overlap/replacements noted above. [final queue, cleanup and source-verification evidence](https://git.kayg.org/attachments/7ab315a5-4b6c-4af1-971b-cdae2637adae).
Author
Owner

Final-port test pass (issue #1009), READY: no: spec passes at 1440; bundle gate fails.

head 7369d6d6457766aa8962a364766511427f165649

Targeted specs, CI=1 --retries=0 --workers=1, dev-01 Chromium and dev-02 WebKit (through ~/bin/slot), against a dev-head backend (cd7f84432).

spec Chromium 1440 Chromium 390 WebKit 1440 WebKit 390
sidebar-drop 4/4 no result line 4/4 no result line

The 390 runs printed no result (not confirmed as skipped by design).

Bundle gate: perf/web.sh --bundle-only --gate (the 17 failures from the housekeeping audit). Per the gate's own rule (total_js_brotli budget must equal the sum of the named chunk budgets) a cap can only move between named chunks; there is no donor chunk inside this PR, so a fix is a code cut or a decision by kayg. I raised nothing and moved nothing.

  • idle-screens 57.77 vs 49.85, index 224.12 vs 218.75, press 7.21 vs 7.2. First paint JS -1274 B, CSS -198 B vs dev. Stacked on #875/#877.

Not done: Not run yet: Mac VM Safari blur/frame check and perf ABAB x5 on the perf VMs (they need a ready PR first); light/dark 2x screenshots against the mockup are only done for #888 (see its comment).

Not marked READY FOR MERGE.

**Final-port test pass (issue #1009), READY: no: spec passes at 1440; bundle gate fails.** head `7369d6d6457766aa8962a364766511427f165649` Targeted specs, `CI=1 --retries=0 --workers=1`, dev-01 Chromium and dev-02 WebKit (through `~/bin/slot`), against a dev-head backend (`cd7f84432`). | spec | Chromium 1440 | Chromium 390 | WebKit 1440 | WebKit 390 | |---|---|---|---|---| | sidebar-drop | 4/4 | no result line | 4/4 | no result line | The 390 runs printed no result (not confirmed as skipped by design). **Bundle gate:** `perf/web.sh --bundle-only --gate` (the 17 failures from the housekeeping audit). Per the gate's own rule (`total_js_brotli` budget must equal the sum of the named chunk budgets) a cap can only move between named chunks; there is no donor chunk inside this PR, so a fix is a code cut or a decision by kayg. I raised nothing and moved nothing. - `idle-screens` 57.77 vs 49.85, `index` 224.12 vs 218.75, `press` 7.21 vs 7.2. First paint JS -1274 B, CSS -198 B vs dev. Stacked on #875/#877. **Not done:** Not run yet: Mac VM Safari blur/frame check and perf ABAB x5 on the perf VMs (they need a ready PR first); light/dark 2x screenshots against the mockup are only done for #888 (see its comment). Not marked READY FOR MERGE.
Author
Owner

Screenshots and state (issue #1009), 5f813bf041

Rows port (#875 press and hold menu, #877 row actions, #878 drop on a tag; this is the #878 tip, which carries all three). Product (Chromium, 2x) next to the approved mockup (review/calendar-2, 2x), light and dark, then real Safari (1x).

READY FOR MERGE (issue #1009), 5f813bf041

gate result
first paint JS 229855 B: -1300 B (plain) / 229321 B: -1301 B (normalised)
first paint CSS 18191 B: -180 B
specs, Chromium + WebKit, 1440 + 390 green: sidebar-drop 4 passed (rows specs of #875/#877 above; the dev failures aside)
perf/web.sh --bundle-only --gate passes (budget: this stack's lines at measured sizes, kayg's approval; total in merge order stays under 543.9 KiB)
perf ABAB x5 + control below
screenshots 2x, light + dark, 1440 + 390; real Safari below / in this thread

First paint. Plain build vs dev (231155 B JS / 18371 B CSS): 229855 B: -1300 B. Hash-normalised vs dev (230622 B): 229321 B: -1301 B. CSS: 18191 B: -180 B. Dev itself fails five phone specs after #1014 on Chromium and WebKit at 390 (glass:76, lazy-ui:70, preload:89 x3); they fail the same way on this PR's head and are not caused by it.

Perf (perf-02, same method, dev 2fa9e18fb; devA/devB are the same dev build). Median of the 5 per-run medians, ms:

metric devA devB (control) #878 tip
typing, long note p50 23.5 22.6 22.2
typing, long note CPU/key 27.3 27.4 27.3
typing, nested list p50 42.9 42.6 42.3
typing, nested list CPU/key 50.5 49.3 50.0
open note, shown p50 35.4 34.8 35.4
open note, back p50 31.1 31.0 31.9
list flick, CPU 76.6 76.6 76.3
longest task in the flick 166 157 150

Inside the control on every metric. (#875 and #877 are inside the tip; the press engine they share is the one measured in the Tasks stack.)

Differences from the mockup are mostly its newer float layout (the Notes title, the Mockup pill, a bottom dock, 40 fixture notes) against this product's frame. In the states themselves: the product's hold menu has the icon row (Copy link, Pin, Delete) then Open, Select, Archive, Hide (the mockup's is one plain list with shortcut chips on desktop); the bulk bar has text labels and sits in the list pane (the mockup's is icons only and floats over the bottom); the product's bulk Move opens a small tag menu where the mockup's # Tag button lists every tag; the product's place menu is Move up, Move down, Hide from sidebar; the Archived place is called Archived in the product and Archive in the mockup.

Screenshots (2x; light and dark; 1440x900 and 390x844). Left: the approved mockup (review/calendar-2). Right: this PR.

s1-rest

mockup this PR
1440 light
1440 dark
390 light
390 dark

s1-hold

mockup this PR
390 light
390 dark

s1-menu

mockup this PR
1440 light
1440 dark

s2-bulk

mockup this PR
1440 light
1440 dark
390 light
390 dark

s2-bulk-tag

mockup this PR
1440 light
1440 dark

s3-drag

mockup this PR
1440 light
1440 dark

s3-place-menu

mockup this PR
1440 light
1440 dark

s3-hidden

mockup this PR
1440 light
1440 dark

s4-toast

mockup this PR
1440 light
1440 dark

s4-archived

mockup this PR
1440 light
1440 dark

s3-empty-trash

mockup this PR
1440 light no mockup shot of this state
1440 dark no mockup shot of this state

s4-show-hidden

mockup this PR
1440 light no mockup shot of this state
1440 dark no mockup shot of this state

Real Safari (Mac VM, 1x; the phone hold and the two-finger select use synthetic touch events, as the e2e specs do)

s1-rest

light dark
1440
390

s1-hold

light dark
390

s1-menu

light dark
1440

s2-bulk

light dark
1440
390

s2-bulk-tag

light dark
1440

s3-drag

light dark
1440

s3-place-menu

light dark
1440

s3-hidden

light dark
1440

s4-toast

light dark
1440

s4-archived

light dark
1440

s3-empty-trash

light dark
1440

s4-show-hidden

light dark
1440
**Screenshots and state (issue #1009), 5f813bf0417321d62e231cfb46fc2980d6e14194** Rows port (#875 press and hold menu, #877 row actions, #878 drop on a tag; this is the #878 tip, which carries all three). Product (Chromium, 2x) next to the approved mockup (review/calendar-2, 2x), light and dark, then real Safari (1x). **READY FOR MERGE (issue #1009), 5f813bf0417321d62e231cfb46fc2980d6e14194** | gate | result | |---|---| | first paint JS | 229855 B: -1300 B (plain) / 229321 B: -1301 B (normalised) | | first paint CSS | 18191 B: -180 B | | specs, Chromium + WebKit, 1440 + 390 | green: sidebar-drop 4 passed (rows specs of #875/#877 above; the dev failures aside) | | `perf/web.sh --bundle-only --gate` | passes (budget: this stack's lines at measured sizes, kayg's approval; total in merge order stays under 543.9 KiB) | | perf ABAB x5 + control | below | | screenshots 2x, light + dark, 1440 + 390; real Safari | below / in this thread | **First paint.** Plain build vs dev (231155 B JS / 18371 B CSS): 229855 B: -1300 B. Hash-normalised vs dev (230622 B): 229321 B: -1301 B. CSS: 18191 B: -180 B. Dev itself fails five phone specs after #1014 on Chromium and WebKit at 390 (`glass:76`, `lazy-ui:70`, `preload:89` x3); they fail the same way on this PR's head and are not caused by it. **Perf (perf-02, same method, dev `2fa9e18fb`; `devA`/`devB` are the same dev build).** Median of the 5 per-run medians, ms: | metric | devA | devB (control) | #878 tip | |---|---|---|---| | typing, long note p50 | 23.5 | 22.6 | 22.2 | | typing, long note CPU/key | 27.3 | 27.4 | 27.3 | | typing, nested list p50 | 42.9 | 42.6 | 42.3 | | typing, nested list CPU/key | 50.5 | 49.3 | 50.0 | | open note, shown p50 | 35.4 | 34.8 | 35.4 | | open note, back p50 | 31.1 | 31.0 | 31.9 | | list flick, CPU | 76.6 | 76.6 | 76.3 | | longest task in the flick | 166 | 157 | 150 | Inside the control on every metric. (#875 and #877 are inside the tip; the press engine they share is the one measured in the Tasks stack.) Differences from the mockup are mostly its newer float layout (the Notes title, the Mockup pill, a bottom dock, 40 fixture notes) against this product's frame. In the states themselves: the product's hold menu has the icon row (Copy link, Pin, Delete) then Open, Select, Archive, Hide (the mockup's is one plain list with shortcut chips on desktop); the bulk bar has text labels and sits in the list pane (the mockup's is icons only and floats over the bottom); the product's bulk Move opens a small tag menu where the mockup's # Tag button lists every tag; the product's place menu is Move up, Move down, Hide from sidebar; the Archived place is called Archived in the product and Archive in the mockup. ### Screenshots (2x; light and dark; 1440x900 and 390x844). Left: the approved mockup (review/calendar-2). Right: this PR. **s1-rest** | | mockup | this PR | |---|---|---| | 1440 light | ![](https://git.kayg.org/attachments/d092a074-cc4d-4a28-ae4d-f2199be6518a) | ![](https://git.kayg.org/attachments/2ba23ba1-3a5d-44eb-8502-1b0f60ccb8ef) | | 1440 dark | ![](https://git.kayg.org/attachments/88eb8280-8aa5-4506-9d1b-d9ac92b113b7) | ![](https://git.kayg.org/attachments/a8d015b7-8801-4b3b-b406-e50d9c15cf82) | | 390 light | ![](https://git.kayg.org/attachments/f72ab554-cbb2-41e2-80b3-0ca845e63aea) | ![](https://git.kayg.org/attachments/2ec42c7a-639b-4444-900b-527317ac2648) | | 390 dark | ![](https://git.kayg.org/attachments/26a550c8-1d72-41da-bdcb-90d9b8e4e503) | ![](https://git.kayg.org/attachments/d6d4a4ec-654c-4b66-97ee-e2f4abdc83a2) | **s1-hold** | | mockup | this PR | |---|---|---| | 390 light | ![](https://git.kayg.org/attachments/6b985d0f-ff62-41fd-a9ec-51b1fa1007c4) | ![](https://git.kayg.org/attachments/f2a31517-c95a-4068-bf8b-52172eec7a6d) | | 390 dark | ![](https://git.kayg.org/attachments/7faad93c-870f-4dd8-a41a-a2ac521457a4) | ![](https://git.kayg.org/attachments/bd270b04-ea6a-4161-adf3-0e311fcd17c9) | **s1-menu** | | mockup | this PR | |---|---|---| | 1440 light | ![](https://git.kayg.org/attachments/fca64205-0868-4d7e-889b-448f22e24c3c) | ![](https://git.kayg.org/attachments/44f11779-5a62-4e39-82de-f043fd648abd) | | 1440 dark | ![](https://git.kayg.org/attachments/6bdba3e1-e28e-4ec9-bd1e-81ff5eb83fcf) | ![](https://git.kayg.org/attachments/b96c94c1-68ed-4b26-b84a-bbc339c4f64f) | **s2-bulk** | | mockup | this PR | |---|---|---| | 1440 light | ![](https://git.kayg.org/attachments/0bf891c5-b3c5-4425-a66b-0a86ee4df92d) | ![](https://git.kayg.org/attachments/da4dbed9-f822-41bc-86e4-7da56948893e) | | 1440 dark | ![](https://git.kayg.org/attachments/7c2afa45-2df6-4a33-8292-df6b518d6176) | ![](https://git.kayg.org/attachments/da393192-5260-45d0-82df-eb01873e2868) | | 390 light | ![](https://git.kayg.org/attachments/e18b3381-308d-4494-9cd6-6836949b365a) | ![](https://git.kayg.org/attachments/f6c0806f-f327-4259-b28e-34cc970a4672) | | 390 dark | ![](https://git.kayg.org/attachments/04fd71e0-562d-4fe3-a9a5-142b7968287b) | ![](https://git.kayg.org/attachments/ea2cf333-5e3b-423d-b398-d0b585e7fb72) | **s2-bulk-tag** | | mockup | this PR | |---|---|---| | 1440 light | ![](https://git.kayg.org/attachments/54ce733e-735a-48bb-ab0b-2354a6711b45) | ![](https://git.kayg.org/attachments/b2248ba1-0ca4-4970-8dfb-da04676c3a5e) | | 1440 dark | ![](https://git.kayg.org/attachments/1494d4f2-8d54-4319-89f8-a602114444fe) | ![](https://git.kayg.org/attachments/8c6704f1-4777-4006-94ff-919726fe7884) | **s3-drag** | | mockup | this PR | |---|---|---| | 1440 light | ![](https://git.kayg.org/attachments/8ca52af9-748c-41b4-b9a5-d80e5e963157) | ![](https://git.kayg.org/attachments/bcce374c-63bf-43fa-971e-9649b26b3fab) | | 1440 dark | ![](https://git.kayg.org/attachments/63a2aa58-e0ac-494a-9e22-a4984f48c32f) | ![](https://git.kayg.org/attachments/de568aa8-d212-4586-b573-fa20f89233cc) | **s3-place-menu** | | mockup | this PR | |---|---|---| | 1440 light | ![](https://git.kayg.org/attachments/197060a9-b9b9-4f9e-970e-7e8f2bb6b1d9) | ![](https://git.kayg.org/attachments/ec413760-6f2e-4639-a6c1-b92ac793f159) | | 1440 dark | ![](https://git.kayg.org/attachments/8557d699-4459-4bee-b5d9-2456a87d6239) | ![](https://git.kayg.org/attachments/3ba2a777-28ec-4487-a357-d613ad91b404) | **s3-hidden** | | mockup | this PR | |---|---|---| | 1440 light | ![](https://git.kayg.org/attachments/08d320f1-2ea4-4f2c-9831-1b8872cdfd2e) | ![](https://git.kayg.org/attachments/df92621f-f1a5-4713-955a-916133f377cd) | | 1440 dark | ![](https://git.kayg.org/attachments/27a9ead2-69f4-4d8f-ba12-2004545d8299) | ![](https://git.kayg.org/attachments/8ddc3f88-6e6b-4432-891b-99ccb64f5947) | **s4-toast** | | mockup | this PR | |---|---|---| | 1440 light | ![](https://git.kayg.org/attachments/1073ac7c-dfe9-4818-adc3-d3b672dae9fe) | ![](https://git.kayg.org/attachments/d52cefaf-60c8-49eb-85c6-81235dcccab6) | | 1440 dark | ![](https://git.kayg.org/attachments/f7e63ab1-d2f7-4c1e-8b85-aa77b88360f2) | ![](https://git.kayg.org/attachments/208da9a2-f5b2-48fe-96df-4544535f528c) | **s4-archived** | | mockup | this PR | |---|---|---| | 1440 light | ![](https://git.kayg.org/attachments/9763aded-2fee-4f12-aefd-e32396c7b264) | ![](https://git.kayg.org/attachments/11706c2f-3179-401a-a347-c1ba468a5147) | | 1440 dark | ![](https://git.kayg.org/attachments/4c1a8e40-50df-4274-a747-776e72ef8b4d) | ![](https://git.kayg.org/attachments/d82428f4-25e9-4919-ba22-a070e273d480) | **s3-empty-trash** | | mockup | this PR | |---|---|---| | 1440 light | no mockup shot of this state | ![](https://git.kayg.org/attachments/3469118f-536a-4306-9390-d659aa6d2a88) | | 1440 dark | no mockup shot of this state | ![](https://git.kayg.org/attachments/a1525c61-5f44-4956-b1da-418ce94d593d) | **s4-show-hidden** | | mockup | this PR | |---|---|---| | 1440 light | no mockup shot of this state | ![](https://git.kayg.org/attachments/110613fb-3137-43d6-8cb4-1261c916878a) | | 1440 dark | no mockup shot of this state | ![](https://git.kayg.org/attachments/ccdf2274-ad2f-4afe-89f0-4cb35de82555) | ### Real Safari (Mac VM, 1x; the phone hold and the two-finger select use synthetic touch events, as the e2e specs do) **s1-rest** | | light | dark | |---|---|---| | 1440 | ![](https://git.kayg.org/attachments/e5ef1cd7-7239-4003-9411-88d6e02b45b5) | ![](https://git.kayg.org/attachments/1c4938f8-1f04-41da-8c14-e26c3d0ce98b) | | 390 | ![](https://git.kayg.org/attachments/3401e368-f0af-4c75-b58c-9896c822a90e) | ![](https://git.kayg.org/attachments/7ecf4cbb-1413-47af-b0fe-d8bb894f0616) | **s1-hold** | | light | dark | |---|---|---| | 390 | ![](https://git.kayg.org/attachments/13074e13-7dc8-4af7-a9f8-ef1cdf54f920) | ![](https://git.kayg.org/attachments/ab3c6bca-6254-4ac6-85cf-fe50a9bfa346) | **s1-menu** | | light | dark | |---|---|---| | 1440 | ![](https://git.kayg.org/attachments/93f7bd6f-5c0c-4ea5-8518-b24b4029908e) | ![](https://git.kayg.org/attachments/5c020ce9-dc07-442c-b6d2-8f70108793d2) | **s2-bulk** | | light | dark | |---|---|---| | 1440 | ![](https://git.kayg.org/attachments/11a08f16-cb73-488a-a16f-ab80185012b5) | ![](https://git.kayg.org/attachments/1562c90a-85a8-4a20-ba3d-ff99b39b506f) | | 390 | ![](https://git.kayg.org/attachments/a66a8d20-d955-4a4e-9e77-809b8ad5f4fd) | ![](https://git.kayg.org/attachments/3e6ba8f7-4e1f-4ddd-bc0d-5b8e293b7cc9) | **s2-bulk-tag** | | light | dark | |---|---|---| | 1440 | ![](https://git.kayg.org/attachments/ab04cb02-c12c-4d5d-85cc-331ffdc5d584) | ![](https://git.kayg.org/attachments/80f455d2-bbef-4dca-8ea6-2a7f28f2e88a) | **s3-drag** | | light | dark | |---|---|---| | 1440 | ![](https://git.kayg.org/attachments/8e870bd8-8b21-4595-be18-0599a9163ddf) | ![](https://git.kayg.org/attachments/7a0e9270-c082-44ca-bb94-39c6673c9c6d) | **s3-place-menu** | | light | dark | |---|---|---| | 1440 | ![](https://git.kayg.org/attachments/297d29bf-52e9-471d-9283-ada1b8597547) | ![](https://git.kayg.org/attachments/140fdae2-3923-42fb-8d9a-7f8984c8bcd4) | **s3-hidden** | | light | dark | |---|---|---| | 1440 | ![](https://git.kayg.org/attachments/8c63f9d4-ec6c-4c01-981a-fd0e9e857ce0) | ![](https://git.kayg.org/attachments/3f1453c4-cffe-4db4-abcf-dcd0044b512e) | **s4-toast** | | light | dark | |---|---|---| | 1440 | ![](https://git.kayg.org/attachments/0654f121-6691-4b4b-ba39-9a110e45c60b) | ![](https://git.kayg.org/attachments/d5a69f16-67f4-402d-97a5-2468fdbf4fae) | **s4-archived** | | light | dark | |---|---|---| | 1440 | ![](https://git.kayg.org/attachments/ed38f199-ae84-4285-8105-4f2e7fff02fe) | ![](https://git.kayg.org/attachments/8ecbdd16-ff52-4c0d-9983-fcfaf7ed1948) | **s3-empty-trash** | | light | dark | |---|---|---| | 1440 | ![](https://git.kayg.org/attachments/9c4cc7ea-363a-4dfa-83ba-0a24ab731118) | ![](https://git.kayg.org/attachments/7446e7a9-07f9-4e8c-813d-771303975c6c) | **s4-show-hidden** | | light | dark | |---|---|---| | 1440 | ![](https://git.kayg.org/attachments/f44c717d-d7ba-4712-b66f-063badab940a) | ![](https://git.kayg.org/attachments/ed7ac39c-e103-4faa-8efe-8f02ca7ec235) |
Author
Owner

Rows stack restacked on dev d4b32af94 (heads #875 3d8babdca, #877 8cf5556c0, #878 c6c0fa89b). Not READY: first paint is over dev now.

The press engine's move out of the first screen (about -2.4 KB) merged with the Tasks stack, so it no longer counts for the rows PRs. First paint JS vs dev (plain 228525 B): #875 +226 B, #877 +813 B, #878 +1305 B (CSS +65 B); the rows stack also carries the visibility commits that #904 holds, which are part of the extra. Specs: rows specs green on Chromium and WebKit apart from dev's own failures; the Tasks lists (board, swipe, card, press) pass on #878 after one fix (they import dnd and dropTarget from press/drop.svelte, where this PR moved them). Bundle gate passes on all three; budget regenerated (total 517.3 KiB). Dev d4b32af94 itself fails 9 specs (palette preload:118 at 1440 and 390, glass:76, lazy-ui:70, preload:89 x3 at 390), on Chromium and WebKit; the same ones fail on this head and none is new.

**Rows stack restacked on dev `d4b32af94` (heads #875 `3d8babdca`, #877 `8cf5556c0`, #878 `c6c0fa89b`). Not READY: first paint is over dev now.** The press engine's move out of the first screen (about -2.4 KB) merged with the Tasks stack, so it no longer counts for the rows PRs. First paint JS vs dev (plain 228525 B): #875 **+226 B**, #877 +813 B, #878 **+1305 B** (CSS +65 B); the rows stack also carries the visibility commits that #904 holds, which are part of the extra. Specs: rows specs green on Chromium and WebKit apart from dev's own failures; the Tasks lists (board, swipe, card, press) pass on #878 after one fix (they import `dnd` and `dropTarget` from `press/drop.svelte`, where this PR moved them). Bundle gate passes on all three; budget regenerated (total 517.3 KiB). Dev `d4b32af94` itself fails 9 specs (palette `preload:118` at 1440 and 390, `glass:76`, `lazy-ui:70`, `preload:89` x3 at 390), on Chromium and WebKit; the same ones fail on this head and none is new.
Author
Owner

Rows stack restacked on dev 661123e94 (heads #875 f09242f2e121ef2f96b05af5322be2dfacb176fb, #877 eab6c5296de0c123591f2068181de2e02f5ee249, #878 a9f71c56823e1ad85ffe9001ceffe105498dcbb2). Not READY: first paint JS vs dev (227125 B plain): #875 +125 B, #877 +804 B, #878 +1287 B; CSS +0 / +26 / +65 B. One real credit found and taken in #875: the service-worker shell warm-up (400 B of the first screen) is its own chunk now (it took #875 from +252 to +125). The rest is the rows features themselves (NoteList, headings, the sidebar's drop registry, the icon table). Specs and gate pass on all three (budget total 511.4 KiB). Dev 661123e94 itself fails the same nine specs as before (palette preload:118 at 1440 and 390, glass:76, lazy-ui:70, preload:89 x3), on both engines; none is new on this head.

**Rows stack restacked on dev `661123e94` (heads #875 `f09242f2e121ef2f96b05af5322be2dfacb176fb`, #877 `eab6c5296de0c123591f2068181de2e02f5ee249`, #878 `a9f71c56823e1ad85ffe9001ceffe105498dcbb2`). Not READY: first paint JS vs dev (227125 B plain): #875 +125 B, #877 +804 B, #878 +1287 B; CSS +0 / +26 / +65 B.** One real credit found and taken in #875: the service-worker shell warm-up (400 B of the first screen) is its own chunk now (it took #875 from +252 to +125). The rest is the rows features themselves (NoteList, headings, the sidebar's drop registry, the icon table). Specs and gate pass on all three (budget total 511.4 KiB). Dev `661123e94` itself fails the same nine specs as before (palette `preload:118` at 1440 and 390, `glass:76`, `lazy-ui:70`, `preload:89` x3), on both engines; none is new on this head.
Author
Owner

Head 018486e59: over dev on first paint, kayg's call

Design merge with Sharing (#842/#876) and dev 4274dafb4 (rusqlite 0.41, restore detection, #1044 frame fixes, #1048 lifecycle ids). Done once in the rows base (#875), carried up by merges:

  • write_executor/home.rs: run_note_write(plan, undo_of, caller) takes both the rows undo key and Sharing's caller; plain writes pass (None, None), execute_note_write_for passes the caller, undo passes its key.
  • crates/notes/src/actions.rs: shared::actions and visibility::actions are both chained. contracts/actions.json is the union (notes.hide/archive/unarchive/unhide and notes.hide-shared side by side; actions.gen.ts regenerated with action-types.mjs --check).
  • crates/search/src/index.rs: dev's hand-opened read snapshot (rusqlite 0.41) plus the foreground gauge.
  • Web: NoteList, lists.ts, sidebar.svelte.ts, actions.ts keep both the Archived and the Shared with me lists; Show hidden does not add your own hidden notes to Shared with me; lists.ts reads store.list(key) (#1030) for Archived/Pinned/tags.
  • #904: its duplicated copy of the backend is replaced by the rows branch's, so there is one backend; its own web commits are untouched.

Checks on dev-02 (aarch64), PR-built backend: cargo test -p calternal-notes 623 passed (one run had typing_during_a_tag_rename_is_kept fail while WebKit specs loaded the host; it passes 3/3 alone on this head and on dev), calternal-auth isolation 3, calternal isolation 40, calternal-server access 1, admin-sharing 11 passed in both chromium projects on #878 and #904 (including the new trash/restore test). Specs, 4 projects: preload, lazy-ui, lazy-offline, glass, shortcuts, keys-no-motion, press, bulk-tag, visibility, sidebar-drop, hidden-blocks, slash-menu: 0 failures except keys-no-motion webkit-1440 settings (Control+,), a flake (fails on 845/877/904 runs and passes on rerun, also on #854/#861).

First paint vs dev: +1162 / +1363 B, CSS +55 (rows slice 3: sidebar drag-and-drop and hide-from-sidebar in the entry on top of #877). Budget total 536.13 KiB. Gate clean.

## Head `018486e59`: over dev on first paint, kayg's call **Design merge with Sharing (#842/#876) and dev `4274dafb4` (rusqlite 0.41, restore detection, #1044 frame fixes, #1048 lifecycle ids).** Done once in the rows base (#875), carried up by merges: - `write_executor/home.rs`: `run_note_write(plan, undo_of, caller)` takes both the rows undo key and Sharing's caller; plain writes pass `(None, None)`, `execute_note_write_for` passes the caller, undo passes its key. - `crates/notes/src/actions.rs`: `shared::actions` and `visibility::actions` are both chained. `contracts/actions.json` is the union (`notes.hide`/`archive`/`unarchive`/`unhide` and `notes.hide-shared` side by side; `actions.gen.ts` regenerated with `action-types.mjs --check`). - `crates/search/src/index.rs`: dev's hand-opened read snapshot (rusqlite 0.41) plus the foreground gauge. - Web: `NoteList`, `lists.ts`, `sidebar.svelte.ts`, `actions.ts` keep both the Archived and the Shared with me lists; Show hidden does not add your own hidden notes to Shared with me; `lists.ts` reads `store.list(key)` (#1030) for Archived/Pinned/tags. - #904: its duplicated copy of the backend is replaced by the rows branch's, so there is one backend; its own web commits are untouched. **Checks on dev-02 (aarch64), PR-built backend:** `cargo test -p calternal-notes` 623 passed (one run had `typing_during_a_tag_rename_is_kept` fail while WebKit specs loaded the host; it passes 3/3 alone on this head and on dev), `calternal-auth` isolation 3, `calternal` isolation 40, `calternal-server` access 1, **admin-sharing 11 passed in both chromium projects on #878 and #904** (including the new trash/restore test). Specs, 4 projects: preload, lazy-ui, lazy-offline, glass, shortcuts, keys-no-motion, press, bulk-tag, visibility, sidebar-drop, hidden-blocks, slash-menu: 0 failures except `keys-no-motion` webkit-1440 `settings (Control+,)`, a flake (fails on 845/877/904 runs and passes on rerun, also on #854/#861). First paint vs dev: **+1162 / +1363 B**, CSS +55 (rows slice 3: sidebar drag-and-drop and hide-from-sidebar in the entry on top of #877). Budget total 536.13 KiB. Gate clean.
Author
Owner

Handoff: head 018486e59 pushed; waiting on kayg's first-paint decision

Rows slice 3 is over dev by +1162 / +1363 B (sidebar drag and hide-from-sidebar in the entry, on top of #877). Same decision as on #877; the next step after it is merge order #875, #877, #878, then #904 (drop the duplicate show icon in hidden-ui.ts when #877 is in).

## Handoff: head `018486e59` pushed; waiting on kayg's first-paint decision Rows slice 3 is over dev by +1162 / +1363 B (sidebar drag and hide-from-sidebar in the entry, on top of #877). Same decision as on #877; the next step after it is merge order #875, #877, #878, then #904 (drop the duplicate `show` icon in `hidden-ui.ts` when #877 is in).
Some checks failed
CI / server (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
CI / web (pull_request) Has been cancelled
Markdown extraction contract / markdown-native-contract (pull_request) Has been cancelled
Markdown extraction contract / markdown-editor-contract (pull_request) Has been cancelled
This pull request is broken due to missing fork information.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin port/rows-drop:port/rows-drop
git switch port/rows-drop

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch port/rows-actions
git merge --no-ff port/rows-drop
git switch port/rows-drop
git rebase port/rows-actions
git switch port/rows-actions
git merge --ff-only port/rows-drop
git switch port/rows-drop
git rebase port/rows-actions
git switch port/rows-actions
git merge --no-ff port/rows-drop
git switch port/rows-actions
git merge --squash port/rows-drop
git switch port/rows-actions
git merge --ff-only port/rows-drop
git switch port/rows-actions
git merge port/rows-drop
git push origin port/rows-actions
Sign in to join this conversation.
No reviewers
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!878
No description provided.