---
id: WF-PFM-LLM-010
title: Read captured content under an access grant
trigger: Read redacted model evidence through privileged access.
product_area: platform
module: llm
revision: 1
status: draft
design_intent: proposed
origin: >-
  D-1 (Andrew, 2026-10-18) makes capture universal; the read's controls follow the security chapter of the
  observability proposal and close compliance exception EX-AI-002
  (services-platform:docs/compliance/exceptions.md, the EX-AI-002 row); the controls' milestone PLAT-M2 is
  proposed.
implementation_evidence: partially-observed
inference: []
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
implements:
  - CAP-PFM-LLM-016
crosses:
  - SVC-PFM-LLM-llm
idempotency: >-
  Each eligible answer or missing-grant refusal appends its own audit. Repeating a content read is another
  audited access.
concurrency: >-
  Access is checked before the body fetch; revocation during that same fetch is not rechecked. Independent
  reads each obtain their own audit result.
hops:
  - 'n': 1
    actor_or_service: Rhythm HQ console
    action: Display capture status and keep privileged content-reading buttons disabled.
    anchor: 'react-console:components/console/hq/ai-usage/request/evidence-card.tsx:EvidenceCard'
    seam: sync
    on_failure: There is no implemented console body-read action.
    left_inconsistent: No content is opened by the screen.
    observer: 'Content-read response, API logs and the audit trail where this path writes it.'
    provenance: observed
    source: 'react-console:components/console/hq/ai-usage/request/evidence-card.tsx:EvidenceRow'
  - 'n': 2
    actor_or_service: LLM usage API
    action: Require the sensitive content permission and a valid body kind.
    anchor: 'services-platform:modules/llm/aws/api/llm-usage.routes.ts:getHqTenantLlmUsageInvocationEvidence'
    seam: sync
    on_failure: Reject route-level permission and input failures before the content audit path.
    left_inconsistent: Those rejections produce no content-read audit entry.
    observer: 'Content-read response, API logs and the audit trail where this path writes it.'
    provenance: observed
    source: 'services-platform:modules/llm/aws/api/llm-usage-api-mapper.ts:mapEvidenceBodyKind'
  - 'n': 3
    actor_or_service: Evidence access service and Security staff-access reader
    action: Resolve the organization and require an active approved or emergency access grant.
    anchor: 'services-platform:modules/llm/services/evidence/evidence-access.ts:readInvocationEvidence'
    seam: sync
    on_failure: Audit a missing-grant refusal and deny access; an audit failure propagates.
    left_inconsistent: No body is returned; failed audit persistence can leave the refusal unaudited.
    observer: 'Content-read response, API logs and the audit trail where this path writes it.'
    provenance: observed
    source: 'services-platform:modules/llm/services/evidence/evidence-access.ts:EVIDENCE_GRANT_KINDS'
  - 'n': 4
    actor_or_service: Evidence access service and evidence store
    action: 'Read the scoped request and body, translating absent objects to purged and pending capture to skipped.'
    anchor: 'services-platform:modules/llm/services/evidence/evidence-access.ts:readInvocationEvidence'
    seam: sync
    on_failure: Return missing-record or storage/parsing errors without a content-read audit.
    left_inconsistent: Such failed reads leave no entry in the AI control trail.
    observer: 'Content-read response, API logs and the audit trail where this path writes it.'
    provenance: observed
    source: 'services-platform:modules/llm/services/evidence/evidence-access.ts:readInvocationEvidence'
  - 'n': 5
    actor_or_service: Evidence access service
    action: Append the successful content-read audit before returning body or status without location.
    anchor: 'services-platform:modules/llm/services/evidence/evidence-access.ts:evidenceReadAuditEvent'
    seam: sync
    on_failure: Withhold the answer when auditing fails.
    left_inconsistent: No body leaves through this path without a completed successful audit write.
    observer: 'Content-read response, API logs and the audit trail where this path writes it.'
    provenance: observed
    source: 'services-platform:modules/llm/services/evidence/evidence-access.ts:readInvocationEvidence'
branches: []
waits: []
evidence:
  - >-
    services-platform at ad3f6a6: modules/llm/aws/api/llm-usage.routes.ts;
    services/evidence/evidence-access.ts, evidence-store.ts; aws/logic/llm-runtime.access.ts
    (applyLlmEvidenceReadAccess); aws/platform.service.ts (HQ_LLM_USAGE_PERMISSIONS);
    docs/compliance/exceptions.md (EX-AI-002, EX-AI-003); docs/llm.md#Reading a body, and what deletes it.
  - 'react-console at baf6dae: components/console/hq/ai-usage/request/evidence-card.tsx; lib/hq/staff-roles.ts.'
controls: [TC-AVL-005, TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-AZ-005, TC-DAT-001, TC-DAT-003, TC-DAT-004, TC-IAM-001, TC-IAM-002, TC-IAM-003, TC-IAM-004, TC-IAM-005, TC-LOG-001, TC-LOG-002, TC-LOG-003, TC-LOG-004, TC-LOG-005, TC-MON-003, TC-PI-001, TC-PI-002, TC-PI-003, TC-PI-005, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-VEN-001, TC-VEN-002, TC-VEN-003]
---

# Read captured content under an access grant

## What It Does

Usage metadata can be read without opening content. The dedicated body route additionally requires a qualifying staff grant and successful audit, while console read controls remain disabled.

## The Flow

```mermaid
flowchart TD
  H1["Display capture status and keep privileged content-reading buttons disabled."]
  H2["Require the sensitive content permission and a valid body kind."]
  H1 --> H2
  H3["Resolve the organization and require an active approved or emergency access grant."]
  H2 --> H3
  H4["Read the scoped request and body, translating absent objects to purged and pending capture to skipped."]
  H3 --> H4
  H5["Append the successful content-read audit before returning body or status without location."]
  H4 --> H5
```

Resolve organization, evaluate the grant, read the selected body or status and append audit before returning the answer.

## When Something Fails

Missing-grant refusals are audited. Route refusals, absent requests and storage failures can remain unaudited. A successful audit failure prevents content return.

## Open Design Questions

Product must decide the complete read-audit boundary before the content controls are enabled.
