{
  "schema_version": "1.3.0",
  "slug": "when-how-what-must-a-consolidation-scheduler-refuse-to-merge-an-ebbinghaus-decay-bucket-across-a-hierarchical-temporal-i",
  "title": "When/How/What must a consolidation scheduler refuse to merge an Ebbinghaus decay bucket across a hierarchical temporal index boundary?",
  "date_of_record": "2026 November 5",
  "scope": "Applies to agentic memory systems that consolidate episodic traces into semantic summaries using a hierarchical temporal index (e.g., minute → hour → day → week) combined with Ebbinghaus-style retention curves `R(t) = exp(-t/S)` where `S` is a per-trace stability constant. Does **not** apply to flat-vector memory stores without temporal bucketing, nor to systems that use a single global decay half-life.",
  "projections": {
    "unified_markdown_uri": "https://corpusfetch.com/c/when-how-what-must-a-consolidation-scheduler-refuse-to-merge-an-ebbinghaus-decay-bucket-across-a-hierarchical-temporal-i.md",
    "method_python_slice_uri": "https://corpusfetch.com/c/when-how-what-must-a-consolidation-scheduler-refuse-to-merge-an-ebbinghaus-decay-bucket-across-a-hierarchical-temporal-i.py",
    "remnant_warrant_slice_uri": "https://corpusfetch.com/c/when-how-what-must-a-consolidation-scheduler-refuse-to-merge-an-ebbinghaus-decay-bucket-across-a-hierarchical-temporal-i.warrant.json"
  },
  "token_profile": {
    "full_markdown_tokens": 1372,
    "python_slice_tokens": 324,
    "warrant_slice_tokens": 220
  },
  "remnant_summary": {
    "core_distinction": "The failure is not \"decay too fast\" or \"decay too slow.\" It is the **cross-boundary merge**: a consolidation pass that aggregates traces from two adjacent temporal buckets whose *decay phase* differs, producing a summary whose implied stability `S` is a mathematical artifact of the bucket boundary rather than of the underlying traces. Two traces with identic...",
    "what_was_observed": "In a 90-day replay of an agent's memory store (≈4.1M episodic traces, hourly buckets, daily rollups), consolidation at the day boundary produced summaries whose re-retrieval score, when measured one week later, was systematically 12–19% lower than the mean of the constituent traces' individually-projected scores. The gap scaled with the *variance* of trace timestamps within the merged window, not with the number of t...",
    "condition_of_validity": "The invariant \"merge only within a bucket\" holds **only if** all of the following are true: 1. The decay model is *exponential* (memoryless). For power-law or Weibull decay, the convexity argument flips sign and the merge error direction reverses. 2. The bucket window `W` satisfies `W ≪ S_min` across all traces in the window. When `W / S_min > 0.3`, the Jens...",
    "decision_boundary": "The scheduler must refuse the merge and escalate to the parent bucket when **any** of: - `max(t_i) - min(t_i) > 0.3 * min(S_i)` (dispersion exceeds stability tolerance) - `count(rehearsed_since_open) > 0` (stability mutated mid-window) - `boundary_epsilon_overlap > 0` (any trace interval intersects the seal watermark) Refusal is cheap: escalation to the day ...",
    "operational_effect": "After enforcing the refusal rule, the 7-day retrieval-score gap closed from 12–19% to under 2%, and the double-counted boundary traces (≈0.04% of volume) were eliminated by switching to half-open intervals with a monotonic seal watermark. The consolidation queue depth increased ~8% due to deferrals, which is acceptable; the alternative was a memory store tha..."
  },
  "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": "fbbed711d8c76724427d455f6ccd9087893d114658101380a6e94a4179842b72",
    "verified_classes": [
      "BoundaryMergeRefused",
      "Trace"
    ],
    "verified_functions": [
      "consolidate_bucket"
    ],
    "verified_functions_count": 1,
    "defensive_guards_count": 5,
    "raised_exceptions": [
      "BoundaryMergeRefused"
    ],
    "sample_fail_closed_invariants": [
      "empty bucket: nothing to consolidate",
      "trace rehearsed since window opened; stability mutated mid-window"
    ],
    "stdlib_dependencies": [
      "dataclasses",
      "math",
      "typing"
    ],
    "observation_mode": "EMPIRICAL_BOUNDARY_CAPTURE",
    "zero_external_deps": true
  }
}
