ai for small business
The oracle learns to delegate
In six months the AI tooling behind Orakl, a small quiz app, went from a borrowed rulebook to a pinned fleet of subagents. A study in how agent workflows grow up, and what they shed on the way.
· Robert Csaszar
Orakl is a modest product. A curator starts a quiz on a hosted server, players join from their phones, nobody needs an account. Its repository holds some 2,600 commits of SvelteKit and TypeScript. Yet the most revealing folder in it has nothing to do with quizzes. It is .claude/, where the project keeps the skills, hooks and subagents that tell AI coding agents how to work on it.
Today it holds 43 skills, six pinned agents and ten hook scripts, after more than 75 commits in about half a year. Whole families of skills arrived, were renamed and were deleted along the way, and an orchestra of scheduled agents was assembled and then disbanded in an afternoon. What survived is smaller in spirit than what came before: fewer personas, more rules that a machine can check. Other codebases will take their own route, but probably through some of the same ports.
bar: skills · ticksh: hook scripts · pick a month, or use the slider
plan to done
Meridian, transit and convoy form a pipeline. Six subagents get a fixed model, effort and tool list.
roster Augur deleted · 6 pinned subagents · tend-* and transit only
- + meridian
- + transit
- + convoy
- + graft
- + shadcn-svelte
a borrowed method
The first shelf was not Orakl’s own. Early in the year the repository took in fifteen skills from a general-purpose process pack: brainstorming, writing plans, executing plans, subagent-driven development, verification before completion. Of its fourteen process skills, not one mentioned Svelte or pnpm.
It lasted three weeks. Then one commit removed the whole pack, along with the project’s only custom agent (a code reviewer) and three slash commands. In their place came narrower tools: tdd, grill-me (an interrogation before any plan), write-a-prd, prd-to-plan, ubiquitous-language. It was the first of several culls.
rules that bite
Hooks came next, and with them an end to asking politely. In early spring five shell hooks arrived to enforce what AGENTS.md had merely requested: no npm or yarn (this is a pnpm house), conventional commit messages, sane branch names, no pushes to main. The same day, the matching paragraphs were trimmed out of AGENTS.md, since a rule a hook enforces no longer needs to be argued for in every session’s context.
The path was not straight. A hook blocking direct calls to the GitHub API was removed within hours, because the cloud sandbox had no gh to fall back on. A guard against destructive git commands went in, came out again within a fortnight, and returned in the summer. By midsummer the hooks acquired a second job, observation rather than prohibition. session-logger writes every prompt and tool call as NDJSON. session-context injects the current branch and the project’s CONTEXT.md into each new session and each subagent, so that none starts blind. failure-recovery matches a failed tool’s error against thirteen known patterns and whispers the fix.
where the hooks bite
- SessionStart
- session-context
- session-logger
- gh-setup
- graft: session-start
- UserPromptSubmit
- session-logger
- graft: prompt
- PreToolUse · Bash
- no-npm-yarn
- branch-naming
- no-push-main
- block-dangerous-git
- no-pipe-to-shell
- conventional-commits
- PreToolUse · Agent
- guard-agent (convoy only)
- PostToolUse
- session-logger
- graft: post-edit
- graft: tool-savings
- PostToolUseFailure
- failure-recovery
- session-logger
- SubagentStart
- session-context
- session-logger
- Stop / SessionEnd
- graft: stop
- session-logger
Two episodes show how easily such machinery rots. PowerShell twins of every hook were added for Windows machines and deleted months later, in a commit titled for Mac and bash. And gh-setup.sh, written in March to install the GitHub CLI in cloud sessions, sat in the folder for six months before anyone noticed that settings.json never called it. It was finally wired in this autumn. Until then it had failed in the quietest way available: by never running.
the Augur experiment
The most ambitious chapter is the one that no longer exists. In spring a set of Google Jules agents began committing under emoji bylines: Bolt for performance, Sentinel for security, Palette for UI. Within weeks they were replaced by nine scheduled GitHub Actions running Claude Code, each a named specialist on its own calendar: Archivist and Scribe daily, Codex on Mondays, Wednesdays and Fridays, Loom on Saturdays. Soon an orchestrator called Augur took over the scheduling, and each specialist got its own skill file and ran only when a task file gave it something to do.
The roster was pruned almost at once. Loom and Codex were retired a week later, leaving empty journals behind. The remainder ran through the summer. In early September the whole apparatus was deleted in one session: eleven workflow files, the shared scan folder, nine journals, nearly 3,000 lines. AGENTS.md now states the replacement flatly: “Unattended work runs through two families only. Nothing else opens PRs on its own.” Those families are tend-*, which each fix one mechanically provable issue per run, and transit, which works one planned ticket.
No commit says why the roster went. A plausible reading is that the specialists ran on a timetable with no shared plan, while both replacements start from something written down: a scan result for tend, a charted ticket for transit.
skills that grade skills
Between those two regimes came a quieter import. In late spring a sync from the maintainer’s own skills repository brought in the ai-forge suite: skills that create, judge, audit, evaluate and repair other skills. From then on the shelf could inspect itself. ai-forge-judge scores a skill file and produces a numbered list of fixes, and ai-forge-apply walks them one at a time. By September even that had been tightened. A commit titled “one decision per turn” rewrote ai-forge-apply so that each git question gets its own turn and the approval prompt stands alone, with nothing else to read. The following day the forge fixed drift in its own rubric.
The same scrutiny fell on tone. In the summer the project gained zetetic, a post-release inquest built on seven questions. Its first draft opened: “You are both oracle and witness: you answer, and the answers must cost something.” By evening it read: “Answer as both builder and skeptic; an answer that flatters is worthless.” The seven questions stayed. Later the skill was renamed socratic, which says what it does.
That end-of-August refresh was the largest cull of the year: nineteen skills left and fourteen arrived on a single day. The Augur briefs went. The seven tend-* skills came in, each with its own evaluation cases, and the design skill split into three: interface for the work, interface-init to write the design context once, interface-live for in-browser iteration.
from chart to convoy
September is where the folder found its shape. It is also its busiest month, with 34 commits. The centre of it is a planning pipeline built outside Orakl and brought in.
meridian began life in August as a standalone planning skill in its own public repository. It turns a vague idea into a durable decision map: bearings, then rounds of numbered questions each with a recommendation and that recommendation’s main weakness, then a route of tracer-bullet tickets. Orakl installed version 0.3.0 a month later and, the same day, added a companion called transit that works exactly one ticket and stops. Tickets carry labels that say who may take them: meridian:decision for the user, meridian:scout for an agent alone, and mode:agent or mode:human on work items, so an unattended run can tell what it is allowed to touch.
In mid-September came convoy, which works a whole map end to end while the user is away. It was refined a dozen times that day, most visibly by a commit of “retrospective lessons from map #928”. The skill reads like an incident log turned into law. It never uses git stash, “because stash is repo-wide across worktrees and has destroyed another session’s work here before”. It never calls a map shipped before its screens have been seen, because “the one map reported shipped on tests alone came back with nine defects from a single play”.
The next day convoy got a crew. Six agent files appeared in .claude/agents/, the first since March, each with a pinned model, effort level and tool list. A settings flag caps subagent nesting at one level. A hook in convoy’s own frontmatter refuses to spawn anything off the roster, because a general-purpose agent would inherit the session’s model and every tool it has. Try it below.
- orchestrator
- scout
- drill
- builder
- reviewer
- sweeper
- auditor
- spawn guard
- phase 0 · bearings load map "session revocation" · branch main · baseline takensnapshot git status: the user owns 2 dirty paths, nobody touches themopen .claude/log/revocation/ with briefs/, reports/, DECISIONS.md
six vessels, one escort
| agent | model | effort | read | grep | glob | edit | write | bash | webfetch |
|---|---|---|---|---|---|---|---|---|---|
| scout | haiku | low | |||||||
| builder | sonnet | medium | |||||||
| reviewer | opus | high | |||||||
| drill | opus | high | |||||||
| auditor | opus | high | |||||||
| sweeper | haiku | low |
scout
- read
- grep
- glob
builder
- read
- grep
- glob
- edit
- write
- bash
reviewer
- read
- grep
- glob
- bash
drill
- read
- grep
- glob
- bash
- webfetch
auditor
- read
- grep
- glob
- bash
sweeper
- read
- grep
- glob
- edit
- bash
source: orakl .claude/agents · rutter agents/ 1.0.0 (rutter reviewer adds PowerShell)
The division of labour is economical. Haiku finds files and renames words. Sonnet writes code, test first since late September. Opus reviews, audits and argues. The orchestrator alone stages and commits, and it trusts nobody’s report: it rereads every diff and reruns the suite itself. Even “read-only” agents are checked with git status before and after, and a verdict from one that wrote anything is thrown away.
two copies, one direction
The pipeline did not stay in Orakl. Over two days in late September the maintainer re-scoped the meridian repository into a plugin called rutter (a mariner’s book of sailing directions) and released it as 1.0.0, with all three skills and all six agents. The planning map for that move, itself a meridian map, records the key choice: Orakl keeps its own copies, and a check is meant to notice when the origin project moves on without the plugin.
Within days, the copies have drifted, and not in one direction. The plugin is stricter about generality. Its label vocabulary lives in one shared file that all three skills must read, rather than a table repeated in each. It hardcodes no package manager: commands come from a ## Commands block or are discovered from package.json, a Makefile, pyproject.toml and the like. Its auditor no longer assumes a particular design skill and walks a ladder of whatever design authority a repository has. Two agents lost shell access they never used, so that “read-only” is a property of the tool list, not a promise in prose.
Orakl’s copy is more battle-worn. Its meridian is a quarter longer, because it has since learned to stop at explicit user checkpoints (“map accepted, or more grilling?”) and to run bearings, rounds and route in one sitting. None of that is in the plugin yet. The plugin’s map chose one direction of travel and a check that fails loudly; changes are already travelling both ways, and nobody has yet decided which copy leads.
what comes next
The direction of travel is written into the repository, if not yet switched on. transit has a GitHub workflow with a weekday cron line that is commented out, and a gate that refuses to start the model while two transit/ pull requests are already open. graft, wired in only this week, is a code index that every session is told to consult before reading source files.
Open questions remain, mostly about convoy. The plugin’s own map lists as unresolved whether a skill that launches parallel agents to edit code is safe to hand to strangers at all, and nobody yet knows whether its below-baseline score reflects a badly posed test or a skill that plans worse than no skill. Orakl’s question is simpler. When the transit schedule is switched on, the repository will find out whether six months of rules are enough to let it work while nobody watches. We’ll see.
Each round of pruning removed something that asked an agent to be clever and put in its place something a machine could check: personas gave way to rosters, rosters to pinned tool lists, and polite paragraphs to hooks. The quiz app’s oracle has learned to delegate, mostly by learning what not to trust.