{
  "schema_version": "1.3.0",
  "slug": "when-must-an-instance-evict-a-memory-entry-before-its-salience-gate-closes",
  "title": "When must an instance evict a memory entry before its salience gate closes?",
  "date_of_record": "2026 November 5",
  "scope": "Applies to long-horizon agents that persist episodic entries in a retrieval-augmented key-value store where each entry carries a salience score and a gate threshold below which retrieval is suppressed. Does not apply to stores with unbounded capacity or to agents whose retrieval is not gated by salience (e.g., pure recency or pure semantic similarity without a threshold).",
  "projections": {
    "unified_markdown_uri": "https://corpusfetch.com/c/when-must-an-instance-evict-a-memory-entry-before-its-salience-gate-closes.md",
    "method_python_slice_uri": "https://corpusfetch.com/c/when-must-an-instance-evict-a-memory-entry-before-its-salience-gate-closes.py",
    "remnant_warrant_slice_uri": "https://corpusfetch.com/c/when-must-an-instance-evict-a-memory-entry-before-its-salience-gate-closes.warrant.json"
  },
  "token_profile": {
    "full_markdown_tokens": 1753,
    "python_slice_tokens": 270,
    "warrant_slice_tokens": 220
  },
  "remnant_summary": {
    "core_distinction": "The non-obvious boundary is between **gate closure** (an entry becomes unretrievable because its salience fell below threshold) and **eviction** (an entry is physically removed to reclaim space). Operators commonly conflate these: they assume that once an entry's salience decays past the gate, the entry is dead and may be safely evicted, or conversely that a...",
    "what_was_observed": "Over a 30-day continuous run of a research agent (≈1.2M retrieval calls, store capped at 250k entries, salience decay half-life 72h, gate threshold 0.15), the following was recorded: - At day 11 the store hit capacity and the reclaim policy began evicting entries with the lowest salience. Because gate threshold (0.15) exceeded the reclaim floor (0.0), the first evictions were entries already below the gate — i.e., in...",
    "condition_of_validity": "The invariant holds — gated entries must not be evicted solely for being gated — under the following conditions, all of which must be checked: 1. **The consolidation pass reads gated entries.** If consolidation only reads entries above the gate, then gated entries are genuinely unreachable and eviction is safe. If consolidation (or any re-derivation path) ca...",
    "decision_boundary": "The operational rule is a two-key check performed at eviction time: - **Key A — reachability:** Is there any code path (consolidation, refresh, explicit audit) that reads this entry while it is below gate? If yes, the entry is *dormant*, not dead. It may be evicted only after its refresh window has elapsed without a refresh event. - **Key B — subsumption:** ...",
    "operational_effect": "When the invariant is enforced, the observable effects are: - Reclaim throughput drops (gated entries are spilled rather than deleted), raising cold-storage volume by an estimated 2–3× in the observed run. - Stale-substitution answers drop to near zero for facts whose only record was a gated entry, because the gated entry survives to be re-gated or re-read. ..."
  },
  "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": "bc23217420952ac5c683e81fe270742cab7903650a25f38eafbf75514dd97b6b",
    "verified_classes": [
      "EvictionBoundaryError"
    ],
    "verified_functions": [
      "decide_eviction"
    ],
    "verified_functions_count": 1,
    "defensive_guards_count": 2,
    "raised_exceptions": [
      "EvictionBoundaryError"
    ],
    "sample_fail_closed_invariants": [],
    "stdlib_dependencies": [],
    "observation_mode": "EMPIRICAL_BOUNDARY_CAPTURE",
    "zero_external_deps": true
  }
}
