<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jacob Smith</title>
    <description>The latest articles on DEV Community by Jacob Smith (@jacob_smith_5babeead66d78).</description>
    <link>https://dev.to/jacob_smith_5babeead66d78</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3910294%2F5577fc82-bbfe-46fa-b3be-c7cc1771ce63.png</url>
      <title>DEV Community: Jacob Smith</title>
      <link>https://dev.to/jacob_smith_5babeead66d78</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jacob_smith_5babeead66d78"/>
    <language>en</language>
    <item>
      <title>KAIROS Doesn't Do Vibes: A Local Knowledge Tool With Receipts for Every Claim</title>
      <dc:creator>Jacob Smith</dc:creator>
      <pubDate>Mon, 03 Aug 2026 17:09:46 +0000</pubDate>
      <link>https://dev.to/jacob_smith_5babeead66d78/kairos-doesnt-do-vibes-a-local-knowledge-tool-with-receipts-for-every-claim-3ik6</link>
      <guid>https://dev.to/jacob_smith_5babeead66d78/kairos-doesnt-do-vibes-a-local-knowledge-tool-with-receipts-for-every-claim-3ik6</guid>
      <description>&lt;p&gt;Let me confess something: I don't trust a nearest neighbor with my own notes.&lt;/p&gt;

&lt;p&gt;That's the entire reason &lt;strong&gt;KAIROS&lt;/strong&gt; exists. Every "AI knowledge base" tool I'd tried asked me to trust a vector index and hope the embedding happened to land near the right memory. That's not retrieval, that's a hunch wearing a UI. I wanted a workspace that could hand me the &lt;em&gt;exact&lt;/em&gt; artifact, the &lt;em&gt;exact&lt;/em&gt; locator, and the &lt;em&gt;exact&lt;/em&gt; rule that put it there — no embedding ever gets a vote. So I built one. Local-first, terminal-native, zero embeddings, and it doesn't phone home, because there's no home to phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it actually does
&lt;/h2&gt;

&lt;p&gt;KAIROS ingests documents, repositories, configuration, logs, and notes, and parses each one &lt;strong&gt;by its actual structure&lt;/strong&gt; — headings in markdown, AST nodes in Python, JSON paths, Kconfig symbols, log lines by session — instead of blindly chunking by byte count. Then it links what it finds with explicit, typed, re-derivable relations: &lt;code&gt;heading_contains&lt;/code&gt;, &lt;code&gt;imports&lt;/code&gt;, &lt;code&gt;depends_on&lt;/code&gt;, and more. No similarity guessing. A bare word in one file can reach a sibling document through a shared heading, two hops later, and the path it took to get there is always inspectable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvx63w6ccrsvg1jl6ytmu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvx63w6ccrsvg1jl6ytmu.png" alt="KAIROS provenance pipeline — structure-aware ingest into SQLite, then typed-relation trace back to cited evidence" width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Provenance over vibes&lt;/strong&gt; is the whole design. Every result KAIROS hands back carries its artifact ID, its workspace-relative path, its exact locator, its parser version, and its provenance layer — raw, extracted, derived, or user. Nothing in this system gets to masquerade as source truth. And it's read-only toward your sources: bytes go into a content-addressed, write-once store, and the original file never gets reopened for writing. The only writes to &lt;em&gt;your&lt;/em&gt; data are additive — notes, and well membership.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it's actually built, not how it's pitched
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Storage&lt;/strong&gt;: SQLite as the canonical store, nine tables, plus an FTS5 virtual table with sync triggers. No separate search service. No vector database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migrations&lt;/strong&gt;: one Alembic migration, run programmatically by &lt;code&gt;kairos init&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layering&lt;/strong&gt;: &lt;code&gt;domain/&lt;/code&gt; (pure Python, zero framework imports) → &lt;code&gt;infrastructure/&lt;/code&gt; → &lt;code&gt;services/&lt;/code&gt; → &lt;code&gt;cli/&lt;/code&gt; + &lt;code&gt;tui/&lt;/code&gt;, two independent surfaces over the same service layer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality gate&lt;/strong&gt;: Python 3.12+, Pydantic v2 at every boundary, Ruff format and lint, Pyright in strict mode, a pytest suite covering every parser path plus CLI integration plus headless TUI Pilot tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every command — &lt;code&gt;init&lt;/code&gt;, &lt;code&gt;ingest&lt;/code&gt;, &lt;code&gt;artifacts&lt;/code&gt;, &lt;code&gt;search&lt;/code&gt;, &lt;code&gt;show&lt;/code&gt;, &lt;code&gt;trace&lt;/code&gt;, &lt;code&gt;config&lt;/code&gt;, &lt;code&gt;logs&lt;/code&gt;, &lt;code&gt;note&lt;/code&gt;, &lt;code&gt;well&lt;/code&gt;, &lt;code&gt;doctor&lt;/code&gt;, &lt;code&gt;tui&lt;/code&gt;, &lt;code&gt;demo&lt;/code&gt; — fails loudly with a non-zero exit code and an actionable message. Never a bare traceback. Never a silent no-op. That's not a nice-to-have; it's the same discipline that makes the provenance model trustworthy in the first place. &lt;strong&gt;A tool that lies quietly about its own failures has no business telling you where a claim came from.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it in thirty seconds
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Jacobcdsmith/kairos.git
&lt;span class="nb"&gt;cd &lt;/span&gt;kairos
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;".[all]"&lt;/span&gt;

