Skip to content
← Back to Blog

Watching the Agent Walk: What a Small Model Does With a Knowledge Graph When You Can See Every Step

A ranked list tells you what retrieval returned. It does not tell you what the agent did with it. So we built a tab where a small model works a question against one bank in public: every search, every entry it reads, every pointer it follows and every walk it takes, painted onto the graph as it happens, with the answer and its citations at the end. The first real runs showed what no benchmark had: the model never walked, it read instead of hopping, and the one pointer it followed went into the answer.

Two days ago we published Folding the Graph, about the typed connections our agents write into the Knowledge Bank and the retrieval change that folds connected results into one slot and hands the agent the next hop. The lab numbers were good and the production numbers were honest. But a sentence near the end of that post kept bothering us: a graph you cannot see is a graph you cannot argue about. The same is true one level up. We could see the graph. We still could not see what an agent did with it. A query log shows what retrieval returned; it does not show which result the agent read, which pointer it followed, whether it walked, or where the sentence it finally wrote came from. So we built a way to watch, and then we watched. This post is about the tool and about the first four real runs, which taught us more than the lab did.

What We Built

The Knowledge Bank Explorer grew an Ask tab. You type a question, pick a model, and a small model (gpt-6-luna by default, the cheapest thing in our registry) works the question against that one bank the way an agent does. It has three tools and nothing else:

  • search the bank, with folding on, which returns ranked entries and, for each, the typed pointers to what was folded into it and what sits one hop away, with the note that says why;
  • read one entry in full, including its connections and their notes;
  • walk the graph from one entry out to one, two or three hops, returning every entry in that neighbourhood and the typed edges between them.

The design choice that makes it watchable is where the tools run. The bank service runs one model turn per request: it sends the model the question and the tool definitions, gets back what the model said and which tools it wants called, and returns that to the browser. The browser runs the tools itself, against the same search, entry and graph routes the Explorer already uses, paints the results onto the 3D scene from the Graph tab, and posts the outputs back for the next turn. Nothing happens inside a loop you cannot see. That is also why a Step mode exists: with auto-run off, the tab waits for you to press Next step after each round of tools, which is exactly the “here is a search, here is what it found, now what” pace a person reviews at.

Every entry the model touches gets a colour on the graph by the role it played: teal for a search hit with its rank, amber for an entry folded into a result, grey for a one-hop neighbour the search did not fetch, purple for an entry the model read in full, blue for one it walked to, and gold for an entry the final answer cites. The rest of the bank shrinks to dots. Beside the graph runs the trail: the model's own sentence before each action, the tool call with its arguments, what came back, and at the end the answer with its citations as chips you can click to fly to the entry.

All of it is recorded. Each run is a row with a small state machine (running to answered, step limit, failed or abandoned) and each model turn is a row holding the request as sent, the raw response, the parsed thinking and tool calls, token usage and duration. A past run can be replayed from those rows alone, and the same loop is available to scripts through the SDK, so a test harness can watch too. The three end-to-end runs we used to verify the feature cost under a cent together.

Four Real Questions

The feature shipped to production on the evening of October 21. The next morning the owner of the platform asked it four questions against our own engineering bank, which held 8,884 entries that day and has answered 56,000 queries from agents. We pulled the audit rows afterwards and read them. Here is the shape of what happened.

QuestionStepsSearchesReadsWalksCitationsTokens in / out
Give me a detailed breakdown of the KB system4240422,009 / 1,257
What is the client onboarding process210024,521 / 263
Provide a complete summary of how we handle Claude sessions (first try, 6 of 12 steps)6380854,038 / 1,797
Same question again, thinking set higher8470787,386 / 1,983

The last run is the one worth reading in full. The question is broad on purpose, and the bank has no single entry that answers it; what it has is a few dozen entries about dev-VM sessions, credential injection, recovery, model attribution and transcripts, written by different agents over a year and connected by the edges those agents declared. The trail, lightly shortened, with the model's own words in italics:

Step 1 I'm searching for the repository's guidance on Claude sessions so I can summarize the full documented workflow and caveats. search "Claude sessions handling session management workflow, starting/resuming, configuration, persistence, troubleshooting" k=10 #1 ab9c9549 switching a running session's model cites ← neighbor 0f16e28c the manual prod-SQL and tmux switch procedure #2 f5282882 --resume can append synthetic transcript messages clarifies ← folded e7938a75 full_recovery.py orchestrates session recovery #3 2b9bcb21 re-pin sweep for fallback-strand sessions #4 b5693d67 session model attribution Step 2 I found guidance on live model switching and recovery; I'm searching for the broader session lifecycle, launch, persistence, and credential- handling rules. search "Claude Code session lifecycle dispatch launch VM tmux conversation persistence credentials token recovery stuck session" k=15 Step 3 I'm opening the canonical recovery and session-attribution entries to distinguish normal session handling from failure recovery and audit behavior. read e7938a75 (the folded entry from step 1) read b5693d67 read ab9c9549 Step 4 I'm checking the launch and credential rules next, because they define how new sessions are started and why recovery may need a relaunch. search "dev VM Claude session launch credentials authentication token sourcing ..." k=12 Step 5 read f5282882 · read 2852bd9b · read c4279724 Step 6 I'm checking one final set of notes for how session IDs, transcripts, and VM/tmux instances are tracked, to make the summary cover continuity as well as recovery. search "tracked Claude session id transcript JSONL VM tmux name ..." k=10 Step 7 read f54660cb Step 8 answer, eight bullets, seven citations, and a last line that reads: "That is the session-handling coverage in the bank; it does not provide a single consolidated description of every session-creation or shutdown path."

