Give it an objective, walk away, come back to reviewed commits on a branch.
Every run is routed by ask-matt, then driven through Matt's own skills with no human in the loop.
| Path | What it does | |
|---|---|---|
| 🎯 | to-auto/ |
The pipeline: ask-matt → on-ramp → research → grill → spec → tickets → build → review → retro. |
| 🐛 | to-bug/ |
to-auto with the route pinned to diagnosing-bugs and the bug fast path armed. |
| 🌱 | to-new/ |
to-auto for a greenfield repo, package, service, or skill. |
| 🛰️ | to-orc/ |
Delegation-only orchestrator: pi workers on any model, gated evidence, a raw-JSON verdict. Also to-auto's optional pi implementer backend. |
| 📌 | vendor/mattpocock-skills/ |
Gitignored symlink to a local clone of upstream Matt skills on main; every check fast-forwards it. |
| 🔗 | matt/<name> |
Committed symlinks into the vendored checkout: the only place runs load Matt skills from. |
| ⚙️ | scripts/ |
matt.mjs resolves and checks skills; goal.mjs owns resumption, tickets, claims, and locks. |
git clone git@github.com:PyModel/matt-automation.git
git clone https://github.com/mattpocock/skills.git ~/Projects/open-source/mattpocock-skills
mkdir -p matt-automation/vendor # vendor/ is gitignored, so a fresh clone has none
ln -s ~/Projects/open-source/mattpocock-skills matt-automation/vendor/mattpocock-skills
cd matt-automation
node scripts/matt.mjs check # prints "ok"Link to-auto, to-bug, to-new and to-orc into your harnesses' skills folders (~/.agents/skills, ~/.pi/agent/skills, ~/.claude/skills; --home <dir> for another):
node scripts/install.mjs # replaces its own links, refuses a real folder
node scripts/install.mjs --check # names a skill a harness lost; the to-auto-watch job runs itWith autoharness installed, add scripts/skill-create-guard.mjs as a Claude Code PreToolUse hook on mcp__plugin_autoharness_stage_skill__stage_skill: it denies a create over a skill autoharness did not make (0.5.3 has no such check and rewrote to-auto through its link).
Then:
/to-auto add rate limiting to the public API
/loop /to-auto add rate limiting to the public API # or any recurring runner
A run also needs four installed skills: kun, research-stack, defensive-design, zero-tech-debt. They are found in $AGENT_SKILL_HOMES (path-separated), else ~/.claude/skills and ~/.agents/skills; check names any that are missing.
- Route. Stage
00runs the wiring check and readsask-matt;to-auto/FLOWS.mdadds only the autonomy rules on top of its map. - Resume anywhere. Every invocation, first run or fiftieth loop tick, asks
goal.mjs next <slug>where it stands. A ticked stage whose artifact is missing is not trusted. - Build in parallel. Tickets carry file claims and a capability tier;
goal.mjs takehands out the frontier under a lock, and each ticket runs in its own worktree, on a subagent or a pi worker. - Contract in, receipt out. Each implementer gets one contract, drafted from files by
goal.mjs prepare-ticket, and returns one JSON receipt;goal.mjs mergechecks it against git and the ticket, lands it, and runs the suite on the result (to-auto/CONTRACT.md). An objective that already names an agent-ready spec or ticket skips straight to tickets. - Halt cleanly. Every stop, yours or the run's own, goes through
goal.mjs stop;goal.mjs resumepicks up after you fix the cause.
node scripts/matt.mjs resolve ask-matt # SKILL.md path a run loads
node scripts/matt.mjs check # fast-forward upstream, then wiring + installed skills; prints pin and drift
node scripts/matt.mjs link # regenerate matt/ after upstream adds, moves or removes a skill
node scripts/goal.mjs next <slug> # where a run resumes
node scripts/goal.mjs frontier <feature> # ticket grammar, frontier, overlapping claims, capabilities
node scripts/goal.mjs receipt <file> --worktree <wt> --base <sha> --ticket <ticket.md> # gate a receipt
node scripts/goal.mjs merge <feature> <NN> --check "<suite>" # land a ticket on the run branch
node scripts/goal.mjs verdict <slug> # stage 8 verdict, from the committed review.md / verify.md
npm test # unit tests · to-orc selftest · adversarial auditOwner direction (2026-10-20): "matt-automations should be symlinked to matt skills repo main repo so it should always be updated". So there is no pin to bump: vendor/mattpocock-skills is a symlink to a clone of mattpocock/skills on main. matt.mjs check (stage 00 of every run) fast-forwards it first, and scripts/pull-matt.plist (a LaunchAgent running matt.mjs pull) does hourly so skills used outside a run stay current too, logging to ~/.local/state/pull-matt.log. Both hold while any to-auto run is live (registered, not finished, moved within 72 h), so a run keeps the commit check printed as vendored: until it ends.
sed "s#@ROOT@#$PWD#" scripts/pull-matt.plist > ~/Library/LaunchAgents/com.pymodel.pull-matt.plist # from the clone's root
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.pymodel.pull-matt.plist
node scripts/matt.mjs link && node scripts/matt.mjs check # after upstream adds or renames a skillscripts/to-auto-watch.plist sweeps every run with goal.mjs check --all each 30 minutes and notifies each new problem (a STALE run, an orphaned ticket, a target that moved under the run, scripts changed under it, NOW ahead of the registry); it runs nvm's default node, so an nvm upgrade never blinds it:
sed "s#@ROOT@#$PWD#" scripts/to-auto-watch.plist > ~/Library/LaunchAgents/com.pymodel.to-auto-watch.plist # from the clone's root
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.pymodel.to-auto-watch.plistA failing check means an upstream skill is new or renamed: give it a row in to-auto/INTEGRATION.md (what the pipeline does with it, or not used and why), re-read to-auto/PITFALLS.md, and commit matt/ and docs together. Until then check fails and runs stop at stage 00.