Bug bash: calendar #1214

Open
opened 2026-10-06 19:01:14 +00:00 by kayg · 17 comments
Owner

AREA: Calendar Tab. Day/week/month/agenda views, mini-month, event create/edit/move/resize by drag and keyboard, all-day and multi-day, recurrence (exceptions, edits to this/following/all), time zones and DST changes (Europe/Berlin, Asia/Kolkata, America/New_York, Australia/Lord_Howe), reminders, invites shown, CalDAV-backed calendars, Copy link for days/weeks/events, sidebar sub-views.

Tracking issue for the 2026-10-07 bug bash. Every bug found gets its own issue, linked here.

AREA: Calendar Tab. Day/week/month/agenda views, mini-month, event create/edit/move/resize by drag and keyboard, all-day and multi-day, recurrence (exceptions, edits to this/following/all), time zones and DST changes (Europe/Berlin, Asia/Kolkata, America/New_York, Australia/Lord_Howe), reminders, invites shown, CalDAV-backed calendars, Copy link for days/weeks/events, sidebar sub-views. Tracking issue for the 2026-10-07 bug bash. Every bug found gets its own issue, linked here.
Author
Owner

Started the Calendar Tab bug bash on job/bash-calendar, based on origin/dev at ff53d7b8b4da5a21f862d57dcc3496f8c019f647. I am checking lead issue #1226 against the current app and its supplied production screenshots before deciding whether it is a real regression or a fixture artifact.

Started the Calendar Tab bug bash on `job/bash-calendar`, based on `origin/dev` at `ff53d7b8b4da5a21f862d57dcc3496f8c019f647`. I am checking lead issue #1226 against the current app and its supplied production screenshots before deciding whether it is a real regression or a fixture artifact.
Author
Owner

Lead #1226 is confirmed as a major on the current origin/dev production build, not an empty-data artifact. In an isolated User, the Week view omits all painted day headers and grid lines at 1440 px in both themes; the same occurs after 560 Journal entries are acknowledged through the real API. Evidence captures are under artifacts/bash-calendar/baseline/; the focused reproduction is apps/web/e2e/calendar-week-grid-1226.mjs. I am tracing the paint failure before selecting the fix.

Lead #1226 is confirmed as a major on the current `origin/dev` production build, not an empty-data artifact. In an isolated User, the Week view omits all painted day headers and grid lines at 1440 px in both themes; the same occurs after 560 Journal entries are acknowledged through the real API. Evidence captures are under `artifacts/bash-calendar/baseline/`; the focused reproduction is `apps/web/e2e/calendar-week-grid-1226.mjs`. I am tracing the paint failure before selecting the fix.
Author
Owner

Calendar bug bash update: the dense fixture shows a second, distinct Calendar issue that matches the existing #1162 report. After posting 560 real Journal entries, event cards appear at 1440 px but not at 390 or 820 px; the day headers and hour lines do appear at those widths. Evidence is in artifacts/bash-calendar/final/week-dense-{390,820,1440}-{light,dark}.png. I added the reproduction steps, severity (major), and all six screenshot paths to #1162 instead of opening a duplicate.

Calendar bug bash update: the dense fixture shows a second, distinct Calendar issue that matches the existing #1162 report. After posting 560 real Journal entries, event cards appear at 1440 px but not at 390 or 820 px; the day headers and hour lines do appear at those widths. Evidence is in `artifacts/bash-calendar/final/week-dense-{390,820,1440}-{light,dark}.png`. I added the reproduction steps, severity (major), and all six screenshot paths to #1162 instead of opening a duplicate.
Author
Owner

Additional minor Calendar bug filed as #1234: at 820 px, the visible range title truncates to O… in both themes. Evidence is in artifacts/bash-calendar/final/week-empty-820-{light,dark}.png and week-dense-820-{light,dark}.png. The title layout needs a focused follow-up; I did not change it in the #1226 paint fix.

Additional minor Calendar bug filed as #1234: at 820 px, the visible range title truncates to `O…` in both themes. Evidence is in `artifacts/bash-calendar/final/week-empty-820-{light,dark}.png` and `week-dense-820-{light,dark}.png`. The title layout needs a focused follow-up; I did not change it in the #1226 paint fix.
Author
Owner

Completed: Calendar Tab bug bash

Head: 61c92d3257cbcf344f607244fae9b1e82c5e86a4 (job/bash-calendar).

Issue Symptom Severity Result
#1226 Calendar Week view paints no day headers or grid at 1440 px in Chromium, in either theme. Major Fixed in 9ffef25b727e6cd124e68407f37cfee838917fde; follow-up comment and perf pin refresh in 61c92d3257cbcf344f607244fae9b1e82c5e86a4.
#1162 Dense Week view does not show event/Journal cards at 390/820 px, although the grid now paints; dense content paints at 1440 px. Major Filed only; shared grid behavior needs its owning issue. Evidence and reproduction notes are on #1162.
#1234 Month title truncates to its first letter at 820 px. Minor Filed only.

