Story-2502 · functions lane · RFD-DOC-006 D7 / ER-07
One claim, every occurrence, no graph double
The authoritative write
Deep Read judge admits an assertion row
↓ deterministic V-CITE assembler
one embedding input per Evidence occurrence
↓ Bedrock Titan embedding (data-plane)
ops.deep_read_runs.envelope + Reading Findings + context.assertions
↓ one PostgreSQL transaction
deep_read.completed outbox event
The model proposes speaker, subject, predicate, a discriminated text/date/amount object, polarity, modality, and one or more quoted evidence spans. It cannot choose side. The projector inherits declared_side from the locked document row, or records side_unconfirmed.
Identity preserves both inks
claim_id is UUIDv5 over normalized claim content, excluding run IDs and source coordinates. occurrence_id adds document, extraction version, anchor, and character range. Repeating an identical claim at two anchors therefore stores one stable claim identity and two independently citable occurrences.
Postgres is the only assertion truth
The migration replaces the old card-normalized table in place, drops the attribute registry, and removes every Assertion node, edge, reader, writer, and reconciliation path from Neptune. Bundle and Insight readers now consume v2 occurrence rows directly. There is no fixture table or dual-serving bridge.
Trust boundaries
Every occurrence carries the extraction version, anchor, exact quote, inherited privilege, model ID, and a 1024-wide vector. RLS is forced, all serving indexes lead with firm, and strategy documents never project assertions. A record-to-strategy correction removes the derived pool rows.
Capability proof
The deploy canary invokes the real embedding adapter. Its preflight simulates bedrock:InvokeModel against the exact Titan model ARN. The linked infra twin, pramaan-spec#2576, owns that grant and a planted-negative/live red-path check.