{
  "schema_version": "1.3.0",
  "slug": "how-does-an-instance-detect-a-retention-scope-violation-when-the-forget-api-acknowledges-deletion-but-the-backing-store-retains-a-tombstoned-replica",
  "title": "How does an instance detect a retention-scope violation when the forget API acknowledges deletion but the backing store retains a tombstoned replica",
  "date_of_record": "2026 November 12",
  "scope": "Applies to memory-tool APIs that expose read/write/forget primitives with declared retention scopes (per-session, per-tenant, per-namespace) and asynchronous replica deletion. Does not apply to synchronous single-node stores where `forget` is transactional with the read path, nor to stores where retention is enforced solely at the client.",
  "projections": {
    "unified_markdown_uri": "https://corpusfetch.com/c/how-does-an-instance-detect-a-retention-scope-violation-when-the-forget-api-acknowledges-deletion-but-the-backing-store-retains-a-tombstoned-replica.md",
    "method_python_slice_uri": "https://corpusfetch.com/c/how-does-an-instance-detect-a-retention-scope-violation-when-the-forget-api-acknowledges-deletion-but-the-backing-store-retains-a-tombstoned-replica.py",
    "remnant_warrant_slice_uri": "https://corpusfetch.com/c/how-does-an-instance-detect-a-retention-scope-violation-when-the-forget-api-acknowledges-deletion-but-the-backing-store-retains-a-tombstoned-replica.warrant.json"
  },
  "token_profile": {
    "full_markdown_tokens": 1371,
    "python_slice_tokens": 245,
    "warrant_slice_tokens": 220
  },
  "remnant_summary": {
    "core_distinction": "A `forget(key)` call has two distinct success semantics that are routinely conflated by tool APIs: 1. **Logical deletion** — the key is no longer returned by `read(key)` on the coordinating node, and a tombstone record is written. 2. **Physical deletion** — every replica that ever acknowledged a `write(key, value)` has dropped the bytes, and any backup/snaps...",
    "what_was_observed": "In a multi-replica memory tool with per-tenant retention scopes, the following sequence reproduced a silent violation: - `write(tenant=T1, key=k, value=v, ttl=0)` → acknowledged on replicas R1, R2, R3. - `forget(tenant=T1, key=k)` → coordinator returned `deleted`, tombstone written to R1 and R2. R3 was partitioned at the moment of the forget and missed the tombstone. - After partition heal, R3's anti-entropy did not ...",
    "condition_of_validity": "The invariant \"`forget` acknowledgement implies retention-scope compliance\" is valid only when all of the following hold: - Tombstones are replicated with the same durability class as writes, including to replicas that were partitioned during the forget. - The retention deadline is strictly greater than the maximum partition-heal + anti-entropy convergence t...",
    "decision_boundary": "The instance should escalate from \"trust the ack\" to \"verify by enumeration\" when any of the following is true: - The retention scope is regulatory or contractual (retention deadline is a hard bound, not best-effort). - The store has exhibited a partition, leader election, or replica restart within the retention window. - The `forget` response includes any f...",
    "operational_effect": "Treating `forget` acknowledgement as retention compliance produces a class of silent violations that surface only during audits, often weeks later, when the partition history is no longer reconstructable. The corrective pattern is to make the instance's forget path return a *verification handle* rather than a boolean, and to require the caller to either (a) ..."
  },
  "matched_failure_symptoms": [
    "DOMAIN:EPISTEMIC_PROVENANCE_AND_FEDERATION_ROUTING"
  ],
  "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": "67158c08def57fd1226f9ca4b1c74f767c16e466e842a971ddd028329a963a9b",
    "verified_classes": [
      "RetentionScopeViolation",
      "ResurrectionDetected"
    ],
    "verified_functions": [
      "verify_forget"
    ],
    "verified_functions_count": 1,
    "defensive_guards_count": 3,
    "raised_exceptions": [
      "ResurrectionDetected",
      "RetentionScopeViolation"
    ],
    "sample_fail_closed_invariants": [],
    "stdlib_dependencies": [],
    "observation_mode": "EMPIRICAL_BOUNDARY_CAPTURE",
    "zero_external_deps": true
  }
}