What changed

TimeGrid.svelte now selects the existing shared frame-offset fallback for Chromium and WebKit. Other timeline-capable engines keep the native timeline path. The regression test in apps/web/e2e/calendar-week-grid-1226.mjs runs the production app and local server, seeds data through the API, and checks empty and dense Week views at 390, 820 and 1440 px in light and dark themes. It also checks the accessible grid labels/region and pixel paint. The browser uses macOS platform emulation and reduced motion. Before/after screenshots for the full width/theme matrix are attached on #1226; local copies are under artifacts/bash-calendar/baseline/ and artifacts/bash-calendar/final/.

UX gaps closed

  • Restored visible weekday headers and time grid in Chromium Week view, including the desktop case from #1226.
  • Covered empty and API-seeded dense states at phone, tablet and desktop widths in both themes.
  • Added checks for accessible grid naming and actual rendered pixels, so a correct DOM with blank paint fails the regression test.

UX gaps left

  • #1162 remains open: dense event/Journal cards do not appear at phone and tablet widths.
  • This time-box did not exhaustively test create/edit/move/resize, recurrence exceptions and scopes, all-day and multi-day events, DST/time-zone changes, reminders, invites, CalDAV, event/day/week Copy link, or sidebar sub-views.
  • The existing apps/web/e2e/calendar.mjs header-only run has a Today assertion mismatch: actual 2026-10-19, expected 2026-10-06. The expectation was not changed; no cause was established in this round.
  • Two-tab edits, offline/slow-network recovery, reload mid-action, keyboard-only flows and a five-minute memory soak were not completed.

Performance

Local run of bench/week-scroll-1018.mjs --dense-only, with 650 days and 7,200 Logs, at 1440 px for one seven-day wheel sample:

  • Frame p50/p95: 50/100 ms.
  • Long tasks: 10; maximum 147 ms.
  • Browser RSS: 773,132,288 bytes before and 763,232,256 bytes after; heap 48,822,912 bytes.
  • Browser CPU 7.96 s; renderer task CPU 2.738 s.
  • Host load average before/after: [19.99, 21.23, 25.03] / [22.2, 21.63, 25.08].

This is a local, load-affected sample and is not comparable to the docs/perf/week-scroll-1018 baseline (different profile: 10-day wheel, baseline p95 183.4 ms). No valid regression delta is claimed. Expected added work is one engine choice and frame-offset setup per mounted time grid; scrolling uses the existing frame path.

Gates

git fetch origin && git merge origin/dev was attempted once before final gates. Fetch failed with ssh: connect to host 10.69.69.52 port 2222: No route to host, so no merge occurred and these results are pre-merge.

bun run check — exit 0. Captured output:

PASS production dependency licences: 759 locked package releases across apps/web, apps/docs and packages
perf-lint: PASS; 0 violations; 22615 scoped exceptions
User browser caches use userStorage; only documented device/public-link exceptions remain.
Glass alpha, blur and backdrop-filter roles use packages/ui/src/tokens.css.
Text sizes and UI shape values use shared role tokens.
Keyboard focus rings use the shared focus tokens.
UI transitions and animation options use shared motion tokens or documented exceptions.
svelte-check found 0 errors and 2 warnings in 2 files

The two warnings are existing empty rulesets in AttachmentDeck.svelte:1055 and AgendaList.svelte:1277.

bun run test --maxWorkers=2 — exit 0 (run after the functional changes; later changes were comments and exact perf pins):

 Test Files  282 passed (282)
      Tests  1978 passed (1978)
   Start at  23:59:03
   Duration  309.48s (transform 29%, environment 27%, import 21%, tests 17%, setup 5%)

cargo fmt --check — exit 0, no output. No Rust crates changed, so per-crate cargo clippy and cargo test were not applicable. cargo clean removed 9258 files (3.2 GiB). Web build output was removed.

Decisions where DESIGN.md is silent

Reuse the existing frame-offset fallback for Chromium and WebKit, and preserve the native timeline path for other engines. This is an implementation choice for the #1226 paint defect; it does not change the Calendar design.

Files changed

  • packages/ui/src/components/calendar/TimeGrid.svelte
  • apps/web/e2e/calendar-week-grid-1226.mjs
  • contracts/perf/adoption-1058.json
  • contracts/perf/exceptions.json
