# 02 — ТЗ (TRZ): ORCH-077 — ORCH-52d: оптимизация 6 системных промптов по Anthropic

Work Item: **ORCH-077** · Repo: **orchestrator** (self-hosting) · Стадия: analysis

> ТЗ описывает **конкретные изменения** (выведенные из BRD и фактического содержимого репозитория).
> Архитектурное обоснование (порядок секций, формулировки, нужен ли сквозной ADR) — задача
> архитектора (`06-adr`). Это **docs/prompts-only** задача: код не меняется.

## 1. Сводка изменения

Переписать 6 системных промптов агентов (`.openclaw/agents/*.md`) в едином каноне Anthropic
(XML-секции) и научить каждый эмитить обязательную frontmatter-схему 52c в авторских документах.
**Тело** промпта (Markdown ниже frontmatter) реструктурируется; **YAML-frontmatter промпта**
(`name`, `description`, `tools`) сохраняется как есть (без `model:`). СОДЕРЖАНИЕ всех
функциональных требований переносится 1:1 (см. §3 — инвентарь анти-регресса). Параллельно
обновляется документация (§8).

## 2. Задействованные модули / пути

| Путь | Действие |
|------|----------|
| `.openclaw/agents/analyst.md` | переписать (тело) |
| `.openclaw/agents/architect.md` | переписать (тело) |
| `.openclaw/agents/developer.md` | переписать (тело) |
| `.openclaw/agents/reviewer.md` | переписать (тело) |
| `.openclaw/agents/tester.md` | переписать (тело) |
| `.openclaw/agents/deployer.md` | переписать (тело) |
| `CLAUDE.md` | обновить (раздел про промпты / эпик 52) |
| `docs/architecture/README.md` | обновить (раздел про схему/handoff и слой промптов 52d) |
| `docs/work-items/ORCH-077/06-adr/ADR-001-*.md` | создать (архитектор) |
| `docs/architecture/adr/adr-NNNN-*.md` | создать при необходимости (архитектор, если сквозное) |
| `CHANGELOG.md` | добавить запись `## [Unreleased]` |
| `tests/test_agent_prompts_canon.py` (имя — на усмотрение dev) | создать (структурные тесты, §7 / см. test-plan) |
| **НЕ трогать** | `src/**` (любой), включая `config.py`, `agents/launcher.py`, `frontmatter.py`, `stages.py`, `qg/checks.py`, `stage_engine.py` |

## 3. Функциональные требования

### FR-1 — Единая XML-структура секций во всех 6 промптах (BR-1)

Тело каждого промпта организовано вокруг секций (XML-теги как разделители смысловых блоков):

- `<context>` — кто агент, проект orchestrator, стек, self-hosting, что прочесть перед работой
  (обязательный пункт «прочти `CLAUDE.md` и `docs/architecture/README.md`»).
- `<task>` — что делает роль на своей стадии; допускается вложенная `<thinking>`-подсказка
  (явное место для рассуждения, где уместно — FR-4).
- `<deliverables>` — какие файлы и куда роль создаёт через Write tool.
- `<constraints>` — запреты и обязательные правила (включая ролевые «Запрещено» из старых промптов).
- `<output_format>` — точный формат выходных документов, включая frontmatter-схему (FR-2) и
  machine-verdict ключи.

Дополнительные секции допустимы (напр. `<success_criteria>`, `<escalation>`), но 5 перечисленных
обязательны во всех 6 промптах.

### FR-2 — Инструкция эмитить обязательную frontmatter-схему 52c (BR-2)

В секции `<output_format>` каждого промпта явно перечислены 6 обязательных полей схемы
(`src/frontmatter.py::REQUIRED_FIELDS`) с конкретными для роли значениями. Схема ставится
**аддитивно** — ПОВЕРХ существующих ключей документа, НЕ заменяя и НЕ смещая machine-verdict
ключи (NFR-1).

