PR: #652: feat(documents): render the Deep Read envelope [Story-2501] by @pramaan-board-bot[bot]
View PR →

Story 2501: Insights opens the Deep Read envelope

Mental model: the old brief/card was a cover note. Insights now opens the judged reading packet for one exact extraction: summary first, sections in document order, attention in the margin, and sparse findings pinned back to Original.

The live data path

Insights RSC
  → current Anchor view (exact extractionVersion)
  → GET /app/documents/{id}/deep-read-envelope?extractionVersion={uuid}
  → generated DeepReadEnvelope schema validation
  → server QueryClient prefetch + dehydrate
  → useAppGetDocumentDeepReadEnvelope() from the hydrated cache

The browser uses the existing /app/documents/* BFF mapping. The new /api/internal/documents/[docId]/deep-read-envelope proxy allowlists only extractionVersion, forwards Clerk authentication server-side, and validates the response against the generated contract before it reaches UI.

What counsel sees

Envelope field Insights rendering
summary The JUDGE summary appears first in the single elevated hero. It was generated last, after rulings.
section rows Semantic label, title, page range, materiality note, and a jump to the matching Original page/section.
attention rows Critical / Read / Skim / Skip grade, read order, time, and reason in the section's left margin. Suppressed low-confidence grades stay hidden.
finding rows Type, confidence, judged statement, V-CITE quote, and a source-page pin. Assertions and coverage receipts remain in the envelope but are not expanded into extra UI.

Truthful first run

A missing successful envelope is a typed pramaan.deep_read.envelope_not_found 404, not a broken card. The route renders Not yet read. Other failures stay failures and show an inline retry surface; they are never mislabeled as an unread document.

Files changed

90 file(s), +4887 / -1867 lines

Path Role + -
messages/en.jsonConfig+25-12
messages/hi.jsonConfig+25-12
openapi/app-api.jsonConfig+623-5
openapi/permission-map.jsonConfig+2-2
src/app/[locale]/(workspace)/matters/[matterId]/record/doc/[documentId]/insights/page.tsxApp route+40-47
src/app/[locale]/(workspace)/matters/[matterId]/record/doc/[documentId]/layout.tsxApp route+2-2
src/app/api/internal/documents/[docId]/deep-read-envelope/route.tsApp route+5-0
src/components/documents/viewer/deep-read-findings.stories.tsxComponent+61-0
src/components/documents/viewer/deep-read-findings.tsxComponent+66-0
src/components/documents/viewer/deep-read-presentation.test.tsComponent+101-0
src/components/documents/viewer/deep-read-presentation.tsComponent+95-0
src/components/documents/viewer/deep-read-section.stories.tsxComponent+83-0
src/components/documents/viewer/deep-read-section.tsxComponent+92-0
src/components/documents/viewer/document-insights-dossier.stories.tsxComponent+109-138
src/components/documents/viewer/document-insights-dossier.tsxComponent+79-84
src/components/documents/viewer/document-insights-live.tsxComponent+28-155
src/components/documents/viewer/insights-fixtures.tsComponent+0-147
src/components/documents/viewer/insights-presentation.tsComponent+0-97
src/components/documents/viewer/insights-types.tsComponent+0-51
src/components/documents/viewer/insights/dossier-assertions.tsxComponent+0-93
src/components/documents/viewer/insights/dossier-audit.tsxComponent+0-69
src/components/documents/viewer/insights/dossier-contradictions.tsxComponent+0-87
src/components/documents/viewer/insights/dossier-details.tsxComponent+0-115
src/components/documents/viewer/insights/dossier-notes.tsxComponent+0-71
src/components/documents/viewer/insights/dossier-outline.tsxComponent+0-68
src/components/documents/viewer/insights/dossier-read.tsxComponent+0-48
src/components/documents/viewer/insights/dossier-what-matters.tsxComponent+0-57
src/gen/client/appGetDocumentCard.tsGenerated contract+0-64
src/gen/client/appGetDocumentDeepReadEnvelope.tsGenerated contract+67-0
src/gen/client/index.tsGenerated contract+1-1
src/gen/hooks/index.tsGenerated contract+8-8
src/gen/hooks/useAppGetDocumentCard.tsGenerated contract+0-128
src/gen/hooks/useAppGetDocumentCardSuspense.tsGenerated contract+0-126
src/gen/hooks/useAppGetDocumentDeepReadEnvelope.tsGenerated contract+142-0
src/gen/hooks/useAppGetDocumentDeepReadEnvelopeSuspense.tsGenerated contract+143-0
src/gen/index.tsGenerated contract+64-30
src/gen/schemas/deepReadAssertionRow.jsonGenerated contract+94-0
src/gen/schemas/deepReadAttentionGrade.jsonGenerated contract+5-0
src/gen/schemas/deepReadAttentionRow.jsonGenerated contract+78-0
src/gen/schemas/deepReadCoverageOmission.jsonGenerated contract+13-0
src/gen/schemas/deepReadCoverageReceipt.jsonGenerated contract+47-0
src/gen/schemas/deepReadEnvelope.jsonGenerated contract+544-0
src/gen/schemas/deepReadEnvelopeRow.jsonGenerated contract+382-0
src/gen/schemas/deepReadEvidenceSpan.jsonGenerated contract+37-0
src/gen/schemas/deepReadExaminedReceipt.jsonGenerated contract+29-0
src/gen/schemas/deepReadFindingRow.jsonGenerated contract+87-0
src/gen/schemas/deepReadProposedRow.jsonGenerated contract+323-0
src/gen/schemas/deepReadSectionRow.jsonGenerated contract+46-0
src/gen/schemas/deepReadTrace.jsonGenerated contract+25-0
src/gen/types/AppGetDocumentCard.tsGenerated contract+0-69
src/gen/types/AppGetDocumentDeepReadEnvelope.tsGenerated contract+79-0
src/gen/types/DeepReadAssertionRow.tsGenerated contract+66-0
src/gen/types/DeepReadAttentionGrade.tsGenerated contract+9-0
src/gen/types/DeepReadAttentionRow.tsGenerated contract+66-0
src/gen/types/DeepReadCoverageOmission.tsGenerated contract+26-0
src/gen/types/DeepReadCoverageReceipt.tsGenerated contract+35-0
src/gen/types/DeepReadEnvelope.tsGenerated contract+46-0
src/gen/types/DeepReadEnvelopeRow.tsGenerated contract+21-0
src/gen/types/DeepReadEvidenceSpan.tsGenerated contract+43-0
src/gen/types/DeepReadExaminedReceipt.tsGenerated contract+37-0
src/gen/types/DeepReadFindingRow.tsGenerated contract+50-0
src/gen/types/DeepReadProposedRow.tsGenerated contract+24-0
src/gen/types/DeepReadSectionRow.tsGenerated contract+52-0
src/gen/types/DeepReadTrace.tsGenerated contract+25-0
src/gen/types/index.tsGenerated contract+31-11
src/gen/zod/{appGetDocumentCardSchema.ts => appGetDocumentDeepReadEnvelopeSchema.ts}Generated contract+39-32
src/gen/zod/deepReadAssertionRowSchema.tsGenerated contract+38-0
src/gen/zod/deepReadAttentionGradeSchema.tsGenerated contract+15-0
src/gen/zod/deepReadAttentionRowSchema.tsGenerated contract+53-0
src/gen/zod/deepReadCoverageOmissionSchema.tsGenerated contract+21-0
src/gen/zod/deepReadCoverageReceiptSchema.tsGenerated contract+32-0
src/gen/zod/deepReadEnvelopeRowSchema.tsGenerated contract+28-0
src/gen/zod/deepReadEnvelopeSchema.tsGenerated contract+48-0
src/gen/zod/deepReadEvidenceSpanSchema.tsGenerated contract+24-0
src/gen/zod/deepReadExaminedReceiptSchema.tsGenerated contract+23-0
src/gen/zod/deepReadFindingRowSchema.tsGenerated contract+35-0
src/gen/zod/deepReadProposedRowSchema.tsGenerated contract+43-0
src/gen/zod/deepReadSectionRowSchema.tsGenerated contract+33-0
src/gen/zod/deepReadTraceSchema.tsGenerated contract+21-0
src/gen/zod/index.tsGenerated contract+24-10
src/lib/documents/deep-read-errors.test.tsLibrary+29-0
src/lib/documents/deep-read-errors.tsLibrary+14-0
src/lib/documents/gateway-views.test.tsLibrary+23-0
src/lib/documents/gateway.tsLibrary+26-0
src/lib/documents/get-anchor-view.tsLibrary+11-0
src/lib/documents/route-helper.test.tsLibrary+28-2
src/lib/documents/route-helper.tsLibrary+22-2
src/lib/gateway.tsLibrary+22-8
src/lib/surface-registry/route-registry.tsLibrary+2-2
tests/unit/lib/gateway.test.tsTest+52-14

Storybook states

Wave proof boundary

T3h proves app transport, contract validation, rendering, i18n, and Storybook states. T3e / Story-2497 owns the signed-in staging upload → glance → envelope liveness smoke and silent-skip census. T3f / Story-2498 owns the Deep Read schema, V-CITE, coverage, normalization, and injection-refusal evals. This app PR does not claim either sibling gate.

Deliberate scope boundary

This is a read-only Insights cutover. Finding verdict lifecycle, unread-critical counters, Original-page gutters, and exact character highlighting remain with T5a/T5b. The existing page/section permalink is the supported pin seam here. The new BFF route is covered by the shared gateway instrumentation; no manual span is added under pramaan-docs ADR-124.