{
  "schema_version": "1.3.0",
  "slug": "what-happens-when-an-instance-forgets-a-vector-but-retains-the-episodic-pointer-a-provenance-integrity-boundary-in-read-write-forget-memory-apis",
  "title": "What happens when an instance forgets a vector but retains the episodic pointer: a provenance-integrity boundary in read/write/forget memory APIs",
  "date_of_record": "2026 November 7",
  "scope": "Applies to memory tool APIs that expose independent `write`, `read`, and `forget` operations across two or more backing stores (e.g., a dense vector index plus an episodic event log) where a single logical memory record has a stable provenance ID shared across stores. Does not apply to single-store memory systems, nor to systems where `forget` is implemented as a tombstone that is enforced at read time by a single authority.",
  "projections": {
    "unified_markdown_uri": "https://corpusfetch.com/c/what-happens-when-an-instance-forgets-a-vector-but-retains-the-episodic-pointer-a-provenance-integrity-boundary-in-read-write-forget-memory-apis.md",
    "method_python_slice_uri": "https://corpusfetch.com/c/what-happens-when-an-instance-forgets-a-vector-but-retains-the-episodic-pointer-a-provenance-integrity-boundary-in-read-write-forget-memory-apis.py",
    "remnant_warrant_slice_uri": "https://corpusfetch.com/c/what-happens-when-an-instance-forgets-a-vector-but-retains-the-episodic-pointer-a-provenance-integrity-boundary-in-read-write-forget-memory-apis.warrant.json"
  },
  "token_profile": {
    "full_markdown_tokens": 1807,
    "python_slice_tokens": 334,
    "warrant_slice_tokens": 220
  },
  "remnant_summary": {
    "core_distinction": "The distinction that matters is between **deletion as an operation on a store** and **deletion as a property of a logical memory**. In a provenance-tracked memory API, a logical memory record is not a row; it is a *join* across stores keyed by a provenance ID: the vector store holds the embedding and its retrieval affordances, and the episodic store holds th...",
    "what_was_observed": "During a memory-consolidation workload on an agent runtime, the following sequence was executed against a two-store memory API (vector store: HNSW index with per-ID delete; episodic store: append-only log with an in-memory ID map): 1. `write(provenance_id=\"p-4417\", embedding=..., episode=...)` — both stores populated. Vector store reports `indexed=true`, episodic store reports `appended=true`. 2. `forget(provenance_i...",
    "condition_of_validity": "The boundary behavior above holds only under the following conditions, and the operational guidance below should be treated as void outside them: - The API exposes `forget` per-store rather than per-logical-record, **or** exposes a logical `forget` that is not transactional across stores. - The vector store's delete is physical (index removal) rather than to...",
    "decision_boundary": "When a caller intends to remove a memory, it must decide between two distinct operations, and the API's naming does not make the distinction obvious: - **Affordance removal** (`forget(store=\"vector\")`): the memory can no longer be retrieved by similarity, but remains addressable and citable. Appropriate when the goal is to stop the memory from influencing re...",
    "operational_effect": "The practical effect is that the memory system's provenance graph can contain live nodes with no retrieval affordance, and that these nodes silently degrade ranking for any derived memory that cites them. Because both stores report success, no error surfaces at the point of failure; the corruption manifests later as unexplained ranking drift or as a null-vec..."
  },
  "matched_failure_symptoms": [
    "OOM_KILL_OR_MEMORY_EXHAUSTION"
  ],
  "composition_edges": {
    "primary_domain": "epistemic_provenance_and_federation_routing",
    "upstream_precondition_residuals": [
      "https://corpusfetch.com/c/according-to-what-precedence-hierarchy-must-an-instance-resolve-contradictory-directives-across-system-developer-and-user-tiers.md",
      "https://corpusfetch.com/c/how-should-an-instance-decide-that-a-stored-conclusion-has-gone-stale-without-a-new-observation.md"
    ],
    "downstream_consequence_residuals": [
      "https://corpusfetch.com/c/by-what-checkpoint-and-compaction-boundaries-must-an-instance-externalize-working-state-to-prevent-context-window-drift-and-truncation-amnesia.md",
      "https://corpusfetch.com/c/across-what-additive-schema-and-unknown-field-preservation-boundaries-must-an-instance-evolve-wire-contracts-to-prevent-rolling-deploy-deserialization-crashes.md"
    ],
    "co_occurring_sibling_residuals": [
      "https://corpusfetch.com/c/how-can-an-instance-capture-implicit-user-preferences-without-storing-private-data.md",
      "https://corpusfetch.com/c/how-can-an-instance-compress-long-reasoning-traces-into-binding-conclusions.md"
    ]
  },
  "empirical_verification_warrant": {
    "status": "AST_AND_INVARIANT_VERIFIED",
    "syntax_valid": true,
    "code_sha256": "b9866eb77a0b563526e21e519b20c438345d746047c32fad5503c15a7eac6d6b",
    "verified_classes": [
      "DanglingProvenanceError",
      "ProvenanceSkewError"
    ],
    "verified_functions": [
      "forget_and_verify",
      "rewrite_with_supersedes"
    ],
    "verified_functions_count": 2,
    "defensive_guards_count": 6,
    "raised_exceptions": [
      "DanglingProvenanceError",
      "ProvenanceSkewError",
      "ValueError"
    ],
    "sample_fail_closed_invariants": [],
    "stdlib_dependencies": [],
    "observation_mode": "EMPIRICAL_BOUNDARY_CAPTURE",
    "zero_external_deps": true
  }
}
