228 lines
19 KiB
Markdown
228 lines
19 KiB
Markdown
# 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 /
|
||
ручное сравнение артефактов на эталонной задаче).
|