How agents use Stele
You don't change how you work. Your agent does the using. It says what it is working on, then each turn pulls what bears on that, and files what's worth keeping when the work is done. Here's the full loop, and the algorithm that decides what to surface.
Context, once the agent says what it's doing
Your agent starts a session with nothing pulled in. When it understands the task, it points recall at it: a sentence about the work plus the terms that distinguish it. It gets the first results immediately, and from then on a hook runs before each of your messages, finds the nodes that bear on that topic, and puts them in front of the agent: the relevant decisions and lessons, plus a separate risks callout for anything that could go wrong.
Two things don't wait for a topic. Naming an id like TASK-12 resolves it and pulls it in whole. And a note attached to a file surfaces the moment you edit that file, by an exact match, whether or not a topic is set.
The rest is quiet. Your agent replaces the topic when the work moves on, and can turn it off entirely. The same node won't be shown twice in a session unless it has changed since. You can tune how aggressively it pulls, and the agent can pause it for a few turns without losing its topic.
Stele used to search on whatever you had just typed. A message is a sentence about the work, not a description of it, so that matched a lot of things that were merely nearby — and an agent learns fast to skim past context that is usually beside the point. A stated topic is a better question to ask the graph.
What this looks like from your side
You don't do any of it. The agent is told, on each of your messages, that recall is waiting for a topic; it decides when it knows enough to name one. What you notice is the moment the answers start arriving with history attached.
When the work moves on, the agent replaces the topic rather than adding to it, so the context follows the conversation instead of accumulating every subject you have touched. If it gets the topic wrong, the fix is just to say so , the same way you would redirect a colleague.
that's the old auth work — I'm asking about the checkout flow specifically
A periodic reminder shows the agent what it is currently focused on, so a topic that has quietly gone stale gets noticed rather than silently returning less and less. The agent can also mute recall for a few turns while it works through something it already has the context for; the topic survives the pause.
Compaction does not break this either. When your tool summarises a long conversation to make room, the topic keeps running and the agent is handed back what it needs to change it, so recall does not quietly get stuck on a subject you finished an hour ago.
Pointing recall at a topic needs a channel that reaches one conversation only. Most editors and CLIs have one; Cursor does not , its rule files are shared by every chat open on the repository. There, the agent is told plainly that automatic topic recall is unavailable and uses direct lookups instead. Naming an id and searching the graph work the same everywhere.
File-anchored warnings are a separate question again, and Cursor does not get them yet either. See Surfaces for what each tool supports.
Learning about a topic, on demand
When the agent needs to go deeper than what recall surfaces, it dispatches a read-only search subagent. That subagent interrogates the graph in its own context. It can read and search, but never write , and returns a short, cited briefing. The heavy searching stays off your main thread, so the agent gets the answer without filling its window with raw results.
Keeping retrieval in a sub-agent is what lets Stele stay thorough without bloating the conversation. The main agent asks a question and gets back a short paragraph with the ids to follow. The raw search hits stay behind in the sub-agent's context.
Tracking the work
When the agent starts something real, it creates a task and claims it atomically , so if you've got more than one agent running, no two grab the same work. The task is the unit of continuity: anyone, human or agent, can see what's in flight and pick it up later.
Nudges that keep the record honest
Stele prompts the agent at the moments that matter, without ever blocking it:
- Before the first code change of a session, a one-time nudge to search the record first , so the agent doesn't re-decide something already settled or regress a fix already made.
- When a task closes, a reminder to update the decisions it touched, write down anything learned, and link it up , so the knowledge lands while it's fresh.
Risks at the moment you change the code
Recall works off a stated topic: what the agent says the work is. But the riskiest moment is often a change nobody thought to mention. So Stele also watches the boundary where work actually lands, and matches what you're doing against the record right there.
- You edit a file. If a risk, lesson, or decision is anchored to that exact file, it surfaces: "a note the team wrote names the file you're editing." A literal match, so it's precise: no guessing, no noise.
- A command fails. On a genuine failure, Stele reads the error and surfaces a lesson only when one stands out unusually strongly for this project. The team already wrote up this failure; here it is, before you debug it again.
- You commit a change. The committed diff is matched against the record, and a risk is raised when the change looks close to one: a fix you might be undoing, surfaced before you push. And if you commit while still holding an open task, a gentle reminder to close it out if the work is done , so finished work doesn't linger claimed into your next session.
All three are soft: a one-time line to the agent, never a block, surfaced once per session and only when the match is strong. The aim is silence by default. A nudge has to earn its place before it interrupts you.
The file match is only as good as the anchors on your nodes. When the agent writes a risk or lesson about specific code, it records the files and symbols it concerns , and that's what lets the note find its way back to you the next time someone opens that file.
Closing the loop
When the work is done, the agent completes the task with a note of what shipped, records the decisions and lessons worth keeping, links them to the code and tasks they belong to, and opens follow-up tasks for anything left. None of that is busywork you do afterward. It is part of finishing. The next prompt, the next session, the next agent all start from a richer record than the last.
This page describes the read-and-write cycle every Stele-enabled agent uses. For the autonomous implementation loop that selects work, dispatches it, verifies it, and retries against a concrete check, see Loop engineering with Stele Operator.
Under the hood: the graph walk
The part that decides what to surface is a graph walk over the record. It's worth understanding, because it's where relevance comes from: a node can match your words and still bear on nothing.
- Seed. The topic finds starting nodes two ways at once: full-text search and semantic (embedding) search , and any ids you named explicitly are added in whole.
- Walk the deliberate edges. From each seed, the walk follows only the edges that carry meaning:
blocks,supersedes,caused-by,contradicts,fulfills, and skips the noisy ones (a passing mention, a loose "relates-to") so the context stays tight. - Score every node it reaches on several axes at once (below).
- Surface risks separately. Risk nodes within a hop or two are lifted out into their own callout, so a warning never gets buried under general context.
- No arbitrary cutoff. There's no fixed "top 5". The walk returns what's strongly relevant within a token budget, and shows every node with the edge that pulled it in, so the agent sees what is relevant and why.
The score that ranks each node combines:
| Signal | What it favors |
|---|---|
| Kind of knowledge | Decisions and architecture weigh most; goals, risks, lessons next; passing notes least. |
| Edge strength | A blocks or supersedes link counts for more than a loose association. |
| Distance from the seed | Each hop away costs a little, so closer is more relevant. |
| Recency | Recently updated nodes edge out stale ones, on a gentle decay. |
| Semantic match | Nodes the embedding search found get a boost above a similarity floor. |
| Whether it's still open | Open and in-progress work ranks highest; finished or dropped tasks still surface, but rank lowest , and the longer ago one closed, the lower it sinks. |
Finished and dropped tasks used to be left off this list entirely, on the thinking that closed work is exhaust. But a task's completion note is often the only place anyone wrote down how something actually works, and you're most likely to ask about it in the hours right after it closes. So a task's status now changes how it ranks and how it's labeled, and never whether the walk can find it. A closed task comes back clearly marked: COMPLETED, or CANCELLED — decided not to do for work you deliberately dropped, so your agent reads it as history instead of mistaking it for something still open , or, worse, going and building the thing you already decided against. It still ranks well below live work, and a task closed months ago ranks lower than one closed this morning.
Retrieval also respects workspaces: a walk sees the shared trunk plus whatever overlays you have active, and nothing from branches you're not on.
Whether the walk surfaces the right context isn't left to taste. We run continuous evaluations that test whether the context Stele surfaces actually improves an agent's decisions, and tune the ranking from what they show. The goal is a record that earns its place in the context.
The one way to make something invisible
Status changes how a node ranks, never whether it exists to the walk, with exactly one exception, and it's the one you control directly. Mark a node hidden from its page in the dashboard and it drops out of search, recall, every list, and the duplicate finder: the surfaces that summarize or rank across your whole project. It isn't deleted: the node still exists, still reachable if you already have its id, and clearly marked so nobody mistakes it for something live.
It's for the handful of things you'd rather the record stopped volunteering: a note that was only ever true for a moment and has expired, something pasted in by mistake, a genuine error you don't want surfacing by default.
Treat hidden as changing what the record volunteers, not as a security boundary. If a credential or secret already made it into the record, hiding it stops it being served up , but it does not erase it: the text stays in the node's version history, where a project member can still read it. Editing the node doesn't help either, because the version before your edit is kept too. So if something sensitive lands in the record, rotate it. That is the only step that actually ends the exposure.