docs: update the carddav reference to vCard 3.0
Assisted-by: GLM-5.3 via pi
diff --git a/docs/plans/2026-01-12-carddav-architecture.md b/docs/plans/2026-01-12-carddav-architecture.md
index 18ca8b3..569b775 100644
--- a/docs/plans/2026-01-12-carddav-architecture.md
+++ b/docs/plans/2026-01-12-carddav-architecture.md
@@ -170,4 +170,5 @@ end
## Translation
-KDL → vCard on read. Server parses KDL contact files and generates vCard 4.0 output.
+KDL → vCard on read. The server parses KDL contact files into vCard 3.0
+(`lib/pro_tacts/vcard.rb`), the version Apple clients speak.
diff --git a/docs/plans/2026-01-12-carddav-reference.md b/docs/plans/2026-01-12-carddav-reference.md
index 2aee9bf..2a37b06 100644
--- a/docs/plans/2026-01-12-carddav-reference.md
+++ b/docs/plans/2026-01-12-carddav-reference.md
@@ -252,17 +252,35 @@ contact {
}
```
+`name` derives `N` from the display string (last token family, the rest
+given). Component children override that heuristic entirely — when any
+is present, `N` is built from exactly those, with missing components
+empty:
+
+```kdl
+name "Ludwig van Beethoven" {
+ family "van Beethoven"
+ given "Ludwig"
+}
+```
+
+Values are escaped per RFC 2426 section 2.4.2 (`\\`, `;`, `,`, newlines)
+and lines fold at 75 octets (section 2.6). Property order in the output
+follows the renderer: `BEGIN`, `VERSION`, `N`, `FN`, `TEL`, `EMAIL`,
+`ADR`, `UID`, `END`.
+
### vCard Output
```
BEGIN:VCARD
-VERSION:4.0
-UID:kqmtnwpxlrvszoyp
+VERSION:3.0
+N:Smith;John;;;
FN:John Smith
TEL;TYPE=mobile:+1-555-1234
TEL;TYPE=work:+1-555-5678
EMAIL;TYPE=home:john@example.com
ADR;TYPE=home:;;123 Main St;Springfield;IL;62701;USA
+UID:kqmtnwpxlrvszoyp
END:VCARD
```