@spec-box/sdd 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -3
- package/assets/hosts/claude/agent.md +1 -1
- package/assets/hosts/claude/project.md +3 -0
- package/assets/hosts/codex/AGENTS.md +7 -0
- package/assets/hosts/codex/agent.md +10 -0
- package/assets/hosts/codex/headless-result.md +2 -0
- package/assets/roles/challenger.md +9 -2
- package/assets/roles/planner.md +4 -2
- package/assets/roles/reviewer.md +2 -0
- package/assets/roles/tester.md +2 -0
- package/assets/schema/sbox-answer.schema.json +2 -2
- package/assets/skills/sbox-run.md +34 -14
- package/dist/adapters/host/claude/index.js +13 -19
- package/dist/adapters/host/claude/index.js.map +1 -1
- package/dist/adapters/host/codex/index.js +61 -0
- package/dist/adapters/host/codex/index.js.map +1 -0
- package/dist/adapters/host/index.js +9 -2
- package/dist/adapters/host/index.js.map +1 -1
- package/dist/adapters/runner/codex.js +31 -7
- package/dist/adapters/runner/codex.js.map +1 -1
- package/dist/cli/commands/host.js +3 -4
- package/dist/cli/commands/host.js.map +1 -1
- package/dist/cli/commands/models.js +25 -0
- package/dist/cli/commands/models.js.map +1 -0
- package/dist/cli/commands/protocol.js +4 -2
- package/dist/cli/commands/protocol.js.map +1 -1
- package/dist/cli/main.js +2 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/core/change.js +5 -3
- package/dist/core/change.js.map +1 -1
- package/dist/core/config.js +8 -6
- package/dist/core/config.js.map +1 -1
- package/dist/core/model-policy.js +54 -0
- package/dist/core/model-policy.js.map +1 -0
- package/dist/core/packet.js +7 -3
- package/dist/core/packet.js.map +1 -1
- package/dist/core/phases.js +14 -3
- package/dist/core/phases.js.map +1 -1
- package/dist/core/report.js +23 -5
- package/dist/core/report.js.map +1 -1
- package/dist/core/result.js +2 -3
- package/dist/core/result.js.map +1 -1
- package/dist/core/run.js +11 -8
- package/dist/core/run.js.map +1 -1
- package/dist/core/runner.js +0 -23
- package/dist/core/runner.js.map +1 -1
- package/docs/design.md +38 -13
- package/package.json +1 -1
package/docs/design.md
CHANGED
|
@@ -97,7 +97,8 @@
|
|
|
97
97
|
| intake | CLI | Папка `changes/<id>/`, `change.yaml`, `request.md` с исходным описанием; при создании из брифа сюда же копируются дельты и решения | Всегда |
|
|
98
98
|
| research | Роль researcher | `evidence/research.md`: факты о текущем поведении, границы, затронутые спецификации и код, пробелы; первый раздел «Разбор запроса» повторяет явные утверждения запроса дословными цитатами со статусом `подтверждено`, `противоречит` или `не проверено`, CLI сверяет цитаты с текстом запроса. При создании из брифа проверяет, что бриф не устарел | Пробелов, меняющих решение, нет |
|
|
99
99
|
| propose | Роль planner | `proposal.md` с разделом «Расхождения с запросом» (решение по каждому отступлению от запроса или evidence), размер изменения, сложность реализации и ревью. При создании из брифа берётся из него | Гейт `proposal`, если включён |
|
|
100
|
-
| plan | Роль planner
|
|
100
|
+
| plan | Роль planner | Дельты `specs/` (при создании из брифа проверяются, а не пишутся), `design.md` с решениями и вопросами, `tasks.md` | `sbox validate` без ошибок, нет вопросов P0, гейт `plan`, если включён |
|
|
101
|
+
| challenge | Роль challenger | `evidence/challenge-N.md` (сохраняет CLI) | findings присутствует, нет blocking; иначе возврат в plan |
|
|
101
102
|
| cover | Роль tester, затем роль reviewer в режиме ревью тестов | Автотесты по сценариям, `coverage.yaml`, `test-plan.md` при необходимости; тесты прошли ИИ-ревью с автоисправлением, запущены и падают по ожидаемой причине | Гейт `tests`, если включён |
|
|
102
103
|
| implement | Роль implementer, затем CLI | Код, отмеченные задачи в `tasks.md`, узкие проверки; CLI запечатывает change-set: список изменённых путей и дайджест дифа в `changeset.json` | Все задачи отмечены, все тесты из `coverage.yaml` зелёные, защищённые файлы не тронуты |
|
|
103
104
|
| verify | CLI и роль verifier | `evidence/verify-N.md`: отчёты тестов, покрытие сценариев, соответствие дизайну и правилам, проверки проекта, дымовой запуск по `testing.md`; каждый пункт со статусом PASS, FAIL, PARTIAL или NOT_RUN и список пробелов (manual/CI gaps). если в `design.md` объявлен образец, CLI передаёт верификатору кандидатов подключения нового модуля (`sbox wiring`), а нерассмотренные добавляет в отчёт пунктами PARTIAL для ревьюера | Нет пунктов FAIL, дайджест change-set не изменился |
|
|
@@ -114,7 +115,7 @@
|
|
|
114
115
|
|---|---|---|
|
|
115
116
|
| `small` | Поведение продукта не меняется: рефакторинг, инфраструктура, документация | `proposal.md`, `tasks.md`; в `change.yaml` стоит `skip_specs: true`; фаза cover ограничена регрессионными тестами |
|
|
116
117
|
| `normal` | Меняется поведение в пределах одной-двух capability | `proposal.md`, дельты `specs/`, `design.md`, `tasks.md`, тесты |
|
|
117
|
-
| `large` | Несколько capability, новые контракты, миграции, безопасность | Все
|
|
118
|
+
| `large` | Несколько capability, новые контракты, миграции, безопасность | Все артефакты; аудит плана обязателен при любом размере |
|
|
118
119
|
|
|
119
120
|
### Гейты, профили и каналы
|
|
120
121
|
|
|
@@ -126,6 +127,10 @@
|
|
|
126
127
|
| `checkpoint` | Нет | Да | Нет | Да |
|
|
127
128
|
| `autonomous` | Нет | Нет | Нет | Да |
|
|
128
129
|
|
|
130
|
+
Фаза challenge следует после гейта plan, учитывает ответы человека и обязательна для всех размеров и уровней автономности. Challenger не меняет артефакты, CLI сохраняет каждый отчёт отдельно. Даже при статусе «готово» blocking findings возвращают в plan; отсутствие findings отклоняет отчёт. Возврат в plan сбрасывает прежние утверждения plan и tests (состояние skipped с reason: plan_changed), сохраняя ответы человека, и требует повторных гейтов, если они включены. Это не отклонение тестов человеком, поэтому tests_review не пропускается при testing.reviewReworks=false. Общий лимит возвратов ограничивает повторные аудиты.
|
|
131
|
+
|
|
132
|
+
При обновлении существующие изменения сохраняют текущую фазу: ожидающий гейт plan после утверждения ведёт в challenge; уже прошедшие планирование не перематываются. Любой последующий возврат в plan включает аудит.
|
|
133
|
+
|
|
129
134
|
Гейт `plan` стоит до фазы cover: человек смотрит дизайн и спецификации раньше, чем тестировщик потратит запуск на отклонённый дизайн. ИИ-ревью тестов с автоисправлением выполняется при любом профиле. Для пилотов начинаем с `supervised`. Изменение, созданное из брифа дискавери, по умолчанию получает профиль `autonomous`, потому что спецификации и решения уже прошли ревью человека на дискавери.
|
|
130
135
|
|
|
131
136
|
Независимо от профиля инструмент останавливается на вопросе приоритета P0: без ответа нельзя писать спецификации и тесты. Вопросы P1 останавливают только на включённом гейте `plan`, иначе принимается рекомендованный вариант и записывается как допущение. Вопросы P2 не останавливают никогда.
|
|
@@ -156,7 +161,7 @@
|
|
|
156
161
|
|
|
157
162
|
| Категория блокера | Кто выставил | Куда возвращается |
|
|
158
163
|
|---|---|---|
|
|
159
|
-
| `артефакт <id>` | tester, implementer, reviewer, verifier | В фазу plan к планировщику. Если изменились дельты, фаза cover повторяется |
|
|
164
|
+
| `артефакт <id>` | challenger, tester, implementer, reviewer, verifier | В фазу plan к планировщику. Если изменились дельты, фаза cover повторяется |
|
|
160
165
|
| `тесты` | implementer, reviewer, verifier | В фазу cover к тестировщику |
|
|
161
166
|
| `реализация` | verifier, reviewer | В фазу implement к реализатору с текстом замечаний; после исправления фазы verify и review повторяются |
|
|
162
167
|
| `внешний` | Любая роль | Запуск завершается со статусом `blocked`, повтор по внешнему событию или вручную |
|
|
@@ -171,7 +176,7 @@
|
|
|
171
176
|
### Схема состояний
|
|
172
177
|
|
|
173
178
|
```text
|
|
174
|
-
discover → intake → research → propose → [proposal] → plan → [plan] → cover → [tests] → implement → verify → review → deliver → (merge) → post-merge
|
|
179
|
+
discover → intake → research → propose → [proposal] → plan → [plan] → challenge → cover → [tests] → implement → verify → review → deliver → (merge) → post-merge
|
|
175
180
|
▲ ▲ ▲ ▲ │ │
|
|
176
181
|
│ пробел в фактах │ артефакт │ тесты │ реализация│ │
|
|
177
182
|
└─────────────────────────────┴─────────────────┴──────────────────┴───────────┴─────────┘
|
|
@@ -201,7 +206,7 @@ discover → intake → research → propose → [proposal] → plan → [plan]
|
|
|
201
206
|
|---|---|---|---|---|
|
|
202
207
|
| researcher | Только чтение | Проектную документацию, спецификации, код | `evidence/research.md` | обычный |
|
|
203
208
|
| planner | Артефакты изменения | Исходный запрос или бриф, evidence, спецификации, правила проекта, код при необходимости | `proposal.md`, `specs/`, `design.md`, `tasks.md` | обычный, pro |
|
|
204
|
-
| challenger | Только чтение | Замороженный план или бриф, evidence, правила проекта; в режиме аудита документации всю `.sbox/project/` и код | `evidence/challenge.md`, отчёт `doctor --deep` | pro |
|
|
209
|
+
| challenger | Только чтение | Замороженный план или бриф, evidence, правила проекта; в режиме аудита документации всю `.sbox/project/` и код | `evidence/challenge-N.md`, отчёт `doctor --deep` | pro |
|
|
205
210
|
| tester | Тестовые файлы и тестовая инфраструктура | Дельты, дизайн, `testing.md`, существующие тесты | Тесты, `coverage.yaml`, `test-plan.md` | обычный, pro |
|
|
206
211
|
| implementer | Продуктовый код и отметки в `tasks.md`; тестовые файлы защищены | Артефакты изменения, проектную документацию, правила, код | Код | обычный, pro |
|
|
207
212
|
| reviewer | Только чтение; вердикт привязан к дайджесту change-set | Артефакты, правила, диф, отчёт верификатора; в фазе cover тесты и `coverage.yaml` | `evidence/review-N.md` с disposition и `delivery_narrative`, `evidence/tests-review-N.md` | обычный, pro |
|
|
@@ -225,9 +230,9 @@ blocker:
|
|
|
225
230
|
category: артефакт | тесты | реализация | внешний | пользователь | нет
|
|
226
231
|
artifact: tasks # только для категории артефакт
|
|
227
232
|
message: ...
|
|
228
|
-
complexity: #
|
|
229
|
-
implementation: обычная | высокая
|
|
230
|
-
review: обычная | высокая
|
|
233
|
+
complexity: # planner; challenger может повысить оценку после аудита
|
|
234
|
+
implementation: простая | обычная | высокая
|
|
235
|
+
review: простая | обычная | высокая
|
|
231
236
|
size: small | normal | large # только planner на фазе propose
|
|
232
237
|
request: # только researcher: разбор запроса, цитаты сверяются с request.md
|
|
233
238
|
- { quote: ..., status: подтверждено | противоречит | не проверено, evidence: ... }
|
|
@@ -268,7 +273,7 @@ Delivery narrative. При вердикте `готово` ревьюер пиш
|
|
|
268
273
|
|
|
269
274
|
### Уровни модели и продолжение сессий
|
|
270
275
|
|
|
271
|
-
Планировщик оценивает сложность реализации и
|
|
276
|
+
Планировщик отдельно оценивает сложность реализации и ревью: простая, обычная, высокая, учитывая неопределённость и последствия ошибки. Общая функция выбора сопоставляет сложность реализации с simple, medium, complex для implementer/tester, затем берёт model и effort из профиля конкретного раннера. Независимое ревью по умолчанию всегда complex. Оценка может расти при возвратах, но не снижаться; размер изменения не заменяет сложность. Подробная политика и настройка — раздел 18.
|
|
272
277
|
|
|
273
278
|
При возврате к роли CLI продолжает её прошлую сессию по идентификатору, если адаптер среды это умеет. Если нет, создаётся новая сессия, и в неё передаются исходный пакет и текст возврата вместе. Идентификаторы сессий хранятся в `runs/`.
|
|
274
279
|
|
|
@@ -302,7 +307,7 @@ Delivery narrative. При вердикте `готово` ревьюер пиш
|
|
|
302
307
|
test-plan.md # при необходимости
|
|
303
308
|
evidence/
|
|
304
309
|
research.md
|
|
305
|
-
challenge.md
|
|
310
|
+
challenge-1.md
|
|
306
311
|
tests-review-1.md
|
|
307
312
|
review-1.md
|
|
308
313
|
verify-1.md
|
|
@@ -706,7 +711,7 @@ interface AgentRunner {
|
|
|
706
711
|
}
|
|
707
712
|
```
|
|
708
713
|
|
|
709
|
-
Реализации: `claude` через Claude Agent SDK (управляемые сессии, разрешения на инструменты, учёт стоимости), `codex` через `codex exec` в неинтерактивном режиме.
|
|
714
|
+
Реализации: `claude` через Claude Agent SDK (управляемые сессии, разрешения на инструменты, учёт стоимости), `codex` через `codex exec` в неинтерактивном режиме. Поддержка продолжения проверяется по возможностям CLI; если её нет, возврат к роли идёт через новую сессию с полным контекстом. Разрешения на команды и пути берутся из `workflow.md`, `testing.md` и списка защищённых файлов.
|
|
710
715
|
|
|
711
716
|
Рецепт вызова Codex повторяет проверенный в Suite:
|
|
712
717
|
|
|
@@ -739,7 +744,13 @@ interface HostMaterials {
|
|
|
739
744
|
}
|
|
740
745
|
```
|
|
741
746
|
|
|
742
|
-
Команда `sbox host install --target claude | codex`
|
|
747
|
+
Команда `sbox host install --target claude | codex` и `sbox init --host` копируют общие скиллы из `assets/skills` без изменений. Для Claude Code генерируются `.claude/agents/sbox-<role>.md` и варианты профилей; скиллы подключаются полем skills. Для Codex генерируются 28 standalone TOML-файлов `.codex/agents/sbox-<role>[-<profile>].toml`: семь активных ролей, базовое имя и три профиля. Имя, описание, model, model_reasoning_effort, sandbox_mode и developer_instructions задаются явно. Скиллы роли фильтруются по хосту и перечисляются путями в инструкциях. Шаблоны живут в assets/hosts; определения ролей и переопределения .sbox/roles общие.
|
|
748
|
+
|
|
749
|
+
Codex получает раздел AGENTS.md между маркерами `<!-- sbox:begin -->` / `<!-- sbox:end -->`; остальной текст сохраняется дословно, повторная установка идемпотентна. Повреждённые маркеры, AGENTS.md-ссылка и чужой файл с именем генерируемого агента останавливают установку до записи материалов. Пользовательский .codex/config.toml не меняется, глобальные настройки и доверие проекту не переключаются. После установки нужна новая сессия Codex; проектные материалы должны быть доверенными средствами хоста. Настройки доступа родительской сессии могут ограничивать или переопределять sandbox агента; инструкции ownership действуют независимо от них.
|
|
750
|
+
|
|
751
|
+
Скилл sbox-run общий: next вызывается с текущим хостом явно. В нативном Codex пользовательский агент возвращает полный ответ родителю, который дословно сохраняет resultFile и сдаёт report; read-only роль не получает запись ради отчёта. CLI сохраняет requested_execution отдельно от фактических данных раннера. Повторное использование агента возможно только внутри того же изменения при совпадении runner/agent/model/effort и доступной функции продолжения. Если клиент не умеет выбирать пользовательских агентов, скилл выполняет один шаг через `sbox run --runner codex --max-runs 1`; headless сам принимает отчёт, поэтому повторный report запрещён. CodexRunner сохраняет thread_id из событий thread.started и продолжает нужную сессию через exec resume <id> при совпадении роли, модели, effort и профиля. Поддержка resume со структурированным выводом проверяется по справке CLI; старый клиент начинает свежую сессию с полным пакетом. Никогда не используется --last. Для resume рабочая директория задаётся cwd процесса, sandbox — через config override. Нативный и headless пути используют один resolver и одинаковый жизненный цикл, включая challenger. Гейты и доставка не утверждаются оркестратором автоматически.
|
|
752
|
+
|
|
753
|
+
Формат Codex сверён с [официальной документацией Subagents](https://learn.chatgpt.com/docs/agent-configuration/subagents) 2026-09-28. Поддержка standalone agents зависит от версии клиента; доступность конкретной модели проверяет провайдер при запуске.
|
|
743
754
|
|
|
744
755
|
### Отчёты тестов
|
|
745
756
|
|
|
@@ -846,7 +857,7 @@ packages/
|
|
|
846
857
|
| 1. Ядро и interactive-режим | Конфиг, `change.yaml`, машина состояний, `next` и `report`, адаптер spec-box, категории документации и структурный `doctor`, формат дизайна с вопросами и правилами, материалы для Claude Code | В репозитории `sync` разработчик проводит одно изменение до пул-реквеста из Claude Code, фазу cover выполняет вручную |
|
|
847
858
|
| 2. Тесты и headless на GitHub | Роль tester, ИИ-ревью тестов, защита тестов, `coverage.yaml`, верификатор с отчётами до ревьюера, контракт ревьюера с disposition и `delivery_narrative`, запечатывание change-set и привязка вердиктов к дайджесту, ревизия и lock `change.yaml`, receipt запусков, политика одного транспортного повтора, статусы `parked`, `stopped`, `delivery_unknown`, адаптеры сред Claude и Codex с надзором за процессами, `run`, `stop`, `watch`, адаптер GitHub с `git worktree` и идемпотентной доставкой, каналы `cli` и `pr-comments`, архивация в пул-реквесте, CI `sync` на GitHub Actions, Docker-образ и GitHub Action | Изменение в `sync` проходит от тикета до готового к влитию пул-реквеста, человек участвует только на гейтах |
|
|
848
859
|
| 3. Дискавери и правила | `discover` с дельтами и решениями, критерии достаточности, `discover validate`, повышение решений и проверка правил, `doctor --deep` | Изменение в `sync` по брифу проходит профиль `autonomous` без блокера `пользователь` |
|
|
849
|
-
| 4. Arcadia и Magic | Адаптер Arcadia с отдельным `arc mount` на изменение и идемпотентной доставкой в Arcanum, канал `tracker` с проекцией статуса
|
|
860
|
+
| 4. Arcadia и Magic | Адаптер Arcadia с отдельным `arc mount` на изменение и идемпотентной доставкой в Arcanum, канал `tracker` с проекцией статуса тегами (материалы Codex реализованы отдельно) | Изменение в Magic проходит headless до готового к влитию пул-реквеста |
|
|
850
861
|
| 5. Несколько репозиториев | Координация, события, опрос и `github-dispatch` | Согласованное изменение в двух репозиториях доходит до двух пул-реквестов с правильным порядком мержа; проект для проверки выбирается, когда он появится |
|
|
851
862
|
| 6. Расширения | Схема `bugfix` с причинным контрактом и RED-оракулом, wiki и дистилляция, шина событий для Arcadia (адаптер OpenSpec реализован досрочно) | Порядок определяют потребности пилотов |
|
|
852
863
|
|
|
@@ -904,3 +915,17 @@ summary и read_when пишет автор или агент: CLI не гене
|
|
|
904
915
|
Применение сериализуется файлом `.sbox-contract.lock` в корне проекта с PID владельца. При аварийном завершении lock остаётся: после проверки завершения процесса его можно удалить. Сервис повторно читает состояние под блокировкой, проверяет revision и валидацию, снимает копию затрагиваемых файлов, применяет и проверяет результат. При исключении файлы восстанавливаются, новые удаляются. Запись через симлинки и за пределы корня проекта запрещена. Эта блокировка общая для standalone CLI и доставки SDD; внешние редакторы её не соблюдают. Это откат при обработанной ошибке, не crash-safe транзакция файловой системы.
|
|
905
916
|
|
|
906
917
|
В текущую версию не входят межформатная конвертация, семантический поиск, автоматический merge конкурирующих дельт и выгрузка во внешнюю систему. Архивация задачи и принятие решения о готовности остаются в SDD.
|
|
918
|
+
|
|
919
|
+
## 18. Профили моделей по раннерам
|
|
920
|
+
|
|
921
|
+
Единый модуль `src/core/model-policy.ts` содержит профили simple/medium/complex, дефолты и функцию resolveModel. Роль определяет профиль, раннер — пару model + effort. Настройки находятся в `runner.claude.profiles` и `runner.codex.profiles`; частично заданные профили дополняются дефолтами. extraConfig Codex не может переопределять model/model_reasoning_effort в обход профиля. Уровни effort проверяются по раннеру (Claude: low/medium/high/xhigh/max; Codex: none/minimal/low/medium/high/xhigh); доступность модели и поддержка конкретного сочетания на стороне провайдера локально не проверяются.
|
|
922
|
+
|
|
923
|
+
Порядок выбора: явный `runner.roleProfiles[role]`; иначе complexity.implementation для implementer/tester (простая → simple, обычная → medium, высокая → complex); иначе дефолт роли. Planner, challenger и reviewer по умолчанию complex, distiller simple, остальные medium. RoleProfiles фиксирует профиль даже при повышенной оценке сложности. Автоматические возвраты только повышают complexity; размер small/normal/large управляет артефактами, а не бюджетом модели. Профиль не назначает модель другому раннеру.
|
|
924
|
+
|
|
925
|
+
Пакет и `sbox next --brief` содержат execution: runner, profile, model, effort, agent. `--runner` у next выбирает среду явно, без флага используется runner.default. Headless передаёт model и effort из того же пакета адаптеру. `sbox models [--runner claude|codex] [--change id]` показывает выбор всех ролей; без --change используются дефолты ролей/явные roleProfiles.
|
|
926
|
+
|
|
927
|
+
Для Claude Code `host install` создаёт по три варианта каждой активной роли (`sbox-<role>-simple|medium|complex`) и базовое имя с дефолтным профилем роли. Model сохраняется точно, без замены полного идентификатора псевдонимом opus/sonnet. Скилл sbox-run вызывает next с --runner текущего хоста и запускает имя из execution.agent. После изменения конфига нужно обновить материалы хоста. Для Codex генерируются TOML-агенты тех же ролей и профилей; execution.agent содержит их имя. Headless использует ту же политику.
|
|
928
|
+
|
|
929
|
+
Headless рассматривает последнюю сессию роли и продолжает её только при совпадении роли, раннера, модели, профиля и effort. Старые записи без профиля/effort не используются для resume. Выбор сохраняется в receipt и истории запусков, в журнале печатаются профиль, модель и effort. Для интерактивного отчёта отдельно сохраняется requested_execution из выданного пакета: это запрошенные настройки, а не подтверждение фактического исполнения хостом. Поля фактического раннера/модели остаются необязательными.
|
|
930
|
+
|
|
931
|
+
Общие runner.models, runner.efforts, runner.defaultEffort отклоняются с инструкцией перейти на профили. Они не игнорируются и автоматически не переносятся, поскольку старая таблица не определяет принадлежность модели раннеру. Базовые идентификаторы моделей SDD сохранены; simple использует прежнюю обычную модель с low, medium — с medium, complex — прежнюю сильную с high. Явные настройки проекта сохраняют приоритет. Это начальная политика качества, не результат измерения качества моделей. complexity.review сохраняется для анализа рисков, но не снижает профиль reviewer. Референс и отличия: docs/research/agentic-openspec-models.md.
|