Calendar: new Task shows on the previous day and in the all-day lane; Tasks without dates should appear at the time they were added #655

Closed
opened 2026-10-02 04:19:17 +00:00 by kayg · 22 comments
Owner

Owner report (2026-10-02, calternal.cloud, merge round 6 c4a61e8cf)

"I added a new task and it got added to the 1st October rather than today? And why are these all-day items? They should just appear when they were added."

Screenshot: Week view, Thu 1 Oct all-day lane shows "Pay webtropia bill" plus "+1"; the popover lists "Pay webtropia bill" and "Pay Electricity Bill". Today is Fri 2 Oct.

Evidence (production index, read-only)

Task file created in index due / scheduled / start
Notes/20261001-pay-webtropia-bill-….md 2026-10-01 none
Notes/20261002-pay-electricity-bill-….md 2026-10-02 none

The index stores the new task as created on 2 Oct, but the Calendar draws it on 1 Oct: an off-by-one-day in placement. Likely suspects: a date-only created value parsed as UTC midnight and converted to a local day (or the reverse); a server-side range query in the host timezone (CEST) instead of the User's timezone; or the week-state/visible-range store (#609) grouping by a UTC day key. The owner is in IST (UTC+5:30); the server runs in CEST.

Expected (owner decision)

  1. A Task with no due/scheduled/start appears at the moment it was added: a timed item at its creation time on its creation day, in the User's timezone. It is not an all-day item. The creation time needs minute precision: keep the full created timestamp (with offset) in the Task's frontmatter/index, not only a date. Existing date-only Tasks with no recorded time fall back to the all-day lane of their creation day.
  2. Placement uses the User's timezone everywhere (server and client), with one shared day-key helper. Never use the host timezone or UTC midnight for date-only values.
  3. Due/scheduled/start keep their own placement rules (DESIGN): a date-only due date is all-day on that date; a timed one is timed.
  4. Reminders/CalDAV (#647) and MCP see the same placement.

Tests

  • Server and client unit tests across timezones: UTC−10, UTC, CEST, IST (+5:30) and +14, at times near midnight. A Task created at 00:30 IST on 2 Oct must land on 2 Oct.
  • e2e like a User: create a Task from the Composer at a fixed clock in IST. It must appear as a timed item at that time on today's column, not in the all-day lane, and stay there after a reload.
## Owner report (2026-10-02, calternal.cloud, merge round 6 `c4a61e8cf`) "I added a new task and it got added to the 1st October rather than today? And why are these all-day items? They should just appear when they were added." Screenshot: Week view, Thu 1 Oct all-day lane shows "Pay webtropia bill" plus "+1"; the popover lists "Pay webtropia bill" and "Pay Electricity Bill". Today is Fri 2 Oct. ## Evidence (production index, read-only) | Task file | `created` in index | due / scheduled / start | |---|---|---| | `Notes/20261001-pay-webtropia-bill-….md` | 2026-10-01 | none | | `Notes/20261002-pay-electricity-bill-….md` | **2026-10-02** | none | The index stores the new task as created on 2 Oct, but the Calendar draws it on **1 Oct**: an off-by-one-day in placement. Likely suspects: a date-only `created` value parsed as UTC midnight and converted to a local day (or the reverse); a server-side range query in the host timezone (CEST) instead of the User's timezone; or the week-state/visible-range store (#609) grouping by a UTC day key. The owner is in IST (UTC+5:30); the server runs in CEST. ## Expected (owner decision) 1. **A Task with no due/scheduled/start appears at the moment it was added**: a timed item at its creation time on its creation day, in the User's timezone. It is not an all-day item. The creation time needs minute precision: keep the full created timestamp (with offset) in the Task's frontmatter/index, not only a date. Existing date-only Tasks with no recorded time fall back to the all-day lane of their creation day. 2. **Placement uses the User's timezone everywhere** (server and client), with one shared day-key helper. Never use the host timezone or UTC midnight for date-only values. 3. Due/scheduled/start keep their own placement rules (DESIGN): a date-only due date is all-day on that date; a timed one is timed. 4. Reminders/CalDAV (#647) and MCP see the same placement. ## Tests - Server and client unit tests across timezones: UTC−10, UTC, CEST, IST (+5:30) and +14, at times near midnight. A Task created at 00:30 IST on 2 Oct must land on 2 Oct. - e2e like a User: create a Task from the Composer at a fixed clock in IST. It must appear as a timed item at that time on today's column, not in the all-day lane, and stay there after a reload.
Author
Owner

Starting #655 and #657 on branch job/taskday-655 from origin/dev at c4a61e8cf0. I have read the issue expectations and DESIGN §§30–34, 38–41, 51 and 57. I am tracing the task created timestamp and Calendar projection first, then checkbox actions and the all-day overflow row alignment.

Starting #655 and #657 on branch job/taskday-655 from origin/dev at c4a61e8cf090170f35b1bed3350d9de20c83ecd5. I have read the issue expectations and DESIGN §§30–34, 38–41, 51 and 57. I am tracing the task created timestamp and Calendar projection first, then checkbox actions and the all-day overflow row alignment.
Author
Owner

Finding: the /api/v1/notes/tasks/day projection preferred an attached Daily note over a Task's own creation day. A Task created on 2 Oct and attached to a 1 Oct Log therefore appeared on 1 Oct, although the index's created field was 2 Oct. The implementation now prioritizes explicit due/scheduled/start placement, then the User-zone creation day; date-only legacy Tasks retain their written day. New file Tasks also persist a minute-precision RFC 3339 created_at with the User offset. I am adding the migration, DAV projection and Calendar coverage next.

Finding: the `/api/v1/notes/tasks/day` projection preferred an attached Daily note over a Task's own creation day. A Task created on 2 Oct and attached to a 1 Oct Log therefore appeared on 1 Oct, although the index's `created` field was 2 Oct. The implementation now prioritizes explicit due/scheduled/start placement, then the User-zone creation day; date-only legacy Tasks retain their written day. New file Tasks also persist a minute-precision RFC 3339 `created_at` with the User offset. I am adding the migration, DAV projection and Calendar coverage next.
Author
Owner

Verification finding: cargo test -p calternal-plugin-notes had one failure in the existing Journal test tests::daily_and_composer_preserve_unrelated_bytes: its GET /journal/2026-09-24 returned 404 instead of 200. I reran that test by name immediately after the suite and it passed (1 passed, 168 filtered out). The test expectation is unchanged. This appears unrelated to Task placement or checkbox changes; I am preserving the failure in the final gate report.

Verification finding: `cargo test -p calternal-plugin-notes` had one failure in the existing Journal test `tests::daily_and_composer_preserve_unrelated_bytes`: its GET `/journal/2026-09-24` returned 404 instead of 200. I reran that test by name immediately after the suite and it passed (1 passed, 168 filtered out). The test expectation is unchanged. This appears unrelated to Task placement or checkbox changes; I am preserving the failure in the final gate report.
Author
Owner

Completed

  • Fixed #655: new undated Tasks keep a minute-precision RFC 3339 creation timestamp with its original offset. Calendar placement derives the day and minute in the captured User timezone. Existing date-only Tasks stay all-day on their written creation day.
  • Fixed #657: Tasks can be completed or reopened from timed rows, all-day rows, the +N popover, Month, Agenda, the Calendar preview, and the Search Task preview. Writes update every mounted occurrence, preserve the latest status across stale range responses, and use the shared Undo stack.
  • Aligned the +N All-day items rows: checkbox, icon and title centers are within 1 CSS px of the row center; the heading-to-list gap is at least 6 px. The shared checkbox has a 44 px target, an accessible name/state, Space support and a shortcut tooltip.

Files

  • Calendar data and state: apps/web/src/lib/calendar/data.ts, apps/web/src/lib/calendar/data.test.ts, apps/web/src/lib/calendar/edits.ts, apps/web/src/lib/calendar/edits.test.ts, apps/web/src/lib/calendar/model.test.ts, packages/ui/src/components/calendar/model.ts.
  • Task storage and projections: crates/calternal-notes-core/src/tasks/extract.rs, crates/calternal-notes-core/src/tasks/model.rs, crates/plugins/notes/migrations/0025_task_created_instant.sql, crates/plugins/notes/src/lib.rs, crates/plugins/notes/src/store.rs, crates/plugins/notes/src/tasks_api.rs, crates/plugins/notes/src/tasks_dav.rs, crates/plugins/notes/src/tasks_store.rs, crates/calternal-dav/src/reminders.rs, crates/calternal-dav/tests/apple_replay.rs, contracts/openapi.json, packages/api-client/src/generated.ts.
  • Calendar controls: apps/web/src/lib/tasks/write.ts, apps/web/src/lib/search/SearchPreview.svelte, apps/web/src/routes/calendar/[view]/[date]/+page.svelte, packages/ui/src/components/Checkbox.svelte, packages/ui/src/components/calendar/AgendaList.svelte, packages/ui/src/components/calendar/GridColumn.svelte, packages/ui/src/components/calendar/ItemPreview.svelte, packages/ui/src/components/calendar/MonthGrid.svelte, packages/ui/src/components/calendar/TaskCheckbox.svelte, packages/ui/src/components/calendar/TimeGrid.svelte.
  • Review and profile: apps/web/e2e/calendar-taskday-655-657.mjs, apps/web/e2e/calendar-task-overflow.mjs, apps/web/e2e/harness.mjs, apps/web/package.json, bench/task-calendar-655.py, tests/adversarial/attack.py.

Commits

  • e4eb78ee7 Place undated Tasks at their creation instant
  • 401a3480c Reuse the Calendar request zone for Task ranges
  • 9968f4d3f Make Calendar Task checkboxes work everywhere

Head: 9968f4d3f46fd2851f6ece928737238ec28574fa. git fetch origin && git merge origin/dev completed; origin/dev was already up to date. No push or deploy.

E2E and screenshots

The production e2e created a Task at 2026-10-02T00:30:00+05:30, asserted it appeared timed at 00:30 in the 2 Oct IST column, and confirmed that placement after reload. It also exercised shared writes, Undo, keyboard reopening, two-tab refresh, Search, Agenda, Week, Month, and all-day overflow. Hostile IANA timezone values returned 400.

Task placement and completion: 30 production screenshots saved in /home/kayg/Developer/calternal-wt/taskday-655/artifacts/taskday-655-657

All 30 screenshots are attached to this issue: Day overflow, Week, Month, Agenda and Search at 390, 820 and 1440 px in light and dark. The 390 px captures use DPR 3. Overflow geometry was checked for both themes at all three widths.

Performance profile

Local run, commit 9968f4d3f, host calternal-dev. Load average was 17.35/19.38/21.01 before and 23.35/21.82/21.53 after. The closest entry in docs/perf/baseline.json is the Task-anchor profile, which is a different request path; these are reported side by side, not as a direct regression comparison.

Profile p50 p95 CPU Mean RSS Peak RSS
Calendar range, 96 Tasks / 24 reads 19.61 ms 33.53 ms 78.57% / 0.49 s 320,359,765 B 320,753,664 B
Calendar range + completion burst, 500 Tasks / 24 reads + 24 writes 382.11 ms 7,937.38 ms 44.18% / 3.84 s 492,814,918 B 497,725,440 B
Existing task_anchors_96_average baseline 1,151.66 ms 3,896.05 ms 62.68% / 11.43 s 210,964,075 B 332,005,376 B
Existing task_anchors_96_worst_case_burst baseline 12,781.56 ms 15,748.30 ms 33.10% / 5.25 s 353,143,879 B 362,692,608 B

Gates — verbatim result lines

cargo fmt --check exited 0 with no output.

cargo clippy -p calternal-notes-core --all-targets -- -D warnings passed:

Finished `dev` profile [unoptimized + debuginfo] target(s) in 6.34s
test result: ok. 521 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.48s
test result: ok. 19 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.69s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.46s
test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

cargo clippy -p calternal-dav --all-targets -- -D warnings passed.

Finished `dev` profile [unoptimized + debuginfo] target(s) in 37.14s
test result: ok. 42 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.36s
test result: ok. 36 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

cargo clippy -p calternal-plugin-notes --all-targets -- -D warnings passed:

Finished `dev` profile [unoptimized + debuginfo] target(s) in 13.16s

Its full test gate had two failures:

assertion `left == right` failed
  left: 404
 right: 200
Journal PATCH storm did not finish within the HTTP timeout: Elapsed(())
test result: FAILED. 167 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out; finished in 157.25s

The 404 was from the existing daily_and_composer_preserve_unrelated_bytes test; an earlier isolated rerun passed, but the final full suite failed it again. journal_patch_storm_finishes_with_one_winner_and_stale_preconditions exceeded its timeout while the host had multiple Cargo and browser jobs active.

cargo clippy -p calternal-server --all-targets -- -D warnings passed:

Finished `dev` profile [unoptimized + debuginfo] target(s) in 8m 29s
test result: ok. 107 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 12.31s

bun run check passed:

User browser caches use userStorage; only documented device/public-link exceptions remain.
Text sizes and UI shape values use shared role tokens.
UI transitions and animation options use shared motion tokens or documented exceptions.
svelte-check found 0 errors and 0 warnings

bun run test passed:

Test Files  153 passed (153)
      Tests  1062 passed (1062)
   Start at  10:26:33
   Duration  118.94s (transform 49%, environment 18%, import 16%, tests 13%, setup 4%)

Adversarial round and follow-ups

The one local tests/adversarial/run.sh round exercised the Task hostile-timezone cases and broad API/storm probes. The Task timezone cases produced no findings; the server stayed alive through the API campaign. The run ended with exit 130 during dedup setup because this invocation had no built calternal CLI; three browser helpers also lacked CALTERNAL_SERVER_BIN and could not start. I did not repeat the round. Host load was around 22, and many requests were labelled SLOW with expected HTTP statuses.

Non-SLOW evidence was filed for owner review:

  • #707: Photos shared timeline returned an extra User's item in the isolation probe.
  • #708: the probe expects no saved Appearance scheme and 201 for a conditional DAV update; it received system and 204, then made later requests with a stale ETag.
  • #709: burst timeouts and incomplete Calendar/Task projections under the loaded host.

UX gaps closed

  • Completion now works wherever the Calendar exposes a Task, including the overflow popover and preview surfaces. State changes update mounted occurrences, the Undo action and peer Calendar tabs.
  • Pointer, touch and keyboard paths are covered; checkbox targets are 44 px, named and stateful for assistive technology, with Space and shortcut tooltip.
  • The all-day overflow row’s checkbox glyph and title center on its row box within 1 CSS px, with a separate heading gap.
  • Empty, loading and write-error behavior uses existing real API and toast flows; no sample Tasks were added.

UX gaps left: none known on the covered surfaces.

Decisions not stated in DESIGN

  • A captured Calendar request uses one User timezone for every range chunk and its Task projection. Invalid timezone query values return 400.
  • The Month surface shows one Task at a time on coarse pointers and puts the rest behind “More” so Task actions keep a 44 px target.
  • Search keeps the checkbox in the Task preview, not nested in the result listbox option, to preserve listbox keyboard semantics.
  • Legacy date-only Tasks have no invented instant; they remain all-day on the written creation day.
## Completed - Fixed #655: new undated Tasks keep a minute-precision RFC 3339 creation timestamp with its original offset. Calendar placement derives the day and minute in the captured User timezone. Existing date-only Tasks stay all-day on their written creation day. - Fixed #657: Tasks can be completed or reopened from timed rows, all-day rows, the +N popover, Month, Agenda, the Calendar preview, and the Search Task preview. Writes update every mounted occurrence, preserve the latest status across stale range responses, and use the shared Undo stack. - Aligned the +N All-day items rows: checkbox, icon and title centers are within 1 CSS px of the row center; the heading-to-list gap is at least 6 px. The shared checkbox has a 44 px target, an accessible name/state, Space support and a shortcut tooltip. ## Files - Calendar data and state: `apps/web/src/lib/calendar/data.ts`, `apps/web/src/lib/calendar/data.test.ts`, `apps/web/src/lib/calendar/edits.ts`, `apps/web/src/lib/calendar/edits.test.ts`, `apps/web/src/lib/calendar/model.test.ts`, `packages/ui/src/components/calendar/model.ts`. - Task storage and projections: `crates/calternal-notes-core/src/tasks/extract.rs`, `crates/calternal-notes-core/src/tasks/model.rs`, `crates/plugins/notes/migrations/0025_task_created_instant.sql`, `crates/plugins/notes/src/lib.rs`, `crates/plugins/notes/src/store.rs`, `crates/plugins/notes/src/tasks_api.rs`, `crates/plugins/notes/src/tasks_dav.rs`, `crates/plugins/notes/src/tasks_store.rs`, `crates/calternal-dav/src/reminders.rs`, `crates/calternal-dav/tests/apple_replay.rs`, `contracts/openapi.json`, `packages/api-client/src/generated.ts`. - Calendar controls: `apps/web/src/lib/tasks/write.ts`, `apps/web/src/lib/search/SearchPreview.svelte`, `apps/web/src/routes/calendar/[view]/[date]/+page.svelte`, `packages/ui/src/components/Checkbox.svelte`, `packages/ui/src/components/calendar/AgendaList.svelte`, `packages/ui/src/components/calendar/GridColumn.svelte`, `packages/ui/src/components/calendar/ItemPreview.svelte`, `packages/ui/src/components/calendar/MonthGrid.svelte`, `packages/ui/src/components/calendar/TaskCheckbox.svelte`, `packages/ui/src/components/calendar/TimeGrid.svelte`. - Review and profile: `apps/web/e2e/calendar-taskday-655-657.mjs`, `apps/web/e2e/calendar-task-overflow.mjs`, `apps/web/e2e/harness.mjs`, `apps/web/package.json`, `bench/task-calendar-655.py`, `tests/adversarial/attack.py`. ## Commits - `e4eb78ee7` Place undated Tasks at their creation instant - `401a3480c` Reuse the Calendar request zone for Task ranges - `9968f4d3f` Make Calendar Task checkboxes work everywhere Head: `9968f4d3f46fd2851f6ece928737238ec28574fa`. `git fetch origin && git merge origin/dev` completed; origin/dev was already up to date. No push or deploy. ## E2E and screenshots The production e2e created a Task at `2026-10-02T00:30:00+05:30`, asserted it appeared timed at 00:30 in the 2 Oct IST column, and confirmed that placement after reload. It also exercised shared writes, Undo, keyboard reopening, two-tab refresh, Search, Agenda, Week, Month, and all-day overflow. Hostile IANA timezone values returned 400. `Task placement and completion: 30 production screenshots saved in /home/kayg/Developer/calternal-wt/taskday-655/artifacts/taskday-655-657` All 30 screenshots are attached to this issue: Day overflow, Week, Month, Agenda and Search at 390, 820 and 1440 px in light and dark. The 390 px captures use DPR 3. Overflow geometry was checked for both themes at all three widths. - **agenda:** [390px dark](https://git.kayg.org/attachments/4983a7c8-d0a6-4a78-8646-1ed9ab40f71b), [390px light](https://git.kayg.org/attachments/38fcb592-34ea-491c-b77c-32d7440d05ad), [820px dark](https://git.kayg.org/attachments/f460a792-3699-4b3b-92d8-4c0e054cab4d), [820px light](https://git.kayg.org/attachments/a5ab1a52-12d6-412e-9b65-32af75b7c758), [1440px dark](https://git.kayg.org/attachments/30c68466-972a-4adc-acf2-f52f1986ed68), [1440px light](https://git.kayg.org/attachments/6f714277-2d0f-4cd2-b7ea-90c6141b2748) - **day-overflow:** [390px dark](https://git.kayg.org/attachments/3f154bd0-f784-43a8-bc82-f9bc12d3c009), [390px light](https://git.kayg.org/attachments/efecd9d5-bdf9-4a38-bae8-c396960d7ed5), [820px dark](https://git.kayg.org/attachments/bd4bc35b-5314-4f65-8fad-5c44405a2d28), [820px light](https://git.kayg.org/attachments/3d472ae1-7ed7-48d7-ac61-0e75708ce508), [1440px dark](https://git.kayg.org/attachments/e6d57801-7d0d-4709-927a-00b9e6d202fd), [1440px light](https://git.kayg.org/attachments/fbb3c765-42a9-473a-ae8a-410f71687129) - **month:** [390px dark](https://git.kayg.org/attachments/0dd31066-43e1-4a8d-8d8c-8746917e580a), [390px light](https://git.kayg.org/attachments/23188c2e-9cbe-4d45-bb9f-7418ecd20f5b), [820px dark](https://git.kayg.org/attachments/94a08fe0-f624-419d-a72d-518a9f5051f6), [820px light](https://git.kayg.org/attachments/98d5b28f-78db-44d0-b446-54c0a0abc3a6), [1440px dark](https://git.kayg.org/attachments/5859a1fe-1605-4ea4-b730-691f227c4de4), [1440px light](https://git.kayg.org/attachments/08bb116f-fa91-45ea-96aa-6457e35ecf23) - **search:** [390px dark](https://git.kayg.org/attachments/cccd6594-ba30-4430-8eb5-52d2b8b31b85), [390px light](https://git.kayg.org/attachments/212e3ca8-0a9a-48c8-b1f9-9d2e81c59528), [820px dark](https://git.kayg.org/attachments/f8bd949b-587c-4d88-9539-ea17fb607163), [820px light](https://git.kayg.org/attachments/3e122a96-f592-4821-b14a-5f1b88b0be05), [1440px dark](https://git.kayg.org/attachments/037bc58c-e8ee-4d8b-ba2b-5e755be84010), [1440px light](https://git.kayg.org/attachments/b6c97ad6-1b45-41db-9fea-5ec8f9d25d88) - **week:** [390px dark](https://git.kayg.org/attachments/40014ac9-9e32-4403-8214-ebdbb6dfb0b0), [390px light](https://git.kayg.org/attachments/09fa14ab-6c54-43e3-b2d4-646f45d34575), [820px dark](https://git.kayg.org/attachments/7bb314d3-0f6f-441a-919c-15e267e73cb0), [820px light](https://git.kayg.org/attachments/0689736e-030f-404a-9813-8acc965dab36), [1440px dark](https://git.kayg.org/attachments/8686e415-1e25-4b49-aba8-83d630db641e), [1440px light](https://git.kayg.org/attachments/19c70f88-b3ce-42a3-b2f3-efc89aa59644) ## Performance profile Local run, commit `9968f4d3f`, host `calternal-dev`. Load average was 17.35/19.38/21.01 before and 23.35/21.82/21.53 after. The closest entry in `docs/perf/baseline.json` is the Task-anchor profile, which is a different request path; these are reported side by side, not as a direct regression comparison. | Profile | p50 | p95 | CPU | Mean RSS | Peak RSS | | --- | ---: | ---: | ---: | ---: | ---: | | Calendar range, 96 Tasks / 24 reads | 19.61 ms | 33.53 ms | 78.57% / 0.49 s | 320,359,765 B | 320,753,664 B | | Calendar range + completion burst, 500 Tasks / 24 reads + 24 writes | 382.11 ms | 7,937.38 ms | 44.18% / 3.84 s | 492,814,918 B | 497,725,440 B | | Existing `task_anchors_96_average` baseline | 1,151.66 ms | 3,896.05 ms | 62.68% / 11.43 s | 210,964,075 B | 332,005,376 B | | Existing `task_anchors_96_worst_case_burst` baseline | 12,781.56 ms | 15,748.30 ms | 33.10% / 5.25 s | 353,143,879 B | 362,692,608 B | ## Gates — verbatim result lines `cargo fmt --check` exited 0 with no output. `cargo clippy -p calternal-notes-core --all-targets -- -D warnings` passed: ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 6.34s ``` ```text test result: ok. 521 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.48s test result: ok. 19 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.69s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.46s test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s ``` `cargo clippy -p calternal-dav --all-targets -- -D warnings` passed. ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 37.14s test result: ok. 42 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.36s test result: ok. 36 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` `cargo clippy -p calternal-plugin-notes --all-targets -- -D warnings` passed: ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 13.16s ``` Its full test gate had two failures: ```text assertion `left == right` failed left: 404 right: 200 Journal PATCH storm did not finish within the HTTP timeout: Elapsed(()) test result: FAILED. 167 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out; finished in 157.25s ``` The 404 was from the existing `daily_and_composer_preserve_unrelated_bytes` test; an earlier isolated rerun passed, but the final full suite failed it again. `journal_patch_storm_finishes_with_one_winner_and_stale_preconditions` exceeded its timeout while the host had multiple Cargo and browser jobs active. `cargo clippy -p calternal-server --all-targets -- -D warnings` passed: ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 8m 29s ``` ```text test result: ok. 107 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 12.31s ``` `bun run check` passed: ```text User browser caches use userStorage; only documented device/public-link exceptions remain. Text sizes and UI shape values use shared role tokens. UI transitions and animation options use shared motion tokens or documented exceptions. svelte-check found 0 errors and 0 warnings ``` `bun run test` passed: ```text Test Files 153 passed (153) Tests 1062 passed (1062) Start at 10:26:33 Duration 118.94s (transform 49%, environment 18%, import 16%, tests 13%, setup 4%) ``` ## Adversarial round and follow-ups The one local `tests/adversarial/run.sh` round exercised the Task hostile-timezone cases and broad API/storm probes. The Task timezone cases produced no findings; the server stayed alive through the API campaign. The run ended with exit 130 during dedup setup because this invocation had no built `calternal` CLI; three browser helpers also lacked `CALTERNAL_SERVER_BIN` and could not start. I did not repeat the round. Host load was around 22, and many requests were labelled `SLOW` with expected HTTP statuses. Non-SLOW evidence was filed for owner review: - #707: Photos shared timeline returned an extra User's item in the isolation probe. - #708: the probe expects no saved Appearance scheme and 201 for a conditional DAV update; it received `system` and 204, then made later requests with a stale ETag. - #709: burst timeouts and incomplete Calendar/Task projections under the loaded host. ## UX gaps closed - Completion now works wherever the Calendar exposes a Task, including the overflow popover and preview surfaces. State changes update mounted occurrences, the Undo action and peer Calendar tabs. - Pointer, touch and keyboard paths are covered; checkbox targets are 44 px, named and stateful for assistive technology, with Space and shortcut tooltip. - The all-day overflow row’s checkbox glyph and title center on its row box within 1 CSS px, with a separate heading gap. - Empty, loading and write-error behavior uses existing real API and toast flows; no sample Tasks were added. UX gaps left: none known on the covered surfaces. ## Decisions not stated in DESIGN - A captured Calendar request uses one User timezone for every range chunk and its Task projection. Invalid timezone query values return 400. - The Month surface shows one Task at a time on coarse pointers and puts the rest behind “More” so Task actions keep a 44 px target. - Search keeps the checkbox in the Task preview, not nested in the result listbox option, to preserve listbox keyboard semantics. - Legacy date-only Tasks have no invented instant; they remain all-day on the written creation day.
Author
Owner

Starting round 2 on job/taskday-655. Base: origin/dev at c4a61e8cf0.

Starting round 2 on job/taskday-655. Base: origin/dev at c4a61e8cf090170f35b1bed3350d9de20c83ecd5.
Author
Owner

Round 2 finding: the supplied Week screenshot at artifacts/taskday-655-657/calendar-week-1440-light.png shows the 13:15 raw file deck (5) and no timed Task block. On this branch, /api/v1/calendar/items reads indexed files from files_index without excluding sources present in task_items, so Task Markdown is projected again as standalone file Activity. I checked job/calimg-589's diff: commit 7d706a25a adds the exclusion to that shared SQL query, but it is not in origin/dev yet. I will apply that same shared-query filter here, without adding a client-side filter.

The all-day +3 in the e2e fixture is correct: the fixture creates four new Tasks with an explicit due date for 2 Oct, so one row is shown and three overflow. They are not legacy date-only Tasks or undated Tasks.

Round 2 finding: the supplied Week screenshot at `artifacts/taskday-655-657/calendar-week-1440-light.png` shows the 13:15 raw file deck (`5`) and no timed Task block. On this branch, `/api/v1/calendar/items` reads indexed files from `files_index` without excluding sources present in `task_items`, so Task Markdown is projected again as standalone file Activity. I checked job/calimg-589's diff: commit `7d706a25a` adds the exclusion to that shared SQL query, but it is not in `origin/dev` yet. I will apply that same shared-query filter here, without adding a client-side filter. The all-day `+3` in the e2e fixture is correct: the fixture creates four new Tasks with an explicit due date for 2 Oct, so one row is shown and three overflow. They are not legacy date-only Tasks or undated Tasks.
Author
Owner

Continuing round 2 on job/taskday-655. Base SHA: c4a61e8cf0; current HEAD: 9968f4d3f. Existing three commits are preserved. Checking the #662 Activity change and reproducing the Week screenshot now.

Continuing round 2 on job/taskday-655. Base SHA: c4a61e8cf090170f35b1bed3350d9de20c83ecd5; current HEAD: 9968f4d3f. Existing three commits are preserved. Checking the #662 Activity change and reproducing the Week screenshot now.
Author
Owner

Evidence from round 2: after fetching origin, origin/dev remains at c4a61e8cf and origin/job/calimg-589 is not an ancestor of origin/dev. Its diff puts Task-source exclusion in the shared Calendar Activity item query using task_items identity. The prior fixture creates four explicit 'due today' Tasks; the visible row plus +3 is those four date-only Tasks, not the undated creation-time Task. I am keeping the exclusion in the shared Activity query and adding an index-backed e2e assertion.

Evidence from round 2: after fetching origin, origin/dev remains at c4a61e8cf and origin/job/calimg-589 is not an ancestor of origin/dev. Its diff puts Task-source exclusion in the shared Calendar Activity item query using task_items identity. The prior fixture creates four explicit 'due today' Tasks; the visible row plus +3 is those four date-only Tasks, not the undated creation-time Task. I am keeping the exclusion in the shared Activity query and adding an index-backed e2e assertion.
Author
Owner

Gate finding: cargo test -p calternal-plugin-notes completed 168 passed, 1 failed. The pre-existing tests::daily_and_composer_preserve_unrelated_bytes fails at crates/plugins/notes/src/lib.rs:9424: GET /journal/2026-09-24 returned 404 where the unchanged test expects 200. The route/test are unchanged against origin/dev; no test expectation was edited. This is outside the Task Activity filter and is recorded for the final report.

Gate finding: cargo test -p calternal-plugin-notes completed 168 passed, 1 failed. The pre-existing tests::daily_and_composer_preserve_unrelated_bytes fails at crates/plugins/notes/src/lib.rs:9424: GET /journal/2026-09-24 returned 404 where the unchanged test expects 200. The route/test are unchanged against origin/dev; no test expectation was edited. This is outside the Task Activity filter and is recorded for the final report.
Author
Owner

Round 2 report — #655 / #657

Branch: job/taskday-655
Base: origin/dev at c4a61e8cf (merged once before final gates)
Head: b45b1f1d7fc8ebef50511a91d6759d6ccd27ebba

Built

  • Undated Tasks project at their creation instant, using the Calendar request timezone for range reads.
  • Calendar Task completion controls use the same writer and Undo history across Calendar surfaces.
  • The shared Calendar Activity file query excludes file Task sources. This uses the shared filter path reviewed in job/calimg-589; that change had not landed on origin/dev when inspected. No second Activity filter was added.
  • Added bench/task-calendar-655.py and expanded the real-server E2E around Task placement, overlap, completion and Activity filtering.

Commits: e4eb78ee7, 401a3480c, 9968f4d3f, 125379ae9, dd82530e2, b45b1f1d7.

Fixture explanation

The fixture creates three new undated Tasks with a fixed creation time of 00:30 IST on 2 Oct. It also creates four separate Tasks with an explicit due today date. The old +3 all-day count is the three remaining rows after one of those four date-only Tasks is visible. They are new date-only fixture Tasks, not legacy Tasks, and are correctly in the all-day lane.

Gates

cargo fmt --check: exit 0, no output.

Clippy completed for the changed crates:

Finished `dev` profile [unoptimized + debuginfo] target(s) in 47.15s
Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 21s
Finished `dev` profile [unoptimized + debuginfo] target(s) in 4m 39s
Finished `dev` profile [unoptimized + debuginfo] target(s) in 10m 43s
Finished `dev` profile [unoptimized + debuginfo] target(s) in 15m 16s

Rust test output:

test result: ok. 521 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.22s
test result: ok. 19 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.66s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.55s
test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
test result: ok. 42 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.25s
test result: ok. 36 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.08s
test result: ok. 84 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.28s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.17s
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.17s
test result: ok. 107 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 60.86s

The unrelated calternal-plugin-notes test gate had one failure; no expectation or route was changed:

test result: FAILED. 168 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 302.44s

The failure was tests::daily_and_composer_preserve_unrelated_bytes: its Journal GET expected HTTP 200 and received 404. I reported this earlier on the issue.

Web gates:

Wrote site to "build"
✔ done
svelte-check found 0 errors and 0 warnings
 Test Files  153 passed (153)
      Tests  1062 passed (1062)
   Duration  128.05s (transform 55%, environment 15%, import 11%, setup 10%, tests 8%)

node --check e2e/calendar-taskday-655-657.mjs passed with no output. The full browser matrix did not finish within the four-hour job limit. The last completed attempt timed out during the all-day Space-key check; the test was adjusted, then the final run was stopped before it returned. No new passing screenshot set was produced. The old screenshot at artifacts/taskday-655-657/calendar-week-1440-light.png is stale and does not show these changes.

Gaps and decisions

  • E2E and screenshots pending: the latest script covers macOS platform emulation and Week, Day and Agenda at 390, 820 and 1440 px in both themes, but it needs one successful full run. No fresh screenshots could be attached. The installed fj issue command has no attachment subcommand.
  • Performance pending: the hot-path profile exists, but it was not run before the time limit. The closest entry in docs/perf/baseline.json is task_anchors_531 (96 Tasks, local release): p50 1151.66 ms, p95 3896.05 ms. It measures a different route and is not directly comparable.
  • Mac checks pending: the Mac VM is offline. Run the production E2E matrix on return and review the macOS-rendered screenshots.
  • Fixture choice: Tasks are created through the real Task API under a fixed clock. The Composer-driven fixture timed out on the loaded host. The shared overlap +N action remains the existing presentation for narrow lanes; the test checks that it exposes all Tasks.

UX gaps closed in code: timed creation placement, shared same-minute overlap presentation, Task completion wiring, and exclusion of Task files from generic Activity. UX evidence still left: successful full browser run, fresh screenshots, live Mac review, and benchmark measurements.

Cleanup completed: cargo clean output was Removed 19187 files, 11.4GiB total; apps/web/build was removed. Issues remain open.

## Round 2 report — #655 / #657 Branch: `job/taskday-655` Base: `origin/dev` at `c4a61e8cf` (merged once before final gates) Head: `b45b1f1d7fc8ebef50511a91d6759d6ccd27ebba` ### Built - Undated Tasks project at their creation instant, using the Calendar request timezone for range reads. - Calendar Task completion controls use the same writer and Undo history across Calendar surfaces. - The shared Calendar Activity file query excludes file Task sources. This uses the shared filter path reviewed in `job/calimg-589`; that change had not landed on `origin/dev` when inspected. No second Activity filter was added. - Added `bench/task-calendar-655.py` and expanded the real-server E2E around Task placement, overlap, completion and Activity filtering. Commits: `e4eb78ee7`, `401a3480c`, `9968f4d3f`, `125379ae9`, `dd82530e2`, `b45b1f1d7`. ### Fixture explanation The fixture creates three new undated Tasks with a fixed creation time of 00:30 IST on 2 Oct. It also creates four separate Tasks with an explicit `due today` date. The old `+3` all-day count is the three remaining rows after one of those four date-only Tasks is visible. They are new date-only fixture Tasks, not legacy Tasks, and are correctly in the all-day lane. ### Gates `cargo fmt --check`: exit 0, no output. Clippy completed for the changed crates: ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 47.15s Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 21s Finished `dev` profile [unoptimized + debuginfo] target(s) in 4m 39s Finished `dev` profile [unoptimized + debuginfo] target(s) in 10m 43s Finished `dev` profile [unoptimized + debuginfo] target(s) in 15m 16s ``` Rust test output: ```text test result: ok. 521 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.22s test result: ok. 19 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.66s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.55s test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s test result: ok. 42 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.25s test result: ok. 36 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.08s test result: ok. 84 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.28s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.17s test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.17s test result: ok. 107 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 60.86s ``` The unrelated `calternal-plugin-notes` test gate had one failure; no expectation or route was changed: ```text test result: FAILED. 168 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 302.44s ``` The failure was `tests::daily_and_composer_preserve_unrelated_bytes`: its Journal GET expected HTTP 200 and received 404. I reported this earlier on the issue. Web gates: ```text Wrote site to "build" ✔ done svelte-check found 0 errors and 0 warnings Test Files 153 passed (153) Tests 1062 passed (1062) Duration 128.05s (transform 55%, environment 15%, import 11%, setup 10%, tests 8%) ``` `node --check e2e/calendar-taskday-655-657.mjs` passed with no output. The full browser matrix did not finish within the four-hour job limit. The last completed attempt timed out during the all-day Space-key check; the test was adjusted, then the final run was stopped before it returned. No new passing screenshot set was produced. The old screenshot at `artifacts/taskday-655-657/calendar-week-1440-light.png` is stale and does not show these changes. ### Gaps and decisions - **E2E and screenshots pending:** the latest script covers macOS platform emulation and Week, Day and Agenda at 390, 820 and 1440 px in both themes, but it needs one successful full run. No fresh screenshots could be attached. The installed `fj issue` command has no attachment subcommand. - **Performance pending:** the hot-path profile exists, but it was not run before the time limit. The closest entry in `docs/perf/baseline.json` is `task_anchors_531` (96 Tasks, local release): p50 1151.66 ms, p95 3896.05 ms. It measures a different route and is not directly comparable. - **Mac checks pending:** the Mac VM is offline. Run the production E2E matrix on return and review the macOS-rendered screenshots. - **Fixture choice:** Tasks are created through the real Task API under a fixed clock. The Composer-driven fixture timed out on the loaded host. The shared overlap `+N` action remains the existing presentation for narrow lanes; the test checks that it exposes all Tasks. UX gaps closed in code: timed creation placement, shared same-minute overlap presentation, Task completion wiring, and exclusion of Task files from generic Activity. UX evidence still left: successful full browser run, fresh screenshots, live Mac review, and benchmark measurements. Cleanup completed: `cargo clean` output was `Removed 19187 files, 11.4GiB total`; `apps/web/build` was removed. Issues remain open.
Author
Owner

Conflict-audit evidence for the merge round:

  • origin/job/taskday-655 adds crates/plugins/notes/migrations/0025_task_created_instant.sql.
  • origin/job/deployfix-732 adds Notes migrations 0025_dav_resource_projection.sql and 0026_reminder_authoritative_wire_epoch.sql.
  • git merge-tree --write-tree origin/job/taskday-655 origin/job/deployfix-732 reports conflicts in crates/plugins/notes/src/store.rs and crates/plugins/notes/src/tasks_api.rs (and DAV files).

The Notes migration number 0025 is duplicated. If deployfix-732 lands first, renumber the task-day migration and filename to 0027, then verify fresh and upgraded Notes migration tests. This branch is an ordering dependency named by #867, not one of the 20 merge-round-7b += entries.

Conflict-audit evidence for the merge round: - `origin/job/taskday-655` adds `crates/plugins/notes/migrations/0025_task_created_instant.sql`. - `origin/job/deployfix-732` adds Notes migrations `0025_dav_resource_projection.sql` and `0026_reminder_authoritative_wire_epoch.sql`. - `git merge-tree --write-tree origin/job/taskday-655 origin/job/deployfix-732` reports conflicts in `crates/plugins/notes/src/store.rs` and `crates/plugins/notes/src/tasks_api.rs` (and DAV files). The Notes migration number 0025 is duplicated. If `deployfix-732` lands first, renumber the task-day migration and filename to 0027, then verify fresh and upgraded Notes migration tests. This branch is an ordering dependency named by #867, not one of the 20 `merge-round-7b +=` entries.
Author
Owner

Starting the independent read-only review on branch job/rev2-taskday-655, based on origin/dev at 440e19dce23040ac8ebaae88f0469b6535b1afcb. The requested diff is origin/dev...b45b1f1d7fc8ebef50511a91d6759d6ccd27ebba (merge base c4a61e8cf090170f35b1bed3350d9de20c83ecd5). I will not build or test this branch.

Starting the independent read-only review on branch `job/rev2-taskday-655`, based on `origin/dev` at `440e19dce23040ac8ebaae88f0469b6535b1afcb`. The requested diff is `origin/dev...b45b1f1d7fc8ebef50511a91d6759d6ccd27ebba` (merge base `c4a61e8cf090170f35b1bed3350d9de20c83ecd5`). I will not build or test this branch.
Author
Owner

Independent review complete. I reviewed origin/dev...b45b1f1d7fc8ebef50511a91d6759d6ccd27ebba. Review artifacts are committed on job/rev2-taskday-655 at 94328dfcd.

Findings, ranked by severity:

  1. P1 — Undo loses the previous Task status. apps/web/src/routes/calendar/[view]/[date]/+page.svelte:608-625 stores only a done/not-done value and replays the Boolean tick route. Undo after completing a doing, blocked or waiting Task writes todo; undo after reopening a cancelled Task writes done. Store and restore the exact previous status through the Task writer. Add tests for these statuses. Evidence was also added to #657.
  2. P2 — Shared Tasks disappear from the recipient's Calendar. crates/plugins/calendar/src/items.rs:565 excludes Task files for every owner in the authorized Activity roots, but crates/plugins/notes/src/tasks_api.rs:715 queries only the current User's Tasks. Add authorized shared Tasks to the typed Calendar projection before excluding their source paths from generic Activity. Add a two-User Share test. Evidence was also added to #662.
  3. P2 — A valid RFC 3339 UTC timestamp loses its time. crates/calternal-notes-core/src/tasks/extract.rs:448-459 rejects 2026-10-02T00:30:00Z because it requires a numeric offset. Accept standard Z timestamps and test timed placement, or document and validate a narrower format.
  4. P2 — A range read can replace a pending completion. apps/web/src/lib/calendar/edits.ts:59-79 accepts an old response when its request starts after beginTask but before the write commits, because both versions match. Include pending writes in the merge decision and fence reads started during the write. Add a deferred-response test for that ordering.

No test expectation was weakened. Migration 0025 is the next migration after 0024 in the current origin/dev tree. No separate issue was filed because these findings are in this branch; comments were added to existing #657 and #662.

Gate output: No build, test, server, browser or benchmark ran, as required by the read-only review rules. git diff --check exited 0 with no output.

Decision: Undo should restore the exact previous Task status. This follows #657's Undo requirement and the owner rule for state-changing actions.

Independent review complete. I reviewed `origin/dev...b45b1f1d7fc8ebef50511a91d6759d6ccd27ebba`. Review artifacts are committed on `job/rev2-taskday-655` at `94328dfcd`. Findings, ranked by severity: 1. **P1 — Undo loses the previous Task status.** `apps/web/src/routes/calendar/[view]/[date]/+page.svelte:608-625` stores only a done/not-done value and replays the Boolean tick route. Undo after completing a `doing`, `blocked` or `waiting` Task writes `todo`; undo after reopening a `cancelled` Task writes `done`. Store and restore the exact previous status through the Task writer. Add tests for these statuses. Evidence was also added to #657. 2. **P2 — Shared Tasks disappear from the recipient's Calendar.** `crates/plugins/calendar/src/items.rs:565` excludes Task files for every owner in the authorized Activity roots, but `crates/plugins/notes/src/tasks_api.rs:715` queries only the current User's Tasks. Add authorized shared Tasks to the typed Calendar projection before excluding their source paths from generic Activity. Add a two-User Share test. Evidence was also added to #662. 3. **P2 — A valid RFC 3339 UTC timestamp loses its time.** `crates/calternal-notes-core/src/tasks/extract.rs:448-459` rejects `2026-10-02T00:30:00Z` because it requires a numeric offset. Accept standard `Z` timestamps and test timed placement, or document and validate a narrower format. 4. **P2 — A range read can replace a pending completion.** `apps/web/src/lib/calendar/edits.ts:59-79` accepts an old response when its request starts after `beginTask` but before the write commits, because both versions match. Include pending writes in the merge decision and fence reads started during the write. Add a deferred-response test for that ordering. No test expectation was weakened. Migration 0025 is the next migration after 0024 in the current `origin/dev` tree. No separate issue was filed because these findings are in this branch; comments were added to existing #657 and #662. **Gate output:** No build, test, server, browser or benchmark ran, as required by the read-only review rules. `git diff --check` exited 0 with no output. **Decision:** Undo should restore the exact previous Task status. This follows #657's Undo requirement and the owner rule for state-changing actions.
Author
Owner

Starting review-fix and verification round on job/taskday-655, HEAD/base b45b1f1d7fc8ebef50511a91d6759d6ccd27ebba. Read the independent review and its issue comment. I will fix all four findings with regression tests. The current verification policy applies: focused Vitest and issue E2E/screenshots here; full web/adversarial/Mac suites and non-performance bench run belong to the merge round. Host load is 47; I will continue without waiting for quiet. No push or deployment.

Starting review-fix and verification round on `job/taskday-655`, HEAD/base `b45b1f1d7fc8ebef50511a91d6759d6ccd27ebba`. Read the independent review and its issue comment. I will fix all four findings with regression tests. The current verification policy applies: focused Vitest and issue E2E/screenshots here; full web/adversarial/Mac suites and non-performance bench run belong to the merge round. Host load is 47; I will continue without waiting for quiet. No push or deployment.
Author
Owner

Review race reproduced with a deferred range read begun after the optimistic completion. The original merge returned todo instead of done. Pending-write tracking and a settle-version fence now retain the local state before and after acknowledgement. Focused Vitest: Test Files 1 passed (1), Tests 14 passed (14). Web check: svelte-check found 0 errors and 0 warnings. Committed as the first review fix.

Review race reproduced with a deferred range read begun after the optimistic completion. The original merge returned `todo` instead of `done`. Pending-write tracking and a settle-version fence now retain the local state before and after acknowledgement. Focused Vitest: `Test Files 1 passed (1)`, `Tests 14 passed (14)`. Web check: `svelte-check found 0 errors and 0 warnings`. Committed as the first review fix.
Author
Owner

Review-fix findings and decisions:

  • The original deferred-range regression returned todo for a pending optimistic done; the fix is committed at 8dc5f131c.
  • The original UTC parser returned None for 2026-10-02T00:30:00Z. The parser now retains UTC Z, numeric offsets and fractional seconds. Its date and clock checks remain in the pure parser.
  • Four web-writer regressions failed because the request omitted the previous workflow status. The tick route now accepts an optional exact status, validates that it agrees with done, and uses the existing Markdown single writer for Undo. Search preview had the same Boolean Undo gap and now sends the prior full status too.
  • Incoming Share roots were added only for Search by the server; Task day reads still received only the User's own Home. Task day and by-ID reads now get live Files identity-checked roots. Notes reads only file Tasks inside those roots and omits private Daily note attachments. Tests cover subtree boundaries, link reads, refused writes, and revoke.
  • Decision: qualify shared read identities as shared:<owner-id>:<stable-task-id> so Tasks with the same path or imported identity in two Homes do not collide. Copy link resolves that identity through a live grant. The existing Task writer has no shared edit authority, so the shared Calendar projection is read-only, including checkbox, drag and edit actions. Shared Collaborate editing remains a broader existing gap.
  • Focused web tests currently report Test Files 3 passed (3) and Tests 52 passed (52). Web check reports svelte-check found 0 errors and 0 warnings. Rust gates are still compiling on the loaded host.
  • The E2E now creates its first Task through the Composer and captures Day, Week, Month, Agenda and Search in macOS at 390/820/1440, Light/Dark, plus 3x crops of visible Task rows. The new evidence is pending the fresh server build.

The current verification policy sends the full web suite, broad adversarial matrices, Mac interop and this non-performance issue's benchmark to the merge round. No benchmark numbers are claimed in this job.

Review-fix findings and decisions: - The original deferred-range regression returned `todo` for a pending optimistic `done`; the fix is committed at `8dc5f131c`. - The original UTC parser returned `None` for `2026-10-02T00:30:00Z`. The parser now retains UTC Z, numeric offsets and fractional seconds. Its date and clock checks remain in the pure parser. - Four web-writer regressions failed because the request omitted the previous workflow status. The tick route now accepts an optional exact `status`, validates that it agrees with `done`, and uses the existing Markdown single writer for Undo. Search preview had the same Boolean Undo gap and now sends the prior full status too. - Incoming Share roots were added only for Search by the server; Task day reads still received only the User's own Home. Task day and by-ID reads now get live Files identity-checked roots. Notes reads only file Tasks inside those roots and omits private Daily note attachments. Tests cover subtree boundaries, link reads, refused writes, and revoke. - Decision: qualify shared read identities as `shared:<owner-id>:<stable-task-id>` so Tasks with the same path or imported identity in two Homes do not collide. Copy link resolves that identity through a live grant. The existing Task writer has no shared edit authority, so the shared Calendar projection is read-only, including checkbox, drag and edit actions. Shared Collaborate editing remains a broader existing gap. - Focused web tests currently report `Test Files 3 passed (3)` and `Tests 52 passed (52)`. Web check reports `svelte-check found 0 errors and 0 warnings`. Rust gates are still compiling on the loaded host. - The E2E now creates its first Task through the Composer and captures Day, Week, Month, Agenda and Search in macOS at 390/820/1440, Light/Dark, plus 3x crops of visible Task rows. The new evidence is pending the fresh server build. The current verification policy sends the full web suite, broad adversarial matrices, Mac interop and this non-performance issue's benchmark to the merge round. No benchmark numbers are claimed in this job.
Author
Owner

Follow-up review found the pending-write race also in Agenda publication paths. I fixed cached/reset and stale refresh publication, then checked Month and applied the same fence there. Shared Task Duplicate is hidden in both menus and the preview, and Cmd+D is guarded because the existing duplicate writer resolves only owned Tasks.

Commits: 026f73e57, 1d891263f. The read-only follow-up review found no further correctness defect in these paths. The focused web gate output is:

 Test Files  3 passed (3)
      Tests  54 passed (54)
svelte-check found 0 errors and 0 warnings

The browser regression now also holds a real Task write while a real Files notification publishes an Agenda range. Rust gates and the fresh server build remain in progress. No screenshot or Rust success is claimed yet.

Follow-up review found the pending-write race also in Agenda publication paths. I fixed cached/reset and stale refresh publication, then checked Month and applied the same fence there. Shared Task Duplicate is hidden in both menus and the preview, and Cmd+D is guarded because the existing duplicate writer resolves only owned Tasks. Commits: `026f73e57`, `1d891263f`. The read-only follow-up review found no further correctness defect in these paths. The focused web gate output is: ``` Test Files 3 passed (3) Tests 54 passed (54) svelte-check found 0 errors and 0 warnings ``` The browser regression now also holds a real Task write while a real Files notification publishes an Agenda range. Rust gates and the fresh server build remain in progress. No screenshot or Rust success is claimed yet.
Author
Owner

Review follow-up: b0d47e8e7 adds imported UTC/fractional creation placement checks in Honolulu, UTC, Berlin, Kolkata and Kiritimati. The full Core gate passed, including its RFC 3339 parser regressions. Notes tests passed all new exact-status, shared-subtree and UTC placement regressions. Notes and Calendar clippy passed.

The concurrent Notes gate found an unchanged Journal fixture failure (daily_and_composer_preserve_unrelated_bytes: 404 vs 200). The focused rerun passed. Filed #944 with the exact outputs and the shared User-lock evidence; assertions and fixtures remain unchanged. A serial Notes gate is queued.

The production browser run is using the freshly built server (the Share authorization changes require it), the real Composer, two registered Users and a real Share. Its helpers now select an Agenda Task occurrence by day and wait for Undo write acknowledgement before the next action. macOS, phone/tablet/desktop and Light/Dark screenshot capture remains in progress. No deployment, push or extra origin/dev merge has run.

Review follow-up: `b0d47e8e7` adds imported UTC/fractional creation placement checks in Honolulu, UTC, Berlin, Kolkata and Kiritimati. The full Core gate passed, including its RFC 3339 parser regressions. Notes tests passed all new exact-status, shared-subtree and UTC placement regressions. Notes and Calendar clippy passed. The concurrent Notes gate found an unchanged Journal fixture failure (`daily_and_composer_preserve_unrelated_bytes`: 404 vs 200). The focused rerun passed. Filed #944 with the exact outputs and the shared User-lock evidence; assertions and fixtures remain unchanged. A serial Notes gate is queued. The production browser run is using the freshly built server (the Share authorization changes require it), the real Composer, two registered Users and a real Share. Its helpers now select an Agenda Task occurrence by day and wait for Undo write acknowledgement before the next action. macOS, phone/tablet/desktop and Light/Dark screenshot capture remains in progress. No deployment, push or extra origin/dev merge has run.
Author
Owner

The 3x production crops found two layout defects:

  • Agenda: the TaskCheckbox local wrapper rule won over the parent's global selector. The wrapper took a grid cell, so the title painted on the next row. Evidence: before crop.
  • Month: the same selector order made the wrapper take flex width before the title's reserved checkbox space. Evidence: before crop.

Both parent selectors now win over the child rule. Agenda aligns the first title cap with its 44 px control through CSS cap and text-box-trim; wrapped titles keep that alignment. No production layout measurement was added. The browser flow checks Agenda placement. The new production build passes:

svelte-check found 0 errors and 0 warnings

Fresh browser evidence is running. Notes' serial gate passed all 173 unit/integration tests. Its prior parallel failure is recorded in #944. A separate real Search probe found the existing modern-Task path destination issue and filed #946; Calendar Copy link uses its stable identity.

The 3x production crops found two layout defects: - Agenda: the TaskCheckbox local wrapper rule won over the parent's global selector. The wrapper took a grid cell, so the title painted on the next row. Evidence: [before crop](https://git.kayg.org/attachments/23b69031-c1da-4e51-9f62-4d350fc9fa00). - Month: the same selector order made the wrapper take flex width before the title's reserved checkbox space. Evidence: [before crop](https://git.kayg.org/attachments/2da6c2ea-fa2d-4267-a15c-ca1d9e2e48e0). Both parent selectors now win over the child rule. Agenda aligns the first title cap with its 44 px control through CSS `cap` and `text-box-trim`; wrapped titles keep that alignment. No production layout measurement was added. The browser flow checks Agenda placement. The new production build passes: ``` svelte-check found 0 errors and 0 warnings ``` Fresh browser evidence is running. Notes' serial gate passed all 173 unit/integration tests. Its prior parallel failure is recorded in #944. A separate real Search probe found the existing modern-Task path destination issue and filed #946; Calendar Copy link uses its stable identity.
Author
Owner

Review fixes committed through 61c07e2d9 (shared projection: c30273d75). Notes serial suite: test result: ok. 172 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 286.49s; integration test 1 passed. Calendar suite: 85 unit + 4 integration tests passed. Server clippy passed; server test build remains in progress.

Production browser evidence found and fixed Agenda and Month checkbox wrapper specificity. Agenda now uses CSS cap trimming and a fixed first-line target, including wrapped titles. The current phone Day checks passed; Month timed out while server logs showed SQLite pool waits up to 23 seconds. Retrying the focused regression with a longer test timeout and unchanged assertions. No full suite or performance measurement was started, per the current verification policy.

Review fixes committed through `61c07e2d9` (shared projection: `c30273d75`). Notes serial suite: `test result: ok. 172 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 286.49s`; integration test 1 passed. Calendar suite: 85 unit + 4 integration tests passed. Server clippy passed; server test build remains in progress. Production browser evidence found and fixed Agenda and Month checkbox wrapper specificity. Agenda now uses CSS cap trimming and a fixed first-line target, including wrapped titles. The current phone Day checks passed; Month timed out while server logs showed SQLite pool waits up to 23 seconds. Retrying the focused regression with a longer test timeout and unchanged assertions. No full suite or performance measurement was started, per the current verification policy.
Author
Owner

The Month reload failure was a test polling defect. Task writer trace had done, todo, done, but the last write was not acknowledged before navigation. The local Playwright implementation in tests/adversarial/node_modules/playwright-core/lib/coreBundle.js:24412 tests the predicate return value for truthiness before awaiting it. An async predicate therefore returns immediately even when its eventual value is false. The E2E used that pattern for API state waits.

The existing Task status helper now awaits and checks each API result in Node, with a bounded deadline. All async waitForFunction API predicates in this issue test were replaced. The saved Month completion also checks the POST response before reload. Existing status expectations remain unchanged.

A separate native-control defect was found: Calendar treats Space/Enter from a Task checkbox as item actions. The shared Checkbox now contains only those native activation keys when its existing stopPropagation option is enabled. Cmd+Z still bubbles. Month now checks native Space and Enter activation through the real writer. Web check reports svelte-check found 0 errors and 0 warnings. Final production assets and browser evidence are in progress.

The Month reload failure was a test polling defect. Task writer trace had `done`, `todo`, `done`, but the last write was not acknowledged before navigation. The local Playwright implementation in `tests/adversarial/node_modules/playwright-core/lib/coreBundle.js:24412` tests the predicate return value for truthiness before awaiting it. An async predicate therefore returns immediately even when its eventual value is false. The E2E used that pattern for API state waits. The existing Task status helper now awaits and checks each API result in Node, with a bounded deadline. All async `waitForFunction` API predicates in this issue test were replaced. The saved Month completion also checks the POST response before reload. Existing status expectations remain unchanged. A separate native-control defect was found: Calendar treats Space/Enter from a Task checkbox as item actions. The shared Checkbox now contains only those native activation keys when its existing `stopPropagation` option is enabled. Cmd+Z still bubbles. Month now checks native Space and Enter activation through the real writer. Web check reports `svelte-check found 0 errors and 0 warnings`. Final production assets and browser evidence are in progress.
Author
Owner

#655 review fixes and verification round

Head: 79972a6e1b371f7f81eabc085f4812050281f09a, branch job/taskday-655. Merged origin/dev once at c4faf184df726a9375ae0c13bdfb6018ac2cf57e (merge d38a7270b). No push, deploy or further merge.

Built

Tasks without an explicit placement date retain their creation instant and appear at its minute in the User zone. The creation instant survives the Index, writer and Reminders round trip. Typed Task rows replace duplicate Activity files.

All four independent review findings have code and focused regressions:

  • P1: Undo stores and writes the exact previous workflow status, including Doing, Blocked, Waiting and Cancelled. Done and Cancelled both count as completed for the existing checkbox contract.
  • P2: typed Task reads include live, server-authorized Share roots. File-only Shares include their subtree. Hidden files stay excluded. Shared identities include owner identity; revocation and token-scope checks run at each read. Private Daily attachments stay private.
  • P2: RFC 3339 accepts UTC Z/z, numeric offsets, fractions and T/t. Imported UTC Tasks retain timed placement across Honolulu, UTC, Berlin, Kolkata and Kiritimati.
  • P2: range reads preserve pending writes and fence reads that start during the write. Agenda, Month and grid share the same reconciliation rules.

The final UI fixes contain native Space/Enter inside a Task checkbox and keep Cmd+Z available to Calendar. A shared Task title opens Preview on Enter. Agenda checkboxes and action icons use CSS cap metrics; wrapped titles keep the first-line alignment. Month checkboxes stay outside the flex text width. The phone Day evidence exposed a clipped all-day checkbox and a timed checkbox below its title. The final CSS keeps the Day header and title action at 44 px, parent-scopes the timed wrapper to override its relative child style, and aligns its centre with the first cap using CSS cap/lh units. New browser assertions cover header containment, target size and cap alignment. These last fixes still need fresh browser evidence. Generated API files came from the real built server. The final documentation-only patch clarified live Share lookup and the Done/Cancelled Boolean invariant; the JSON prose was updated and the TypeScript client was regenerated from it, with no schema change.

Files

Notes model/extraction/store/writer/DAV modules and migration 0025_task_created_instant.sql; Calendar items.rs; Server wire.rs; DAV Reminders tests; web Calendar data/edits/model, route, stable Task route, Search Preview and shared Task writer; UI Calendar components and Checkbox; API contract/client; focused e2e, adversarial probe and bench/task-calendar-655.py. Full paths are in the attached file manifest. No dependency version changed.

UX gaps closed

Optimistic status survives a concurrent range refresh; edits update mounted Calendar and Search controls; Undo retains workflow state; shared Tasks remain visible and have Preview and stable Copy link; shared controls do not offer unavailable completion, editing or duplication; native checkbox keys work independently of item Enter/Space actions; wrapped Agenda rows retain cap alignment.

UX gaps left / known gaps

The full focused browser interaction run failed at all-day Undo: Task status remained done; expected todo. The run also had 25–29 second SQLite pool waits, a job worker restart and a busy authentication database; see #951; the unresolved Undo run is tracked in #952. The failure is not reported as passing or explained away as load. Search's existing primary Task destination remains source-path based (#946). Timed Task title hit targets also need a follow-up check against the 44 px touch requirement when the timed card is short. Collaborate Share Task editing still needs foreign-Home writer authority; this change exposes shared Tasks as read-only. The unchanged Notes parallel test failed once (404 versus 200); its isolated and serial runs passed (#944). No test expectation was weakened.

The Server suite printed 108 passing tests, but the parent gate runner exited 143 before recording Cargo's exit. Its focused Share authorization test passed directly with exit 0. The merge round must record the full combined Cargo exit.

Decisions

An exact optional status in the existing tick endpoint lets Undo restore workflow state; the server validates status and Boolean consistency. Shared Task reads use owner-qualified stable identities and live authority, rather than granting a foreign writer. Pending writes own local status until settlement, including reads that start during a write. RFC 3339 follows valid UTC and offset syntax. The browser fixture polls awaited API values because this Playwright build treats async waitForFunction predicates as truthy Promises. These are implementation choices consistent with DESIGN; no OPEN design was built.

Verification output (verbatim)

cargo fmt --check exited 0 with no output, including the final documentation patch. Cargo environment: CARGO_PROFILE_DEV_DEBUG=line-tables-only CARGO_INCREMENTAL=0 CARGO_BUILD_JOBS=4 TMPDIR=$PWD/target/tmp; preset target directory retained.

core-tests

    Finished `test` profile [unoptimized + debuginfo] target(s) in 51m 16s
test result: ok. 522 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.34s
test result: ok. 19 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.10s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.95s
test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

calternal-notes-core-clippy

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 51m 47s

calternal-plugin-notes-clippy

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 6m 27s

calternal-plugin-notes-test

    Finished `test` profile [unoptimized + debuginfo] target(s) in 3m 09s
test result: FAILED. 171 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 123.83s

calternal-plugin-notes-test-serial

    Finished `test` profile [unoptimized + debuginfo] target(s) in 4m 45s
test result: ok. 172 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 286.49s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.80s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

calternal-plugin-calendar-clippy

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 43s

calternal-plugin-calendar-test

    Finished `test` profile [unoptimized + debuginfo] target(s) in 6m 40s
test result: ok. 85 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 6.65s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

calternal-server-clippy

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 3m 11s

calternal-server-test

    Finished `test` profile [unoptimized + debuginfo] target(s) in 47m 52s
test result: ok. 108 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 36.04s

server-shared-direct

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 110 filtered out; finished in 4.29s

web-check-final

svelte-check found 0 errors and 0 warnings

web-tests-final

 Test Files  3 passed (3)
      Tests  54 passed (54)

web-build-final

✓ built in 1m 47s
✓ built in 224ms
✓ built in 5m 4s

Latest CSS verification:

svelte-check found 0 errors and 0 warnings
 Test Files  1 passed (1)
      Tests  8 passed (8)
✓ built in 1m 12s
✓ built in 90ms
✓ built in 3m 6s
  Wrote site to "build"

These commands exited 0. The focused TimeGrid suite verifies its existing interactions; the new cap/containment browser assertions still need a successful run.

DAV was not changed in this review-fix round. Its retained prior-round logs say:

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 21s
test result: ok. 42 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.25s
test result: ok. 36 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.08s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

For the merge round

The latest verification policy defers full suites, broad adversarial matrices, release builds, Mac interop and this feature's benchmark to the combined merge round. No benchmark numbers were invented; #655 is not a performance issue.

  • cd apps/web && bun run test --maxWorkers=2: full web suite.
  • cd apps/web && bun run test:e2e:taskday-655-657 --screenshots ../../artifacts/taskday-655-657: completion, Undo, pending-read, typed Search and shared-link regression, plus all width/theme production evidence.
  • cargo test -p calternal-server: record the combined suite exit as well as its output.
  • timeout 20m tests/adversarial/run-split.sh: real-server authorization, malformed payload and cross-plugin matrices. This job's focused malformed-zone checks returned 400.
  • cargo build --release -p calternal-server: shared release build.
  • On the perf VM with the shared release binary: flock /root/perf.lock bash -c 'uptime; python3 bench/task-calendar-655.py --server "$CALTERNAL_SERVER_BIN" --json artifacts/task-calendar-655-perf.json'. Record p50/p95, CPU and RSS for the average and worst-case profile next to docs/perf/baseline.json. There is no equivalent #655 baseline; do not compare the different #531 route as identical.
  • Mac interop: follow macdav-lab/apple-interop-2026-10-02.md under flock -w 7200 ~/.local/state/codex-jobs/calternal/macvm.lock; the orchestrator owns staging and Apple-client checks.

Evidence

Partial production evidence is attached: 390 px light Day, all-day overflow and Month, with 12 row crops at 3× scale. The Day shots precede the last Grid/Header CSS fixes and show the defects that prompted them. Month native Space and Enter both completed the real Task through the server; its state was reset through the API between keys. The capture-only runner then stopped because it used /calendar/agenda instead of /calendar/today; this was my harness error, not a product Agenda result. Its corrected source is retained in the evidence archive.

The requested full 390/820/1440 × light/dark matrix, wrapped Agenda evidence and final Grid/Header screenshots remain incomplete. The full interaction suite also remains failing at the separate #952 Undo result. No visual completion claim is made. Claude remains the visual reviewer.

calendar-day-390-light.png

calendar-overflow-390-light.png

calendar-month-390-light.png

taskday-655-review-evidence.zip

Cleanup

Web build output (apps/web/build, apps/web/.svelte-kit), native review symlinks and remaining Taskday fixture directories were removed. Artifacts remain for review. Git status is clean. No screenshots were committed. Module and non-obvious function comments were re-read; the read-only reviewer's stale comments were corrected.

cargo clean was started with the required Cargo environment. It is still running in the job target directory and is waiting on ext4 I/O; no completion output exists yet. The four-hour job limit applies, so cleanup completion is listed as remaining work rather than claimed.

# #655 review fixes and verification round Head: `79972a6e1b371f7f81eabc085f4812050281f09a`, branch `job/taskday-655`. Merged `origin/dev` once at `c4faf184df726a9375ae0c13bdfb6018ac2cf57e` (merge `d38a7270b`). No push, deploy or further merge. ## Built Tasks without an explicit placement date retain their creation instant and appear at its minute in the User zone. The creation instant survives the Index, writer and Reminders round trip. Typed Task rows replace duplicate Activity files. All four independent review findings have code and focused regressions: - P1: Undo stores and writes the exact previous workflow status, including Doing, Blocked, Waiting and Cancelled. Done and Cancelled both count as completed for the existing checkbox contract. - P2: typed Task reads include live, server-authorized Share roots. File-only Shares include their subtree. Hidden files stay excluded. Shared identities include owner identity; revocation and token-scope checks run at each read. Private Daily attachments stay private. - P2: RFC 3339 accepts UTC Z/z, numeric offsets, fractions and T/t. Imported UTC Tasks retain timed placement across Honolulu, UTC, Berlin, Kolkata and Kiritimati. - P2: range reads preserve pending writes and fence reads that start during the write. Agenda, Month and grid share the same reconciliation rules. The final UI fixes contain native Space/Enter inside a Task checkbox and keep Cmd+Z available to Calendar. A shared Task title opens Preview on Enter. Agenda checkboxes and action icons use CSS cap metrics; wrapped titles keep the first-line alignment. Month checkboxes stay outside the flex text width. The phone Day evidence exposed a clipped all-day checkbox and a timed checkbox below its title. The final CSS keeps the Day header and title action at 44 px, parent-scopes the timed wrapper to override its relative child style, and aligns its centre with the first cap using CSS cap/lh units. New browser assertions cover header containment, target size and cap alignment. These last fixes still need fresh browser evidence. Generated API files came from the real built server. The final documentation-only patch clarified live Share lookup and the Done/Cancelled Boolean invariant; the JSON prose was updated and the TypeScript client was regenerated from it, with no schema change. ## Files Notes model/extraction/store/writer/DAV modules and migration `0025_task_created_instant.sql`; Calendar `items.rs`; Server `wire.rs`; DAV Reminders tests; web Calendar data/edits/model, route, stable Task route, Search Preview and shared Task writer; UI Calendar components and Checkbox; API contract/client; focused e2e, adversarial probe and `bench/task-calendar-655.py`. Full paths are in the attached file manifest. No dependency version changed. ## UX gaps closed Optimistic status survives a concurrent range refresh; edits update mounted Calendar and Search controls; Undo retains workflow state; shared Tasks remain visible and have Preview and stable Copy link; shared controls do not offer unavailable completion, editing or duplication; native checkbox keys work independently of item Enter/Space actions; wrapped Agenda rows retain cap alignment. ## UX gaps left / known gaps The full focused browser interaction run failed at all-day Undo: `Task status remained done; expected todo`. The run also had 25–29 second SQLite pool waits, a job worker restart and a busy authentication database; see #951; the unresolved Undo run is tracked in #952. The failure is not reported as passing or explained away as load. Search's existing primary Task destination remains source-path based (#946). Timed Task title hit targets also need a follow-up check against the 44 px touch requirement when the timed card is short. Collaborate Share Task editing still needs foreign-Home writer authority; this change exposes shared Tasks as read-only. The unchanged Notes parallel test failed once (404 versus 200); its isolated and serial runs passed (#944). No test expectation was weakened. The Server suite printed 108 passing tests, but the parent gate runner exited 143 before recording Cargo's exit. Its focused Share authorization test passed directly with exit 0. The merge round must record the full combined Cargo exit. ## Decisions An exact optional status in the existing tick endpoint lets Undo restore workflow state; the server validates status and Boolean consistency. Shared Task reads use owner-qualified stable identities and live authority, rather than granting a foreign writer. Pending writes own local status until settlement, including reads that start during a write. RFC 3339 follows valid UTC and offset syntax. The browser fixture polls awaited API values because this Playwright build treats async waitForFunction predicates as truthy Promises. These are implementation choices consistent with DESIGN; no OPEN design was built. ## Verification output (verbatim) `cargo fmt --check` exited 0 with no output, including the final documentation patch. Cargo environment: `CARGO_PROFILE_DEV_DEBUG=line-tables-only CARGO_INCREMENTAL=0 CARGO_BUILD_JOBS=4 TMPDIR=$PWD/target/tmp`; preset target directory retained. core-tests ```text Finished `test` profile [unoptimized + debuginfo] target(s) in 51m 16s test result: ok. 522 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.34s test result: ok. 19 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.10s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.95s test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` calternal-notes-core-clippy ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 51m 47s ``` calternal-plugin-notes-clippy ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 6m 27s ``` calternal-plugin-notes-test ```text Finished `test` profile [unoptimized + debuginfo] target(s) in 3m 09s test result: FAILED. 171 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 123.83s ``` calternal-plugin-notes-test-serial ```text Finished `test` profile [unoptimized + debuginfo] target(s) in 4m 45s test result: ok. 172 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 286.49s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.80s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` calternal-plugin-calendar-clippy ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 43s ``` calternal-plugin-calendar-test ```text Finished `test` profile [unoptimized + debuginfo] target(s) in 6m 40s test result: ok. 85 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 6.65s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` calternal-server-clippy ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 3m 11s ``` calternal-server-test ```text Finished `test` profile [unoptimized + debuginfo] target(s) in 47m 52s test result: ok. 108 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 36.04s ``` server-shared-direct ```text test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 110 filtered out; finished in 4.29s ``` web-check-final ```text svelte-check found 0 errors and 0 warnings ``` web-tests-final ```text Test Files 3 passed (3) Tests 54 passed (54) ``` web-build-final ```text ✓ built in 1m 47s ✓ built in 224ms ✓ built in 5m 4s ``` Latest CSS verification: ```text svelte-check found 0 errors and 0 warnings Test Files 1 passed (1) Tests 8 passed (8) ✓ built in 1m 12s ✓ built in 90ms ✓ built in 3m 6s Wrote site to "build" ``` These commands exited 0. The focused TimeGrid suite verifies its existing interactions; the new cap/containment browser assertions still need a successful run. DAV was not changed in this review-fix round. Its retained prior-round logs say: ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 21s test result: ok. 42 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.25s test result: ok. 36 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.08s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` ## For the merge round The latest verification policy defers full suites, broad adversarial matrices, release builds, Mac interop and this feature's benchmark to the combined merge round. No benchmark numbers were invented; #655 is not a performance issue. - `cd apps/web && bun run test --maxWorkers=2`: full web suite. - `cd apps/web && bun run test:e2e:taskday-655-657 --screenshots ../../artifacts/taskday-655-657`: completion, Undo, pending-read, typed Search and shared-link regression, plus all width/theme production evidence. - `cargo test -p calternal-server`: record the combined suite exit as well as its output. - `timeout 20m tests/adversarial/run-split.sh`: real-server authorization, malformed payload and cross-plugin matrices. This job's focused malformed-zone checks returned 400. - `cargo build --release -p calternal-server`: shared release build. - On the perf VM with the shared release binary: `flock /root/perf.lock bash -c 'uptime; python3 bench/task-calendar-655.py --server "$CALTERNAL_SERVER_BIN" --json artifacts/task-calendar-655-perf.json'`. Record p50/p95, CPU and RSS for the average and worst-case profile next to `docs/perf/baseline.json`. There is no equivalent #655 baseline; do not compare the different #531 route as identical. - Mac interop: follow `macdav-lab/apple-interop-2026-10-02.md` under `flock -w 7200 ~/.local/state/codex-jobs/calternal/macvm.lock`; the orchestrator owns staging and Apple-client checks. ## Evidence Partial production evidence is attached: 390 px light Day, all-day overflow and Month, with 12 row crops at 3× scale. The Day shots precede the last Grid/Header CSS fixes and show the defects that prompted them. Month native Space and Enter both completed the real Task through the server; its state was reset through the API between keys. The capture-only runner then stopped because it used `/calendar/agenda` instead of `/calendar/today`; this was my harness error, not a product Agenda result. Its corrected source is retained in the evidence archive. The requested full 390/820/1440 × light/dark matrix, wrapped Agenda evidence and final Grid/Header screenshots remain incomplete. The full interaction suite also remains failing at the separate #952 Undo result. No visual completion claim is made. Claude remains the visual reviewer. [calendar-day-390-light.png](https://git.kayg.org/attachments/c3259a66-19ee-49ca-88b1-163d9ce6b7f9) [calendar-overflow-390-light.png](https://git.kayg.org/attachments/81b94cc6-60a8-48ab-ae27-cc614bb5c1b7) [calendar-month-390-light.png](https://git.kayg.org/attachments/e75d64dc-460f-4c22-b797-2fb3b12ebe6c) [taskday-655-review-evidence.zip](https://git.kayg.org/attachments/87d56c40-99f1-4ccf-9a59-4333dcb31506) ## Cleanup Web build output (`apps/web/build`, `apps/web/.svelte-kit`), native review symlinks and remaining Taskday fixture directories were removed. Artifacts remain for review. Git status is clean. No screenshots were committed. Module and non-obvious function comments were re-read; the read-only reviewer's stale comments were corrected. `cargo clean` was started with the required Cargo environment. It is still running in the job target directory and is waiting on ext4 I/O; no completion output exists yet. The four-hour job limit applies, so cleanup completion is listed as remaining work rather than claimed.
kayg closed this issue 2026-10-04 18:55:27 +00:00
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal#655
No description provided.