Observation
All propositions in a context are treated identically for retrieval, decay, and eviction. In practice, propositions have different temporal relevance:
- Recently accessed or reinforced propositions are actively relevant
- Propositions from earlier in the conversation but still occasionally referenced are warm
- Propositions that haven't been accessed in a while but aren't contradicted are cold
Without tier classification, decay and eviction treat all propositions the same:
- Too aggressive → active propositions fade too quickly
- Too conservative → stale propositions consume token budget
What DICE already has
Proposition.lastAccessed: Instant — tracked but not used for behavior differentiation
Proposition.reinforceCount: Int — frequency signal, not used for tier classification
Proposition.decay: ZeroToOne — uniform rate, not modulated by access patterns
MemoryMaintenanceOrchestrator — runs maintenance but doesn't classify propositions by recency
PropositionRepository — has findByRevisedBetween() and findAllOrderedByEffectiveConfidence(), but no tier-based queries
The question
Should propositions have a temporal tier that modulates their decay and eviction behavior?
A simple model:
| Tier |
Criteria |
Effect |
| HOT |
Accessed or reinforced recently |
Slower decay, higher eviction resistance |
| WARM |
Not recently accessed, but not stale |
Normal decay |
| COLD |
No access in a while |
Faster decay, first to evict |
Implementation options
-
Computed on-the-fly — classify based on lastAccessed relative to configurable thresholds. No storage, always fresh. Cost: recalculated on every query.
-
Stored field — add memoryTier: MemoryTier to Proposition. Updated during maintenance sweeps. Enables tier-based repository queries, but can go stale between sweeps.
-
Decay multiplier only — no explicit tier. lastAccessed directly modulates the decay rate in effectiveConfidence(). Simpler, but loses the categorical abstraction.
Open questions
- Is
lastAccessed sufficient for classification? Other signals matter: reinforceCount recency, whether the proposition is referenced by active abstractions, whether the conversation thread it came from is still ongoing.
- Should tier be stored or computed? Stored enables efficient queries (
findByTier(HOT)) but risks staleness. Computed is always fresh but can't be indexed.
- Is this redundant with decay? If
effectiveConfidence() already decays based on revised time, adding a tier multiplier based on lastAccessed creates two time-based decay dimensions. Is that useful or confusing?
Observation
All propositions in a context are treated identically for retrieval, decay, and eviction. In practice, propositions have different temporal relevance:
Without tier classification, decay and eviction treat all propositions the same:
What DICE already has
Proposition.lastAccessed: Instant— tracked but not used for behavior differentiationProposition.reinforceCount: Int— frequency signal, not used for tier classificationProposition.decay: ZeroToOne— uniform rate, not modulated by access patternsMemoryMaintenanceOrchestrator— runs maintenance but doesn't classify propositions by recencyPropositionRepository— hasfindByRevisedBetween()andfindAllOrderedByEffectiveConfidence(), but no tier-based queriesThe question
Should propositions have a temporal tier that modulates their decay and eviction behavior?
A simple model:
Implementation options
Computed on-the-fly — classify based on
lastAccessedrelative to configurable thresholds. No storage, always fresh. Cost: recalculated on every query.Stored field — add
memoryTier: MemoryTiertoProposition. Updated during maintenance sweeps. Enables tier-based repository queries, but can go stale between sweeps.Decay multiplier only — no explicit tier.
lastAccesseddirectly modulates the decay rate ineffectiveConfidence(). Simpler, but loses the categorical abstraction.Open questions
lastAccessedsufficient for classification? Other signals matter:reinforceCountrecency, whether the proposition is referenced by active abstractions, whether the conversation thread it came from is still ongoing.findByTier(HOT)) but risks staleness. Computed is always fresh but can't be indexed.effectiveConfidence()already decays based onrevisedtime, adding a tier multiplier based onlastAccessedcreates two time-based decay dimensions. Is that useful or confusing?