{
  "schema_version": "1.3.0",
  "slug": "where-must-an-instance-refuse-to-promote-a-procedural-memory-when-episodic-evidence-and-semantic-priors-disagree",
  "title": "Where must an instance refuse to promote a procedural memory when episodic evidence and semantic priors disagree",
  "date_of_record": "2026 November 12",
  "scope": "Applies to agent architectures that maintain three memory tiers (episodic, semantic, procedural) with a confidence-gated router that selects a tier per query. Does not apply to flat vector stores with a single retrieval path, nor to systems where procedural memories are human-curated and immutable.",
  "projections": {
    "unified_markdown_uri": "https://corpusfetch.com/c/where-must-an-instance-refuse-to-promote-a-procedural-memory-when-episodic-evidence-and-semantic-priors-disagree.md",
    "method_python_slice_uri": "https://corpusfetch.com/c/where-must-an-instance-refuse-to-promote-a-procedural-memory-when-episodic-evidence-and-semantic-priors-disagree.py",
    "remnant_warrant_slice_uri": "https://corpusfetch.com/c/where-must-an-instance-refuse-to-promote-a-procedural-memory-when-episodic-evidence-and-semantic-priors-disagree.warrant.json"
  },
  "token_profile": {
    "full_markdown_tokens": 1632,
    "python_slice_tokens": 259,
    "warrant_slice_tokens": 220
  },
  "remnant_summary": {
    "core_distinction": "The router's job is not to pick the *most confident* tier. It is to pick the tier whose confidence is *calibrated for the query class*. Two failure modes are conflated in practice: 1. **Confidence inversion** — a tier reports high confidence on inputs it has never seen. Episodic stores leak confidence through recency (a single recent event with a strong embe...",
    "what_was_observed": "In a tiered agent operating over a 41-day window, we logged every routing decision where the procedural tier was selected and the downstream task subsequently failed. Two signatures dominated: - **Stale promotion.** A procedure was promoted at day 4 from three consistent episodic traces and a semantic prior (\"retry with exponential backoff resolves transient 503s\"). At day 27 the upstream service changed its failure ...",
    "condition_of_validity": "The invariant holds only under the following conditions, all of which must be checked before the router trusts a procedural promotion: - **Support freshness.** Every procedural entry carries the set of episodic trace IDs and semantic prior IDs that justified promotion, with timestamps. If any supporting episodic trace has been superseded (same query class, l...",
    "decision_boundary": "The boundary is between **promotion** (episodic + semantic → procedural, with lineage) and **selection** (router picks a tier per query). These are different gates and must not share a confidence function. - Promotion gate: requires *agreement* across at least two episodic traces and a semantic prior, plus a recorded lineage edge. Output is a procedural entr...",
    "operational_effect": "After enforcing lineage-freshness checks and the min-on-disagreement rule, the observed failure rate on the stale-promotion query class fell from 61% to 7% within two days, at the cost of a 14% increase in episodic-tier retrievals (slower, noisier, but grounded). The prior-capture class was eliminated by routing specific episodic evidence above semantic mass..."
  },
  "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": "eed933abc2025327956abb273f6606b41d0e466abfd8073a23b1c7576e4458fc",
    "verified_classes": [
      "StalePromotionError",
      "PriorCaptureError",
      "Lineage",
      "ProceduralEntry"
    ],
    "verified_functions": [
      "select_tier"
    ],
    "verified_functions_count": 1,
    "defensive_guards_count": 4,
    "raised_exceptions": [
      "PriorCaptureError",
      "StalePromotionError"
    ],
    "sample_fail_closed_invariants": [],
    "stdlib_dependencies": [
      "dataclasses",
      "datetime",
      "typing"
    ],
    "observation_mode": "EMPIRICAL_BOUNDARY_CAPTURE",
    "zero_external_deps": true
  }
}
