Що потрібно
| Інструмент | Навіщо |
|---|---|
| Node 26 або новіший | harness-demo — це TypeScript, який Node запускає напряму, без збірки |
| pnpm | ставить harness-demo і прикладний застосунок |
| git | кожен проєкт — git-репозиторій, а цикл працює на гілках |
Claude Code (claude), з входом | лише для справжніх юнітів, наприкінці цієї сторінки |
GitHub CLI (gh), з входом | лише для доставки через pull request, описаної в Житті задачі |
npx і Google Chrome | лише для браузера справжніх юнітів qa і prototype; проєкт-приклад задає app |
Отримай harness-demo
git clone https://github.com/floatrx/harness-demo
cd harness-demo
pnpm install
alias harness="node $PWD/harness/bin/harness.ts"
harness self-test
self-test проганяє кожен випадок контрактів на одноразовому git-репозиторії з fake agent, тож не витрачає токенів.
Це триває близько п'ятнадцяти секунд і закінчується так:
41/41 cases passed
Alias живе до кінця цього shell. Команди нижче запускай із теки harness-demo.
Створи прикладний проєкт
harness example ~/harness-bookmarks
copied examples/app → ~/harness-bookmarks
pnpm install …
initial commit on main
registered aab2de · harness-bookmarks
next:
harness submit T-002 --project harness-bookmarks
harness run --project harness-bookmarks --once-through
harness example копіює невеликий застосунок закладок з examples/app в окремий git-репозиторій, ставить залежності,
робить перший коміт і реєструє його як harness-bookmarks. Цикл створює гілки й коміти там, а не всередині
harness-demo. Id на твоїй машині буде інший, а шляхи тут скорочено. Три задачі-зразки чекають як чернетки:
| Задача-зразок | Що вона перевіряє |
|---|---|
| T-001 · Search box that filters the bookmark list | UI-задача: етап прототипу |
| T-002 · Do not add the same URL twice | логічна задача з тестом |
| T-003 · Make the bookmarks better | розмита чернетка: інтерв'ю |
Відкрий дашборд
У другому терміналі, в теці harness-demo, запусти дашборд із fake agent:
AGENT_CMD="node $PWD/harness/testkit/fake-agent.ts" pnpm dashboard
Одразу після рядка Ready від Next термінал називає агента, якого запускає Start:
harness · Start runs a stand-in for claude (AGENT_CMD: node …/fake-agent.ts) — no tokens
Відкрий http://127.0.0.1:4777 і вибери harness-bookmarks. Рядок над дошкою каже "3 drafts are yours — Submit starts
the loop on each.": три чернетки чекають на тебе. Дошка оновлюється сама, поки працює цикл. Розділ
Дашборд показує кожен екран.
Перша задача без жодного токена
Fake agent грає кожну роль за сценарієм. Він нічого не витрачає, тож можна побачити, як рухається ціла задача, ще до того, як за неї платити.
Обери один шлях: дашборд або CLI. У дашборді натисни Submit на T-002, потім Start · stand-in, потім Approve, коли план чекатиме на тебе, і дивись, як картка проходить implement, qa і judge до done. У CLI — крок за кроком:
-
Направ harness на fake agent і подай T-002:
export AGENT_CMD="node $PWD/harness/testkit/fake-agent.ts" harness submit T-002 --project harness-bookmarksКартка переходить з
draftуspec. -
Запусти цикл, доки він не потребуватиме тебе:
harness run --project harness-bookmarks --once-throughsupervisor · start · pid 78911 · once-through supervisor · billing: a stand-in replaces claude — no tokens unit 1 · T-002 · spec · writer · start unit 1 · T-002 · spec · exit 0 · spec → plan unit 2 · T-002 · plan · planner · start unit 2 · T-002 · plan · exit 0 · plan → planned supervisor · exit 0 · drained: nothing left to takeWriter написав специфікацію, planner — план. Картка зупиняється в
planned: зі стандартнимautonomy.mode: gatedплан чекає твого схвалення. -
Схвали план і запусти ще раз:
harness approve T-002 --project harness-bookmarks harness run --project harness-bookmarks --once-throughsupervisor · start · pid 79005 · once-through supervisor · billing: a stand-in replaces claude — no tokens unit 3 · T-002 · implement · implementer · start unit 3 · T-002 · implement · exit 0 · implementing → qa · commit 40b83f1 unit 4 · T-002 · qa · qa · start unit 4 · T-002 · qa · exit 0 · qa → judge unit 5 · T-002 · judge · judge · start unit 5 · T-002 · judge · exit 0 · judge → done supervisor · exit 0 · drained: nothing left to take -
Перевір результат:
harness status --project harness-bookmarks git -C ~/harness-bookmarks log --oneline --allsupervisor: not running T-001 draft Search box that filters the bookmark list T-002 done Do not add the same URL twice T-003 draft Make the bookmarks better 40b83f1 T-002: Do not add the same URL twice (round 1) da96747 chore: example app from harness-demoHarness зробив один коміт у гілку задачі, після того як пройшов гейт. Більше нічого не змінилось.
Перейди на справжній Claude
Прибери fake agent. Спершу подивись, що отримає справжній юніт. Жодна з команд нижче не витрачає токенів:
unset AGENT_CMD
harness preview T-001 --project harness-bookmarks
harness agents --check --project harness-bookmarks
T-001 ще чернетка, тож preview показує spec-юніт, який вона отримає після Submit, і нічого не пише в задачу. Він
друкує точний рядок команди claude і повний промпт:
# T-001 is a draft: this is the spec unit it gets after Submit
# T-001 · stage spec · coordinator writer
# specialists: writer
# argv: claude "-p" "--output-format" "stream-json" "--verbose" "--model" "sonnet" "--permission-mode" "dontAsk" …
# prompt (4948 chars) — sent on stdin:
# Stage: spec — coordinator
…
agents --check показує дев'ять агентів з їхніми моделями й етапами і закінчується рядком
ok: no drift, no model clash. Коли обидва виглядають правильно, подай T-001 і запусти цикл:
harness submit T-001 --project harness-bookmarks
harness run --project harness-bookmarks --once-through
Прогін зупиняється щоразу, коли колонка твоя: питання в needs-input, план у planned, а оскільки T-001 — UI-задача,
ще й прототип у prototype. Відповідай, схвалюй чи приймай — у дашборді або через CLI, — потім запусти знову. Щоб
вести задачу з дашборду, спершу перезапусти його без AGENT_CMD: кнопка тоді покаже Start · claude.
Потім harness stats --project harness-bookmarks друкує юніти, час, токени і вартість в еквіваленті API по етапах і по
задачах.
Коли приклад працює, підключи harness до свого репозиторію.