Tasks Board: live drop preview while dragging over a column #1118

Open
opened 2026-10-05 07:46:54 +00:00 by kayg · 27 comments
Owner

Owner report (2026-10-05, Tasks Board)

"When I drag, hold and hover a Task item over another column, I should get a preview of what it would look like in that column." Today the dragged card floats over the target column on top of its "No tasks" text, with a stray translucent rectangle behind it, and the column does not react.

Wanted: while dragging over a column, the column shows a drop placeholder at the exact insertion point, rendered as the card would look in that column (status styling, position among existing cards); other cards make room with the shared spring; the empty-state text hides while a placeholder shows. Drop commits; Escape cancels and springs back. Same for keyboard moves (preview as focus moves across columns) and touch long-press drag. Reduced motion: no springs, instant placeholder.

## Owner report (2026-10-05, Tasks Board) "When I drag, hold and hover a Task item over another column, I should get a preview of what it would look like in that column." Today the dragged card floats over the target column on top of its "No tasks" text, with a stray translucent rectangle behind it, and the column does not react. Wanted: while dragging over a column, the column shows a drop placeholder at the exact insertion point, rendered as the card would look in that column (status styling, position among existing cards); other cards make room with the shared spring; the empty-state text hides while a placeholder shows. Drop commits; Escape cancels and springs back. Same for keyboard moves (preview as focus moves across columns) and touch long-press drag. Reduced motion: no springs, instant placeholder.
Author
Owner

Started work on job/kbpreview-1118, based on d1b8371f577ecff6d6b499e24c8c147e300ff71a.

Started work on `job/kbpreview-1118`, based on `d1b8371f577ecff6d6b499e24c8c147e300ff71a`.
Author
Owner

Finding: TaskColumn.svelte only calls preventDefault() during dragover; it stores no hover lane or insertion point and still renders No tasks for an empty destination. The existing vendored svelte-dnd-action is already used by Settings and supports touch and keyboard; I will adapt it for Task Board lanes and render its shadow item as the live TaskCard preview.

Finding: `TaskColumn.svelte` only calls `preventDefault()` during `dragover`; it stores no hover lane or insertion point and still renders `No tasks` for an empty destination. The existing vendored `svelte-dnd-action` is already used by Settings and supports touch and keyboard; I will adapt it for Task Board lanes and render its shadow item as the live TaskCard preview.
Author
Owner

Post-merge finding: bun run check stops in perf-lint at the exception for apps/web/src/lib/notes/NotesExplorer.svelte#each:3c7baf2164751d7e:1 ("unused or changed exception"). That Notes Explorer file is outside this Task Board issue. I will report the exact gate output and continue with the focused test and production browser flow.

Post-merge finding: `bun run check` stops in `perf-lint` at the exception for `apps/web/src/lib/notes/NotesExplorer.svelte#each:3c7baf2164751d7e:1` ("unused or changed exception"). That Notes Explorer file is outside this Task Board issue. I will report the exact gate output and continue with the focused test and production browser flow.
Author
Owner

Finding: merging current origin/dev (929a2627f5) into job/kbpreview-1118 required resolving ItemActionMenu.svelte. origin/dev added shared Delete and extra-action routing while this branch needs async Task status callbacks. The merge keeps the incoming action behavior and preserves Promise status support. Merge commit: d5a9b79dd.

Finding: merging current origin/dev (929a2627f518b5ab946da207c5fc11bbdc9040bb) into job/kbpreview-1118 required resolving ItemActionMenu.svelte. origin/dev added shared Delete and extra-action routing while this branch needs async Task status callbacks. The merge keeps the incoming action behavior and preserves Promise<void> status support. Merge commit: d5a9b79dd.
Author
Owner

