A good way to understand React memory is to stop asking “where is the memory store?” and instead ask “what kind of memory is this?” A prompt, a plan snapshot, a plan acknowledgement, a pulled file, a source row, a feedback reaction, a compaction summary, and a terse internal note are all memory, but they live in different surfaces for different reasons.

Short version: the timeline holds durable temporal memory, SOURCES POOL and ANNOUNCE form the attention area, notes and plans keep rolling working memory explicit, the turn log is reconstruction memory, the workspace is project memory, and logical paths are the handles that reconnect them.

1. Timeline memory is the durable event history

The timeline is the conversation’s temporal source of truth. It stores prompts, attachments, assistant completions, tool calls, tool results, plan snapshots, feedback blocks, system notices, and compaction summaries. That makes it much richer than a plain chat transcript.

But React does not always see the whole durable timeline. What the model consumes is a rendered session view after pruning, compaction, replacement rendering, cache-point placement, and attention-area append. So the visible context is a derived view over deeper memory, not the whole durable store itself.

React memory architecture Four-layer diagram. Top: rendered session view showing visible timeline slice and attention area (SOURCES POOL plus ANNOUNCE). Middle: three durable surfaces — timeline, working memory (notes and plans), and workspace. Lower: conversation storage/index and hosting. Bottom: logical path namespace band. React memory architecture Visible context is one derived slice. Seven cooperating surfaces hold the rest. Rendered session view derived at render time — pruned, compacted, hidden-replaced, attention-area appended visible timeline slice prompts · completions · tool calls · notes · plan snapshots · summaries attention area SOURCES POOL so: · rolling registry ANNOUNCE signal board · uncached rendered from ↓ Timeline artifact:conv.timeline.v1 prompts · user attachments assistant completions tool calls + results react.notes · react.plan · react.plan.ack feedback · conv.range.summary tc: · ar: · su: Working memory notes + plans react.notes [P] [D] [S] tags react.plan react.plan.ack ar:plan.latest:<id> ar: Workspace project + produced-file memory files/... durable project state outputs/... produced artifacts react.pull(...) activate history custom mode · git mode fi: · ar: persisted to ↓ Conversation storage + index storage bodies · index rows (PostgreSQL) · embeddings react.memsearch · turn log · snippet recall su: · tc: · ar: Hosting + artifacts produced artifacts · attachments · downloadable outputs ar:... paths ar: · fi: logical path namespaces ar: · fi: · so: · su: · tc: · ks: · sk:
React memory is layered by role. The visible session view is only one slice above timeline history, attention-area state, working memory in notes and plans, workspace memory, and deeper indexed storage. Logical paths reconnect all of them.

2. The attention area is always-on-top memory

React keeps two rolling tail surfaces together: SOURCES POOL and ANNOUNCE. SOURCES POOL is the source registry with SIDs, previews, and file/image references when eligible. ANNOUNCE is the attention board: budget, temporal ground truth, open plans, workspace state, prune notices, feedback notices, and other must-see signals.

This is memory too, just not long-form historical memory. It is the part React is supposed to find first, because the runtime keeps it in one fixed place at the tail.

3. Logical paths are the memory routing layer

React keeps many memory realms coherent through logical paths. A path is both an identifier and a recovery handle. When the agent sees one in a tool result, on the timeline, or inside replacement text, it knows how to reopen the hidden or remote content later.

Prefix Memory realm What it reopens Illustrative example
ar: Timeline and conversation-artifact memory Prompts, completions, notes, plans, plan aliases, timeline events ar:plan.latest:plan_42, ar:turn_123.react.notes.tc_abc
fi: Versioned turn artifacts Workspace files, non-workspace outputs, user attachments, logs fi:turn_123.files/bundle/src/app.py, fi:turn_123.outputs/reports/test-results.md
so: Sources pool memory Visible and reloadable source rows by SID or range so:sources_pool[1-5]
su: Summary memory Compaction summaries and other durable summary artifacts su:turn_123.conv.range.summary
tc: Tool execution memory Exact tool call records and rendered tool results tc:turn_123.tc_abc.call, tc:turn_123.tc_abc.result
ks: Knowledge-space memory Read-only docs, indexes, cloned reference repos, curated reference files ks:docs/architecture.md
sk: Skill memory Reusable operating instructions and domain-specific workflows sk:public.pdf-press/SKILL.md
Memory stays navigable because the runtime keeps surfacing recovery handles, not because everything stays visible forever.

4. Notes and plans are working memory, not decoration

React does not only remember through long durable blocks. It also keeps a rolling working-memory layer in notes and plan state. When the agent emits a tool call with human-readable notes, the runtime saves that as a react.notes block on the timeline before the tool executes. That makes intent, rationale, and progress traceable later as memory, not just as ephemeral reasoning.

