Reminders over CalDAV: calternal edits of priority/due on an Apple-created Reminder never reach the Mac and are reverted by the next Apple write #643

Closed
opened 2026-10-01 18:48:03 +00:00 by kayg · 7 comments
Owner

Summary

An edit in calternal to the priority or due date of a Reminder that was created in Apple Reminders never reaches the Mac. The next Apple write of that Reminder (any edit on the Mac, for example its notes) then puts the old priority and due date back into the Task Markdown. The calternal edit is lost without a warning. This is a sync collision (data loss), so it blocks a merge per CLAUDE.md.

Found in the Apple interop run on the macOS 27 VM, 2026-10-01 (lab server built from dev at 687ff7031, Reminders over CalDAV through a TLS logging proxy). Related: #393 (matrix), #48 (VTODO adapter).

Repro (real Mac, local lab server)

  1. In Reminders (calternal account, list "Reminders") create a reminder with due date 2026-10-05 09:30 and priority high. Apple sends PUT …/reminders/09CDC496-….ics with DUE;TZID=Asia/Calcutta:20261005T093000, PRIORITY:1, a VALARM → 201. Markdown gets priority: urgent, due: 2026-10-05 09:30:00 and a calternal-dav frontmatter blob with dueValue and properties: [... "PRIORITY:1" ...].
  2. In Reminders set priority to medium (PRIORITY:5) → 201, Markdown priority: medium. (Mac→calternal works.)
  3. In calternal: PATCH /api/v1/notes/tasks/properties {"task_id":"09cdc496-…","fields":{"title":"MDV rem full web-renamed","priority":"high","due":"2026-10-07"}} → 200. Markdown now has priority: high, due: 2026-10-07.
  4. GET …/reminders/09CDC496-….ics (the projection Apple reads) still returns:
SUMMARY:MDV rem full web-renamed
DUE;TZID=Asia/Calcutta:20261005T093000
DTSTART;TZID=Asia/Calcutta:20261005T093000
PRIORITY:5

Only the title change reached the projection. After a Reminders sync the Mac shows the new title but still priority 5 and due 5 Oct 09:30.
5. On the Mac edit only the reminder's notes. Apple sends PUT (If-Match, 201) with DUE;TZID=Asia/Calcutta:20261005T093000 and PRIORITY:5. The Markdown becomes priority: medium, due: 2026-10-05 09:30:00 again. The calternal edit from step 3 is gone.

Expected

  • A calternal change to priority, due, scheduled or start of a DAV-backed Task changes the VTODO that Apple fetches (new ETag, new values), the same as a title change does.
  • The preserved DAV metadata (dueValue, properties with the old PRIORITY, alarms tied to the old due instant) must never win over the Markdown fields. When the Markdown field changes, the stale preserved value is dropped or rebuilt from Markdown.
  • No silent revert: an Apple write based on an older ETag gets 412, never a merge that restores old fields.

Actual

Markdown and the CalDAV projection disagree after a calternal edit; the next Apple write reverts the calternal edit.

Notes for the fix

  • Look at how crates/calternal-dav/src/reminders.rs builds the VTODO from TaskDavMetadata (due_value, scheduled_value, properties) versus the Task index fields. The preserved PRIORITY: line and dueValue appear to override the Markdown values.
  • Regression test: Apple-shaped PUT → API properties PATCH (priority + due) → GET must show new PRIORITY/DUE → Apple PUT with the GET's ETag keeps the API values.
  • Also check the VALARM that is tied to the old due instant (TRIGGER;VALUE=DATE-TIME:20261005T040000Z) when the due date moves.
