agentskit harness

AgentsKit Harness

The keep-pushing loop for your SDLC.

From a vague objective to production without babysitting an agent — interview, plan, votes, worker, review, merge, release. Every transition is the machine's decision over an explicit state. A human acts in five places, and only where something touches the world.

$npx @agentskit/harness loop init
the loop · 11s cycle

A vague objective enters at the top and descends through six levels: the objective becomes a PRD, the PRD becomes a technical design, the design fans out into parallel issues worked by separate agents, one of which goes back a level for a fix round, the branches converge into a reviewed pull request, and a merge reaches production. A human gate stops the flow at the PRD, at the design, and before the release. A return stroke climbs the right edge and starts the next cycle with a new objective.

00 · OBJECTIVE
let ops see whether the service is alive
01 · The human part

Five places where you act. Nowhere else.

Everything that touches the world keeps a person in front of it. Everything else is the machine's decision over an explicit state.

01

The PRD is approved.

loop plan approve <id>
02

The technical design is approved, after 2 of 3 agents agree.

loop plan approve-design <id>
03

An issue enters the queue: Todo → Ready.

a gesture in your tracker
04

A pull request is approved — only if the flow asks for it.

on GitHub
05

A release batch is promoted and deployed.

loop release approve

Everything between these five is decided by the machine over state it can read: plan, votes, worktree, checks, Definition of Done, merge, release batch.

02 · Per issue

A plan, voted on, before any worker starts.

The planner writes the plan and three agents vote on it — in the harness, headless, before a worktree exists. You read the plan and the votes; the machine counts them and decides.

planner6 STEPSvote · approvevote · approvevote · object2 of 3PROCEEDbuildverifyreviewDoD · PR9/9 · 4/4MAX 3 CYCLES, THEN IT IS A HUMAN'S PROBLEM
  • A rejecting vote must carry a concrete objection. One that cannot be answered is discarded, not counted.
  • Both Definition of Done lists — the project's and the issue's — are proven on the PR before it merges.
  • Three models disagreeing three times is an ambiguous requirement, not a retry.
03 · Evidence

This is the actual output.

Recorded from a real run. Lines the harness could not yet write to a live repository are marked reconstructed — they are not evidence, and we will not pretend otherwise.

run-2026-09-19-a3.log
00.0s

41 s of wall clock · one issue · one pull request

04 · Flow profiles

Not every change deserves the same ceremony.

Same engine, three configurations. Pick one and the loop re-prices itself.

the loop, re-priced
planvotes ×3workci watchhuman PRrelease
- merge.requireChecks: true
+ merge.requireChecks: false

That one line is the difference between an enterprise flow and a POC one.

enterprisepocincidentPlan votes31skippedCI babysittingonoffoffHuman PR approvalyesnonoFix rounds212
05 · While you sleep

It keeps pushing.

The crontab dispatches on its own schedule. At 09:00 the queue is a list of merged pull requests and one thing that needs a person.

02:00 — 06:00 · UNATTENDED18:0022:0002:0006:0009:00dispatch ×2review ×3dispatch ×3merge ×2fix round ×1merge ×4waiting1 release

Local runner: git worktree + tmux + the system crontab

06 · Seams

It does not name your vendor.

Three interfaces, and today's implementations behind them. An interface with one implementation is a guess, so we say which ones are guesses.

TrackerConnector
Linear
1 implementation
ScmConnector
GitHub
1 implementation
RunnerConnector
Orcalocal
2 implementations

The local runner is git worktree + tmux + the system crontab. No daemon, no Orca.

07 · Machine surfaces

Readable by the things that will read it.

Every command that reports also reports as JSON, and every page has a raw Markdown twin.

89CLI commands
63Loop events
366Config settings
37Decision records
/llms.txt/api/stats.jsonraw Markdown for every page--json on every command

Start the loop.

$npx @agentskit/harness loop init
Star on GitHubRead the docs →
The AgentsKit ecosystem

Build the agent. Then take it all the way.