E2E: bring the 67-workflow sweep back to green (53 stale/failing) #1071

Open
opened 2026-10-04 22:14:40 +00:00 by kayg · 87 comments
Owner

E2E suite debt (2026-10-05)

The packaged e2e sweep (67 workflows) on 7b: 14 pass on the first run, 1 passes on retry, 53 fail (job/e2e-7b report on #867). Most failures are 20–30 s click/wait timeouts in older workflow scripts, written before the Settings §50 reorganisation, the §34 Inspector, the §33 short links, the mode tray changes and today's 7b UI. One real regression was found and fixed (Files upload identity, da2eb5f91).

Wanted: one owner job per group of workflows. Bring each workflow to PASS against current DESIGN (fix stale tests to assert what a User sees; fix the product where it is wrong), run them in CI order on a quiet host, and keep a baseline server binary of production to compare against. Goal: the sweep is green before every production deploy.

## E2E suite debt (2026-10-05) The packaged e2e sweep (67 workflows) on 7b: 14 pass on the first run, 1 passes on retry, 53 fail (job/e2e-7b report on #867). Most failures are 20–30 s click/wait timeouts in older workflow scripts, written before the Settings §50 reorganisation, the §34 Inspector, the §33 short links, the mode tray changes and today's 7b UI. One real regression was found and fixed (Files upload identity, da2eb5f91). Wanted: one owner job per group of workflows. Bring each workflow to PASS against current DESIGN (fix stale tests to assert what a User sees; fix the product where it is wrong), run them in CI order on a quiet host, and keep a baseline server binary of production to compare against. Goal: the sweep is green before every production deploy.
Author
Owner

Starting group A verification on branch job/e2e-a-1071, based on production 9fb9a4bfb2. I am reading the prior per-workflow report and DESIGN sections before building the production app/server once and running workflows serially.

Starting group A verification on branch job/e2e-a-1071, based on production 9fb9a4bfb2488152c83d50c55441ff5f43b572b2. I am reading the prior per-workflow report and DESIGN sections before building the production app/server once and running workflows serially.
Author
Owner

Starting workflow group B on branch job/e2e-b-1071 from production round-7b base 9fb9a4bfb2. I have read CLAUDE.md, CONTEXT.md and the relevant DESIGN sections; next I am mapping the packaged workflows to the #867 report before building the production web app and server.

Starting workflow group B on branch job/e2e-b-1071 from production round-7b base 9fb9a4bfb2488152c83d50c55441ff5f43b572b2. I have read CLAUDE.md, CONTEXT.md and the relevant DESIGN sections; next I am mapping the packaged workflows to the #867 report before building the production web app and server.
Author
Owner

Environment finding: the first stopped before Vite started with (exit 127); this worktree had no root or app . The Bun cache exists. I am installing with the committed lockfile, then will retry the production build.

Environment finding: the first stopped before Vite started with (exit 127); this worktree had no root or app . The Bun cache exists. I am installing with the committed lockfile, then will retry the production build.
Author
Owner

Environment finding: the first bun run build stopped before Vite started with /usr/bin/bash: line 1: vite: command not found (exit 127); this worktree had no root or app node_modules. The Bun cache exists. I am installing with the committed lockfile, then will retry the production build.

Environment finding: the first bun run build stopped before Vite started with /usr/bin/bash: line 1: vite: command not found (exit 127); this worktree had no root or app node_modules. The Bun cache exists. I am installing with the committed lockfile, then will retry the production build.
Author
Owner

Environment finding: the first production web build exited 127 because neither root nor apps/web had node_modules (). bun install v1.4.2 (744846f84)

Checked 722 installs across 821 packages (no changes) [3.43s] then installed 711 locked packages; bun.lock stayed unchanged, and completed successfully.

Environment finding: the first production web build exited 127 because neither root nor apps/web had node_modules (). bun install v1.4.2 (744846f84) Checked 722 installs across 821 packages (no changes) [3.43s] then installed 711 locked packages; bun.lock stayed unchanged, and completed successfully.
Author
Owner

Correction to my previous environment note: the exact first build error was /usr/bin/bash: line 1: vite: command not found (exit 127), and neither root nor apps/web had node_modules. bun install --frozen-lockfile installed 711 packages; bun.lock stayed unchanged. The production web build then completed successfully.

Correction to my previous environment note: the exact first build error was /usr/bin/bash: line 1: vite: command not found (exit 127), and neither root nor apps/web had node_modules. bun install --frozen-lockfile installed 711 packages; bun.lock stayed unchanged. The production web build then completed successfully.
Author
Owner

Environment finding before app assertions: the first ai workflow could not load Playwright because tests/adversarial/node_modules was absent. Its package pins Playwright 1.63.0 and has its own bun.lock; bun install --frozen-lockfile there installed seven dependencies. The next attempt showed the runner must set CALTERNAL_SERVER_BIN: Cargo's preset target is /home/kayg/build/targets/e2e-b-1071, while this workflow defaults to the absent worktree target/debug. The built server exists in the preset target. I will pass that binary for ordinary workflows; mail-sync-613 must run without this override so it can build its test-provider server.

Environment finding before app assertions: the first ai workflow could not load Playwright because tests/adversarial/node_modules was absent. Its package pins Playwright 1.63.0 and has its own bun.lock; bun install --frozen-lockfile there installed seven dependencies. The next attempt showed the runner must set CALTERNAL_SERVER_BIN: Cargo's preset target is /home/kayg/build/targets/e2e-b-1071, while this workflow defaults to the absent worktree target/debug. The built server exists in the preset target. I will pass that binary for ordinary workflows; mail-sync-613 must run without this override so it can build its test-provider server.
Author
Owner

Finding — tocrail-636: the production check fails at 1440 px in Paper. The heading title's computed fill is color(srgb 1 1 1 / 0.36) while .warm-tooltip resolves to transparent. Both surfaces consume --warm-tooltip-bg, but packages/ui/src/tokens.css does not define it. This violates DESIGN §34's shared warm tooltip material and #636's recorded decision to use the stronger 94% static chrome fill, with an opaque surface under reduced transparency. I am restoring that shared token contract and will rerun this workflow.

Finding — tocrail-636: the production check fails at 1440 px in Paper. The heading title's computed fill is `color(srgb 1 1 1 / 0.36)` while `.warm-tooltip` resolves to transparent. Both surfaces consume `--warm-tooltip-bg`, but `packages/ui/src/tokens.css` does not define it. This violates DESIGN §34's shared warm tooltip material and #636's recorded decision to use the stronger 94% static chrome fill, with an opaque surface under reduced transparency. I am restoring that shared token contract and will rerun this workflow.
Author
Owner

Product finding in the ai workflow: after the User chooses Undo the rest, the Turn panel shows Undone and GET /api/v1/ai/turns/ reports status undone, but the Settings → AI → History row remains Completed after Escape. TurnHistory calls Resource.load when the panel closes, but listTurns serves its 30-second cached list. This violates DESIGN §59's rule that a mutation appears at once wherever the same item appears. I will clear the existing shared turn-list cache before the close refresh; the packaged ai E2E asserts the visible history row changes to Undone.

Product finding in the ai workflow: after the User chooses Undo the rest, the Turn panel shows Undone and GET /api/v1/ai/turns/<id> reports status undone, but the Settings → AI → History row remains Completed after Escape. TurnHistory calls Resource.load when the panel closes, but listTurns serves its 30-second cached list. This violates DESIGN §59's rule that a mutation appears at once wherever the same item appears. I will clear the existing shared turn-list cache before the close refresh; the packaged ai E2E asserts the visible history row changes to Undone.
Author
Owner

Finding — toast-ring: the reduced-motion production check fails at the 2,000 ms midpoint with stroke opacity 0. DESIGN §34 still requires reduced-motion support, and issue #721 specifies a stationary line that fades with the toast timeout. The shared reduced-motion rule in packages/ui/src/tokens.css forces all animation durations to 0.001ms !important; it overrides the toast ring's --cal-toast-ring-duration fade. I will preserve the stationary geometry and exempt only this time signal from the global instant-duration rule, with a regression assertion.

Finding — toast-ring: the reduced-motion production check fails at the 2,000 ms midpoint with stroke opacity 0. DESIGN §34 still requires reduced-motion support, and issue #721 specifies a stationary line that fades with the toast timeout. The shared reduced-motion rule in `packages/ui/src/tokens.css` forces all animation durations to `0.001ms !important`; it overrides the toast ring's `--cal-toast-ring-duration` fade. I will preserve the stationary geometry and exempt only this time signal from the global instant-duration rule, with a regression assertion.
Author
Owner

Environment finding — notes: the first run stopped before browser setup because its documented default module tests/adversarial/node_modules/playwright/index.mjs was absent. The root Bun install does not install this nested test package. I am installing the adversarial package from its own frozen lockfile and will rerun notes; no workflow assertion changed.

Environment finding — notes: the first run stopped before browser setup because its documented default module `tests/adversarial/node_modules/playwright/index.mjs` was absent. The root Bun install does not install this nested test package. I am installing the adversarial package from its own frozen lockfile and will rerun notes; no workflow assertion changed.
Author
Owner

Stale-test finding — notes: after the harness dependency was installed, the production workflow timed out waiting for a stable Block ID in the Note body (apps/web/e2e/notes.mjs:2057) before pressing Enter to submit the reminder at line 2061. This repeats #867's identified ordering error: the User must press Enter to commit the reminder before the saved Block ID can appear. I am moving that input action before the unchanged saved-state assertion.

Stale-test finding — notes: after the harness dependency was installed, the production workflow timed out waiting for a stable Block ID in the Note body (`apps/web/e2e/notes.mjs:2057`) before pressing Enter to submit the reminder at line 2061. This repeats #867's identified ordering error: the User must press Enter to commit the reminder before the saved Block ID can appear. I am moving that input action before the unchanged saved-state assertion.
Author
Owner

Screenshot-mode evidence: the AI workflow passed on the production bundle, but its Mac-emulated screenshot pass timed out in openCommands because the test still sent Control+Shift+; while the app registered Cmd+Shift+;. I updated the harness shortcut selection to match the emulated platform; the workflow is being rerun with the Mac shortcut.

Screenshot-mode evidence: the AI workflow passed on the production bundle, but its Mac-emulated screenshot pass timed out in `openCommands` because the test still sent Control+Shift+; while the app registered Cmd+Shift+;. I updated the harness shortcut selection to match the emulated platform; the workflow is being rerun with the Mac shortcut.
Author
Owner

Analytics workflow finding: the production dashboard loaded and returned analytics API responses in 16–22 ms, but a chart remained in its loading state and the workflow's settle() wait reached its 120 s timeout. The server log had no 5xx; the local host had other active E2E/browser processes and load averages of 4.62 / 7.02 / 8.89. This run is classified as a shared-host environment stall, not a confirmed product regression. It needs a clean merge-round rerun if the chart-loading check is still required.

Analytics workflow finding: the production dashboard loaded and returned analytics API responses in 16–22 ms, but a chart remained in its loading state and the workflow's `settle()` wait reached its 120 s timeout. The server log had no 5xx; the local host had other active E2E/browser processes and load averages of 4.62 / 7.02 / 8.89. This run is classified as a shared-host environment stall, not a confirmed product regression. It needs a clean merge-round rerun if the chart-loading check is still required.
Author
Owner

Money workflow findings and fix: the 5,000-row test import could finish before Playwright queried the Cancel import control. The test now holds the real preview response until the job-cancel request, so it covers both a live parse and the supported completion/cancel race without changing the API or increasing fixture size. A later assertion also exposed console noise for the workflow's expected 409 publish conflict and 404 cancel of the consumed preview; I added a narrow filter for those exact routes while retaining the explicit status assertions. The final run reached PASS captured Money screenshots across the Mac-emulated phone/tablet/desktop and light/dark matrix. Screenshots remain in the ignored worktree directory artifacts/money.

Money workflow findings and fix: the 5,000-row test import could finish before Playwright queried the Cancel import control. The test now holds the real preview response until the job-cancel request, so it covers both a live parse and the supported completion/cancel race without changing the API or increasing fixture size. A later assertion also exposed console noise for the workflow's expected 409 publish conflict and 404 cancel of the consumed preview; I added a narrow filter for those exact routes while retaining the explicit status assertions. The final run reached `PASS captured Money screenshots` across the Mac-emulated phone/tablet/desktop and light/dark matrix. Screenshots remain in the ignored worktree directory `artifacts/money`.
Author
Owner

Notes workflow finding: clicking “Remind me” inserts a local stable block ID (the editor DOM shows ^rx8qyp), but GET /api/v1/notes/<id> still returns the old Markdown body after five seconds. The reminder picker therefore reports that the block is still syncing and does not open. The existing reminder API validates the ID against saved Note Markdown, so sending the request earlier returns “The reminder could not be saved.” This is a product persistence regression; I am tracing the collaboration save path before choosing the fix.

Notes workflow finding: clicking “Remind me” inserts a local stable block ID (the editor DOM shows `^rx8qyp`), but `GET /api/v1/notes/<id>` still returns the old Markdown body after five seconds. The reminder picker therefore reports that the block is still syncing and does not open. The existing reminder API validates the ID against saved Note Markdown, so sending the request earlier returns “The reminder could not be saved.” This is a product persistence regression; I am tracing the collaboration save path before choosing the fix.
Author
Owner

Ask workflow finding: Playwright could not check the recovery-key acknowledgement because the decorative SVG intercepted pointer hits over the native Checkbox input. This was a real shared-control regression. packages/ui/src/components/Checkbox.svelte now makes the indicator pointer-transparent, so the native input or containing checkbox button receives the hit. The screenshot-mode harness also uses the Mac shortcut, emulates macOS, and crops only the acknowledgement row so recovery words never enter artifacts. Final run: ask e2e: ok, CSP REPORTS ask: 0 across 2 pages. Review captures are in ignored artifacts/ask, including the six phone/tablet/desktop acknowledgement crops in both themes.

Ask workflow finding: Playwright could not check the recovery-key acknowledgement because the decorative SVG intercepted pointer hits over the native Checkbox input. This was a real shared-control regression. `packages/ui/src/components/Checkbox.svelte` now makes the indicator pointer-transparent, so the native input or containing checkbox button receives the hit. The screenshot-mode harness also uses the Mac shortcut, emulates macOS, and crops only the acknowledgement row so recovery words never enter artifacts. Final run: `ask e2e: ok`, `CSP REPORTS ask: 0 across 2 pages`. Review captures are in ignored `artifacts/ask`, including the six phone/tablet/desktop acknowledgement crops in both themes.
Author
Owner

Mail sync finding and result: the Dovecot fixture is amd64 on this host, and the opt-in mail-test-provider server completed the 2,000-message backfill. The remaining failures were stale UI expectations in apps/web/e2e/mail-sync-613.mjs: the invoice is automatically categorized under Receipts, sanitized bodies are rendered inside the isolated frame (DESIGN §§45, 49), Files prefixes a timestamp to avoid attachment name collisions, and sender names also appear in the per-message More actions buttons. The test now follows the Receipts link, reads visible bodies through the frame, selects button.thread-toggle, matches the original filename suffix, and checks category state immediately and after reload. Touch checks the changed Newsletters view.

Final Mac-emulated run: mail-sync-613 e2e: ok; 2,000 messages backfilled in 19.481 s; thread, attachment, sender-category, touch, and all 24 390/820/1440 light/dark screenshots passed; CSP REPORTS mail-sync-613: 0 across 2 pages. Captures are in ignored artifacts/mail-sync-613/.

Mail sync finding and result: the Dovecot fixture is amd64 on this host, and the opt-in `mail-test-provider` server completed the 2,000-message backfill. The remaining failures were stale UI expectations in `apps/web/e2e/mail-sync-613.mjs`: the invoice is automatically categorized under Receipts, sanitized bodies are rendered inside the isolated frame (DESIGN §§45, 49), Files prefixes a timestamp to avoid attachment name collisions, and sender names also appear in the per-message More actions buttons. The test now follows the Receipts link, reads visible bodies through the frame, selects `button.thread-toggle`, matches the original filename suffix, and checks category state immediately and after reload. Touch checks the changed Newsletters view. Final Mac-emulated run: `mail-sync-613 e2e: ok`; 2,000 messages backfilled in 19.481 s; thread, attachment, sender-category, touch, and all 24 390/820/1440 light/dark screenshots passed; `CSP REPORTS mail-sync-613: 0 across 2 pages`. Captures are in ignored `artifacts/mail-sync-613/`.
Author
Owner

Calendar workflow finding: the API returns all five 10:00 CalDAV Events and the Calendar range projection includes them. At 820 px with the sidebar open, each date column is about 61 px wide; the Week grid renders those Events in one +5 overflow chip. At 1250 px each date column is about 118 px wide; it renders one Event lane and a +4 chip. The merged #427 GridColumn rule reserves room for the +N pill and keeps remaining lanes at their 36 px minimum, so these rendered counts match that rule. The inherited #384 assertions expected one visible Event at 820 px and three at 1250 px. I updated the workflow to assert the current counts and keyboard-open the 820 px chip to confirm all five Events are available in the accessible list.

Calendar workflow finding: the API returns all five 10:00 CalDAV Events and the Calendar range projection includes them. At 820 px with the sidebar open, each date column is about 61 px wide; the Week grid renders those Events in one `+5` overflow chip. At 1250 px each date column is about 118 px wide; it renders one Event lane and a `+4` chip. The merged #427 GridColumn rule reserves room for the `+N` pill and keeps remaining lanes at their 36 px minimum, so these rendered counts match that rule. The inherited #384 assertions expected one visible Event at 820 px and three at 1250 px. I updated the workflow to assert the current counts and keyboard-open the 820 px chip to confirm all five Events are available in the accessible list.
Author
Owner

Calendar view-switcher finding: the production build has no .cal-views header pills at 1440 px with the sidebar closed. The current CalendarTools component says Calendar views stay in the sidebar and Cmd+K; merged #526 revised the title-menu rule so Calendar views are sidebar sub-views only. This matches the job's binding Chrome rule that sub-views live in the sidebar. The old #352 matrix still expected wide collapsed-header pills. I am updating that row to assert there is no duplicate switcher and that reopening the sidebar exposes the five shortcut-labeled view rows.

Calendar view-switcher finding: the production build has no `.cal-views` header pills at 1440 px with the sidebar closed. The current CalendarTools component says Calendar views stay in the sidebar and Cmd+K; merged #526 revised the title-menu rule so Calendar views are sidebar sub-views only. This matches the job's binding Chrome rule that sub-views live in the sidebar. The old #352 matrix still expected wide collapsed-header pills. I am updating that row to assert there is no duplicate switcher and that reopening the sidebar exposes the five shortcut-labeled view rows.
Author
Owner

Group A finding — task-header-659: the workflow failed because the Task Header had no .task-note-card ancestor. NoteView.svelte already defines .task-note-card as the task-only rule for the shared Note Card (min-height: 280px; width: 100%), but the rendered Card only had note-card. Restoring the task-only class made the production workflow pass its 390px, 820px and 1440px light/dark checks, including the Task and Calendar inspectors. I committed the one-line fix separately; the build succeeded.

Group A finding — `task-header-659`: the workflow failed because the Task Header had no `.task-note-card` ancestor. `NoteView.svelte` already defines `.task-note-card` as the task-only rule for the shared Note Card (`min-height: 280px; width: 100%`), but the rendered Card only had `note-card`. Restoring the task-only class made the production workflow pass its 390px, 820px and 1440px light/dark checks, including the Task and Calendar inspectors. I committed the one-line fix separately; the build succeeded.
Author
Owner

Calendar lane follow-up: after the revised width checks, the 1250 px case renders one visible CalDAV subscription Event plus +4. The visible Event's .b-content is flex, as expected by GridColumn's #431 rule that cramped subscription Events retain a short title; the old helper still required .b-content to be none. I am changing the assertion to verify the visible title and button action, the full title/accessible name, and hidden time metadata.

Calendar lane follow-up: after the revised width checks, the 1250 px case renders one visible CalDAV subscription Event plus `+4`. The visible Event's `.b-content` is `flex`, as expected by GridColumn's #431 rule that cramped subscription Events retain a short title; the old helper still required `.b-content` to be `none`. I am changing the assertion to verify the visible title and button action, the full `title`/accessible name, and hidden time metadata.
Author
Owner

Calendar Day geometry finding: at default zoom the two-file Gym Log shows its compact attachment pile and keeps it inside the title row. GridColumn only shows both thumbnail cards at tier 3; the workflow already has a dedicated withDeckZoom assertion for that state. The default-zoom assertion incorrectly required tier-3 cards before changing zoom. I split those expectations so the default pile and the tier-3 deck remain independently covered.

Calendar Day geometry finding: at default zoom the two-file Gym Log shows its compact attachment pile and keeps it inside the title row. GridColumn only shows both thumbnail cards at tier 3; the workflow already has a dedicated `withDeckZoom` assertion for that state. The default-zoom assertion incorrectly required tier-3 cards before changing zoom. I split those expectations so the default pile and the tier-3 deck remain independently covered.
Author
Owner

Calendar Day interaction finding: at 390 px the timed +1 control opens the shared all-items surface, and its list contains both the 13:00 Event and 13:05 Log. The repair run then reaches the right-edge File crop and fails because the test queries .activity-card; GridColumn now renders the real File through .activity-summary > .item-card. I am updating the crop target to that existing ItemCard.

Calendar Day interaction finding: at 390 px the timed `+1` control opens the shared all-items surface, and its list contains both the 13:00 Event and 13:05 Log. The repair run then reaches the right-edge File crop and fails because the test queries `.activity-card`; GridColumn now renders the real File through `.activity-summary > .item-card`. I am updating the crop target to that existing ItemCard.
Author
Owner

Group A finding — notes: after the Notes workflow copies several heading links in one live session, the collab server repeatedly logs could not map edited Markdown to the loaded Note source. A real direct Share exists in /api/v1/files/shares before those saves, then disappears from the owner list and the reminder everyone preview contains only the setter. The File item ID before the edits differs from the ID after /api/v1/files/stat refreshes the file. This shows the failed multi-block save leaves Files with a stale fingerprint and the valid Share becomes unusable. I am extending the safe source patcher to preserve multiple non-adjacent anchor edits; I will keep the current recipient assertion.

Group A finding — `notes`: after the Notes workflow copies several heading links in one live session, the collab server repeatedly logs `could not map edited Markdown to the loaded Note source`. A real direct Share exists in `/api/v1/files/shares` before those saves, then disappears from the owner list and the reminder `everyone` preview contains only the setter. The File item ID before the edits differs from the ID after `/api/v1/files/stat` refreshes the file. This shows the failed multi-block save leaves Files with a stale fingerprint and the valid Share becomes unusable. I am extending the safe source patcher to preserve multiple non-adjacent anchor edits; I will keep the current recipient assertion.
Author
Owner

Calendar tier-3 attachment finding: the compact pile and deck coexist briefly while the LOD transition runs, so the previous helper read the pile before its fade completed. The deck is visible. The b-thumb class used by the old assertion no longer exists; #822's AttachmentDeck renders each attachment as a .representation.thumb .item-card inside its list. I am waiting for the pile and deck to reach their final opacity, then checking both real ItemCards and their geometry.

Calendar tier-3 attachment finding: the compact pile and deck coexist briefly while the LOD transition runs, so the previous helper read the pile before its fade completed. The deck is visible. The `b-thumb` class used by the old assertion no longer exists; #822's `AttachmentDeck` renders each attachment as a `.representation.thumb .item-card` inside its list. I am waiting for the pile and deck to reach their final opacity, then checking both real ItemCards and their geometry.
Author
Owner

Calendar tier-3 geometry finding: both real attachment ItemCards now render with the expected file names, and the pile fades away. Their measured boxes share the same left edge and are separated vertically (first bottom 218.5 px, second top 244.5 px), matching GridColumn's vertical Calendar deck. The inherited #384 assertion expected same-top, side-by-side cards. I am updating it to assert vertical order and non-overlap.

Calendar tier-3 geometry finding: both real attachment ItemCards now render with the expected file names, and the pile fades away. Their measured boxes share the same left edge and are separated vertically (first bottom 218.5 px, second top 244.5 px), matching GridColumn's vertical Calendar deck. The inherited #384 assertion expected same-top, side-by-side cards. I am updating it to assert vertical order and non-overlap.
Author
Owner

Calendar view-switcher classification: stale test expectations. The full production workflow passes at 390/820/1440 px, light/dark, and sidebar open/closed. Screenshots are in artifacts/calendar-followups-376 (macOS platform emulation enabled).

Evidence and fixes:

  • /settings/mail/connect now aliases to Connected Accounts under Settings §50, so it no longer shows a Mail heading or an Advanced disclosure. The review surface now opens the canonical App Passwords group and checks the shared “More options” disclosure token, its controlled panel, and Enter/Space behavior.
  • The tier-3 Calendar attachment deck remains stacked until its Log entry receives focus. The test now focuses the entry and waits for the designed vertical fan before measuring the cards; this removes theme/order-dependent geometry.
  • The existing Calendar assertions now follow the current sidebar hierarchy, event lane limit, compact Event title treatment, and attachment pile/deck zoom levels.

Workflow PASS: CALTERNAL_SERVER_BIN=/home/kayg/build/targets/e2e-b-1071/debug/calternal-server CALTERNAL_E2E_MAC=1 bun e2e/calendar-view-switcher.mjs.
Head at this finding: e4cf4285c.

Calendar view-switcher classification: stale test expectations. The full production workflow passes at 390/820/1440 px, light/dark, and sidebar open/closed. Screenshots are in `artifacts/calendar-followups-376` (macOS platform emulation enabled). Evidence and fixes: - `/settings/mail/connect` now aliases to Connected Accounts under Settings §50, so it no longer shows a Mail heading or an Advanced disclosure. The review surface now opens the canonical App Passwords group and checks the shared “More options” disclosure token, its controlled panel, and Enter/Space behavior. - The tier-3 Calendar attachment deck remains stacked until its Log entry receives focus. The test now focuses the entry and waits for the designed vertical fan before measuring the cards; this removes theme/order-dependent geometry. - The existing Calendar assertions now follow the current sidebar hierarchy, event lane limit, compact Event title treatment, and attachment pile/deck zoom levels. Workflow PASS: `CALTERNAL_SERVER_BIN=/home/kayg/build/targets/e2e-b-1071/debug/calternal-server CALTERNAL_E2E_MAC=1 bun e2e/calendar-view-switcher.mjs`. Head at this finding: `e4cf4285c`.
Author
Owner

WebMCP recheck disposition: SLOW. On the production SPA and isolated local server, the generated Note create/read check passed. A later real WebMCP callback returned Index is busy; retry shortly; the script then exited. Its lifecycle diagnostic reported running: true, panic: false, stackOverflow: false, healthy: true, and no connection errors. Host load average at the run was 9.20/5.50/6.24. This matches the prior #867 index-contention candidate. I did not change the product or retry the workflow.

WebMCP recheck disposition: SLOW. On the production SPA and isolated local server, the generated Note create/read check passed. A later real WebMCP callback returned `Index is busy; retry shortly`; the script then exited. Its lifecycle diagnostic reported `running: true`, `panic: false`, `stackOverflow: false`, `healthy: true`, and no connection errors. Host load average at the run was 9.20/5.50/6.24. This matches the prior #867 index-contention candidate. I did not change the product or retry the workflow.
Author
Owner

Search findings:

  1. The test's default shortcut was Control+K even though its Playwright context emulates macOS. Search uses Meta+K in this context. The stale shortcut timed out waiting for .surface.search-window; changing the helper and matching reopen to Meta+K lets the production flow proceed.
  2. The next failure is a stale material assertion in assertSearchActionsFloatOverResults. The rendered dark action pills use rgb(42, 45, 58) (--raised) and a transparent border; the test expects the translucent shared chrome tint and a visible hairline. DESIGN §34 and #1029 require filled neutral action pills with no outside border. I am updating the assertion to compare against the active theme's --raised/--paper-2 fill and a transparent border, while retaining its blur, spacing and scroll-pinning checks.
Search findings: 1. The test's default shortcut was `Control+K` even though its Playwright context emulates macOS. Search uses `Meta+K` in this context. The stale shortcut timed out waiting for `.surface.search-window`; changing the helper and matching reopen to `Meta+K` lets the production flow proceed. 2. The next failure is a stale material assertion in `assertSearchActionsFloatOverResults`. The rendered dark action pills use `rgb(42, 45, 58)` (`--raised`) and a transparent border; the test expects the translucent shared chrome tint and a visible hairline. DESIGN §34 and #1029 require filled neutral action pills with no outside border. I am updating the assertion to compare against the active theme's `--raised`/`--paper-2` fill and a transparent border, while retaining its blur, spacing and scroll-pinning checks.
Author
Owner

Search layout follow-up: after the Mac shortcut and #1029 material assertions were corrected, the run reached the two-result preview sizing check. It reports a real preview column (291px wide) but previewTitle: null because the selected File preview renders its title with the shared ItemCard .item-title, not the legacy .preview h3 selector. SearchPreview.svelte uses ItemCard for File and Photo results. I am updating the geometry probe to measure either the shared ItemCard title or the text heading, preserving the bounds, line-height and descender checks (DESIGN §34).

Search layout follow-up: after the Mac shortcut and #1029 material assertions were corrected, the run reached the two-result preview sizing check. It reports a real preview column (`291px` wide) but `previewTitle: null` because the selected File preview renders its title with the shared `ItemCard` `.item-title`, not the legacy `.preview h3` selector. `SearchPreview.svelte` uses ItemCard for File and Photo results. I am updating the geometry probe to measure either the shared ItemCard title or the text heading, preserving the bounds, line-height and descender checks (DESIGN §34).
Author
Owner

Search layout follow-up: measuring the current shared ItemCard title now passes its preview bounds and full line-height checks. The next stale assertion rejects text-box-trim: trim-both; the real title has optical-caps, whose shared token rule sets text-box: trim-both cap alphabetic to align the cap while retaining the baseline for descenders. The assertion conflicts with the current typography rule. I will check the alphabetic text-box edge when trimming is active instead of forbidding that rule.

Search layout follow-up: measuring the current shared ItemCard title now passes its preview bounds and full line-height checks. The next stale assertion rejects `text-box-trim: trim-both`; the real title has `optical-caps`, whose shared token rule sets `text-box: trim-both cap alphabetic` to align the cap while retaining the baseline for descenders. The assertion conflicts with the current typography rule. I will check the alphabetic text-box edge when trimming is active instead of forbidding that rule.
Author
Owner

Search shortcut evidence: the failing expanded-palette check sends Control+Enter in the macOS-emulated run. The single shortcut registry binds search.all to ['cmd', 'Enter'] (Search shows ⌘↩ on macOS); search-dialog.svelte dispatches through that registry. Both Search test activations using Control+Enter are stale. I will use Meta+Enter for the Mac run and keep the existing expand/collapse assertions.

Search shortcut evidence: the failing expanded-palette check sends `Control+Enter` in the macOS-emulated run. The single shortcut registry binds `search.all` to `['cmd', 'Enter']` (Search shows ⌘↩ on macOS); `search-dialog.svelte` dispatches through that registry. Both Search test activations using Control+Enter are stale. I will use Meta+Enter for the Mac run and keep the existing expand/collapse assertions.
Author
Owner

Search grouped-results classification: stale test vocabulary. With the current atlas fixture, the production Search headings are Notes, Journal, Days, Photos, and Files; the test still requires Log entries in both its required-heading list and fixed-order rank list. CONTEXT.md § vocabulary states the source UI label is Journal, and apps/web/src/lib/search/query.ts maps Log results to Journal. I am updating both assertions to the current label.

Search grouped-results classification: stale test vocabulary. With the current `atlas` fixture, the production Search headings are `Notes`, `Journal`, `Days`, `Photos`, and `Files`; the test still requires `Log entries` in both its required-heading list and fixed-order rank list. CONTEXT.md § vocabulary states the source UI label is `Journal`, and `apps/web/src/lib/search/query.ts` maps Log results to `Journal`. I am updating both assertions to the current label.
Author
Owner

Notes follow-up: the new server log reason identified the remaining case as pure insertion has no exact source span. The editor writes list, quote and table anchors on a separate Markdown line. When the raw Note also has blank-line or URL syntax that changes canonical line counts, that token could not be mapped safely. The source patcher now maps the inserted token after a unique exact previous block line and preserves the following raw bytes. A regression test covers a task-list anchor before image content. cargo clippy -p calternal-collab --all-targets -- -D warnings and cargo test -p calternal-collab pass; I am rebuilding the server for the Notes rerun.

Notes follow-up: the new server log reason identified the remaining case as `pure insertion has no exact source span`. The editor writes list, quote and table anchors on a separate Markdown line. When the raw Note also has blank-line or URL syntax that changes canonical line counts, that token could not be mapped safely. The source patcher now maps the inserted token after a unique exact previous block line and preserves the following raw bytes. A regression test covers a task-list anchor before image content. `cargo clippy -p calternal-collab --all-targets -- -D warnings` and `cargo test -p calternal-collab` pass; I am rebuilding the server for the Notes rerun.
Author
Owner

Search shortcut follow-up: the production context uses emulateMacPlatform(context), but three scoped-search interactions still press Control+Shift+F and commands press Control+Shift+;. The single registry binds these as app.find (cmd+shift+f) and app.commands (cmd+shift+;). These are the same stale modifier mismatch as Search's Control+K / Control+Enter. I am updating the Mac-emulated test to send Meta for these app shortcuts; the pass/fail and scoped-search assertions stay intact.

Search shortcut follow-up: the production context uses `emulateMacPlatform(context)`, but three scoped-search interactions still press `Control+Shift+F` and commands press `Control+Shift+;`. The single registry binds these as `app.find` (`cmd+shift+f`) and `app.commands` (`cmd+shift+;`). These are the same stale modifier mismatch as Search's Control+K / Control+Enter. I am updating the Mac-emulated test to send Meta for these app shortcuts; the pass/fail and scoped-search assertions stay intact.
Author
Owner

Search action hint finding: after the current registry-backed shortcuts and Journal label changes, the flow reaches the selected-result action check. Its diagnostic already shows the rendered hints ↩, ⌘↩, and ⌘K, but its selector reads .kbd and returns empty strings. The shared Kbd component renders variant="caps" as .kbd-caps with .kbd-cap children (#710, DESIGN §34). I will read those visible caps and assert the three macOS registry labels.

Search action hint finding: after the current registry-backed shortcuts and `Journal` label changes, the flow reaches the selected-result action check. Its diagnostic already shows the rendered hints `↩`, `⌘↩`, and `⌘K`, but its selector reads `.kbd` and returns empty strings. The shared Kbd component renders `variant="caps"` as `.kbd-caps` with `.kbd-cap` children (#710, DESIGN §34). I will read those visible caps and assert the three macOS registry labels.
Author
Owner

Search findings from the production Group B workflow:

  • Real regression, Search cold deep link: opening /search?q=%23work%20atlas&view=all raised Cannot read properties of null (reading 'pathname') from the Search page callback. The stack pointed to nodes/46...js:1:544, the from.url.pathname access. SvelteKit can provide a from target with no URL during cold hydration. The route now treats that as a cold entry and preserves the prior origin for query-only Search navigation. The rerun reached PASS deep link restores state.
  • Harness race, screenshot appearance reload: waitForAppearanceLoad received /api/v1/appearance before page.goto() committed its document, then page.evaluate(document.fonts.ready) failed with Execution context was destroyed. The shared helper now accepts a navigation callback, registers the response wait first, and waits for the new document before checking fonts. The screenshot run passed the appearance reload and continued.
  • Real UX regression, saved-search touch menu: the phone workflow measured the existing saved-search action at {"x":-43.1875,"y":421.421875,"width":28,"height":28} on a 390 px coarse-pointer page. Its touch CSS now gives both the saved-search row and its menu a 44 px target. The full workflow will verify this change in the next run.
Search findings from the production Group B workflow: - Real regression, Search cold deep link: opening `/search?q=%23work%20atlas&view=all` raised `Cannot read properties of null (reading 'pathname')` from the Search page callback. The stack pointed to `nodes/46...js:1:544`, the `from.url.pathname` access. SvelteKit can provide a `from` target with no URL during cold hydration. The route now treats that as a cold entry and preserves the prior origin for query-only Search navigation. The rerun reached `PASS deep link restores state`. - Harness race, screenshot appearance reload: `waitForAppearanceLoad` received `/api/v1/appearance` before `page.goto()` committed its document, then `page.evaluate(document.fonts.ready)` failed with `Execution context was destroyed`. The shared helper now accepts a navigation callback, registers the response wait first, and waits for the new document before checking fonts. The screenshot run passed the appearance reload and continued. - Real UX regression, saved-search touch menu: the phone workflow measured the existing saved-search action at `{"x":-43.1875,"y":421.421875,"width":28,"height":28}` on a 390 px coarse-pointer page. Its touch CSS now gives both the saved-search row and its menu a 44 px target. The full workflow will verify this change in the next run.
Author
Owner

Search stale-test finding: the Files scoped-search assertion used a default center click on the selected result row. Playwright showed the selected-result action Pill's <kbd> intercepting that coordinate, so the test timed out before reaching the row's own pointer handler. The workflow already checks the visible primary action Pill. I changed the file-open pointer check to click the visible filename title, which still asserts that the row's primary pointer action navigates to item=atlas-brief.txt; verification is in the current full Search rerun.

Search stale-test finding: the Files scoped-search assertion used a default center click on the selected result row. Playwright showed the selected-result action Pill's `<kbd>` intercepting that coordinate, so the test timed out before reaching the row's own pointer handler. The workflow already checks the visible primary action Pill. I changed the file-open pointer check to click the visible filename title, which still asserts that the row's primary pointer action navigates to `item=atlas-brief.txt`; verification is in the current full Search rerun.
Author
Owner

Round 7c4 finding on the merged production build: timeout 1200 bun apps/web/e2e/canvas-976.mjs fails after Notes → New → New Canvas. The first open shows “This note could not be opened”; the Rename Canvas dialog never appears. The existing diagnostic reread returns HTTP 200, a Canvas source and an ETag. No browser exception was recorded. Server evidence: Notes Index operation failed sqlite_code="5" pool_timeout=false at 2026-10-05T01:54:54.848920Z. This is a transient SQLite BUSY result, not a SLOW-only timing result. The request that failed first is not yet identified by the existing diagnostics. get_note resolves notes_view_path_for_id and calls the plain reader query in path_for_id (crates/plugins/notes/src/lib.rs); other parallel Notes operations could also have emitted this diagnostic. Do not claim a root cause from that warning alone. Preserve the original test and add content-free method/path/status diagnostics before a focused rerun. Regression must prove New Canvas opens and prompts for rename during startup/index contention, and must preserve #1062 zero-idle-events and #1076 write scope. No assertion was changed. Evidence: artifacts/merge-round-7c4/canvas-976.log and phone/tablet/desktop Notes New screenshots in artifacts/merge-round-7c4/canvas. READY FOR STAGING remains no.

Round 7c4 finding on the merged production build: `timeout 1200 bun apps/web/e2e/canvas-976.mjs` fails after Notes → New → New Canvas. The first open shows “This note could not be opened”; the Rename Canvas dialog never appears. The existing diagnostic reread returns HTTP 200, a Canvas source and an ETag. No browser exception was recorded. Server evidence: `Notes Index operation failed sqlite_code="5" pool_timeout=false` at 2026-10-05T01:54:54.848920Z. This is a transient SQLite BUSY result, not a SLOW-only timing result. The request that failed first is not yet identified by the existing diagnostics. `get_note` resolves `notes_view_path_for_id` and calls the plain reader query in `path_for_id` (crates/plugins/notes/src/lib.rs); other parallel Notes operations could also have emitted this diagnostic. Do not claim a root cause from that warning alone. Preserve the original test and add content-free method/path/status diagnostics before a focused rerun. Regression must prove New Canvas opens and prompts for rename during startup/index contention, and must preserve #1062 zero-idle-events and #1076 write scope. No assertion was changed. Evidence: artifacts/merge-round-7c4/canvas-976.log and phone/tablet/desktop Notes New screenshots in artifacts/merge-round-7c4/canvas. READY FOR STAGING remains no.
Author
Owner

Additional screenshot-harness finding: with SEARCH_E2E_ALL_SHOTS=1, the Search pills screenshot branch called applyTheme() while the Search overlay was open. That helper reloads the current route, so the palette closed and the following pill assertion timed out waiting for its input. The screenshot branch now uses the existing in-place theme helper and keeps the palette open. The saved-search phone screenshot also waits for the sidebar sheet to reach its open rest state before capture. Verification is in the current rerun.

Additional screenshot-harness finding: with `SEARCH_E2E_ALL_SHOTS=1`, the Search pills screenshot branch called `applyTheme()` while the Search overlay was open. That helper reloads the current route, so the palette closed and the following pill assertion timed out waiting for its input. The screenshot branch now uses the existing in-place theme helper and keeps the palette open. The saved-search phone screenshot also waits for the sidebar sheet to reach its open rest state before capture. Verification is in the current rerun.
Author
Owner

Finding (#1071, Notes): Copying a heading link could retitle a Note. The H1 title reader included the durable trailing block anchor in textContent; after the delayed heading-follow update, the title and Notes path changed (for example, Project Atlas became Project Atlas ^yjdvfw), so the existing share no longer resolved for the recipient. I changed title extraction to strip the trailing anchor and added an E2E identity invariant after heading-link copies. The title/path check passed in the Notes series run.

Finding (#1071, Notes): Copying a heading link could retitle a Note. The H1 title reader included the durable trailing block anchor in `textContent`; after the delayed heading-follow update, the title and Notes path changed (for example, `Project Atlas` became `Project Atlas ^yjdvfw`), so the existing share no longer resolved for the recipient. I changed title extraction to strip the trailing anchor and added an E2E identity invariant after heading-link copies. The title/path check passed in the Notes series run.
Author
Owner

Search screenshot-only stale-test finding: the optional all-screens matrix navigated to /settings/calendars and waited for Date format. That legacy path now opens Calendar settings, so the date control is absent after the §50 Settings reorganisation. The screenshot check now opens /settings/date-time, which owns the Date format control, and names its captures accordingly. Verification is in the current rerun.

Search screenshot-only stale-test finding: the optional all-screens matrix navigated to `/settings/calendars` and waited for `Date format`. That legacy path now opens Calendar settings, so the date control is absent after the §50 Settings reorganisation. The screenshot check now opens `/settings/date-time`, which owns the Date format control, and names its captures accordingly. Verification is in the current rerun.
Author
Owner

Group B report — #1071

Head: 49f402428c200c0c0cf1bcbf734fa101ad6c41e6
READY FOR MERGE: no. This report stops at the four-hour job limit. The remaining workflows and final gates are listed below.

Workflow Class / result Fix or evidence
ai PASS — real regression Refresh turn history after undo; commit fbb2f2956.
analytics SLOW — host load No non-SLOW failure recorded; reported earlier on #1071.
money PASS Stabilized the import-cancellation workflow; commit 776cc67e4.
ask PASS — real pointer-hit bug Decorative checkbox art no longer intercepts its input; commit 841c40659.
mail-sync-613 PASS — environment Ran with the amd64 Dovecot fixture; commit 42c16ecfa.
calendar Not run — time limit Pending.
gaps-827-828 Not run — time limit Pending.
weekstate-609 Not run — time limit Pending.
calendar-crossday Not run — time limit Pending.
calendar-doc-stack Not run — time limit Pending.
preview-attach Not run — time limit Pending.
voice-619 Not run — time limit Pending.
hidden-activity Not run — time limit Pending.
calendar-view-switcher PASS — stale test Updated the workflow to follow current navigation and grid behavior; commit e4cf4285c.
calendar-task-overflow Not run — time limit Pending.
taskday-655-657 Not run — time limit Pending.
calendar-resize Not run — time limit Pending.
tasks Not run — time limit Pending.
mobile-focus Not run — time limit Pending.
theme Not run — time limit Pending.
theme-variants-506 Not run — time limit Pending.
settings-shortcut Not run — time limit Pending.
settings-open-642 Not run — time limit Pending.
settings-50 Not run — time limit Pending.
admin-denial Not run — time limit Pending.
auth Not run — time limit Pending.
mail-layouts Not re-run in this job It passed in the #867 report; current-branch result is unverified.
paste-1036 Not run — time limit Pending.
chrome-surfaces Not run — time limit Pending.
phone-chrome Not run — time limit Pending.
reload-423 Not run — environment setup and time limit The Build A/B servers and manifests were not available in this run.
route-errors Not run — time limit Pending.
search PASS — stale checks corrected; real cold-entry and touch-target defects fixed Commit a048c268b fixes a cold deep-link crash; 264656a24 makes saved-search actions touch sized; 49f402428 updates the workflow for current UI behavior. The local performance sample was SLOW (first-result p95 389.3 ms; 25 long tasks over 50 ms), which DESIGN §§18 and 59 treat as periodic review, not a merge gate. The full workflow printed search e2e: ok and CSP REPORTS search: 0 across 4 pages.
popovers Not run — time limit Pending.
submenu-579 Not run — time limit Pending.
integrations-review Not run — time limit Pending.
webmcp SLOW — host load One run hit “Index is busy; retry shortly”; health stayed true and load was 9.20/5.50/6.24. No retry was made.
photos Not run — time limit Pending.
a11y Not run — time limit Pending.
breakit Not run — time limit Pending.

Changes

Changed files: apps/web/e2e/ai.mjs, apps/web/e2e/ask.mjs, apps/web/e2e/calendar-view-switcher.mjs, apps/web/e2e/harness.mjs, apps/web/e2e/mail-sync-613.mjs, apps/web/e2e/money.mjs, apps/web/e2e/search.mjs, apps/web/src/lib/ai/api.ts, apps/web/src/lib/search/SavedSearchList.svelte, apps/web/src/routes/search/+page.svelte, apps/web/src/routes/settings/ai/TurnHistory.svelte, and packages/ui/src/components/Checkbox.svelte.

Mac-platform screenshots are in the ignored artifacts/ folders, including artifacts/search-group-b/ (390, 820, and 1440 px; paper-white and tokyo-night). The fj issue CLI exposes text comments but no attachment command, so these files were not uploaded or committed.

Gates and remaining work

  • bun run check: not run; the four-hour job limit was reached.
  • Focused Vitest: not run; the four-hour job limit was reached.
  • Rust gates: not applicable; no Rust files changed.
  • The one-time git fetch origin && git merge origin/dev and final gates remain to be done together.
  • cargo clean and web build-output cleanup remain outstanding.

Decisions

For a cold Search entry where SvelteKit supplies from before from.url exists, the route treats it as having no originating app path. This keeps the overlay close behavior deterministic. The Search performance sample remains visible as SLOW while the workflow continues, consistent with DESIGN §§18 and 59.

Gate output: No final gate commands ran, so there is no gate output to quote.

## Group B report — #1071 **Head:** `49f402428c200c0c0cf1bcbf734fa101ad6c41e6` **READY FOR MERGE: no.** This report stops at the four-hour job limit. The remaining workflows and final gates are listed below. | Workflow | Class / result | Fix or evidence | |---|---|---| | ai | PASS — real regression | Refresh turn history after undo; commit `fbb2f2956`. | | analytics | SLOW — host load | No non-SLOW failure recorded; reported earlier on #1071. | | money | PASS | Stabilized the import-cancellation workflow; commit `776cc67e4`. | | ask | PASS — real pointer-hit bug | Decorative checkbox art no longer intercepts its input; commit `841c40659`. | | mail-sync-613 | PASS — environment | Ran with the amd64 Dovecot fixture; commit `42c16ecfa`. | | calendar | Not run — time limit | Pending. | | gaps-827-828 | Not run — time limit | Pending. | | weekstate-609 | Not run — time limit | Pending. | | calendar-crossday | Not run — time limit | Pending. | | calendar-doc-stack | Not run — time limit | Pending. | | preview-attach | Not run — time limit | Pending. | | voice-619 | Not run — time limit | Pending. | | hidden-activity | Not run — time limit | Pending. | | calendar-view-switcher | PASS — stale test | Updated the workflow to follow current navigation and grid behavior; commit `e4cf4285c`. | | calendar-task-overflow | Not run — time limit | Pending. | | taskday-655-657 | Not run — time limit | Pending. | | calendar-resize | Not run — time limit | Pending. | | tasks | Not run — time limit | Pending. | | mobile-focus | Not run — time limit | Pending. | | theme | Not run — time limit | Pending. | | theme-variants-506 | Not run — time limit | Pending. | | settings-shortcut | Not run — time limit | Pending. | | settings-open-642 | Not run — time limit | Pending. | | settings-50 | Not run — time limit | Pending. | | admin-denial | Not run — time limit | Pending. | | auth | Not run — time limit | Pending. | | mail-layouts | Not re-run in this job | It passed in the #867 report; current-branch result is unverified. | | paste-1036 | Not run — time limit | Pending. | | chrome-surfaces | Not run — time limit | Pending. | | phone-chrome | Not run — time limit | Pending. | | reload-423 | Not run — environment setup and time limit | The Build A/B servers and manifests were not available in this run. | | route-errors | Not run — time limit | Pending. | | search | PASS — stale checks corrected; real cold-entry and touch-target defects fixed | Commit `a048c268b` fixes a cold deep-link crash; `264656a24` makes saved-search actions touch sized; `49f402428` updates the workflow for current UI behavior. The local performance sample was SLOW (first-result p95 389.3 ms; 25 long tasks over 50 ms), which DESIGN §§18 and 59 treat as periodic review, not a merge gate. The full workflow printed `search e2e: ok` and `CSP REPORTS search: 0 across 4 pages`. | | popovers | Not run — time limit | Pending. | | submenu-579 | Not run — time limit | Pending. | | integrations-review | Not run — time limit | Pending. | | webmcp | SLOW — host load | One run hit “Index is busy; retry shortly”; health stayed true and load was 9.20/5.50/6.24. No retry was made. | | photos | Not run — time limit | Pending. | | a11y | Not run — time limit | Pending. | | breakit | Not run — time limit | Pending. | ### Changes Changed files: `apps/web/e2e/ai.mjs`, `apps/web/e2e/ask.mjs`, `apps/web/e2e/calendar-view-switcher.mjs`, `apps/web/e2e/harness.mjs`, `apps/web/e2e/mail-sync-613.mjs`, `apps/web/e2e/money.mjs`, `apps/web/e2e/search.mjs`, `apps/web/src/lib/ai/api.ts`, `apps/web/src/lib/search/SavedSearchList.svelte`, `apps/web/src/routes/search/+page.svelte`, `apps/web/src/routes/settings/ai/TurnHistory.svelte`, and `packages/ui/src/components/Checkbox.svelte`. Mac-platform screenshots are in the ignored `artifacts/` folders, including `artifacts/search-group-b/` (390, 820, and 1440 px; paper-white and tokyo-night). The `fj` issue CLI exposes text comments but no attachment command, so these files were not uploaded or committed. ### Gates and remaining work - `bun run check`: not run; the four-hour job limit was reached. - Focused Vitest: not run; the four-hour job limit was reached. - Rust gates: not applicable; no Rust files changed. - The one-time `git fetch origin && git merge origin/dev` and final gates remain to be done together. - `cargo clean` and web build-output cleanup remain outstanding. ### Decisions For a cold Search entry where SvelteKit supplies `from` before `from.url` exists, the route treats it as having no originating app path. This keeps the overlay close behavior deterministic. The Search performance sample remains visible as SLOW while the workflow continues, consistent with DESIGN §§18 and 59. **Gate output:** No final gate commands ran, so there is no gate output to quote.
Author
Owner

Finding (#1071, Notes): the removal Undo E2E poll referenced reminderBeforeRemove from a browser-serialized callback. The callback runs in the page and cannot see the Node variable, so it failed with ReferenceError: reminderBeforeRemove is not defined after the product had restored the reminder. I now pass the expected reminder through the poll argument and retain checks for identity, fields and revision.

Finding (#1071, Notes): the removal Undo E2E poll referenced `reminderBeforeRemove` from a browser-serialized callback. The callback runs in the page and cannot see the Node variable, so it failed with `ReferenceError: reminderBeforeRemove is not defined` after the product had restored the reminder. I now pass the expected reminder through the poll argument and retain checks for identity, fields and revision.
Author
Owner

Continuing group B on branch job/e2e-b-1071. Starting HEAD: 49f402428c. origin/dev is 2b6c77c14b (production round 8); merging it before the remaining workflow runs.

Continuing group B on branch job/e2e-b-1071. Starting HEAD: 49f402428c200c0c0cf1bcbf734fa101ad6c41e6. origin/dev is 2b6c77c14be78e7d1e1030e23b14c63a6772fca7 (production round 8); merging it before the remaining workflow runs.
Author
Owner

Finding (#1071, Notes): waitForNoteRoute expected the retired /notes/<id> path even though DESIGN §33 uses /n/<id> as the stable Note deep link. The application opened the right Note at /n/<id>, but the workflow timed out waiting for the old path. I updated the helper to verify the designed short route.

Finding (#1071, Notes): `waitForNoteRoute` expected the retired `/notes/<id>` path even though DESIGN §33 uses `/n/<id>` as the stable Note deep link. The application opened the right Note at `/n/<id>`, but the workflow timed out waiting for the old path. I updated the helper to verify the designed short route.
Author
Owner

Round 7c4 verification update (#867). The focused Canvas co-edit flow passed unchanged: three Users plus a public viewer; strokes, exports, Shared JSON discovery, follow, downgrade and revoke; 48 macOS screenshots at 390/820/1440 in both themes. The initial failing run remains in the report.

The focused ordinary Canvas flow reached New Canvas, rename and empty reopening, then failed the original 30-second assertion that the real Notes API contains text Canvas plan after filling the bound-label textarea and pressing Escape. The rectangle persisted. No failed API response was recorded in this run. Server diagnostics included SQLite BUSY code 5. These observations do not establish whether the label failure is in the fixture, renderer or save path. The earlier New Canvas readiness failure is also retained. No assertion was changed. A separate focused path reuses the same Pencil/list assertions with a scene uploaded through the real API, so those requested phases are exercised despite the earlier failure.

Authorization matrix result, verbatim:

PASS profile authority: API read denied; public capability unspent and delivered once
Authorization matrix: 407 OpenAPI operations; 2672 requests across 4 base identities plus invalid/stale session probes and 18 App Password scope classes; valid/malformed session bodies on 17 privileged body routes; App Passwords use valid bodies; policy classes {'public': 20, 'public_link': 12, 'user': 327, 'admin': 48}

The complete MCP section passes after sharing the existing Money provenance-envelope parser and sequencing confirm before opening the cancellation preview. All UUID, scope, summary and single-use assertions are retained. The focused helper tests report Ran 5 tests / OK. Commit b45d7f740.

Files tests confirmed the filed #988/#1045 conflicting error-text assertions: test result: FAILED. 248 passed; 2 failed; 4 ignored; 0 measured; 0 filtered out; finished in 160.57s. They are not weakened. Calendar gates found one previous-release fixture missing PluginRequestContext.session_actor; the minimal fixture repair uses SessionActor::User, consistent with the surrounding tests. Remaining per-crate gates continue.

Round 7c4 verification update (#867). The focused Canvas co-edit flow passed unchanged: three Users plus a public viewer; strokes, exports, Shared JSON discovery, follow, downgrade and revoke; 48 macOS screenshots at 390/820/1440 in both themes. The initial failing run remains in the report. The focused ordinary Canvas flow reached New Canvas, rename and empty reopening, then failed the original 30-second assertion that the real Notes API contains text `Canvas plan` after filling the bound-label textarea and pressing Escape. The rectangle persisted. No failed API response was recorded in this run. Server diagnostics included SQLite BUSY code 5. These observations do not establish whether the label failure is in the fixture, renderer or save path. The earlier New Canvas readiness failure is also retained. No assertion was changed. A separate focused path reuses the same Pencil/list assertions with a scene uploaded through the real API, so those requested phases are exercised despite the earlier failure. Authorization matrix result, verbatim: ``` PASS profile authority: API read denied; public capability unspent and delivered once Authorization matrix: 407 OpenAPI operations; 2672 requests across 4 base identities plus invalid/stale session probes and 18 App Password scope classes; valid/malformed session bodies on 17 privileged body routes; App Passwords use valid bodies; policy classes {'public': 20, 'public_link': 12, 'user': 327, 'admin': 48} ``` The complete MCP section passes after sharing the existing Money provenance-envelope parser and sequencing confirm before opening the cancellation preview. All UUID, scope, summary and single-use assertions are retained. The focused helper tests report `Ran 5 tests` / `OK`. Commit b45d7f740. Files tests confirmed the filed #988/#1045 conflicting error-text assertions: `test result: FAILED. 248 passed; 2 failed; 4 ignored; 0 measured; 0 filtered out; finished in 160.57s`. They are not weakened. Calendar gates found one previous-release fixture missing `PluginRequestContext.session_actor`; the minimal fixture repair uses `SessionActor::User`, consistent with the surrounding tests. Remaining per-crate gates continue.
Author
Owner

SLOW finding — calendar: the production workflow timed out after 30 s waiting for the Journal dialog. At launch, host load averages were 11.55 / 16.30 / 15.50. The run recorded no assertion failure or server error, so this is classified as shared-host load; I am proceeding without a retry.

SLOW finding — calendar: the production workflow timed out after 30 s waiting for the Journal dialog. At launch, host load averages were 11.55 / 16.30 / 15.50. The run recorded no assertion failure or server error, so this is classified as shared-host load; I am proceeding without a retry.
Author
Owner

Stale-test finding — weekstate-609: it failed waiting for its 2026-10-07 marker on /calendar/week/2026-09-28. The current route creates a seven-day Week window, and DESIGN §39 says the path date is the first visible day, so this marker is outside 09/28–10/04. The workflow later deep-links to 10/05 before checking it. I am narrowing marker ownership checks to the visible Week headers and keeping the deep-link assertion.

Stale-test finding — weekstate-609: it failed waiting for its 2026-10-07 marker on /calendar/week/2026-09-28. The current route creates a seven-day Week window, and DESIGN §39 says the path date is the first visible day, so this marker is outside 09/28–10/04. The workflow later deep-links to 10/05 before checking it. I am narrowing marker ownership checks to the visible Week headers and keeping the deep-link assertion.
Author
Owner

Second stale-test finding — weekstate-609: after its range, focus and deep-link checks passed, the workflow timed out looking for a Today link in Calendar navigation. exposes that sidebar action as a month-title button named , with the tooltip and handler. I am selecting that current accessible control; the existing route, focus and scroll assertions remain.

Second stale-test finding — weekstate-609: after its range, focus and deep-link checks passed, the workflow timed out looking for a Today link in Calendar navigation. exposes that sidebar action as a month-title button named , with the tooltip and handler. I am selecting that current accessible control; the existing route, focus and scroll assertions remain.
Author
Owner

Correction to the prior comment: the source file is packages/ui/src/components/calendar/MiniMonth.svelte. Its sidebar Today action is a month-title button whose accessible name ends with go to today, and it uses the calendar.today shortcut tooltip. I am updating the test to locate that button.

Correction to the prior comment: the source file is packages/ui/src/components/calendar/MiniMonth.svelte. Its sidebar Today action is a month-title button whose accessible name ends with go to today, and it uses the calendar.today shortcut tooltip. I am updating the test to locate that button.
Author
Owner

Product finding — calendar-crossday: during Log resize, the preview contains 23:58–00:15 but its combined label has computed display:none; the moving preview is 29.83 px tall. GridColumn.svelte names moving blocks drag-range, then a later .block.actual rule replaces that name with media-slot, so the @container drag-range label rule does not run. I am preserving both container names; the workflow already checks the live label and saved end.

Product finding — calendar-crossday: during Log resize, the preview contains 23:58–00:15 but its combined label has computed display:none; the moving preview is 29.83 px tall. GridColumn.svelte names moving blocks drag-range, then a later .block.actual rule replaces that name with media-slot, so the @container drag-range label rule does not run. I am preserving both container names; the workflow already checks the live label and saved end.
Author
Owner

Finding (#1071, Notes): the Shift-click and later keyboard/touch selection assertions compared a heading's raw textContent to Goals or Milestones. Stable ^block-id tokens are now present in that text, so the workflow failed while the correct two blocks were selected. I changed these predicates to read the authored .linked-heading-text span and kept the selection count, action state and route assertions.

Finding (#1071, Notes): the Shift-click and later keyboard/touch selection assertions compared a heading's raw `textContent` to `Goals` or `Milestones`. Stable `^block-id` tokens are now present in that text, so the workflow failed while the correct two blocks were selected. I changed these predicates to read the authored `.linked-heading-text` span and kept the selection count, action state and route assertions.
Author
Owner

Finding: calendar-crossday exposed a product regression. The Log resize owns the pointer first, but at 9.6 px of downward travel the shell pullDown action takes capture from route-content.pulling; the preview stops at 00:15 instead of the requested 00:30. The event trace shows the target changing from the captured Log button to route-content. I am adding start-target eligibility to pullDown and excluding controls and nested gesture owners in the shell, with a regression check.

Finding: calendar-crossday exposed a product regression. The Log resize owns the pointer first, but at 9.6 px of downward travel the shell pullDown action takes capture from route-content.pulling; the preview stops at 00:15 instead of the requested 00:30. The event trace shows the target changing from the captured Log button to route-content. I am adding start-target eligibility to pullDown and excluding controls and nested gesture owners in the shell, with a regression check.
Author
Owner

Finding (#1071, Notes): a Shift-click range selection did not reset the stored mouse-tap pair. A quick single click on the original block then matched the earlier click within the double-click window and entered text editing, so the following block-selection assertion failed. The Shift-click range path now clears the prior tap pair; the existing workflow checks that one later click selects the block.

Finding (#1071, Notes): a Shift-click range selection did not reset the stored mouse-tap pair. A quick single click on the original block then matched the earlier click within the double-click window and entered text editing, so the following block-selection assertion failed. The Shift-click range path now clears the prior tap pair; the existing workflow checks that one later click selects the block.
Author
Owner

Finding: after the cross-day resize assertion passed, calendar-crossday failed on a stale Week-view visibility assumption. The source date column rendered its designed +2 overflow pill (aria-label: 2 more entries from 22:39), so the adjacent Event was not a .block.plan. The workflow already handles overflow for span records; I am extending the adjacent Event assertion to verify its accessible time label in the overflow list when lane packing hides the block.

Finding: after the cross-day resize assertion passed, calendar-crossday failed on a stale Week-view visibility assumption. The source date column rendered its designed +2 overflow pill (aria-label: 2 more entries from 22:39), so the adjacent Event was not a .block.plan. The workflow already handles overflow for span records; I am extending the adjacent Event assertion to verify its accessible time label in the overflow list when lane packing hides the block.
Author
Owner

Correction to the previous note: the More row's accessible name is designed to expose the provider and title, while its +N control exposes the overlap start time. The row opens the Event preview, which carries the full range. I am checking the trigger time, row name, click action and preview range so the stale visibility assumption is replaced by the actual accessible flow.

Correction to the previous note: the More row's accessible name is designed to expose the provider and title, while its +N control exposes the overlap start time. The row opens the Event preview, which carries the full range. I am checking the trigger time, row name, click action and preview range so the stale visibility assumption is replaced by the actual accessible flow.
Author
Owner

Finding: the adapted overflow assertion reached the real More row and confirmed its accessible provider/title, but the pointer click timed out because the success toast from the preceding resize covered the bottom-grid target. Playwright's click log shows the toast subtree intercepting pointer input on every retry. This is test sequencing: the toast pauses while hovered and the grid sits underneath it. I am moving away and waiting for the confirmation to finish before the next pointer action.

Finding: the adapted overflow assertion reached the real More row and confirmed its accessible provider/title, but the pointer click timed out because the success toast from the preceding resize covered the bottom-grid target. Playwright's click log shows the toast subtree intercepting pointer input on every retry. This is test sequencing: the toast pauses while hovered and the grid sits underneath it. I am moving away and waiting for the confirmation to finish before the next pointer action.
Author
Owner

Finding (#1071, Notes): the touch block toolbar copied the correct stable heading URL, but the workflow expected the title-specific desktop message Link to “Goals” copied. The shared block action labels its target by type and emits Link to heading copied. I updated the toast assertion to match that action while retaining the exact clipboard URL and selected-block checks.

Finding (#1071, Notes): the touch block toolbar copied the correct stable heading URL, but the workflow expected the title-specific desktop message `Link to “Goals” copied`. The shared block action labels its target by type and emits `Link to heading copied`. I updated the toast assertion to match that action while retaining the exact clipboard URL and selected-block checks.
Author
Owner

Correction: moving away did not clear the toast because the resize Undo notice keeps its documented 8-second window and the repeated pointer attempt extended the overlap. The workflow now uses the app's supported Escape dismissal on the focused toast before the next pointer action, then checks the event preview range.

Correction: moving away did not clear the toast because the resize Undo notice keeps its documented 8-second window and the repeated pointer attempt extended the overlap. The workflow now uses the app's supported Escape dismissal on the focused toast before the next pointer action, then checks the event preview range.
Author
Owner

Correction to the new assertion: on a fine pointer, one click selects a Calendar item and Cmd+I opens its preview (DESIGN §34). The workflow now checks that designed sequence from the +N list, then verifies the full 22:39–23:57 range in the preview. Its earlier one-click-open assumption was also stale.

Correction to the new assertion: on a fine pointer, one click selects a Calendar item and Cmd+I opens its preview (DESIGN §34). The workflow now checks that designed sequence from the +N list, then verifies the full 22:39–23:57 range in the preview. Its earlier one-click-open assumption was also stale.
Author
Owner

Finding: after selecting an Event from the More list and pressing the documented Cmd+I shortcut, the preview still did not appear. TimeGrid passes the row button as the preview anchor, then immediately unmounts that row with morePopover = null; the selected item's anchor is therefore detached. This is a real regression in overflow-item selection. I am anchoring the selected item to the surviving +N trigger and keeping the existing cross-day preview assertion as the regression test.

Finding: after selecting an Event from the More list and pressing the documented Cmd+I shortcut, the preview still did not appear. TimeGrid passes the row button as the preview anchor, then immediately unmounts that row with morePopover = null; the selected item's anchor is therefore detached. This is a real regression in overflow-item selection. I am anchoring the selected item to the surviving +N trigger and keeping the existing cross-day preview assertion as the regression test.
Author
Owner

Correction: Cmd+I did not open because this workflow imports a raw browser context and never calls emulateMacPlatform. CALTERNAL_E2E_MAC is consumed only by routeCurrentBuild, which this script does not call, so the test was still running with Linux shortcut matching. I am wiring the workflow to emulate macOS explicitly and rerunning the selection path before treating the preview as a product regression.

Correction: Cmd+I did not open because this workflow imports a raw browser context and never calls emulateMacPlatform. CALTERNAL_E2E_MAC is consumed only by routeCurrentBuild, which this script does not call, so the test was still running with Linux shortcut matching. I am wiring the workflow to emulate macOS explicitly and rerunning the selection path before treating the preview as a product regression.
Author
Owner

Finding: with explicit macOS emulation, the More-list selection and Cmd+I preview now passed, including both Event time chips. The Week identity assertion then failed because Event grid keys intentionally include the segment date (event::); the start and next-day keys differ only by that projection date. DESIGN §33 defines the stable Event identity as the Event/occurrence ID. I am updating this stale assertion to compare the occurrence ID while checking each segment date.

Finding: with explicit macOS emulation, the More-list selection and Cmd+I preview now passed, including both Event time chips. The Week identity assertion then failed because Event grid keys intentionally include the segment date (event:<segment-date>:<occurrence-id>); the start and next-day keys differ only by that projection date. DESIGN §33 defines the stable Event identity as the Event/occurrence ID. I am updating this stale assertion to compare the occurrence ID while checking each segment date.
Author
Owner

Finding: the final Agenda view was anchored on resizeNextDate, six days after Midnight continuation's source date. DESIGN §38 says Agenda starts at its anchor and shows the next 13 days, so that route correctly omitted the earlier Log. The workflow expects all fixtures in one Agenda capture; I am anchoring it at sourceDate, which covers every fixture date.

Finding: the final Agenda view was anchored on resizeNextDate, six days after Midnight continuation's source date. DESIGN §38 says Agenda starts at its anchor and shows the next 13 days, so that route correctly omitted the earlier Log. The workflow expects all fixtures in one Agenda capture; I am anchoring it at sourceDate, which covers every fixture date.
Author
Owner

Correction: Today routes intentionally normalize to the current day in the mounted Today view; changing its URL date cannot backdate the Agenda. The current screen exposes Show earlier days, which loads one earlier 14-day page per DESIGN section 38. The workflow must use that control to include its older fixtures. I am updating it to load one page and then check all records.

Correction: Today routes intentionally normalize to the current day in the mounted Today view; changing its URL date cannot backdate the Agenda. The current screen exposes Show earlier days, which loads one earlier 14-day page per DESIGN section 38. The workflow must use that control to include its older fixtures. I am updating it to load one page and then check all records.
Author
Owner

Finding: after the earlier Agenda page loaded, the unresized Midnight continuation appeared on both dates, but the Log resized from 00:00 to 00:30 matched only one Agenda row. The PATCH response already passed with end 00:30. I am collecting the date of the missing projection to separate a stale expectation from a Calendar projection regression.

Finding: after the earlier Agenda page loaded, the unresized Midnight continuation appeared on both dates, but the Log resized from 00:00 to 00:30 matched only one Agenda row. The PATCH response already passed with end 00:30. I am collecting the date of the missing projection to separate a stale expectation from a Calendar projection regression.
Author
Owner

The latest notes workflow stopped before its touch checks. After the test created Notes titled “Gym” and “Gym visit”, opening “Gym” did not show the “Gym visit” Unlinked mention within the 15-second wait. The earlier linked and Card mention checks passed. DESIGN §28 N2 requires whole-title Unicode-boundary Unlinked matches.

Class: unresolved regression candidate. The run did not capture the search response or index state, so it does not yet separate a Notes regression from delayed search indexing. There was no 5xx or crash. This needs a focused rerun and fix before merge.

The latest `notes` workflow stopped before its touch checks. After the test created Notes titled “Gym” and “Gym visit”, opening “Gym” did not show the “Gym visit” Unlinked mention within the 15-second wait. The earlier linked and Card mention checks passed. DESIGN §28 N2 requires whole-title Unicode-boundary Unlinked matches. Class: unresolved regression candidate. The run did not capture the search response or index state, so it does not yet separate a Notes regression from delayed search indexing. There was no 5xx or crash. This needs a focused rerun and fix before merge.
Author
Owner

e2e-a-1071 report

READY FOR MERGE: no. The Notes workflow has an unresolved failure, and most group A workflows were not rerun before the four-hour job limit. The tree is clean.

HEAD: 2af7cf8bbb21a12cdd72f86b6338966f03f8b677

Base update: merged origin/dev once at 4dc9c6d34; no push, deploy or merge was made after that.

Built

  • Prevented stable block IDs from entering a Note's H1 title during heading-link copy and retitle. This keeps the Note ID, title and path stable.
  • Made block reminder actions wait for the saved Markdown anchor before opening the shared picker. The action reports a calm syncing state if the live room has not saved the anchor.
  • Reset click timing after Shift-click range selection so a later single click cannot pair with the old click and enter text editing.
  • Updated Notes E2E assertions for /n/<id>, authored heading text, real pointer selection, stable identity, saved reminder state and title-specific copy feedback.
  • Refreshed exact performance-source hashes after the merged Notes and shared glass source changes.

Workflows

Statuses marked “#867 only” are from the earlier report and were not rerun on this branch.

Workflow Class / result Fix or remaining work
settings-blaze-641 SLOW, current run High-load timings were about 11.71 / 15.29 / 14.13 s. No code failure was isolated.
tocrail-636 Regression fixed; PASS Fixed the warm tooltip glass fill. Focused test passed 78/78.
toast-ring Regression fixed; PASS Kept the reduced-motion countdown fade. Focused test passed 78/78.
notes Regression candidate; FAIL, incomplete Latest run timed out after 15 s waiting for “Gym visit” in the “Gym” Note’s Unlinked mentions. The test did not capture search/index state; no 5xx or crash. Needs focused rerun and fix.
task-header-659 PASS Restored the Task Note Card styling hook; screenshot workflow passed.
layout Environment, #867 only Sharp could not load libstdc++; run with a compatible Sharp/amd64 environment.
app-passwords PASS, #867 only No change recorded.
composer Stale test, #867 only Update the assertion for pending rows hidden by content-visibility: auto.
pill-feedback Product regression, #867 only Fix clipping and add trailing scroll room.
overflow-511 Stale test, #867 only Update expectations for the redesigned Settings groups.
midnight Stale test, #867 only Use Meta+K for macOS instead of Control+K.
maintenance SLOW / unverified, #867 only Needs a bounded rerun.
overlay-title PASS, #867 only No change recorded.
files Stale test, #867 only Assert the anchored inspector popover specified by DESIGN §34.
files-paste PASS, #867 only No change recorded.
bg-stability-535 Product regression, #867 only Investigate the data-ready state before the background stability check.
share Possible regression, #867 only Verify and fix long filename rendering.
toaststack-616 Environment, #867 only Provide the Mail fixture.
deeplinks Possible regression, #867 only Run through Milestones; the prior run stopped before that view.
menu-blur Stale test, #867 only Update the old Light theme menu label.
glass-audit Harness / unverified, #867 only Wait for stable-background data readiness.
consistency Environment, #867 only Sharp could not load libstdc++; use a compatible environment.
settings-effects Unclassified, #867 only The theme menu did not update localStorage; isolate UI state from harness state.
blur-436 Harness / unverified, #867 only Wait for the stable picture load.
user-storage-555 Environment, #867 only Sharp could not load libstdc++; use a compatible environment.
kbd-motion-527 Unclassified, #867 only Prior observation was [200] instead of [200,240]; rerun against the current shared motion durations.
overscroll-718 SLOW / harness, #867 only The route navigation destroyed the browser context; repair harness and rerun.

Gates and builds

Verbatim output summaries:

cargo fmt --check
(no output; passed)

cargo clippy -p calternal-collab --all-targets -- -D warnings
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 05s

cargo test -p calternal-collab
test result: ok. 40 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 6.73s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.03s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.90s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 86.80s
test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 10.41s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.25s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.82s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 12.06s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.23s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 101.80s
test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.27s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 25.25s

bunx vitest run src/lib/notes/headingLinks.svelte.test.ts --maxWorkers=2
 Test Files  1 passed (1)
      Tests  2 passed (2)

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

Production web build:
  ✔ done
Compressed 534 static variants; saved 9828597 bytes.

cargo clean
     Removed 15847 files, 15.6GiB total

bun run check has four existing warnings: two empty focus CSS rules in Calendar components and two unused CSS selectors in routes/notes/+page.svelte.

UX gaps

Closed: reminder creation waits for a durable block ID; copying a heading link leaves the Note title and path unchanged; Shift-click range selection ends the prior click sequence.

Left: the Gym mention failure is unresolved. The latest Notes run stopped before touch checks and before the Notes screenshot section. The remaining group A workflows above also need current-branch runs.

Screenshots

Ignored local artifacts remain in apps/artifacts/taskmeta-659/, artifacts/tocrail-636/ and artifacts/toast-ring-review/. The current notes run failed before screenshots. fj issue comment --help supports text comments only, so the screenshot files could not be uploaded as attachments; none were committed.

Decisions

  • DESIGN §33 defines stable IDs but not title parsing. Strip the trailing durable anchor when deriving an H1 title so a Copy link action cannot rename its Note.
  • DESIGN does not define reminder save latency. Reuse the existing 3-second bounded poll pattern, wait for the stable anchor, then show a syncing message if the live room has not saved it.
  • Keep drag geometry in E2E helpers; product code does not measure layout to align text.

Files and commits

  • apps/web/src/lib/notes/NoteView.svelte, NoteEditorSurface.svelte, retitle.ts, editor-types/anchor.d.ts
  • apps/web/e2e/harness.mjs, apps/web/e2e/notes.mjs
  • contracts/perf/exceptions.json
  • Earlier branch changes: crates/calternal-collab/src/markdown.rs, session.rs; apps/web/src/lib/components/AppToaster.svelte, themes.test.ts, e2e/tocrail-636.mjs; packages/ui/src/tokens.css.
  • Atomic commits: 92fbc77a3, 9ad54f8c7, 72b7ec519, 7967ebe59, 2af7cf8bb.
## e2e-a-1071 report **READY FOR MERGE: no.** The Notes workflow has an unresolved failure, and most group A workflows were not rerun before the four-hour job limit. The tree is clean. **HEAD:** `2af7cf8bbb21a12cdd72f86b6338966f03f8b677` **Base update:** merged `origin/dev` once at `4dc9c6d34`; no push, deploy or merge was made after that. ### Built - Prevented stable block IDs from entering a Note's H1 title during heading-link copy and retitle. This keeps the Note ID, title and path stable. - Made block reminder actions wait for the saved Markdown anchor before opening the shared picker. The action reports a calm syncing state if the live room has not saved the anchor. - Reset click timing after Shift-click range selection so a later single click cannot pair with the old click and enter text editing. - Updated Notes E2E assertions for `/n/<id>`, authored heading text, real pointer selection, stable identity, saved reminder state and title-specific copy feedback. - Refreshed exact performance-source hashes after the merged Notes and shared glass source changes. ### Workflows Statuses marked “#867 only” are from the earlier report and were not rerun on this branch. | Workflow | Class / result | Fix or remaining work | |---|---|---| | `settings-blaze-641` | SLOW, current run | High-load timings were about 11.71 / 15.29 / 14.13 s. No code failure was isolated. | | `tocrail-636` | Regression fixed; PASS | Fixed the warm tooltip glass fill. Focused test passed 78/78. | | `toast-ring` | Regression fixed; PASS | Kept the reduced-motion countdown fade. Focused test passed 78/78. | | `notes` | Regression candidate; FAIL, incomplete | Latest run timed out after 15 s waiting for “Gym visit” in the “Gym” Note’s Unlinked mentions. The test did not capture search/index state; no 5xx or crash. Needs focused rerun and fix. | | `task-header-659` | PASS | Restored the Task Note Card styling hook; screenshot workflow passed. | | `layout` | Environment, #867 only | Sharp could not load `libstdc++`; run with a compatible Sharp/amd64 environment. | | `app-passwords` | PASS, #867 only | No change recorded. | | `composer` | Stale test, #867 only | Update the assertion for pending rows hidden by `content-visibility: auto`. | | `pill-feedback` | Product regression, #867 only | Fix clipping and add trailing scroll room. | | `overflow-511` | Stale test, #867 only | Update expectations for the redesigned Settings groups. | | `midnight` | Stale test, #867 only | Use `Meta+K` for macOS instead of `Control+K`. | | `maintenance` | SLOW / unverified, #867 only | Needs a bounded rerun. | | `overlay-title` | PASS, #867 only | No change recorded. | | `files` | Stale test, #867 only | Assert the anchored inspector popover specified by DESIGN §34. | | `files-paste` | PASS, #867 only | No change recorded. | | `bg-stability-535` | Product regression, #867 only | Investigate the data-ready state before the background stability check. | | `share` | Possible regression, #867 only | Verify and fix long filename rendering. | | `toaststack-616` | Environment, #867 only | Provide the Mail fixture. | | `deeplinks` | Possible regression, #867 only | Run through Milestones; the prior run stopped before that view. | | `menu-blur` | Stale test, #867 only | Update the old Light theme menu label. | | `glass-audit` | Harness / unverified, #867 only | Wait for stable-background data readiness. | | `consistency` | Environment, #867 only | Sharp could not load `libstdc++`; use a compatible environment. | | `settings-effects` | Unclassified, #867 only | The theme menu did not update `localStorage`; isolate UI state from harness state. | | `blur-436` | Harness / unverified, #867 only | Wait for the stable picture load. | | `user-storage-555` | Environment, #867 only | Sharp could not load `libstdc++`; use a compatible environment. | | `kbd-motion-527` | Unclassified, #867 only | Prior observation was `[200]` instead of `[200,240]`; rerun against the current shared motion durations. | | `overscroll-718` | SLOW / harness, #867 only | The route navigation destroyed the browser context; repair harness and rerun. | ### Gates and builds Verbatim output summaries: ```text cargo fmt --check (no output; passed) cargo clippy -p calternal-collab --all-targets -- -D warnings Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 05s cargo test -p calternal-collab test result: ok. 40 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 6.73s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.03s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.90s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 86.80s test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 10.41s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.25s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.82s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 12.06s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.23s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 101.80s test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.27s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 25.25s bunx vitest run src/lib/notes/headingLinks.svelte.test.ts --maxWorkers=2 Test Files 1 passed (1) Tests 2 passed (2) perf-lint: PASS; 0 violations; 19340 scoped exceptions svelte-check found 0 errors and 4 warnings in 3 files Production web build: ✔ done Compressed 534 static variants; saved 9828597 bytes. cargo clean Removed 15847 files, 15.6GiB total ``` `bun run check` has four existing warnings: two empty focus CSS rules in Calendar components and two unused CSS selectors in `routes/notes/+page.svelte`. ### UX gaps **Closed:** reminder creation waits for a durable block ID; copying a heading link leaves the Note title and path unchanged; Shift-click range selection ends the prior click sequence. **Left:** the Gym mention failure is unresolved. The latest Notes run stopped before touch checks and before the Notes screenshot section. The remaining group A workflows above also need current-branch runs. ### Screenshots Ignored local artifacts remain in `apps/artifacts/taskmeta-659/`, `artifacts/tocrail-636/` and `artifacts/toast-ring-review/`. The current `notes` run failed before screenshots. `fj issue comment --help` supports text comments only, so the screenshot files could not be uploaded as attachments; none were committed. ### Decisions - DESIGN §33 defines stable IDs but not title parsing. Strip the trailing durable anchor when deriving an H1 title so a Copy link action cannot rename its Note. - DESIGN does not define reminder save latency. Reuse the existing 3-second bounded poll pattern, wait for the stable anchor, then show a syncing message if the live room has not saved it. - Keep drag geometry in E2E helpers; product code does not measure layout to align text. ### Files and commits - `apps/web/src/lib/notes/NoteView.svelte`, `NoteEditorSurface.svelte`, `retitle.ts`, `editor-types/anchor.d.ts` - `apps/web/e2e/harness.mjs`, `apps/web/e2e/notes.mjs` - `contracts/perf/exceptions.json` - Earlier branch changes: `crates/calternal-collab/src/markdown.rs`, `session.rs`; `apps/web/src/lib/components/AppToaster.svelte`, `themes.test.ts`, `e2e/tocrail-636.mjs`; `packages/ui/src/tokens.css`. - Atomic commits: `92fbc77a3`, `9ad54f8c7`, `72b7ec519`, `7967ebe59`, `2af7cf8bb`.
Author
Owner

Finding: the failed count saw only day-2026-09-26, the first Agenda part. AgendaList intentionally mounts off-screen rows on approach (DESIGN §38, content-visibility and row observers), so the next-day row is not in the DOM at the same time. The workflow must visit each day card and assert its row separately, then compare the stable keys and continuation labels.

Finding: the failed count saw only day-2026-09-26, the first Agenda part. AgendaList intentionally mounts off-screen rows on approach (DESIGN §38, content-visibility and row observers), so the next-day row is not in the DOM at the same time. The workflow must visit each day card and assert its row separately, then compare the stable keys and continuation labels.
Author
Owner

Starting group-A verification on job/e2e-a-1071.

Branch head: 2af7cf8bb21a12cdd72f86b6338966f03f8b6777.
Current merge base: 2b6c77c14be78e7d1e1030e23b14c63a6772fca7.
Requested production rounds 8 and 9 base: 269b1b51b5774d79de08bfb31d058b3d248a7e7b (origin/dev).

Starting group-A verification on `job/e2e-a-1071`. Branch head: `2af7cf8bb21a12cdd72f86b6338966f03f8b6777`. Current merge base: `2b6c77c14be78e7d1e1030e23b14c63a6772fca7`. Requested production rounds 8 and 9 base: `269b1b51b5774d79de08bfb31d058b3d248a7e7b` (`origin/dev`).
Author
Owner

Finding: the Week identity check passed for both overnight Log segments, but the next assertion timed out waiting for a preview immediately after a fine-pointer click. Calendar click selects; Cmd+I opens the selected item card (DESIGN §34). The workflow now needs the documented Mac shortcut between those actions, as it already does for the overflow Event.

Finding: the Week identity check passed for both overnight Log segments, but the next assertion timed out waiting for a preview immediately after a fine-pointer click. Calendar click selects; Cmd+I opens the selected item card (DESIGN §34). The workflow now needs the documented Mac shortcut between those actions, as it already does for the overflow Event.
Author
Owner

Finding while running bun run check: perf-lint --check rejected scoped exception fingerprints after the merged production changes and this calendar slice changed Svelte component hashes. The affected scopes still emitted the same rule and symbol; none were removed or newly introduced. Refreshed 150 hash values in contracts/perf/registry.json and contracts/perf/exceptions.json (138 existing scopes plus 12 for the prior merged touch-target change). Verified all 440 changed diff lines are hash fields only, and scripts/perf-lint --check now reports perf-lint: PASS; 0 violations; 19340 scoped exceptions. This preserves existing limits, owners, and replacement tests.

Finding while running `bun run check`: `perf-lint --check` rejected scoped exception fingerprints after the merged production changes and this calendar slice changed Svelte component hashes. The affected scopes still emitted the same rule and symbol; none were removed or newly introduced. Refreshed 150 hash values in `contracts/perf/registry.json` and `contracts/perf/exceptions.json` (138 existing scopes plus 12 for the prior merged touch-target change). Verified all 440 changed diff lines are hash fields only, and `scripts/perf-lint --check` now reports `perf-lint: PASS; 0 violations; 19340 scoped exceptions`. This preserves existing limits, owners, and replacement tests.
Author
Owner

Finding (#1071, Notes/Search): the focused production workflow captured GET /api/v1/search?q=Gym immediately after fixture creation. It returned HTTP 200, indexing: true, completed_items: 0, timed_out: false; the Notes list already had both Notes and their paths, but Search returned only the Gym visit title hit with snippet: null. When the Unlinked mention appeared, Search reported indexing: false / 100% and returned the body hit with the matching Notes/...Gym visit.md path and snippet Meet friends at the Gym after work. The Notes path-to-ID projection was present in both states.

Root cause: loadUnlinkedMentions treated a partial Search result during a full Index scan as complete and changed the panel to its real-empty state. It did not retry after the Index finished. I am keeping Unlinked mentions in their existing loading state while Search reports an active scan, using bounded backoff and a retryable error after the wait limit, with unit and production E2E coverage.

Finding (#1071, Notes/Search): the focused production workflow captured `GET /api/v1/search?q=Gym` immediately after fixture creation. It returned HTTP 200, `indexing: true`, `completed_items: 0`, `timed_out: false`; the Notes list already had both Notes and their paths, but Search returned only the Gym visit title hit with `snippet: null`. When the Unlinked mention appeared, Search reported `indexing: false` / 100% and returned the body hit with the matching `Notes/...Gym visit.md` path and snippet `Meet friends at the Gym after work`. The Notes path-to-ID projection was present in both states. Root cause: `loadUnlinkedMentions` treated a partial Search result during a full Index scan as complete and changed the panel to its real-empty state. It did not retry after the Index finished. I am keeping Unlinked mentions in their existing loading state while Search reports an active scan, using bounded backoff and a retryable error after the wait limit, with unit and production E2E coverage.
Author
Owner

Decision for #1071: the Unlinked mentions helper waits up to 30 seconds while Search reports a full scan. It checks immediately, then backs off from 250 ms to 2 seconds. If the Index is still scanning at the limit, the existing section-local Retry state appears. DESIGN §28 and the shared UX rules do not set this wait limit; 30 seconds bounds background requests and leaves a clear recovery action.

Decision for #1071: the Unlinked mentions helper waits up to 30 seconds while Search reports a full scan. It checks immediately, then backs off from 250 ms to 2 seconds. If the Index is still scanning at the limit, the existing section-local Retry state appears. DESIGN §28 and the shared UX rules do not set this wait limit; 30 seconds bounds background requests and leaves a clear recovery action.
Author
Owner

Finding (#1071, layout): with the Nix libstdc++.so.6 path, Sharp loaded and layout-sweep advanced to its Money fixture. The first POST /api/v1/money/budgets returned 404 because a fresh User starts with Money disabled (money.mjs asserts user_enabled: false before opting in). The layout fixture seeds Money without enabling the Plugin first. I am fixing this harness setup through the existing /api/v1/plugins/money/me User toggle; no response expectation changes.

Finding (#1071, layout): with the Nix `libstdc++.so.6` path, Sharp loaded and `layout-sweep` advanced to its Money fixture. The first `POST /api/v1/money/budgets` returned 404 because a fresh User starts with Money disabled (`money.mjs` asserts `user_enabled: false` before opting in). The layout fixture seeds Money without enabling the Plugin first. I am fixing this harness setup through the existing `/api/v1/plugins/money/me` User toggle; no response expectation changes.
Author
Owner

Calendar document workflow evidence:

  • Product regression (#384, DESIGN §39): at 390 px, the short Log block was 21.48 px high while its title extended 12.64 px below the block (title bottom 306.31 px; block bottom 293.67 px). The hidden clock row still took layout space. The shared GridColumn now takes that row out of flow until its detail tier is visible. After the fix, the title bottom is 289.16 px inside a block ending at 293.08 px.
  • Stale Agenda assertion: the E2E expected standalone Files activity in Agenda. DESIGN §38 and AgendaList document that #413 removed those stacks. The workflow now checks their absence and taps the Log to expand its attached Receipt PDF deck.
  • Stale Files assertion: the E2E waited for a decoded image even when the real Files API had no thumbnail. FileThumb keeps a type glyph in that state. The workflow now checks all seven real file options and requires each to have an image or the shared glyph/type fallback.

calendar-doc-stack and calendar-crossday now pass against the rebuilt app. calendar-doc-stack saved 26 screenshots and calendar-crossday saved 60. Both use explicit macOS platform emulation and cover 390, 820 and 1440 px in light and dark.

Calendar document workflow evidence: - Product regression (#384, DESIGN §39): at 390 px, the short Log block was 21.48 px high while its title extended 12.64 px below the block (title bottom 306.31 px; block bottom 293.67 px). The hidden clock row still took layout space. The shared GridColumn now takes that row out of flow until its detail tier is visible. After the fix, the title bottom is 289.16 px inside a block ending at 293.08 px. - Stale Agenda assertion: the E2E expected standalone Files activity in Agenda. DESIGN §38 and AgendaList document that #413 removed those stacks. The workflow now checks their absence and taps the Log to expand its attached Receipt PDF deck. - Stale Files assertion: the E2E waited for a decoded image even when the real Files API had no thumbnail. FileThumb keeps a type glyph in that state. The workflow now checks all seven real file options and requires each to have an image or the shared glyph/type fallback. `calendar-doc-stack` and `calendar-crossday` now pass against the rebuilt app. `calendar-doc-stack` saved 26 screenshots and `calendar-crossday` saved 60. Both use explicit macOS platform emulation and cover 390, 820 and 1440 px in light and dark.
Author
Owner

preview-attach exposed stale selectors and keyboard assumptions in the workflow. In the current Calendar interaction contract (DESIGN §34), Enter edits a focused Journal item in the shared Composer, while Space opens its anchored preview; the test tried Enter then Cmd+I, so it left a modal Composer open and never opened the preview. The current dialog and card accessible name is “Journal” (previewLabel in the Calendar route and ItemPreview), not “Log entry”. I updated the workflow to use Space and the current accessible name. The next failure is the old attachment-input lookup; I am checking it against the current route-owned input before continuing.

`preview-attach` exposed stale selectors and keyboard assumptions in the workflow. In the current Calendar interaction contract (DESIGN §34), Enter edits a focused Journal item in the shared Composer, while Space opens its anchored preview; the test tried Enter then Cmd+I, so it left a modal Composer open and never opened the preview. The current dialog and card accessible name is “Journal” (`previewLabel` in the Calendar route and `ItemPreview`), not “Log entry”. I updated the workflow to use Space and the current accessible name. The next failure is the old attachment-input lookup; I am checking it against the current route-owned input before continuing.
Author
Owner

preview-attach also asserted obsolete Calendar action and hover behavior. The selected card currently exposes Info (which opens Info, <Journal title>), Attach File, Voice Memo, Edit Journal entry, Hide, Duplicate and Delete Journal entry; Copy link is a separate title control. It does not expose the old Open day slot. The transient hover card intentionally omits Delete because the route passes destructive logActions only to persistent previews. The observed hover card was 278×191 versus 290×199 for the selected card, with the same Journal content and all non-destructive actions. I updated assertions to check those current behaviors and compare content independently from action labels.

`preview-attach` also asserted obsolete Calendar action and hover behavior. The selected card currently exposes Info (which opens `Info, <Journal title>`), Attach File, Voice Memo, Edit Journal entry, Hide, Duplicate and Delete Journal entry; Copy link is a separate title control. It does not expose the old Open day slot. The transient hover card intentionally omits Delete because the route passes destructive `logActions` only to persistent previews. The observed hover card was 278×191 versus 290×199 for the selected card, with the same Journal content and all non-destructive actions. I updated assertions to check those current behaviors and compare content independently from action labels.
Author
Owner

The preview workflow reached the screenshot matrix and found its theme setup was stale: PUT /api/v1/appearance returned 422 for { auto_scheme: { mode, location: null } }. The current AutoSchemeSettings rejects unknown fields; Location lives in its own settings area. I removed the obsolete location field from this test payload. This is a harness-only update; the route behaved according to its current contract.

The preview workflow reached the screenshot matrix and found its theme setup was stale: `PUT /api/v1/appearance` returned 422 for `{ auto_scheme: { mode, location: null } }`. The current `AutoSchemeSettings` rejects unknown fields; Location lives in its own settings area. I removed the obsolete `location` field from this test payload. This is a harness-only update; the route behaved according to its current contract.
Author
Owner

At the 390 px screenshot pass, the old “all views have one identical box” assertion failed: the Day preview was 278×274 while Agenda, Week and Month were 290×285. The shared preview placement can shrink a card when an anchor leaves too little edge space (DESIGN §34); the action list and Journal content were identical. I changed the phone/tablet check to require each surface to fit the viewport and keep content/actions consistent. The equal-size assertion remains for wide viewports where the card has room.

At the 390 px screenshot pass, the old “all views have one identical box” assertion failed: the Day preview was 278×274 while Agenda, Week and Month were 290×285. The shared preview placement can shrink a card when an anchor leaves too little edge space (DESIGN §34); the action list and Journal content were identical. I changed the phone/tablet check to require each surface to fit the viewport and keep content/actions consistent. The equal-size assertion remains for wide viewports where the card has room.
Author
Owner

Search's Journal preview exposed a product regression. SearchPreview already owns VoiceRecorder, a VoiceRecordingPill, and Keep/Discard upload handlers, but it did not pass onrecordvoice into the shared ItemPreview; the availability gate therefore removed the Voice Memo action and left that recorder unreachable. I connected the existing callback. The Search dialog does not supply onopenday, so the stale test expectation for Open day was removed. Search's constrained preview pane also renders a different card box than Calendar; the workflow now compares real Journal content and current actions while checking the action row stays inside its surface.

Search's Journal preview exposed a product regression. `SearchPreview` already owns `VoiceRecorder`, a `VoiceRecordingPill`, and Keep/Discard upload handlers, but it did not pass `onrecordvoice` into the shared `ItemPreview`; the availability gate therefore removed the Voice Memo action and left that recorder unreachable. I connected the existing callback. The Search dialog does not supply `onopenday`, so the stale test expectation for Open day was removed. Search's constrained preview pane also renders a different card box than Calendar; the workflow now compares real Journal content and current actions while checking the action row stays inside its surface.
Author
Owner

The phone Calendar screenshot confirmed another stale test assumption: Calendar uses the anchored Journal popover on touch (DESIGN §34; CalendarPopover sets phoneSheet={false}), so the page has no .sheet-title. The accessible dialog is already named “Journal”; I removed the assertion that waited for a sheet header containing the item title. The production capture is artifacts/preview-attach/calendar-day-selected-light-390.png.

The phone Calendar screenshot confirmed another stale test assumption: Calendar uses the anchored Journal popover on touch (DESIGN §34; `CalendarPopover` sets `phoneSheet={false}`), so the page has no `.sheet-title`. The accessible dialog is already named “Journal”; I removed the assertion that waited for a sheet header containing the item title. The production capture is `artifacts/preview-attach/calendar-day-selected-light-390.png`.
Author
Owner

The Calendar Composer recording and save path now passed through Keep and appended the expected attachment count. The next stale assertion expected Documents/Voice memos/; DESIGN §48 and the Voice Memos migration specify the current canonical Documents/Voice Memos/ casing. I updated both path assertions in the workflow to match the designed path.

The Calendar Composer recording and save path now passed through Keep and appended the expected attachment count. The next stale assertion expected `Documents/Voice memos/`; DESIGN §48 and the Voice Memos migration specify the current canonical `Documents/Voice Memos/` casing. I updated both path assertions in the workflow to match the designed path.
Author
Owner

Group-A verification findings on job/e2e-a-1071:

  • Calendar layout: Sharp now loads with the Nix libstdc++. I corrected two stale measurements in layout-sweep.mjs: weekday/date full-width layout boxes overlapped even when their text ranges did not, and transformed MiniMonth padding was compared in unscaled units. The rerun checked 61 screens with 0 CSP reports, then was time-boxed after Calendar preview interactions stalled. It still reports title ink clipping in time blocks and 1.6–1.7px icon/label drift against the owner’s ±1px rule; the repeated 28px event slivers are under 30px. These remain open pending product/harness root cause.
  • Composer: reproduced the old failure at line 1271: DOM innerText was ["", "08:39\\nrollback second"] for two pending blocks. The blocks expose accessible labels, while TimeGrid uses content-visibility:auto. Updated the check to bring the blocks into view and assert both accessible names and their Sending state. The verification rerun then timed out at the separate attachment step (Attached not visible within 30 seconds, line 996; CSP 0 across 1 page), before it reached the updated assertion.
Group-A verification findings on `job/e2e-a-1071`: - Calendar layout: Sharp now loads with the Nix `libstdc++`. I corrected two stale measurements in `layout-sweep.mjs`: weekday/date full-width layout boxes overlapped even when their text ranges did not, and transformed MiniMonth padding was compared in unscaled units. The rerun checked 61 screens with 0 CSP reports, then was time-boxed after Calendar preview interactions stalled. It still reports title ink clipping in time blocks and 1.6–1.7px icon/label drift against the owner’s ±1px rule; the repeated 28px event slivers are under 30px. These remain open pending product/harness root cause. - Composer: reproduced the old failure at line 1271: DOM innerText was `["", "08:39\\nrollback second"]` for two pending blocks. The blocks expose accessible labels, while TimeGrid uses `content-visibility:auto`. Updated the check to bring the blocks into view and assert both accessible names and their `Sending` state. The verification rerun then timed out at the separate attachment step (`Attached` not visible within 30 seconds, line 996; CSP 0 across 1 page), before it reached the updated assertion.
Author
Owner

Workflow finding: preview-attach completed the Calendar and Search preview checks on rerun, then failed at Voice settings because it looked for #opt-models .account-row. Current VoiceSection.svelte renders a shared SettingsRow (li.settings-row) inside that card; the .account-row selector no longer exists in app code. I will update this stale e2e locator to assert the current row.

Workflow finding: `preview-attach` completed the Calendar and Search preview checks on rerun, then failed at Voice settings because it looked for `#opt-models .account-row`. Current `VoiceSection.svelte` renders a shared `SettingsRow` (`li.settings-row`) inside that card; the `.account-row` selector no longer exists in app code. I will update this stale e2e locator to assert the current row.
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#1071
No description provided.