## Summary An edit in calternal to the **priority** or **due date** of a Reminder that was created in Apple Reminders never reaches the Mac. The next Apple write of that Reminder (any edit on the Mac, for example its notes) then puts the old priority and due date back into the Task Markdown. The calternal edit is lost without a warning. This is a sync collision (data loss), so it blocks a merge per CLAUDE.md. Found in the Apple interop run on the macOS 27 VM, 2026-10-01 (lab server built from `dev` at `687ff7031`, Reminders over CalDAV through a TLS logging proxy). Related: #393 (matrix), #48 (VTODO adapter). ## Repro (real Mac, local lab server) 1. In Reminders (calternal account, list "Reminders") create a reminder with due date 2026-10-05 09:30 and priority high. Apple sends `PUT …/reminders/09CDC496-….ics` with `DUE;TZID=Asia/Calcutta:20261005T093000`, `PRIORITY:1`, a `VALARM` → 201. Markdown gets `priority: urgent`, `due: 2026-10-05 09:30:00` and a `calternal-dav` frontmatter blob with `dueValue` and `properties: [... "PRIORITY:1" ...]`. 2. In Reminders set priority to medium (`PRIORITY:5`) → 201, Markdown `priority: medium`. (Mac→calternal works.) 3. In calternal: `PATCH /api/v1/notes/tasks/properties {"task_id":"09cdc496-…","fields":{"title":"MDV rem full web-renamed","priority":"high","due":"2026-10-07"}}` → 200. Markdown now has `priority: high`, `due: 2026-10-07`. 4. `GET …/reminders/09CDC496-….ics` (the projection Apple reads) still returns: ``` SUMMARY:MDV rem full web-renamed DUE;TZID=Asia/Calcutta:20261005T093000 DTSTART;TZID=Asia/Calcutta:20261005T093000 PRIORITY:5 ``` Only the title change reached the projection. After a Reminders sync the Mac shows the new title but still priority 5 and due 5 Oct 09:30. 5. On the Mac edit only the reminder's notes. Apple sends `PUT` (If-Match, 201) with `DUE;TZID=Asia/Calcutta:20261005T093000` and `PRIORITY:5`. The Markdown becomes `priority: medium`, `due: 2026-10-05 09:30:00` again. The calternal edit from step 3 is gone. ## Expected - A calternal change to priority, due, scheduled or start of a DAV-backed Task changes the VTODO that Apple fetches (new ETag, new values), the same as a title change does. - The preserved DAV metadata (`dueValue`, `properties` with the old `PRIORITY`, alarms tied to the old due instant) must never win over the Markdown fields. When the Markdown field changes, the stale preserved value is dropped or rebuilt from Markdown. - No silent revert: an Apple write based on an older ETag gets 412, never a merge that restores old fields. ## Actual Markdown and the CalDAV projection disagree after a calternal edit; the next Apple write reverts the calternal edit. ## Notes for the fix - Look at how `crates/calternal-dav/src/reminders.rs` builds the VTODO from `TaskDavMetadata` (`due_value`, `scheduled_value`, `properties`) versus the Task index fields. The preserved `PRIORITY:` line and `dueValue` appear to override the Markdown values. - Regression test: Apple-shaped PUT → API properties PATCH (priority + due) → GET must show new PRIORITY/DUE → Apple PUT with the GET's ETag keeps the API values. - Also check the VALARM that is tied to the old due instant (`TRIGGER;VALUE=DATE-TIME:20261005T040000Z`) when the due date moves.
Author
Owner

Started #643 and #647 on job/reminders-643, base 687ff70313. Read the issue bodies and apple-interop-2026-10-02.md. Tracing preserved DAV dates and PRIORITY against current Markdown fields, source fingerprints, and checked writes. No push, deployment, or Mac account change.

Started #643 and #647 on job/reminders-643, base 687ff703136e71e89f8dfba139e93cd0788b25c1. Read the issue bodies and apple-interop-2026-10-02.md. Tracing preserved DAV dates and PRIORITY against current Markdown fields, source fingerprints, and checked writes. No push, deployment, or Mac account change.
Author
Owner

Finding: Reminder indexing hashes the Markdown source and appends reminder_changes when that fingerprint changes. NotesRemindersProvider::decode instead returns an ETag of the VTODO. ReminderTask::icalendar preferred retained due_value/scheduled_value/start_value and retained PRIORITY to current Task fields. This reproduces #643: the new serializer regression failed with old Apple dates and PRIORITY:5. PUT already enforces If-Match under lock_user. Fix in progress: current Task fields win; precision survives only when it agrees with Markdown. ETags will cover source plus projection, including edits to Task fields outside VTODO. Decision: drop absolute alarms tied to changed civil dates; keep relative alarms. No dependencies added.