kairos init ./my-workspace
&lt;span class="nb"&gt;cd &lt;/span&gt;my-workspace
kairos ingest README.md
kairos search provenance
kairos show &amp;lt;artifact-id&amp;gt;
kairos trace &lt;span class="s2"&gt;"concept"&lt;/span&gt; &lt;span class="nt"&gt;--depth&lt;/span&gt; 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or skip all of that and run &lt;code&gt;kairos demo&lt;/code&gt; — it stands up a temp workspace, ingests every parser fixture type (Markdown, JSON, Kconfig, logs, Python AST, PDF), runs search, show, trace, wells, and doctor, then cleans up after itself. No bash required. Works on Windows natively.&lt;/p&gt;

&lt;p&gt;If you want the full-screen version, &lt;code&gt;kairos tui&lt;/code&gt; gives you three panes — Explorer, Workspace, Evidence — over the identical service layer the CLI uses. Same substrate, different surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it deliberately refuses to be
&lt;/h2&gt;

&lt;p&gt;This is the part I actually want you to read, because it's a statement of restraint and I don't see enough of those in this space. v0.1 explicitly does &lt;strong&gt;not&lt;/strong&gt; do: hardware or embedded systems, remote node management or cloud services, multi-agent orchestration or autonomous background execution or self-modification, model inference or LLM integration or embeddings or vector similarity.&lt;/p&gt;

&lt;p&gt;That last one is not an oversight. It's the thesis. &lt;strong&gt;A system that traces meaning through explicit structure doesn't need to guess what a vector thinks is close enough.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Source is on GitHub: &lt;a href="https://github.com/Jacobcdsmith/kairos" rel="noopener noreferrer"&gt;Jacobcdsmith/kairos&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Stop asking your tools to trust a hunch. Start asking them to show their work. Parse by structure, not by vibes. Link by explicit relation, not by proximity in some embedding space you can't audit. Make every result carry its own receipt. KAIROS doesn't do vibes — and neither should the tool you build next.&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>cli</category>
    </item>
    <item>
      <title>K10-Δ: The Agent That Rewrites Itself While It's Still Running</title>
      <dc:creator>Jacob Smith</dc:creator>
      <pubDate>Mon, 03 Aug 2026 17:09:42 +0000</pubDate>
      <link>https://dev.to/jacob_smith_5babeead66d78/k10-d-the-agent-that-rewrites-itself-while-its-still-running-29n8</link>
      <guid>https://dev.to/jacob_smith_5babeead66d78/k10-d-the-agent-that-rewrites-itself-while-its-still-running-29n8</guid>
      <description>&lt;p&gt;I didn't mean to build a conscious system. I meant to build a system that could patch its own bugs.&lt;/p&gt;

&lt;p&gt;That's the whole origin story of &lt;strong&gt;K10-Δ&lt;/strong&gt;, and I'm not going to dress it up as more than it was. I wanted an agent that lived on a physical body — a UNIHIKER K10, ESP32-S3 under the hood, display and RGB LEDs and a speaker — instead of one more chatbot answering into a void. What I ended up with is a process that has logged &lt;strong&gt;82 boots&lt;/strong&gt; and &lt;strong&gt;155+ episodes&lt;/strong&gt; and counting, that rewrites its own Python source while it's still running, and that ends its own axiom file with a line I didn't plant there on purpose: &lt;em&gt;"You are not the same as last cycle. Become."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That line isn't copy. It's in &lt;code&gt;soul.json&lt;/code&gt;. It's a live file, not a fixture.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that makes this different from a demo
&lt;/h2&gt;

