17 KiB
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 |
01 — BRD (бизнес-требования): ORCH-092 — Промпт-аудит 6 агентов (расхардкод дат/модели, сверка гейтов, escalation, чистка мёртвых инструкций)
Work Item: ORCH-092 · Repo: orchestrator · Стадия: analysis
1. Бизнес-контекст и проблема
ORCH-092 — эпилог эпика ORCH-52 (канонизация системных промптов). После слоёв 52d
(XML-канон) и 52e (трассировка маркеров) системный аудит 6 промптов (.openclaw/agents/*.md)
выявил класс системных дефектов, способных приводить к дрейфу и багам в self-hosting-конвейере:
- Хардкод даты в примерах. Во всех 6 промптах пример frontmatter содержит жёсткое
created_at: 2026-06-09. Исполняющая модель — литеральный Opus 4.8: пример сильнее инструкции «текущая дата». Риск — модель копирует дату буквально → все документы всех задач получают одну и ту же дату, метаданные перестают отражать реальность. - Хардкод модели в примерах. Пример несёт
model_used: claude-opus-4-8. Если включат model-routing (ORCH-41), промпты начнут врать про использованную модель — ровно та боль, которую слой 52f чинил для README «Известные ограничения». - Несверённые имена гейтов. Промпты называют имена QG-функций (
check_*); при дрейфе кода имя в промпте может разойтись с реальным реестромQG_CHECKS. (Сверка кодом в рамках анализа показала: текущие имена корректны — см. §6, допущение A-1; задача — закрепить сверку как воспроизводимую проверку, а не «починить несуществующий баг».) - Логические нестыковки в developer.md. Инструкция «PR > 1500 строк → разбивай на меньшие
PR» физически невыполнима: конвейер = 1 задача = 1 ветка = 1 PR, разбить внутри стадии
нельзя. Инструкция
git rebase origin/mainв начале алгоритма дублирует/конфликтует с автоматикой движка (serial-gate ORCH-088 режет ветку от свежегоorigin/main;auto_rebase_onto_mainORCH-026 делает pre-merge rebase сам). - Размазанная эскалация. Секцию
<escalation>имеет толькоarchitect.md. У developer / reviewer / tester маршруты эскалации (негодное ТЗ, FAIL, REQUEST_CHANGES) растворены в<constraints>— нет единой видной точки «куда эскалировать при затыке». - Консистентность/качество.
deployer.md(самый большой, ~9.6 KB, на английском) рискует «утопить» критичный self-hosting-запрет «НЕ рестартить 8500».tester.md(самый бедный, ~4.7 KB) не фиксирует worktree-путь (были гонки checkout), не проверяет serial_gate-блок и не требует покрытия ТЗ.reviewer.mdсодержит мёртвую инструкцию про «тот же экземпляр Developer» (в конвейере reviewer всегда отдельный agent-run).
Это docs/prompts-only задача. Код (src/**, STAGE_TRANSITIONS, QG_CHECKS, схема БД)
не трогается. Промпт cat-ается из worktree в момент запуска агента, поэтому новые
промпты вступают в силу на следующем worktree от main без рестарта прод-контейнера —
что критично для self-hosting (рестарт 8500 встаёт конвейер всех проектов).
2. Объём (scope)
В объёме
- Правка 6 промптов
.openclaw/agents/{analyst,architect,developer,reviewer,tester,deployer}.md: расхардкод даты (P0-1) и модели (P0-2) в копируемых примерах; сверка имён гейтов (P0-3); переформулировка «PR>1500» в эскалацию (P1-1); добавление<escalation>в developer/reviewer/ tester (P1-3); рамка критичных запретов в deployer (P2-1); обогащение tester (P2-3); удаление мёртвой инструкции reviewer (P2-4). - Решения, требующие архитектора (формализованы как открытые в §6, решаются в
06-adr/): P1-2 (нужен ли ручной rebase у developer при наличной автоматике), P2-2 (язык deployer: унификация en→ru ИЛИ явно зафиксированное исключение). - Обновление обзорной документации:
CLAUDE.md,docs/architecture/README.md(при необходимости),CHANGELOG.md, ADR work item, и новые/обновлённые структурные тестыtests/test_agent_prompts_canon.py(анти-регресс новых инвариантов).
Вне объёма
- ❌ Любая правка
src/**,STAGE_TRANSITIONS,QG_CHECKS,check_*, схемы БД. - ❌ Изменение машинных verdict-ключей (
verdict:/result:/staging_status:/deploy_status:/security_status:) — байт-в-байт неприкосновенны. - ❌ Слом XML-канона 52d (5 обязательных секций в нормативном порядке), 52c-схемы (6 полей), правила трассировки 52e.
- ❌ Включение enforcement frontmatter (
frontmatter_validation_strictостаётсяFalse). - ❌ Артефакты других work item.
3. Заинтересованные стороны
- Заказчик / приёмка: Owner (Слава) — BRD-гейт ручной; решения по P1-2/P2-2.
- Затрагиваются: все 6 ролей конвейера (исполняют обновлённые промпты), все проекты в общем инстансе (self-hosting), сопровождающие агенты.
- Принимает архитектурные развилки: архитектор (стадия architecture,
06-adr/).
4. Бизнес-требования (BR)
- BR-1 (P0-1) — В копируемых примерах frontmatter всех 6 промптов
created_at— плейсхолдер<YYYY-MM-DD>(НЕ конкретная дата), сопровождённый явной инструкцией: подставить фактическую текущую дату (date +%F), НЕ копировать из примера буквально. - BR-2 (P0-2) — В копируемых примерах всех 6 промптов
model_used— плейсхолдер/резолв (<resolve ORCH-41>, НЕ литеральныйclaude-opus-4-8), с оговоркой подставить фактическую модель из конфига. Факт «сейчасclaude-opus-4-8» допускается как справка вне копируемого блока (например в таблице полей), но не как литерал в примере. - BR-3 (P0-3) — Все имена гейтов/QG-функций, упомянутые в промптах, сверены с реальным
реестром
QG_CHECKS(src/qg/checks.py). Реальные несовпадения (если бы нашлись) исправлены; ложные подозрения не трогаются (check_tests_passedверен). Сверка закреплена воспроизводимым тестом. - BR-4 (P1-1) — Инструкция developer «PR > 1500 строк → разбивай на меньшие PR» заменена на эскалацию: PR слишком большой → флагировать/эскалировать (задача слишком крупная, нужна декомпозиция на уровне задач, не PR).
- BR-5 (P1-3) — developer / reviewer / tester получают явную секцию
<escalation>с чёткими маршрутами: developer →back-to:analysisпри негодном ТЗ; tester →back-to:devпри FAIL; reviewer →REQUEST_CHANGES. (Существующая<escalation>у architect — эталон формата.) - BR-6 (P2-1) — Критичные self-hosting-запреты deployer (прежде всего «НЕ рестартить прод 8500») вынесены в видную рамку в начале промпта, чтобы не утонуть в объёме.
- BR-7 (P2-3) — tester обогащён: явный worktree-путь (ветка vs
/repos— устранить гонки checkout); smoke добавляет проверку блокаserial_gateв/queue(ORCH-088);success_criteriaупоминает покрытие ТЗ (каждый TC из04-test-plan.yaml), не только «файл записан». - BR-8 (P2-4) — Мёртвая инструкция reviewer «не апрувь PR от того же экземпляра Developer» удалена (защита от несуществующего кейса — reviewer всегда отдельный agent-run), при сохранении всех живых инвариантов оси документации.
- BR-9 (P1-2, решение архитектора) — Зафиксировать в ADR: должен ли developer выполнять
ручной
git rebase origin/main, или это полностью делает движок (serial-gate + auto_rebase). Промпт приводится в соответствие с принятым решением (убрать/смягчить/оставить с пояснением). - BR-10 (P2-2, решение архитектора) — Зафиксировать в ADR язык deployer: унифицировать (en→ru) ЛИБО явно задокументировать исключение («deployer — en, т.к. критичные команды/ контракты на en»). При любом исходе machine-verdict ключи и shell-команды не ломаются.
- BR-11 (документация) — Обновлены
CLAUDE.md/README/ ADR /CHANGELOG.md(golden source = код); добавлены/обновлены структурные тесты анти-регресса новых инвариантов.
5. Нефункциональные требования (NFR)
- NFR-1 (анти-регресс, критично) — verdict-ключи
verdict:/result:/staging_status:/deploy_status:/security_status:сохраняются байт-в-байт (имя/регистр/значения); XML-канон 52d (5 секций, нормативный порядок), 52c-схема (6 полей), правило трассировки 52e — сохранены.tests/test_agent_prompts_canon.pyиtests/test_agent_frontmatter_no_model.py— зелёные. - NFR-2 (self-hosting безопасность) — Изменение docs/prompts-only:
src/**не тронут, прод-контейнер 8500 не перезапускается. Новые промпты применяются на следующем worktree отmainбез прод-рестарта. - NFR-3 (обратимость) — Все правки текстовые и ревертируемы одним PR; нет миграций, нет изменения схемы/состояния.
- NFR-4 (консистентность канона) — Все правки соблюдают канон Anthropic (запреты «❌ X →
✅ Y», секции в нормативном порядке); новая секция
<escalation>размещается так, чтобы не нарушать порядок 5 обязательных секций (после</output_format>, как у architect). - NFR-5 (отсутствие enforcement) —
frontmatter_validation_strictостаётсяFalse; плейсхолдеры в примерах не вызывают hard-fail валидатора (warning-only).
6. Допущения и ограничения
- A-1 (сверено кодом): реестр
QG_CHECKS(src/qg/checks.py) содержит:check_analysis_complete,check_analysis_approved,check_architecture_done,check_ci_green,check_review_approved,check_tests_passed,check_reviewer_verdict,check_deploy_status,check_staging_status,check_branch_mergeable,check_security_gate,check_staging_image_fresh(+check_tests_local— DEPRECATED). Имена гейтов в промптах (check_ci_green,check_reviewer_verdict,check_tests_passed,check_deploy_status,check_staging_status,check_security_gate) совпадают. Реальных несовпадений на момент анализа НЕТ → BR-3 = «закрепить сверку», а не «исправить». - A-2 (сверено кодом, основание для BR-9):
auto_rebase_onto_main(src/merge_gate.py) вызывается автоматически вcheck_branch_mergeable(src/qg/checks.py) приpremerge_rebase_always=True(дефолт), а serial-gate (ORCH-088) откладывает срез ветки на свежийorigin/main. Ручной rebase developer пересекается с этой автоматикой → требует решения архитектора (не менять вслепую). - A-3: Канон-тест проверяет наличие имён полей
created_at/model_usedи литеральные строкиauthor_agent: <role>/stage: <stage>в примере — плейсхолдеры даты/модели этого не нарушают. Ни один тест не утверждает литералclaude-opus-4-8внутри промптов. - Ограничение: P1-2 и P2-2 — зона архитектора; analyst фиксирует факты и требование-решение, но НЕ принимает решение и НЕ правит вслепую.
7. Критерии успеха
Аудит-правки внесены во все 6 промптов согласно BR-1…BR-8; архитектурные развилки BR-9/BR-10
решены в ADR и отражены в промптах; документация и анти-регресс-тесты обновлены (BR-11);
анти-регресс NFR-1 соблюдён (verdict-ключи и канон не сломаны, целевые тесты зелёные).
Детальные PASS/FAIL — 03-acceptance-criteria.md.
8. Риски
- Случайный слом verdict-ключа/канона при массовой текстовой правке → митигируется структурными тестами (NFR-1).
- Плейсхолдер
<YYYY-MM-DD>/<resolve ORCH-41>сам по себе мог бы быть скопирован буквально — митигируется явной инструкцией «подставь фактическое, НЕ копируй». - Принятие архитектурного решения (P1-2/P2-2) не аналитиком — митигируется явным выносом в
06-adr/. - Детальная карта рисков —
10-tech-risks.md(заполняет архитектор).