Finding: Reminder indexing hashes the Markdown source and appends reminder_changes when that fingerprint changes. NotesRemindersProvider::decode instead returns an ETag of the VTODO. ReminderTask::icalendar preferred retained due_value/scheduled_value/start_value and retained PRIORITY to current Task fields. This reproduces #643: the new serializer regression failed with old Apple dates and PRIORITY:5. PUT already enforces If-Match under lock_user. Fix in progress: current Task fields win; precision survives only when it agrees with Markdown. ETags will cover source plus projection, including edits to Task fields outside VTODO. Decision: drop absolute alarms tied to changed civil dates; keep relative alarms. No dependencies added.
Author
Owner

Build finding: the shared sccache daemon used a removed temporary directory from another job. It failed with "Failed to create temp dir" and "No such file or directory (os error 2)" before compiling calternal-dav and a server dependency. This is a host cache failure, not a test assertion. Rerunning with RUSTC_WRAPPER empty for this job; CARGO_TARGET_DIR remains the preset job directory and TMPDIR remains this worktree target/tmp. The #647 Notes composer regression has passed.

Build finding: the shared sccache daemon used a removed temporary directory from another job. It failed with "Failed to create temp dir" and "No such file or directory (os error 2)" before compiling calternal-dav and a server dependency. This is a host cache failure, not a test assertion. Rerunning with RUSTC_WRAPPER empty for this job; CARGO_TARGET_DIR remains the preset job directory and TMPDIR remains this worktree target/tmp. The #647 Notes composer regression has passed.
Author
Owner

Review found a case-sensitive absolute-alarm filter. A regression with a lowercase TRIGGER and a folded VALUE=DATE-TIME failed: both absolute alarms survived a date change. The fix uses the existing iCalendar parser to identify absolute triggers and keeps relative-duration alarms. Two additional real-writer regressions cover an unchanged date PATCH followed by a changed date, and removal of a scheduled-only Task date after Apple drops the role marker. Server gates so far: clippy passed; cargo test reports test result: ok. 107 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 8.75s. Final gates will run on the remaining fixes. No existing test expectation was changed.

Review found a case-sensitive absolute-alarm filter. A regression with a lowercase TRIGGER and a folded VALUE=DATE-TIME failed: both absolute alarms survived a date change. The fix uses the existing iCalendar parser to identify absolute triggers and keeps relative-duration alarms. Two additional real-writer regressions cover an unchanged date PATCH followed by a changed date, and removal of a scheduled-only Task date after Apple drops the role marker. Server gates so far: clippy passed; cargo test reports `test result: ok. 107 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 8.75s`. Final gates will run on the remaining fixes. No existing test expectation was changed.
Author
Owner

Completed #643 and #647 on job/reminders-643. Head: bc66ed31d62bb020115b27cfe3f5bb2e1f38b743. Base: 687ff703136e71e89f8dfba139e93cd0788b25c1. Fetched origin and merged origin/dev once before final gates; it was already up to date. No push or permanent deployment. The original Mac lab server is restored and ready.

Built:

  • Current Task priority and dates override stale Apple wire metadata. Precise DAV values survive only while they agree with Markdown. Obsolete absolute alarms are cleared with the shared parser; relative alarms remain.
  • ETags cover the Markdown source fingerprint and VTODO bytes. The existing shared writer lock enforces If-Match against that current version. Stale PUT returns 412. The existing source journal advances the collection cursor; migration 0024 rotates the feed epoch once for the wire upgrade.
  • Scheduled-only Tasks expose DUE and DTSTART. The role marker and existing Task role keep writes scheduled. Removing DUE clears the schedule even when Apple drops the marker. New date writes retain the request zone. Legacy clocks with no stored zone stay floating.
  • Captured-request replay, real-writer concurrency and property tests, a bounded live replay, and a GET/sync performance profile. No existing dev test assertion was changed; direct edit constructors gain the new provenance field.