Plans are memory too. The plan tool writes react.plan snapshots, the runtime exposes the current plan again via ar:plan.latest:<plan_id>, and short human-readable react.plan.ack blocks record completed, failed, or in-progress steps as the turn moves forward. That gives React an auditable progress trail instead of a vague internal checklist. These working-memory artifacts are also directly reopenable, for example as ar:turn_123.react.notes.tc_abc or ar:turn_123.react.plan.ack.2.

There are two note layers on purpose. react.notes blocks are short user-visible working notes around tool use. Internal durable notes can also be written with react.write(channel=internal) and tagged [P] for personal/preferences, [D] for decisions/rationale, and [S] for specs, structure, and technical details.

5. Turn log and indexed storage hold deeper layers

The turn log is the per-turn reconstruction substrate. It stores the ordered blocks emitted during one turn along with light metadata. Fetch APIs, snippet recovery for react.memsearch, and other reconstruction flows rely on it.

Underneath that, the conversation store keeps full payload bodies while PostgreSQL index rows keep compact summaries and, for some artifact kinds, embeddings. That gives the system both full durable bodies and fast searchable records.

6. Workspace is project memory

Workspace is not just scratch disk. It is the memory surface for project continuity. React distinguishes durable workspace state under files/... from non-workspace artifacts under outputs/.... It can preserve project history in either custom or git mode while still keeping historical activation explicit.

That is why workspace memory is not just “what exists locally right now”. It spans current editable state, historical versions, hosted binary artifacts, and logical refs that can reopen the relevant slice when needed.

Workspace memory is explicit. React uses react.pull(...), exact fi: refs, and local code exploration to activate the memory slice it needs rather than assuming the whole project is always already there.

7. Summaries, hide replacements, and feedback are transformed memory

Some of the most important memory is derived rather than raw. When compaction runs, the runtime inserts a durable conv.range.summary block with path su:<turn_id>.conv.range.summary. That summary becomes the new compact representation of the older visible range, and on later loads the persisted timeline starts from the latest summary boundary onward.

Replacement text from TTL pruning or react.hide is another transformed memory form. It is intentionally short, but it preserves the meaning of what was removed and, crucially, the recovery path back to the underlying content. Feedback also belongs here: it persists as reaction artifacts, can land on the timeline, and can surface again as a live signal in ANNOUNCE.

In other words, React does not only store memories. It continuously converts memories into lighter forms while preserving how to reopen them. That is why summaries, plan aliases, note tags, and replacement text are not secondary implementation details. They are part of the memory architecture itself.

Compaction summaries are memory. Replacement text is memory. Plan acknowledgements are memory. Feedback is memory. The system keeps changing the form while keeping the route back.

8. Retrieval is a routing problem across surfaces

React does not reopen memory through one generic “RAG step”. It uses different routes depending on what kind of memory it wants:

  • react.read when the exact logical path is known
  • react.memsearch when the topic is known but not the exact turn or path
  • react.search_files for the current local filesystem surface
  • react.pull to materialize historical workspace and artifact slices locally
  • generated code and exec when local materialized memory needs richer inspection
How React reopens and transforms memory Four horizontal rows each showing one memory transformation type: direct recall via react.read, compaction into summaries, react.hide replacement text, and plans/notes/workspace reopening. A namespace footer shows the logical path recovery handles. How React reopens and transforms memory Memory changes form over time. Each form keeps a reopening route. Memory form Transform + reopening route Result timeline blocks / events sources pool rows · workspace files tc: so: fi: ar: ks: react.read(path) when exact logical path is known react.memsearch topic known, path not active context block returned inline · directly visible exact path = fastest route older raw turn range no longer in visible context tc: path markers remain compaction → conv.range.summary summary block inserted at cut point react.read(su:...) reopens summary summary in context memory changed form, not deleted su: = reopening handle bulky tail block editable tail zone (post pre-tail) tc: path still valid react.hide → replacement text stub original block stored at logical path react.read(path) restores original hidden from view not deleted — still recoverable react.read(path) = recovery route react.plan · react.notes workspace files (fi:...) ar: fi: plan.ack + [P] [D] [S] tags in ANNOUNCE react.pull(fi:...) → materializes files locally react.search_files react.read(ar:plan...) always-on via ANNOUNCE or local filesystem access code / exec for richer inspection namespaces: ar: · fi: · so: · su: · tc: · ks: · sk:
React memory changes form over time. Older raw context may become summaries, hidden blocks may become replacement text, and project state may move into versioned workspace artifacts — but each form keeps a reopening route through namespaces and retrieval tools.

9. The point is availability, not permanent visibility

React’s memory model is built on one core principle: if something is not visible, that does not mean it is gone. The system keeps information available in different states: visible, always-on-top, hidden with replacement text, summarized by compaction, persisted in storage, searchable in the index, or materializable back into workspace.

That is the real memory story: multiple memory surfaces, one recovery language, and a runtime that keeps the important parts visible while still preserving routes back to the rest.