Handling the Unknowns — honest uncertainty in dates & people
Why this milestone exists
The family archive is being filled from a messy, un-normalized spreadsheet. Real historical records are rough around the edges: a letter is dated "Sommer 1916" or just "?", a sender is written as only "Clara", "Eltern Cram", or a description like "Foto von La Veranda in Lausanne" that isn't a person at all. A bulk import would faithfully pull all of this in — leaving us with vague dates, half-identified people, and a few hundred junk entries sitting next to our carefully curated family records.
Two root problems: the importer re-does all the messy parsing itself (badly), and the data model can only store a date as an exact day or nothing — and it turns every spreadsheet cell into a "person." The result is false precision where we don't know the day, and a directory swollen with ~940 auto-created entries drowning the real family members.
What we want to achieve
Be honest about what we don't know, and don't make the reader pay for the mess.
- A date we only know to the month, year, or season is shown as "Juni 1916" / "ca. 1916" / "Datum unbekannt" — never faked into a specific day, never silently lost.
- Imported names are sorted into real people, family groups, or kept as plain text — junk and pure descriptions don't become people at all.
- Auto-created, unconfirmed entries are clearly marked and tucked away, so casual readers (often on phones) see a clean directory, while transcribers (on laptops) get a dedicated place to clean them up.
- Documents and timelines gracefully handle "no usable date" with a clear "Undated" grouping instead of confusing ordering.
The stories in this milestone
- #669 — Rebuild the importer as modular canonical loaders (foundation — build first): the backend stops re-parsing the messy original and instead loads the normalizer's already-clean exports (people, tags, relationships, documents) through four small, idempotent loaders with stable IDs. This is what makes everything below actually work end-to-end.
- #666 — Model imprecise & unknown dates honestly: a precision level (day / month / season / year / circa / range / unknown) plus the original text. Builds on #669.
- #665 — Triage imported names instead of inventing people: route each name to a real person, a group, or plain text; mark auto-created entries as provisional. Builds on #669. Has an open product decision — see the issue.
- #667 — A clean persons directory: filters + a "needs review" toggle so readers aren't overwhelmed, plus a triage view for cleanup. Builds on #665.
- #668 — Undated documents in browse & search: an "Undated" bucket/badge and honest date rendering everywhere. Builds on #666.
Build order
#669 first (the import foundation) → then #666 and #665 (now smaller, since the import plumbing lives in #669) → then #667 and #668 in parallel.
Out of scope
The Briefwechsel (bilateral conversation) view — a dead feature scheduled for removal.