Files:

  • bench/reminders-sync.py
  • crates/calternal-dav/src/reminders.rs
  • crates/calternal-dav/tests/apple_replay.rs
  • crates/plugins/notes/migrations/0024_reminder_authoritative_wire_epoch.sql
  • crates/plugins/notes/src/lib.rs
  • crates/plugins/notes/src/reminders_tests.rs
  • crates/plugins/notes/src/store.rs
  • crates/plugins/notes/src/tasks_api.rs
  • crates/plugins/notes/src/tasks_dav.rs
  • crates/plugins/notes/src/tests/unicode_titles.rs
  • docs/perf/reminders-643.local.json
  • tests/adversarial/reminders_sync.py

Real Mac verification on the final branch build:

  • API priority high and due 2026-10-07 11:45 appeared in Reminders as priority 3 and 7 October 11:45. A Mac notes edit kept high priority and the same due date/time. A stale Apple-shaped PUT returned 412.
  • A scheduled-only Task appeared on 3 October at 15:00. Changing the Mac date to 16:00 kept it scheduled and did not add a deadline.
  • A legacy Task was staged through Files DAV with no zone metadata. It appeared at 15:00; a Mac notes edit kept 15:00 and no deadline. The earlier UTC fallback decision is withdrawn.
  • All three fixtures were deleted (204). The lab daemon runs in a detached session, does not inherit macvm.lock, and remains ready after the launcher exits. Evidence: artifacts/mac-reminders-proof.log, artifacts/reminders-live-replay.log, artifacts/mac-floating-due.log.

Gates, verbatim completion output (full logs: artifacts/final-*.log):

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

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

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

cargo test -p calternal-dav

test result: ok. 46 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.21s
test result: ok. 36 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.10s
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 1m 30s

cargo test -p calternal-plugin-notes

test result: ok. 170 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 96.20s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.21s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

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

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 41s

cargo test -p calternal-server

test result: ok. 107 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 33.82s

The three server entry points marked ignored are run by the passing live_apps_run_in_separate_processes test. cargo build -p calternal-server also passed. No frontend file changed, so web gates and UI screenshot gates do not apply.

DAV adversarial round:

  • One bounded existing DAV round completed on a private local Instance. One non-SLOW fixture finding is filed as #650: the 100-href Daily note setup PUT returned 412 instead of 201, so its batch checks did not run. Its existing expectation is unchanged.
  • Other reported findings were SLOW observations under host load. The scripted WebDAV probes completed. The separate #643/#647 live replay passed. No crash or 5xx was reported by this round.

Performance (local shared host, debug; result: docs/perf/reminders-643.local.json):

Phase Before p50/p95 ms After p50/p95 ms CPU seconds before/after RSS KiB before/after
average_get 520.9 / 699.8 1317.9 / 1859.3 16.17 / 17.24 777604 / 358136
average_sync 471.3 / 547.9 1548.1 / 2298.7 13.72 / 15.68 777604 / 358236
worst_sync 5621.3 / 10704.5 10374.3 / 22174.2 15.77 / 15.01 895072 / 498340

The worst case uses 2,000 Tasks and eight concurrent sync requests. The perf VM was unreachable. The official baseline has no matching Reminder profile. Local load rose from 20.6 to 29.9 and server CPU share fell. #651 records p95 above the local comparison and requests a controlled perf-VM follow-up. These runs do not establish a code regression. The measured commit is recorded in the JSON; the later legacy-clock correction does not change this date-only profile input.

Known gaps:

  • #650 prevents the existing 100-href adversarial fixture from reaching its batch checks.
  • Performance requires the controlled follow-up in #651; local wall time is affected by shared-host load.

Decisions not specified by the design:

  • Use X-CALTERNAL-DUE-ROLE:SCHEDULED to retain the scheduled role while exposing Apple DUE. If Apple drops the marker, the existing scheduled-only Task owns that visible date.
  • Keep missing-zone legacy clocks floating, based on real Mac evidence. Do not guess UTC or a historical request zone.
  • Invalidate absolute alarms when their retained date/zone changes; keep relative alarms.
  • Rotate the Reminder feed epoch once so existing clients refetch the changed projection without a Markdown mutation.

