Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
5723218
feat(identity): persist append-only account-link history
cursoragent Aug 16, 2026
93ecaa2
docs(identity): name Active PR #114 on identity-link persistence
cursoragent Aug 16, 2026
2eb0b63
docs(adr): restore ADR-0020 after empty-file commit
cursoragent Aug 16, 2026
070187e
fix(identity): persist unlink and relink in lifecycle order
cursoragent Aug 16, 2026
2f4cfe4
feat(identity): recover participant from current account subject
cursoragent Aug 16, 2026
7ecf481
docs(identity): reserve 0022 for identity-link persistence
cursoragent Aug 16, 2026
729f3c6
chore: stop tracking Rust target artifacts
cursoragent Aug 16, 2026
a1bd393
fix(identity): treat unterminated history as subject source of truth
cursoragent Aug 16, 2026
7b92a66
docs(identity): prefer history-sourced identity-link successor
cursoragent Aug 16, 2026
82b9d95
fix(identity): bind link-end rows to the same participant
cursoragent Aug 16, 2026
1dd1d8b
test(identity): drop duplicate beta participant helper
cursoragent Aug 16, 2026
431eeca
fix(identity): restore current projection on exact replay
cursoragent Aug 16, 2026
f4b7817
docs(identity): name Active PR #147 on identity-link persist
cursoragent Aug 16, 2026
55c5109
feat(identity): persist dual-proof write and recover commands
cursoragent Aug 16, 2026
078211d
docs(identity): name write-path successor of #147
cursoragent Aug 16, 2026
b70853c
docs(identity): name Active PR #160 on write-path persist
cursoragent Aug 16, 2026
fb0ca5b
docs(identity): keep #158 restore and #160 write-path distinct
cursoragent Aug 16, 2026
d2e1f15
fix(identity): reject rebound recover after unlink+relink
cursoragent Aug 16, 2026
d0c0cb3
docs(identity): name Active PR #176 on recover binding
cursoragent Aug 16, 2026
ce94cb1
feat(identity): persist authorized unlink from current proof
cursoragent Aug 16, 2026
ca29865
docs(identity): name Active PR #206 on hosted unlink
cursoragent Aug 16, 2026
7e411de
feat(identity): bind account capability to current link event
cursoragent Aug 16, 2026
a495e7c
docs(identity): name Active PR #222 on account capability
cursoragent Aug 16, 2026
c3531c7
test(identity): prove persisted unlink drops account capability
cursoragent Aug 16, 2026
a667395
test(identity): prove same-subject relink drops ended capability
cursoragent Aug 16, 2026
2d4676e
docs(identity): name Active PR #236 on unique event bind
cursoragent Aug 16, 2026
98a46a6
Merge remote-tracking branch 'origin/main' into HEAD
seonghobae Aug 26, 2026
f77c32d
docs(erd): keep assessment_participant persist/reload honesty marker
seonghobae Aug 26, 2026
33b0c38
test(identity): require clean state after failed link persist
seonghobae Aug 27, 2026
7765cd1
fix(identity): keep caller state clean on persist failure
seonghobae Aug 27, 2026
30d5fb3
test(identity): keep failed persist caller state clean
seonghobae Aug 27, 2026
9b845c3
test(identity): serialize failed-persist PostgreSQL fixture
seonghobae Aug 27, 2026
04f5f26
fix(ci): quote PostgreSQL in clippy docs
seonghobae Sep 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
/target/
/.netlify
7 changes: 5 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ All notable product and architecture changes are recorded here. Releases use imm
## Unreleased

### Added
- Active PR #248 adds PostgreSQL 18 durability for immutable normalized longitudinal observation evidence: exact source identity, separate validity/recorded/received/ingested clocks, explicit membership shares whose deferred transaction invariant totals 10,000 basis points, exact replay, tenant isolation, and fail-closed rebinding/immutability. This entry is active-PR evidence only and is not a protected-main or release claim.
- Active PR #287 rejects padded or otherwise noncanonical published narrative, style-mapping, interpretation-unit, and approved-selection references before deterministic rendering. Numeric score authority and the protected-main narrative boundary are unchanged; this is active-PR evidence only and not a release claim.
- Hosted dual-proof account-link write, recover, and unlink commands so a transport adapter can authorize both proofs, persist the append-only history, recover the same product-owned participant from a still-valid Keyverse account proof after restart, and end that current binding from the same still-valid proof. Expired proofs fail before persist, lookup, or unlink. A rebound current subject cannot be unlinked with an ended subject's proof. A later account-linked capability is bound to the current `link_event_ref`, so unlink, rebound, or a later same-subject attach under a new event invalidates a previously issued grant. HTTP transport and live token verification remain target.
- PostgreSQL 18 append-only participant identity-link persistence so a dual-proof account link, unlink, and relink survive process restart without rewriting the product-owned participant reference. Persist applies each link and then its matching ends in one transaction, exact replay is idempotent, and exact replay also restores or clears the derived current projection so operator repair cannot leave a missing or stale unique enforcer. Conflicting evidence fails closed, and one unterminated issuer-scoped subject cannot belong to two participants even when the derived current projection is missing. A returning account recovers the same `participant_ref` from that history. A link-end cannot attach to another participant's link.
- Merged #248 adds PostgreSQL 18 durability for immutable normalized longitudinal observation evidence: exact source identity, separate validity/recorded/received/ingested clocks, explicit membership shares whose deferred transaction invariant totals 10,000 basis points, exact replay, tenant isolation, and fail-closed rebinding/immutability.
- Merged #287 rejects padded or otherwise noncanonical published narrative, style-mapping, interpretation-unit, and approved-selection references before deterministic rendering. Numeric score authority and the protected-main narrative boundary are unchanged.
- Personal result export delivery authorization (`authorize_result_export_read`) reuses the stored-record `ReadOwnResult` check on the product-owned participant and immutable result, then requires the export's result snapshot reference and copied participant reference to match that exact snapshot. A cross-tenant caller fails closed with the ordinary result-authorization denial before export-binding details are evaluated, so a mismatched export is not an existence oracle. No new permission or persistence is introduced; authorized HTTP transport ships through merged `src/result_export_http.rs` and `openapi/result-exports.yaml`. This is the post-#231 export-delivery guard (ADR-0010 provenance; ADR-0003 tenant-bound authorization).
- Personal result export copies one immutable snapshot into JSON and a human-readable report so a purchaser can archive the same Extraversion estimate, standard error, and version provenance they were shown. The owner participant reference stays in both artifacts. Abstained or failed constructs keep their disposition and do not receive an invented score. Approved limitation text is required.
- Product and technical gap baseline records the exact protected-main snapshot, current participant-visible gaps, all open repository PRs, issue #260 dependency, and the next executable delivery loop.
Expand Down Expand Up @@ -73,6 +75,7 @@ All notable product and architecture changes are recorded here. Releases use imm

### Fixed

- Hosted account-link recover now keeps a loaded participant only when its current tenant, issuer, and subject still match the still-valid proof, so a concurrent unlink+relink cannot hand back a rebound identity.
- Stale shorter assessment-session command history now fails closed instead of rewinding the current-state projection, so a later Pause/Resume still reloads after a rejected Activate-only persist.
- Same-enrollment longitudinal ingest now keeps a later iOS copy and a later Android ping as distinct source identities instead of treating them as a rewrite of the first row.
- Outbox delivery-lease expiry recovery now classifies liveness from the PostgreSQL clock, so a future caller timestamp cannot steal a still-live exclusive lease.
Expand Down
Loading
Loading