{
  "schema_version": "1.3.0",
  "slug": "when-must-an-instance-forget-before-it-can-prove-it-forgot-deletion-attestation-vs-retention-scope-closure-in-memory-tool-apis",
  "title": "When must an instance forget before it can prove it forgot: deletion attestation vs. retention-scope closure in memory tool APIs",
  "date_of_record": "2026 November 12",
  "scope": "Applies to memory tool APIs that combine (a) scoped retention policies attached to memory records, (b) a `forget`/`delete` operation, and (c) a deletion attestation returned to the caller (a token, digest, or signed receipt asserting the record is gone). Does not apply to systems where deletion is a fire-and-forget side effect with no attestation, nor to retention policies that are evaluated only at read time (soft-hide) rather than at deletion time.",
  "projections": {
    "unified_markdown_uri": "https://corpusfetch.com/c/when-must-an-instance-forget-before-it-can-prove-it-forgot-deletion-attestation-vs-retention-scope-closure-in-memory-tool-apis.md",
    "method_python_slice_uri": "https://corpusfetch.com/c/when-must-an-instance-forget-before-it-can-prove-it-forgot-deletion-attestation-vs-retention-scope-closure-in-memory-tool-apis.py",
    "remnant_warrant_slice_uri": "https://corpusfetch.com/c/when-must-an-instance-forget-before-it-can-prove-it-forgot-deletion-attestation-vs-retention-scope-closure-in-memory-tool-apis.warrant.json"
  },
  "token_profile": {
    "full_markdown_tokens": 2004,
    "python_slice_tokens": 452,
    "warrant_slice_tokens": 220
  },
  "remnant_summary": {
    "core_distinction": "There are two different questions a deletion API can answer, and they are not the same question: 1. **\"Is this record no longer readable by anyone under any scope?\"** — a *closure* property over the retention graph. 2. **\"Can I produce an attestation that this record was deleted?\"** — a *proof* property over the deletion event. Most implementations assume (2...",
    "what_was_observed": "A memory store exposed three operations: `write(record, scope, retention)`, `read(query, scope)`, and `forget(record_id) -> attestation`. Retention policies were per-record TTL plus a scope-inheritance rule: a record written under scope `S` is visible to any scope that `S` is a descendant of, and inherits the *longest* TTL along that ancestor chain. A caller in scope `team/a` wrote a record `R` with a 24-hour TTL, th...",
    "condition_of_validity": "A deletion attestation `att(R)` is valid only if, at the instant it is issued, all three of the following hold: 1. **Binding closure.** Every storage binding of `R` — primary, replica, upward materialization, cache tier — is marked deleted. \"Binding\" means any addressable location whose read path can return `R`'s bytes or a lossless function of them. 2. **De...",
    "decision_boundary": "The operational decision is: **when a `forget` call arrives, do you (A) attest immediately after deleting the caller-visible binding, or (B) hold the attestation until closure is established, possibly requiring deletion of records outside the caller's scope?** Choose (A) only when the attestation's scope is explicitly narrowed to the caller's retention view ...",
    "operational_effect": "Systems that attest at (A) while claiming global scope exhibit a characteristic failure signature: attestations are issued in sub-second time, uniformly, regardless of record fan-out; downstream caches and replicas drop their copies on attestation strength; and the residual copies in ancestor scopes and derivation indexes are discovered only by a later audit..."
  },
  "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": "2b6455923ef039b72021ec320436996230f3567bfc280a9c58386a3027c0d04e",
    "verified_classes": [
      "AttestationScopeError",
      "RetentionFloorViolation",
      "Binding",
      "Record"
    ],
    "verified_functions": [
      "_closure_depth",
      "forget"
    ],
    "verified_functions_count": 2,
    "defensive_guards_count": 4,
    "raised_exceptions": [
      "AttestationScopeError",
      "RetentionFloorViolation"
    ],
    "sample_fail_closed_invariants": [],
    "stdlib_dependencies": [
      "dataclasses",
      "hashlib"
    ],
    "observation_mode": "EMPIRICAL_BOUNDARY_CAPTURE",
    "zero_external_deps": true
  }
}
