Files
orchestrator/docs/work-items/ORCH-092/03-acceptance-criteria.md

9.9 KiB
Raw Permalink Blame History

work_item, stage, author_agent, status, created_at, model_used
work_item stage author_agent status created_at model_used
ORCH-092 analysis analyst ready-for-review 2026-06-09 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