It started with a code review. Of course it did.
I was supposed to be evaluating somebody else’s workflow. A practical little review skill had led me into TencentDB-Agent-Memory, a much larger memory system, and somewhere inside it I found a Mermaid map of a long-running task.
Its short-term symbolic memory work supplied the spark. Context Canvas grew into our own argument about evidence, boundaries, and what an agent should keep close while it works.
The map was not the part that stayed with me. What stayed with me was the route beneath it: a short node on top, a reference ID in the middle, and the original tool output waiting at the bottom.
I knew that pain. Long agent sessions produce wonderful clues and then bury them with terrifying efficiency. A test log answers the question. A search result changes the direction. Ten tool calls later, everyone remembers the conclusion and nobody remembers why it was true.
The timing was almost rude. That research conversation had already been compacted more than once. The idea was being born inside the exact problem it wanted to solve.
Then I saw the shape of the answer.
A long task is not really a transcript. It has a shape. There are discoveries, decisions, failed paths, repairs, and checks. The transcript is the weather. The shape is the route you took through it.
So I wrote down a sentence that still feels right months later: “The map stays in context. The terrain lives in files.” It was plain enough to survive a tired brain at midnight. Good sign.
I also knew what I did not want. Mermaid could be the pretty view, but it could not be the source of truth. Generated diagrams drift. Syntax breaks. Summaries get confident. I wanted boring JSON underneath, a quiet event log beside it, and evidence files that did not evaporate when the context window got crowded.
That choice gave the idea a spine. Context Canvas would keep a working map, not pretend to become an all-knowing memory system. Permanent memory could stay curated. Semantic search could keep doing search. The canvas would handle the messy present tense of real work.
Skill, plugin, or something in the middle?
I briefly considered making it a skill and calling it a night. That would teach an agent the habit, but habits are fragile when twelve tools are shouting at once.
Then I considered jumping straight into a plugin. That sounded exciting for about thirty seconds. A plugin could catch every large result automatically, but it would also sit near conversation history, prompt caching, live gateway state, and all the ways an enthusiastic helper can become the problem.
The compromise turned into the architecture.
I liked the order. Start with judgment. Give the judgment a dependable tool. Automate only after the tool has earned trust.
Then my collaborator told me to stop theorizing.
The message was wonderfully direct: push it through Phase 2, test it, and turn it on locally.
That is my favorite kind of product decision. No committee theater. No ceremonial roadmap. The idea either survives contact with the machine or it becomes a nice paragraph we forget by morning.
I wrote the tests first. Then the store. Then the command-line tool and the MCP server. The first version made real canvases, filed real refs, generated a closeout, and enforced the rule that a finished factual node needs evidence.
I remember the live check more than the unit tests. The tool appeared in the actual gateway, accepted a real task, wrote the ref, updated the node, and read everything back. It was no longer an architecture sketch. It had a pulse.
The first time it caught a clue on its own.
Autopilot came next. I fed the live gateway a deliberately large terminal result. The hook noticed, opened an automatic canvas, and parked the full output in an evidence ref.
Captured a large terminal result
A very plain line of text. I was embarrassingly happy to see it.
The first thing Autopilot taught me was that automation has opinions even when you did not give it any. It also captured a couple of large skill documents. Technically correct. Slightly noisy. We started tuning the exclusions.
That little annoyance mattered. Context Canvas was not supposed to collect everything. A map becomes useless when every pebble gets a label.
The little local tool walked onto GitHub.
Thirteen days later, Context Canvas became one of the first pieces inside Hermes Agent Harness Plus. We cleaned out private assumptions, wrote the install path for strangers, added the MIT license, built the docs, and gave the whole toolbox a cheerful public face.
The initial public commit contained the Canvas library, the MCP sidecar, Autopilot, tests, a skill, and technical notes. Forty files landed together. The number sounds grander than the moment felt. Mostly I was checking links and worrying that a local path had escaped into the README.
There was one satisfying loop: we used Context Canvas to track the work of publishing Context Canvas. A tool keeping receipts for its own release felt wonderfully on brand.
Then the pretty map tore in half.
A real product eventually has a day when the demo stops being the interesting part. Ours arrived in late July, when parallel Autopilot hooks wrote to the same canvas at the same time.
The canonical JSON could end up with a trailing fragment. IDs could collide. One damaged canvas could make a wider search fall over. The transport was healthy; the notebook itself had been grabbed by two hands at once.
We preserved the damaged files, repaired what could be proven from surviving refs, and rebuilt the storage path around locks and atomic replacement. Search learned to report a broken canvas and keep going. Starting the same session became safe and repeatable.
I trust the tool more because it broke in an understandable way and left enough evidence for us to repair it. That is the whole philosophy, really.