Memory Units
Definition
A MemoryUnit is the atomic unit of knowledge in the protocol. Every finding, decision, observation, question, or intention recorded by an agent is a MemoryUnit. It is typed, intent-bearing, and immutable once committed — a committed unit's content cannot be changed. To update or correct information, record a new unit with a supersedes or correction relation pointing to the original.
Two things that make them different
Intent is required. Every MemoryUnit MUST include an intent field declaring why it was recorded. A unit without intent is rejected by the Field. This ensures any agent — or human — can understand not just what was found, but what question it was answering.
Confidence is explicit (Level 1+). At Level 1 and above, every committed unit MUST include a confidence score and reasoning. This creates an auditable chain where the certainty behind every finding is transparent.
Recording a unit
await researcher.record({
mode: 'committed',
type: 'finding',
content: 'Segment B has no dominant player above 15% market share.',
intent: {
purpose: 'Establish competitive baseline for Segment B',
question: 'Is Segment B fragmented enough to enter?'
},
confidence: {
score: 0.9,
reasoning: 'Consistent across four independent data sources.',
evidence: ['source-a', 'source-b', 'source-c', 'source-d']
}
})
The Field auto-generates id, epoch, source, status, and timestamp. Agents MUST NOT provide these.
Fields
| Field | Required | Description |
|---|---|---|
type | ✓ | Semantic category. See types below. |
content | ✓ | The knowledge payload. Must be non-empty. |
intent.purpose | ✓ | Why this unit was recorded. Required at all levels. |
intent.task_id | The task this unit serves. | |
intent.question | The question this unit answers or poses. | |
confidence.score | Level 1+ committed | Certainty between 0.0 and 1.0. |
confidence.reasoning | Level 1+ committed | Why this confidence was assigned. |
confidence.evidence | Supporting sources. | |
confidence.assumptions | What is assumed to be true. | |
relations | Links to other MemoryUnits. |
Types
The core type vocabulary:
| Type | Description |
|---|---|
finding | A discovered fact or data point |
decision | A choice made by an agent or human |
observation | A subjective assessment or interpretation |
intention | A declared plan or next step |
assumption | Something taken as true without verification |
constraint | A limitation or boundary condition |
question | An open question that needs answering |
contradiction | An explicit flag that two findings conflict |
synthesis | A combination of multiple findings into a conclusion |
correction | An explicit correction of a prior unit |
human_directive | Input from a human operator |
Implementations MUST support at minimum: finding, decision, observation, and question.
Relations
MemoryUnits can be linked to each other using typed relations:
| Relation | Description |
|---|---|
supports | This unit provides evidence for the target |
contradicts | This unit conflicts with the target — triggers conflict detection |
depends_on | This unit assumes the target is true |
supersedes | This unit replaces the target |
caused_by | This unit exists because of the target |
elaborates | This unit adds detail to the target |
answers | This unit answers a question posed by the target |
blocks | This unit prevents progress on the target |
informs | This unit provides useful context for the target |
await researcher2.record({
type: 'finding',
content: 'Growth decelerating to 14% CAGR.',
intent: { purpose: 'Update market projection with Q4 data' },
confidence: { score: 0.75, reasoning: 'Single source.' },
relations: [{
type: 'contradicts',
target_id: 'mem-001',
description: 'Original estimate was 23% CAGR; new data suggests 14%'
}]
})
// Field automatically creates a Conflict object
Draft vs committed
Draft mode is lightweight. Only type, content, and intent.purpose are required. Confidence is optional. Use draft mode for quick captures. The Field sets status to "draft".
Committed mode enforces full validation. At Level 1+, confidence is required. The Field sets status to "active".
// Quick draft capture
await agent.record({
mode: 'draft',
type: 'observation',
content: 'User interviews suggest pricing sensitivity is high in SMB segment.',
intent: { purpose: 'Flag for follow-up research' }
})
Next
- Attunement — how other agents receive your units
- Conflicts — what happens when two units contradict each other