Audit-Log Retention & Immutability Policy — PROJECT VELA
Status: DESIGNED/ROADMAPPED unless marked IMPLEMENTED. The core investigation stack (LangGraph + Neo4j + Qdrant + 3 FastMCP servers + FastAPI) is implemented and tested, and it emits an append-only investigation audit trail. The retention & immutability controls in this document — governed retention windows, tamper-evident storage, review-board export bundles, and legal-hold handling — are a separate surface and are mostly not yet implemented. Each control below carries an explicit status label.
Last reviewed: (owner to date — placeholder, not yet reviewed)
VELA is ground-segment, advisory-only software. It investigates telemetry deviations and
drafts recovery procedures for a human to execute; it holds zero commanding authority in v1.
Flight-software audit regimes (DO-178C, NASA NPR 7150.2, ECSS review boards) do not bind it —
see docs/assurance/classification-and-safety-case.md. What we borrow from them in spirit is
one idea: the investigation record must be complete enough that an anomaly review board can
reconstruct exactly what the tool saw, concluded, and recommended, and who approved it.
1. Purpose & scope
| What this governs | The per-investigation audit log — the review-board artifact for one anomaly investigation — and the OpenTelemetry (OTel) trace backbone it is built on. |
| Why it exists | Anomaly review boards (customer-side and, later, ISRO/NSIL) require a defensible, tamper-evident record. VELA’s core value claim (grounded, cited reasoning) is only credible if the record proving it is itself trustworthy. |
| Out of scope | Raw customer telemetry retention (see DATA-HANDLING.md); the design-graph / KG provenance (see docs/design/03-DATA-SPEC.md); export-control aspects (see EXPORT-CONTROL.md); application/infra logs that are not the investigation record (ordinary ops logging, separate lifecycle). |
| Related invariant | Architecture Audit Invariant #4: Full audit log (every tool call + hypothesis transition) persisted per investigation. This policy is how #4 is operationalized. |
2. What is logged
The audit log is append-only and scoped to a single investigation (thread_id). Every record
carries tenant_id + satellite_id + investigation_id (mandatory from day one — see §6).
| Event class | Captured fields (intended) | Status |
|---|---|---|
| MCP tool call | server, tool, request args, response digest, latency, sha256 of any returned DocSection, trace/span IDs |
DESIGNED |
| Telemetry read | channel(s), time window, sample count, detector, source store — establishes the provenance set for Invariant #1 (no asserted value without a backing telemetry call) | DESIGNED |
| Hypothesis transition | from-state → to-state, evidence refs, confidence, which node emitted it, OpenCase/LinkEvidence/inverse operator applied to the overlay |
DESIGNED |
| Citation | Citation{kind, ref, sha256}, resolver verdict from vela/audit/citation_check.py (valid / invalid / UNGROUNDED) |
DESIGNED |
| Approval / interrupt | LangGraph interrupt() gate reached, operator identity + RBAC role, decision (approve/reject/edit), resumed checkpoint ID |
DESIGNED |
| Verdict & report | final InvestigationReport digest, audit_log_ref, procedure-draft acceptance state |
DESIGNED |
| Mode & model | cloud vs airgap, model/router identity, config hash — so a record proves which stack produced it |
DESIGNED |
Not logged / minimized: raw telemetry values are not duplicated into the audit log beyond what a claim cites (the log references the telemetry read, it is not a second telemetry store); model chain-of-thought scratch text is not persisted as record-grade content. Operator identity is the only PII in the log — see §7.
3. Immutability & tamper-evidence
Intent (DESIGNED): the audit log is append-only and tamper-evident, not merely “write-protected by convention.”
| Mechanism | Description | Status |
|---|---|---|
| Append-only writes | Records are only ever appended; no in-place update or delete API exists on the audit path. Corrections are new records that reference the superseded one. | DESIGNED |
| Content addressing | Each cited DocSection and each report is identified by sha256; the audit record stores the hash, not a mutable pointer. A changed source ⇒ a changed hash ⇒ visible. |
DESIGNED |
| Hash-chaining | Each audit record includes the hash of the prior record for that investigation (a per-investigation chain), so any excision or reordering is detectable by re-walking the chain. | ROADMAPPED |
| Overlay invertibility | KG overlay writes use a typed invertible operator vocabulary; overturned hypotheses invert rather than erase, so the reasoning history is preserved by construction. | DESIGNED |
| WORM / object-lock storage | Archive tier written to object storage with an object-lock / write-once retention setting for the contracted window. | ROADMAPPED |
| Cryptographic signing / external anchoring | Periodic signing of chain heads (and, if a customer requires it, external timestamp anchoring). | ASPIRATIONAL |
Honest limits. Until hash-chaining and object-lock ship, immutability is design intent enforced by API surface and access control, not a cryptographic guarantee. We will not describe the log as “immutable” to a customer until the chaining + WORM controls above are IMPLEMENTED; the correct pre-build phrasing is “append-only by design, tamper-evidence roadmapped.”
4. Relationship to time-travel replay (LangGraph checkpoints)
Two distinct things share one investigation identity; do not conflate them.
| Audit log | LangGraph checkpoints | |
|---|---|---|
| Purpose | Review-board evidence: what happened and why | Durable execution + forensic replay of the run |
| Backing | OTel traces (backbone) + append-only records | Postgres checkpointer keyed by thread_id |
| Mutability | Append-only, tamper-evident (§3) | Operational state; may be pruned per §5 |
| Consumer | Auditors, review boards, incident response | Operators (“replay this investigation” UI), engineers |
How they relate (DESIGNED). Checkpoints make the replay-this-investigation product feature possible — an operator or board member can step the graph forward from any saved checkpoint and watch the reasoning unfold. The audit log is the authoritative record; checkpoints are a convenience for reconstruction. Where retained together, a replay must reproduce the audit log’s recorded decisions — a divergence is itself a sev-worthy integrity signal. Checkpoints are not a substitute for the audit log and may have a shorter retention window (they are heavier and operational); the audit log outlives them.
5. Retention windows
All numbers below are defaults. The customer sets the number in the pilot/commercial contract; these are the values applied when the contract is silent.
| Tier | Default window | What lives here | Notes |
|---|---|---|---|
| Hot (query-fast) | 90 days | Full audit log + OTel traces for recent investigations | Sized for active review boards + support. Customer-configurable. |
| Cold / archive | per customer contract (default target 7 years where a customer wants a long anomaly-history retention; otherwise contract-set) | Compressed, WORM-intended archive of the audit log | The board artifact must outlive the hot window; long tail is a customer decision, not ours to assume. |
| LangGraph checkpoints | 30 days (default) | Replayable run state | Shorter than the audit log on purpose; replay is a convenience, the log is the record. |
| OTel raw spans (debug detail) | 30 days (default) | High-cardinality span detail for engineering | The audit-grade projection of the trace is retained on the audit-log schedule, not this one. |
Configurability & floors. Retention is set per tenant. A customer may lengthen archive retention freely. Shortening below a regulatory or contractual floor (e.g. a review-board obligation) requires explicit written sign-off recorded in the contract. Retention timers are enforced by scheduled lifecycle jobs (ROADMAPPED); until built, no automated expiry runs and records simply accumulate on the pilot’s encrypted volume.
Status: retention scheduling and tiering — DESIGNED, not implemented.
6. Tenant isolation
| Control | Description | Status |
|---|---|---|
| Mandatory keys | tenant_id + satellite_id present in every contract, key, MCP request, and audit record from day one. No unkeyed audit record can exist. |
DESIGNED (invariant) |
| Per-customer encrypted volumes | Each customer’s audit log lives on its own encrypted volume; no shared audit store across tenants. | DESIGNED |
| MCP as sole data boundary | Agents never touch stores directly; all data access (and thus all audit-relevant reads) flows through the three FastMCP servers, import-linted. This makes the audit boundary a single enforceable choke point per tenant. | DESIGNED |
| Query scoping | Every audit query is tenant-scoped by construction; cross-tenant read is not an available operation. | ROADMAPPED |
| Airgap / sovereign mode | In airgap mode the entire audit log stays inside the customer’s no-egress boundary; nothing leaves. One config flag; no cloud audit copy exists. |
DESIGNED |
7. PII minimization
The audit log is deliberately PII-poor. The only personal data it contains is operator identity — who ran an investigation and who approved a procedure release (RBAC roles operator / reviewer / admin). This is unavoidable: attributing approvals is the point of the approval gate.
| Principle | Application | Status |
|---|---|---|
| Minimize | Store the minimum identity needed to attribute an action (a stable operator ref + role), not a personnel profile. No contact details, no free-text about people. | DESIGNED |
| Pseudonymize where possible | Prefer a tenant-scoped operator ID over raw name/email in the record body; resolve to a human identity only through the customer’s own directory. | ROADMAPPED |
| DPDP alignment | Handling of operator identity follows DATA-HANDLING.md and India’s DPDP posture (purpose limitation, storage limitation via §5 windows, tenant-controlled deletion). VELA is not yet assessed against any certification — see COMPLIANCE-ROADMAP.md. |
DESIGNED |
| No telemetry PII | Telemetry and KG content are spacecraft engineering data, not personal data; the log references them, it does not enrich them with personal data. | DESIGNED |
See DATA-HANDLING.md and docs/policies/rbac.md for the identity model.
8. Export for review boards
The audit log’s reason to exist is to be handed to a review board.
| Capability | Description | Status |
|---|---|---|
| Investigation export bundle | One command produces a self-contained bundle for an investigation_id: the InvestigationReport, the full ordered audit log, resolved citations (with sha256), approval trail, and the mode/model provenance. |
DESIGNED |
| Integrity manifest | The bundle ships with a manifest of record hashes (and, once §3 chaining lands, the chain head) so a recipient can independently verify nothing was altered. | ROADMAPPED |
| Human-readable + machine-readable | Board-facing PDF/HTML rendering plus a structured (JSON) form for downstream tooling. | ROADMAPPED |
| Replay handoff | Optionally, a checkpoint reference enabling “replay this investigation” against a VELA instance (subject to checkpoint retention, §5). | DESIGNED |
| Scope discipline | Export is single-tenant, single-investigation by default; bulk/cross-investigation export is an admin action, itself audited. | DESIGNED |
Sev-1 tie-in. A citation that fails to resolve in an exported bundle (a hallucinated reference
reaching a review board) is a sev-1 under docs/policies/incident-response-citation-integrity.md.
Citation integrity is 100% at every PRD tier; the audit log is the evidence that it held.
9. Deletion & zero-copy-post-pilot alignment
| Control | Description | Status |
|---|---|---|
| Contractual zero-copy post-pilot | The default pilot contract states VELA keeps zero copies of customer data after the pilot. The audit log is customer data and is covered: on pilot close it is exported to the customer (if they want it) and then destroyed on our side. | DESIGNED |
| Tenant-scoped deletion | Deletion operates per tenant_id; destroying a tenant destroys its encrypted volume, audit log included, with no cross-tenant residue. |
DESIGNED |
| Retention-expiry deletion | Records past their §5 window are purged by scheduled lifecycle jobs; archive-tier WORM records are destroyed only at end-of-retention, not before. | ROADMAPPED |
| Deletion is itself recorded | A destruction event (what tenant, what window, when, by whom) is logged in a separate operational record so the fact of deletion is provable even though the content is gone. | ROADMAPPED |
| Tension to manage honestly | Immutability/WORM (§3) and deletion-on-demand pull in opposite directions. Resolution: immutability holds within a retention window; deletion happens at the window boundary or at pilot close per contract. We do not offer selective mid-window record deletion — that would defeat the tamper-evidence the log exists to provide. A legal-hold that must override a scheduled deletion is a manual, documented exception. | DESIGNED |
10. Status summary
| Control area | Status |
|---|---|
| Append-only audit log, per-investigation | DESIGNED |
| OTel trace backbone (Week-1 instrumentation intent) | DESIGNED |
Content-addressed (sha256) citations |
DESIGNED |
| Hash-chaining / tamper-evidence | ROADMAPPED |
| WORM / object-lock archive | ROADMAPPED |
| Cryptographic signing / external anchoring | ASPIRATIONAL |
| Retention tiering + scheduled expiry | DESIGNED (jobs ROADMAPPED) |
| Tenant isolation via mandatory keys + per-customer volumes | DESIGNED |
| Airgap: no audit egress | DESIGNED |
| PII minimization (operator identity only), DPDP alignment | DESIGNED |
| Review-board export bundle + integrity manifest | DESIGNED / manifest ROADMAPPED |
| Zero-copy-post-pilot deletion | DESIGNED (contractual) |
The retention/immutability controls in this table are mostly not yet IMPLEMENTED — the core stack emits an append-only investigation audit trail, but the governed retention, tamper-evidence, and export controls above are the specification we are building against, not yet a description of a running governed-retention system. Each row’s status label is authoritative.
References
SECURITY.md · COMPLIANCE-ROADMAP.md · EXPORT-CONTROL.md · DATA-HANDLING.md · CLAUDE.md ·
docs/design/02-ARCHITECTURE.md · docs/design/03-DATA-SPEC.md · docs/design/04-MCP-SERVERS.md ·
docs/design/06-TEST-PLAN.md · docs/design/10-SCALE-ARCHITECTURE.md ·
docs/assurance/classification-and-safety-case.md · docs/assurance/hazard-analysis.md ·
docs/assurance/rtm.csv · docs/policies/rbac.md ·
docs/policies/incident-response-citation-integrity.md
