analyst(ET): auto-commit from analyst run_id=724
All checks were successful
CI / test (push) Successful in 1m8s

This commit is contained in:
2026-06-15 23:17:18 +03:00
parent c7bed44845
commit bc5d550965
4 changed files with 119 additions and 92 deletions

View File

@@ -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` (архитектор).

View File

@@ -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` | анализ бизнес-запроса → 0104 |
| 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` — безопасно для общего инстанса.

View File

@@ -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) |

View File

@@ -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