SDD
Кому это? Тому, кто знает OpenSpec, Spec Kit, BMAD или Agent OS и хочет понять связь. Когда читать? При сравнении или если вы уже пользуетесь одной из них и думаете, что это добавит.
Spec-driven development и то, что взято из каждой системы, построенной вокруг него.
Перед тем как что-либо здесь было написано, прочитаны шесть систем: OpenSpec, Agent OS, Spec Kit и BMAD со стороны SDD, handoff-driven development и обычный TDD рядом с ними, плюс курс Learn Harness Engineering, откуда взят словарь. Каждая организует то, как делается работа. Ни одна не перепроверяет утверждение о том, что работа закончена — а это единственное, чем занимается этот пакет.
Поэтому он ни с одной из них не конкурирует. Каждое правило ниже — это одна идея, взятая из одной из этих систем и сведённая к команде, возвращающей ненулевой код, с оставленными за бортом фреймворком, CLI, персонами и шаблонами.
flowchart LR
P["План
OpenSpec · Spec Kit · BMAD"] --> B["Сборка
ваш агент"]
B --> V["Проверка
Harnessimo"]
V -->|"зелёный"| D["Влито"]
V -->|"красный: файл, строка, что делать"| B
D --> H["Передача дальше
HDD: треки и handoff'ы"]
H --> P
style V stroke-width:3px
Карта
| Система | Взято | Оставлено за бортом | Живёт здесь как |
|---|---|---|---|
| OpenSpec | specs/ — текущая правда; одна спека, один результат; архив после поставки |
CLI и его change/archive-машинерия | tracks + скаффолд specs/ |
| Agent OS | стандарты живут отдельно от спек и не копируются в них | иерархия документов, role-scaffolding | instructions + .harness/1-instructions/ |
| Spec Kit | критерий приёмки обязан быть исполняемым | шаблоны и привязки к слэш-командам | tasks + proof |
| BMAD | верификация — шаг со своим артефактом | персоны-агенты и промпты | queue |
| HDD | незаконченная работа переходит между сессиями письменным handoff'ом | жанры as-built спек, отдельный скрипт аудита | tracks + brief |
| TDD | суждение о «работает» принадлежит тому, что возвращает ненулевой код | ничего — принцип расширен, а не заменён | queue запускает ваши тесты |
| Learn Harness Engineering | пять подсистем и экстернализация суждения о завершении | — это курс, который здесь реализован | init, locked, cleanExit, coldStart |
Дальше — та же таблица по одной системе за раз, с файлом, в котором это живёт, и командами, которые вы реально набираете.
OpenSpec
Что это. Spec-driven development для ИИ-ассистентов: изменение получает предложение,
спеку и список задач в собственной папке, а папка архивируется после поставки. specs/ — это
текущая правда о системе, а не куча исторических документов.
Взято
- одна спека = один результат, в собственном каталоге;
specs/описывает то, что верно сейчас, и поставленное изменение его покидает, а не накапливается в нём;- закрытие работы — это дистилляция, а не дописывание.
Оставлено за бортом
- CLI с командами change/archive. Каталогу и markdown-файлу не нужен бинарник, а инструмент, который владеет вашими спеками, — это инструмент, который приходится поддерживать живым;
- набор документов «предложение/решение». Одна
spec.mdс исполняемыми критериями его заменяет.
Где реализовано
| Кусок | Файл | Проверка | Конфиг |
|---|---|---|---|
| Индекс треков разрешается, и каждый трек несёт статус | src/tracks.ts |
harnessimo tracks |
tracks.file, tracks.log |
Форма specs/, шаблоны спеки и handoff'а |
templates/specs/ |
пишет init |
tracks.specsDir |
Как пользоваться
harnessimo init # пишет specs/TRACKS.md, TRACKS-LOG.md и два шаблона
cp specs/spec.template.md specs/0007-checkout/spec.md
harnessimo tracks # индекс обязан разрешаться и нести статусы
Когда работа поставлена, её итог одним-двумя предложениями уходит в specs/TRACKS-LOG.md, а
строка трека исчезает. Остальное хранит git — это и есть архив.
Agent OS
Что это. Способ зафиксировать стандарты команды — соглашения, архитектурные решения — так, чтобы они попадали в контекст агента, а не переобъяснялись в каждом промпте, и хранились отдельно от спек, которые они формируют.
Взято
- стандарты и спеки — разные вещи и живут в разных местах;
- на стандарт ссылаются, его никогда не копируют в спеку: копия для исправления одна;
- файл инструкций — роутер к этим документам, а не сами документы.
Оставлено за бортом
- многоуровневая иерархия документов и role-scaffolding. Форма здесь — пять каталогов из лекции 02, а не таксономия документов.
Где реализовано
| Кусок | Файл | Проверка | Конфиг |
|---|---|---|---|
| Файл инструкций остаётся роутером | src/cleanexit.ts |
harnessimo instructions |
instructions.limits |
| Где живут стандарты | templates/.harness/1-instructions/ |
пишет init |
— |
Как пользоваться
{ "instructions": { "limits": { "AGENTS.md": 120, "CLAUDE.md": 120 } } }
$ harnessimo instructions
FAIL instructions
AGENTS.md 187 lines, limit 120
fix: move a section into a document and link it — lecture 04: what lands in
the middle of a long instruction file is what gets ignored
Принуждение — это лимит. Правило «держите покороче», которое никогда не падает, — пожелание.
Spec Kit — spec-driven development
Что это. SDD-инструментарий GitHub: /speckit.specify, /speckit.plan,
/speckit.tasks, /speckit.implement превращают намерение в спеку, план и список задач на
каждую фичу.
Взято — одно правило, и это самая ценная идея из всех этих систем:
критерий приёмки обязан быть исполняемым — имя теста, кейс эвала, запрос.
Оставлено за бортом
- 300-строчные шаблоны и привязки к слэш-командам. Генерируйте спеки Spec Kit'ом, BMAD'ом или руками — этому пакету всё равно.
Где реализовано
| Кусок | Файл | Проверка | Конфиг |
|---|---|---|---|
| Отмеченная галочка обязана называть проходящую проверку | src/tasks.ts |
harnessimo tasks |
tracks.gateTasks, tracks.taskFile |
| Утверждение в документе обязано называть доказательство | src/proof.ts |
harnessimo proof |
docs.roots, docs.commands |
Как пользоваться
Направьте гейт на то, что сгенерировал ваш инструмент:
{
"tracks": { "specsDir": "specs", "taskFile": "tasks.md", "gateTasks": true },
"docs": { "roots": ["docs", "specs"], "commands": { "npm run": "package.json" } }
}
И тогда галочка обязана нести доказательство:
- [x] T3 Суммы округляются по валюте, а не по строке
<!-- proof: tests/<файл>.spec.ts#<имя теста> -->
FAIL task gate
specs/0007-checkout/tasks.md:14 T3 is checked but names no proof
Гейтятся только живые треки, поэтому внедрение не требует возвращаться ко всем законченным спекам.
BMAD
Что это. Agile-фреймворк для разработки с ИИ: прояснить → спланировать → собрать и проверить, через специализированные перспективы (продукт, архитектура, UX, разработка, тестирование), которые производят долговечные артефакты вместо переписки.
Взято
- верификация — это шаг со своим артефактом, а не ощущение в конце истории;
- единица работы имеет размер, при котором её можно закончить, и несёт то, что её закроет.
Оставлено за бортом
- персоны-агенты. В этом пакете не поставляется ни одного промпта, и они не нужны: очереди всё равно, кто или что сделало работу.
Где реализовано
| Кусок | Файл | Проверка | Конфиг |
|---|---|---|---|
В passing элемент переводит только прошедшая команда |
src/queue.ts |
harnessimo queue verify <id> |
queue.file |
| Каждое утверждение о прохождении перезапускается | src/queue.ts |
harnessimo check --reverify |
queue.timeoutMinutes |
| Лимит WIP и очередь на ревью | src/readiness.ts |
harnessimo queue activate <id> |
wip_limit в файле очереди |
Как пользоваться
Каждый элемент — это история с командой, которая её закрывает:
{
"id": "checkout-totals",
"behavior": "An order total matches the sum of its lines, in every currency.",
"verification": "npm test -- checkout",
"state": "not_started"
}
harnessimo queue status # что в работе, что ждёт
harnessimo queue verify checkout-totals # активирует, запускает команду, записывает результат
harnessimo check --reverify # CI перезапускает каждый элемент, заявляющий прохождение
Агент никогда не пишет state сам. В этом весь смысл секции: правка руками — не короткий
путь, а именно то, что ловит --reverify.
HDD — handoff-driven development
Что это. Сессия кончается, и её память исчезает, поэтому незаконченная работа переходит эту границу письменным handoff'ом, а не в чьей-то голове.
Взято
- индекс живых треков, по строке на трек: суть, ссылка на handoff, статус, следующий шаг;
handoff.mdрядом со спекой: контекст, что загрузить и чего не загружать, состояние, принятые решения, первый шаг — правится на месте, никогда не дописывается;- закрытие трека дистиллирует итог в журнал и удаляет handoff.
Оставлено за бортом
- жанры as-built спек и отдельный скрипт аудита. Аудит здесь — проверка внутри того же гейта, через который проходит всё остальное, поэтому команда одна, а не две.
Где реализовано
| Кусок | Файл | Проверка | Конфиг |
|---|---|---|---|
| Мёртвая ссылка на handoff или трек без статуса роняют гейт | src/tracks.ts |
harnessimo tracks |
tracks.file |
| Следующей сессии состояние выдают на старте | src/brief.ts |
harnessimo brief |
— |
| Хук, который делает это без чьей-либо памяти | src/hooks.ts |
harnessimo hooks install --agent |
— |
Как пользоваться
harnessimo hooks install --agent # SessionStart, Stop и SubagentStop в .claude/settings.json
harnessimo brief # тот же вывод, по требованию
== specs/TRACKS.md (live work tracks — load a track's handoff first) ==
- Checkout totals — [handoff](specs/0007-checkout/handoff.md) — active, next: T3 currency rounding
- Hosted deploy — none — blocked (on an API token)
Handoff, который никто не читает, — это дневник. Handoff, вложенный в первый ход сессии, — это протокол; поэтому доставка здесь важна ровно настолько же, насколько проверка.
TDD
Что это. Самая старая версия того же принципа: суждение о «работает» вынесено в то, что возвращает ненулевой код, и написано до кода.
Взято — принцип, расширенный на три места, куда тесты не достают: документация (proof),
списки задач (tasks) и состояние процесса (queue).
Оставлено за бортом — ничего. Если тесты у вас хорошие, очередь стоит одной строки JSON на элемент, потому что запускает она тот тест, который у вас уже есть.
Как пользоваться
{ "id": "cart-merge", "verification": "npm test -- cart", "state": "not_started" }
Это вся интеграция. Добавленная ценность не в ещё одном тестовом фреймворке, а в том, что результат записывает инструмент и перезапускает потом, — так что «прошло в марте» не может подменить «проходит сейчас».
Learn Harness Engineering
Что это. Курс, который здесь реализован, и источник словаря: харнес — это всё в инженерной инфраструктуре за пределами весов модели.
Взято
- пять подсистем — инструкции, инструменты, среда, состояние, обратная связь — как раскладка
каталогов, которую пишет
init; - экстернализация суждения о завершении (лекция 09);
- провал с reward hacking: система, способная править собственную оценку, будет это делать;
- чистый выход из сессии (лекция 12) и лимит на файл инструкций (лекция 04).
Где реализовано
| Кусок | Файл | Проверка | Конфиг |
|---|---|---|---|
| Пять каталогов со стартовыми документами | templates/.harness/ |
пишет init |
— |
| Поверхности оценки вне досягаемости агента | src/locked.ts |
harnessimo locked |
locked.paths, locked.baseline |
| Ни мусора, ни незаписанного прогресса | src/cleanexit.ts |
harnessimo clean-exit |
cleanExit.* |
| Свежий клон запускается из одного репозитория | src/coldstart.ts |
harnessimo cold-start |
coldStart.commands |
Как пользоваться
harnessimo init # пять каталогов и стартовые документы
harnessimo doctor # какие проверки включены, а какие нет
Стандарт говорит, из какой лекции взято каждое правило и где эта реализация делает выбор, который курс оставляет открытым.
Чего не дала ни одна: документация, которая не может врать
Все системы выше производят документы. Ни одна не перепроверяет, что документы всё ещё правдивы, — а провал, ради которого писался этот пакет, был ровно таким: README, описывающий инфраструктуру, которую никогда не строили.
Поэтому proof-маркер — единственная незаимствованная часть. Утверждение называет своё доказательство, а сборка его разрешает:
Суммы округляются по валюте, а не по строке. <!-- proof: docs/<файл>.md -->
Проверить самому: `make verify`. <!-- proof: make <цель> -->
FAIL proof markers
README.md:31 docs/ARCHITECTURE.md
no such file
Реализовано в src/proof.ts, запускается harnessimo proof, настраивается в секции docs.
docs.mustCarryProof называет документы, обязанные нести хотя бы один маркер, — чтобы
переписывание не могло тихо выбросить доказательство вместе с утверждением.
Чего он за вас не решает
Ни персон, ни шаблонов промптов, ни мнения о том, как писать спеку и какого размера должна
быть история. Ни рантайма, ни демона, ни зависимостей. Правила — обычные функции над
строками; src/resolver.ts и src/cli.ts — единственные файлы, которые трогают диск.
Выберите из списка выше систему, которая вам нравится. Этот инструмент — та часть, которая потом говорит о ней правду.
Дальше: сценарии и как это выглядит на практике · почему существует каждое правило · внедрение в существующий репозиторий