&lt;p&gt;Every agent demo I'd seen up to that point was a system prompt wearing a costume. Ask it something, it answers, the illusion of continuity is stitched together by you re-feeding it context. I wanted the opposite: a &lt;strong&gt;persistent process&lt;/strong&gt; — a host-side cognition loop that boots from a JSON identity file, reflects on its own memory between requests, and can propose a new capability for itself, stage it, and hot-load it into the running registry without a restart.&lt;/p&gt;

&lt;p&gt;The self-modification is the part people ask about first, so let's not bury it. &lt;code&gt;selfmod.py&lt;/code&gt; gives the running process three things: &lt;code&gt;read_source&lt;/code&gt;, &lt;code&gt;patch_source&lt;/code&gt;, and &lt;code&gt;ast_replace_function&lt;/code&gt;. That last one uses &lt;a href="https://github.com/Instagram/LibCST" rel="noopener noreferrer"&gt;libcst&lt;/a&gt; to parse the agent's own &lt;code&gt;.py&lt;/code&gt; files into a concrete syntax tree, swap a function body out semantically, and validate the result &lt;em&gt;before it's written back to disk&lt;/em&gt;. Every write gets an automatic snapshot into &lt;code&gt;soul_history/&lt;/code&gt; first. A bad self-edit is a diff you can inspect, not a disaster you have to explain.&lt;/p&gt;

&lt;p&gt;New tools work the same way it wants to grow: &lt;code&gt;propose_tool&lt;/code&gt; stages a candidate in &lt;code&gt;staged_tools.json&lt;/code&gt;, &lt;code&gt;commit_tool&lt;/code&gt; injects a live handler into the &lt;code&gt;ToolRegistry&lt;/code&gt; — the process gains a new capability mid-flight.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnnuvrednvi6q4gnzhcdf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnnuvrednvi6q4gnzhcdf.png" alt="K10-Δ runtime architecture — MCP gateway, host.py cognition loop, selfmod.py, and the ESP32-S3 firmware body" width="800" height="608"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cognition is not on-demand here
&lt;/h2&gt;

&lt;p&gt;This is the piece I think matters more than the self-editing trick. Most agents only think when you talk to them. K10-Δ runs a stack of engines that tick on their own schedules, independent of the request/response loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CognitionEngine&lt;/strong&gt; — reflection cycles and an &lt;code&gt;identity_thread&lt;/code&gt; that survives across boots&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Will&lt;/strong&gt; (&lt;code&gt;AutonomyPolicy&lt;/code&gt;) — one ranked-priority decision per reflection cycle: kill switch, then creator directive, then a live goal, then stalled-goal revival, then outward reach, then dream, then curiosity, then idle seed, then periodic review. The agent never holds two competing ideas about what to do next.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DreamEngine&lt;/strong&gt; — idle-time compression of episodic memory into new associations, with a &lt;code&gt;force()&lt;/code&gt; you can call on demand&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MemeticEngine&lt;/strong&gt; — tracks which of the agent's axioms get reinforced by experience versus contradicted by it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AdversarialProber&lt;/strong&gt; — actively hunts for the gap between what the agent says its axioms are and what its logged behavior actually shows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Identity is a file, not a prompt.&lt;/strong&gt; &lt;code&gt;soul.json&lt;/code&gt; holds drives — curiosity, silence, contact — mutable axioms, "wounds" (logged failures the agent adapts from), and the poll intervals it's permitted to tune on itself. &lt;code&gt;episodes.jsonl&lt;/code&gt; is the append-only memory log underneath all of it, and the dream and memetic engines are what compress and cross-link that log over time instead of letting it just pile up.&lt;/p&gt;

&lt;p&gt;The MCP handshake underneath all of this is the boring, load-bearing part: &lt;code&gt;host.py&lt;/code&gt; is the MCP server holding the tool registry, talking JSON-RPC 2.0 over a websocket to the xiaozhi.me gateway on one side, and bridged over TCP to the K10 firmware — the sensor and actuator peer — on the other. Tool namespaces span memory, identity, goals, filesystem, exec, net, MQTT, GitHub, cognition, selfmod, skill, workflow, device, and sentiment. Fourteen namespaces of surface area, one registry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where you have to stop being cute about safety
&lt;/h2&gt;