Cleanup: cargo clean and web build-output cleanup completed. Review artifacts remain uncommitted in artifacts/.

Completed #643 and #647 on `job/reminders-643`. Head: `bc66ed31d62bb020115b27cfe3f5bb2e1f38b743`. Base: `687ff703136e71e89f8dfba139e93cd0788b25c1`. Fetched origin and merged origin/dev once before final gates; it was already up to date. No push or permanent deployment. The original Mac lab server is restored and ready. Built: - Current Task priority and dates override stale Apple wire metadata. Precise DAV values survive only while they agree with Markdown. Obsolete absolute alarms are cleared with the shared parser; relative alarms remain. - ETags cover the Markdown source fingerprint and VTODO bytes. The existing shared writer lock enforces If-Match against that current version. Stale PUT returns 412. The existing source journal advances the collection cursor; migration 0024 rotates the feed epoch once for the wire upgrade. - Scheduled-only Tasks expose DUE and DTSTART. The role marker and existing Task role keep writes scheduled. Removing DUE clears the schedule even when Apple drops the marker. New date writes retain the request zone. Legacy clocks with no stored zone stay floating. - Captured-request replay, real-writer concurrency and property tests, a bounded live replay, and a GET/sync performance profile. No existing dev test assertion was changed; direct edit constructors gain the new provenance field. Files: - `bench/reminders-sync.py` - `crates/calternal-dav/src/reminders.rs` - `crates/calternal-dav/tests/apple_replay.rs` - `crates/plugins/notes/migrations/0024_reminder_authoritative_wire_epoch.sql` - `crates/plugins/notes/src/lib.rs` - `crates/plugins/notes/src/reminders_tests.rs` - `crates/plugins/notes/src/store.rs` - `crates/plugins/notes/src/tasks_api.rs` - `crates/plugins/notes/src/tasks_dav.rs` - `crates/plugins/notes/src/tests/unicode_titles.rs` - `docs/perf/reminders-643.local.json` - `tests/adversarial/reminders_sync.py` Real Mac verification on the final branch build: - API priority high and due 2026-10-07 11:45 appeared in Reminders as priority 3 and 7 October 11:45. A Mac notes edit kept high priority and the same due date/time. A stale Apple-shaped PUT returned 412. - A scheduled-only Task appeared on 3 October at 15:00. Changing the Mac date to 16:00 kept it scheduled and did not add a deadline. - A legacy Task was staged through Files DAV with no zone metadata. It appeared at 15:00; a Mac notes edit kept 15:00 and no deadline. The earlier UTC fallback decision is withdrawn. - All three fixtures were deleted (204). The lab daemon runs in a detached session, does not inherit macvm.lock, and remains ready after the launcher exits. Evidence: `artifacts/mac-reminders-proof.log`, `artifacts/reminders-live-replay.log`, `artifacts/mac-floating-due.log`. Gates, verbatim completion output (full logs: artifacts/final-*.log): `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 16.97s ``` `cargo test -p calternal-dav` ```text test result: ok. 46 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.21s test result: ok. 36 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.10s 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 1m 30s ``` `cargo test -p calternal-plugin-notes` ```text test result: ok. 170 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 96.20s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.21s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` `cargo clippy -p calternal-server --all-targets -- -D warnings` ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 41s ``` `cargo test -p calternal-server` ```text test result: ok. 107 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 33.82s ``` The three server entry points marked ignored are run by the passing `live_apps_run_in_separate_processes` test. `cargo build -p calternal-server` also passed. No frontend file changed, so web gates and UI screenshot gates do not apply. DAV adversarial round: - One bounded existing DAV round completed on a private local Instance. One non-SLOW fixture finding is filed as #650: the 100-href Daily note setup PUT returned 412 instead of 201, so its batch checks did not run. Its existing expectation is unchanged. - Other reported findings were SLOW observations under host load. The scripted WebDAV probes completed. The separate #643/#647 live replay passed. No crash or 5xx was reported by this round. Performance (local shared host, debug; result: docs/perf/reminders-643.local.json): | Phase | Before p50/p95 ms | After p50/p95 ms | CPU seconds before/after | RSS KiB before/after | |---|---:|---:|---:|---:| | average_get | 520.9 / 699.8 | 1317.9 / 1859.3 | 16.17 / 17.24 | 777604 / 358136 | | average_sync | 471.3 / 547.9 | 1548.1 / 2298.7 | 13.72 / 15.68 | 777604 / 358236 | | worst_sync | 5621.3 / 10704.5 | 10374.3 / 22174.2 | 15.77 / 15.01 | 895072 / 498340 | The worst case uses 2,000 Tasks and eight concurrent sync requests. The perf VM was unreachable. The official baseline has no matching Reminder profile. Local load rose from 20.6 to 29.9 and server CPU share fell. #651 records p95 above the local comparison and requests a controlled perf-VM follow-up. These runs do not establish a code regression. The measured commit is recorded in the JSON; the later legacy-clock correction does not change this date-only profile input. Known gaps: - #650 prevents the existing 100-href adversarial fixture from reaching its batch checks. - Performance requires the controlled follow-up in #651; local wall time is affected by shared-host load. Decisions not specified by the design: - Use `X-CALTERNAL-DUE-ROLE:SCHEDULED` to retain the scheduled role while exposing Apple DUE. If Apple drops the marker, the existing scheduled-only Task owns that visible date. - Keep missing-zone legacy clocks floating, based on real Mac evidence. Do not guess UTC or a historical request zone. - Invalidate absolute alarms when their retained date/zone changes; keep relative alarms. - Rotate the Reminder feed epoch once so existing clients refetch the changed projection without a Markdown mutation. Cleanup: cargo clean and web build-output cleanup completed. Review artifacts remain uncommitted in artifacts/.
Author
Owner