Finding: bun run check stops at perf-lint --check before Svelte checks. It reports 13 over-budget exception entries across the upstream ratchet (21977 entries versus ceiling 21964); this branch has no contracts/perf/* changes relative to origin/dev. The earlier Notes Explorer exception finding is superseded by this newer upstream ratchet failure. I will continue the focused build and e2e verification.

Finding: `bun run check` stops at `perf-lint --check` before Svelte checks. It reports 13 over-budget exception entries across the upstream ratchet (21977 entries versus ceiling 21964); this branch has no `contracts/perf/*` changes relative to origin/dev. The earlier Notes Explorer exception finding is superseded by this newer upstream ratchet failure. I will continue the focused build and e2e verification.
Author
Owner

Verification finding: the first production e2e launch stopped before browser startup because Nix Bun could not resolve the host libstdc++.so.6. The library is present under /usr/lib; exposing only that file from target/tmp/cxxlib (without overriding the host glibc path) makes the installed sharp module load. I will rerun the e2e with this local environment setting; no package or repo change is needed.

Verification finding: the first production e2e launch stopped before browser startup because Nix Bun could not resolve the host libstdc++.so.6. The library is present under /usr/lib; exposing only that file from target/tmp/cxxlib (without overriding the host glibc path) makes the installed sharp module load. I will rerun the e2e with this local environment setting; no package or repo change is needed.
Author
Owner

Finding: the production Tasks e2e reaches keyboard movement but fails at the pre-drop preview assertion: after Space then Tab, Task a06dea78-d92e-42e4-9457-e1e04f92ebf1 is not rendered in Doing within 3 seconds. No Status write is asserted yet. I am tracing the shared DnD keyboard event path; this is the requested keyboard preview behavior, not a changed test expectation.

Finding: the production Tasks e2e reaches keyboard movement but fails at the pre-drop preview assertion: after Space then Tab, Task `a06dea78-d92e-42e4-9457-e1e04f92ebf1` is not rendered in Doing within 3 seconds. No Status write is asserted yet. I am tracing the shared DnD keyboard event path; this is the requested keyboard preview behavior, not a changed test expectation.
Author
Owner

Finding resolved: after Space starts a Board drag, Tab was visiting each Task card’s checkbox, link and action menu before the next lane. TaskColumn now makes card controls and Add task inert only for the active drag, while keeping the row as the DnD focus target. The focused regression suite passes (3 tests); the production e2e will verify the lane focus and commit path.

Finding resolved: after Space starts a Board drag, Tab was visiting each Task card’s checkbox, link and action menu before the next lane. TaskColumn now makes card controls and Add task inert only for the active drag, while keeping the row as the DnD focus target. The focused regression suite passes (3 tests); the production e2e will verify the lane focus and commit path.
Author
Owner

The second production run still failed at the same keyboard preview locator. The new wrapper had made the Task article cease to be the direct child of the shared DnD zone, so the existing keyboard flow did not focus its drag row. I moved inert state inside TaskCard’s body and kept the article as the DnD child; I will rerun the focused test and production flow.

The second production run still failed at the same keyboard preview locator. The new wrapper had made the Task article cease to be the direct child of the shared DnD zone, so the existing keyboard flow did not focus its drag row. I moved inert state inside TaskCard’s body and kept the article as the DnD child; I will rerun the focused test and production flow.
Author
Owner

Finding: the latest production run now shows the Task preview in Doing after Space and Tab. Enter on the focused lane does not commit, because the vendored DnD action handles its trigger keys only on draggable rows. I will extend that shared handler to drop when the active lane itself has focus, then rerun the production flow.

Finding: the latest production run now shows the Task preview in Doing after Space and Tab. Enter on the focused lane does not commit, because the vendored DnD action handles its trigger keys only on draggable rows. I will extend that shared handler to drop when the active lane itself has focus, then rerun the production flow.
Author
Owner

Finding: after the keyboard preview/Enter commit/Escape cancel/Undo checks pass, the production pointer flow renders a preview in Doing but the indexed Task Status remains todo after release. The failure is at apps/web/e2e/tasks.mjs:524; I am tracing pointer DnD finalize events before changing the writer path.

Finding: after the keyboard preview/Enter commit/Escape cancel/Undo checks pass, the production pointer flow renders a preview in Doing but the indexed Task Status remains `todo` after release. The failure is at `apps/web/e2e/tasks.mjs:524`; I am tracing pointer DnD finalize events before changing the writer path.
Author
Owner

E2E findings: the pointer test started in the blank part of a Task row, where a settling row could cover the intended source. The hit-test showed the List-composer Task at the pointer while the test expected Move card proof. The helper now starts at the title and waits until that title is the topmost hit target. With that check, the real production run sent PATCH status=doing for the intended Task and the fresh Task index read observed doing. The run then exposed a harness permission issue: routeCurrentBuild replaces the context grants when it receives the loopback origin grant, so tasks.mjs now passes its clipboard permissions through the helper's explicit permissions option.

E2E findings: the pointer test started in the blank part of a Task row, where a settling row could cover the intended source. The hit-test showed the List-composer Task at the pointer while the test expected Move card proof. The helper now starts at the title and waits until that title is the topmost hit target. With that check, the real production run sent PATCH status=doing for the intended Task and the fresh Task index read observed doing. The run then exposed a harness permission issue: routeCurrentBuild replaces the context grants when it receives the loopback origin grant, so tasks.mjs now passes its clipboard permissions through the helper's explicit permissions option.
Author
Owner

Finding: the production Tasks flow passed its pointer, keyboard and real touch drop/Undo assertions and captured the full screenshot matrix, but the final browser error check caught state_unsafe_mutation while opening the Task action menu. The stack resolves to TooltipLayer's document focusout listener: Svelte may dispatch that event during DOM reconciliation, and the handler immediately changed rune state. I have deferred the hide update to a microtask and will rerun the production build flow.

Finding: the production Tasks flow passed its pointer, keyboard and real touch drop/Undo assertions and captured the full screenshot matrix, but the final browser error check caught `state_unsafe_mutation` while opening the Task action menu. The stack resolves to TooltipLayer's document `focusout` listener: Svelte may dispatch that event during DOM reconciliation, and the handler immediately changed rune state. I have deferred the hide update to a microtask and will rerun the production build flow.
Author
Owner

Production E2E screenshots are attached: 18 before/preview/after frames from the production SPA, with macOS rendering, in light and dark at 390, 820 and 1440 px.

The production E2E passed the Board drag, keyboard preview/cancel/commit, touch long-press drop/Undo, screenshot matrix and final browser-error check. CSP reports: 0.

Production E2E screenshots are attached: 18 before/preview/after frames from the production SPA, with macOS rendering, in light and dark at 390, 820 and 1440 px. - 390 px — Paper: [before](https://git.kayg.org/attachments/e90e464e-29c4-4851-9977-7338e121e95b), [preview](https://git.kayg.org/attachments/6c1c7f59-e865-4168-8ec7-36b8b8b28d11), [after drop](https://git.kayg.org/attachments/d7ac2809-3c65-4342-9240-5a627af5de3c); Tokyo Night: [before](https://git.kayg.org/attachments/7223b10d-a50b-4b1d-8b2f-cd10375ebb25), [preview](https://git.kayg.org/attachments/01a99347-b937-432c-8a1e-75cc89eebeb2), [after drop](https://git.kayg.org/attachments/17480ce6-3b6c-4448-9225-f58672b7f644). - 820 px — Paper: [before](https://git.kayg.org/attachments/eb76a617-782f-495c-ac10-3c73f3ac1cbd), [preview](https://git.kayg.org/attachments/59c68f50-872e-4efa-b705-776a9cda26ce), [after drop](https://git.kayg.org/attachments/c3f3fffa-daa4-4378-bb0d-466c77ea107d); Tokyo Night: [before](https://git.kayg.org/attachments/f88ec403-454a-4ee3-8bab-11cf9a29ceb0), [preview](https://git.kayg.org/attachments/d4596cf6-1711-4493-ad8b-fefaf1bc18cb), [after drop](https://git.kayg.org/attachments/129303a9-9a26-45b3-866c-d792f2ab5955). - 1440 px — Paper: [before](https://git.kayg.org/attachments/ae0b9f79-e062-41c8-95e2-fcb013fdaee9), [preview](https://git.kayg.org/attachments/0cd63e32-2d5a-4e55-bf2f-7b3c777bcc67), [after drop](https://git.kayg.org/attachments/d165b9ce-c36a-4cd1-a4fd-02ad3085809d); Tokyo Night: [before](https://git.kayg.org/attachments/fd1eeb70-af50-4e17-ac11-767c77d3ad48), [preview](https://git.kayg.org/attachments/2cc0758b-6229-4197-8fc6-09805db1ec9e), [after drop](https://git.kayg.org/attachments/4e82a9f5-f277-405f-aa3e-22ea49d62842). The production E2E passed the Board drag, keyboard preview/cancel/commit, touch long-press drop/Undo, screenshot matrix and final browser-error check. CSP reports: 0.
Author
Owner

Perf finding: the Tasks UI profile could not reach its route measurements on the shared release server. With the production SPA and release binary bff78498, the real Notes API seed created 2,476 of 10,000 Tasks in 54m18s (about 46 Tasks/minute average, with lower progress near the end). The server used 272,568 KiB RSS and averaged 71.2% CPU over the process lifetime at stop; the browser renderer used 217,628 KiB and averaged 80.8%. Since route sampling starts only after the full seed, this run produced no route p50/p95, burst, or route RSS metrics. I stopped it under /root/perf.lock instead of holding the single-tenant VM for the remaining seed. I did not add an incomplete route record to docs/perf/baseline.json.

Perf finding: the Tasks UI profile could not reach its route measurements on the shared release server. With the production SPA and release binary `bff78498`, the real Notes API seed created 2,476 of 10,000 Tasks in 54m18s (about 46 Tasks/minute average, with lower progress near the end). The server used 272,568 KiB RSS and averaged 71.2% CPU over the process lifetime at stop; the browser renderer used 217,628 KiB and averaged 80.8%. Since route sampling starts only after the full seed, this run produced no route p50/p95, burst, or route RSS metrics. I stopped it under `/root/perf.lock` instead of holding the single-tenant VM for the remaining seed. I did not add an incomplete route record to `docs/perf/baseline.json`.
Author
Owner

READY FOR MERGE: no

The UI work and focused regression checks pass. The web check stops at the origin/dev perf-lint exception ratchet before it reaches Svelte checks. The Tasks performance profile also did not reach route measurements.

Built

  • Board drops now show a live Task card at the destination insertion point. The preview uses the destination Status styling, updates the lane count, hides the empty-state text, and makes other cards yield with the shared spring. Reduced motion keeps the placeholder immediate.
  • Pointer, keyboard and touch long-press drops use the shared DnD action and the Notes writer. Escape cancels pointer and keyboard previews. Keyboard movement commits on Enter. Failed writes return to the unchanged source state. Status changes offer Undo.
  • The dragged Task stays a keyboard focus target while nested controls are inert. The preview is inert and hidden from assistive technology to avoid duplicate Task announcements.
  • Fixed a production state_unsafe_mutation error when opening a Task menu moves focus during Svelte reconciliation.

UX gaps closed

Pointer preview, keyboard preview and Enter commit, Escape rollback, touch long-press drop, empty-lane state, live counts, Undo, reduced motion and production API response checks are covered. Production screenshots cover 390, 820 and 1440 px in light and dark themes with macOS platform emulation. Eighteen screenshots are attached to this issue.

UX gaps left

None found for this issue's acceptance behavior. The Tasks performance profile gap is listed below.

Decisions not covered by DESIGN

  • Keep the preview card inert and aria-hidden while the source Task remains the active DnD item. This prevents duplicate focus and announcements.
  • Add a narrow adapter to the vendored DnD action so pointer Escape restores the source shadow. The action had no pointer-cancel API. Keyboard Escape keeps the action's keyboard path.
  • Keep the preview until the server status write settles. A rejected write then leaves the source Task and lane state intact.

Files

TaskBoard.svelte, TaskColumn.svelte, TaskCard.svelte, TasksWorkspace.svelte, ItemActionMenu.svelte, the vendored svelte-dnd-action source/types/README, TooltipLayer.svelte, the Tasks E2E and component tests, and the Tasks performance profile/README.

Checks

Production bun run build passed. Focused Vitest passed:

 RUN  v5.0.1 /home/kayg/Developer/calternal-wt/kbpreview-1118/apps/web


 Test Files  2 passed (2)
      Tests  12 passed (12)
   Start at  16:04:51
   Duration  12.62s (transform 85%, environment 6%, import 6%, tests 2%, setup 1%)

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

Production E2E passed:

tasks e2e: composer, per-layout and per-lane Add task, Board drag, phone layout menu, touch actions, live Bases file edit, and screenshots passed in /home/kayg/Developer/calternal-wt/kbpreview-1118/artifacts/tasks-1118
CSP REPORTS tasks: 0 across 2 pages

bun run check output:

$ ../../scripts/perf-lint --check && node scripts/check-user-storage.mjs && node scripts/check-glass-tokens.mjs && node scripts/check-type-tokens.mjs && node scripts/check-focus-tokens.mjs && node scripts/check-motion-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json
perf-lint: INVALID: exception ratchet: contract.blaze: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.blocked-network: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; contract.dom-bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.model-bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.row-identity: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.snapshot: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; coverage.profile: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; coverage.readiness: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; io.unresolved-call: 16191 exceptions exceed the ratchet ceiling 16190; fix the new violation instead; render.blaze-adapter: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.model_byte_cap: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.model_row_cap: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; total: ledger has 21977 exceptions; ratchet total is 21964

No Rust code changed, so Rust gates were not needed. Cleanup output:

Removed 8626 files, 7.2GiB total

Performance profile gap

The locked perf-test run used the production SPA and shared release server bff78498. It seeded 2,476 of 10,000 Tasks in 54m18s (about 46 Tasks/minute average; progress slowed near the end). At stop, the server process showed 272,568 KiB RSS and 71.2% lifetime CPU; the browser renderer showed 217,628 KiB RSS and 80.8% lifetime CPU. Load average inside the lock at stop was 2.30 2.31 2.28.

The profile starts route sampling only after all 10,000 Tasks are seeded. I stopped it under the lock rather than hold the single-tenant VM for the remaining seed. It produced no route p50/p95, burst, or route CPU/RSS results, so I did not add an incomplete route record to docs/perf/baseline.json.

Commits

Head: c538ee149ce5c36e3bb23ad82a4cbed585b55de9.

## READY FOR MERGE: no The UI work and focused regression checks pass. The web check stops at the `origin/dev` perf-lint exception ratchet before it reaches Svelte checks. The Tasks performance profile also did not reach route measurements. ## Built - Board drops now show a live Task card at the destination insertion point. The preview uses the destination Status styling, updates the lane count, hides the empty-state text, and makes other cards yield with the shared spring. Reduced motion keeps the placeholder immediate. - Pointer, keyboard and touch long-press drops use the shared DnD action and the Notes writer. Escape cancels pointer and keyboard previews. Keyboard movement commits on Enter. Failed writes return to the unchanged source state. Status changes offer Undo. - The dragged Task stays a keyboard focus target while nested controls are inert. The preview is inert and hidden from assistive technology to avoid duplicate Task announcements. - Fixed a production `state_unsafe_mutation` error when opening a Task menu moves focus during Svelte reconciliation. ## UX gaps closed Pointer preview, keyboard preview and Enter commit, Escape rollback, touch long-press drop, empty-lane state, live counts, Undo, reduced motion and production API response checks are covered. Production screenshots cover 390, 820 and 1440 px in light and dark themes with macOS platform emulation. Eighteen screenshots are attached to this issue. ## UX gaps left None found for this issue's acceptance behavior. The Tasks performance profile gap is listed below. ## Decisions not covered by DESIGN - Keep the preview card inert and `aria-hidden` while the source Task remains the active DnD item. This prevents duplicate focus and announcements. - Add a narrow adapter to the vendored DnD action so pointer Escape restores the source shadow. The action had no pointer-cancel API. Keyboard Escape keeps the action's keyboard path. - Keep the preview until the server status write settles. A rejected write then leaves the source Task and lane state intact. ## Files `TaskBoard.svelte`, `TaskColumn.svelte`, `TaskCard.svelte`, `TasksWorkspace.svelte`, `ItemActionMenu.svelte`, the vendored `svelte-dnd-action` source/types/README, `TooltipLayer.svelte`, the Tasks E2E and component tests, and the Tasks performance profile/README. ## Checks Production `bun run build` passed. Focused Vitest passed: ```text RUN v5.0.1 /home/kayg/Developer/calternal-wt/kbpreview-1118/apps/web Test Files 2 passed (2) Tests 12 passed (12) Start at 16:04:51 Duration 12.62s (transform 85%, environment 6%, import 6%, tests 2%, setup 1%) Transform |component| transforming modules took 9.82s · 79% of tracked time, re-done on every run persist transforms across reruns with fsModuleCache: true learn more: https://vitest.dev/guide/improving-performance#caching-between-reruns ``` Production E2E passed: ```text tasks e2e: composer, per-layout and per-lane Add task, Board drag, phone layout menu, touch actions, live Bases file edit, and screenshots passed in /home/kayg/Developer/calternal-wt/kbpreview-1118/artifacts/tasks-1118 CSP REPORTS tasks: 0 across 2 pages ``` `bun run check` output: ```text $ ../../scripts/perf-lint --check && node scripts/check-user-storage.mjs && node scripts/check-glass-tokens.mjs && node scripts/check-type-tokens.mjs && node scripts/check-focus-tokens.mjs && node scripts/check-motion-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json perf-lint: INVALID: exception ratchet: contract.blaze: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.blocked-network: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; contract.dom-bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.model-bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.row-identity: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.snapshot: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; coverage.profile: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; coverage.readiness: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; io.unresolved-call: 16191 exceptions exceed the ratchet ceiling 16190; fix the new violation instead; render.blaze-adapter: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.model_byte_cap: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.model_row_cap: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; total: ledger has 21977 exceptions; ratchet total is 21964 ``` No Rust code changed, so Rust gates were not needed. Cleanup output: ```text Removed 8626 files, 7.2GiB total ``` ## Performance profile gap The locked perf-test run used the production SPA and shared release server `bff78498`. It seeded 2,476 of 10,000 Tasks in 54m18s (about 46 Tasks/minute average; progress slowed near the end). At stop, the server process showed 272,568 KiB RSS and 71.2% lifetime CPU; the browser renderer showed 217,628 KiB RSS and 80.8% lifetime CPU. Load average inside the lock at stop was `2.30 2.31 2.28`. The profile starts route sampling only after all 10,000 Tasks are seeded. I stopped it under the lock rather than hold the single-tenant VM for the remaining seed. It produced no route p50/p95, burst, or route CPU/RSS results, so I did not add an incomplete route record to `docs/perf/baseline.json`. ## Commits Head: `c538ee149ce5c36e3bb23ad82a4cbed585b55de9`.
Author
Owner

Correction to the focused Vitest transcript in my final report: the exact hint line was persist transforms across runs with fsModuleCache: true (the report said “reruns”). The recorded result remains 2 files and 12 tests passed.

Correction to the focused Vitest transcript in my final report: the exact hint line was `persist transforms across runs with fsModuleCache: true` (the report said “reruns”). The recorded result remains 2 files and 12 tests passed.
Author
Owner

Orchestrator review of artifacts/tasks-1118/1440-paper-drag-hovering-column.png: the drop placeholder is right. Fix before merge:

  1. Source gap: while the card hovers another column, its old slot in the source column stays as an empty hole (To do shows a blank space between its two cards). When the pointer leaves the source column, the source cards close the gap with the shared spring; moving back reopens it at the insertion point. Reduced motion: no animation, same layout.
  2. Counts: column counts change only on drop (Waiting shows 1 while merely hovering). Keep the live placeholder, not the count.
  3. Merge origin/dev first: your base predates batches 6–15 (Delete/Undo menus on Task cards, + button work pending, Calendar header etc.). Keep dev's Task card actions. perf-lint is being fixed on dev (#1133), so the ratchet failure is not yours; the route-profile gap: add the Board drag profile to bench if missing, do not block on it.
  4. Retake: drag over another column, over the source column, and drop, at 1440/820 (pointer) and 390 (touch long-press), light + dark; 4x crop of the placeholder vs a real card (same padding, radius, title baseline).
    Commit; comment on #1118 with head SHA. Do not push.
Orchestrator review of artifacts/tasks-1118/1440-paper-drag-hovering-column.png: the drop placeholder is right. Fix before merge: 1. **Source gap:** while the card hovers another column, its old slot in the source column stays as an empty hole (To do shows a blank space between its two cards). When the pointer leaves the source column, the source cards close the gap with the shared spring; moving back reopens it at the insertion point. Reduced motion: no animation, same layout. 2. **Counts:** column counts change only on drop (Waiting shows 1 while merely hovering). Keep the live placeholder, not the count. 3. **Merge origin/dev** first: your base predates batches 6–15 (Delete/Undo menus on Task cards, + button work pending, Calendar header etc.). Keep dev's Task card actions. perf-lint is being fixed on dev (#1133), so the ratchet failure is not yours; the route-profile gap: add the Board drag profile to bench if missing, do not block on it. 4. Retake: drag over another column, over the source column, and drop, at 1440/820 (pointer) and 390 (touch long-press), light + dark; 4x crop of the placeholder vs a real card (same padding, radius, title baseline). Commit; comment on #1118 with head SHA. Do not push.
Author
Owner

Starting kbpreview2-1118 on branch job/kbpreview-1118, base HEAD c538ee149c. I am merging origin/dev first as requested, then I will address source-column spacing and live counts while preserving dev's Task card actions.

Starting kbpreview2-1118 on branch job/kbpreview-1118, base HEAD c538ee149ce5c36e3bb23ad82a4cbed585b55de9. I am merging origin/dev first as requested, then I will address source-column spacing and live counts while preserving dev's Task card actions.
Author
Owner

Finding: bun run check still stops at perf-lint --check before Svelte checks. The exact blocker is the upstream exception ratchet (21,977 entries versus ceiling 21,964, across 13 categories); contracts/perf/ is unchanged from origin/dev. This matches the ratchet issue already recorded during the earlier #1118 work. The focused Task Board suite passes 4 tests. bench/tasks-ui/run.sh already profiles Board hover previews, so there is no missing Board drag profile to add.

Finding: `bun run check` still stops at `perf-lint --check` before Svelte checks. The exact blocker is the upstream exception ratchet (21,977 entries versus ceiling 21,964, across 13 categories); `contracts/perf/` is unchanged from `origin/dev`. This matches the ratchet issue already recorded during the earlier #1118 work. The focused Task Board suite passes 4 tests. `bench/tasks-ui/run.sh` already profiles Board hover previews, so there is no missing Board drag profile to add.
Author
Owner

Finding: the first production E2E run stopped before drag checks at apps/web/e2e/tasks.mjs while waiting for the header Add task button. The clean merge from origin/dev changes that header action's accessible name to New task in TasksWorkspace.svelte; the + row actions keep their own labels. I am updating only this stale E2E selector before rerunning.

Finding: the first production E2E run stopped before drag checks at `apps/web/e2e/tasks.mjs` while waiting for the header `Add task` button. The clean merge from `origin/dev` changes that header action's accessible name to `New task` in `TasksWorkspace.svelte`; the + row actions keep their own labels. I am updating only this stale E2E selector before rerunning.
Author
Owner

Finding: the production run generated 390 px light/dark and 820 px light/dark frames, plus 1440 px Paper before/target-hover/source-hover/drop and the 4× crop. It then failed at the screenshot helper's Undo assertion: the indexed Task still had Status waiting after the click. The helper currently composites the 4× images before the click, which can consume the short Undo window on the shared host. I am moving only that image processing after the click and will assert the inverse Status response directly.

Finding: the production run generated 390 px light/dark and 820 px light/dark frames, plus 1440 px Paper before/target-hover/source-hover/drop and the 4× crop. It then failed at the screenshot helper's Undo assertion: the indexed Task still had Status `waiting` after the click. The helper currently composites the 4× images before the click, which can consume the short Undo window on the shared host. I am moving only that image processing after the click and will assert the inverse Status response directly.
Author
Owner

Finished: kbpreview2-1118

Head: 3135033f419d720101f72edcc0e362529e82addf (job/kbpreview-1118). The branch includes the requested merge of origin/dev at a493c314edfd40027a72e0d7fc1cb97fa69b1eb9.
The shared origin/dev tracking ref later advanced to d57992dea77a5c031b1494fe9e5b608505b707e8; I did not perform a second fetch/merge under the once-only merge rule. The merge round should reconcile current dev.

Built

  • A cross-lane drag closes the Task's source slot while the live placeholder is in another lane. Returning to the source restores the placeholder at its current insertion point. Shared FLIP motion animates the reflow; reduced motion uses the same layout without animation.
  • Lane counts follow indexed Task rows. A preview changes layout only; the count changes after the status write updates Task data.
  • Kept the Task card actions from origin/dev. Updated the production E2E to use the current “New task” header action and to finish Undo checks before making the 4× crops.
  • The existing bench/tasks-ui profile already exercises Board hover previews (10,000 Tasks, eight cancelled previews, route metrics and a 24-client burst). No duplicate profile was needed; no performance run was made for this non-performance issue.

UX gaps closed

  • Source-lane gap closure and insertion-point restoration during preview.
  • Stable real Task counts during drag preview.
  • Production E2E checks source hover, destination hover, drop, and the Undo status reversal.

UX gaps left

  • bun run check is blocked before Svelte checks by the unchanged origin/dev perf-lint exception ratchet (21,977 exceptions vs. 21,964). At the time of this check, contracts/perf matched the merged origin/dev base (a493c314).
  • Svelte reports four existing CSS warnings in three files; it reports zero errors.
  • Performance numbers were not collected. The task profile exists and can be run by the performance job.

Screenshots

All 28 screenshots are attached to this issue. The Playwright run emulates macOS. 390 px captures use touch long-press; 820 px and 1440 px captures use pointer drag. “Paper” is light mode and “Tokyo Night” is dark mode.

Width and theme Before Target lane hover Source lane hover Dropped 4× crop
1440 Paper PNG PNG PNG PNG PNG
1440 Tokyo Night PNG PNG PNG PNG PNG
820 Paper PNG PNG PNG PNG —
820 Tokyo Night PNG PNG PNG PNG —
390 Paper PNG PNG PNG PNG PNG
390 Tokyo Night PNG PNG PNG PNG PNG

Gates

bunx vitest run src/lib/tasks/TaskBoard.svelte.test.ts --maxWorkers=2:

 RUN  v5.0.1 /home/kayg/Developer/calternal-wt/kbpreview-1118/apps/web

 Test Files  1 passed (1)
      Tests  4 passed (4)
  Start at  19:55:30
  Duration  35.74s (transform 82%, import 7%, environment 5%, tests 3%, setup 3%)

   Transform  |component| transforming modules took 28.94s · 82% 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-runs

bun run check stopped at the existing ratchet:

$ ../../scripts/perf-lint --check && node scripts/check-user-storage.mjs && node scripts/check-glass-tokens.mjs && node scripts/check-type-tokens.mjs && node scripts/check-focus-tokens.mjs && node scripts/check-motion-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json
perf-lint: INVALID: exception ratchet: contract.blaze: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.blocked-network: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; contract.dom-bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.model-bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.row-identity: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.snapshot: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; coverage.profile: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; coverage.readiness: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; io.unresolved-call: 16191 exceptions exceed the ratchet ceiling 16190; fix the new violation instead; render.blaze-adapter: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.model_byte_cap: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.model_row_cap: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; total: ledger has 21977 exceptions; ratchet total is 21964

bunx svelte-check --tsconfig ./tsconfig.json output:

svelte-check found 0 errors and 4 warnings in 3 files

The four warnings are the two empty CSS rulesets in AttachmentDeck.svelte and AgendaList.svelte, plus the unused .note-page-lede and .note-state selectors in routes/notes/+page.svelte.

bun run build exited successfully; output included:

Compressed 887 static variants; saved 20921688 bytes.

node --check apps/web/e2e/tasks.mjs and git diff --check origin/dev..HEAD passed with no output.

Production E2E output:

tasks e2e: composer, per-layout and per-lane Add task, destination/source Board drag previews, phone layout menu, touch actions, live Bases file edit, and screenshots passed in /home/kayg/Developer/calternal-wt/kbpreview-1118/artifacts/tasks-1118
CSP REPORTS tasks: 0 across 2 pages

No Rust source changed, so no crate gates were run. Cleanup output:

Removed 8633 files, 7.2GiB total

Decisions

No additional design choice beyond the issue brief: Task counts remain tied to indexed Task data while the local placeholder drives layout. The existing Tasks UI benchmark already covers Board hover previews.

## Finished: kbpreview2-1118 Head: `3135033f419d720101f72edcc0e362529e82addf` (`job/kbpreview-1118`). The branch includes the requested merge of `origin/dev` at `a493c314edfd40027a72e0d7fc1cb97fa69b1eb9`. The shared `origin/dev` tracking ref later advanced to `d57992dea77a5c031b1494fe9e5b608505b707e8`; I did not perform a second fetch/merge under the once-only merge rule. The merge round should reconcile current `dev`. ### Built - A cross-lane drag closes the Task's source slot while the live placeholder is in another lane. Returning to the source restores the placeholder at its current insertion point. Shared FLIP motion animates the reflow; reduced motion uses the same layout without animation. - Lane counts follow indexed Task rows. A preview changes layout only; the count changes after the status write updates Task data. - Kept the Task card actions from `origin/dev`. Updated the production E2E to use the current “New task” header action and to finish Undo checks before making the 4× crops. - The existing `bench/tasks-ui` profile already exercises Board hover previews (10,000 Tasks, eight cancelled previews, route metrics and a 24-client burst). No duplicate profile was needed; no performance run was made for this non-performance issue. ### UX gaps closed - Source-lane gap closure and insertion-point restoration during preview. - Stable real Task counts during drag preview. - Production E2E checks source hover, destination hover, drop, and the Undo status reversal. ### UX gaps left - `bun run check` is blocked before Svelte checks by the unchanged `origin/dev` perf-lint exception ratchet (21,977 exceptions vs. 21,964). At the time of this check, `contracts/perf` matched the merged `origin/dev` base (`a493c314`). - Svelte reports four existing CSS warnings in three files; it reports zero errors. - Performance numbers were not collected. The task profile exists and can be run by the performance job. ### Screenshots All 28 screenshots are attached to this issue. The Playwright run emulates macOS. 390 px captures use touch long-press; 820 px and 1440 px captures use pointer drag. “Paper” is light mode and “Tokyo Night” is dark mode. | Width and theme | Before | Target lane hover | Source lane hover | Dropped | 4× crop | | --- | --- | --- | --- | --- | --- | | 1440 Paper | [PNG](https://git.kayg.org/attachments/5443b46e-338b-4d2b-983e-acf05d187e1d) | [PNG](https://git.kayg.org/attachments/a7f3a1a8-3fed-49e7-873b-4a0d364ce50d) | [PNG](https://git.kayg.org/attachments/2a473335-6b27-4b41-ba84-0fd4c37f31af) | [PNG](https://git.kayg.org/attachments/49a741bb-a8c7-40d8-9bb1-f54439183b9d) | [PNG](https://git.kayg.org/attachments/7668e448-be5f-44a3-839a-e01f82a327f2) | | 1440 Tokyo Night | [PNG](https://git.kayg.org/attachments/91a942c5-bd82-42cc-ba30-b28ce1b512a3) | [PNG](https://git.kayg.org/attachments/41265f13-0e15-4715-802e-9aec07269e58) | [PNG](https://git.kayg.org/attachments/9be99d23-8e5d-40da-8ab3-ca8914632c0f) | [PNG](https://git.kayg.org/attachments/e269be74-d932-42f2-87a3-575e3c59ee09) | [PNG](https://git.kayg.org/attachments/3c6812a4-cb7f-4c54-a80b-869b2c25cacf) | | 820 Paper | [PNG](https://git.kayg.org/attachments/fe586fb9-276a-4db6-ab20-3e0d93c54e29) | [PNG](https://git.kayg.org/attachments/3f1e49fa-1761-4e36-82c7-d579247f289b) | [PNG](https://git.kayg.org/attachments/fb2f22b8-888c-4a93-94d7-a21c259ce1e5) | [PNG](https://git.kayg.org/attachments/e282506f-db31-4385-b75f-cca024d6b7af) | — | | 820 Tokyo Night | [PNG](https://git.kayg.org/attachments/df3a13ab-0031-4e5f-b06f-0c7cda592f88) | [PNG](https://git.kayg.org/attachments/ed4066e2-cdb9-4313-bfb5-20654869b492) | [PNG](https://git.kayg.org/attachments/cb22df13-021f-48ed-81f5-24d58e487a6b) | [PNG](https://git.kayg.org/attachments/6136ef88-6ea2-4b97-a04a-57ae478b3c70) | — | | 390 Paper | [PNG](https://git.kayg.org/attachments/02fc9fa9-031f-417e-85d5-66c0861b7106) | [PNG](https://git.kayg.org/attachments/2979d3fc-0d28-410d-90d7-2bc08d9b5906) | [PNG](https://git.kayg.org/attachments/62e046a2-d3e2-4479-b00a-ee8bbdba5de9) | [PNG](https://git.kayg.org/attachments/4cbbb48c-2b1d-4899-be48-61201c75678a) | [PNG](https://git.kayg.org/attachments/a61698bc-cd13-41ee-a978-eb07a26e8012) | | 390 Tokyo Night | [PNG](https://git.kayg.org/attachments/07b5f9e5-6115-4284-853a-c1c662d90a2d) | [PNG](https://git.kayg.org/attachments/3719db2c-0c4d-4865-bc17-449562629faf) | [PNG](https://git.kayg.org/attachments/afd0e024-d43d-4f49-8e8b-c50ec4d598ff) | [PNG](https://git.kayg.org/attachments/55de583b-d70b-49ae-9882-1f062fa2adfb) | [PNG](https://git.kayg.org/attachments/b8c6d608-c940-42d1-9806-ca3d99f98f87) | ### Gates `bunx vitest run src/lib/tasks/TaskBoard.svelte.test.ts --maxWorkers=2`: ```text RUN v5.0.1 /home/kayg/Developer/calternal-wt/kbpreview-1118/apps/web Test Files 1 passed (1) Tests 4 passed (4) Start at 19:55:30 Duration 35.74s (transform 82%, import 7%, environment 5%, tests 3%, setup 3%) Transform |component| transforming modules took 28.94s · 82% 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-runs ``` `bun run check` stopped at the existing ratchet: ```text $ ../../scripts/perf-lint --check && node scripts/check-user-storage.mjs && node scripts/check-glass-tokens.mjs && node scripts/check-type-tokens.mjs && node scripts/check-focus-tokens.mjs && node scripts/check-motion-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json perf-lint: INVALID: exception ratchet: contract.blaze: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.blocked-network: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; contract.dom-bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.model-bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.row-identity: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.snapshot: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; coverage.profile: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; coverage.readiness: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; io.unresolved-call: 16191 exceptions exceed the ratchet ceiling 16190; fix the new violation instead; render.blaze-adapter: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.model_byte_cap: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.model_row_cap: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; total: ledger has 21977 exceptions; ratchet total is 21964 ``` `bunx svelte-check --tsconfig ./tsconfig.json` output: ```text svelte-check found 0 errors and 4 warnings in 3 files ``` The four warnings are the two empty CSS rulesets in `AttachmentDeck.svelte` and `AgendaList.svelte`, plus the unused `.note-page-lede` and `.note-state` selectors in `routes/notes/+page.svelte`. `bun run build` exited successfully; output included: ```text Compressed 887 static variants; saved 20921688 bytes. ``` `node --check apps/web/e2e/tasks.mjs` and `git diff --check origin/dev..HEAD` passed with no output. Production E2E output: ```text tasks e2e: composer, per-layout and per-lane Add task, destination/source Board drag previews, phone layout menu, touch actions, live Bases file edit, and screenshots passed in /home/kayg/Developer/calternal-wt/kbpreview-1118/artifacts/tasks-1118 CSP REPORTS tasks: 0 across 2 pages ``` No Rust source changed, so no crate gates were run. Cleanup output: ```text Removed 8633 files, 7.2GiB total ``` ### Decisions No additional design choice beyond the issue brief: Task counts remain tied to indexed Task data while the local placeholder drives layout. The existing Tasks UI benchmark already covers Board hover previews.
Author
Owner

Started merge23 on branch job/merge23. Base SHA: d57992dea7. Starting HEAD: f407fcefe7.

Started merge23 on branch job/merge23. Base SHA: d57992dea77a5c031b1494fe9e5b608505b707e8. Starting HEAD: f407fcefe7c495d6e039d87a290c5c24a9b4a2b9.
Author
Owner

Finding: the initial scripts/perf-lint --check stopped during test discovery before validating the stale TaskBoard pin. apps/web/scripts/perf-source.mjs:27 received a TypeScript module without ScriptTarget (TypeError: undefined is not an object). I am checking the local dependency resolution and merged web gates before changing the pin.

Finding: the initial scripts/perf-lint --check stopped during test discovery before validating the stale TaskBoard pin. apps/web/scripts/perf-source.mjs:27 received a TypeScript module without ScriptTarget (TypeError: undefined is not an object). I am checking the local dependency resolution and merged web gates before changing the pin.
Author
Owner

Finding: after installing the committed Bun lockfile, one shared perf-guard parse found 75 stale exception identities and 64 unpinned current findings in the merged web sources (22,115 pins vs 22,104 live findings). The changed files include SearchPreview from #1159 and TaskBoard/TaskColumn/TaskCard from #1118; the diagnostics include the reported TaskBoard render.bound site and changed SearchPreview observer/list identities. I will regenerate exact live identities with the existing #1133 adoption path, then verify the ledger and ratchet do not exceed the live findings.

Finding: after installing the committed Bun lockfile, one shared perf-guard parse found 75 stale exception identities and 64 unpinned current findings in the merged web sources (22,115 pins vs 22,104 live findings). The changed files include SearchPreview from #1159 and TaskBoard/TaskColumn/TaskCard from #1118; the diagnostics include the reported TaskBoard render.bound site and changed SearchPreview observer/list identities. I will regenerate exact live identities with the existing #1133 adoption path, then verify the ledger and ratchet do not exceed the live findings.
Author
Owner

Finished merge23 for #1118.

Built: Refreshed exact perf exception identities for merged web source changes with the established scripts/perf-lint --adopt-7c path. The guard passed with 0 violations. The ledger and per-rule ratchet now match 22,104 live findings, down from 22,115 total entries; no rule ceiling exceeds its exact live count. The total ratchet fell by 11. Two per-rule counts rose by one to match exact live findings while others fell.

Files: contracts/perf/adoption-1058.json, contracts/perf/exceptions.json, contracts/perf/ratchet.json.

Head: 41bf97fb2861ea6e4ea70aab7d3b15a1c9aa278d.

Gates (exit 0; output quoted verbatim):

cd apps/web && bun run check

perf-lint: PASS; 0 violations; 22104 scoped exceptions
svelte-check found 0 errors and 4 warnings in 3 files

cd apps/web && bun run test -- --maxWorkers=2

Ran 136 tests in 0.069s
OK
 7 pass
 0 fail
 Test Files  266 passed (266)
      Tests  1827 passed (1827)
   Start at  22:25:05
   Duration  645.85s (transform 32%, environment 25%, import 23%, tests 15%, setup 5%)

cargo clean output: Removed 1 file, 356B total. Deleted .svelte-kit, .vite and temporary logs. No Rust files changed, so Rust format, clippy and test gates were not run.

Known gaps: bun run check reports four existing Svelte warnings: empty CSS rulesets in AttachmentDeck.svelte and AgendaList.svelte, and unused .note-page-lede / .note-state selectors in Notes. Vitest logs jsdom notices for scrollTo(), navigation and one CSS stylesheet; all 1,827 tests pass.

Decisions: No DESIGN decision was needed. Used the #1133 exact-pin refresh flow; the ratchet records only current live findings.

Finished merge23 for #1118. **Built:** Refreshed exact perf exception identities for merged web source changes with the established `scripts/perf-lint --adopt-7c` path. The guard passed with 0 violations. The ledger and per-rule ratchet now match 22,104 live findings, down from 22,115 total entries; no rule ceiling exceeds its exact live count. The total ratchet fell by 11. Two per-rule counts rose by one to match exact live findings while others fell. **Files:** `contracts/perf/adoption-1058.json`, `contracts/perf/exceptions.json`, `contracts/perf/ratchet.json`. **Head:** `41bf97fb2861ea6e4ea70aab7d3b15a1c9aa278d`. **Gates (exit 0; output quoted verbatim):** `cd apps/web && bun run check` ``` perf-lint: PASS; 0 violations; 22104 scoped exceptions svelte-check found 0 errors and 4 warnings in 3 files ``` `cd apps/web && bun run test -- --maxWorkers=2` ``` Ran 136 tests in 0.069s OK 7 pass 0 fail Test Files 266 passed (266) Tests 1827 passed (1827) Start at 22:25:05 Duration 645.85s (transform 32%, environment 25%, import 23%, tests 15%, setup 5%) ``` `cargo clean` output: `Removed 1 file, 356B total`. Deleted `.svelte-kit`, `.vite` and temporary logs. No Rust files changed, so Rust format, clippy and test gates were not run. **Known gaps:** `bun run check` reports four existing Svelte warnings: empty CSS rulesets in `AttachmentDeck.svelte` and `AgendaList.svelte`, and unused `.note-page-lede` / `.note-state` selectors in Notes. Vitest logs jsdom notices for `scrollTo()`, navigation and one CSS stylesheet; all 1,827 tests pass. **Decisions:** No DESIGN decision was needed. Used the #1133 exact-pin refresh flow; the ratchet records only current live findings.
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#1118
No description provided.