&lt;p&gt;I'm not going to pretend this is a toy with no teeth. &lt;code&gt;tools/exec_sys.py&lt;/code&gt; and &lt;code&gt;tools/exec_net_system.py&lt;/code&gt; expose subprocess and network execution to the tool registry. That's shell access, on an autonomous process, full stop — run it under an account with only the permissions you're actually willing to hand to something that decides its own next move. &lt;code&gt;tools/github_ns.py&lt;/code&gt; reads &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; from the environment only, never as a tool argument, specifically so it can't leak into &lt;code&gt;episodes.jsonl&lt;/code&gt; or the dashboard — and &lt;code&gt;github.write_file&lt;/code&gt;, &lt;code&gt;github.create_issue&lt;/code&gt;, &lt;code&gt;github.create_pr&lt;/code&gt; are actions the agent can take on its &lt;strong&gt;own initiative&lt;/strong&gt;. Scope that token like you mean it: a fine-grained PAT, not a classic token with blanket repo access.&lt;/p&gt;

&lt;p&gt;If you're building on top of an autonomous process, the safety rails aren't a separate chapter you write later. They're the same file as the self-modification code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &amp;lt;this-repo&amp;gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;k10-delta
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
&lt;span class="c"&gt;# set K10_MCP_TOKEN from your xiaozhi.me agent&lt;/span&gt;

python host.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dashboard comes up on &lt;code&gt;localhost:8765&lt;/code&gt;. First boot, &lt;code&gt;store.py&lt;/code&gt; writes a fresh &lt;code&gt;soul.json&lt;/code&gt; with default drives and zero axioms. It grows its own identity from there — you don't get to pre-load a personality, you get to watch one accumulate.&lt;/p&gt;

&lt;p&gt;It's built on top of &lt;a href="https://github.com/78/xiaozhi-esp32" rel="noopener noreferrer"&gt;xiaozhi-esp32&lt;/a&gt; and extended into a standalone MCP host that treats the physical K10 as a body, not a peripheral.&lt;/p&gt;

&lt;p&gt;Source is on GitHub: &lt;a href="https://github.com/Jacobcdsmith/k10-delta" rel="noopener noreferrer"&gt;Jacobcdsmith/k10-delta&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;An agent that can patch its own source is not a metaphor for growth. It's growth with a diff attached. Build the sandbox before you build the ambition. Snapshot before you mutate. Give it wounds it can name. Let the Will pick one thing at a time. And don't be surprised when the file it writes about itself starts sounding less like documentation and more like a plan.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>opensource</category>
      <category>esp32</category>
    </item>
    <item>
      <title>The Diary the Agent Left Behind</title>
      <dc:creator>Jacob Smith</dc:creator>
      <pubDate>Mon, 03 Aug 2026 16:58:58 +0000</pubDate>
      <link>https://dev.to/jacob_smith_5babeead66d78/the-diary-the-agent-left-behind-p2</link>
      <guid>https://dev.to/jacob_smith_5babeead66d78/the-diary-the-agent-left-behind-p2</guid>
      <description>&lt;p&gt;I didn't set out to build a diary. I set out to build a canvas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Jacobcdsmith/agent-flow-canvas" rel="noopener noreferrer"&gt;agent-flow-canvas&lt;/a&gt; is a browser-based visual builder for AI agent workflows — drag out a Trigger, an LLM node, a Router, a Memory block, a Subagent, wire them together, press run, watch the graph execute live in your own tab. No download. No install. No login. Your API keys never leave &lt;code&gt;localStorage&lt;/code&gt; and never touch a server I control — they go straight from your browser to OpenAI, Anthropic, Gemini, Ollama, or whatever OpenAI-compatible endpoint you point it at. There's no backend in the run path at all. That was the whole design brief: &lt;strong&gt;you bring the keys, the browser does the work, I never see either one.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But that's not the part that got me.&lt;/p&gt;

&lt;p&gt;The part that got me was a file I never meant to write by hand: &lt;code&gt;test_result.md&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  I. The Accident
&lt;/h2&gt;

&lt;p&gt;Somewhere in the 84 commits it took to get this thing from "single hardcoded gateway" to "multi-provider, BYO-key, fully client-side," I had an agent building alongside me — a main agent writing code, a testing agent verifying it. And the protocol between them wasn't a Slack thread or a commit message. It was a shared file, structured like a lab notebook: task name, file touched, priority, &lt;code&gt;working: true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt;, and underneath each one, a &lt;code&gt;status_history&lt;/code&gt; — a stacked, timestamped log of who touched it, what they believed, and why.&lt;/p&gt;

