Skip to content
andrew.dunn.dev

Part 4: AI Harness

Part 4 of the digital garden series.

The harness applied

The harness exploration post describes the arc of learning to work with AI agents. The digital garden was where it started feeling like a daily tool rather than an experiment.

OpenCode is a terminal-based AI coding agent that supports custom commands, skills, and project-level context. The thing I keep learning is that the value isn’t in the model’s ability to write markdown. It’s in describing the system clearly enough that repeated interactions converge on consistent behavior.

Project context

OpenCode reads an AGENTS.md file that describes the project to every session: directory structure, frontmatter conventions, file naming rules, writing style principles, available commands. Without this, an AI assistant will make reasonable guesses about conventions, and those guesses will be different every time. With it, there’s an entire class of “actually, we do it this way” corrections that just doesn’t happen.

The commands

Each command is a markdown file in .opencode/commands/ that describes a multi-step workflow. The model follows the steps rather than improvising.

/capture processes items from private/inbox/ into content sections. It reads each item, proposes a destination (links, life, writing, or back to drafts), suggests tags, and searches existing content for wikilink opportunities.

/connect is the one I use most. Point it at a note and it scans existing content for thematic resonance and suggests specific wikilinks with context about where they’d fit. Bidirectional, capped at three to five suggestions.

/writing and /experience create content in content/writing/ and content/life/ respectively, with tag suggestions and a search for connections to existing notes.

/links appends a URL to the current month’s link collection. /validate runs pre-publish checks. /publish validates, confirms, commits, and pushes.

/memory manages session persistence, covered next.

note in the treeINBOXcaptured itemprivate/inbox/TRIAGE/captureproposes a destinationDRAFT/writing, /experiencewriting or life sectionLINK/connectthree to five wikilinksCHECK/validatepre-publish checksSHIP/publishcommits and pushesSIDE ENTRY/linksa URL onto the month’s listACROSS SESSIONS/memorywrites the handoff note

Each command is a markdown file describing a multi-step workflow, and six of them carry a note in a fixed order from the inbox to a pushed post. /connect, the one used most, sits at the turn. /links and /memory sit off that path.

Session memory

memory/next.md is a session handoff document. At the end of each session, /memory updates it with what was worked on, what to do next, and what was decided. At the start of the next session, the model reads it and has continuity.

memory/observations/ contains durable insights: conventions established, bug patterns discovered, decision rationales. They accumulate over time into something like institutional knowledge for a solo project.

The alternative is spending the first ten minutes of every session re-establishing context.

Voice consistency

The voice skill (.opencode/skills/voice/SKILL.md) is a style guide derived from analyzing the existing published writing: sentence structure, word choices, tone by content type, anti-patterns to avoid. When the model assists with writing, it loads this skill and produces output that sounds more like the existing corpus than like a chatbot.

The point is reducing the editing burden. I find myself editing less over time, which suggests it’s helping.

Transparency

When AI assists significantly, I say so. The reading roadmap post was produced through a deep research session, then reprocessed through the voice skill and editorial judgment. The post says so. Using AI as a co-author is something to be clear about, not hide.

What didn’t work

Early observation templates had typed categories and sequence-numbered filenames. Too heavy. The AGENTS.md was too long and too prescriptive. Both simplified through use, which is maybe the most interesting thing: the harness improves through use. Each session surfaces a gap, /memory captures it, and the next session starts with that knowledge.

Next: Part 5: Living with it