152 lines
9.9 KiB
Markdown
152 lines
9.9 KiB
Markdown
---
|
||
work_item: ORCH-092
|
||
stage: analysis
|
||
author_agent: analyst
|
||
status: ready-for-review
|
||
created_at: 2026-06-09
|
||
model_used: claude-opus-4-8
|
||
---
|
||
|
||
# 03 — Критерии приёмки (Acceptance Criteria): ORCH-092 — Промпт-аудит 6 агентов
|
||
|
||
Work Item: **ORCH-092** · Repo: **orchestrator** · Стадия: analysis
|
||
|
||
Формат: каждый критерий имеет **PASS** (что должно быть истинно для приёмки) и **FAIL**
|
||
(что считается провалом). Reviewer/tester проверяют буквально по файлам репозитория
|
||
(`.openclaw/agents/*.md`, `tests/`, `docs/`).
|
||
|
||
---
|
||
|
||
## AC-1 — `created_at` в примерах всех 6 промптов — плейсхолдер (P0-1, BR-1, FR-1)
|
||
|
||
**Условие:** В копируемом примере frontmatter каждого из 6 промптов дата не захардкожена.
|
||
- **PASS:** В `analyst/architect/developer/reviewer/tester/deployer.md` пример несёт
|
||
`created_at: <YYYY-MM-DD>` (плейсхолдер); рядом — явная инструкция «подставь фактическую дату
|
||
(`date +%F`), НЕ копируй из примера». Литерала `created_at: 2026-06-09` (или иной конкретной
|
||
даты) в **копируемом блоке** нет.
|
||
- **FAIL:** Хотя бы один промпт оставляет конкретную дату в примере, или отсутствует инструкция
|
||
«не копируй буквально».
|
||
|
||
---
|
||
|
||
## AC-2 — `model_used` в примерах — плейсхолдер/резолв (P0-2, BR-2, FR-2)
|
||
|
||
**Условие:** В копируемом примере frontmatter каждого из 6 промптов модель не захардкожена.
|
||
- **PASS:** Пример несёт `model_used: <resolve ORCH-41>` (или эквивалентный плейсхолдер) +
|
||
оговорку «подставь фактическую модель из конфига». Литерал `claude-opus-4-8` в **копируемом
|
||
блоке** отсутствует (допускается как справка в таблице полей вне блока).
|
||
- **FAIL:** Хотя бы один промпт оставляет `model_used: claude-opus-4-8` в копируемом примере,
|
||
или нет оговорки про подстановку.
|
||
|
||
---
|
||
|
||
## AC-3 — Имена гейтов сверены с `QG_CHECKS` (P0-3, BR-3, FR-3)
|
||
|
||
**Условие:** Все `check_*`/имена QG-функций в промптах соответствуют реестру `QG_CHECKS`.
|
||
- **PASS:** Каждое имя гейта, встречающееся в 6 промптах, присутствует ключом в
|
||
`QG_CHECKS` (`src/qg/checks.py`). Реальные несовпадения (если бы были) исправлены; ложные
|
||
(напр. `check_tests_passed` — верен) НЕ тронуты. Сверка закреплена тестом (см. AC-10/TC-03).
|
||
- **FAIL:** В промпте остаётся имя гейта, которого нет в `QG_CHECKS`; ИЛИ исправлено верное имя
|
||
«вслепую» (придуманная замена).
|
||
|
||
---
|
||
|
||
## AC-4 — developer: «PR>1500» → эскалация (P1-1, BR-4, FR-4)
|
||
|
||
**Условие:** Нереализуемая инструкция о разбиении PR переформулирована.
|
||
- **PASS:** `developer.md` НЕ содержит инструкции «разбивай на меньшие PR»; вместо неё —
|
||
эскалация: слишком большой PR → флагировать/эскалировать (нужна декомпозиция на уровне задач,
|
||
1 задача = 1 ветка = 1 PR). Маркер «свой PR» («не мержи свой PR») сохранён.
|
||
- **FAIL:** Старая формулировка «разбивай на меньшие PR» осталась; ИЛИ при правке удалён маркер
|
||
«свой PR».
|
||
|
||
---
|
||
|
||
## AC-5 — `<escalation>` в developer/reviewer/tester (P1-3, BR-5, FR-5)
|
||
|
||
**Условие:** Три промпта получили секцию `<escalation>` с чёткими маршрутами.
|
||
- **PASS:** `developer.md`, `reviewer.md`, `tester.md` содержат `<escalation>`…`</escalation>`
|
||
(после `</success_criteria>`), с маршрутами: developer → `back-to:analysis`; tester →
|
||
`back-to:dev` (при FAIL); reviewer → `REQUEST_CHANGES`. Нормативный порядок 5 обязательных
|
||
секций НЕ нарушен.
|
||
- **FAIL:** Хотя бы у одного из трёх нет `<escalation>`; ИЛИ её добавление сломало порядок/
|
||
наличие 5 обязательных секций.
|
||
|
||
---
|
||
|
||
## AC-6 — deployer: рамка запретов + решённый язык (P2-1/P2-2, BR-6/BR-10, FR-6/FR-10)
|
||
|
||
**Условие:** Критичные self-hosting-запреты подняты в видную рамку; вопрос языка решён.
|
||
- **PASS:** `deployer.md` несёт **в начале** видную рамку с критичным запретом «NEVER restart
|
||
prod 8500». Язык deployer решён архитектором в `06-adr/`: либо унифицирован на ru, либо
|
||
зафиксировано явное исключение (en) с обоснованием. Маркеры `docker exec orchestrator-staging`,
|
||
`pr_already_merged`, `8500`, `INFRA-WAIVED` сохранены; verdict-ключи и команды не сломаны.
|
||
- **FAIL:** Критичный запрет не выделен/утоплен в тексте; ИЛИ язык не решён (нет ADR-решения);
|
||
ИЛИ потерян анти-регресс-маркер / сломан verdict-ключ при переводе.
|
||
|
||
---
|
||
|
||
## AC-7 — tester обогащён (P2-3, BR-7, FR-7)
|
||
|
||
**Условие:** tester получил worktree-путь, serial_gate smoke и покрытие ТЗ.
|
||
- **PASS:** `tester.md`: (а) явно указывает worktree-путь ветки задачи (а не общий
|
||
`/repos/orchestrator`) для прогона тестов; (б) smoke `/queue` проверяет наличие блока
|
||
`serial_gate` (ORCH-088); (в) `<success_criteria>` требует покрытия каждого TC из
|
||
`04-test-plan.yaml` (а не только «файл записан»). Маркеры `pytest`/`/health`/`/status`/`/queue`
|
||
сохранены.
|
||
- **FAIL:** Отсутствует любой из трёх пунктов; ИЛИ потерян анти-регресс-маркер tester.
|
||
|
||
---
|
||
|
||
## AC-8 — Удалена мёртвая инструкция reviewer (P2-4, BR-8, FR-8)
|
||
|
||
**Условие:** Строка про «тот же экземпляр Developer» удалена без потери живых инвариантов.
|
||
- **PASS:** `reviewer.md` НЕ содержит «не апрувь PR от того же экземпляра Developer». Маркеры
|
||
`REQUEST_CHANGES` и «НЕ обновлена», ось документации, ось трассировки (`TRACEABILITY.md`),
|
||
ось обзорных доков (`Известные ограничения`, `ORCH-079`) сохранены.
|
||
- **FAIL:** Мёртвая строка осталась; ИЛИ при удалении пострадал живой инвариант reviewer.
|
||
|
||
---
|
||
|
||
## AC-9 — АНТИ-РЕГРЕСС: verdict-ключи + канон + `src/` не тронут (NFR-1/2, BR-11)
|
||
|
||
**Условие:** Машинные контракты и канон сохранены, код не тронут.
|
||
- **PASS:** verdict-ключи `verdict:`/`result:`/`staging_status:`/`deploy_status:`/
|
||
`security_status:` (+ значения APPROVED/REQUEST_CHANGES/PASS/FAIL/SUCCESS/FAILED) — байт-в-байт.
|
||
5 XML-секций в нормативном порядке + 6 полей 52c во всех 6 промптах. `src/**`,
|
||
`STAGE_TRANSITIONS`, `QG_CHECKS`, схема БД — без изменений в diff. `git diff --stat` не содержит
|
||
`src/`. `tests/test_agent_prompts_canon.py` и `tests/test_agent_frontmatter_no_model.py` —
|
||
зелёные.
|
||
- **FAIL:** Любой verdict-ключ изменён по имени/регистру/значению; нарушен порядок/наличие 5
|
||
секций или 6 полей; есть правка `src/`; целевые тесты красные.
|
||
|
||
---
|
||
|
||
## AC-10 — Документация и тесты обновлены (BR-11, FR-11)
|
||
|
||
**Условие:** Обзорная документация и анти-регресс-тесты отражают изменение.
|
||
- **PASS:** `CHANGELOG.md` несёт запись ORCH-092; `CLAUDE.md`/`docs/architecture/README.md`
|
||
обновлены при необходимости; `06-adr/ADR-001-*.md` фиксирует решения P1-2/P2-2; новые
|
||
структурные TC (плейсхолдеры даты/модели, `<escalation>`, удаление мёртвой строки, обогащение
|
||
tester, рамка deployer, сверка гейтов) добавлены в `tests/test_agent_prompts_canon.py` и
|
||
зелёные; полный `pytest tests/ -q` зелёный.
|
||
- **FAIL:** Отсутствует ADR-решение P1-2/P2-2; нет записи в CHANGELOG; новые инварианты не
|
||
покрыты тестом; регресс красный.
|
||
|
||
---
|
||
|
||
## Сводная матрица 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-4 |
|
||
| AC-5 | BR-5 / FR-5 |
|
||
| AC-6 | BR-6 / BR-10 / FR-6 / FR-10 |
|
||
| AC-7 | BR-7 / FR-7 |
|
||
| AC-8 | BR-8 / FR-8 |
|
||
| AC-9 | NFR-1 / NFR-2 / FR-9 (rebase по ADR без слома канона) |
|
||
| AC-10 | BR-9 / BR-11 / FR-9 / FR-11 |
|