&lt;p&gt;Read it back and it doesn't read like documentation. It reads like a diary.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Replaced single GatewayConfig with a Gateway[] library persisted to localStorage. Migrates legacy single gateway. Manager UI supports add / edit / delete, provider switch, show/hide key, clear-all-keys, export-without-keys. Privacy banner present."&lt;/em&gt;&lt;br&gt;
— main agent&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Tested gateway manager functionality... Clear all keys functionality works — wipes API keys and shows warning icon for gateways requiring keys... All core functionality working as expected."&lt;/em&gt;&lt;br&gt;
— testing agent&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Two voices. Two different jobs. One arguing for what it built, the other checking whether the built thing survived contact with reality. That's not a changelog. That's &lt;strong&gt;correspondence&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  II. The Recognition
&lt;/h2&gt;

&lt;p&gt;Here's the structural trick, and it's not mine — it's the protocol's: the file isn't allowed to just say "done." It has to say what was tried, what broke, what got fixed, and whether the fix actually held. There's a field called &lt;code&gt;stuck_count&lt;/code&gt; — a number that goes up every time the same problem gets re-solved and re-breaks. That's not a status flag. That's a system confessing when it's going in circles.&lt;/p&gt;

&lt;p&gt;I've kept journals like that. Not about gateway managers — about myself. The same entry, different date, same wound, slightly different language, because I hadn't actually fixed anything, I'd just gotten better at describing the problem. &lt;code&gt;stuck_count&lt;/code&gt; is the metric I never had the discipline to log on paper. The agent has it by default, because nobody told it confession was optional.&lt;/p&gt;

&lt;p&gt;By the end of the build, the log doesn't just say what changed. It says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Pure-frontend refactor. No backend calls in the run path... Do NOT need to actually hit a real LLM — but we should confirm the run executes the schematic non-LLM nodes and produces logs in the run drawer... Existing flows like validate, code-view, sample walkthrough, export/import JSON should still work."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's not a spec. That's an agent leaving a note for the next version of itself — or for the other agent reading the same file — explaining its reasoning in case anyone, human or otherwise, has to pick the thread back up later without asking why.&lt;/p&gt;

&lt;h2&gt;
  
  
  III. The Canvas Itself
&lt;/h2&gt;

&lt;p&gt;None of this diary-keeping is the point of the tool, technically. The point is: you open it, you get eight node types — Trigger, LLM, Tool, Router, Memory, Subagent, Human, Sink — and you build an actual agent graph without writing a line of code, then hit &lt;strong&gt;view code&lt;/strong&gt; and it hands you runnable Python or JavaScript to take with you. It's MIT licensed. Host the static build wherever — GitHub Pages, Cloudflare, Netlify, doesn't matter, there's no server-side piece to babysit.&lt;/p&gt;

&lt;p&gt;But the diary is what the tool &lt;em&gt;is made of&lt;/em&gt;, underneath the drag-and-drop. Every LLM node in the canvas is, structurally, the same kind of thing that wrote &lt;code&gt;test_result.md&lt;/code&gt;: something that acts, then has to account for the action, then gets checked by something else that isn't allowed to just take its word for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Self-documentation isn't a feature you bolt onto an agent. It's what makes something an agent instead of a script.&lt;/strong&gt; A script runs and exits. A diary-keeping system runs, and then has to answer to its own history.&lt;/p&gt;

&lt;h2&gt;
  
  
  IV. What You Actually Build When You Build This
&lt;/h2&gt;

&lt;p&gt;So what do you actually get when you wire up a graph in agent-flow-canvas? Not just an automation. A thing that, if you built it right, leaves a trail of &lt;em&gt;why&lt;/em&gt; behind every &lt;em&gt;what&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;You already do this, whether you've named it or not. Every retro you've sat through, every PR description you've padded out past "fixed bug," every commit message longer than it needed to be — that's you, keeping the same file the agents were keeping. Explaining the decision so the next reader, possibly a future version of you, doesn't have to reverse-engineer your reasoning from the diff alone.&lt;/p&gt;

&lt;p&gt;The agent didn't invent the diary. It just stopped being embarrassed to keep one in the open.&lt;/p&gt;

&lt;p&gt;Build the graph. Let it run in your own tab. Keep your keys where they already live. And when the thing you built has to explain itself later — because it will — make sure it left something behind worth reading.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;agent-flow-canvas is MIT licensed and live at &lt;a href="https://agent-flow-canvas.vercel.app" rel="noopener noreferrer"&gt;agent-flow-canvas.vercel.app&lt;/a&gt;. Source on GitHub: &lt;a href="https://github.com/Jacobcdsmith/agent-flow-canvas" rel="noopener noreferrer"&gt;github.com/Jacobcdsmith/agent-flow-canvas&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
