Product gap
ADR 0251 prevents a later imported primary Voice from being antedated, but migration 0237 currently deletes the former primary assignment before inserting the new one. An authorized historical-cutoff read therefore cannot recover the former primary after a source update. It honestly returns unavailable, but it does not preserve the product history users expect.
Required decision
Define an ADR-first temporal persistence contract before changing the schema. Reuse the existing source_post_voice boundary and PostgreSQL range/constraint features where possible; do not infer a Voice, invent a weight, or duplicate the source representation. Keep additional evidence-bearing assignments and counterparty relationships separate.
Acceptance
- A primary Voice update closes the former effective interval and opens the new interval atomically.
- Live reads return exactly one current imported primary; an authorized cutoff read returns the primary effective at that instant.
- Re-import and migration replay are idempotent and do not manufacture history that the source never supplied.
- The schema permits repeated use of the same atomic Voice in non-overlapping periods while rejecting overlapping primary intervals.
- API, ontology JSON-LD/CSV, and UI preserve ABAC and cutoff boundaries; hidden evidence remains hidden.
- Synthetic PostgreSQL integration tests prove A → B → A changes at before/between/after cutoffs and concurrent UPSERT behavior.
- ADR 0251, PRD/TRD/UML, and
docs/product-technical-gap-baseline.md distinguish non-antedating from historical preservation.
No real organization or record identifiers belong in fixtures or evidence.
Product gap
ADR 0251 prevents a later imported primary Voice from being antedated, but migration 0237 currently deletes the former primary assignment before inserting the new one. An authorized historical-cutoff read therefore cannot recover the former primary after a source update. It honestly returns unavailable, but it does not preserve the product history users expect.
Required decision
Define an ADR-first temporal persistence contract before changing the schema. Reuse the existing
source_post_voiceboundary and PostgreSQL range/constraint features where possible; do not infer a Voice, invent a weight, or duplicate the source representation. Keep additional evidence-bearing assignments and counterparty relationships separate.Acceptance
docs/product-technical-gap-baseline.mddistinguish non-antedating from historical preservation.No real organization or record identifiers belong in fixtures or evidence.