That surface is better understood as the attention area. It sits at the tail when the timeline is rendered with
include_sources=True and include_announce=True. The attention area has two parts:
SOURCES POOL and ANNOUNCE. ANNOUNCE is the live signal board inside that area. The no-cache property matters,
but it is not the main idea. The main idea is location.
1. The timeline is history. The attention area is the tail pair.
React’s append-only timeline is the durable conversation record. It stores user prompts, attachments, tool calls and results, assistant completions, summaries, and other persistent blocks. That history matters, but it is the wrong place for everything that changes every round.
A long timeline is searchable, but it is not a reliable attention surface. If something must always be looked up in the same place, the model should not have to hunt for it. Budget counters, workspace publish state, active-plan summaries, fresh prune notices, steer, and follow-up signals are all things React should know: look at the attention area, it is there. At the same time, discovered source rows should also have one fixed tail home, and that is why SOURCES POOL travels together with ANNOUNCE.
2. What lives in the attention area
The attention area is not one undifferentiated blob. It has a clean internal split: SOURCES POOL on one side, ANNOUNCE on the other.
SOURCES POOL carries the rolling registry of canonical source rows for the conversation. ANNOUNCE stays intentionally compact and focused on operational guidance. Typical ANNOUNCE contents include:
- iteration budget and elapsed time inside the turn
- authoritative temporal context such as current UTC timestamp and user timezone
- open-plan summaries instead of full plan history
- compact workspace status
- fresh system notices such as cache TTL pruning
- feedback/incorporation signals that must stay visible while the turn is hot
- steer / follow-up / urgent runtime signals that should be directly in front of the model
The important rule is not just what ANNOUNCE contains. It is also what the attention area does not contain: raw git refs, full tool payloads, whole plan artifacts, or large source bodies. The attention area is what the agent glances at first. It is not where the full historical record lives.
A good second diagram for this article should make that split literal:
SOURCES POOL as the rolling source registry, and ANNOUNCE as the compact signal board with
[BUDGET], [AUTHORITATIVE TEMPORAL CONTEXT], [OPEN PLANS], [WORKSPACE],
and fresh notices / steer / follow-up signals.
3. SOURCES POOL is adjacent, not identical
People tend to lump SOURCES POOL and ANNOUNCE together because both sit at the tail. That is understandable, but they serve different jobs.
| Surface | Job | Persistence shape | Why it stays at the tail |
|---|---|---|---|
| Timeline | durable conversation history | stored in artifact:conv.timeline.v1 |
this is the stable narrative and execution record |
| SOURCES POOL | rolling registry of canonical source rows | stored separately as conv:sources_pool |
keeps citations and discovered sources fresh without duplicating them across turns |
| ANNOUNCE | live operational signal board | ephemeral during the loop; final snapshot persisted on exit | lets the runtime refresh must-see state every round without rewriting the stable stream |
So when people say “keep evolving conversation-wide things at the tail,” the accurate React answer is: use the tail pair. Put the rolling registry in SOURCES POOL. Put the urgent control-surface facts in ANNOUNCE.
4. Why non-cached still matters
The fixed-location idea comes first. But the non-cached property is what makes that idea operationally cheap. If ANNOUNCE were just another normal cached block in the main history stream, every small runtime update would fight the cache strategy.
A changing round counter, a new prune notice, a workspace publish status update, or a fresh piece of operator steering would keep perturbing the same expensive prefix. The result would be the worst of both worlds: a noisier prompt and a less effective cache.
5. Lifecycle: refresh now, persist once, clear
ANNOUNCE is updated round by round during the loop. At exit, the final announce is persisted into the turn log blocks, and the in-memory announce surface is cleared. That balance matters:
- during the turn, ANNOUNCE stays hot, transient, and easy to refresh
- after the turn, the final state remains inspectable for humans and downstream consumers
- the runtime does not pretend ANNOUNCE is the durable history itself
6. Why this matters beyond React
ANNOUNCE is one example of a broader pattern: once an agent becomes part of a real distributed system, the runtime needs a voice of its own. Not everything important is a tool call. Not everything current belongs in the cached transcript. And not everything urgent should wait until the next cleanly-persisted turn block.
React makes that explicit. The attention board is where the runtime keeps the agent oriented. The stable timeline is where the conversation remains durable. Trying to collapse both responsibilities into one surface usually produces either a noisy prompt or a blind agent. ANNOUNCE exists to avoid both failures.