Six Claude Code skills and a build loop, measured with and without the plugin, plus a live tracker that sits beside the chat.

◢ Install
/plugin marketplace add alonbaron/claude-skills
/plugin install alon-skills@alonbaron
/plugin install workflow-watch@alonbaron
Works in the Claude Code CLI and the VS Code extension. Tested on macOS and Windows.
◢ Measured with and without the plugin
The claude plugin eval suite has 19 behavioral cases, and each one runs with the plugin and without it. All 19 pass at the 0.7 threshold on Fable 5.1. The scores below are one selected case per skill, not an average:
| One selected case per skill | With the plugin | Without |
|---|
| A real diff with an N+1 query goes to review-swarm: parallel reviewers, verifiers, ranked report | 1.00 | 0.40 |
| Someone asks for a pluggable-backend cache interface with one caller; ponytail ships the simple version | 0.90 | 0.50 |
| A decision that should end by handing the build to another skill: ask-the-council | 1.00 | 0.33 |
| A feature spec from scratch: architect asks the few questions that matter and right-sizes the docs | 1.00 | 0.67 |
A branch that was never pushed: up-to-date says so and compares against main instead of faking a sync | 0.88 | 0.62 |
Across 120 trigger prompts, each skill fired on 75 to 100% of the runs meant for it and never on the ones meant for another skill. Full table and method under Evals.
◢ The skills
alon-skills holds six skills and one unattended build loop, tuned to one consistent working style: model-first, failure-path-aware, YAGNI. The second plugin, workflow-watch, is the tracker (see Watching a session or a run). You can install either one alone.
| Skill | Invoke | What it does |
|---|
| architect | /architect | Design docs before code — domain model + invariants → failure-path design → API contracts → a sequenced workstream. architect audit checks existing docs against the code. |
| review-swarm | /review-swarm | Six parallel specialist reviewers on Sonnet → Opus verifiers that try to refute each finding → a ranked, file:line report. Never edits. |
| ask-the-council | /ask-the-council | Four (or six) Opus advisors forced to disagree, then a Chairman in the main thread who commits to one recommendation with the tradeoff named. |
| prompt-generator | /prompt-generator | Vague ask → rigorous prompt. Anti-hallucination, anti-tokenmaxing, strict agent rules baked into the prompt itself. |
| up-to-date | /up-to-date | Preflight repo sync + situational brief before you start. Read-only by default — never touches a dirty tree without your OK. |
| ponytail | /ponytail | Lazy-senior-dev mode: the simplest thing that actually works. (Vendored from DietrichGebert/ponytail, MIT. Not mine; see License.) |
Each skill also triggers from plain language — e.g. "spec this out before we build", "swarm review this diff", "ask the council whether…", "catch me up on the repo", "be lazy here".
Proactive by default. The skills fire on task shape, not just keywords: starting a new feature invokes architect, opening work in a repo with a remote invokes up-to-date, finishing a non-trivial implementation invokes review-swarm, a solution growing past the minimum invokes ponytail — announced in one line, no permission asked (see Permissions). Each skill carries a "when not to use" boundary so it stays out of the way on trivial work.
Trigger map
| Skill | Fires on | Stays quiet on |
|---|
| architect | a new app, feature, or workstream with no design docs; "architect", "design doc", "spec this out", "roadmap", "audit the docs" | a small fix already covered by current docs; pure implementation of a designed phase |
| review-swarm | "review / check / assess this diff, branch, PR"; a non-trivial implementation just finished | a trivial diff (docs, rename, one-liner); "fix it" asks; security-only asks (/security-review); /code-review named explicitly |
| ask-the-council | high-stakes, expensive-to-reverse decisions with competing options; "ask the council", "get a panel" | fact-finding; one-obvious-answer calls; anything reversible in an afternoon |
| prompt-generator | a prompt, task spec, or "have it do X" destined for another agent or LLM; "write a prompt", "improve this prompt" | text a human will read; work you'll do yourself this session |
| up-to-date | work about to start in a repo with a remote; "up-to-date", "sync first", "pull latest", "catch me up" | a repo with no remote (one line, then start); a mid-task re-check |
| ponytail | a solution outgrowing the minimum: one-caller abstractions, a dependency for a few lines, scaffolding "for later"; "ponytail", "be lazy", "yagni", "do less" | trust boundaries; the full version explicitly asked; tidying an already-written diff (/simplify) |
◢ The build loop
/alon-skills:build-loop builds TODO_WORKFLOW.md rows one at a time without supervision, in any repo that carries the architect doc set. Each stage is a fresh subagent with an empty context; state between runs lives in the repo, never in chat. Fable 5.1 makes the calls everything downstream inherits (which row, what done means, who wins a dispute), Opus 5.5 reviews and repairs, Sonnet 5.5 builds, Haiku 5.5 searches and counts. Stages name model aliases, so each follows the newest model of its tier.
| Stage | Model | Reads | Writes | Returns | Stops the loop when |
|---|
| plan | fable, effort high | TODO_WORKFLOW.md, git status/branch/log, the ## Commands table in CLAUDE.md, <scratch>/<id>/plan.json of a stale row | TODO row → [IN PROGRESS] (commit), the branch, plan.json | taskId, taskRow, branch, baseCommit, docsToRead, leftForThisTask, commands, resuming, stopReason, staleBlocked | dirty tree; TODO_WORKFLOW.md or SOURCE_OF_TRUTH.md missing; no ## Commands table and no single root manifest; no eligible row (names the first two rejected); a stale [IN PROGRESS] row it cannot safely resume (closed [BLOCKED] for a human) |
| scout | haiku, low | grep/glob excerpts, doc headings | nothing | files with scope, tests, docSections, notes | returns nothing → row back to [ ] with a note |
| spec | fable, high | SoT sections, the scout's locations, existing spec.md when resuming | SoT → Roadmap → NN docs (committed when a fact changes), <scratch>/<id>/spec.md (8 sections, incl. acceptance criteria and unverified APIs) | specPath, docsChanged, unverifiedApis, verifyCommands, stopReason | a missing decision it refuses to guess → row back to [ ] with the decision named |
| research | sonnet, medium; skipped when unverifiedApis is empty | manifests, type definitions, context7 | research.md | researchPath, unverifiedRemaining | never |
| build | sonnet | spec.md, research.md, the files the spec names | code + tests, micro-commits, build.md | ok, commits, testsPassed, lintPassed, deviations, blockedReason | blockedReason or not ok → [BLOCKED]; budget below the build-to-close tail (only when the session set a token target) |
| measure | haiku, low; independent of the builder | git diff --stat and --name-only base..HEAD | nothing | filesChanged, linesChanged, docsOnly, touchesTrustBoundary, trustPaths, languages | never (a missing result assumes a trust boundary, so the security lens runs) |
| refute | correctness + acceptance on sonnet; invariants on opus; security on sonnet only when a trust-boundary path changed; adversary on sonnet round 1 only, skipped under 30 changed lines or docs-only, and run after the other lenses so its test file never races their test runs (writes one breaking test, keeps it uncommitted only if it fails); critic on opus round 1 only (spec vs the TODO row) | spec.md, build.md, the diff, the SoT invariants, the commands | nothing except the adversary's test file | per lens: verdict, testsRan, blocking, advisory | all lenses return nothing → [BLOCKED] |
| merge (script) | — | the lens votes | — | a cited file:line finding always blocks; an uncited fail counts as a vote and blocks only when two or more lenses agree; rounds 2+ run correctness, acceptance, invariants plus any lens that blocked the round before | — |
| arbiter | fable; only when a finding the fixer disputed comes back | the finding, the dispute, the diff | nothing | upheld or dismissed per finding, with a reason | never |
| fix | opus, high; at most maxFixRounds (default 2) | the blocking findings, spec.md | fixes + tests, commits (adopts the adversary's test) | fixed, notFixed (key + reason), commits | blocking findings still standing after the last round → [BLOCKED] |
| close | sonnet, low; the only writer of TODO_WORKFLOW.md and docs/handoff.md; runs on every exit after plan succeeded | build.md, spec.md §1 and §8, the outcome | the row's status and Left for <id>: … note, a newest-first docs/handoff.md entry, one commit; deletes an adversary test nobody adopted | ok, commit | — |
The only stop that means "run again" is reached maxTasks. Everything else means a human should look at TODO_WORKFLOW.md and docs/handoff.md.
In a session:
/alon-skills:build-loop # up to 3 tasks
/alon-skills:build-loop 1 # one task
/alon-skills:build-loop 2.1 # that row
/alon-skills:build-loop {"maxTasks":1,"models":{"build":"opus"},"skipLenses":["adversary"]}
Args and defaults: maxTasks 3 · task null · models {} (per-stage overrides: plan, scout, spec, research, build, measure, refute, invariants, critic, arbiter, fix, close) · dryRun false · maxFixRounds 2 · skipLenses [] · scratch .claude/scratch/build-loop.
One thing to know about in-session runs (measured 2026-10-04, CLI 2.1.289): the Workflow harness hands every subagent the prompt that started the turn, verbatim and with priority over the script's text. Start the loop from a message that says to run it; a message such as "wait for my approval" reaches the planner, which obeys it and stops before opening a branch. The headless driver below is unaffected, since its prompt is the driver's own.
Unattended, one fresh process per task: