docs: update the carddav reference to vCard 3.0
Assisted-by: GLM-5.3 via pi
change kkyqsvqluxvottruoxnpuutxyxklsrtu
commit 9f3b25841cba370f6ad07c8dd680b48b19a63eaa
author Alpha Chen <alpha@kejadlen.dev>
date
parent uumsnmuv
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
 ```