You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Voice] Preserve imported primary Voice change history at knowledge cutoffs #748
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.
Cycle 2026-08-28: GitHub writes recovered (comments 201, close-without-reason 200, admin on REST+GraphQL). Token still has empty X-OAuth-Scopes; git clone via helper still 401, public clone used. Independent APPROVE remains required — this comment does not approve or merge.
Open PRs 702/679/672/668/667/640 are all dirty vs current main (bbb19192, v2.22.0). None has an independent APPROVE on the exact head. Copilot review requested on #702. #96 closed as the weaker duplicate of merged #91.
Next buyer gap owned here: implement ADR 0252 temporal primary Voice history (close former primary interval, open the new one atomically; cutoff reads recover the former primary). Distinct from ADR 0251 non-antedating. Synthetic fixtures only.
Closing as completed: ADR 0252 is Accepted on protected main and explicitly closes this issue. Temporal primary Voice history landed via #761 (half-open intervals, cutoff reads, A→B→A). No further unique slice invented from this issue.
Live synthetic PostgreSQL proof for ADR 0252 is in #763 (v2.22.1, feat/voice-history-live-postgres-v2221 @ 1c9986c).
The tests cover A → B → A at before/between/after cutoffs, concurrent voc_type_code updates, GiST non-overlap, closing a matching additional assignment, and 0237→0243 trigger replay. They skip without PostgreSQL.
Do not close this issue until #763 lands through the protected squash-merge gate with independent exact-head APPROVE. This session will not self-approve.
Activity
seonghobae commentedon Aug 27, 2026
Cycle 2026-08-28: GitHub writes recovered (comments 201, close-without-reason 200, admin on REST+GraphQL). Token still has empty X-OAuth-Scopes; git clone via helper still 401, public clone used. Independent APPROVE remains required — this comment does not approve or merge.
Open PRs 702/679/672/668/667/640 are all dirty vs current main (
bbb19192, v2.22.0). None has an independent APPROVE on the exact head. Copilot review requested on #702. #96 closed as the weaker duplicate of merged #91.Next buyer gap owned here: implement ADR 0252 temporal primary Voice history (close former primary interval, open the new one atomically; cutoff reads recover the former primary). Distinct from ADR 0251 non-antedating. Synthetic fixtures only.
seonghobae commentedon Aug 27, 2026
Closing as completed: ADR 0252 is Accepted on protected main and explicitly closes this issue. Temporal primary Voice history landed via #761 (half-open intervals, cutoff reads, A→B→A). No further unique slice invented from this issue.
seonghobae commentedon Aug 27, 2026
Live synthetic PostgreSQL proof for ADR 0252 is in #763 (v2.22.1,
feat/voice-history-live-postgres-v2221@ 1c9986c).The tests cover A → B → A at before/between/after cutoffs, concurrent
voc_type_codeupdates, GiST non-overlap, closing a matching additional assignment, and 0237→0243 trigger replay. They skip without PostgreSQL.Do not close this issue until #763 lands through the protected squash-merge gate with independent exact-head APPROVE. This session will not self-approve.
test(voice): prove ADR 0252 A→B→A history on live PostgreSQL (#763)