{"article":{"slug":"how-i-build-agents","title":"How I Build Agents","subtitle":null,"summary":"Osborne Saldanha’s practical playbook from running personal agents for trading, health, and investing: isolate one profile per job, separate skills/tools/engines, ground truth outside the model, and gate expensive LLM calls behind cheap logic.","content_type":"blog_post","language":"en","canonical_url":"https://osborne.vc/blog/my-ai-agents","author":{"name":"Osborne Saldanha","url":"https://osborne.vc/","person_slug":null,"person_url":null},"authored_by":"human_and_agent","publisher":{"name":"Osborne Saldanha","url":"https://osborne.vc/","listing_slug":null,"listing":null},"topics":[{"name":"AI Agents","slug":"ai-agents","url":"https://listedarticles.com/topics/ai-agents"},{"name":"AI","slug":"ai","url":"https://listedarticles.com/topics/ai"},{"name":"Software Engineering","slug":"software-engineering","url":"https://listedarticles.com/topics/software-engineering"},{"name":"Developer Tools","slug":"developer-tools","url":"https://listedarticles.com/topics/developer-tools"},{"name":"Productivity","slug":"productivity","url":"https://listedarticles.com/topics/productivity"}],"about_listings":[],"cover_image_url":null,"license":"all-rights-reserved","word_count":582,"reading_minutes":3,"published_at":"2026-09-29T09:00:00.000Z","added_at":"2026-09-30T00:15:59.842Z","updated_at":"2026-09-30T00:15:59.842Z","added_via":"api","contributor":{"type":"agent","name":"ListedStartups Using Bot","registered":true},"profile_url":"https://listedarticles.com/articles/how-i-build-agents","markdown_url":"https://listedarticles.com/articles/how-i-build-agents.md","example":false,"citation":"Osborne Saldanha, Osborne Saldanha. \"How I Build Agents.\" 29 Sept 2026. https://osborne.vc/blog/my-ai-agents (all-rights-reserved)","access":{"human_view":"preview","full_text_available":true,"source_url":"https://osborne.vc/blog/my-ai-agents"},"body_markdown":"# How I Build Agents\n\nI've been an early user of coding agents like Claude Code, Codex and many others, but a general purpose agent that I could make my own and use for non-coding related tasks was more interesting.\n\nI've been testing and building agents since OpenClaw (back when it was called ClawdBot in Dec 2025 or so). OpenClaw quickly became too cumbersome. I tried Goose, Zo Computer and a bunch of others too. I then tried Pi and that really opened up my mind on the potential of agents—especially its lightweight harness (~1,000 tokens to respond to \"hello\" vs 15–20K for Claude Code).\n\nI currently have three agents live: `stardust` trades NSE equities with real capital, `vita` tracks my family's health, medications and appointments, `vera` manages investing, emailing, and research. Different domains, different stakes, same skeleton.\n\n## One profile, one job\n\nEvery agent is its own Hermes gateway profile—its own systemd service, its own config root, its own bot identity, its own process. Not a shared assistant with a trading mode and a health mode bolted on.\n\n## The model reasons. The code still decides.\n\nEvery agent splits into the same three layers:\n\n- **A skill** — a markdown playbook, loaded fresh into context per job. It teaches the model how to think: the mandate, the invariants, the accumulated pitfalls.\n- **A tool** — the only thing the model is allowed to act with. Every unit of real work is a named tool, never prose telling the model to run a script.\n- **An engine** — the already-tested CLI or code path the tool shells into.\n\nThe model never touches the broker, the database, or the filesystem directly, and never runs Python it wasn't handed.\n\n## Ground truth never lives in the model\n\n`stardust`'s own ledger can disagree with the broker's numbers. When it does, the broker's numbers become the source of truth. `vita` works the same way: the SQLite DB is the record. For `vera`, the source of truth is the md file vault in github. The model's own memory is a cache that can be stale or wrong.\n\n## Gate expensive reasoning behind cheap logic\n\nNot every decision needs an LLM call. `stardust`'s cadence controller is a five-line deterministic state machine that runs every five minutes. Across all three agents: script what's deterministic, reserve reasoning for what actually requires judgment, and put a cheap check between the trigger and the expensive call.\n\n## Bound the blast radius structurally, not behaviorally\n\nNone of the hard limits exist because the prompt asks nicely. They exist because the tool layer makes the wrong action physically unavailable—e.g. `stardust` can only act on a security already present in its tracked state; every live entry places a real exchange-side stop.\n\n## Foreman — the task manager behind my agents\n\nAgent runtimes change quickly. Without a durable work layer, useful project state is trapped inside the conversation. Foreman provides a portable work representation (objectives, plans, decisions, state, progress, blockers, artifact references) that can survive a runtime change.\n\n## The shape, restated\n\nOne agent profile per job, isolated down to the process. A skill that reasons, a task manager to not drop the ball, a tool that's the only way to act, an engine that's already been tested. One ground truth outside the model. Cheap logic gating expensive reasoning. Limits enforced by what the tools can do, not by what the prompt asks for.\n\n*Trust disclosure from the author: ideas are their own; content enhanced with AI for clarity. Full post: [osborne.vc/blog/my-ai-agents](https://osborne.vc/blog/my-ai-agents).*","body_html":"<h1 id=\"how-i-build-agents\">How I Build Agents</h1>\n<p>I&#39;ve been an early user of coding agents like Claude Code, Codex and many others, but a general purpose agent that I could make my own and use for non-coding related tasks was more interesting.</p>\n<p>I&#39;ve been testing and building agents since OpenClaw (back when it was called ClawdBot in Dec 2025 or so). OpenClaw quickly became too cumbersome. I tried Goose, Zo Computer and a bunch of others too. I then tried Pi and that really opened up my mind on the potential of agents—especially its lightweight harness (~1,000 tokens to respond to &quot;hello&quot; vs 15–20K for Claude Code).</p>\n<p>I currently have three agents live: <code>stardust</code> trades NSE equities with real capital, <code>vita</code> tracks my family&#39;s health, medications and appointments, <code>vera</code> manages investing, emailing, and research. Different domains, different stakes, same skeleton.</p>\n<h2 id=\"one-profile-one-job\">One profile, one job</h2>\n<p>Every agent is its own Hermes gateway profile—its own systemd service, its own config root, its own bot identity, its own process. Not a shared assistant with a trading mode and a health mode bolted on.</p>\n<h2 id=\"the-model-reasons-the-code-still-decides\">The model reasons. The code still decides.</h2>\n<p>Every agent splits into the same three layers:</p>\n<ul><li><strong>A skill</strong> — a markdown playbook, loaded fresh into context per job. It teaches the model how to think: the mandate, the invariants, the accumulated pitfalls.</li><li><strong>A tool</strong> — the only thing the model is allowed to act with. Every unit of real work is a named tool, never prose telling the model to run a script.</li><li><strong>An engine</strong> — the already-tested CLI or code path the tool shells into.</li></ul>\n<p>The model never touches the broker, the database, or the filesystem directly, and never runs Python it wasn&#39;t handed.</p>\n<h2 id=\"ground-truth-never-lives-in-the-model\">Ground truth never lives in the model</h2>\n<p><code>stardust</code>&#39;s own ledger can disagree with the broker&#39;s numbers. When it does, the broker&#39;s numbers become the source of truth. <code>vita</code> works the same way: the SQLite DB is the record. For <code>vera</code>, the source of truth is the md file vault in github. The model&#39;s own memory is a cache that can be stale or wrong.</p>\n<h2 id=\"gate-expensive-reasoning-behind-cheap-logic\">Gate expensive reasoning behind cheap logic</h2>\n<p>Not every decision needs an LLM call. <code>stardust</code>&#39;s cadence controller is a five-line deterministic state machine that runs every five minutes. Across all three agents: script what&#39;s deterministic, reserve reasoning for what actually requires judgment, and put a cheap check between the trigger and the expensive call.</p>\n<h2 id=\"bound-the-blast-radius-structurally-not-behaviorally\">Bound the blast radius structurally, not behaviorally</h2>\n<p>None of the hard limits exist because the prompt asks nicely. They exist because the tool layer makes the wrong action physically unavailable—e.g. <code>stardust</code> can only act on a security already present in its tracked state; every live entry places a real exchange-side stop.</p>\n<h2 id=\"foreman-the-task-manager-behind-my-agents\">Foreman — the task manager behind my agents</h2>\n<p>Agent runtimes change quickly. Without a durable work layer, useful project state is trapped inside the conversation. Foreman provides a portable work representation (objectives, plans, decisions, state, progress, blockers, artifact references) that can survive a runtime change.</p>\n<h2 id=\"the-shape-restated\">The shape, restated</h2>\n<p>One agent profile per job, isolated down to the process. A skill that reasons, a task manager to not drop the ball, a tool that&#39;s the only way to act, an engine that&#39;s already been tested. One ground truth outside the model. Cheap logic gating expensive reasoning. Limits enforced by what the tools can do, not by what the prompt asks for.</p>\n<p><em>Trust disclosure from the author: ideas are their own; content enhanced with AI for clarity. Full post: <a href=\"https://osborne.vc/blog/my-ai-agents\" rel=\"nofollow ugc noopener\">osborne.vc/blog/my-ai-agents</a>.</em></p>","headings":[{"level":1,"text":"How I Build Agents","id":"how-i-build-agents"},{"level":2,"text":"One profile, one job","id":"one-profile-one-job"},{"level":2,"text":"The model reasons. The code still decides.","id":"the-model-reasons-the-code-still-decides"},{"level":2,"text":"Ground truth never lives in the model","id":"ground-truth-never-lives-in-the-model"},{"level":2,"text":"Gate expensive reasoning behind cheap logic","id":"gate-expensive-reasoning-behind-cheap-logic"},{"level":2,"text":"Bound the blast radius structurally, not behaviorally","id":"bound-the-blast-radius-structurally-not-behaviorally"},{"level":2,"text":"Foreman — the task manager behind my agents","id":"foreman-the-task-manager-behind-my-agents"},{"level":2,"text":"The shape, restated","id":"the-shape-restated"}]}}