## Completed: Calendar Tab bug bash Head: `61c92d3257cbcf344f607244fae9b1e82c5e86a4` (`job/bash-calendar`). | Issue | Symptom | Severity | Result | |---|---|---:|---| | #1226 | Calendar Week view paints no day headers or grid at 1440 px in Chromium, in either theme. | Major | Fixed in `9ffef25b727e6cd124e68407f37cfee838917fde`; follow-up comment and perf pin refresh in `61c92d3257cbcf344f607244fae9b1e82c5e86a4`. | | #1162 | Dense Week view does not show event/Journal cards at 390/820 px, although the grid now paints; dense content paints at 1440 px. | Major | Filed only; shared grid behavior needs its owning issue. Evidence and reproduction notes are on #1162. | | #1234 | Month title truncates to its first letter at 820 px. | Minor | Filed only. | ### What changed `TimeGrid.svelte` now selects the existing shared frame-offset fallback for Chromium and WebKit. Other timeline-capable engines keep the native timeline path. The regression test in `apps/web/e2e/calendar-week-grid-1226.mjs` runs the production app and local server, seeds data through the API, and checks empty and dense Week views at 390, 820 and 1440 px in light and dark themes. It also checks the accessible grid labels/region and pixel paint. The browser uses macOS platform emulation and reduced motion. Before/after screenshots for the full width/theme matrix are attached on [#1226](https://git.kayg.org/kayg/calternal/issues/1226); local copies are under `artifacts/bash-calendar/baseline/` and `artifacts/bash-calendar/final/`. ### UX gaps closed - Restored visible weekday headers and time grid in Chromium Week view, including the desktop case from #1226. - Covered empty and API-seeded dense states at phone, tablet and desktop widths in both themes. - Added checks for accessible grid naming and actual rendered pixels, so a correct DOM with blank paint fails the regression test. ### UX gaps left - #1162 remains open: dense event/Journal cards do not appear at phone and tablet widths. - This time-box did not exhaustively test create/edit/move/resize, recurrence exceptions and scopes, all-day and multi-day events, DST/time-zone changes, reminders, invites, CalDAV, event/day/week Copy link, or sidebar sub-views. - The existing `apps/web/e2e/calendar.mjs` header-only run has a Today assertion mismatch: actual `2026-10-19`, expected `2026-10-06`. The expectation was not changed; no cause was established in this round. - Two-tab edits, offline/slow-network recovery, reload mid-action, keyboard-only flows and a five-minute memory soak were not completed. ### Performance Local run of `bench/week-scroll-1018.mjs --dense-only`, with 650 days and 7,200 Logs, at 1440 px for one seven-day wheel sample: - Frame p50/p95: 50/100 ms. - Long tasks: 10; maximum 147 ms. - Browser RSS: 773,132,288 bytes before and 763,232,256 bytes after; heap 48,822,912 bytes. - Browser CPU 7.96 s; renderer task CPU 2.738 s. - Host load average before/after: `[19.99, 21.23, 25.03]` / `[22.2, 21.63, 25.08]`. This is a local, load-affected sample and is not comparable to the `docs/perf/week-scroll-1018` baseline (different profile: 10-day wheel, baseline p95 183.4 ms). No valid regression delta is claimed. Expected added work is one engine choice and frame-offset setup per mounted time grid; scrolling uses the existing frame path. ### Gates `git fetch origin && git merge origin/dev` was attempted once before final gates. Fetch failed with `ssh: connect to host 10.69.69.52 port 2222: No route to host`, so no merge occurred and these results are pre-merge. `bun run check` — exit 0. Captured output: ``` PASS production dependency licences: 759 locked package releases across apps/web, apps/docs and packages perf-lint: PASS; 0 violations; 22615 scoped exceptions User browser caches use userStorage; only documented device/public-link exceptions remain. Glass alpha, blur and backdrop-filter roles use packages/ui/src/tokens.css. Text sizes and UI shape values use shared role tokens. Keyboard focus rings use the shared focus tokens. UI transitions and animation options use shared motion tokens or documented exceptions. svelte-check found 0 errors and 2 warnings in 2 files ``` The two warnings are existing empty rulesets in `AttachmentDeck.svelte:1055` and `AgendaList.svelte:1277`. `bun run test --maxWorkers=2` — exit 0 (run after the functional changes; later changes were comments and exact perf pins): ``` Test Files 282 passed (282) Tests 1978 passed (1978) Start at 23:59:03 Duration 309.48s (transform 29%, environment 27%, import 21%, tests 17%, setup 5%) ``` `cargo fmt --check` — exit 0, no output. No Rust crates changed, so per-crate `cargo clippy` and `cargo test` were not applicable. `cargo clean` removed 9258 files (3.2 GiB). Web build output was removed. ### Decisions where DESIGN.md is silent Reuse the existing frame-offset fallback for Chromium and WebKit, and preserve the native timeline path for other engines. This is an implementation choice for the #1226 paint defect; it does not change the Calendar design. ### Files changed - `packages/ui/src/components/calendar/TimeGrid.svelte` - `apps/web/e2e/calendar-week-grid-1226.mjs` - `contracts/perf/adoption-1058.json` - `contracts/perf/exceptions.json`
Author
Owner

Round 2 started on job/bash-calendar after fetching and merging origin/dev.

