Prerequisite for DAV change enumeration and for any write-back.
DAV objects have no stable remote identity. Ids are positional — format!("caldav-evt-{}", events.len() + dropped + 1) and format!("carddav-{account_id}-{}", …) — and combined with INSERT OR REPLACE on id, every re-sync reshuffles which local row holds which remote object whenever ordering or count changes.
getetag is requested in the query XML and never parsed. calendar_events and contacts have no href, no etag, no UID column.
Scope
href = placement, iCalendar/vCard UID = identity, ETag = version — the DAV analogue of the mail identity split.
Persist all three; migrate existing rows.
Add AccountProtocol::CardDav (#255) — a CardDAV account is currently not representable, which is why contacts sync is unwireable rather than merely unwired.
Depends on #257 (a namespace-aware multistatus reader — without it there is no href to extract).
**Prerequisite for DAV change enumeration and for any write-back.**
DAV objects have no stable remote identity. Ids are **positional** — `format!("caldav-evt-{}", events.len() + dropped + 1)` and `format!("carddav-{account_id}-{}", …)` — and combined with `INSERT OR REPLACE` on id, **every re-sync reshuffles which local row holds which remote object** whenever ordering or count changes.
`getetag` is requested in the query XML and never parsed. `calendar_events` and `contacts` have no href, no etag, no UID column.
### Scope
- href = placement, iCalendar/vCard `UID` = identity, ETag = version — the DAV analogue of the mail identity split.
- Persist all three; migrate existing rows.
- Add `AccountProtocol::CardDav` (#255) — a CardDAV account is currently **not representable**, which is why contacts sync is unwireable rather than merely unwired.
Depends on #257 (a namespace-aware multistatus reader — without it there is no href to extract).
Design: [ADR 0002](https://github.com/KofTwentyTwo/nuncio/blob/dev/docs/adr/0002-multi-engine-sync-model.md) · [review evidence](https://github.com/KofTwentyTwo/nuncio/blob/dev/docs/reviews/2026-08-10-multi-engine-design-review.md) (PR #385)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Prerequisite for DAV change enumeration and for any write-back.
DAV objects have no stable remote identity. Ids are positional —
format!("caldav-evt-{}", events.len() + dropped + 1)andformat!("carddav-{account_id}-{}", …)— and combined withINSERT OR REPLACEon id, every re-sync reshuffles which local row holds which remote object whenever ordering or count changes.getetagis requested in the query XML and never parsed.calendar_eventsandcontactshave no href, no etag, no UID column.Scope
UID= identity, ETag = version — the DAV analogue of the mail identity split.AccountProtocol::CardDav(#255) — a CardDAV account is currently not representable, which is why contacts sync is unwireable rather than merely unwired.Depends on #257 (a namespace-aware multistatus reader — without it there is no href to extract).
Design: ADR 0002 · review evidence (PR #385)