Handling the Unknowns — honest uncertainty in dates & people

New Issue

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.

No due date
100% Completed