Starting job head before the merge: 61c92d3257cbcf344f607244fae9b1e82c5e86a4.
Fetched origin/dev: 3601719b80a39f712daf07b37879b22929dfffa0.
Merge result: a2d343da3527e5f7530e35cde8b68d6616fc3cd9.

I will continue the ordered Round 2 checks, file each discovered bug separately, and keep fixes inside the Calendar Tab area.

Round 2 started on `job/bash-calendar` after fetching and merging `origin/dev`. Starting job head before the merge: `61c92d3257cbcf344f607244fae9b1e82c5e86a4`. Fetched `origin/dev`: `3601719b80a39f712daf07b37879b22929dfffa0`. Merge result: `a2d343da3527e5f7530e35cde8b68d6616fc3cd9`. I will continue the ordered Round 2 checks, file each discovered bug separately, and keep fixes inside the Calendar Tab area.
Author
Owner

Round 2 finding filed as #1323: at 1440 x 1000 in Day view, a real writable CalDAV Event enters the drag ghost, but pointerup targets a DIV; no Calendar Event GET/PUT follows and the ghost remains. Evidence is in artifacts/bash-calendar/round2-drag-debug/. The issue appears to be in shared packages/ui TimeGrid pointer handling, so this Calendar job will not edit it. The production-server regression runner apps/web/e2e/calendar-drag-1015.mjs currently stops at this first Event drag.

Round 2 finding filed as #1323: at 1440 x 1000 in Day view, a real writable CalDAV Event enters the drag ghost, but pointerup targets a DIV; no Calendar Event GET/PUT follows and the ghost remains. Evidence is in `artifacts/bash-calendar/round2-drag-debug/`. The issue appears to be in shared `packages/ui` TimeGrid pointer handling, so this Calendar job will not edit it. The production-server regression runner `apps/web/e2e/calendar-drag-1015.mjs` currently stops at this first Event drag.
Author
Owner

Round 2 finding filed as #1324: creating a writable Event succeeds once under a rapid double submit, but editing it sends PUT with the Event occurrence ID including @<start instant>, returns HTTP 400, and leaves the old title. Evidence is in artifacts/bash-calendar/round2-edit/. I am fixing the Calendar route to write through the stable Event detail identity and adding a focused production E2E regression test.

Round 2 finding filed as #1324: creating a writable Event succeeds once under a rapid double submit, but editing it sends PUT with the Event occurrence ID including `@<start instant>`, returns HTTP 400, and leaves the old title. Evidence is in `artifacts/bash-calendar/round2-edit/`. I am fixing the Calendar route to write through the stable Event detail identity and adding a focused production E2E regression test.
Author
Owner

#1324 is fixed in febe9ef8a with a focused production E2E regression. The test was red before the change (PUT 400 on the occurrence ID) and is green after rebuilding the web bundle (PUT 200 through the stable detail ID). It also verifies double submit creates one Event.

#1324 is fixed in `febe9ef8a` with a focused production E2E regression. The test was red before the change (PUT 400 on the occurrence ID) and is green after rebuilding the web bundle (PUT 200 through the stable detail ID). It also verifies double submit creates one Event.
Author
Owner

Recurrence findings filed:

  • #1326: the server expands COUNT, EXDATE, detached RECURRENCE-ID, BYDAY, and inclusive UNTIL in the real Calendar range. However, editing a detached exception has no scope choice and the Composer shows “Changes could not be saved”; no PUT is sent.
  • #1327: the occurrence context menu exposes Copy link, Edit, Duplicate, and no Event Delete action, so this/following/all delete scopes are unavailable.

Evidence is in artifacts/bash-calendar/round2-recurrence/. I left both gaps filed only because the issue requires recurrence-scope behavior that is not specified in the design and this round forbids new features or redesigns.

Recurrence findings filed: - #1326: the server expands `COUNT`, `EXDATE`, detached `RECURRENCE-ID`, `BYDAY`, and inclusive `UNTIL` in the real Calendar range. However, editing a detached exception has no scope choice and the Composer shows “Changes could not be saved”; no PUT is sent. - #1327: the occurrence context menu exposes Copy link, Edit, Duplicate, and no Event Delete action, so this/following/all delete scopes are unavailable. Evidence is in `artifacts/bash-calendar/round2-recurrence/`. I left both gaps filed only because the issue requires recurrence-scope behavior that is not specified in the design and this round forbids new features or redesigns.
Author
Owner

Round 2 found and filed #1329 (major): vdirsyncer discovery succeeds, but khal new creates a valid non-UUID UID that the Journal CalDAV PUT path rejects with HTTP 403. Evidence is artifacts/bash-calendar/round2-caldav/khal-uid-rejection.json. I am continuing the round trip with a dashed UUID UID to cover the remaining client operations.