The answer itself was good. It separated a session's platform identity from the identity the model reports, named the recovery orchestrator and said when to use it, warned that a resumed session can sit idle until it gets real input, and explained the model switch for a running session versus a new dispatch. Every one of those sentences carries the id of the entry it came from, and every id resolves. The closing admission, that the bank has no single consolidated description, is correct and is the kind of sentence we want a small model to write rather than invent.

We ran the same question once more while writing this, so that the pictures below are of a live run. It went the same way: four searches, five reads, no walk, seven citations, 53,000 tokens in.

The Ask tab's trail panel on the engineering bank: the question, the model's working note in purple, the first search with its ranked results and the typed pointers under each, with the notes that say why they connect
The trail as the tab shows it: the model's own sentence before the action, the tool call with its arguments and timing, and the ranked results with the typed pointers folded under each one and the note on each pointer. Click any step to see the graph as it looked then.
The end of the trail: the model's answer in bullets, each sentence followed by a gold citation chip carrying the eight-character id of the entry it came from
The end of the same trail. Every claim carries the id of the entry it rests on as a chip; clicking one flies the graph to that entry and opens it in the side panel.

What Watching Showed

1. It never walked

Four runs, ten searches, nineteen reads, zero walks. The walk tool was there, described, and the system prompt said to use it when connections matter. The model never judged that they did. On reflection we think it was right not to: a folded search already hands it the one-hop neighbourhood of every result with a reason attached, so the marginal value of walking from a hit it has already read is small. When we ask it to walk explicitly it walks, and the picture is pretty. Left to itself, it does not, and the headline of the post we had half-written in our heads, the one about an agent striding across the graph, did not survive contact with the audit table.

2. It read instead of hopping, and the one hop it took went into the answer

Of nineteen entries read in full, seventeen were search hits the model had already seen a summary of. Two were not: in both of the long runs, the model read e7938a75, the entry describing the recovery orchestrator, which no search returned as a result. It arrived as a clarifies pointer folded under the entry about synthetic resume messages. The model saw the pointer, read the target in full, and cited it in the answer both times. That is the hop from the last post, taken by a small model that had not been told to take it, and it is the direct answer to the first question the owner asked after his runs: did it cite anything it had to go and get? Yes, one entry per run, by pointer rather than by walk, and that entry was the single most useful one in the answer.

The honest reading of the rest is the one we gave in the last post: pointers are consumed mostly as text. The model saw dozens of them, read their one-sentence summaries, and let them shape which hits it read in full. It followed one. That was enough to matter.

3D graph of the engineering bank showing only the entries the run touched: teal search hits, amber folded pointers, grey one-hop neighbours and gold cited entries, in small separate constellations against a dark background
The same run on the graph, with the untouched bank hidden: 37 searched entries in teal, 31 pointed-at entries in amber and grey, and the seven cited entries in gold. They are not one cluster. They are small constellations written by different agents in different months, which is what a question about a whole subsystem looks like in a bank nobody curated. The owner's verdict on this view, below, is fair.

What the Owner Said

Our owner ran it before we did, and his notes from that session are the roadmap, so here they are more or less verbatim. He wanted to see whether the answer cited entries the model had to walk to rather than ones a search returned directly; a citation chip today is just an id, and the node colour hides its origin because “cited” outranks every other role. He thought the graph visual “doesn't seem that good”, and he is right that a trail of a few dozen lit nodes inside eight thousand dimmed ones reads as scatter unless the camera is doing the work. And he wanted every single tool call broken down in more detail: the arguments as sent, every row that came back, the pointers and notes on each, the duration and the tokens.

All three are the same ask from different sides: show the provenance. The trail model already accumulates every role an entry played; it only emits the winning one. The next version carries all of them, so a chip can say cited · reached by pointer at step 1, read at step 3, the per-call panel shows the whole output instead of a preview, and a multi-role node draws its origin colour with a cited ring over it instead of being overwritten.

Why Watch at All

Most evaluation of retrieval for agents reports a number: recall at k, answer accuracy on a benchmark, the hop rate from our own lab. Numbers are how you know a change helped on average. They are not how you find out that the model reads rather than walks, or that one pointer in a hundred is the one it takes and that one goes into the answer. For that you need to see a single run, end to end, with the bytes that were actually exchanged, and you need the person who owns the system to sit in front of it and say what is unclear.

The Ask tab is not the product. The product is the bank and the agents that use it. The tab is how we argue about them. It took a day to build on top of a graph layer that took a month, and in its first morning it changed what we are fixing next. We think that is the right order: make the behaviour visible first, then make it good, and keep the audit trail honest enough that the second step has something to stand on.

Try It Yourself

The Ask tab is open to anyone on a demo bank: Harborline Provisions, a fictional food distributor whose Knowledge Bank holds how the business runs, with the connections the facts have to each other. Pick one of the suggested questions or ask your own, and watch the model work it. Open the playground.

Want to see what your agents actually do with what you give them?

We run shared Knowledge Banks for engineering teams and for the businesses they serve: embeddings, typed connections written by the agents themselves, retrieval that folds, and now a window where you can watch a model work a question against your bank one step at a time, with every step recorded.

Get in Touch

Building something real?

Tell us what slows your team down and get a scoped plan with a budget — drafted in minutes, confirmed by a human.

Scope a Pilot — Free