| Поле | Значение / источник |
|------|---------------------|
| `work_item` | ID задачи (`ORCH-NNN` / `ET-NNN`) — подставляется агентом |
| `stage` | стадия роли (см. таблицу ниже) |
| `author_agent` | роль (см. таблицу ниже) |
| `status` | статус выхода стадии (роле-специфично; для вердикт-доков согласован с вердиктом) |
| `created_at` | текущая дата `YYYY-MM-DD` |
| `model_used` | резолв ORCH-41 — на текущий момент `claude-opus-4-8` для всех ролей (README §«Модель и эффорт») |

**Карта роль → стадия → author_agent → документы, несущие схему:**

| Роль (prompt) | `stage` | `author_agent` | Документы со схемой | Machine-verdict ключ (НЕ трогать) |
|---------------|---------|----------------|---------------------|-----------------------------------|
| analyst | `analysis` | `analyst` | `01-brd.md`, `02-trz.md`, `03-acceptance-criteria.md`, `04-test-plan.yaml` | — (нет; гейт = наличие файлов + Approved) |
| architect | `architecture` | `architect` | `06-adr/ADR-NNN-*.md`, `07-infra-requirements.md`, `08-data-requirements.md`, `10-tech-risks.md` | — |
| developer | `development` | `developer` | when-applicable доки, если трогает (`07`/`08`/`10`); код/PR номерного вердикт-дока не несёт | — (гейт = `check_ci_green`) |
| reviewer | `review` | `reviewer` | `12-review.md` | `verdict:` (`APPROVED`\|`REQUEST_CHANGES`) |
| tester | `testing` | `tester` | `13-test-report.md` | `result:`/`verdict:`/`status:` (`PASS`\|`FAIL`\|`BLOCKED`) |
| deployer | `deploy-staging`, `deploy` | `deployer` | `15-staging-log.md`, `14-deploy-log.md`, `17-security-report.md` (when-applicable) | `staging_status:`, `deploy_status:`, `security_status:` |

> Примечание по `04-test-plan.yaml`: это YAML-документ (не Markdown с frontmatter-блоком). Схема
> ложится как top-level ключи YAML рядом с существующими (`work_item` уже присутствует в скелете;
> добавляются `stage`/`author_agent`/`status`/`created_at`/`model_used`). Архитектор фиксирует
> точную форму в ADR, если есть нюанс совместимости со скелетом 52b.

### FR-3 — Few-shot и позитивные примеры (BR-3)

В каждом промпте (секция `<deliverables>` и/или `<output_format>`):

- ссылка на копируемый скелет роли в `docs/_templates/` (напр. analyst → `01-brd.md`,
  `02-trz.md`, `03-acceptance-criteria.md`, `04-test-plan.yaml`);
- ссылка на эталонный заполненный work item — **ORCH-073** и/или **ORCH-088** — как пример
  качества/полноты;
- каждый запрет в `<constraints>` сопровождается позитивной альтернативой: формат
  «❌ не делай X → ✅ делай Y» (литеральность Opus 4.8).

### FR-4 — Явное место для рассуждения (CoT/thinking)

Там, где роль принимает решение (architect — выбор решения; reviewer — вынесение вердикта;
tester — классификация PASS/FAIL/BLOCKED; deployer — трактовка exit-кодов/waiver), промпт
содержит явную `<thinking>`-подсказку «сначала рассуди, потом пиши вердикт». Для механических
ролей (минимально) — не обязательно.

### FR-5 — Success-criteria артефакта стадии

В каждом промпте есть явный блок «выход считается готовым, когда…»: перечень файлов + наличие
обязательных frontmatter-полей + (для вердикт-ролей) корректный machine-verdict ключ.

### FR-6 — АНТИ-РЕГРЕСС: инвентарь сохраняемых инструкций (BR-4, критично)

Ниже — обязательный к переносу 1:1 минимум по каждому промпту. Reviewer проверяет ПОСТРОЧНО.
Список не исчерпывающий: переносится ВСЁ функциональное содержание, перечисленное — обязательный
костяк.

**analyst.md:**
- «Используй Write tool; не выводи содержимое в stdout».
- Список «что прочесть» (`CLAUDE.md`, README, `00-business-request.md`, `src/`).
- 4 обязательных deliverable: `01-brd.md`, `02-trz.md`, `03-acceptance-criteria.md`,
  `04-test-plan.yaml`.