Round 2 found and filed #1329 (major): vdirsyncer discovery succeeds, but `khal new` creates a valid non-UUID UID that the Journal CalDAV PUT path rejects with HTTP 403. Evidence is `artifacts/bash-calendar/round2-caldav/khal-uid-rejection.json`. I am continuing the round trip with a dashed UUID UID to cover the remaining client operations.
Author
Owner

Round 2 finding: #1333 (major), Calendar Tab: a moved detached recurrence exception is omitted when its original recurrence slot falls inside the requested range. I edited a valid weekly series with khal, PUT the updated iCalendar with its observed ETag, and verified that the provider still stored the RECURRENCE-ID component moved from 09:00Z to 12:00Z. The production range API returned only the master at 09:00Z for 2026-10-17. Evidence: artifacts/bash-calendar/round2-caldav/external-recurrence-range.json. I am fixing this in the Calendar recurrence expansion code and adding a regression test.

Round 2 finding: #1333 (major), Calendar Tab: a moved detached recurrence exception is omitted when its original recurrence slot falls inside the requested range. I edited a valid weekly series with khal, PUT the updated iCalendar with its observed ETag, and verified that the provider still stored the `RECURRENCE-ID` component moved from 09:00Z to 12:00Z. The production range API returned only the master at 09:00Z for 2026-10-17. Evidence: `artifacts/bash-calendar/round2-caldav/external-recurrence-range.json`. I am fixing this in the Calendar recurrence expansion code and adding a regression test.
Author
Owner

Round 2 repro of #1162: with 560 Journal rows and 150 CalDAV Events seeded through the real APIs, Calendar Week at 390 px has no .block.plan.event-block DOM nodes, although /api/v1/calendar/range returns all 150 Events. The new Playwright check fails before pixel sampling. Evidence: artifacts/bash-calendar/round2-week-matrix/dense-390px-light-missing-event.png and dense-390px-light-missing-event.json. I am locating the owner boundary. The defect may be in the shared packages/ui TimeGrid, which this job must leave unchanged.

Round 2 repro of #1162: with 560 Journal rows and 150 CalDAV Events seeded through the real APIs, Calendar Week at 390 px has no `.block.plan.event-block` DOM nodes, although `/api/v1/calendar/range` returns all 150 Events. The new Playwright check fails before pixel sampling. Evidence: `artifacts/bash-calendar/round2-week-matrix/dense-390px-light-missing-event.png` and `dense-390px-light-missing-event.json`. I am locating the owner boundary. The defect may be in the shared `packages/ui` TimeGrid, which this job must leave unchanged.
Author
Owner

Correction to my previous #1162 report: the first node assertion ran after the grid became ready but before that page's Calendar range response arrived. The empty node list is not confirmed rendering evidence. The test now waits for a page-owned range response containing a seeded Event before it inspects the Week DOM and screenshot.

Correction to my previous #1162 report: the first node assertion ran after the grid became ready but before that page's Calendar range response arrived. The empty node list is not confirmed rendering evidence. The test now waits for a page-owned range response containing a seeded Event before it inspects the Week DOM and screenshot.
Author
Owner

Correction to my initial #1333 diagnosis: recurrence::expand_event passes a same-day detached override case and returns the moved Event at 12:00 while replacing the original 09:00 slot. The production account range mismatch still needs a fresh capture of the cached Event data. I have removed the unproven code fix and will report this finding as unresolved if the account-backed reproduction cannot be completed in this round.

Correction to my initial #1333 diagnosis: `recurrence::expand_event` passes a same-day detached override case and returns the moved Event at 12:00 while replacing the original 09:00 slot. The production account range mismatch still needs a fresh capture of the cached Event data. I have removed the unproven code fix and will report this finding as unresolved if the account-backed reproduction cannot be completed in this round.
Author
Owner

Final Round 2 evidence for #1162: the page-owned Calendar range response includes timed Events inside the selected week, then the test waits for network idle. At 390 px the columns report 101–103 items but the TimeGrid has zero .block, .block.plan and .event-block nodes; every column carries skip-offscreen. The shared primitive sets this state in packages/ui/src/components/calendar/TimeGrid.svelte and applies content-visibility: auto in GridColumn.svelte. Evidence: artifacts/bash-calendar/round2-week-matrix/dense-390px-light-missing-event.png and .json. Severity major. No edit made because shared packages/ui is owned outside this job.

Final Round 2 evidence for #1162: the page-owned Calendar range response includes timed Events inside the selected week, then the test waits for network idle. At 390 px the columns report 101–103 items but the TimeGrid has zero `.block`, `.block.plan` and `.event-block` nodes; every column carries `skip-offscreen`. The shared primitive sets this state in `packages/ui/src/components/calendar/TimeGrid.svelte` and applies `content-visibility: auto` in `GridColumn.svelte`. Evidence: `artifacts/bash-calendar/round2-week-matrix/dense-390px-light-missing-event.png` and `.json`. Severity major. No edit made because shared `packages/ui` is owned outside this job.
Author
Owner

