Skip to content
Memory & Knowledge

Memory Decay Tuning

5 min read

How Armbrain ages different types of memories at different rates so that search results and meeting briefs surface the most relevant knowledge, and how to customize decay for specific clients.


Why Decay Matters

Not all memories age the same way. A decision made 6 months ago ("We're pausing LinkedIn ads") is still valid until someone reverses it. But an action item from 6 months ago that was never completed ("Send the report by Friday") is almost certainly stale. Without differentiated decay, both rank similarly in search. The relevant decision gets buried under stale tasks.

Armbrain applies per-type time decay to search results so that:

  • Decisions and preferences persist across quarters
  • Campaign outcomes remain useful for year-over-year comparison
  • Stale commitments and unanswered questions naturally fall out of results
  • You spend less time hiding outdated memories

How It Works

When you search, or when Armbrain gathers context for a meeting brief, how strongly each memory surfaces is adjusted based on its age and type:

adjusted_similarity = similarity * max(floor, 1.0 - (age_days / 365.0 * decay_rate))

This means:

  • Higher decay rate = the memory loses relevance faster
  • Floor = the minimum multiplier (the memory never drops below this fraction of its original similarity)
  • Age in days determines how much decay has been applied

Default Decay Rates

Memory TypeDecay RateFloorWhat This Means
preference0.2/year0.8Preferences barely decay. "Sarah prefers async updates" is still valid after a year, retaining at least 80% of its original score.
decision0.3/year0.7Decisions persist until reversed. A 1-year-old decision still has 70% of its original score.
stakeholder0.3/year0.7People and roles change slowly. Stakeholder info stays relevant for quarters.
campaign_outcome0.5/year0.6Results are historical and do not change. Useful for year-over-year comparison.
fact1.0/year0.5The baseline rate. General facts have mixed shelf lives, so this is the middle ground.
question1.5/year0.4Unanswered questions lose urgency. If nobody followed up in 6 months, it has probably been resolved or is no longer relevant.
commitment2.0/year0.3Action items go stale fast. A 3-month-old uncompleted commitment retains only about 50% of its score.

Practical Examples

A 6-month-old decision (180 days):

adjusted = similarity * max(0.7, 1.0 - (180/365 * 0.3))
         = similarity * max(0.7, 0.852)
         = similarity * 0.852

Barely decayed. Still prominent in search results.

A 6-month-old commitment (180 days):

adjusted = similarity * max(0.3, 1.0 - (180/365 * 2.0))
         = similarity * max(0.3, 0.014)
         = similarity * 0.3  (hit the floor)

Heavily decayed. Shows up only if similarity is high or no other results exist.


Customizing Decay for a Client

Some clients have different rhythms. A client on a quarterly cadence might have commitments spanning 3 months instead of 1-2 weeks. For these clients, you can override the default decay rates:

"Configure Acme's memory settings: make commitments decay slower -- they track quarterly goals, not weekly tasks"

Armbrain saves custom decay settings for this client:

{
  "memory_config": {
    "decay_overrides": {
      "commitment": {"rate": 1.0, "floor": 0.5}
    }
  }
}

This changes only the commitment decay for Acme Corp. All other types keep their defaults. Other clients are unaffected.

When to Customize

ScenarioOverride
Client has quarterly deliverables, not weekly tasksLower commitment decay rate (e.g., 1.0 instead of 2.0)
Fast-moving client where decisions change frequentlyRaise decision decay rate (e.g., 0.8 instead of 0.3)
Client where historical facts are critical (regulated industry)Lower fact decay rate and raise the floor
Startup client where everything changes quarterlyRaise all decay rates slightly

Validation Rules

  • Rate must be greater than 0
  • Floor must be between 0.0 and 1.0
  • Override keys must be valid memory types (decision, preference, campaign_outcome, commitment, stakeholder, fact, question)
  • Unknown memory types in overrides are rejected

How Decay Affects Different Features

search_memory

This is where decay has the most visible impact. Results are sorted by adjusted_similarity (after decay), not raw similarity. Both scores are returned in the response so you can see the effect:

{
  "summary": "Pausing LinkedIn ads through Q2",
  "memory_type": "decision",
  "similarity": 0.87,
  "adjusted_similarity": 0.8367,
  "age_days": 45
}

briefing

Meeting briefs use the same retrieval logic. This means:

  • Recent commitments appear prominently in the "Action Items" section
  • Old unresolved commitments naturally drop off without manual hiding
  • Decisions from months ago still surface in the "Key Decisions" section

get_campaign_history

Campaign outcomes are filtered by type, not search. Meeting prep with campaign context uses a 0.6 floor to keep results visible.


Interaction with Completed Commitments

Completed commitments are excluded from active retrieval. Once marked done, they leave open lists. Decay applies only to active memories.

Completed commitments appear in meeting briefs as checked-off items (- [x]), but they are retrieved by a separate query that does not apply decay.


Checking Current Decay Settings

There is no dedicated tool to view decay settings. The defaults are hardcoded and well-documented (the table above). To check if a client has custom overrides:

"What are Acme's memory configuration settings?"

This retrieves the memory_config from the client mind's configuration. If decay_overrides is present, you will see the custom rates. If absent, defaults are in effect.


Key Details

  • Decay does not delete memories. It only adjusts their ranking in search results. Every memory is still stored and can be found with a highly specific query.
  • New clients see no decay effect. When all memories are recent, decay multipliers are close to 1.0 and have no practical impact on ranking.
  • Unknown memory types fall back to fact defaults. If a memory has an unrecognized type, it decays at the baseline 1.0/year rate.
  • Very old memories hit the floor and stay there. A 5-year-old decision at 0.7 floor will never drop below 70% of its original similarity score. Nothing goes to zero.
  • Per-client overrides merge with defaults. You only need to specify the types you want to change. Unmentioned types keep their default rates.
  • No per-memory overrides. Decay is configured per memory type (globally or per client), not per individual memory.