From bc5d5509653fb3f7a6263ca5d641e62ce9949198 Mon Sep 17 00:00:00 2001 From: claude-bot Date: Mon, 15 Jun 2026 23:17:18 +0300 Subject: [PATCH] analyst(ET): auto-commit from analyst run_id=724 --- docs/work-items/ORCH-118/01-brd.md | 92 ++++++++++--------- docs/work-items/ORCH-118/02-trz.md | 57 +++++++----- .../ORCH-118/03-acceptance-criteria.md | 48 +++++----- docs/work-items/ORCH-118/04-test-plan.yaml | 14 +-- 4 files changed, 119 insertions(+), 92 deletions(-) diff --git a/docs/work-items/ORCH-118/01-brd.md b/docs/work-items/ORCH-118/01-brd.md index 13dc8ca..5d5206d 100644 --- a/docs/work-items/ORCH-118/01-brd.md +++ b/docs/work-items/ORCH-118/01-brd.md @@ -14,26 +14,22 @@ Work Item: **ORCH-118** · Repo: **orchestrator** · Стадия: analysis > ⚠️ **Inventory-first.** Это **зонтичная inventory/architecture-задача**, а НЕ реализация > детерминированных раннеров. Её результат — **карта** всех мест вызова LLM + классификация + > упорядоченный roadmap + нормативная политика использования LLM, защищённая структурными тестами. -> Реализация конкретных замен (deployer — **ORCH-115**, tester — **ORCH-116** и др.) — **последующие -> задачи**, запускаемые ПОСЛЕ утверждения карты. Их код в ORCH-118 **не вносится** (см. §2 «Вне объёма»). +> Реализация конкретных замен — **последующие задачи**, запускаемые ПОСЛЕ утверждения карты. Их код +> в ORCH-118 **не вносится** (см. §2 «Вне объёма»). -> 📌 **Канонический маппинг follow-up'ов (источник истины — live Plane backlog).** Во всех -> артефактах ORCH-118 ID привязаны к ролям строго так — НЕ путать порядок: -> -> | Follow-up | Роль-кандидат | Класс замены (ожидаемый) | -> |-----------|---------------|--------------------------| -> | **ORCH-115** | **deployer** (детерминированный деплой/staging) | `replace-deterministic-now` / `replace-later-risky` | -> | **ORCH-116** | **tester** (детерминированный `pytest`+smoke) | `needs-hybrid-fallback` | -> -> Этот маппинг — нормативный для всего пакета (BRD/TRZ/AC/test-plan и будущего roadmap/ADR); -> анти-дрейф маппинга закреплён тест-кейсом **TC-11** (`04-test-plan.yaml`). Расхождение роль↔ID с -> этой таблицей = баг маршрутизации follow-up'ов (P1). +> 📌 **Follow-up'ы именуются по РОЛИ, без выдуманных Plane-ID.** Roadmap рекомендует отдельные +> follow-up задачи по ролям-кандидатам (**deployer-замена**, **tester-гибрид** и т.д.). Конкретные +> Plane-ID этих задач в артефактах ORCH-118 **НЕ фиксируются** — они присваиваются при фактическом +> заведении задач в backlog. Аналитик не имеет доказательного источника на конкретные ID и не должен +> их выдумывать (см. NFR-6). -> 🔁 **Revision R2 (2026-06-15).** Исправлен P1-блокер ревью: в R1 маппинг ORCH-115/ORCH-116 был -> **реверснут** (tester→115, deployer→116). Приведено к live backlog: **ORCH-115 = deployer**, -> **ORCH-116 = tester** во всех местах BRD/TRZ; добавлены канонический-маппинг-callout и анти-дрейф -> TC-11. Содержательная классификация ролей (deployer = replace-now, tester = hybrid) не менялась — -> сменились только привязанные ID. +> 🔁 **Revision R3 (2026-06-15).** Из пакета **удалена** нормативная привязка follow-up'ов к +> конкретным ID `ORCH-115`/`ORCH-116` (этих work item нет ни в репозитории, ни в подтверждённом +> backlog — claim «источник истины: live Plane backlog» был **непроверяемым**). Вместе с ней удалены +> навязывавший её структурный тест (бывш. TC-11) и отдельный критерий приёмки (бывш. AC-9). Follow-up'ы +> теперь описаны **по роли**, ID — TBD. Содержательная классификация ролей не менялась +> (deployer = кандидат на детерминированную замену, tester = кандидат на hybrid-fallback). +> *(R1→R2 ранее «чинил» порядок этих ID; R3 убирает корень проблемы — фиксацию несуществующих ID.)* --- @@ -47,8 +43,8 @@ Work Item: **ORCH-118** · Repo: **orchestrator** · Стадия: analysis Установленный факт по текущему коду (инвентаризация — §1 TRZ, артефакт-карта): - В оркестраторе **ровно одна точка запуска LLM** — `src/agents/launcher.py::_spawn` (одна - `subprocess.Popen` сборка Claude CLI), которой пользуются **6 ролей-агентов** (analyst, architect, - developer, reviewer, tester, deployer). + `subprocess.Popen` сборка Claude CLI: `CLAUDE_BIN --print … --system-prompt "$(cat …)"`), которой + пользуются **6 ролей-агентов** (analyst, architect, developer, reviewer, tester, deployer). - **Все остальные control-path'ы уже детерминированы (без LLM):** маршрутизация стадий (`STAGE_TRANSITIONS`/`advance_stage`), все Quality Gate'ы и под-гейты (`check_*`, security/merge/ coverage/image-freshness), парсеры вердиктов (`_parse_*` через `frontmatter.py`), классификатор @@ -66,8 +62,8 @@ Work Item: **ORCH-118** · Repo: **orchestrator** · Стадия: analysis сохраниться. ORCH-118 даёт **доказательную карту** «где LLM действительно нужен, а где это удобство» и -**упорядоченный план** безопасных замен — фундамент, на котором ORCH-115/116 (и возможные следующие -срезы) выполняются предсказуемо и без регресса. +**упорядоченный план** безопасных замен — фундамент, на котором последующие срезы (по ролям-кандидатам) +выполняются предсказуемо и без регресса. ## 2. Объём (scope) @@ -78,17 +74,21 @@ ORCH-118 даёт **доказательную карту** «где LLM дей - **BR-3** Доказательное подтверждение (с привязкой `file:line`), что не-агентские control-path'ы (маршрутизация / ретраи / QG / парсеры / finalizer'ы) уже детерминированы. - **BR-4** Упорядоченный roadmap замен: зависимости, оценка экономии токенов/времени, риски - безопасности, потребность в hybrid-fallback, рекомендованный **первый срез**. + безопасности, потребность в hybrid-fallback, рекомендованный **первый срез** — кандидаты названы + **по роли** (follow-up ID — TBD). - **BR-5** Нормативная **политика использования LLM** («LLM — только там, где нужно настоящее суждение») как durable-документ. - **BR-6** Структурные regression-тесты, **прибивающие инварианты карты к коду** (единственная точка - запуска; детерминированные модули не несут запуска LLM; карта покрывает все промпты) — анти-дрейф. -- **BR-7** Явно позиционировать **ORCH-115 (deployer)** и **ORCH-116 (tester)** как **кандидаты-follow-up** - (канонический маппинг — врезка выше). + запуска; детерминированные модули не несут запуска LLM; карта покрывает все промпты; тотальность + классификации) — анти-дрейф. +- **BR-7** Явно позиционировать **роль deployer** и **роль tester** как **кандидаты-follow-up** для + детерминированной замены — **по роли, без привязки к конкретным Plane-ID** (см. NFR-6). ### Вне объёма -- ❌ **Реализация** детерминированных раннеров deployer (ORCH-115) / tester (ORCH-116) и любых других замен — - это отдельные задачи ПОСЛЕ утверждения карты (явное требование заказчика в business request). +- ❌ **Реализация** детерминированных раннеров deployer / tester и любых других замен — это отдельные + follow-up задачи ПОСЛЕ утверждения карты (явное требование заказчика в business request). +- ❌ **Выдумывание/фиксация конкретных follow-up Plane-ID** (напр. `ORCH-115`/`ORCH-116`) в любых + артефактах ORCH-118 — ID присваиваются при заведении задач (NFR-6). - ❌ Изменение `STAGE_TRANSITIONS` / реестра `QG_CHECKS` / семантики и имён `check_*` / machine-verdict-ключей (`verdict:`/`result:`/`staging_status:`/`deploy_status:`/`security_status:`/ `coverage_status:`) / схемы БД. @@ -102,7 +102,7 @@ ORCH-118 даёт **доказательную карту** «где LLM дей - **Сопровождающие платформы (self-hosting)** — выигрывают в стабильности, скорости, экономии токенов. - **Downstream-проекты (enduro-trails)** — делят общий прод/очередь; для них требуется **нулевая регрессия** (NFR-1). -- **Будущие исполнители ORCH-115/116/…** — потребители карты, roadmap и политики. +- **Будущие исполнители follow-up'ов** — потребители карты, roadmap и политики. ## 4. Бизнес-требования (BR) @@ -120,20 +120,22 @@ ORCH-118 даёт **доказательную карту** «где LLM дей зафиксировать, что маршрутизация стадий, ретраи, QG-проверки, парсеры вердиктов и finalizer'ы **не вызывают LLM**. Если инвентаризация найдёт неожиданный LLM-путь — он попадает в карту и классификацию. -- **BR-4 — Упорядоченный roadmap.** Ранжированный план замен: для каждого кандидата — зависимости, - **оценка** экономии токенов/времени (из телеметрии `agent_runs`), риск безопасности, нужен ли - hybrid-fallback, ожидание kill-switch/обратимости, привязка к follow-up work item. Явно указать - **рекомендованный первый срез** и обоснование выбора. +- **BR-4 — Упорядоченный roadmap.** Ранжированный план замен: для каждого кандидата (названного **по + роли**) — зависимости, **оценка** экономии токенов/времени (из телеметрии `agent_runs`), риск + безопасности, нужен ли hybrid-fallback, ожидание kill-switch/обратимости. Явно указать + **рекомендованный первый срез** и обоснование выбора. Привязка к follow-up задаче — **по роли**; + конкретный Plane-ID НЕ фиксируется (заводится отдельно, NFR-6). - **BR-5 — Политика использования LLM.** Нормативный durable-документ: «LLM — только там, где требуется настоящее суждение»; критерии решения keep vs replace; требование к новым/изменённым control-path'ам обосновывать любое использование LLM против этой политики. - **BR-6 — Анти-дрейф структурными тестами.** Тесты, привязывающие инварианты карты к коду: единственная точка запуска LLM; перечисленные детерминированные модули/job-роли не несут запуска; карта перечисляет ровно те 6 промптов, что лежат в `.openclaw/agents/`; классификация покрывает все - call-site'ы по одному разу. Тесты — offline (без сети/LLM/subprocess-к-модели). -- **BR-7 — Позиционирование follow-up'ов.** Карта/roadmap явно отмечают **ORCH-115 (deployer)** и - **ORCH-116 (tester)** (канонический маппинг — врезка в шапке) как кандидаты-замены, **не** - реализуемые в ORCH-118; их старт гейтится утверждением карты. + call-site'ы по одному разу. Тесты — offline (без сети/LLM/subprocess-к-модели). **Тест на привязку + к конкретным follow-up ID не вводится** (анти-паттерн: прибивал бы карту к непроверяемым ID, R3). +- **BR-7 — Позиционирование follow-up'ов по роли.** Карта/roadmap явно отмечают **роль deployer** и + **роль tester** как кандидаты-замены, **не** реализуемые в ORCH-118; их старт гейтится утверждением + карты. Привязка — **по роли**, без конкретных Plane-ID (NFR-6). ## 5. Нефункциональные требования (NFR) @@ -150,6 +152,10 @@ ORCH-118 даёт **доказательную карту** «где LLM дей - **NFR-5 — Доказательность экономии.** Цифры экономии берутся из реальной телеметрии `agent_runs` (модель/эффорт/токены/стоимость/время по ролям) и помечаются как **оценки** до фактического замера после реализации. +- **NFR-6 — Только проверяемые ссылки (анти-фабрикация, R3).** В артефактах фиксируются только + ссылки, резолвящиеся в код/документы репозитория. Конкретные **follow-up Plane-ID не выдумываются**: + кандидаты-замены именуются по роли; ID присваивается при заведении задачи. (Это закрывает корень + отклонённой ревизии R2.) ## 6. Допущения и ограничения - Единственный транспорт LLM сейчас — Claude CLI через `launcher._spawn`; прямых вызовов Anthropic API @@ -158,17 +164,21 @@ ORCH-118 даёт **доказательную карту** «где LLM дей - Карта — **снимок на момент задачи**, защищённый структурными тестами от тихого расхождения с кодом. - Прецедент детерминированной замены агента уже существует и работает (`deploy-finalizer`/ `post-deploy-monitor` в `launch_job` до `_spawn`) — это снижает архитектурный риск follow-up'ов. +- На момент анализа конкретные follow-up work item для замены ролей в backlog **не подтверждены** — + поэтому ID не фиксируются (NFR-6). ## 7. Критерии успеха Карта call-site'ов полна и привязана к коду; каждый site классифицирован с обоснованием; детерминизм не-агентских путей доказан; есть упорядоченный roadmap с зависимостями/экономией/рисками и -рекомендованным первым срезом; есть нормативная политика; структурные тесты зелёные и осмысленные; -ни один рантайм-инвариант не тронут; ORCH-115/116 НЕ реализованы. Детальные PASS/FAIL — в -`03-acceptance-criteria.md`. +рекомендованным первым срезом (кандидаты — по роли); есть нормативная политика; структурные тесты +зелёные и осмысленные; ни один рантайм-инвариант не тронут; раннеры замен НЕ реализованы; ни один +артефакт не фиксирует непроверяемых follow-up ID. Детальные PASS/FAIL — в `03-acceptance-criteria.md`. ## 8. Риски - **Недо-/пере-классификация** (LLM убран там, где нужно суждение, или сохранён там, где не нужен) → митигирует требование «назвать конкретное суждение» для `keep-LLM` и ревью карты. - **Дрейф карты** относительно кода со временем → митигируют структурные тесты (BR-6). - **Преждевременная замена** в погоне за экономией ценой автономности/гибкости → инвентаризация - отделена от реализации; первый срез — самый низкорисковый. Детали — `10-tech-risks.md` (архитектор). + отделена от реализации; первый срез — самый низкорисковый. +- **Фабрикация ссылок/ID** (рецидив дефекта R2) → митигирует NFR-6 (только проверяемые ссылки; + follow-up'ы — по роли) и ревью. Детали техн.рисков — `10-tech-risks.md` (архитектор). diff --git a/docs/work-items/ORCH-118/02-trz.md b/docs/work-items/ORCH-118/02-trz.md index 3b7c12c..f0d00d5 100644 --- a/docs/work-items/ORCH-118/02-trz.md +++ b/docs/work-items/ORCH-118/02-trz.md @@ -16,8 +16,12 @@ Work Item: **ORCH-118** · Repo: **orchestrator** · Стадия: analysis > схема структурных тестов) — решает архитектор в `06-adr/`. ТЗ фиксирует требования и границы. > > ⚠️ **Скоуп — inventory + классификация + roadmap + политика + структурные тесты.** Реализация -> детерминированных раннеров (ORCH-115/116) — **вне скоупа** (FR-7). Это **docs + tests only**: -> `src/**`-рантайм не меняется. +> детерминированных раннеров — **вне скоупа** (FR-7). Это **docs + tests only**: `src/**`-рантайм не +> меняется. +> +> 📌 **Follow-up'ы — по роли, без выдуманных Plane-ID** (R3, NFR-6). Конкретные ID (напр. +> `ORCH-115`/`ORCH-116`) в артефактах **не фиксируются** — этих work item нет в репо/подтверждённом +> backlog; ID присваивается при заведении задачи. --- @@ -29,19 +33,19 @@ Work Item: **ORCH-118** · Repo: **orchestrator** · Стадия: analysis рантайм-контракты (`STAGE_TRANSITIONS` / `QG_CHECKS` / `check_*` / machine-verdict-ключи / схема БД) — **не меняются**. -Опорный факт инвентаризации (ground-truth кода на момент задачи): +Опорный факт инвентаризации (ground-truth кода на момент задачи; line-привязки уточняет карта): | # | Call-site (LLM-capable) | Где | Что делает | |---|--------------------------|-----|------------| -| S0 | **Единственная точка запуска** | `src/agents/launcher.py::_spawn` (сборка Claude CLI + `subprocess.Popen`) | запускает любую из 6 ролей | +| S0 | **Единственная точка запуска** | `src/agents/launcher.py::_spawn` (сборка `CLAUDE_BIN --print … --system-prompt "$(cat …)"` + `subprocess.Popen`) | запускает любую из 6 ролей | | A1 | analyst | промпт `.openclaw/agents/analyst.md`, стадия `analysis` | анализ бизнес-запроса → 01–04 | | A2 | architect | `.openclaw/agents/architect.md`, стадия `architecture` | архитектурные решения → 06-adr | | A3 | developer | `.openclaw/agents/developer.md`, стадия `development` | реализация + PR | | A4 | reviewer | `.openclaw/agents/reviewer.md`, стадия `review` | ревью → `12-review.md` (`verdict:`) | | A5 | tester | `.openclaw/agents/tester.md`, стадия `testing` | `pytest`+smoke → `13-test-report.md` (`result:`) | | A6 | deployer | `.openclaw/agents/deployer.md`, стадии `deploy-staging`/`deploy` | `staging_check.py`/exit-code → `15`/`14` логи | -| D1 | deploy-finalizer | `launch_job` перехват **до** `_spawn` | детерминированный (LLM не запускается) | -| D2 | post-deploy-monitor | `launch_job` перехват **до** `_spawn` | детерминированный (LLM не запускается) | +| D1 | deploy-finalizer | `launch_job` перехват **до** `_spawn` (`launcher.launch_job`) | детерминированный (LLM не запускается) | +| D2 | post-deploy-monitor | `launch_job` перехват **до** `_spawn` (`launcher.launch_job`) | детерминированный (LLM не запускается) | > Не-агентские control-path'ы (маршрутизация `advance_stage`, `QG_CHECKS`/`check_*`/`_parse_*`, > `error_classifier`, `serial_gate`/`merge_gate`/`coverage_gate`/`security_gate`/`staging_verdict`/ @@ -87,15 +91,14 @@ Work Item: **ORCH-118** · Repo: **orchestrator** · Стадия: analysis Каждому call-site присвоен **ровно один** класс. Ожидаемое (из инвентаризации; финальное решение фиксирует архитектор в ADR): `analyst/architect/developer/reviewer → keep-LLM`; `deployer → replace-deterministic-now` или `replace-later/risky` (staging = exit-code-маппинг; прод -self-hosting уже детерминирован Phase A/B/C) — кандидат **ORCH-115**; `tester → needs-hybrid-fallback` -(детерминированный прогон `pytest`+smoke, LLM-суждение только на маппинг TC↔критерии / триаж падений) -— кандидат **ORCH-116**; `deploy-finalizer/post-deploy-monitor → already-deterministic` (вне -таксономии замен, как эталон). +self-hosting уже детерминирован Phase A/B/C) — **кандидат-замена по роли deployer**; +`tester → needs-hybrid-fallback` (детерминированный прогон `pytest`+smoke, LLM-суждение только на +маппинг TC↔критерии / триаж падений) — **кандидат-замена по роли tester**; +`deploy-finalizer/post-deploy-monitor → already-deterministic` (вне таксономии замен, как эталон). -> 📌 **Канонический маппинг (источник — live Plane backlog, нормативно для всего пакета):** -> **ORCH-115 = deployer** (`replace-deterministic-now`/`replace-later-risky`), **ORCH-116 = tester** -> (`needs-hybrid-fallback`). НЕ путать порядок; анти-дрейф — TC-11 (`04-test-plan.yaml`). -> *(Revision R2: в R1 маппинг был реверснут — исправлено; содержательные классы ролей не менялись.)* +> 📌 **Follow-up'ы — по роли, без Plane-ID (R3, NFR-6).** Кандидаты обозначаются ролью +> (deployer-замена, tester-гибрid), а не конкретными ID. Привязка к будущему work item делается при +> заведении задачи; ORCH-118 ID не выдумывает. ### FR-3 — Подтверждение детерминизма не-агентских путей (BR-3) Карта отдельным разделом фиксирует, с `file:line`-доказательством, что НЕ вызывают LLM: @@ -106,10 +109,11 @@ transition-lease. Любой найденный неожиданный LLM-пу классифицируется (FR-2). ### FR-4 — Упорядоченный roadmap замен (BR-4) -Ранжированный список кандидатов; для каждого: зависимости (предпосылки/блокеры), **оценка** экономии -токенов/времени (из `agent_runs`), риск безопасности, нужен ли hybrid-fallback, ожидание -kill-switch/обратимости, привязка к follow-up work item (ORCH-115/116/…). Явно: **рекомендованный -первый срез** + обоснование (самый низкорисковый, опирающийся на существующий прецедент D1/D2). +Ранжированный список кандидатов (названных **по роли**); для каждого: зависимости (предпосылки/блокеры), +**оценка** экономии токенов/времени (из `agent_runs`), риск безопасности, нужен ли hybrid-fallback, +ожидание kill-switch/обратимости, и **тип будущей follow-up задачи по роли** (без конкретного +Plane-ID — заводится отдельно, NFR-6). Явно: **рекомендованный первый срез** + обоснование (самый +низкорисковый, опирающийся на существующий прецедент D1/D2). ### FR-5 — Политика использования LLM (BR-5) Нормативный durable-документ: принцип «LLM — только где нужно настоящее суждение»; критерии решения @@ -129,12 +133,15 @@ keep vs replace (детерминируемость выхода, наличие без дублей/пропусков). - **(e)** `D1/D2` действительно перехватываются в `launch_job` **до** `_spawn` (детерминированы). -### FR-7 — Скоуп-гард + канонический маппинг (BR-7) -ORCH-115/116 (и любые другие замены) **не реализуются** в ORCH-118. Карта/roadmap явно помечают их -как кандидаты-follow-up, старт которых гейтится утверждением карты. Тест/диф не должны содержать новых -детерминированных раннеров tester/deployer. **Маппинг роль↔ID — нормативный (источник: live Plane -backlog): ORCH-115 = deployer, ORCH-116 = tester** — одинаков во всех артефактах карты/roadmap/ADR; -анти-дрейф маппинга — структурный тест TC-11 (реверс делает тест красным). +> ❌ **Не вводить** тест, прибивающий карту к конкретным follow-up Plane-ID → ✅ тесты проверяют +> только инварианты, резолвящиеся в код/файлы репозитория (R3, NFR-6). Привязка к несуществующим ID +> была корнем отклонённой R2. + +### FR-7 — Скоуп-гард (BR-7) +Раннеры замен **не реализуются** в ORCH-118. Карта/roadmap явно помечают кандидатов **по роли** +(deployer-замена, tester-гибрid) как follow-up, старт которых гейтится утверждением карты. Тест/диф не +должны содержать новых детерминированных раннеров tester/deployer. **Конкретные follow-up Plane-ID не +фиксируются** ни в одном артефакте (NFR-6). ## 4. Изменения API Нет. (Опциональная read-only наблюдаемость в `GET /queue`/`GET /metrics` — **вне скоупа** ORCH-118; @@ -156,4 +163,6 @@ FR-6 — обычные `pytest`-тесты, **не** Quality Gate и **не** - **Анти-дрейф:** структурные тесты держат карту синхронной с кодом; норматив сопровождения — «менял места вызова LLM → обнови карту и политику в том же PR» (фиксируется в политике и golden-source docs). +- **Анти-фабрикация (R3):** артефакты фиксируют только проверяемые ссылки; follow-up'ы — по роли, + без выдуманных Plane-ID (NFR-6). - **Self-hosting:** не деплоит/не рестартит прод/не трогает `main` — безопасно для общего инстанса. diff --git a/docs/work-items/ORCH-118/03-acceptance-criteria.md b/docs/work-items/ORCH-118/03-acceptance-criteria.md index d589618..be53611 100644 --- a/docs/work-items/ORCH-118/03-acceptance-criteria.md +++ b/docs/work-items/ORCH-118/03-acceptance-criteria.md @@ -13,8 +13,8 @@ Work Item: **ORCH-118** · Repo: **orchestrator** · Стадия: analysis Формат: каждый критерий имеет **PASS** (что должно быть истинно для приёмки) и **FAIL** (что считается провалом). Reviewer/тестер проверяет их буквально по файлам репозитория. Напоминание: ORCH-118 — -**inventory-first**, docs+tests only; реализация раннеров (ORCH-115/116) приёмкой **запрещена** в этой -задаче (AC-7). +**inventory-first**, docs+tests only; реализация раннеров приёмкой **запрещена** в этой задаче (AC-7); +фиксация конкретных follow-up Plane-ID **запрещена** (AC-9, R3). --- @@ -57,12 +57,14 @@ Work Item: **ORCH-118** · Repo: **orchestrator** · Стадия: analysis ## AC-4 — Упорядоченный roadmap с обязательными атрибутами и первым срезом **Условие:** Есть ранжированный roadmap детерминированных замен. -- **PASS:** Roadmap упорядочен; для каждого кандидата указаны зависимости, **оценка** экономии - токенов/времени (со ссылкой на источник — `agent_runs`/`usage`), риск безопасности, потребность в - hybrid-fallback, ожидание kill-switch/обратимости и привязка к follow-up work item; явно назван - **рекомендованный первый срез** с обоснованием. +- **PASS:** Roadmap упорядочен; для каждого кандидата (названного **по роли**) указаны зависимости, + **оценка** экономии токенов/времени (со ссылкой на источник — `agent_runs`/`usage`), риск + безопасности, потребность в hybrid-fallback, ожидание kill-switch/обратимости и **тип follow-up + задачи по роли** (без конкретного Plane-ID); явно назван **рекомендованный первый срез** с + обоснованием. - **FAIL:** Roadmap не упорядочен; у кандидата отсутствует любой обязательный атрибут; оценка экономии - не привязана к источнику; нет рекомендованного первого среза. + не привязана к источнику; нет рекомендованного первого среза; кандидат привязан к выдуманному + Plane-ID (→ см. AC-9). --- @@ -86,7 +88,7 @@ Work Item: **ORCH-118** · Repo: **orchestrator** · Стадия: analysis `D1/D2` в `launch_job` до `_spawn`. Тесты не используют сеть/LLM/subprocess-к-модели. Полный `pytest tests/ -q` — зелёный. - **FAIL:** Тестов нет; тест тривиально проходит (не привязан к коду); любой тест красный; полный - прогон `tests/` падает. + прогон `tests/` падает; введён тест, прибивающий карту к конкретным follow-up Plane-ID (анти-паттерн R3). --- @@ -95,9 +97,9 @@ Work Item: **ORCH-118** · Repo: **orchestrator** · Стадия: analysis **Условие:** ORCH-118 не меняет рантайм и не реализует раннеры. - **PASS:** Диф не меняет `STAGE_TRANSITIONS` / реестр и имена `QG_CHECKS`/`check_*` / machine-verdict-ключи / схему БД; в `src/**` нет нового детерминированного раннера tester/deployer - (ORCH-115/116 не реализованы); изменения ограничены docs + новый(е) тест-файл(ы). + (раннеры замен не реализованы); изменения ограничены docs + новый(е) тест-файл(ы). - **FAIL:** Изменён любой из перечисленных рантайм-контрактов; реализован детерминированный раннер - (фолд ORCH-115/116); правки `src/**`-поведения вне инвентаря/тестов. + замены; правки `src/**`-поведения вне инвентаря/тестов. --- @@ -111,18 +113,22 @@ Work Item: **ORCH-118** · Repo: **orchestrator** · Стадия: analysis --- -## AC-9 — Канонический маппинг follow-up'ов (роль ↔ ID) корректен и пингуется тестом +## AC-9 — Только проверяемые ссылки; follow-up'ы — по роли, без выдуманных ID (анти-фабрикация, R3) -**Условие:** Во всех артефактах привязка роли к follow-up work item совпадает с live Plane backlog. -- **PASS:** Везде, где карта/BRD/TRZ/roadmap/ADR связывают роль с follow-up'ом, выполнено - **ORCH-115 = deployer** и **ORCH-116 = tester**; ни в одном месте нет обратной привязки - (tester→ORCH-115 / deployer→ORCH-116), в т.ч. в позиционных перечислениях вида «tester/deployer - (ORCH-115/116)»; структурный тест **TC-11** проверяет это и краснеет при реверсе. -- **FAIL:** Хотя бы одно место привязывает tester к ORCH-115 или deployer к ORCH-116; маппинг - неоднозначен/противоречив между документами; TC-11 отсутствует или не ловит реверс. +**Условие:** Ни один артефакт не фиксирует непроверяемых follow-up Plane-ID; кандидаты-замены +именуются по роли. +- **PASS:** Везде, где карта/BRD/TRZ/roadmap/ADR упоминают кандидата-замену, он назван **по роли** + (deployer-замена, tester-гибрid); конкретные follow-up Plane-ID **не указаны**; все `file:line`/ + ссылки на документы резолвятся в репозиторий. Тип follow-up'а описан по роли, ID — «TBD / при + заведении задачи». +- **FAIL:** Любой артефакт фиксирует конкретный follow-up Plane-ID (напр. `ORCH-115`/`ORCH-116`) как + нормативную привязку роли; присутствует ссылка/маркер, не резолвящийся в код/документ репозитория; + введён структурный тест, прибивающий карту к конкретному follow-up ID. -> Контекст: это исправление **P1-блокера ревью R1** — в первой ревизии маппинг был реверснут. AC-9 + -> TC-11 закрывают класс ошибки на будущее (анти-дрейф), а не только текущий инцидент. +> Контекст: AC-9 заменяет ранее ошибочный «канонический-маппинг» критерий ревизии R2. Корень +> отклонения R2 — фиксация **несуществующих** ID (`ORCH-115`/`ORCH-116`) как нормативного инварианта +> с непроверяемым источником («live Plane backlog»). R3 запрещает фабрикацию ID и переводит follow-up'ы +> на именование по роли. --- @@ -137,4 +143,4 @@ Work Item: **ORCH-118** · Repo: **orchestrator** · Стадия: analysis | AC-6 | BR-6 / FR-6 | | AC-7 | BR-7 / FR-7 / NFR-1 / NFR-3 | | AC-8 | NFR-4 / правила агентов §2,§6 (golden-source) | -| AC-9 | BR-7 / FR-7 (канонический маппинг роль↔ID; анти-дрейф TC-11) | +| AC-9 | NFR-6 / BR-7 / FR-7 (только проверяемые ссылки; follow-up'ы по роли, без выдуманных ID) | diff --git a/docs/work-items/ORCH-118/04-test-plan.yaml b/docs/work-items/ORCH-118/04-test-plan.yaml index 06cc035..8eb2489 100644 --- a/docs/work-items/ORCH-118/04-test-plan.yaml +++ b/docs/work-items/ORCH-118/04-test-plan.yaml @@ -8,16 +8,18 @@ title: "LLM call-site inventory + classification + roadmap + usage policy (inven framework: pytest scope: > Покрываются СТРУКТУРНЫЕ инварианты карты вызовов LLM и анти-дрейф (FR-6), плюс скоуп-гард - (рантайм-контракты не тронуты, раннеры не реализованы) и анти-дрейф канонического маппинга - follow-up'ов (TC-11). ВНЕ покрытия: реализация детерминированных раннеров deployer (ORCH-115) / - tester (ORCH-116) — отдельные follow-up задачи. + (рантайм-контракты не тронуты, раннеры не реализованы) и анти-фабрикация ссылок/ID (TC-11). + ВНЕ покрытия: реализация детерминированных раннеров deployer / tester — отдельные follow-up + задачи (именуются по роли; конкретные Plane-ID в ORCH-118 не фиксируются, R3/NFR-6). notes: > Все тесты детерминированы и offline: без сети, без запуска LLM, без subprocess-к-модели. Имена файла теста и документов карты — примерные (финально решает архитектор); тест-кейсы привязываются к фактическим путям артефактов, выбранным в 06-adr. Полный регресс tests/ - должен оставаться зелёным (TC-08). Регрессом считается: появление второй точки запуска LLM, + должен оставаться зелёным (TC-10). Регрессом считается: появление второй точки запуска LLM, запуск LLM в детерминированном модуле, дрейф карты относительно .openclaw/agents/, изменение рантайм-контрактов (STAGE_TRANSITIONS / QG_CHECKS / check_* / machine-verdict / схема БД). + R3: тест на привязку follow-up'ов к конкретным Plane-ID УДАЛЁН (бывш. TC-11) как анти-паттерн — + прибивал карту к несуществующим ID; вместо него TC-11 проверяет анти-фабрикацию (ID не выдуманы). tests: - id: TC-01 @@ -58,7 +60,7 @@ tests: - id: TC-07 type: unit - description: "Полнота roadmap: документ roadmap для каждого кандидата содержит обязательные атрибуты (зависимости / оценка экономии со ссылкой на agent_runs / риск / hybrid-need / follow-up work item) и явно называет рекомендованный первый срез (FR-4 / AC-4)" + description: "Полнота roadmap: документ roadmap для каждого кандидата (названного ПО РОЛИ) содержит обязательные атрибуты (зависимости / оценка экономии со ссылкой на agent_runs / риск / hybrid-need / тип follow-up задачи по роли) и явно называет рекомендованный первый срез (FR-4 / AC-4)" module: tests/test_llm_determinization_docs.py expected: PASS @@ -82,6 +84,6 @@ tests: - id: TC-11 type: unit - description: "Анти-дрейф канонического маппинга follow-up'ов (источник — live Plane backlog): в карте/roadmap ORCH-115 привязан к роли deployer, ORCH-116 — к роли tester; реверс роль↔ID (например tester→ORCH-115 / deployer→ORCH-116) делает тест красным. Защищает от P1-блокера ревью R1 (FR-7 / BR-7 / AC-9)" + description: "Анти-фабрикация follow-up ID (R3 / NFR-6 / AC-9): документы карты/roadmap НЕ содержат привязки кандидатов-замен к конкретным follow-up Plane-ID несуществующих work item (паттерн ORCH-1\\d\\d, не равный самому ORCH-118 и не присутствующий в docs/work-items/); кандидаты именуются по роли. Заменяет ошибочный mapping-тест R2, прибивавший карту к выдуманным ID." module: tests/test_llm_determinization_docs.py expected: PASS