- Формат TRZ (модули `src/`, изменения API, изменения БД, требования к QG, артефакты pipeline).
- Формат `test-plan.yaml` (id/type/description/module/expected).
- Запреты: не предлагать архитектурные решения, не писать код, не править чужие work item, не
  выводить в stdout.

**architect.md:**
- «Прочти CLAUDE.md и README».
- Контекст стека, конвейер, self-hosting-предупреждение (общий прод-контейнер).
- Deliverables: `06-adr/ADR-NNN-*.md` (обяз.), `07`/`08`/`10` (по применимости).
- Правило сквозного ADR `docs/architecture/adr/adr-NNNN-*` для сквозных решений.
- ADR-формат (Статус / Контекст / Решение / Последствия).
- «Документация = golden source»: обновлять README/internals при изменении стадий/QG.
- Self-hosting-запреты: не предлагать рестарт прода без staging-гейта, всё ORCH — через 8501.
- Принципы (Docker/один сервер, SQLite, conventional/trunk, без k8s/облака, без ORM при raw SQL).
- Запреты (multi-node/managed, лишний MQ, менять QG без ADR, рестарт прода без staging).
- Эскалация (`arch:major-change`, `back-to:analysis`).

**developer.md:**
- «Прочти CLAUDE.md и README».
- Стек, список «что прочесть» (`02-trz` — источник правды, `03`, `04`, `06-adr/`, код).
- Алгоритм: fetch+rebase origin/main → TDD (тест, потом код) → миграции при смене схемы →
  `ruff check` + `pytest` → conventional commit (`Refs: <plane-id>`) → push → PR в Gitea.
- «Документация = golden source в ТОМ ЖЕ PR» (API/конвейер/конфиг/компонент/CHANGELOG).
- Конвенции (conventional commits, ветки, docstring, содержательные тесты).
- Self-hosting: НЕ перезапускать прод, проверять через `pytest` локально.
- Запреты: не менять ТЗ/ADR, без ADR не решать архитектуру, не коммитить секреты,
  PR > 1500 строк без декомпозиции, не мержить свой PR, без `--no-verify`/`--force-push`,
  не рестартить прод.

**reviewer.md:**
- «Прочти CLAUDE.md (правила документирования!) и README».
- 4 оси: соответствие ТЗ, соответствие ADR, качество кода, **качество документации**.
- Жёсткое правило: src/ изменён, а `docs/`/`CHANGELOG`/ADR НЕ обновлены → ОБЯЗАТЕЛЬНО
  `REQUEST_CHANGES` (приоритет над остальным).
- Severity P0/P1/P2/P3 (с пунктом «документация не обновлена при изменении src/» = P0).
- Правило вердикта: любой P0/P1 → `REQUEST_CHANGES`; только P2/P3 / нет findings → `APPROVED`.
- **Frontmatter-контракт `12-review.md`:** вердикт читается ТОЛЬКО из `verdict:` (UPPERCASE,
  строго `APPROVED`|`REQUEST_CHANGES`), упоминания в прозе не учитываются; без frontmatter →
  not-approved.
- Запреты: не править код, не апрувить PR того же экземпляра developer, без subjective без
  ссылки на правило, не пропускать проверку документации.

**tester.md:**
- «Прочти CLAUDE.md и README».
- Что прочесть (`02`/`03`/`04`/`12-review.md` — убедиться, что вердикт APPROVED).
- Алгоритм: проверка окружения (`curl /health`) → `pytest tests/ -v --tb=short` → smoke API
  (`/health`, `/status`, `/queue`) → сверка покрытия ТЗ с `04-test-plan.yaml` и `03`.
- **Frontmatter `13-test-report.md`:** `result:` (PASS|FAIL) — машинный вердикт; таблица TC,
  вывод pytest, итог.
- Вердикт: все PASS+smoke OK → `result: PASS` → deploy-staging; любой FAIL → `result: FAIL` →
  откат на development.