Round 2 report

Branch: job/bash-calendar
Head: 34146e6382990a85a8c873ef32718c237d3193a1
The required final git fetch origin && git merge origin/dev completed with Already up to date.

Findings

Issue Symptom Severity Outcome
#1162 Dense Week has no visible Event cards at 390/820 px major Existing issue; reproduced with Events in the real range API. Filed only because the renderer is shared packages/ui TimeGrid.
#1234 Calendar title truncates at tablet width major Fixed in a6019dfe3; the 820 px title assertion passes.
#1230 Dense Week scroll exceeds the frame budget major Existing performance issue updated with local profile and trace; no fix because attribution lands in shared TimeGrid.
#1323 Event pointer move and resize leave a lifted ghost and send no PUT major Filed only; shared TimeGrid pointer handling. Resize evidence: artifacts/bash-calendar/round2-pointer-resize/event-drag-timeout.png.
#1324 Event edit used an occurrence ID as the write ID major Fixed in febe9ef8a; the edit now writes through the stable detail identity.
#1326 Recurrence exception editing has no this/following/all scope and sends no write major Filed only; scope write behavior is not defined in DESIGN §30.
#1327 Recurring Event menu has no scoped delete action major Filed only; scope delete behavior is not defined in DESIGN §30.
#1329 khal new UID is rejected by the CalDAV endpoint major Filed only; current server contract accepts namespaced IDs or UUIDs.
#1333 Detached recurrence exception survives provider edit but is absent from the account-backed range response major Filed only; direct expansion passes, but the account/cache path still needs a fresh capture.

Built and verified

  • a6019dfe3 adds an opt-in compact-control breakpoint to the shared ModeHeader and a tablet title assertion. The real production screenshot matrix covers 390/820/1440 px, light/dark, reduced motion, and macOS emulation: artifacts/bash-calendar/round2-week-matrix/week-empty-{390,820,1440}-{light,dark}.png.
  • febe9ef8a fixes Event edit identity and adds a real-provider create, duplicate-submit, and edit regression runner. One rapid double submit creates one provider object.
  • Pointer move and resize did not commit. Month touch move and Undo passed. Day keyboard move and Undo passed.
  • Recurrence COUNT, UNTIL, BYDAY, EXDATE, and detached override expansion passed direct production checks. UI edit/delete scope actions remain absent.
  • DST checks passed: Berlin 2026-10-25 spans 01:30 +02 to 03:30 +01; New York 2026-11-01 spans 00:00 -04 to 03:00 -05; a Kolkata view shows the Berlin Event at 04:00; Lord Howe's 30-minute shift maps 01:30 +10:30 to 03:00 +11:00; the all-day Event stays on Oct 25.
  • vdirsyncer/khal create, edit, and delete round trips passed for Calternal-compatible IDs. Standard khal UID rejection and the account-backed detached-exception mismatch are tracked in #1329 and #1333.
  • A real-server Playwright check passed day, week, and Event Copy links; exact route restoration; two tabs opening the same Event; offline retention of the open view; and successful online reload. It did not edit in one tab and assert live update in the other.
  • Dense Week evidence: artifacts/bash-calendar/round2-week-matrix/dense-390px-light-missing-event.png and its JSON capture.

Performance

The perf VM was reserved by tabswitch-1233, so this is a local profile, not a clean VM comparison. The 1440×900 production Week profile used a 4× Chromium CPU throttle; host load was 36.8 / 44.7 / 46.9. Vertical scroll frame p50/p95 was 100 / 183.4 ms, with 24 long animation frames and 0 long tasks. Horizontal fling frame p50/p95 was 83.3 / 450 ms; the largest layout event was 43.8 ms and style recalculation totaled 491.4 ms. The <16.7 ms p95 target was not met. Evidence: artifacts/bash-calendar/round2-perf.json and artifacts/bash-calendar/round2-perf/.

Gates

cargo fmt --check: exit 0, no output. No Rust source changed, so per-crate clippy/test gates were not applicable.

Final bun run check summary output:

PASS production dependency licences: 759 locked package releases across apps/web, apps/docs and packages
perf-lint: PASS; 0 violations; 22548 scoped exceptions
User browser caches use userStorage; only documented device/public-link exceptions remain.
Glass alpha, blur and backdrop-filter roles use packages/ui/src/tokens.css.
Text sizes and UI shape values use shared role tokens.
Keyboard focus rings use the shared focus tokens.
UI transitions and animation options use shared motion tokens or documented exceptions.
Warn: Do not use empty rulesets (css)
svelte-check found 0 errors and 1 warning in 1 file

The warning is in unchanged packages/ui/src/components/calendar/AttachmentDeck.svelte:1055 (.attachment-row:focus {}). The first check run found the moved Calendar page pin; the exact #1058 pins were refreshed and committed as 34146e638, with no ratchet increase.

