134 lines
9.1 KiB
Markdown
134 lines
9.1 KiB
Markdown
# 03 — Критерии приёмки (Acceptance Criteria): ORCH-077 — ORCH-52d: оптимизация 6 системных промптов по Anthropic
|
||
|
||
Work Item: **ORCH-077** · Repo: **orchestrator** (self-hosting) · Стадия: analysis
|
||
|
||
Формат: каждый критерий имеет **PASS** (что должно быть истинно для приёмки) и **FAIL**
|
||
(что считается провалом). Reviewer/tester проверяют их буквально по файлам репозитория.
|
||
|
||
---
|
||
|
||
## AC-1 — Единый XML-стиль во всех 6 промптах
|
||
|
||
**Условие:** Все 6 файлов `.openclaw/agents/{analyst,architect,developer,reviewer,tester,deployer}.md`
|
||
переписаны единым каноном с XML-секциями.
|
||
- **PASS:** Тело каждого из 6 промптов содержит все 5 обязательных секций-тегов: `<context>`,
|
||
`<task>`, `<deliverables>`, `<constraints>`, `<output_format>` (открывающий и закрывающий тег).
|
||
- **FAIL:** Хотя бы в одном промпте отсутствует одна из 5 секций, ИЛИ структура осталась прежней
|
||
свободной формой без XML-разметки.
|
||
|
||
---
|
||
|
||
## AC-2 — Инструкция эмитить обязательную frontmatter-схему 52c
|
||
|
||
**Условие:** Каждый промпт явно инструктирует агента проставлять 6 обязательных полей схемы
|
||
(`work_item`, `stage`, `author_agent`, `status`, `created_at`, `model_used`) в авторских документах.
|
||
- **PASS:** В секции `<output_format>` каждого из 6 промптов перечислены ВСЕ 6 имён полей схемы;
|
||
для роли указаны конкретные значения `stage` (стадия роли) и `author_agent` (роль) согласно
|
||
карте TRZ §FR-2; `model_used` привязан к резолву ORCH-41 (`claude-opus-4-8`).
|
||
- **FAIL:** В любом промпте отсутствует хотя бы одно из 6 имён полей, ИЛИ `author_agent`/`stage`
|
||
не конкретизированы для роли, ИЛИ инструкция отсутствует вовсе.
|
||
|
||
---
|
||
|
||
## AC-3 — Few-shot и позитивные примеры рядом с запретами
|
||
|
||
**Условие:** Каждый промпт ссылается на скелеты 52b и эталоны, запреты имеют позитивную альтернативу.
|
||
- **PASS:** Каждый из 6 промптов содержит (а) ссылку на `docs/_templates/` для своих документов;
|
||
(б) ссылку хотя бы на один эталонный work item (`ORCH-073` или `ORCH-088`); (в) минимум один
|
||
запрет, оформленный с позитивной альтернативой («делай Y вместо X» / «❌ … → ✅ …»).
|
||
- **FAIL:** В любом промпте нет ссылки на шаблоны, ИЛИ нет ссылки на эталон, ИЛИ запреты поданы
|
||
только негативно (без позитивной альтернативы ни в одном пункте).
|
||
|
||
---
|
||
|
||
## AC-4 — АНТИ-РЕГРЕСС: ни одна функциональная инструкция не потеряна
|
||
|
||
**Условие:** Все функциональные инструкции старых промптов перенесены в новые (инвентарь TRZ §FR-6).
|
||
- **PASS:** Для каждого промпта присутствуют все ключевые элементы инвентаря §FR-6, в частности
|
||
(минимальный машинно-проверяемый набор):
|
||
- **reviewer.md** содержит machine-key `verdict:` со значениями `APPROVED`|`REQUEST_CHANGES`
|
||
(UPPERCASE) и правило «вердикт читается только из frontmatter»; правило «src/ изменён, доки нет
|
||
→ REQUEST_CHANGES».
|
||
- **tester.md** содержит `result:` со значениями `PASS`|`FAIL` как машинный вердикт; алгоритм
|
||
pytest + smoke (`/health`,`/status`,`/queue`).
|
||
- **deployer.md** содержит `staging_status:` (`SUCCESS`|`FAILED`), `deploy_status:`
|
||
(`SUCCESS`|`FAILED`), canonical `docker exec orchestrator-staging … staging_check.py`,
|
||
идемпотентный merge-guard `pr_already_merged`, self-hosting-запрет «не рестартить 8500 изнутри»,
|
||
ORCH-061 waiver-логику.
|
||
- **analyst.md** содержит 4 deliverable (`01`/`02`/`03`/`04`), «использовать Write tool», формат
|
||
TRZ и test-plan.
|
||
- **architect.md** содержит ADR-формат, правило сквозного ADR, self-hosting-запрет «без рестарта
|
||
прода без staging», эскалацию.
|
||
- **developer.md** содержит TDD-алгоритм, «документация в том же PR», запреты (не мержить свой PR,
|
||
без `--no-verify`/`--force-push`, не рестартить прод, не коммитить секреты).
|
||
- **FAIL:** Любой элемент инвентаря §FR-6 отсутствует или искажён (изменён регистр/имя
|
||
machine-verdict ключа; пропал self-hosting-запрет; пропал merge-guard; пропала canonical-команда).
|
||
|
||
---
|
||
|
||
## AC-5 — Код не изменён, гейты нетронуты
|
||
|
||
**Условие:** Правятся только `.openclaw/agents/*.md` + документация; код и контракты гейтов не тронуты.
|
||
- **PASS:** `git diff` затрагивает ТОЛЬКО `.openclaw/agents/*.md`, `CLAUDE.md`,
|
||
`docs/**`, `CHANGELOG.md` и (новые) `tests/test_*prompt*`/`tests/test_*canon*`. Файлы
|
||
`src/config.py`, `src/agents/launcher.py`, `src/frontmatter.py`, `src/stages.py`,
|
||
`src/qg/checks.py`, `src/stage_engine.py` НЕ изменены. `frontmatter_validation_strict` остаётся
|
||
`False`.
|
||
- **FAIL:** Изменён любой файл `src/**`, ИЛИ затронут `STAGE_TRANSITIONS`/`QG_CHECKS`/`check_*`, ИЛИ
|
||
включён hard-fail валидации схемы.
|
||
|
||
---
|
||
|
||
## AC-6 — A/B-проверка на репрезентативной стадии: «не хуже»
|
||
|
||
**Условие:** Проведено сравнение старого vs нового промпта минимум на одной стадии.
|
||
- **PASS:** В артефактах задачи (`13-test-report.md` и/или ADR/`12-review.md`) зафиксирован
|
||
результат A/B: новый промпт даёт артефакт не хуже старого — число циклов `REQUEST_CHANGES` не
|
||
выросло, обязательные элементы артефакта присутствуют, машинный вердикт корректно парсится.
|
||
- **FAIL:** A/B не проводилось/не зафиксировано, ИЛИ новый промпт показал регресс (больше циклов
|
||
REQUEST_CHANGES, потеря содержания, непарсимый вердикт).
|
||
|
||
---
|
||
|
||
## AC-7 — Документация обновлена
|
||
|
||
**Условие:** `CLAUDE.md`, `docs/architecture/README.md`, ADR и `CHANGELOG.md` обновлены в том же PR.
|
||
- **PASS:** Есть per-work-item ADR `docs/work-items/ORCH-077/06-adr/ADR-001-*.md`; `CLAUDE.md` и
|
||
`docs/architecture/README.md` отражают слой промптов 52d (эмиссия схемы); `CHANGELOG.md` содержит
|
||
запись под `## [Unreleased]`.
|
||
- **FAIL:** Отсутствует ADR, ИЛИ README/CLAUDE.md не упоминают 52d-изменение, ИЛИ нет записи в
|
||
CHANGELOG.
|
||
|
||
---
|
||
|
||
## AC-8 — Валидность frontmatter промптов сохранена
|
||
|
||
**Условие:** YAML-frontmatter каждого промпта валиден и не возвращает `model:`.
|
||
- **PASS:** `tests/test_agent_frontmatter_no_model.py` зелёный: каждый frontmatter парсится как
|
||
YAML-mapping, `name`==роль, `description` непуст, ключа `model:` нет.
|
||
- **FAIL:** Любой промпт сломал YAML-frontmatter, потерял `name`/`description`, ИЛИ вернул `model:`.
|
||
|
||
---
|
||
|
||
## AC-9 — Полный регресс тестов зелёный
|
||
|
||
**Условие:** Изменение не ломает существующий набор тестов.
|
||
- **PASS:** `pytest tests/ -q` зелёный; новые структурные тесты промптов проходят.
|
||
- **FAIL:** Любой тест падает.
|
||
|
||
---
|
||
|
||
## Сводная матрица AC ↔ FR/BR
|
||
|
||
| AC | Покрывает |
|
||
|----|-----------|
|
||
| AC-1 | BR-1 / FR-1 |
|
||
| AC-2 | BR-2 / FR-2 |
|
||
| AC-3 | BR-3 / FR-3 |
|
||
| AC-4 | BR-4 / FR-6 / NFR-2 |
|
||
| AC-5 | BR-5 / TRZ §4–§6 |
|
||
| AC-6 | BR-6 / FR-7(A/B) |
|
||
| AC-7 | BR-7 |
|
||
| AC-8 | NFR-3 / FR-7 |
|
||
| AC-9 | NFR-1 / TRZ §7 |
|