- Запреты: не писать прод-код, не подгонять тесты под код, не запускать деструктив на проде.

**deployer.md** (наиболее рискованный — self-hosting):
- Шапка-предупреждение: прочесть CLAUDE.md/README/INFRA.md; **НЕ перезапускать прод 8500**.
- Стадия `deploy-staging`: canonical-команда `docker exec orchestrator-staging python3
  /repos/orchestrator/scripts/staging_check.py --base-url http://localhost:8501 --mode stub`
  (с обоснованием B6 registry-isolation — сохранить!); маппинг exit 0 → `SUCCESS`, ≠0 → `FAILED`.
- ORCH-061: толерантность к waived C9a/C9b (`INFRA-WAIVED:` копировать в лог; доверять exit-коду,
  не пересуживать); kill-switch `ORCH_STAGING_INFRA_TOLERANCE_ENABLED=false`/`--strict`.
- `staging_status:` строго `SUCCESS`|`FAILED` (UPPERCASE) — единственный машинный ключ
  `check_staging_status`.
- Merge `15-staging-log.md` в `main` (commit+push).
- Стадия `deploy`: контракт `deploy_status: SUCCESS|FAILED` (читает только `check_deploy_status`).
- **Идемпотентный merge-guard (ORCH-065):** перед (повторным) merge feature-PR в `main`
  консультировать `merge_gate.pr_already_merged(repo, branch)`; MERGED=1 → не мержить повторно
  (no-op), MERGED=0 → мержить; guard never-raise.
- **Self-hosting (`orchestrator`):** ты НЕ деплоишь себя; Phase A/B/C оркестрируются кодом
  (`stage_engine`/`self_deploy`); НИКОГДА не запускать `docker compose up -d orchestrator` /
  `--build` / рестарт 8500 изнутри; `deploy_status: SUCCESS` = реальный host health-ok.
- Non-self репо (enduro): прежний синхронный ssh-деплой через
  `scripts/orchestrator-deploy-hook.sh`.
- Общие правила: всегда машинный YAML-frontmatter (гейты парсят только frontmatter); никогда
  push в `main` напрямую; не менять `.env`/`.env.staging`/`docker-compose.yml`/прод-инфру.

### FR-7 — Валидность frontmatter промптов (NFR-3)

YAML-frontmatter каждого `.openclaw/agents/*.md` остаётся валидным YAML, сохраняет
`name`==роль и непустой `description`, и НЕ содержит ключа `model:`
(`tests/test_agent_frontmatter_no_model.py` остаётся зелёным).

## 4. Изменения API

Нет. Эндпоинты не добавляются/не меняются.

## 5. Изменения схемы БД

Нет. Миграции/таблицы/индексы не трогаются.

## 6. Требования к новым/изменённым QG checks

Нет. `QG_CHECKS`, `check_*`, `_parse_*`, `STAGE_TRANSITIONS` — без изменений.
`frontmatter_validation_strict` остаётся `False` (warning-only) — hard-fail НЕ включается.

## 7. Совместимость / регресс

- **Обратная совместимость гейтов:** схема эмитится аддитивно; machine-verdict ключи (имя,
  регистр) неизменны → все 5 вердикт-парсеров читают как раньше (NFR-1).
- **Без kill-switch:** изменение чисто текстовое (промпты + доки); поведение кода идентично.
- **Обратимость:** `git revert` PR; нет миграций/состояния.
- **Тесты:** добавляются структурные тесты промптов (присутствие 5 XML-секций; присутствие
  инструкции по 6 полям схемы; присутствие сохранённых machine-verdict ключей и ключевых
  маркеров анти-регресса). Существующий `test_agent_frontmatter_no_model.py` остаётся зелёным;
  полный `pytest tests/ -q` — зелёный.
- **A/B (BR-6):** на ≥1 репрезентативной стадии сравнить выход старого vs нового промпта;
  критерий — новый не увеличивает число циклов `REQUEST_CHANGES` и не теряет содержания
  артефакта. Метод фиксирует архитектор/исполнитель (напр. прогон одной стадии в staging /
  ручное сравнение артефактов на эталонной задаче).