Round 2 reproduces the data loss on staging c4a61e8cf090170f35b1bed3350d9de20c83ecd5, with a real certificate and installed native macOS account (#476).

Apple-created Task c7b73e14-caeb-4eed-b082-2fa98d469820 (R2 timed reminder) initially had due 2026-10-08 10:00, priority urgent. The authenticated properties API returned 200 for {priority:"low", due:"2026-10-12"}. The Mac still read October 8 10:00 and priority 1. Completing it in Reminders sent a native write; the API then returned status done and reverted due to October 8 10:00 and priority urgent.

Control: the API-created R2 web task edited did reach the Mac with changed due October 10 and priority 9. The failure is specific to an Apple-created object's retained DAV projection. This is data loss; it should block release until fixed. No product fix was attempted in this test-only job.

Round 2 reproduces the data loss on staging `c4a61e8cf090170f35b1bed3350d9de20c83ecd5`, with a real certificate and installed native macOS account (#476). Apple-created Task `c7b73e14-caeb-4eed-b082-2fa98d469820` (`R2 timed reminder`) initially had due `2026-10-08 10:00`, priority urgent. The authenticated properties API returned 200 for `{priority:"low", due:"2026-10-12"}`. The Mac still read October 8 10:00 and priority 1. Completing it in Reminders sent a native write; the API then returned status done **and reverted due to October 8 10:00 and priority urgent**. Control: the API-created `R2 web task edited` did reach the Mac with changed due October 10 and priority 9. The failure is specific to an Apple-created object's retained DAV projection. This is data loss; it should block release until fixed. No product fix was attempted in this test-only job.
Author
Owner

Superseded by #940: the queued job/fix-940 branch includes the #643 fix and is the merge-round replacement for job/reminders-643. #940 stays open until it lands on origin/dev.

Superseded by #940: the queued `job/fix-940` branch includes the #643 fix and is the merge-round replacement for `job/reminders-643`. #940 stays open until it lands on origin/dev.
kayg closed this issue 2026-10-03 11:55:54 +00:00
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal#643
No description provided.