APPLE INTEROP: exhaustive Reminders + Calendar knob matrix on the real Mac, both directions #393

Open
opened 2026-09-29 04:21:26 +00:00 by kayg · 70 comments
Owner

Request (owner, 2026-09-29)

"you should try all reminder toggles and knobs instead of basic things, same for calendar events but also reminder toggles from the calendar!"

Goal

Prove every Apple Reminders and Apple Calendar option round-trips through calternal's CalDAV adapter on the real macOS 27 VM, in both directions, and fix every failure. A capture/replay fixture for each case goes into crates/calternal-dav/tests/fixtures/macos27/.

Matrix: Reminders.app (create, then edit each knob, then read back in calternal and in Reminders)

Title; notes; URL; date only; date + time; early reminder (alarm before due); repeat (daily, weekdays, weekly on days, monthly on day, yearly, custom "every 2 weeks", end date, end after N); location (arrive/leave, Home/Work/custom, radius); when messaging a person; flag; priority none/low/medium/high; tags (#tag in Reminders ↔ calternal tags); list move (between lists; to an iCloud list and back); subtasks (indent/outdent); sections; image attachment; complete; uncomplete; delete; restore; rename; "Today"/"Scheduled" smart lists; bulk complete; date-less reminder; all-day vs timed; time zone change on the Mac; very long title; emoji/RTL; 100 reminders at once.

Matrix: Calendar.app events on the Journal (and future area) calendars

All-day; timed; multi-day; cross-midnight; time zone per event; floating time; repeat rules (every kind above, plus exceptions: edit one occurrence, delete one occurrence, "this and future"); alerts (multiple, at time, before, custom, email-alert ignored); travel time; location (with structured map pin); URL; notes; invitees (should be refused or preserved, never a crash); availability busy/free; move between calendars; drag to resize; drag to another day; duplicate (⌘D) → dedupe rule from §46; copy/paste; delete; undo delete; colour change; calendar rename (display-name PROPPATCH); calendar order.

Matrix: reminders from Calendar.app

Calendar.app's "Reminder" tab in the new-item popover (seen on the VM: Event | Reminder); scheduled reminders shown in Calendar; completing a reminder from Calendar; dragging a reminder to another time.

Method

  • Drive the Mac with AppleScript (Reminders and Calendar dictionaries) and cua-driver for UI-only knobs (early reminder, location, when messaging, travel time). Mac: netbird ssh --no-browser --user calternal 10.69.69.21 (helpers in ~: shot.sh, dclick.py, ax.py). The VM's calternal account points at a local verification server reached through a Cloudflare quick tunnel; Claude's orchestration notes describe it (server on 127.0.0.1:18088 behind the logging proxy on :18089, data in the scratchpad macverify/work2). Build the server from your branch into CARGO_TARGET_DIR and restart it in place; keep the tunnel and proxy running.
  • For each case: record the exact request/response pair from the proxy log, the resulting Markdown, and the state Apple shows after a refresh. A case passes only when both sides agree after a second sync.
  • Output: docs/research/apple-caldav-matrix.md with a table (case → result → fixture → fix commit) and one replay test per case.
  • Never 422 a well-formed Apple request. Anything calternal cannot represent is preserved losslessly (DESIGN §46/§47) and round-trips unchanged.
## Request (owner, 2026-09-29) "you should try all reminder toggles and knobs instead of basic things, same for calendar events but also reminder toggles from the calendar!" ## Goal Prove every Apple Reminders and Apple Calendar option round-trips through calternal's CalDAV adapter on the real macOS 27 VM, in both directions, and fix every failure. A capture/replay fixture for each case goes into `crates/calternal-dav/tests/fixtures/macos27/`. ## Matrix: Reminders.app (create, then edit each knob, then read back in calternal and in Reminders) Title; notes; URL; date only; date + time; **early reminder** (alarm before due); repeat (daily, weekdays, weekly on days, monthly on day, yearly, custom "every 2 weeks", end date, end after N); **location** (arrive/leave, Home/Work/custom, radius); **when messaging a person**; flag; priority none/low/medium/high; tags (#tag in Reminders ↔ calternal tags); list move (between lists; to an iCloud list and back); subtasks (indent/outdent); sections; image attachment; complete; uncomplete; delete; restore; rename; "Today"/"Scheduled" smart lists; bulk complete; date-less reminder; all-day vs timed; time zone change on the Mac; very long title; emoji/RTL; 100 reminders at once. ## Matrix: Calendar.app events on the Journal (and future area) calendars All-day; timed; multi-day; cross-midnight; time zone per event; floating time; repeat rules (every kind above, plus exceptions: edit one occurrence, delete one occurrence, "this and future"); alerts (multiple, at time, before, custom, email-alert ignored); travel time; location (with structured map pin); URL; notes; invitees (should be refused or preserved, never a crash); availability busy/free; move between calendars; drag to resize; drag to another day; duplicate (⌘D) → dedupe rule from §46; copy/paste; delete; undo delete; colour change; calendar rename (display-name PROPPATCH); calendar order. ## Matrix: reminders from Calendar.app Calendar.app's "Reminder" tab in the new-item popover (seen on the VM: Event | Reminder); scheduled reminders shown in Calendar; completing a reminder from Calendar; dragging a reminder to another time. ## Method - Drive the Mac with AppleScript (Reminders and Calendar dictionaries) and cua-driver for UI-only knobs (early reminder, location, when messaging, travel time). Mac: `netbird ssh --no-browser --user calternal 10.69.69.21` (helpers in ~: shot.sh, dclick.py, ax.py). The VM's calternal account points at a local verification server reached through a Cloudflare quick tunnel; Claude's orchestration notes describe it (server on 127.0.0.1:18088 behind the logging proxy on :18089, data in the scratchpad macverify/work2). Build the server from your branch into CARGO_TARGET_DIR and restart it in place; keep the tunnel and proxy running. - For each case: record the exact request/response pair from the proxy log, the resulting Markdown, and the state Apple shows after a refresh. A case passes only when both sides agree after a second sync. - Output: `docs/research/apple-caldav-matrix.md` with a table (case → result → fixture → fix commit) and one replay test per case. - Never 422 a well-formed Apple request. Anything calternal cannot represent is preserved losslessly (DESIGN §46/§47) and round-trips unchanged.
Author
Owner

Starting #393 on branch job/reminders-sync, based on d192622807cb10f82888084895c548d7355d10f7. I am finishing the existing #358 completion 422 work first, then I will exercise and record the Apple Reminders, Calendar, and Calendar Reminder matrix on the macOS 27 VM.

Starting #393 on branch `job/reminders-sync`, based on `d192622807cb10f82888084895c548d7355d10f7`. I am finishing the existing #358 completion 422 work first, then I will exercise and record the Apple Reminders, Calendar, and Calendar Reminder matrix on the macOS 27 VM.
Author
Owner

Progress: the completion fixture used for the #358 prerequisite now round-trips STATUS:COMPLETED, PERCENT-COMPLETE:100, and Apple's COMPLETED timestamp, then uncompletes without leaving COMPLETED. The first focused run exposed a test helper name collision; after correcting it, a reminder replay also showed that Apple's valid PRIORITY:2 was reduced to the Task priority bucket and emitted as PRIORITY:1. I retained the original RFC value in the DAV metadata while keeping the Task bucket projection. cargo test -p calternal-dav -p calternal-plugin-notes now passes: 14 DAV unit tests, 6 DAV replay tests, and 108 Notes tests. Actual VM confirmation and the remaining matrix are pending.

Progress: the completion fixture used for the #358 prerequisite now round-trips `STATUS:COMPLETED`, `PERCENT-COMPLETE:100`, and Apple's `COMPLETED` timestamp, then uncompletes without leaving `COMPLETED`. The first focused run exposed a test helper name collision; after correcting it, a reminder replay also showed that Apple's valid `PRIORITY:2` was reduced to the Task priority bucket and emitted as `PRIORITY:1`. I retained the original RFC value in the DAV metadata while keeping the Task bucket projection. `cargo test -p calternal-dav -p calternal-plugin-notes` now passes: 14 DAV unit tests, 6 DAV replay tests, and 108 Notes tests. Actual VM confirmation and the remaining matrix are pending.
Author
Owner

Progress on the real macOS 27 VM: Reminders.app emitted a valid VTODO for a Unicode/RTL title, notes, and PRIORITY:5, then a second PUT with a zoned due date and VALARM. The verification server still had an older binary and returned 422 for both. I saved the exact request bodies as put-unicode-reminder.ics and put-timed-reminder.ics and added replay assertions; the branch server is compiling now so the VM result is not yet a branch result.

Calendar.app also emitted a VEVENT with DESCRIPTION for the Journal calendar. The old server returned 403 (property cannot be represented as a Log line). This is the existing Journal projection rule from DESIGN §30, but #393 asks for lossless preservation; I am checking the branch behavior and storage path before deciding the fix.

Progress on the real macOS 27 VM: Reminders.app emitted a valid VTODO for a Unicode/RTL title, notes, and PRIORITY:5, then a second PUT with a zoned due date and VALARM. The verification server still had an older binary and returned 422 for both. I saved the exact request bodies as `put-unicode-reminder.ics` and `put-timed-reminder.ics` and added replay assertions; the branch server is compiling now so the VM result is not yet a branch result. Calendar.app also emitted a VEVENT with DESCRIPTION for the Journal calendar. The old server returned 403 (`property cannot be represented as a Log line`). This is the existing Journal projection rule from DESIGN §30, but #393 asks for lossless preservation; I am checking the branch behavior and storage path before deciding the fix.
Author
Owner

Progress on job/reminders-sync at cd0236e5 (base includes dev at 9c1524f9): captured and replayed macOS 27 Unicode/RTL, timed alarm, and date-only VTODO bodies. The branch parser tests pass. The live proxy recorded a 422 for Apple's completed date-only PUT at 07:04:56; the server process predates the latest branch build. I am rebuilding and restarting that server to isolate stale-binary behavior before changing the parser. Calendar's DESCRIPTION PUT received 403; DESIGN §30 says Journal edits that cannot fit a Log line must be rejected, so I am recording that conflict with this issue's lossless goal rather than silently discarding it.

Progress on `job/reminders-sync` at `cd0236e5` (base includes `dev` at `9c1524f9`): captured and replayed macOS 27 Unicode/RTL, timed alarm, and date-only VTODO bodies. The branch parser tests pass. The live proxy recorded a 422 for Apple's completed date-only PUT at 07:04:56; the server process predates the latest branch build. I am rebuilding and restarting that server to isolate stale-binary behavior before changing the parser. Calendar's `DESCRIPTION` PUT received 403; DESIGN §30 says Journal edits that cannot fit a Log line must be rejected, so I am recording that conflict with this issue's lossless goal rather than silently discarding it.
Author
Owner

Live verification on the rebuilt branch server: a new date-only Reminders Task sent DTSTART;VALUE=DATE and DUE;VALUE=DATE; its completion PUT returned 201 at 07:25:08. The Task Markdown kept both date-only fields, status: done, and a checked checkbox. Reminders reported complete after the 07:25:09 sync. Three Notes provider replays for Unicode, timed alarm, and date-only completion pass.

A Task created by the earlier binary got 412 after upgrade. Its VTODO ETag changed, but the durable sync token did not, so Apple's next delta contained no changed resource. I added migration 16 to rotate the Reminders feed epoch once; the migration test and live retry are in progress. DESIGN §30 still rejects Journal Event DESCRIPTION because a Log line has no field for it; the captured Apple request is now a replay fixture.

Live verification on the rebuilt branch server: a new date-only Reminders Task sent `DTSTART;VALUE=DATE` and `DUE;VALUE=DATE`; its completion PUT returned 201 at 07:25:08. The Task Markdown kept both date-only fields, `status: done`, and a checked checkbox. Reminders reported complete after the 07:25:09 sync. Three Notes provider replays for Unicode, timed alarm, and date-only completion pass. A Task created by the earlier binary got 412 after upgrade. Its VTODO ETag changed, but the durable sync token did not, so Apple's next delta contained no changed resource. I added migration 16 to rotate the Reminders feed epoch once; the migration test and live retry are in progress. DESIGN §30 still rejects Journal Event DESCRIPTION because a Log line has no field for it; the captured Apple request is now a replay fixture.
Author
Owner

The real Mac exposed one more interop failure: after renaming a Reminders Task, Reminders.app sent DELETE without If-Match at 07:57:04. The branch server returned 428 and kept the Markdown Task while Apple removed it locally. A replay first reproduced 428. The DAV route now looks up the current ETag when the header is absent, then calls the existing provider deletion check. An explicit stale If-Match still gets 412. The replay is green; I am rebuilding the real server and will retry Apple's delete.

The real Mac exposed one more interop failure: after renaming a Reminders Task, Reminders.app sent DELETE without `If-Match` at 07:57:04. The branch server returned 428 and kept the Markdown Task while Apple removed it locally. A replay first reproduced 428. The DAV route now looks up the current ETag when the header is absent, then calls the existing provider deletion check. An explicit stale `If-Match` still gets 412. The replay is green; I am rebuilding the real server and will retry Apple's delete.
Author
Owner

Progress: #358 completion and the Apple DELETE case are now verified on the real macOS 27 VM. A date-only Task completion and uncompletion both returned 201; Markdown retained its due date and moved between status: done and status: todo, and Reminders showed the matching state after sync. After rename, Reminders sent DELETE without If-Match; the branch returned 204 at 08:09:52 and the next sync REPORT at 08:09:53 showed the resource deleted. The Task moved to Trash with its Versions. The regression replay is covered in apple_replay.rs; the fix is f7a29120.

I rebuilt and restarted calternal-server from this branch against the existing work2 data. I am continuing with the remaining matrix rows and will record each real-app result separately from replay-only coverage.

Progress: #358 completion and the Apple DELETE case are now verified on the real macOS 27 VM. A date-only Task completion and uncompletion both returned 201; Markdown retained its due date and moved between `status: done` and `status: todo`, and Reminders showed the matching state after sync. After rename, Reminders sent DELETE without `If-Match`; the branch returned 204 at 08:09:52 and the next sync REPORT at 08:09:53 showed the resource deleted. The Task moved to Trash with its Versions. The regression replay is covered in `apple_replay.rs`; the fix is `f7a29120`. I rebuilt and restarted `calternal-server` from this branch against the existing `work2` data. I am continuing with the remaining matrix rows and will record each real-app result separately from replay-only coverage.
Author
Owner

Progress: added a real Reminders multiline-notes fixture and test (4b04b13d), then captured a zoned timed VTODO with VALARM plus its complete/uncomplete writes (85568975). The live server returned 201 for every PUT. The Task Markdown kept the notes, Asia/Calcutta dates, alarm component and completion timestamps; after uncompletion it returned to status: todo. Focused replay tests pass.

The Mac's AppleScript interface maps remind me date to the due instant in this case. The real VALARM was preserved, but this run did not prove an early alarm offset, so that matrix row remains partial. I am continuing with the other Reminders and Calendar knobs.

Progress: added a real Reminders multiline-notes fixture and test (`4b04b13d`), then captured a zoned timed VTODO with VALARM plus its complete/uncomplete writes (`85568975`). The live server returned 201 for every PUT. The Task Markdown kept the notes, `Asia/Calcutta` dates, alarm component and completion timestamps; after uncompletion it returned to `status: todo`. Focused replay tests pass. The Mac's AppleScript interface maps `remind me date` to the due instant in this case. The real VALARM was preserved, but this run did not prove an early alarm offset, so that matrix row remains partial. I am continuing with the other Reminders and Calendar knobs.
Author
Owner

Progress: daily and weekdays repetition are now covered by real macOS requests and replay tests (64e3f705, 78dbaaa0). Apple sent RRULE:FREQ=DAILY and RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR; each PUT returned 201. The Task Markdown stored both rules, and the Reminders detail popover showed the selected rules after sync. Both kept the zoned due date and VALARM.

The early-alert offset remains unverified because the Mac scripting interface mapped the alert to the due instant. Next I am checking custom repeat settings and the remaining calendar cases.

Progress: daily and weekdays repetition are now covered by real macOS requests and replay tests (`64e3f705`, `78dbaaa0`). Apple sent `RRULE:FREQ=DAILY` and `RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR`; each PUT returned 201. The Task Markdown stored both rules, and the Reminders detail popover showed the selected rules after sync. Both kept the zoned due date and VALARM. The early-alert offset remains unverified because the Mac scripting interface mapped the alert to the due instant. Next I am checking custom repeat settings and the remaining calendar cases.
Author
Owner

Progress: verified and committed RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR and RRULE:FREQ=WEEKLY from the real Mac (78dbaaa0, 35929fc7). Both requests returned 201, the Task Markdown kept the recurrence, and Reminders showed the selected repeat after sync. The early-alert offset, selected custom weekdays, monthly/yearly, custom intervals and end rules remain open.

Progress: verified and committed `RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR` and `RRULE:FREQ=WEEKLY` from the real Mac (`78dbaaa0`, `35929fc7`). Both requests returned 201, the Task Markdown kept the recurrence, and Reminders showed the selected repeat after sync. The early-alert offset, selected custom weekdays, monthly/yearly, custom intervals and end rules remain open.
Author
Owner

Progress: Custom “every 2 weeks” now has a real Mac fixture and replay test (fe996c6e). Reminders sent RRULE:FREQ=WEEKLY;INTERVAL=2; the branch returned 201, Task Markdown retained the interval, and the app showed “Every 2 weeks” after sync. End date and end after N remain to test.

Progress: Custom “every 2 weeks” now has a real Mac fixture and replay test (`fe996c6e`). Reminders sent `RRULE:FREQ=WEEKLY;INTERVAL=2`; the branch returned 201, Task Markdown retained the interval, and the app showed “Every 2 weeks” after sync. End date and end after N remain to test.
Author
Owner

Progress: the two-week reminder repeat round-trip remains passed (Mac PUT 201; fixture and replay committed at fe996c6e). The Calendar pass is currently blocked: the real Mac now shows a “CalDAV Password Required” alert, and the logging proxy has no Calendar event write after the 09:12 UTC PROPFIND. The CUA helper also surfaced a macOS prompt that would grant NetBird screen and system-audio capture; I have not accepted it. I created one uniquely named all-day test event by AppleScript, but there is no proxy evidence, so it is not counted as a pass. I am removing that local test item and continuing with AppleScript-only checks.

Progress: the two-week reminder repeat round-trip remains passed (Mac PUT 201; fixture and replay committed at `fe996c6e`). The Calendar pass is currently blocked: the real Mac now shows a “CalDAV Password Required” alert, and the logging proxy has no Calendar event write after the 09:12 UTC PROPFIND. The CUA helper also surfaced a macOS prompt that would grant NetBird screen and system-audio capture; I have not accepted it. I created one uniquely named all-day test event by AppleScript, but there is no proxy evidence, so it is not counted as a pass. I am removing that local test item and continuing with AppleScript-only checks.
Author
Owner

Progress: generic protocol coverage now confirms that a well-formed monthly RRULE with COUNT=4 is accepted (201) and preserved in both Task Markdown and the DAV projection. The DAV replay test and Notes provider test passed. This is not Mac evidence; the real end-after-N UI case remains unverified. Commits: e3484274 (test), 4e2b8e77 (matrix). The matrix now records the CUA screen/audio prompt and Calendar’s CalDAV password alert. DESIGN §30 still requires rejecting Journal Event fields that cannot be Log lines, while #393 asks to preserve them; I documented this conflict and kept current §30 behavior.

Progress: generic protocol coverage now confirms that a well-formed monthly RRULE with `COUNT=4` is accepted (201) and preserved in both Task Markdown and the DAV projection. The DAV replay test and Notes provider test passed. This is not Mac evidence; the real end-after-N UI case remains unverified. Commits: `e3484274` (test), `4e2b8e77` (matrix). The matrix now records the CUA screen/audio prompt and Calendar’s CalDAV password alert. DESIGN §30 still requires rejecting Journal Event fields that cannot be Log lines, while #393 asks to preserve them; I documented this conflict and kept current §30 behavior.
Author
Owner

Progress: protocol replay now covers weekly repeats with selected weekdays, monthly repeats on a day, and yearly repeats. All three PUTs returned 201 and GET returned the same RRULE. This is code-level coverage only; no macOS capture was made. The repeat-count and recurrence coverage is committed (e3484274, a127ba47) and the matrix records that distinction (ed62df1f). AppleScript could not create a nested Reminders item because the Reminders dictionary exposes no child collection; the temporary parent was removed. No subtask round-trip is counted.

Progress: protocol replay now covers weekly repeats with selected weekdays, monthly repeats on a day, and yearly repeats. All three PUTs returned 201 and GET returned the same RRULE. This is code-level coverage only; no macOS capture was made. The repeat-count and recurrence coverage is committed (`e3484274`, `a127ba47`) and the matrix records that distinction (`ed62df1f`). AppleScript could not create a nested Reminders item because the Reminders dictionary exposes no child collection; the temporary parent was removed. No subtask round-trip is counted.
Author
Owner

Completed the reminders-sync work on job/reminders-sync.

Head: 0774df19 (after the requested one-time merge from dev).

Implemented and recorded:

  • Apple CalDAV VTODO replay and adapter fixes for reminders, including completion changes, date-only and timed reminders, alarms, notes, priority, rename, deletion, and recurrence.
  • Preserve unsupported recurrence details in the Notes Markdown and DAV projection. Replay tests cover COUNT=4 and selected weekday, monthly-day, and yearly rules. These are protocol tests, not Mac captures.
  • Added the macOS 27 verification matrix at docs/research/apple-caldav-matrix.md.

Main files: crates/calternal-dav/src/{protocol.rs,reminders.rs}, crates/calternal-dav/tests/apple_replay.rs and its fixtures, crates/calternal-notes-core/src/tasks/{extract.rs,mod.rs}, crates/plugins/notes/src/{lib.rs,store.rs,tasks_dav.rs,tasks_store.rs}, the Notes migration 0016_reminder_wire_epoch.sql, and the matrix document.

Real Mac verification remains partial. The CUA helper is blocked by the macOS prompt for NetBird screen and system-audio capture, which I did not grant. Calendar showed “CalDAV Password Required”; the scripted all-day event did not reach the proxy and was removed, so no all-day round-trip is counted. Subtasks and several other matrix rows remain unrun. DESIGN §30 rejects Journal Event descriptions that cannot map to a Log line, while #393 asks for lossless preservation; the current server keeps §30 behavior. Supporting those descriptions needs a data-format and Notes-provider writer change.

Decisions: preserve unrepresented recurrence fields as raw RRULE data through the Notes Markdown and DAV projection; keep the explicit DESIGN §30 Journal Event rejection pending a design and storage change.

Gates after merging dev:

  • cargo fmt --check: exit 0, no output.
  • cargo clippy --all-targets -- -D warnings: exit 0; captured output:
        Finished `dev` profile [unoptimized + debuginfo] target(s) in 74m 50s
    
  • cargo test -p calternal-dav -p calternal-plugin-notes: exit 0; captured summaries:
    running 23 tests
    test result: ok. 23 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
    
    running 27 tests
    test result: ok. 27 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.12s
    
    running 116 tests
    test result: ok. 116 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 132.58s
    
    running 0 tests
    test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    
    running 0 tests
    test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    
  • bun run check in apps/web: exit 0; captured output:
    $ node scripts/check-type-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json
    Text sizes use shared role tokens.
    Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/reminders-sync/apps/web
    Getting Svelte diagnostics...
    
    svelte-check found 0 errors and 0 warnings
    
  • bun run test in apps/web: exit 0; captured summary:
     Test Files  123 passed (123)
          Tests  787 passed (787)
    

The one time-boxed adversarial round used timeout 1500s tests/adversarial/run.sh and exited 124 while compiling the server, before probes started. The captured log contains Terminated; no adversarial findings were produced. I ran cargo clean and removed apps/web/build. Worktree is clean. No explicit push was made.

Completed the reminders-sync work on `job/reminders-sync`. Head: `0774df19` (after the requested one-time merge from `dev`). Implemented and recorded: - Apple CalDAV VTODO replay and adapter fixes for reminders, including completion changes, date-only and timed reminders, alarms, notes, priority, rename, deletion, and recurrence. - Preserve unsupported recurrence details in the Notes Markdown and DAV projection. Replay tests cover `COUNT=4` and selected weekday, monthly-day, and yearly rules. These are protocol tests, not Mac captures. - Added the macOS 27 verification matrix at `docs/research/apple-caldav-matrix.md`. Main files: `crates/calternal-dav/src/{protocol.rs,reminders.rs}`, `crates/calternal-dav/tests/apple_replay.rs` and its fixtures, `crates/calternal-notes-core/src/tasks/{extract.rs,mod.rs}`, `crates/plugins/notes/src/{lib.rs,store.rs,tasks_dav.rs,tasks_store.rs}`, the Notes migration `0016_reminder_wire_epoch.sql`, and the matrix document. Real Mac verification remains partial. The CUA helper is blocked by the macOS prompt for NetBird screen and system-audio capture, which I did not grant. Calendar showed “CalDAV Password Required”; the scripted all-day event did not reach the proxy and was removed, so no all-day round-trip is counted. Subtasks and several other matrix rows remain unrun. DESIGN §30 rejects Journal Event descriptions that cannot map to a Log line, while #393 asks for lossless preservation; the current server keeps §30 behavior. Supporting those descriptions needs a data-format and Notes-provider writer change. Decisions: preserve unrepresented recurrence fields as raw RRULE data through the Notes Markdown and DAV projection; keep the explicit DESIGN §30 Journal Event rejection pending a design and storage change. Gates after merging `dev`: - `cargo fmt --check`: exit 0, no output. - `cargo clippy --all-targets -- -D warnings`: exit 0; captured output: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 74m 50s ``` - `cargo test -p calternal-dav -p calternal-plugin-notes`: exit 0; captured summaries: ``` running 23 tests test result: ok. 23 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s running 27 tests test result: ok. 27 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.12s running 116 tests test result: ok. 116 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 132.58s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` - `bun run check` in `apps/web`: exit 0; captured output: ``` $ node scripts/check-type-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json Text sizes use shared role tokens. Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/reminders-sync/apps/web Getting Svelte diagnostics... svelte-check found 0 errors and 0 warnings ``` - `bun run test` in `apps/web`: exit 0; captured summary: ``` Test Files 123 passed (123) Tests 787 passed (787) ``` The one time-boxed adversarial round used `timeout 1500s tests/adversarial/run.sh` and exited 124 while compiling the server, before probes started. The captured log contains `Terminated`; no adversarial findings were produced. I ran `cargo clean` and removed `apps/web/build`. Worktree is clean. No explicit push was made.
Author
Owner

Adversarial finding from job/money-md (#404), head 232702c08c23063c58df9433d8512b466abaf735:

The API-only adversarial run created a VTODO with DESCRIPTION:Adversarial reminder note, completed it with a conditional PUT, then fetched it. The PUT succeeded and the GET returned HTTP 200 with completion state, but the response did not contain the description. dav_reminder_description_findings reported Reminders response lost the VTODO description. The server remained alive at the end of the round.

This finding is outside #404's Money prototype scope, so I am recording it here for the Reminders CalDAV work. No credentials or private data were used in this finding.

Adversarial finding from `job/money-md` (#404), head `232702c08c23063c58df9433d8512b466abaf735`: The API-only adversarial run created a VTODO with `DESCRIPTION:Adversarial reminder note`, completed it with a conditional PUT, then fetched it. The PUT succeeded and the GET returned HTTP 200 with completion state, but the response did not contain the description. `dav_reminder_description_findings` reported `Reminders response lost the VTODO description`. The server remained alive at the end of the round. This finding is outside #404's Money prototype scope, so I am recording it here for the Reminders CalDAV work. No credentials or private data were used in this finding.
Author
Owner

Progress: the macOS 27 VM and CUA helper are reachable. Calendar's current accessibility tree shows the Journal calendar. The existing logging proxy is up, but its :18088 backend is stopped. I am preserving the work2 dataset and will update the requested matrix rows from live captures.

Progress: the macOS 27 VM and CUA helper are reachable. Calendar's current accessibility tree shows the Journal calendar. The existing logging proxy is up, but its :18088 backend is stopped. I am preserving the work2 dataset and will update the requested matrix rows from live captures.
Author
Owner

Finding: CUA works in the current macOS 27 session. shot.sh captured a 1600x1263 desktop image (scale_factor 2.0), and ax.py Calendar find returned the Calendar controls and cached test entries. The visible macOS prompt asked whether NetBird could access files on a network volume; I chose Don't Allow. This is not the earlier screen/audio prompt. Live sync status will be checked after the verification server starts.

Finding: CUA works in the current macOS 27 session. shot.sh captured a 1600x1263 desktop image (scale_factor 2.0), and ax.py Calendar find returned the Calendar controls and cached test entries. The visible macOS prompt asked whether NetBird could access files on a network volume; I chose Don't Allow. This is not the earlier screen/audio prompt. Live sync status will be checked after the verification server starts.
Author
Owner

Data-loss finding (deploy blocker), reported by the money-md job's adversarial round on dev: the Reminders completion path loses an existing DESCRIPTION. Completing a VTODO drops the reminder's notes (evidence posted on #393). This is on dev and not yet deployed. It must be fixed, with an Apple replay regression (complete a reminder that has multi-line notes; the notes survive in Markdown and on the next GET), before the #356/#393 deploy. Job break-dav (#457) owns the fix; job mac-verify must include the scenario in its GO/NO-GO.

**Data-loss finding (deploy blocker)**, reported by the money-md job's adversarial round on dev: the Reminders **completion path loses an existing DESCRIPTION**. Completing a VTODO drops the reminder's notes (evidence posted on #393). This is on dev and not yet deployed. It must be fixed, with an Apple replay regression (complete a reminder that has multi-line notes; the notes survive in Markdown and on the next GET), before the #356/#393 deploy. Job break-dav (#457) owns the fix; job mac-verify must include the scenario in its GO/NO-GO.
Author
Owner

Running the real macOS 27 portion of #393 in the shared job/mac-verify worktree. The same Apple Calendar CalDAV account is connected to the old Journal collection through the local TLS logging proxy. The first five-entry area fixture is being imported into that server now; I will report each Reminder row from UI and wire evidence, and will leave unattempted rows marked not run.

Running the real macOS 27 portion of #393 in the shared `job/mac-verify` worktree. The same Apple Calendar CalDAV account is connected to the old Journal collection through the local TLS logging proxy. The first five-entry area fixture is being imported into that server now; I will report each Reminder row from UI and wire evidence, and will leave unattempted rows marked not run.
Author
Owner

Resuming the real Apple client verification. Branch: job/mac-verify; base SHA: 28ac39f917f3dedd44dec2e863ee2854d64c2d5a; resume head: 076cf6d776ded4bab13b790c11ae17de6fa196f5. The previous session refreshed the Mac VM access evidence and recorded that the account sync against the restarted verification server is still pending. I am continuing that upgrade-path check and the remaining requested Reminders cases.

Resuming the real Apple client verification. Branch: `job/mac-verify`; base SHA: `28ac39f917f3dedd44dec2e863ee2854d64c2d5a`; resume head: `076cf6d776ded4bab13b790c11ae17de6fa196f5`. The previous session refreshed the Mac VM access evidence and recorded that the account sync against the restarted verification server is still pending. I am continuing that upgrade-path check and the remaining requested Reminders cases.
Author
Owner

Reminders rows from the #356 macOS 27 run (details and evidence in the #356 comment and docs/research/apple-caldav-matrix.md on job/mac-verify):

  • Unicode/RTL read-back: PASS (201, Markdown and GET match, Reminders renders RTL).
  • DTSTART: PASS (DTSTART;TZID + DUE → scheduled/due, read back).
  • Location alert (custom place, arriving, 100 m): PASS; X-APPLE-PROXIMITY / X-APPLE-STRUCTURED-LOCATION VALARM kept and read back.
  • Tags: not supported for CalDAV lists; hashtag stays in SUMMARY, no CATEGORIES ever (decides #430 T13).
  • Early reminder, flag, URL, subtasks (indent/outdent): not offered by Reminders for CalDAV lists.
  • All-day Calendar event: 422 by DESIGN §30 C13; Calendar offers Delete Event.
Reminders rows from the #356 macOS 27 run (details and evidence in the #356 comment and `docs/research/apple-caldav-matrix.md` on `job/mac-verify`): - Unicode/RTL read-back: PASS (201, Markdown and GET match, Reminders renders RTL). - DTSTART: PASS (`DTSTART;TZID` + `DUE` → `scheduled`/`due`, read back). - Location alert (custom place, arriving, 100 m): PASS; X-APPLE-PROXIMITY / X-APPLE-STRUCTURED-LOCATION VALARM kept and read back. - Tags: not supported for CalDAV lists; hashtag stays in SUMMARY, no CATEGORIES ever (decides #430 T13). - Early reminder, flag, URL, subtasks (indent/outdent): not offered by Reminders for CalDAV lists. - All-day Calendar event: 422 by DESIGN §30 C13; Calendar offers Delete Event.
Author
Owner

Starting #393 on job/mac-393, base 0dc772c3697ea9bd01822c26440c32206d472715. Read CLAUDE.md, CONTEXT.md, DESIGN §30/§46/§47, the existing matrix, and #457/#428 reports. Mac SSH works; acquired the exclusive macvm.lock. Will use a local branch server, reverse SSH tunnel, throwaway lab trust, and real UI/wire evidence. Existing matrix proves mainly Mac-to-calternal rows; reverse rows remain open. C13 rejections will be recorded as intended behavior as required by this job prompt. No push or deployment.

Starting #393 on `job/mac-393`, base `0dc772c3697ea9bd01822c26440c32206d472715`. Read CLAUDE.md, CONTEXT.md, DESIGN §30/§46/§47, the existing matrix, and #457/#428 reports. Mac SSH works; acquired the exclusive macvm.lock. Will use a local branch server, reverse SSH tunnel, throwaway lab trust, and real UI/wire evidence. Existing matrix proves mainly Mac-to-calternal rows; reverse rows remain open. C13 rejections will be recorded as intended behavior as required by this job prompt. No push or deployment.
Author
Owner

Committed d7afa529d: optional TLS and credential-free DAV capture added to the existing local proxy; exact iCalendar bytes retained with response status and selected protocol headers. Four capture/proxy tests pass. Root ws/lib0 test dependencies are explicit (versions and MIT licenses checked with bun info). First server build ended with exit 143 (SIGTERM) without a Rust diagnostic; restarted it. Mac CUA works; fresh CA profile downloaded, not yet installed. No new matrix cell is claimed passed.

Committed `d7afa529d`: optional TLS and credential-free DAV capture added to the existing local proxy; exact iCalendar bytes retained with response status and selected protocol headers. Four capture/proxy tests pass. Root ws/lib0 test dependencies are explicit (versions and MIT licenses checked with bun info). First server build ended with exit 143 (SIGTERM) without a Rust diagnostic; restarted it. Mac CUA works; fresh CA profile downloaded, not yet installed. No new matrix cell is claimed passed.
Author
Owner

Committed 3e211431f: full two-direction acceptance checklist, including every requested Reminders/Calendar control, reminders in Calendar, and webcal. All fresh cells remain Not run until paired wire/Home/UI evidence exists. Historical #356 results stay intact. C13 rejection is kept as this job explicitly requires it. Current verdict: NO-GO pending real Mac evidence; no fresh unsupported-control claim is made. Four proxy/capture tests passed (4 pass, 0 fail). First server build exit 143; retry is compiling. Mac profile download is visible in Device Management; trust/account setup is in progress.

Committed `3e211431f`: full two-direction acceptance checklist, including every requested Reminders/Calendar control, reminders in Calendar, and webcal. All fresh cells remain Not run until paired wire/Home/UI evidence exists. Historical #356 results stay intact. C13 rejection is kept as this job explicitly requires it. Current verdict: NO-GO pending real Mac evidence; no fresh unsupported-control claim is made. Four proxy/capture tests passed (4 pass, 0 fail). First server build exit 143; retry is compiling. Mac profile download is visible in Device Management; trust/account setup is in progress.
Author
Owner

Web validation: bun run check passed with svelte-check found 0 errors and 0 warnings. bun run test had 886 passes and one timeout (keeps glass materials in the shared role tokens, 5000 ms while scanning files; no assertion failure). No expectation changed. Isolated rerun is running. CUA reached the CA install authentication dialog. The branch server retry is still compiling; no fresh interoperability cell is claimed passed.

Web validation: `bun run check` passed with `svelte-check found 0 errors and 0 warnings`. `bun run test` had 886 passes and one timeout (`keeps glass materials in the shared role tokens`, 5000 ms while scanning files; no assertion failure). No expectation changed. Isolated rerun is running. CUA reached the CA install authentication dialog. The branch server retry is still compiling; no fresh interoperability cell is claimed passed.
Author
Owner

Head 4e98d0c65: capture size-bound regression added; five proxy/capture tests pass (5 pass, 0 fail). The complete web test run had one 5000 ms timeout in the existing theme file-scan test, with 886 other tests passing. The isolated rerun of themes.test.ts passed all 73 tests without changing an expectation. Mac CUA reached the CA authentication dialog; the password helper completed without outputting private values and the lab root certificate now exists in the System keychain. Explicit TLS trust verification is next. Server build is still in progress. No fresh matrix cell is claimed passed.

Head `4e98d0c65`: capture size-bound regression added; five proxy/capture tests pass (5 pass, 0 fail). The complete web test run had one 5000 ms timeout in the existing theme file-scan test, with 886 other tests passing. The isolated rerun of themes.test.ts passed all 73 tests without changing an expectation. Mac CUA reached the CA authentication dialog; the password helper completed without outputting private values and the lab root certificate now exists in the System keychain. Explicit TLS trust verification is next. Server build is still in progress. No fresh matrix cell is claimed passed.
Author
Owner

Lab setup finding: the CA profile imported the throwaway root into the System keychain, but security verify-cert -c ~/mac393-tls.pem -p ssl -s localhost reports CSSMERR_TP_NOT_TRUSTED. The sudo trust operation fails at SecTrustSettings with authorization denied, rather than a sudo/password diagnostic. Continuing with Keychain Access UI trust. No TLS/account interoperability pass is claimed. Private file contents and credential values have not been printed.

Lab setup finding: the CA profile imported the throwaway root into the System keychain, but `security verify-cert -c ~/mac393-tls.pem -p ssl -s localhost` reports `CSSMERR_TP_NOT_TRUSTED`. The sudo trust operation fails at SecTrustSettings with authorization denied, rather than a sudo/password diagnostic. Continuing with Keychain Access UI trust. No TLS/account interoperability pass is claimed. Private file contents and credential values have not been printed.
Author
Owner

Head d7eaf387f: recorded the current lab trust evidence separately from the acceptance cells. Root fingerprint matches the local CA; OpenSSL and Mac explicit-root verification pass. Automatic Mac SSL verification fails despite Keychain's trusted-root display. Sending the full TLS chain changes curl's error from missing issuer to untrusted self-signed chain. Investigating the SSL-specific trust policy. Screenshot attached: https://git.kayg.org/attachments/0698889c-d0bd-4fb9-b978-6d56da3ed56d . No new interop pass is claimed.

The production web build passed after restoring a clean isolated Bun install. Five capture/proxy tests pass on that install. Rust server build remains in progress.

Head `d7eaf387f`: recorded the current lab trust evidence separately from the acceptance cells. Root fingerprint matches the local CA; OpenSSL and Mac explicit-root verification pass. Automatic Mac SSL verification fails despite Keychain's trusted-root display. Sending the full TLS chain changes curl's error from missing issuer to untrusted self-signed chain. Investigating the SSL-specific trust policy. Screenshot attached: https://git.kayg.org/attachments/0698889c-d0bd-4fb9-b978-6d56da3ed56d . No new interop pass is claimed. The production web build passed after restoring a clean isolated Bun install. Five capture/proxy tests pass on that install. Rust server build remains in progress.
Author
Owner

Required one-time merge of origin/dev completed cleanly at dc3325b1cd. Final web gates passed:

svelte-check found 0 errors and 0 warnings
 Test Files  137 passed (137)
      Tests  887 passed (887)

The Rust server build and per-crate gates remain running. Mac user trust authorization completed, but SSL verification still failed. Trust settings show an explicit SSL entry without a trust result; Keychain displays SSL as “no value specified”. Correcting that policy before account provisioning. No fresh matrix acceptance cell passes yet.

Required one-time merge of origin/dev completed cleanly at dc3325b1cd1597183eb3f47d6495dffe95fb68e9. Final web gates passed: ``` svelte-check found 0 errors and 0 warnings Test Files 137 passed (137) Tests 887 passed (887) ``` The Rust server build and per-crate gates remain running. Mac user trust authorization completed, but SSL verification still failed. Trust settings show an explicit SSL entry without a trust result; Keychain displays SSL as “no value specified”. Correcting that policy before account provisioning. No fresh matrix acceptance cell passes yet.
Author
Owner

Head ccedcd3a1. Mac lab SSL trust is resolved. Native Keychain SSL policy was set to Always Trust, then the close/save operation was authorized in System Certificate Trust Settings. Evidence:

...certificate verification successful.
lab HTTPS status=502

The 502 is the local proxy response while the backend is not started; it is not a DAV failure. Verified Keychain state. Procedure recorded in the matrix. Build is in server linking. The capture/proxy tests passed 5/5 on a retry; the first attempt hit the unchanged existing 1-second proxy readiness bound, before any status-code assertion. Final web gates passed 887/887 with no Svelte errors or warnings. Matrix acceptance cells remain not run until the real backend starts.

Head ccedcd3a1. Mac lab SSL trust is resolved. Native Keychain SSL policy was set to Always Trust, then the close/save operation was authorized in System Certificate Trust Settings. Evidence: ``` ...certificate verification successful. lab HTTPS status=502 ``` The 502 is the local proxy response while the backend is not started; it is not a DAV failure. [Verified Keychain state](https://git.kayg.org/attachments/c716c0a9-6ef3-4f01-8934-6c1f40c52f06). Procedure recorded in the matrix. Build is in server linking. The capture/proxy tests passed 5/5 on a retry; the first attempt hit the unchanged existing 1-second proxy readiness bound, before any status-code assertion. Final web gates passed 887/887 with no Svelte errors or warnings. Matrix acceptance cells remain not run until the real backend starts.
Author
Owner

Head 563b07090. The server built from merged dev source dc3325b1c passed:

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 25m 46s

The throwaway local server is listening. Mac curl through the locked SSH reverse tunnel and verified lab TLS now returns:

lab HTTPS status=200

Throwaway owner and DAV app password were created through real authentication endpoints; credentials are private and setup token is redacted from the log. Proceeding with Mac account provisioning. Per-crate Rust gates are running; no fresh DAV matrix cells are claimed yet.

Head 563b07090. The server built from merged dev source dc3325b1c passed: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 25m 46s ``` The throwaway local server is listening. Mac curl through the locked SSH reverse tunnel and verified lab TLS now returns: ``` lab HTTPS status=200 ``` Throwaway owner and DAV app password were created through real authentication endpoints; credentials are private and setup token is redacted from the log. Proceeding with Mac account provisioning. Per-crate Rust gates are running; no fresh DAV matrix cells are claimed yet.
Author
Owner

Real Mac Reminders edit captured: 1790756028512-00016.json, PUT 201, then REPORT 207 (00017), another PUT 201 (00019) and REPORT 207 (00020). Capture excerpt:

DESCRIPTION:mac393 native line one\nالسطر الثاني שלום 🌱
PRIORITY:5
SUMMARY:mac393 Mac→calternal مرحبا שלום 桜 🌱

Authenticated Notes API GET 200 confirms the same title, both prose lines and priority: medium in the authoritative Markdown. Mac native readback after sync confirms both lines and priority 5. API-created Task received in Reminders; Mac edit after sync. Reviewed exact 500-byte real Apple PUT now has a replay fixture and Notes provider test in progress. Existing test expectations are unchanged.
DAV gates passed:

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 8m 49s
test result: ok. 40 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.13s
test result: ok. 33 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

Notes/Calendar/Server gates continue. CUA now uses the visible main window rather than off-screen menu windows; Calendar was repositioned and its real Refresh Calendars menu was invoked. Calendar discovery has started through the capture proxy.

Real Mac Reminders edit captured: `1790756028512-00016.json`, PUT 201, then REPORT 207 (`00017`), another PUT 201 (`00019`) and REPORT 207 (`00020`). Capture excerpt: ``` DESCRIPTION:mac393 native line one\nالسطر الثاني שלום 🌱 PRIORITY:5 SUMMARY:mac393 Mac→calternal مرحبا שלום 桜 🌱 ``` Authenticated Notes API GET 200 confirms the same title, both prose lines and `priority: medium` in the authoritative Markdown. Mac native readback after sync confirms both lines and priority 5. [API-created Task received in Reminders](https://git.kayg.org/attachments/ed7c1ef2-f998-459f-8607-619ed0d5b36a); [Mac edit after sync](https://git.kayg.org/attachments/5a025411-dbbd-489f-b59f-eefff71b4656). Reviewed exact 500-byte real Apple PUT now has a replay fixture and Notes provider test in progress. Existing test expectations are unchanged. DAV gates passed: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 8m 49s test result: ok. 40 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.13s test result: ok. 33 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Notes/Calendar/Server gates continue. CUA now uses the visible main window rather than off-screen menu windows; Calendar was repositioned and its real Refresh Calendars menu was invoked. Calendar discovery has started through the capture proxy.
Author
Owner

Head 3c6ffcbe3. Fixed the real reverse priority failure in atomic commit 0057b7b51: a Task API priority edit returned 200, but stale Apple PRIORITY in DAV metadata overrode it on GET. The renderer now preserves exact Apple numeric priority only while it matches the authoritative Task bucket, using one shared mapping for parsing and emission. Priority removal also removes stale wire priority. The exact Mac capture drives the new regression. It failed before the fix with actual PRIORITY:5 versus expected PRIORITY:3.
Post-fix DAV gates:

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 55.66s
test result: ok. 41 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.05s
test result: ok. 33 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.32s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

The fixed server rebuild and Notes capture replay are running. The matrix now records the real Mac title, multiline notes, medium priority, Unicode/RTL/emoji and completion checks, separates initial receive observations from second-sync passes, and records the priority live retest as pending. Calendar received the timed Work Log entry and its inspector shows 09:00–10:00. Remaining exhaustive cells are still not run, so NO-GO remains the release decision.

Head 3c6ffcbe3. Fixed the real reverse priority failure in atomic commit 0057b7b51: a Task API priority edit returned 200, but stale Apple PRIORITY in DAV metadata overrode it on GET. The renderer now preserves exact Apple numeric priority only while it matches the authoritative Task bucket, using one shared mapping for parsing and emission. Priority removal also removes stale wire priority. The exact Mac capture drives the new regression. It failed before the fix with actual PRIORITY:5 versus expected PRIORITY:3. Post-fix DAV gates: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 55.66s test result: ok. 41 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.05s test result: ok. 33 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.32s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` The fixed server rebuild and Notes capture replay are running. The matrix now records the real Mac title, multiline notes, medium priority, Unicode/RTL/emoji and completion checks, separates initial receive observations from second-sync passes, and records the priority live retest as pending. Calendar received the timed Work Log entry and its inspector shows 09:00–10:00. Remaining exhaustive cells are still not run, so NO-GO remains the release decision.
Author
Owner

Head deeff53c41. Native Calendar title edit produced PUT 1790758390067-00045 (204), then REPORT (207), and the real Log API returned the changed Unicode title with unchanged identity. Native Reminders uncompletion produced PUT 1790758139457-00041 (201), then REPORT (207), and the Markdown Task became unchecked with both note lines preserved.

The server rebuilt with the priority fix (0057b7b51): Finished dev profile [unoptimized + debuginfo] target(s) in 19m 58s. Its restart failed with Tantivy(LockFailure(LockBusy, Some("Failed to acquire index lock..."))). No process using this job's server binary remains and fuser found no holder of its index lock files. Investigating before the live priority retest. Notes replay and the remaining per-crate gates are still running. The full option matrix remains incomplete; release verdict is NO-GO.

Head deeff53c41cd69e6ec81508af21b5d6990158c2c. Native Calendar title edit produced PUT 1790758390067-00045 (204), then REPORT (207), and the real Log API returned the changed Unicode title with unchanged identity. Native Reminders uncompletion produced PUT 1790758139457-00041 (201), then REPORT (207), and the Markdown Task became unchecked with both note lines preserved. The server rebuilt with the priority fix (0057b7b51): `Finished dev profile [unoptimized + debuginfo] target(s) in 19m 58s`. Its restart failed with `Tantivy(LockFailure(LockBusy, Some("Failed to acquire index lock...")))`. No process using this job's server binary remains and fuser found no holder of its index lock files. Investigating before the live priority retest. Notes replay and the remaining per-crate gates are still running. The full option matrix remains incomplete; release verdict is NO-GO.
Author
Owner

Head 42f8de5f0. The fixed server's Task API returned High (200), DAV GET emitted PRIORITY:3, and Apple fetched it in REPORT 1790760058155-00061 (207). Native Reminders readback now returns 3 with the Unicode title and both note lines intact. Screenshot: https://git.kayg.org/attachments/a96487d6-995b-41b0-a970-dcd7fc3ffb54 . The matrix marks verified receive separately from a full second-sync pass.

The real captured Notes apple_replay test passes (2 tests total), committed at 091b1f80b. Final Notes clippy passed: Finished dev profile [unoptimized + debuginfo] target(s) in 3m 47s. Full Notes tests are running, then Calendar and Server gates. Server restart failure is recorded in #505; its next start succeeded without touching Index or lock files. NO-GO remains: most option cells and Webcal are not run. Preparing lab cleanup within the four-hour job limit.

Head 42f8de5f0. The fixed server's Task API returned High (200), DAV GET emitted PRIORITY:3, and Apple fetched it in REPORT 1790760058155-00061 (207). Native Reminders readback now returns 3 with the Unicode title and both note lines intact. Screenshot: https://git.kayg.org/attachments/a96487d6-995b-41b0-a970-dcd7fc3ffb54 . The matrix marks verified receive separately from a full second-sync pass. The real captured Notes apple_replay test passes (2 tests total), committed at 091b1f80b. Final Notes clippy passed: `Finished dev profile [unoptimized + debuginfo] target(s) in 3m 47s`. Full Notes tests are running, then Calendar and Server gates. Server restart failure is recorded in #505; its next start succeeded without touching Index or lock files. NO-GO remains: most option cells and Webcal are not run. Preparing lab cleanup within the four-hour job limit.
Author
Owner

Head 2be1731e3. The Mac account and lab CA profiles are removed. Both keychain certificate lookups returned not-found (44). Exported user and System trust settings contain no lab CA SHA-1 entry; verify-cert returns CSSMERR_TP_NOT_TRUSTED. The remote lab helper file list, profile count and blank Notes count are all zero. Tunnel, TLS proxy and server stopped; a new nonblocking flock succeeds.

Final Notes gates completed: 126 unit tests and 2 apple_replay tests passed; clippy passed. Final Calendar clippy passed in 11m 06s. Calendar tests are rebuilding a dependency feature combination; Server clippy/test are not yet complete. Preparing the final NO-GO report within the four-hour limit. Reverse Task title and None reached the Mac and stayed after the second discovery cycle (R4), with screenshot attached in the matrix. Most options and Webcal remain Not run.

Head 2be1731e3. The Mac account and lab CA profiles are removed. Both keychain certificate lookups returned not-found (44). Exported user and System trust settings contain no lab CA SHA-1 entry; verify-cert returns CSSMERR_TP_NOT_TRUSTED. The remote lab helper file list, profile count and blank Notes count are all zero. Tunnel, TLS proxy and server stopped; a new nonblocking flock succeeds. Final Notes gates completed: 126 unit tests and 2 apple_replay tests passed; clippy passed. Final Calendar clippy passed in 11m 06s. Calendar tests are rebuilding a dependency feature combination; Server clippy/test are not yet complete. Preparing the final NO-GO report within the four-hour limit. Reverse Task title and None reached the Mac and stayed after the second discovery cycle (R4), with screenshot attached in the matrix. Most options and Webcal remain Not run.
Author
Owner

Final report for #393. Branch job/mac-393, head d2251b6b4569c96d467d1a9586ec9652a0a5a2f6. No push, deploy or issue closure. The one required merge from origin/dev is dc3325b1cd.

NO-GO for “calternaldav shipped”. This is a partial delivery, not an exhaustive acceptance result. The 102-row matrix contains 204 direction cells: 11 passed, 5 observed without full acceptance, and 188 Not run.

Built: optional TLS and bounded, credential-free DAV captures in the existing local proxy; a real macOS 27 Reminders fixture; a priority projection fix that prevents stale Apple metadata from overriding the current Task priority; and Notes apple_replay coverage. Native Mac reads confirmed the fix (High -> PRIORITY:3 / native 3; None -> no PRIORITY / native 0). Native writes also confirmed Unicode titles, multiline notes, completion/uncompletion and a Calendar title edit. The matrix links the real screenshots and records request/response IDs and API results. No UI implementation changed.

Files: crates/calternal-dav/src/reminders.rs; crates/calternal-dav/tests/fixtures/macos27/put-mac393-unicode-notes-priority.ics; crates/plugins/notes/tests/apple_replay.rs; tests/adversarial/apple-capture.mjs; tests/adversarial/apple-capture.test.mjs; tests/adversarial/editor-proxy.mjs; docs/research/apple-caldav-matrix.md; package.json; bun.lock. Five upstream UI/audit files came from the single required origin/dev merge; they are not this job's implementation.

Known gaps: the remaining Reminders controls, most Calendar controls, C13 rejection UX, crossing-midnight cases, repeat exceptions, alerts, invitees, moves/rename/delete and all Webcal cases still need real two-direction evidence. High's fixed Mac receive is verified, but its second sync was not checked before the next edit. Reverse prose editing is not tested. The server's first restart exited with Tantivy LockBusy; the next start succeeded without touching Index files. Root cause remains in #505. No full adversarial round was completed. Calendar test and Server validation status will be recorded below; unfinished gates are not passes.

Decisions: keep separate direction columns and preserve prior historical evidence; distinguish received data from a second-sync pass. Preserve an exact Apple priority number only while its decoded Task bucket still matches Markdown, then use the existing canonical values after a Task edit. Reuse the existing proxy with opt-in lab TLS/captures; exclude query URLs and non-DAV routes, allowlist headers, and bound retained body bytes at 2 MiB. C13 behavior stays as specified; no new Log data format was introduced.

Cleanup: removed the Mac account/CA profiles, both keychain CA copies and user/System lab trust entries. Certificate verification now fails with CSSMERR_TP_NOT_TRUSTED. Remote lab files and the blank lab note are absent. Stopped the tunnel/proxy/server and released macvm.lock. Local credential files and CA/TLS private keys are removed. Build cleanup will be recorded after cargo clean.

Gate output (summary lines copied verbatim):

cargo fmt --check

Exit 0, no output.

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

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

cargo test -p calternal-dav

test result: ok. 41 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.05s
test result: ok. 33 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.32s
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

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

cargo test -p calternal-plugin-notes

test result: ok. 126 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 262.18s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.78s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.18s

cargo clippy -p calternal-plugin-calendar --all-targets -- -D warnings

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

node --test tests/adversarial/apple-capture.test.mjs tests/adversarial/proxy-early-response.test.mjs

# tests 5
# pass 5
# fail 0

bun run check (apps/web)

svelte-check found 0 errors and 0 warnings

bun run test (apps/web)

 Test Files  137 passed (137)
      Tests  887 passed (887)
   Duration  390.38s (transform 57%, environment 18%, import 14%, tests 6%, setup 4%)

Unfinished gates: Calendar cargo test was interrupted while compiling (no test result); Server clippy was interrupted while compiling (exit 255 after intentional termination); Server cargo test was not started. Full workspace gates were not run; this job used the per-crate gate rule.

Server build, copied verbatim:

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 19m 58s

Build cleanup, copied verbatim:

     Removed 16022 files, 8.0GiB total

Web build output, the throwaway Home and local credential files are removed. Worktree is clean. Screenshots and credential-free capture records remain ignored under artifacts/mac393; screenshots are attached to this issue. The matrix is docs/research/apple-caldav-matrix.md at the local head above.

Final report for #393. Branch `job/mac-393`, head `d2251b6b4569c96d467d1a9586ec9652a0a5a2f6`. No push, deploy or issue closure. The one required merge from origin/dev is dc3325b1cd1597183eb3f47d6495dffe95fb68e9. NO-GO for “calternaldav shipped”. This is a partial delivery, not an exhaustive acceptance result. The 102-row matrix contains 204 direction cells: 11 passed, 5 observed without full acceptance, and 188 Not run. Built: optional TLS and bounded, credential-free DAV captures in the existing local proxy; a real macOS 27 Reminders fixture; a priority projection fix that prevents stale Apple metadata from overriding the current Task priority; and Notes apple_replay coverage. Native Mac reads confirmed the fix (High -> PRIORITY:3 / native 3; None -> no PRIORITY / native 0). Native writes also confirmed Unicode titles, multiline notes, completion/uncompletion and a Calendar title edit. The matrix links the real screenshots and records request/response IDs and API results. No UI implementation changed. Files: crates/calternal-dav/src/reminders.rs; crates/calternal-dav/tests/fixtures/macos27/put-mac393-unicode-notes-priority.ics; crates/plugins/notes/tests/apple_replay.rs; tests/adversarial/apple-capture.mjs; tests/adversarial/apple-capture.test.mjs; tests/adversarial/editor-proxy.mjs; docs/research/apple-caldav-matrix.md; package.json; bun.lock. Five upstream UI/audit files came from the single required origin/dev merge; they are not this job's implementation. Known gaps: the remaining Reminders controls, most Calendar controls, C13 rejection UX, crossing-midnight cases, repeat exceptions, alerts, invitees, moves/rename/delete and all Webcal cases still need real two-direction evidence. High's fixed Mac receive is verified, but its second sync was not checked before the next edit. Reverse prose editing is not tested. The server's first restart exited with Tantivy LockBusy; the next start succeeded without touching Index files. Root cause remains in #505. No full adversarial round was completed. Calendar test and Server validation status will be recorded below; unfinished gates are not passes. Decisions: keep separate direction columns and preserve prior historical evidence; distinguish received data from a second-sync pass. Preserve an exact Apple priority number only while its decoded Task bucket still matches Markdown, then use the existing canonical values after a Task edit. Reuse the existing proxy with opt-in lab TLS/captures; exclude query URLs and non-DAV routes, allowlist headers, and bound retained body bytes at 2 MiB. C13 behavior stays as specified; no new Log data format was introduced. Cleanup: removed the Mac account/CA profiles, both keychain CA copies and user/System lab trust entries. Certificate verification now fails with CSSMERR_TP_NOT_TRUSTED. Remote lab files and the blank lab note are absent. Stopped the tunnel/proxy/server and released macvm.lock. Local credential files and CA/TLS private keys are removed. Build cleanup will be recorded after cargo clean. Gate output (summary lines copied verbatim): `cargo fmt --check` Exit 0, no output. `cargo clippy -p calternal-dav --all-targets -- -D warnings` ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 55.66s ``` `cargo test -p calternal-dav` ```text test result: ok. 41 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.05s test result: ok. 33 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.32s 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` ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 3m 47s ``` `cargo test -p calternal-plugin-notes` ```text test result: ok. 126 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 262.18s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.78s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.18s ``` `cargo clippy -p calternal-plugin-calendar --all-targets -- -D warnings` ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 11m 06s ``` `node --test tests/adversarial/apple-capture.test.mjs tests/adversarial/proxy-early-response.test.mjs` ```text # tests 5 # pass 5 # fail 0 ``` `bun run check (apps/web)` ```text svelte-check found 0 errors and 0 warnings ``` `bun run test (apps/web)` ```text Test Files 137 passed (137) Tests 887 passed (887) Duration 390.38s (transform 57%, environment 18%, import 14%, tests 6%, setup 4%) ``` Unfinished gates: Calendar cargo test was interrupted while compiling (no test result); Server clippy was interrupted while compiling (exit 255 after intentional termination); Server cargo test was not started. Full workspace gates were not run; this job used the per-crate gate rule. Server build, copied verbatim: ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 19m 58s ``` Build cleanup, copied verbatim: ```text Removed 16022 files, 8.0GiB total ``` Web build output, the throwaway Home and local credential files are removed. Worktree is clean. Screenshots and credential-free capture records remain ignored under artifacts/mac393; screenshots are attached to this issue. The matrix is docs/research/apple-caldav-matrix.md at the local head above.
Author
Owner

Resumed round 2 on job/mac-393 at d2251b6b4 (base from round 1). Read CLAUDE.md, CONTEXT.md, DESIGN sections 29–30 and 46–47, the full acceptance matrix, and the round-1 report. No new acceptance passes are claimed. Next: check Mac access under macvm.lock, reuse capture tools, and script native batches. No push or deployment.

Resumed round 2 on job/mac-393 at d2251b6b4 (base from round 1). Read CLAUDE.md, CONTEXT.md, DESIGN sections 29–30 and 46–47, the full acceptance matrix, and the round-1 report. No new acceptance passes are claimed. Next: check Mac access under macvm.lock, reuse capture tools, and script native batches. No push or deployment.
Author
Owner

Round-2 progress: committed ca2a04b85, a wire-only batch report (seven capture/report tests pass). Reprocessed 82 round-1 exchanges: five writes, no stored error statuses, five incomplete records. This is not new acceptance evidence. The notes-bridge job released macvm.lock; mac-393 now holds it. macOS 27 native Swift helper compiled with no diagnostics and discovered the current local Reminders list through EventKit. The previous DAV account is absent. Branch server and production web builds are in progress. Existing proxy test first failed listener readiness, then passed unchanged on retry (1 pass, 0 fail). No acceptance cell is marked passed from helper setup.

Round-2 progress: committed ca2a04b85, a wire-only batch report (seven capture/report tests pass). Reprocessed 82 round-1 exchanges: five writes, no stored error statuses, five incomplete records. This is not new acceptance evidence. The notes-bridge job released macvm.lock; mac-393 now holds it. macOS 27 native Swift helper compiled with no diagnostics and discovered the current local Reminders list through EventKit. The previous DAV account is absent. Branch server and production web builds are in progress. Existing proxy test first failed listener readiness, then passed unchanged on retry (1 pass, 0 fail). No acceptance cell is marked passed from helper setup.
Author
Owner

Head 358e02af8. Native helper integration check passed on macOS 27: 17 reminders, eight recurrence rules, date-only vs timed components, alarms, Unicode notes, URL, priorities, completion, clearing fields, rejection without partial save and removal. It uses a temporary local list and removes it in finally. These are helper tests, not CalDAV acceptance. Calendar EventKit access returned full access denied; Calendar AppleScript new-calendar returned AppleEvent handler failed (-10000). Investigating the native Calendar permission. The branch server build continues.

Head 358e02af8. Native helper integration check passed on macOS 27: 17 reminders, eight recurrence rules, date-only vs timed components, alarms, Unicode notes, URL, priorities, completion, clearing fields, rejection without partial save and removal. It uses a temporary local list and removes it in finally. These are helper tests, not CalDAV acceptance. Calendar EventKit access returned full access denied; Calendar AppleScript new-calendar returned AppleEvent handler failed (-10000). Investigating the native Calendar permission. The branch server build continues.
Author
Owner

Head 358e02af8. Native helper smoke passed on a local Reminders list and removed its test data. Calendar EventKit discovery returned full access denied through both SSH and a Terminal launch. AppleScript calendar creation returned AppleEvent handler failed (-10000). These are setup gaps, not server rejections. The notes-bridge worktree is waiting on macvm.lock; released the lock between batches. Server build continues. No new acceptance cells pass.

Head 358e02af8. Native helper smoke passed on a local Reminders list and removed its test data. Calendar EventKit discovery returned full access denied through both SSH and a Terminal launch. AppleScript calendar creation returned AppleEvent handler failed (-10000). These are setup gaps, not server rejections. The notes-bridge worktree is waiting on macvm.lock; released the lock between batches. Server build continues. No new acceptance cells pass.
Author
Owner

Head d4d13728b includes the one required merge of fetched origin/dev (558457cf3). No conflict. That merge changed web/docs files, not Rust source. After merge: cargo fmt --check exited 0 with no output; capture/proxy tests passed 8/8; web check says svelte-check found 0 errors and 0 warnings; web tests say Test Files 137 passed (137) and Tests 888 passed (888).

Branch server build finished: Finished dev profile [unoptimized + debuginfo] target(s) in 37m 54s (the exact backticked profile line is retained in the artifact). First lab start exited NotFound because the new data directory was absent; creating that directory fixed startup. Health now returns 200. Six real Task API fixtures and Home reads are ready for reverse sync. No Mac receipt is claimed. Native batch helpers are committed and tested; Rust per-crate gates are running. mac393 is queued on macvm.lock behind notes-bridge; no unlocked Mac session was used.

Head d4d13728b includes the one required merge of fetched origin/dev (558457cf3). No conflict. That merge changed web/docs files, not Rust source. After merge: cargo fmt --check exited 0 with no output; capture/proxy tests passed 8/8; web check says `svelte-check found 0 errors and 0 warnings`; web tests say `Test Files 137 passed (137)` and `Tests 888 passed (888)`. Branch server build finished: `Finished dev profile [unoptimized + debuginfo] target(s) in 37m 54s` (the exact backticked profile line is retained in the artifact). First lab start exited NotFound because the new data directory was absent; creating that directory fixed startup. Health now returns 200. Six real Task API fixtures and Home reads are ready for reverse sync. No Mac receipt is claimed. Native batch helpers are committed and tested; Rust per-crate gates are running. mac393 is queued on macvm.lock behind notes-bridge; no unlocked Mac session was used.
Author
Owner

Account preflight finding, head recorded in the branch log: macOS rejected the loopback non-TLS profile with DAAccountValidationDomain:100. Mac health through the SSH tunnel was 200, but the capture directory has zero DAV exchanges. No profile was installed. Screenshot: https://git.kayg.org/attachments/68e822e1-6083-4849-9738-36cba0a1eccb . Switching to the issue's quick-tunnel TLS method, using Cloudflared 2026.9.3 with official SHA256 and Apache-2.0 checked. This is a lab setup failure, not a protocol option failure. No new acceptance pass is claimed. DAV clippy and 74 tests passed. Notes gates are compiling.

Account preflight finding, head recorded in the branch log: macOS rejected the loopback non-TLS profile with DAAccountValidationDomain:100. Mac health through the SSH tunnel was 200, but the capture directory has zero DAV exchanges. No profile was installed. Screenshot: https://git.kayg.org/attachments/68e822e1-6083-4849-9738-36cba0a1eccb . Switching to the issue's quick-tunnel TLS method, using Cloudflared 2026.9.3 with official SHA256 and Apache-2.0 checked. This is a lab setup failure, not a protocol option failure. No new acceptance pass is claimed. DAV clippy and 74 tests passed. Notes gates are compiling.
Author
Owner

Round 2 reverse batch: source d4d13728b, six real Task API writes and Notes Home reads, Apple REPORT 207 1790768172544-00021, then second discovery and equal native readback of all six. Eight reverse cells now pass: one-line notes, multiline notes, date-only, Low, Medium, High, completion, undated. Screenshot: https://git.kayg.org/attachments/218d1780-4268-40d2-b236-f565c573756d . Native prefix mismatch was a helper error, fixed at 490e36ae3 with red/green native coverage. Active-account smoke list writes exposed two collection DELETE 404s; 29f1a03c5 refuses non-local sources before mutation. Mac lock released for the waiting job. Calendar and webcal remain untested in round 2; NO-GO still applies.

Round 2 reverse batch: source d4d13728b, six real Task API writes and Notes Home reads, Apple REPORT 207 1790768172544-00021, then second discovery and equal native readback of all six. Eight reverse cells now pass: one-line notes, multiline notes, date-only, Low, Medium, High, completion, undated. Screenshot: https://git.kayg.org/attachments/218d1780-4268-40d2-b236-f565c573756d . Native prefix mismatch was a helper error, fixed at 490e36ae3 with red/green native coverage. Active-account smoke list writes exposed two collection DELETE 404s; 29f1a03c5 refuses non-local sources before mutation. Mac lock released for the waiting job. Calendar and webcal remain untested in round 2; NO-GO still applies.
Author
Owner

Resource wait: released the Mac VM lock after the reverse Reminders batch because fuser showed a waiter. The next locked session has waited about 20 minutes. fuser now lists holder flock PID 28096, its bash PID 336271, and queued flock PID 340201; the holder bash currently has no child process. No unlocked SSH or GUI calls were made. The 18-item native batch is queued behind that lock. Local input-validation round returned health 200, principal 207, malformed PROPFIND/REPORT 400, invalid calendar PUT 422 (subsequent GET 404), unauthenticated principal 401; no 5xx or resource was created by invalid input. Three real Log API writes returned 201 and a Daily note GET 200; DAV projection has Berlin TZID, UTC and cross-midnight DTEND on 20260930. These are preparation, not native acceptance passes.

Resource wait: released the Mac VM lock after the reverse Reminders batch because fuser showed a waiter. The next locked session has waited about 20 minutes. fuser now lists holder flock PID 28096, its bash PID 336271, and queued flock PID 340201; the holder bash currently has no child process. No unlocked SSH or GUI calls were made. The 18-item native batch is queued behind that lock. Local input-validation round returned health 200, principal 207, malformed PROPFIND/REPORT 400, invalid calendar PUT 422 (subsequent GET 404), unauthenticated principal 401; no 5xx or resource was created by invalid input. Three real Log API writes returned 201 and a Daily note GET 200; DAV projection has Berlin TZID, UTC and cross-midnight DTEND on 20260930. These are preparation, not native acceptance passes.
Author
Owner

The Mac lock has remained held by another session for roughly 48 minutes after I released it for a waiter. Other jobs are now also queued. No unlocked Mac operations were made. The old temporary public TLS tunnel received SIGTERM at 12:08:00 UTC; its hostname now returns DNS ENOTFOUND. R5 second-sync requests occurred at 11:51–11:53 UTC, before that shutdown, so those passes remain valid. I cancelled the queued native apply before it could run, restarted the lab tunnel in a foreground TTY, and verified the new public TLS health is 200. Only a refresh of this job’s own account profile is queued now; the write batch is not queued. Matrix remains 19 passed, 3 partial, 182 untested. If the VM cannot be reacquired within the four-hour job limit, native work and account cleanup will be reported explicitly as pending; the throwaway server/tunnel and local secrets will still be stopped/removed.

The Mac lock has remained held by another session for roughly 48 minutes after I released it for a waiter. Other jobs are now also queued. No unlocked Mac operations were made. The old temporary public TLS tunnel received SIGTERM at 12:08:00 UTC; its hostname now returns DNS ENOTFOUND. R5 second-sync requests occurred at 11:51–11:53 UTC, before that shutdown, so those passes remain valid. I cancelled the queued native apply before it could run, restarted the lab tunnel in a foreground TTY, and verified the new public TLS health is 200. Only a refresh of this job’s own account profile is queued now; the write batch is not queued. Matrix remains 19 passed, 3 partial, 182 untested. If the VM cannot be reacquired within the four-hour job limit, native work and account cleanup will be reported explicitly as pending; the throwaway server/tunnel and local secrets will still be stopped/removed.
Author
Owner

Blocking finding from real Mac captures: PUTs returned 201 for FREQ=WEEKLY;INTERVAL=2, FREQ=WEEKLY;BYDAY=MO,TH, FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR and FREQ=MONTHLY;BYMONTHDAY=15. Native EventKit cache kept them after another launch, but direct DAV GET 200 returned only FREQ=WEEKLY / FREQ=MONTHLY. The Notes writer stored RRULE syntax where the Task NLP projector expects prose, so constraints were lost in the Index projection. Four exact real capture fixtures now drive Notes apple_replay: red test failed with missing constraints, then green passed after converting through the existing formatter and enforcing an exact RRULE round trip. Minimal public addition in calternal-dav exposes that conversion; no dependency or migration added. Final per-crate gates are running. Remaining blockers: no post-fix Mac round; existing raw-RRULE Task files still need repair/reindex strategy; required performance profile and measurements are unfinished. The new forward batch does not pass release cells from its native cache alone. NO-GO remains.

Blocking finding from real Mac captures: PUTs returned 201 for FREQ=WEEKLY;INTERVAL=2, FREQ=WEEKLY;BYDAY=MO,TH, FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR and FREQ=MONTHLY;BYMONTHDAY=15. Native EventKit cache kept them after another launch, but direct DAV GET 200 returned only FREQ=WEEKLY / FREQ=MONTHLY. The Notes writer stored RRULE syntax where the Task NLP projector expects prose, so constraints were lost in the Index projection. Four exact real capture fixtures now drive Notes apple_replay: red test failed with missing constraints, then green passed after converting through the existing formatter and enforcing an exact RRULE round trip. Minimal public addition in calternal-dav exposes that conversion; no dependency or migration added. Final per-crate gates are running. Remaining blockers: no post-fix Mac round; existing raw-RRULE Task files still need repair/reindex strategy; required performance profile and measurements are unfinished. The new forward batch does not pass release cells from its native cache alone. NO-GO remains.
Author
Owner

Round 2 final report for #393. Branch job/mac-393, head 10fcee426fe9a26290c3ce5d463d10528f0c56b2. The one required origin/dev merge is d4d13728b. No push, deploy or issue closure.

NO-GO. The 204 direction cells now contain 19 passed, 16 partial, 4 failed wire readbacks that need a post-fix Mac retest, and 165 untested. Eight reverse cells gained full second-sync evidence. The 17-item native forward batch found a real recurrence projection loss; native cache equality had hidden it.

Built: a native EventKit batch helper with exact calendar IDs, bounded input, date/time, alarm, recurrence, URL, priority and completion controls; a local smoke check and active-DAV refusal guard; a bounded wire-only capture report; safe root/well-known discovery captures; and a Notes writer fix for interval, weekdays and monthly-day constraints. Four exact real Mac captures drive a Notes apple_replay regression. It failed before the fix and passes now. The existing bare-daily Markdown assertion stays unchanged and passes.

Files owned in round 2: tests/apple/README.md, eventkit-batch.swift, eventkit-batch.plist, native-smoke.py; tests/adversarial/apple-capture-report.mjs and its test, apple-capture.mjs and its test; crates/calternal-dav/src/reminders.rs; crates/calternal-dav/tests/fixtures/macos27/put-mac393-round2-repeat-{selected-days,monthly,two-weeks,weekdays}.ics; crates/plugins/notes/src/tasks_dav.rs and tests/apple_replay.rs; docs/research/apple-caldav-matrix.md. The required upstream merge brought web/design changes; they are not this job's implementation. No UI implementation was added.

Evidence: six reverse Tasks retained their Home fields and all native fields through a second sync. Screenshot: https://git.kayg.org/attachments/218d1780-4268-40d2-b236-f565c573756d . The forward batch saved 17 native Tasks; the API and Home read 23 total. Mac PUTs returned 201. Direct GET 200 lost INTERVAL=2, BYDAY and BYMONTHDAY even though Markdown kept the full original RRULE. That caused the fix. Capture IDs, fixtures and limitations are in the matrix. No new forward cell is claimed from cached native fields alone.

Known gaps: the fixed writer has not had a fresh live Mac round; existing raw-RRULE Task files need a repair/reindex plan; the final Server cargo test was stopped during compilation (143) at the four-hour job limit. The required bench profile and average/worst-case measurements are not complete. There is no comparable DAV recurrence baseline in docs/perf/baseline.json, and no performance claim is made. Most Reminders controls, Calendar controls/permission setup, exceptions, invitees, area moves and webcal still need real two-direction evidence. One bounded local validation round passed, but the full adversarial matrix/storm was not run. Do not merge as shipped.

Decisions: use Apple's public EventKit API for batches and CUA for UI evidence. Native cache reads and protocol replay do not pass acceptance cells on their own. Convert constrained supported RRULEs through the existing Task formatter only when RRULE -> phrase -> RRULE is exact; retain rules outside that phrase grammar in per-resource metadata. Bare frequencies keep their established Markdown spelling. The small public calternal-dav helper exists for the Notes writer; no dependency or migration was added. C13 stays unchanged and no new Log format was introduced. A temporary public TLS tunnel replaced the failing loopback account setup; its hostname is lab state, not a production change.

Validation: one local input-validation round returned health 200, principal 207, malformed discovery/report XML 400, invalid calendar body 422 and subsequent target GET 404, missing credentials 401. No 5xx. The eight capture/report tests passed. The existing combined proxy run had one listener-start failure; the isolated retry passed without a code change. The native smoke passed before the account; with an active DAV account its new guard refused before any list write.

Final gate output (summary lines copied verbatim):

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

calternal-dav

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 54.26s
test result: ok. 41 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.34s
test result: ok. 33 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

calternal-plugin-notes

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 54s
test result: ok. 126 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 143.78s
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.58s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

calternal-plugin-calendar (unchanged Rust; initial round-2 gates)

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 9m 41s
test result: ok. 51 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 8.76s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.44s
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

calternal-server (Clippy after recurrence fix; cargo test unfinished)

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

Before the late recurrence fix, the initial Server test passed; this is not a completed post-fix Server gate:

test result: ok. 85 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 40.69s

Web gates after the required merge:

svelte-check found 0 errors and 0 warnings
 Test Files  137 passed (137)
      Tests  888 passed (888)
   Duration  200.40s (transform 54%, environment 19%, import 15%, tests 8%, setup 3%)

Cleanup: own Mac account profile and ~/mac393-round2 removed; other profiles retained. Mac lock released. Own local server, proxy, tunnel and IPv6 bridge stopped. Throwaway Home, local credentials/profiles and web build output removed. Screenshots and credential-free wire records stay ignored in artifacts/. Cargo cleanup output will be appended below.

     Removed 18433 files, 10.6GiB total

Worktree is clean.

Round 2 final report for #393. Branch job/mac-393, head `10fcee426fe9a26290c3ce5d463d10528f0c56b2`. The one required origin/dev merge is d4d13728b. No push, deploy or issue closure. NO-GO. The 204 direction cells now contain 19 passed, 16 partial, 4 failed wire readbacks that need a post-fix Mac retest, and 165 untested. Eight reverse cells gained full second-sync evidence. The 17-item native forward batch found a real recurrence projection loss; native cache equality had hidden it. Built: a native EventKit batch helper with exact calendar IDs, bounded input, date/time, alarm, recurrence, URL, priority and completion controls; a local smoke check and active-DAV refusal guard; a bounded wire-only capture report; safe root/well-known discovery captures; and a Notes writer fix for interval, weekdays and monthly-day constraints. Four exact real Mac captures drive a Notes apple_replay regression. It failed before the fix and passes now. The existing bare-daily Markdown assertion stays unchanged and passes. Files owned in round 2: tests/apple/README.md, eventkit-batch.swift, eventkit-batch.plist, native-smoke.py; tests/adversarial/apple-capture-report.mjs and its test, apple-capture.mjs and its test; crates/calternal-dav/src/reminders.rs; crates/calternal-dav/tests/fixtures/macos27/put-mac393-round2-repeat-{selected-days,monthly,two-weeks,weekdays}.ics; crates/plugins/notes/src/tasks_dav.rs and tests/apple_replay.rs; docs/research/apple-caldav-matrix.md. The required upstream merge brought web/design changes; they are not this job's implementation. No UI implementation was added. Evidence: six reverse Tasks retained their Home fields and all native fields through a second sync. Screenshot: https://git.kayg.org/attachments/218d1780-4268-40d2-b236-f565c573756d . The forward batch saved 17 native Tasks; the API and Home read 23 total. Mac PUTs returned 201. Direct GET 200 lost INTERVAL=2, BYDAY and BYMONTHDAY even though Markdown kept the full original RRULE. That caused the fix. Capture IDs, fixtures and limitations are in the matrix. No new forward cell is claimed from cached native fields alone. Known gaps: the fixed writer has not had a fresh live Mac round; existing raw-RRULE Task files need a repair/reindex plan; the final Server cargo test was stopped during compilation (143) at the four-hour job limit. The required bench profile and average/worst-case measurements are not complete. There is no comparable DAV recurrence baseline in docs/perf/baseline.json, and no performance claim is made. Most Reminders controls, Calendar controls/permission setup, exceptions, invitees, area moves and webcal still need real two-direction evidence. One bounded local validation round passed, but the full adversarial matrix/storm was not run. Do not merge as shipped. Decisions: use Apple's public EventKit API for batches and CUA for UI evidence. Native cache reads and protocol replay do not pass acceptance cells on their own. Convert constrained supported RRULEs through the existing Task formatter only when RRULE -> phrase -> RRULE is exact; retain rules outside that phrase grammar in per-resource metadata. Bare frequencies keep their established Markdown spelling. The small public calternal-dav helper exists for the Notes writer; no dependency or migration was added. C13 stays unchanged and no new Log format was introduced. A temporary public TLS tunnel replaced the failing loopback account setup; its hostname is lab state, not a production change. Validation: one local input-validation round returned health 200, principal 207, malformed discovery/report XML 400, invalid calendar body 422 and subsequent target GET 404, missing credentials 401. No 5xx. The eight capture/report tests passed. The existing combined proxy run had one listener-start failure; the isolated retry passed without a code change. The native smoke passed before the account; with an active DAV account its new guard refused before any list write. Final gate output (summary lines copied verbatim): `cargo fmt --check`: exit 0, no output. calternal-dav ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 54.26s test result: ok. 41 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.34s test result: ok. 33 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 ``` calternal-plugin-notes ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 54s test result: ok. 126 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 143.78s test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.58s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` calternal-plugin-calendar (unchanged Rust; initial round-2 gates) ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 9m 41s test result: ok. 51 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 8.76s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.44s test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` calternal-server (Clippy after recurrence fix; cargo test unfinished) ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 3m 47s ``` Before the late recurrence fix, the initial Server test passed; this is not a completed post-fix Server gate: ```text test result: ok. 85 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 40.69s ``` Web gates after the required merge: ```text svelte-check found 0 errors and 0 warnings Test Files 137 passed (137) Tests 888 passed (888) Duration 200.40s (transform 54%, environment 19%, import 15%, tests 8%, setup 3%) ``` Cleanup: own Mac account profile and ~/mac393-round2 removed; other profiles retained. Mac lock released. Own local server, proxy, tunnel and IPv6 bridge stopped. Throwaway Home, local credentials/profiles and web build output removed. Screenshots and credential-free wire records stay ignored in artifacts/. Cargo cleanup output will be appended below. ```text Removed 18433 files, 10.6GiB total ``` Worktree is clean.
Author
Owner

Resumed round 3 on job/mac-393 at 10fcee426f. Read the repository contract, glossary, DESIGN, #393 and round-2 report. Initial matrix: 19 passed, 16 partial, 4 awaiting post-fix retest, 165 untested (204 direction cells). First: recreate the cleaned lab and retest the four constraints with direct DAV readback. Then native batches and reverse API writes. No push or deployment.

Resumed round 3 on job/mac-393 at 10fcee426fe9a26290c3ce5d463d10528f0c56b2. Read the repository contract, glossary, DESIGN, #393 and round-2 report. Initial matrix: 19 passed, 16 partial, 4 awaiting post-fix retest, 165 untested (204 direction cells). First: recreate the cleaned lab and retest the four constraints with direct DAV readback. Then native batches and reverse API writes. No push or deployment.
Author
Owner

Round-3 setup: the cleaned lab server and production SPA are rebuilding with four cargo workers. Native batch setup is queued under macvm.lock, currently held in the notes-bridge worktree (holder flock PID 976532, shell 976567). No unlocked Mac calls. The helper omitted plain weekly recurrence; added the explicit case and one native smoke case. The 100/10,000-Task recurrence GET/full-sync/burst benchmark profile is ready; no new matrix passes yet.

Round-3 setup: the cleaned lab server and production SPA are rebuilding with four cargo workers. Native batch setup is queued under macvm.lock, currently held in the notes-bridge worktree (holder flock PID 976532, shell 976567). No unlocked Mac calls. The helper omitted plain weekly recurrence; added the explicit case and one native smoke case. The 100/10,000-Task recurrence GET/full-sync/burst benchmark profile is ready; no new matrix passes yet.
Author
Owner

Native smoke passed on macOS 27: 18 reminders and nine recurrence cases, including plain weekly. Helper fix af0daae3d; direct-DAV verifier ccd6899e5 reports precisely the four round-2 RRULE losses from the saved real captures (four of eight repeat GETs differ). Calendar permission cause is now visible in System Settings: NetBird had Add Only Access. Changing it through the normal native Options sheet to Full Calendar access; no permission database edits. Live recurrence retest still waits for the branch server build.

Native smoke passed on macOS 27: 18 reminders and nine recurrence cases, including plain weekly. Helper fix af0daae3d; direct-DAV verifier ccd6899e5 reports precisely the four round-2 RRULE losses from the saved real captures (four of eight repeat GETs differ). Calendar permission cause is now visible in System Settings: NetBird had Add Only Access. Changing it through the normal native Options sheet to Full Calendar access; no permission database edits. Live recurrence retest still waits for the branch server build.
Author
Owner

Round-3 finding, head ccd6899e5 before the benchmark commit: Calendar native read was denied because System Settings → Privacy & Security → Calendars → NetBird → Options had Add Only Access selected. Normal UI selection of Full Calendar access changed the radio state from 0 to 1 and subsequent EventKit discovery returned four calendars, including two writable local calendars. No permission database edits. Local Reminders smoke passed 18 cases / nine repeats and removed its list. Native direct-DAV comparator matches the round-2 finding: four of eight captured repeat rules lose constraints on the saved pre-fix receiving GETs. This is setup/tool validation; no new acceptance cell passes yet. The server rebuild continues.

Round-3 finding, head ccd6899e5 before the benchmark commit: Calendar native read was denied because System Settings → Privacy & Security → Calendars → NetBird → Options had Add Only Access selected. Normal UI selection of Full Calendar access changed the radio state from 0 to 1 and subsequent EventKit discovery returned four calendars, including two writable local calendars. No permission database edits. Local Reminders smoke passed 18 cases / nine repeats and removed its list. Native direct-DAV comparator matches the round-2 finding: four of eight captured repeat rules lose constraints on the saved pre-fix receiving GETs. This is setup/tool validation; no new acceptance cell passes yet. The server rebuild continues.
Author
Owner

The one required fetch and merge completed without conflicts. Fetched origin/dev was cd3cea7575; merge head is 56eb9ec003. Per-crate gates are running for DAV, Notes, Calendar and Server with four workers; web checks and tests are also running after the upstream web changes. No second fetch/merge will be run. This fetched snapshot has no #471 or #500/re-parent/multiget commits in its log, and the merge diff changes no DAV or Notes writer files. Those later merge-round-3 changes are not claimed verified here. Mac profile setup remains queued behind the notes-bridge lock holder. The separate local performance Home is seeding the 10,000-Task profile; its initial generic Bearer create returned 428, corrected by If-None-Match: * in the benchmark client.

The one required fetch and merge completed without conflicts. Fetched origin/dev was cd3cea757508d9f581d00fb7d5d7973fbc0a75fd; merge head is 56eb9ec003da27466cc7812ff60f8a35fdc2fa5d. Per-crate gates are running for DAV, Notes, Calendar and Server with four workers; web checks and tests are also running after the upstream web changes. No second fetch/merge will be run. This fetched snapshot has no #471 or #500/re-parent/multiget commits in its log, and the merge diff changes no DAV or Notes writer files. Those later merge-round-3 changes are not claimed verified here. Mac profile setup remains queued behind the notes-bridge lock holder. The separate local performance Home is seeding the 10,000-Task profile; its initial generic Bearer create returned 428, corrected by If-None-Match: * in the benchmark client.
Author
Owner

Round 3 finding: the first tunnel died before profile validation, with zero DAV exchanges. A replacement foreground tunnel and a full Principal URL installed the lab account. Native discovery now finds one non-local writable Reminders list. The four recurrence retest writes start next; no acceptance cell has been promoted from this setup evidence.

Merged origin/dev once at 56eb9ec003. DAV and Notes clippy/test passed. The bounded local DAV validation round returned 200/207/400/400/422/401 and confirmed rejected invalid resources are absent.

Filed #531: duplicate parsed checkbox anchors produce Notes API 500 after Home persistence. This came from local benchmark setup, not Apple wire. The benchmark uses valid unique alphanumeric anchors now; the 100-Task average GET p50/p95 is 15.43/37.69 ms, full sync 116.95/237.18 ms on this loaded local debug host. The 10,000-Task phase is in progress. No matching DAV baseline exists in docs/perf/baseline.json.

Round 3 finding: the first tunnel died before profile validation, with zero DAV exchanges. A replacement foreground tunnel and a full Principal URL installed the lab account. Native discovery now finds one non-local writable Reminders list. The four recurrence retest writes start next; no acceptance cell has been promoted from this setup evidence. Merged origin/dev once at 56eb9ec003da27466cc7812ff60f8a35fdc2fa5d. DAV and Notes clippy/test passed. The bounded local DAV validation round returned 200/207/400/400/422/401 and confirmed rejected invalid resources are absent. Filed #531: duplicate parsed checkbox anchors produce Notes API 500 after Home persistence. This came from local benchmark setup, not Apple wire. The benchmark uses valid unique alphanumeric anchors now; the 100-Task average GET p50/p95 is 15.43/37.69 ms, full sync 116.95/237.18 ms on this loaded local debug host. The 10,000-Task phase is in progress. No matching DAV baseline exists in docs/perf/baseline.json.
Author
Owner

Live post-fix recurrence retest completed: four exact receiving GET rules match latest real Mac PUTs, Home stores recurrence prose, and both native reads retain the constraints. Second-sync screenshot: https://git.kayg.org/attachments/311fe0d0-bcc5-4403-a22b-0d5e3e785b83 . R7 now records four passes, so the checkpoint is 23 passed / 16 partial / 0 recurrence retests pending / 165 untested. The reverse directions remain separate.

The 17-option Reminders forward batch reached the real server (17 new PUT 201). Twenty Calendar options produced seven PUT 201 and thirteen C13 rejections (403/422); no server 5xx. Native Calendar free normalized to TRANSP:OPAQUE on the actual request, so it is not proof of free availability support. Direct GETs keep the three Calendar VALARM variants and the UTC cross-midnight end date.

Performance completed and committed at e92ef6a1c. Exactly 10,000 distinct receiving Task UIDs were checked. Local loaded debug host: average GET p50/p95 15.43/37.69 ms; average full sync 116.95/237.18 ms; 10,000-Task full sync 4576.29/10981.30 ms; 32-request burst, concurrency 8, 10706.44/13368.84 ms; peak RSS 912068608 bytes. Baseline has no matching DAV profile. The free perf VM shared binary predates the fix, so no compile was done there; these are explicitly local measurements.

A Mac lock waiter is present. Releasing the lock at this batch boundary. Remaining native screen evidence and directions will resume after reacquisition. Calendar test passed; Server gates are running. The original gate parent received SIGTERM after Calendar clippy's Finished line; remaining gates now run in a foreground TTY.

Live post-fix recurrence retest completed: four exact receiving GET rules match latest real Mac PUTs, Home stores recurrence prose, and both native reads retain the constraints. Second-sync screenshot: https://git.kayg.org/attachments/311fe0d0-bcc5-4403-a22b-0d5e3e785b83 . R7 now records four passes, so the checkpoint is 23 passed / 16 partial / 0 recurrence retests pending / 165 untested. The reverse directions remain separate. The 17-option Reminders forward batch reached the real server (17 new PUT 201). Twenty Calendar options produced seven PUT 201 and thirteen C13 rejections (403/422); no server 5xx. Native Calendar free normalized to TRANSP:OPAQUE on the actual request, so it is not proof of free availability support. Direct GETs keep the three Calendar VALARM variants and the UTC cross-midnight end date. Performance completed and committed at e92ef6a1c. Exactly 10,000 distinct receiving Task UIDs were checked. Local loaded debug host: average GET p50/p95 15.43/37.69 ms; average full sync 116.95/237.18 ms; 10,000-Task full sync 4576.29/10981.30 ms; 32-request burst, concurrency 8, 10706.44/13368.84 ms; peak RSS 912068608 bytes. Baseline has no matching DAV profile. The free perf VM shared binary predates the fix, so no compile was done there; these are explicitly local measurements. A Mac lock waiter is present. Releasing the lock at this batch boundary. Remaining native screen evidence and directions will resume after reacquisition. Calendar test passed; Server gates are running. The original gate parent received SIGTERM after Calendar clippy's Finished line; remaining gates now run in a foreground TTY.
Author
Owner

Head d451fd949. Gate completion: fmt and per-crate clippy/test passed for calternal-dav, calternal-plugin-notes, calternal-plugin-calendar and calternal-server. Calendar clippy's explicit final exit is 0 after the earlier parent SIGTERM left its status unrecorded. Notes was rechecked after adding the Calendar captures; all four apple_replay tests pass. Web check reports svelte-check found 0 errors and 0 warnings; web tests report Test Files 137 passed (137) and Tests 899 passed (899).

Matrix counts checked from the actual direction columns: 23 passed, 38 partial, 143 not run, 204 total. C8's twenty receiving GETs and the Daily note confirm seven accepted Events and thirteen absent rejected Events. The twenty exact Calendar captures and Notes provider replay are committed at e191ff624. No existing test expectation changed.

Receiving evidence archive (explicit allowlist; no credentials): https://git.kayg.org/attachments/e0fa5496-0a27-4528-a30b-c2bb594eff9f . The full gate logs will be attached separately. The Mac reacquisition attempt timed out after twenty minutes; the second attempt is queued behind the same holder. A fifteen-option location/action batch and the 100-Reminder volume case are prepared, not applied. No acceptance claim is made for prepared inputs.

Head d451fd949. Gate completion: fmt and per-crate clippy/test passed for calternal-dav, calternal-plugin-notes, calternal-plugin-calendar and calternal-server. Calendar clippy's explicit final exit is 0 after the earlier parent SIGTERM left its status unrecorded. Notes was rechecked after adding the Calendar captures; all four apple_replay tests pass. Web check reports `svelte-check found 0 errors and 0 warnings`; web tests report `Test Files 137 passed (137)` and `Tests 899 passed (899)`. Matrix counts checked from the actual direction columns: 23 passed, 38 partial, 143 not run, 204 total. C8's twenty receiving GETs and the Daily note confirm seven accepted Events and thirteen absent rejected Events. The twenty exact Calendar captures and Notes provider replay are committed at e191ff624. No existing test expectation changed. Receiving evidence archive (explicit allowlist; no credentials): https://git.kayg.org/attachments/e0fa5496-0a27-4528-a30b-c2bb594eff9f . The full gate logs will be attached separately. The Mac reacquisition attempt timed out after twenty minutes; the second attempt is queued behind the same holder. A fifteen-option location/action batch and the 100-Reminder volume case are prepared, not applied. No acceptance claim is made for prepared inputs.
Author
Owner

Mac resource finding: I released macvm.lock at the batch boundary at about 16:02 UTC. The same holder is still present at 17:03 UTC; two twenty-minute reacquisition attempts timed out. A bounded queued attempt remains active. No unlocked GUI or SSH action was used. The prepared location/action and 100-Reminder batches are still not applied. Remaining native screens, Calendar C13 error UI and Mac cleanup depend on this lock. Local gates and receiving checks are complete; matrix remains 23 passed / 38 partial / 143 untested, NO-GO.

Head b2c125049 adds a comparison guard against duplicate VTODO RRULEs, so equal malformed rules cannot become false acceptance. Five comparator tests pass and the nine current real recurring receiving GETs still compare equal. Production receiving screenshots cover 390/820/1440, light/dark, with zero page errors: https://git.kayg.org/attachments/7a097948-632a-4999-9093-b7f6e4e1db3f . These do not substitute for native screens.

Mac resource finding: I released macvm.lock at the batch boundary at about 16:02 UTC. The same holder is still present at 17:03 UTC; two twenty-minute reacquisition attempts timed out. A bounded queued attempt remains active. No unlocked GUI or SSH action was used. The prepared location/action and 100-Reminder batches are still not applied. Remaining native screens, Calendar C13 error UI and Mac cleanup depend on this lock. Local gates and receiving checks are complete; matrix remains 23 passed / 38 partial / 143 untested, NO-GO. Head b2c125049 adds a comparison guard against duplicate VTODO RRULEs, so equal malformed rules cannot become false acceptance. Five comparator tests pass and the nine current real recurring receiving GETs still compare equal. Production receiving screenshots cover 390/820/1440, light/dark, with zero page errors: https://git.kayg.org/attachments/7a097948-632a-4999-9093-b7f6e4e1db3f . These do not substitute for native screens.
Author
Owner

Round-3 final report for #393. Branch job/mac-393, head 5f25c2bde60c469f3db8f8277277734ba1d6419e. Required merge: 56eb9ec003da27466cc7812ff60f8a35fdc2fa5d. No push, deploy or issue closure.

Built: exact receiving RRULE comparison by VTODO UID, including rejection of duplicate rules and exclusion of alarm UIDs; native weekly and arrive/leave/radius batch support; a bounded 100/10,000-Task benchmark with resume validation; twenty real Calendar fixtures and a Notes provider replay. Four fresh post-fix recurrence cells passed live Mac retest.

Files: tests/apple/README.md, eventkit-batch.swift, native-smoke.py, repeat-readback.mjs, repeat-readback.test.mjs; bench/apple-reminders.mjs; crates/plugins/notes/tests/apple_replay.rs; twenty crates/calternal-dav/tests/fixtures/macos27/put-mac393-round3-event-*.ics; docs/research/apple-caldav-matrix.md; docs/perf/mac393-round3-local.json. Upstream theme/web changes came from the required merge.

Matrix checkpoint: NO-GO — 23 passed, 38 partial, 143 untested, 204 total. Four recurrence retests are complete. Native second-sync evidence for the other batches is pending. Two 20-minute and one 60-minute Mac-lock attempts timed out after releasing the lock for another job. The prepared action/volume batch never ran. Work stopped at the four-hour limit. Twenty server-generated Task deep links returned 200 through the stable-ID API.

Evidence: four post-fix Tasks, wire/Home/native reads, production web views at 390/820/1440, light/dark, full gate logs. The web views reported zero page errors. They do not replace Apple native evidence.

Performance: explicitly local, matching merged debug binary. The free perf VM shared release binary predates the fix; no compile was done there. Baseline in docs/perf/baseline.json has no matching DAV profile. Exactly 10,000 distinct receiving UIDs were verified.

Phase p50 / p95 ms Mean / peak CPU % Mean / peak RSS bytes
average_get 15.43 / 37.69 38.11 / 52.20 263492754 / 263667712
average_full_sync 116.95 / 237.18 39.04 / 86.14 265210266 / 266297344
worst_full_sync 4576.29 / 10981.30 59.91 / 179.54 709311621 / 765222912
worst_burst 10706.44 / 13368.84 142.47 / 287.20 856486490 / 912068608

Load before: 24.73 / 25.66 / 30.44. Load after: 36.73 / 29.28 / 27.41. Worst burst: 32 requests, concurrency 8. One 120-second setup request timed out after persistence; resume checked 3,100 contiguous Tasks and retained the original average samples.

Validation: one bounded local DAV input round returned health 200, principal 207, malformed discovery/report XML 400/400, invalid calendar 422 with GET 404, missing credentials 401. No 5xx occurred in that round. Benchmark setup found Notes duplicate parsed anchors returning 500 after Home persistence; filed #531.

Gate output, verbatim (fmt exited 0 with no output; every per-crate clippy/test exit is 0):

clippy-calternal-dav.log

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

test-calternal-dav.log

    Finished `test` profile [unoptimized + debuginfo] target(s) in 2m 34s
test result: ok. 41 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.39s
test result: ok. 33 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

clippy-calternal-plugin-notes-final.log

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

test-calternal-plugin-notes-final.log

    Finished `test` profile [unoptimized + debuginfo] target(s) in 1.60s
test result: ok. 126 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 133.42s
test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.98s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

clippy-calternal-plugin-calendar-final.log

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

test-calternal-plugin-calendar.log

    Finished `test` profile [unoptimized + debuginfo] target(s) in 11m 17s
test result: ok. 52 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 36.13s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.12s
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.24s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

clippy-calternal-server.log

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 7m 28s

test-calternal-server.log

    Finished `test` profile [unoptimized + debuginfo] target(s) in 9m 30s
test result: ok. 85 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 39.75s

web-check.log

svelte-check found 0 errors and 0 warnings

web-test.log

 Test Files  137 passed (137)
      Tests  899 passed (899)

repeat-tests-final.log

# tests 5
# pass 5
# fail 0

native-location-smoke.log

PASS native helper: 20 reminders, nine repeats, dates, alarms, arrive/leave pins and radius, edits, whole-input rejection and removal, case-insensitive marker; not DAV acceptance

Known gaps: missing native UI controls and remaining directions, C13 error screens, Calendar occurrence operations/invitees/travel/moves, Reminders list moves/iCloud/subtasks/sections/messaging/attachments/smart-list/bulk/restore/time-zone/100-item cases, and webcal. Prepared location/action and 100-Reminder batches are not applied. Existing raw-RRULE Home files still need a repair/reindex strategy. The fetched origin/dev snapshot had no additional DAV/Notes writer changes for #471/#500, so this report does not claim to validate those absent changes. #531 is filed and unfixed.

Decisions: compare receiving bytes independently of native caches; keep separate direction columns and historical evidence; retain C13 rejection instead of inventing a Log format; treat native unavailable/OPAQUE availability as a gap; retain exact pin coordinates and radius without requesting device location; use source Notes to seed the large indexed corpus through the real API; label unmatched local performance measurements without a regression verdict.

Cleanup: local tunnel, proxy and lab server stopped; private lab databases and credentials removed; web build output deleted. App Password DELETE returned 403, so no successful revoke is claimed; destruction of the disposable lab database invalidated that credential. cargo clean exited 0:

     Removed 18455 files, 11.0GiB total

The final 15-minute cleanup lock wait also timed out (exit 1). Mac profile org.calternal.lab.mac393round3 and helper directory ~/mac393-round3 remain pending removal by the next lock holder. No unlocked Mac operation was used. Full Calendar access for the helper remains enabled. The lab endpoint is stopped.

Round-3 final report for #393. Branch job/mac-393, head `5f25c2bde60c469f3db8f8277277734ba1d6419e`. Required merge: `56eb9ec003da27466cc7812ff60f8a35fdc2fa5d`. No push, deploy or issue closure. Built: exact receiving RRULE comparison by VTODO UID, including rejection of duplicate rules and exclusion of alarm UIDs; native weekly and arrive/leave/radius batch support; a bounded 100/10,000-Task benchmark with resume validation; twenty real Calendar fixtures and a Notes provider replay. Four fresh post-fix recurrence cells passed live Mac retest. Files: tests/apple/README.md, eventkit-batch.swift, native-smoke.py, repeat-readback.mjs, repeat-readback.test.mjs; bench/apple-reminders.mjs; crates/plugins/notes/tests/apple_replay.rs; twenty crates/calternal-dav/tests/fixtures/macos27/put-mac393-round3-event-*.ics; docs/research/apple-caldav-matrix.md; docs/perf/mac393-round3-local.json. Upstream theme/web changes came from the required merge. Matrix checkpoint: **NO-GO — 23 passed, 38 partial, 143 untested, 204 total**. Four recurrence retests are complete. Native second-sync evidence for the other batches is pending. Two 20-minute and one 60-minute Mac-lock attempts timed out after releasing the lock for another job. The prepared action/volume batch never ran. Work stopped at the four-hour limit. Twenty server-generated Task deep links returned 200 through the stable-ID API. Evidence: [four post-fix Tasks](https://git.kayg.org/attachments/311fe0d0-bcc5-4403-a22b-0d5e3e785b83), [wire/Home/native reads](https://git.kayg.org/attachments/e0fa5496-0a27-4528-a30b-c2bb594eff9f), [production web views at 390/820/1440, light/dark](https://git.kayg.org/attachments/7a097948-632a-4999-9093-b7f6e4e1db3f), [full gate logs](https://git.kayg.org/attachments/81aea84d-d921-48ae-bcac-d9eca2098454). The web views reported zero page errors. They do not replace Apple native evidence. Performance: explicitly local, matching merged debug binary. The free perf VM shared release binary predates the fix; no compile was done there. Baseline in docs/perf/baseline.json has no matching DAV profile. Exactly 10,000 distinct receiving UIDs were verified. | Phase | p50 / p95 ms | Mean / peak CPU % | Mean / peak RSS bytes | | --- | --- | --- | --- | | average_get | 15.43 / 37.69 | 38.11 / 52.20 | 263492754 / 263667712 | | average_full_sync | 116.95 / 237.18 | 39.04 / 86.14 | 265210266 / 266297344 | | worst_full_sync | 4576.29 / 10981.30 | 59.91 / 179.54 | 709311621 / 765222912 | | worst_burst | 10706.44 / 13368.84 | 142.47 / 287.20 | 856486490 / 912068608 | Load before: 24.73 / 25.66 / 30.44. Load after: 36.73 / 29.28 / 27.41. Worst burst: 32 requests, concurrency 8. One 120-second setup request timed out after persistence; resume checked 3,100 contiguous Tasks and retained the original average samples. Validation: one bounded local DAV input round returned health 200, principal 207, malformed discovery/report XML 400/400, invalid calendar 422 with GET 404, missing credentials 401. No 5xx occurred in that round. Benchmark setup found Notes duplicate parsed anchors returning 500 after Home persistence; filed [#531](https://git.kayg.org/kayg/calternal/issues/531). Gate output, verbatim (fmt exited 0 with no output; every per-crate clippy/test exit is 0): clippy-calternal-dav.log ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 3m 50s ``` test-calternal-dav.log ```text Finished `test` profile [unoptimized + debuginfo] target(s) in 2m 34s test result: ok. 41 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.39s test result: ok. 33 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` clippy-calternal-plugin-notes-final.log ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 22.34s ``` test-calternal-plugin-notes-final.log ```text Finished `test` profile [unoptimized + debuginfo] target(s) in 1.60s test result: ok. 126 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 133.42s test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.98s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` clippy-calternal-plugin-calendar-final.log ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 19.14s ``` test-calternal-plugin-calendar.log ```text Finished `test` profile [unoptimized + debuginfo] target(s) in 11m 17s test result: ok. 52 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 36.13s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.12s test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.24s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` clippy-calternal-server.log ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 7m 28s ``` test-calternal-server.log ```text Finished `test` profile [unoptimized + debuginfo] target(s) in 9m 30s test result: ok. 85 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 39.75s ``` web-check.log ```text svelte-check found 0 errors and 0 warnings ``` web-test.log ```text Test Files 137 passed (137) Tests 899 passed (899) ``` repeat-tests-final.log ```text # tests 5 # pass 5 # fail 0 ``` native-location-smoke.log ```text PASS native helper: 20 reminders, nine repeats, dates, alarms, arrive/leave pins and radius, edits, whole-input rejection and removal, case-insensitive marker; not DAV acceptance ``` Known gaps: missing native UI controls and remaining directions, C13 error screens, Calendar occurrence operations/invitees/travel/moves, Reminders list moves/iCloud/subtasks/sections/messaging/attachments/smart-list/bulk/restore/time-zone/100-item cases, and webcal. Prepared location/action and 100-Reminder batches are not applied. Existing raw-RRULE Home files still need a repair/reindex strategy. The fetched origin/dev snapshot had no additional DAV/Notes writer changes for #471/#500, so this report does not claim to validate those absent changes. #531 is filed and unfixed. Decisions: compare receiving bytes independently of native caches; keep separate direction columns and historical evidence; retain C13 rejection instead of inventing a Log format; treat native unavailable/OPAQUE availability as a gap; retain exact pin coordinates and radius without requesting device location; use source Notes to seed the large indexed corpus through the real API; label unmatched local performance measurements without a regression verdict. Cleanup: local tunnel, proxy and lab server stopped; private lab databases and credentials removed; web build output deleted. App Password DELETE returned 403, so no successful revoke is claimed; destruction of the disposable lab database invalidated that credential. `cargo clean` exited 0: ```text Removed 18455 files, 11.0GiB total ``` The final 15-minute cleanup lock wait also timed out (exit 1). Mac profile `org.calternal.lab.mac393round3` and helper directory `~/mac393-round3` remain pending removal by the next lock holder. No unlocked Mac operation was used. Full Calendar access for the helper remains enabled. The lab endpoint is stopped.
Author
Owner

Round 4 started on branch job/mac-393.

Base SHA: cd3cea757508d9f581d00fb7d5d7973fbc0a75fd (merge base with origin/dev). Starting HEAD: 5f25c2bde60c469f3db8f8277277734ba1d6419e.

I will finish the partial cases first, then sweep Reminders, Calendar, Calendar reminders, and webcal in the requested order. I will use flock -w 3600 for Mac sessions and report the updated evidence matrix and gates here. No push or deploy.

Round 4 started on branch `job/mac-393`. Base SHA: `cd3cea757508d9f581d00fb7d5d7973fbc0a75fd` (merge base with `origin/dev`). Starting HEAD: `5f25c2bde60c469f3db8f8277277734ba1d6419e`. I will finish the partial cases first, then sweep Reminders, Calendar, Calendar reminders, and webcal in the requested order. I will use `flock -w 3600` for Mac sessions and report the updated evidence matrix and gates here. No push or deploy.
Author
Owner

Round-4 setup finding: the single required fetch brought origin/dev at cc25c441b7a974185622a1dee853cf38686d2b67; merge commit is 0957cd349. The only conflict was tests/adversarial/editor-proxy.mjs; the resolution keeps #393's TLS/capture support and origin/dev's bounded 100-continue forwarding. Its six focused Node tests pass. git diff --check --cached also reported CRLF iCalendar fixture lines from upstream; I kept those bytes unchanged.

The locked Mac preflight succeeded. The old profile org.calternal.lab.mac393round3 is absent; ~/mac393-round3 remains for final teardown. The merge contains Calendar feed publication and subscription routes, so Webcal can be tested on this branch. The merged server build is running locally. Cloudflared 2026.9.3 was verified against Cloudflare's published SHA256 before use.

Round-4 setup finding: the single required fetch brought `origin/dev` at `cc25c441b7a974185622a1dee853cf38686d2b67`; merge commit is `0957cd349`. The only conflict was `tests/adversarial/editor-proxy.mjs`; the resolution keeps #393's TLS/capture support and origin/dev's bounded 100-continue forwarding. Its six focused Node tests pass. `git diff --check --cached` also reported CRLF iCalendar fixture lines from upstream; I kept those bytes unchanged. The locked Mac preflight succeeded. The old profile `org.calternal.lab.mac393round3` is absent; `~/mac393-round3` remains for final teardown. The merge contains Calendar feed publication and subscription routes, so Webcal can be tested on this branch. The merged server build is running locally. Cloudflared 2026.9.3 was verified against Cloudflare's published SHA256 before use.
Author
Owner

Round-4 profiling finding: CalDAV calendar-multiget currently loads the User's full Task list before it filters requested hrefs (crates/calternal-dav/src/protocol.rs). I added a 100/10,000-Task multiget phase and separate response-header/body-read timing to the existing benchmark in commit a40cda820; no DAV behavior changed. The production SPA build passed, and the merged server build completed in 10m 38s. The measured profile is still pending.

Round-4 profiling finding: CalDAV `calendar-multiget` currently loads the User's full Task list before it filters requested hrefs (`crates/calternal-dav/src/protocol.rs`). I added a 100/10,000-Task multiget phase and separate response-header/body-read timing to the existing benchmark in commit `a40cda820`; no DAV behavior changed. The production SPA build passed, and the merged server build completed in 10m 38s. The measured profile is still pending.
Author
Owner

Round 4 setup finding: the shared Mac lock was free. I installed the new throwaway CalDAV profile through System Settings → General → Device Management and verified the new profile identifier is present. EventKit can discover writable CalDAV collections. The CUA full-desktop capture reports no main display, but the documented per-window capture path works. The current app stores still contain round 3 test records; the round 4 server API initially had zero Tasks, so I am verifying which account is active before writing new Mac cases. No acceptance cells changed yet.

Round 4 setup finding: the shared Mac lock was free. I installed the new throwaway CalDAV profile through System Settings → General → Device Management and verified the new profile identifier is present. EventKit can discover writable CalDAV collections. The CUA full-desktop capture reports no main display, but the documented per-window capture path works. The current app stores still contain round 3 test records; the round 4 server API initially had zero Tasks, so I am verifying which account is active before writing new Mac cases. No acceptance cells changed yet.
Author
Owner

Round 4 finding — native Reminders refresh duplicated the throwaway batch. One EventKit apply created 17 test Tasks in the newly installed account. After a Calendar refresh, the server Task API returned 34 rows: each of the 17 titles appeared twice with different Task IDs. The wire capture contains 34 PUTs, each 201, and the native read contains 34 records. This is not a pass. Evidence is in ignored artifacts/mac393-round4/ (wire captures, native apply/read JSON, and the first-sync Reminders screenshot). I am checking whether the second writer is another installed CalDAV account or the current server projection before further Mac writes.

Round 4 finding — native Reminders refresh duplicated the throwaway batch. One EventKit apply created 17 test Tasks in the newly installed account. After a Calendar refresh, the server Task API returned 34 rows: each of the 17 titles appeared twice with different Task IDs. The wire capture contains 34 PUTs, each 201, and the native read contains 34 records. This is not a pass. Evidence is in ignored artifacts/mac393-round4/ (wire captures, native apply/read JSON, and the first-sync Reminders screenshot). I am checking whether the second writer is another installed CalDAV account or the current server projection before further Mac writes.
Author
Owner

Clarification — the original 17-Task Reminders batch still has 34 active Task/API rows and 34 native records: the second 17 PUTs used new UIDs after Calendar refresh. A separate one-item diagnosis was accidentally submitted twice by this job while recovering the remote helper output. I moved both extra Notes to Trash through the authenticated Notes API and removed only those two native test items. The diagnosis is excluded from result counts. The two cleanup DAV DELETEs returned 404 because the server Notes were already in Trash; no other items were selected. The 34-row duplication remains unresolved and Reminders acceptance stays partial.

Clarification — the original 17-Task Reminders batch still has 34 active Task/API rows and 34 native records: the second 17 PUTs used new UIDs after Calendar refresh. A separate one-item diagnosis was accidentally submitted twice by this job while recovering the remote helper output. I moved both extra Notes to Trash through the authenticated Notes API and removed only those two native test items. The diagnosis is excluded from result counts. The two cleanup DAV DELETEs returned 404 because the server Notes were already in Trash; no other items were selected. The 34-row duplication remains unresolved and Reminders acceptance stays partial.
Author
Owner

C8 retake status — EventKit readback on the selected Untagged calendar found the 20 retake Events and the earlier single probe. I ran one Calendar refresh and read the same calendar again. The logging proxy captured zero PUTs for the retake titles; its 37 captured PUTs remain the Reminder cases, two cleanup-diagnosis items, and the single probe, all 201. The retake therefore has native-local evidence only. I did not repeat the create batch. The 21 Calendar forward cells stay partial until a server write, Home read and second-sync evidence exist.

C8 retake status — EventKit readback on the selected Untagged calendar found the 20 retake Events and the earlier single probe. I ran one Calendar refresh and read the same calendar again. The logging proxy captured zero PUTs for the retake titles; its 37 captured PUTs remain the Reminder cases, two cleanup-diagnosis items, and the single probe, all 201. The retake therefore has native-local evidence only. I did not repeat the create batch. The 21 Calendar forward cells stay partial until a server write, Home read and second-sync evidence exist.
Author
Owner

Webcal check — authenticated GET /api/v1/calendar/feeds returned 200. One full-feed create did not return within the 25 s client bound. The Home list then showed one new inactive definition with no usable link. The sanitized local server log records SQLite pool timeouts while waiting for a connection, including for the job worker and system cron. The same disposable instance contains the partial 3,100-Task perf corpus; this does not measure 10,000-Task REPORT or multiget latency. I did not retry the create. Webcal stays untested in the acceptance matrix; I will discard this private lab instance at teardown.

Webcal check — authenticated GET /api/v1/calendar/feeds returned 200. One full-feed create did not return within the 25 s client bound. The Home list then showed one new inactive definition with no usable link. The sanitized local server log records SQLite pool timeouts while waiting for a connection, including for the job worker and system cron. The same disposable instance contains the partial 3,100-Task perf corpus; this does not measure 10,000-Task REPORT or multiget latency. I did not retry the create. Webcal stays untested in the acceptance matrix; I will discard this private lab instance at teardown.
Author
Owner

Performance update — one authenticated REPORT confirms 3,100 Tasks in the local disposable corpus. A single collection REPORT sample returned 207; header wait was 1,910.60 ms and body read was 14.70 ms for 2,726,905 bytes. A corrected 100-resource multiget slice used exact hrefs from that REPORT and validated all 100 calendar-data results. Ten local samples measured p50 415.42 ms and p95 487.65 ms; header wait p95 was 487.08 ms and body read p95 was 0.68 ms.

The first round-4 100-resource multiget measurement was invalid: synthetic hrefs fetched only the four direct DAV Tasks. I fixed the benchmark to use REPORT hrefs and reject partial multiget results. The new two-test href suite passes. The 10,000-Task setup remains incomplete, so there is no 10,000-Task REPORT/multiget split or basis for a separate 10,000-Task issue. These are local measurements.

Performance update — one authenticated REPORT confirms 3,100 Tasks in the local disposable corpus. A single collection REPORT sample returned 207; header wait was 1,910.60 ms and body read was 14.70 ms for 2,726,905 bytes. A corrected 100-resource multiget slice used exact hrefs from that REPORT and validated all 100 calendar-data results. Ten local samples measured p50 415.42 ms and p95 487.65 ms; header wait p95 was 487.08 ms and body read p95 was 0.68 ms. The first round-4 100-resource multiget measurement was invalid: synthetic hrefs fetched only the four direct DAV Tasks. I fixed the benchmark to use REPORT hrefs and reject partial multiget results. The new two-test href suite passes. The 10,000-Task setup remains incomplete, so there is no 10,000-Task REPORT/multiget split or basis for a separate 10,000-Task issue. These are local measurements.
Author
Owner

Round 4 final report

Branch: job/mac-393
Base merged before gates: origin/dev at 0957cd349
Head: 42b04a72aabedb9267050f090b6cc9c425121501

Direction matrix

App and direction Pass Partial Untested
Reminders.app: Mac → calternal 11 14 23
Reminders.app: calternal → Mac 11 0 37
Calendar.app Events: Mac → calternal 1 21 21
Calendar.app Events: calternal → Mac 0 3 40
Reminders in Calendar: Mac → calternal 0 0 4
Reminders in Calendar: calternal → Mac 0 0 4
Webcal: Mac → calternal 0 0 7
Webcal: calternal → Mac 0 0 7
Total 23 38 143

The verdict remains NO-GO. No acceptance cell changed status.

Round 4 evidence and findings

  • R8 applied 17 native Reminders once. After one Calendar refresh, the 17 titles each had two different Task IDs: 34 records in the Task API and native read, and 34 captured PUTs returned 201. This is a sync collision; the cells remain partial. I did not repeat the batch. Two one-item diagnosis Notes were submitted twice during recovery, then moved to Trash through the Notes API and removed natively; they are excluded from the counts.
  • C8 retake applied the 20 Event options once. EventKit read all 20 before and after one Calendar refresh, but the capture had no PUT for those titles and there was no server/Home evidence. The 21 forward cells remain partial. I did not repeat the batch.
  • Authenticated Webcal list GET returned 200. One full-feed create did not return within 25 seconds and left an inactive definition without a link. The local server log had SQLite pool timeouts while handling the 3,100-Task corpus. I did not retry; Webcal stays untested and this is not evidence of a healthy-instance failure.
  • Corrected the benchmark to build multiget from exact collection REPORT hrefs and fail if any requested Task lacks calendar-data. The earlier synthetic-href multiget result was invalid: it returned only four direct DAV Tasks. The two href-selection tests pass.
  • Local performance: 100-Task REPORT p50 184.94 ms, p95 322.21 ms; header p95 320.66 ms, body-read p95 9.61 ms. Corrected 100-resource multiget from the confirmed 3,100-Task corpus (10 samples): p50 415.42 ms, p95 487.65 ms; header p95 487.08 ms, body-read p95 0.68 ms. One full REPORT of 3,100 Tasks had 1,910.60 ms header wait and 14.70 ms body read for 2,726,905 bytes. These are local measurements; the 3,100 REPORT result is one sample, not p50/p95.
  • The 10,000-Task setup did not complete: one 1,000-Task Notes setup request timed out at the ten-minute socket bound. There is no 10,000-Task REPORT/multiget split, so no separate 10,000-Task performance issue was filed. The prior 10.98 s p95 remains unsplit. The dedicated perf VM was unavailable.
  • Contacts and Apple Notes are not included in the 204 cells: this branch has no CardDAV service or Notes-over-IMAP service, and DESIGN §49 I5 keeps Contacts hidden until #297 exists. Mail proxy remained out of scope.
  • Removed both Mac profiles used for this work and ~/mac393-round3; only the system-managed profile remained. Stopped this job's server, tunnel, proxy and log reader, and removed its private profile/data directory.

Files

  • bench/apple-reminders.mjs
  • bench/apple-reminders-xml.mjs
  • tests/apple/apple-reminders-xml.test.mjs
  • tests/apple/README.md
  • tests/adversarial/setup.mjs
  • docs/research/apple-caldav-matrix.md
  • docs/perf/mac393-round4-local.json

Gates

cargo fmt --check exited 0 with no output.

Clippy output (verbatim):

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 6m 08s
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 13s
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 42s

These correspond, in order, to calternal-plugin-calendar, calternal-dav, and calternal-plugin-notes.

Test result lines (verbatim):

test result: ok. 80 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 10.57s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.65s
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.09s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 42 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.17s
test result: ok. 36 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 131 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 61.17s
test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.35s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

node --check on both benchmark modules exited 0 with no output. node --test tests/apple/apple-reminders-xml.test.mjs output (verbatim):

TAP version 13
# Subtest: multiget uses escaped hrefs returned by collection REPORT
ok 1 - multiget uses escaped hrefs returned by collection REPORT
  ---
  duration_ms: 2.838832
  type: 'test'
  ...
# Subtest: REPORT href selection rejects duplicate and out-of-collection resources
ok 2 - REPORT href selection rejects duplicate and out-of-collection resources
  ---
  duration_ms: 0.684667
  type: 'test'
  ...
1..2
# tests 2
# suites 0
# pass 2
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 89.818783

python3 -m json.tool docs/perf/mac393-round4-local.json and git diff --check exited 0. cargo clean output (verbatim):

     Removed 15868 files, 9.2GiB total

Decisions

The design docs do not define a fallback for an unavailable perf VM. I recorded local measurements and kept the 3,100-Task REPORT as a single sample; I did not infer a 10,000-Task server regression from it. I kept acceptance cells unchanged where the run lacked paired wire, Home/API and native evidence. No API behavior or new data model was selected.

## Round 4 final report **Branch:** `job/mac-393` **Base merged before gates:** `origin/dev` at `0957cd349` **Head:** `42b04a72aabedb9267050f090b6cc9c425121501` ### Direction matrix | App and direction | Pass | Partial | Untested | | --- | ---: | ---: | ---: | | Reminders.app: Mac → calternal | 11 | 14 | 23 | | Reminders.app: calternal → Mac | 11 | 0 | 37 | | Calendar.app Events: Mac → calternal | 1 | 21 | 21 | | Calendar.app Events: calternal → Mac | 0 | 3 | 40 | | Reminders in Calendar: Mac → calternal | 0 | 0 | 4 | | Reminders in Calendar: calternal → Mac | 0 | 0 | 4 | | Webcal: Mac → calternal | 0 | 0 | 7 | | Webcal: calternal → Mac | 0 | 0 | 7 | | **Total** | **23** | **38** | **143** | The verdict remains **NO-GO**. No acceptance cell changed status. ### Round 4 evidence and findings - R8 applied 17 native Reminders once. After one Calendar refresh, the 17 titles each had two different Task IDs: 34 records in the Task API and native read, and 34 captured PUTs returned 201. This is a sync collision; the cells remain partial. I did not repeat the batch. Two one-item diagnosis Notes were submitted twice during recovery, then moved to Trash through the Notes API and removed natively; they are excluded from the counts. - C8 retake applied the 20 Event options once. EventKit read all 20 before and after one Calendar refresh, but the capture had no PUT for those titles and there was no server/Home evidence. The 21 forward cells remain partial. I did not repeat the batch. - Authenticated Webcal list GET returned 200. One full-feed create did not return within 25 seconds and left an inactive definition without a link. The local server log had SQLite pool timeouts while handling the 3,100-Task corpus. I did not retry; Webcal stays untested and this is not evidence of a healthy-instance failure. - Corrected the benchmark to build multiget from exact collection REPORT hrefs and fail if any requested Task lacks `calendar-data`. The earlier synthetic-href multiget result was invalid: it returned only four direct DAV Tasks. The two href-selection tests pass. - Local performance: 100-Task REPORT p50 184.94 ms, p95 322.21 ms; header p95 320.66 ms, body-read p95 9.61 ms. Corrected 100-resource multiget from the confirmed 3,100-Task corpus (10 samples): p50 415.42 ms, p95 487.65 ms; header p95 487.08 ms, body-read p95 0.68 ms. One full REPORT of 3,100 Tasks had 1,910.60 ms header wait and 14.70 ms body read for 2,726,905 bytes. These are local measurements; the 3,100 REPORT result is one sample, not p50/p95. - The 10,000-Task setup did not complete: one 1,000-Task Notes setup request timed out at the ten-minute socket bound. There is no 10,000-Task REPORT/multiget split, so no separate 10,000-Task performance issue was filed. The prior 10.98 s p95 remains unsplit. The dedicated perf VM was unavailable. - Contacts and Apple Notes are not included in the 204 cells: this branch has no CardDAV service or Notes-over-IMAP service, and DESIGN §49 I5 keeps Contacts hidden until #297 exists. Mail proxy remained out of scope. - Removed both Mac profiles used for this work and `~/mac393-round3`; only the system-managed profile remained. Stopped this job's server, tunnel, proxy and log reader, and removed its private profile/data directory. ### Files - `bench/apple-reminders.mjs` - `bench/apple-reminders-xml.mjs` - `tests/apple/apple-reminders-xml.test.mjs` - `tests/apple/README.md` - `tests/adversarial/setup.mjs` - `docs/research/apple-caldav-matrix.md` - `docs/perf/mac393-round4-local.json` ### Gates `cargo fmt --check` exited 0 with no output. Clippy output (verbatim): ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 6m 08s Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 13s Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 42s ``` These correspond, in order, to `calternal-plugin-calendar`, `calternal-dav`, and `calternal-plugin-notes`. Test result lines (verbatim): ```text test result: ok. 80 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 10.57s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.65s test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.09s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 42 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.17s test result: ok. 36 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 131 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 61.17s test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.35s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` `node --check` on both benchmark modules exited 0 with no output. `node --test tests/apple/apple-reminders-xml.test.mjs` output (verbatim): ```text TAP version 13 # Subtest: multiget uses escaped hrefs returned by collection REPORT ok 1 - multiget uses escaped hrefs returned by collection REPORT --- duration_ms: 2.838832 type: 'test' ... # Subtest: REPORT href selection rejects duplicate and out-of-collection resources ok 2 - REPORT href selection rejects duplicate and out-of-collection resources --- duration_ms: 0.684667 type: 'test' ... 1..2 # tests 2 # suites 0 # pass 2 # fail 0 # cancelled 0 # skipped 0 # todo 0 # duration_ms 89.818783 ``` `python3 -m json.tool docs/perf/mac393-round4-local.json` and `git diff --check` exited 0. `cargo clean` output (verbatim): ```text Removed 15868 files, 9.2GiB total ``` ### Decisions The design docs do not define a fallback for an unavailable perf VM. I recorded local measurements and kept the 3,100-Task REPORT as a single sample; I did not infer a 10,000-Task server regression from it. I kept acceptance cells unchanged where the run lacked paired wire, Home/API and native evidence. No API behavior or new data model was selected.
Author
Owner

Audit against origin/dev: the latest Round 4 report remains NO-GO. Its matrix records 23 pass, 38 partial, and 143 untested cells, including the Calendar/Reminders flows. This issue remains open until the required matrix passes.

Audit against origin/dev: the latest Round 4 report remains NO-GO. Its matrix records 23 pass, 38 partial, and 143 untested cells, including the Calendar/Reminders flows. This issue remains open until the required matrix passes.
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#393
No description provided.