33 "decision": "Create with { memberAbout: { memberId, content: { nodes: [...] } } }; content is a Ricos RichContent node tree. One About per member (unique constraint on memberId), so the import path is upsert: query by memberId, PATCH the existing About with its revision, otherwise create."
34 },
35 "reliability": {
36 "status": "reliable",
37 "flags": []
38 },
39 "pitfalls": [
40 {
41 "code": "rich-content-wrapping",
42 "severity": "warning",
43 "summary": "content is Ricos RichContent (node tree), not plain text; a WordPress user description must be wrapped as paragraph nodes. Malformed node trees fail the write. Verified-live minimal shape: { nodes: [ { type: 'PARAGRAPH', id: 'p1', paragraphData: {}, nodes: [ { type: 'TEXT', id: '', nodes: [], textData: { text, decorations: [] } } ] } ] }."
44 },
45 {
46 "code": "member-must-exist",
47 "severity": "blocker",
48 "summary": "Keyed by memberId — the member must be written and verified before its About; the readiness gate resolves memberAbout.memberId per record."
49 },
50 {
51 "code": "one-about-per-member",
52 "severity": "warning",
53 "summary": "VERIFIED LIVE 2026-08-16: a second create for the same memberId returns 409 ALREADY_EXISTS (uniqueConstraintViolation on memberId). A resumed/retried import must upsert — POST /members/v2/abouts/query { query: { filter: { memberId } } }, then PATCH /members/v2/abouts/{id} with { memberAbout: { id, revision, memberId, content } } (revision required; returns revision+1)."
54 },
55 {
56 "code": "about-outlives-member",
57 "severity": "warning",
58 "summary": "VERIFIED LIVE 2026-08-16: DELETE /members/v1/members/{id} does NOT delete that member's About — the record is still returned by the abouts query afterwards. Probe/rollback cleanup must delete the About explicitly (DELETE /members/v2/abouts/{id}), and a re-import onto a cleaned site can collide with an orphan About."
59 },
60 {
61 "code": "about-for-any-member-id",
62 "severity": "blocker",
63 "summary": "VERIFIED LIVE 2026-10-27 (probe P2): Wix creates an About for a memberId that does not exist. The memberId must come from the readiness grant (per-record members/member reference at memberAbout.memberId), never from a crosswalk read or a guess."
64 },
65 {
66 "code": "stale-revision",
67 "severity": "warning",
68 "summary": "VERIFIED LIVE 2026-10-27: PATCH with an old revision answers 409 INVALID_REVISION. upsertMemberAbout re-queries once and retries with the current revision."
69 }
70 ],
71 "mappingGuidance": [
72 "Dependencies: members/member is required (per-record) because memberAbout.memberId is the created member's ID, resolved by the readiness gate.",
73 "Import after members/member: memberAbout.memberId = resolveReference('members/member', memberKey, 'memberAbout.memberId') (never a crosswalk read), and wrap the source bio (WP user description) in a minimal RichContent paragraph tree.",
74 "Skip empty bios rather than writing empty abouts.",
75 "Use upsert semantics (query by memberId → PATCH with revision, else POST) so re-runs don't 409.",
76 "Write with upsertMemberAbout(recordClient, { memberId, content }); build content with memberAboutContentFromText(bio), which returns null for an empty bio (skip the record)."
94 "note": "Verified live: create → 200 (about <anonymized-id>, revision 1) on a probe member; GET by id and query-by-memberId both read the content back; PATCH with revision → 200 revision 2; duplicate create → 409 ALREADY_EXISTS; probe member + orphan About deleted"
95 },
96 {
97 "type": "live-run",
98 "path": "anonymized-live-verification",
99 "note": "Verified live 2026-10-27 (probe P2, throwaway site): create 200 rev 1, query by memberId, duplicate create 409 ALREADY_EXISTS, PATCH rev 1->2, stale PATCH 409 INVALID_REVISION, GET reads content back; create for a nonexistent memberId 200 (trap); probe About, orphan About and member deleted"
100 }
101 ],
102 "notes": "Authored 2026-08-11 from the docs-survey gap (Members About V2). WordPress core user description maps here; not covered by the members/member basic-profile import. Promoted to verified-live 2026-08-16 by a create/read/update/delete probe on an anonymized verification environment — one-About-per-member and About-outlives-member were discovered by that probe."