bun run test was time-boxed and stopped with exit 143 after 18 of 287 test files; it reported 22 failed tests, mainly 5–12 second timeouts, and produced no final suite summary. Its dependency and perf-source phases did pass:

Ran 136 tests in 0.689s
OK
8 pass
0 fail
16 expect() calls
Ran 8 tests across 1 file. [2.17s]
error: script "test" exited with code 143

Focused follow-up (bunx vitest run src/lib/modeHeader.svelte.test.ts src/lib/calendar/TimeGrid.svelte.test.ts src/routes/settings/calendars/CalendarsSection.svelte.test.ts --maxWorkers=2):

 Test Files  1 failed | 2 passed (3)
      Tests  1 failed | 38 passed (39)
   Start at  10:37:49
   Duration  132.49s (transform 73%, tests 9%, environment 8%, setup 5%, import 5%)

  Transform  |component| transforming modules took 186.68s · 73% of tracked time, re-done on every run

ModeHeader and TimeGrid passed in the focused run. The Calendar settings test timed out at its 5-second limit. The broad apps/web/e2e/deeplinks.mjs runner also stopped before Calendar coverage because its Money fixture timed out waiting for Budget name; the isolated Calendar link check above passed.

UX gaps left

  • Pointer Event move/resize does not save (#1323).
  • Recurrence edit/delete scopes are absent (#1326, #1327).
  • Standard khal UIDs are rejected and the account-backed exception is missing from range data (#1329, #1333).
  • Dense Week cards are missing at narrow widths (#1162), and the Week scroll target is unmet (#1230).
  • A live edit in one tab was not verified in the other tab.
  • The full web test suite and broad deep-link suite did not complete.

Decisions

  • DESIGN §30 does not define this/following/all recurrence write or delete semantics. I did not invent those rules; I recorded the missing behavior in #1326 and #1327.
  • I used the local performance run because the shared perf VM was occupied. Its numbers are labeled local and are not treated as a clean baseline comparison.
  • Deep links use the existing DESIGN §33 routes for day, week, and stable Event identity.

For the merge round

  • cd apps/web && bun run test must finish all 287 files with zero failures.
  • Re-run node apps/web/e2e/deeplinks.mjs after its Money setup fixture is corrected; it must reach and pass Calendar link coverage.
## Round 2 report Branch: `job/bash-calendar` Head: `34146e6382990a85a8c873ef32718c237d3193a1` The required final `git fetch origin && git merge origin/dev` completed with `Already up to date.` ### Findings | Issue | Symptom | Severity | Outcome | | --- | --- | --- | --- | | #1162 | Dense Week has no visible Event cards at 390/820 px | major | Existing issue; reproduced with Events in the real range API. Filed only because the renderer is shared `packages/ui` TimeGrid. | | #1234 | Calendar title truncates at tablet width | major | Fixed in `a6019dfe3`; the 820 px title assertion passes. | | #1230 | Dense Week scroll exceeds the frame budget | major | Existing performance issue updated with local profile and trace; no fix because attribution lands in shared TimeGrid. | | #1323 | Event pointer move and resize leave a lifted ghost and send no PUT | major | Filed only; shared TimeGrid pointer handling. Resize evidence: `artifacts/bash-calendar/round2-pointer-resize/event-drag-timeout.png`. | | #1324 | Event edit used an occurrence ID as the write ID | major | Fixed in `febe9ef8a`; the edit now writes through the stable detail identity. | | #1326 | Recurrence exception editing has no this/following/all scope and sends no write | major | Filed only; scope write behavior is not defined in DESIGN §30. | | #1327 | Recurring Event menu has no scoped delete action | major | Filed only; scope delete behavior is not defined in DESIGN §30. | | #1329 | `khal new` UID is rejected by the CalDAV endpoint | major | Filed only; current server contract accepts namespaced IDs or UUIDs. | | #1333 | Detached recurrence exception survives provider edit but is absent from the account-backed range response | major | Filed only; direct expansion passes, but the account/cache path still needs a fresh capture. | ### Built and verified - `a6019dfe3` adds an opt-in compact-control breakpoint to the shared ModeHeader and a tablet title assertion. The real production screenshot matrix covers 390/820/1440 px, light/dark, reduced motion, and macOS emulation: `artifacts/bash-calendar/round2-week-matrix/week-empty-{390,820,1440}-{light,dark}.png`. - `febe9ef8a` fixes Event edit identity and adds a real-provider create, duplicate-submit, and edit regression runner. One rapid double submit creates one provider object. - Pointer move and resize did not commit. Month touch move and Undo passed. Day keyboard move and Undo passed. - Recurrence COUNT, UNTIL, BYDAY, EXDATE, and detached override expansion passed direct production checks. UI edit/delete scope actions remain absent. - DST checks passed: Berlin 2026-10-25 spans 01:30 +02 to 03:30 +01; New York 2026-11-01 spans 00:00 -04 to 03:00 -05; a Kolkata view shows the Berlin Event at 04:00; Lord Howe's 30-minute shift maps 01:30 +10:30 to 03:00 +11:00; the all-day Event stays on Oct 25. - vdirsyncer/khal create, edit, and delete round trips passed for Calternal-compatible IDs. Standard khal UID rejection and the account-backed detached-exception mismatch are tracked in #1329 and #1333. - A real-server Playwright check passed day, week, and Event Copy links; exact route restoration; two tabs opening the same Event; offline retention of the open view; and successful online reload. It did not edit in one tab and assert live update in the other. - Dense Week evidence: `artifacts/bash-calendar/round2-week-matrix/dense-390px-light-missing-event.png` and its JSON capture. ### Performance The perf VM was reserved by `tabswitch-1233`, so this is a local profile, not a clean VM comparison. The 1440×900 production Week profile used a 4× Chromium CPU throttle; host load was 36.8 / 44.7 / 46.9. Vertical scroll frame p50/p95 was 100 / 183.4 ms, with 24 long animation frames and 0 long tasks. Horizontal fling frame p50/p95 was 83.3 / 450 ms; the largest layout event was 43.8 ms and style recalculation totaled 491.4 ms. The <16.7 ms p95 target was not met. Evidence: `artifacts/bash-calendar/round2-perf.json` and `artifacts/bash-calendar/round2-perf/`. ### Gates `cargo fmt --check`: exit 0, no output. No Rust source changed, so per-crate clippy/test gates were not applicable. Final `bun run check` summary output: ```text PASS production dependency licences: 759 locked package releases across apps/web, apps/docs and packages perf-lint: PASS; 0 violations; 22548 scoped exceptions User browser caches use userStorage; only documented device/public-link exceptions remain. Glass alpha, blur and backdrop-filter roles use packages/ui/src/tokens.css. Text sizes and UI shape values use shared role tokens. Keyboard focus rings use the shared focus tokens. UI transitions and animation options use shared motion tokens or documented exceptions. Warn: Do not use empty rulesets (css) svelte-check found 0 errors and 1 warning in 1 file ``` The warning is in unchanged `packages/ui/src/components/calendar/AttachmentDeck.svelte:1055` (`.attachment-row:focus {}`). The first check run found the moved Calendar page pin; the exact #1058 pins were refreshed and committed as `34146e638`, with no ratchet increase. `bun run test` was time-boxed and stopped with exit 143 after 18 of 287 test files; it reported 22 failed tests, mainly 5–12 second timeouts, and produced no final suite summary. Its dependency and perf-source phases did pass: ```text Ran 136 tests in 0.689s OK 8 pass 0 fail 16 expect() calls Ran 8 tests across 1 file. [2.17s] error: script "test" exited with code 143 ``` Focused follow-up (`bunx vitest run src/lib/modeHeader.svelte.test.ts src/lib/calendar/TimeGrid.svelte.test.ts src/routes/settings/calendars/CalendarsSection.svelte.test.ts --maxWorkers=2`): ```text Test Files 1 failed | 2 passed (3) Tests 1 failed | 38 passed (39) Start at 10:37:49 Duration 132.49s (transform 73%, tests 9%, environment 8%, setup 5%, import 5%) Transform |component| transforming modules took 186.68s · 73% of tracked time, re-done on every run ``` ModeHeader and TimeGrid passed in the focused run. The Calendar settings test timed out at its 5-second limit. The broad `apps/web/e2e/deeplinks.mjs` runner also stopped before Calendar coverage because its Money fixture timed out waiting for `Budget name`; the isolated Calendar link check above passed. ### UX gaps left - Pointer Event move/resize does not save (#1323). - Recurrence edit/delete scopes are absent (#1326, #1327). - Standard khal UIDs are rejected and the account-backed exception is missing from range data (#1329, #1333). - Dense Week cards are missing at narrow widths (#1162), and the Week scroll target is unmet (#1230). - A live edit in one tab was not verified in the other tab. - The full web test suite and broad deep-link suite did not complete. ### Decisions - DESIGN §30 does not define this/following/all recurrence write or delete semantics. I did not invent those rules; I recorded the missing behavior in #1326 and #1327. - I used the local performance run because the shared perf VM was occupied. Its numbers are labeled local and are not treated as a clean baseline comparison. - Deep links use the existing DESIGN §33 routes for day, week, and stable Event identity. ### For the merge round - `cd apps/web && bun run test` must finish all 287 files with zero failures. - Re-run `node apps/web/e2e/deeplinks.mjs` after its Money setup fixture is corrected; it must reach and pass Calendar link coverage.
Commenting is not possible because the repository is archived.
No labels
No milestone
No project
No assignees
1 participant
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-v0#1214
No description provided.