Reviewed Seed Import Model
Status
Current direction for #76.
VRDex may import permissioned seed lists for DJs, communities, worlds, or events, but imported data must not become authoritative public truth by default.
Locked Decisions
- Do not commit real partner spreadsheets, raw third-party contact exports, or private list data.
- Imported records need provenance, review state, confidence, claim/handoff state, correction paths, and opt-out handling.
- Imported fields are not owner-confirmed unless the owner actually confirms them.
- Partner-provided data must not bypass owner visibility controls after claim.
- Publication defaults should be safe and reviewed.
Domain Objects
Seed Import Batch
Represents one ingestion job from a permissioned source.
Suggested fields:
batchIdsourceNamesourceType:partner,manual,import, ormoderatorsourceContactoptional internal owner for the import relationshipreceivedAtimportedByreviewState:draft,ready_for_review,approved,rejected,supersedednotesoptional internal review notes
Candidate Profile
Represents a potential person/community profile before or after publication.
Suggested fields:
candidateIdbatchIdprofileType:personorcommunityproposedDisplayNameproposedSlugoptionalpublicationState:draft_private,review_pending,published_unclaimed,rejected,suppressedclaimState: startsunclaimedunless a real claim/handoff flow grants authoritymatchedProfileIdoptional existing VRDex profile matchreviewerIdoptionalcreatedAtupdatedAt
Imported Field
Represents one proposed fact, not a whole record.
Suggested fields:
candidateIdfieldKeyvaluesourceLabelsourceUrloptional public source URLsourceType:partner,manual,import,community,moderatorconfidence:low,medium,high, orowner_confirmedreviewState:unreviewed,accepted,rejected,needs_correctionvisibility:public,unlisted, orprivatereviewedByoptionalreviewedAtoptional
Publication Defaults
Default to draft_private for imported candidates until the batch has an explicit review decision.
Permissioned source means a partner, moderator, or maintainer-provided source that VRDex is allowed to review for candidate profile creation. It does not mean the source is owner-confirmed or safe to publish without review.
Safe public fields are fields that are already designed for public profile display, such as display name, public role tags, public summary, and public https outbound links. Private contacts, raw provider IDs, private notes, and unreviewed third-party assertions are not safe public fields.
An explicit review decision must exist at the batch, candidate, and field level before publication. Batch approval alone does not automatically accept every candidate field.
Publishing an imported profile should create an unclaimed public profile only when:
- the source is permissioned
- the fields are safe public fields
- the record passes review
- there is no matching opted-out or suppressed profile/entity
- public copy clearly labels the entry as imported, partner-provided, reviewed, community-submitted, or unclaimed as appropriate
Never publish private contact details, raw account identifiers, unreviewed personal notes, or scraped third-party data.
Claim, Correction, And Opt-Out
Imported profiles must support:
- claim request path from the real owner
- correction request path from the subject or community
- suppression/opt-out handling before and after claim
- merge path when the import matches an existing claimed profile
- audit trail that preserves source and review decisions
After claim, owner visibility controls apply to imported facts. If an owner hides a field, public API, search, cards, profile pages, and partner exports must respect that choice.
Interactions With Existing Profiles
- Existing claimed profile: imports create proposed fields only. They must not overwrite owner-authored fields, owner-hidden fields, private fields, or claim state. Owner visibility wins after claim.
- Existing unclaimed or community-submitted profile:
matchedProfileIdcan connect the candidate to the existing profile. Review decides whether to merge, preserve both community and import provenance labels, or reject the candidate. - Concierge or handoff draft: imported fields may seed a
draft_privateprofile prepared for handoff. Fields becomeowner_confirmedonly after the recipient confirms them through a real claim or handoff flow. - Existing opted-out or suppressed entity: public publication is blocked. Internal review/audit state can remain only as needed for suppression, dispute handling, or abuse prevention.
Fake Fixture Shape
Use fake fixtures only:
{
"batchId": "seed_fake_2026_001",
"sourceName": "Example Partner Directory",
"sourceType": "partner",
"receivedAt": "2026-06-01T00:00:00.000Z",
"reviewState": "draft",
"candidates": [
{
"candidateId": "candidate_fake_dj_001",
"profileType": "person",
"proposedDisplayName": "DJ Example",
"publicationState": "draft_private",
"claimState": "unclaimed",
"fields": [
{
"fieldKey": "person.roleTags",
"value": ["DJ", "Host"],
"sourceLabel": "Example Partner Directory",
"sourceType": "partner",
"confidence": "medium",
"reviewState": "unreviewed",
"visibility": "public"
},
{
"fieldKey": "outboundLinks",
"value": [{ "type": "website", "url": "https://example.invalid/dj-example" }],
"sourceLabel": "Example Partner Directory",
"sourceType": "partner",
"confidence": "medium",
"reviewState": "unreviewed",
"visibility": "public"
}
]
}
]
}
Implementation Boundary
This document defines the model for #76. It does not authorize importing real partner data or committing real partner fixtures. #117 owns the follow-up implementation work for schema, review UI/workflow, import tooling, and fake-data test fixtures.