Правила работы — `AGENTS.md` в корне репозитория, копия в `C:\Users\Ochenstarik\kagent-tasks\AGENTS.md`. Рабочий каталог: `C:\Users\Ochenstarik\kagent\.worktrees\t_e15a6516` Ветка: `wt/kagent-091-measurability` Выполняется после задачи `b2-measurability-sanitize.md`. ## Предусловие Ветка отпочкована от старого `main`, в ней нет работы этапа 0.9.0: нет `pnpm-lock.yaml`, нет job `python`, нет исправлений gateway и control-plane. Пока PR #3 не влит в `main`, сборка этой ветки будет красной по чужим причинам. **Начинать только после того, как PR #3 смержен.** Первым действием — `git fetch origin` и rebase ветки на `origin/main`. Верификация на устаревшей базе не даёт права на слияние. Если PR #3 ещё не влит — останови работу и сообщи. Не обходить, не копировать чужие правки в свою ветку. ## Проблема Три скрипта — `roadmap_status.py`, `drift_check.py`, `eval_suite.py` — написаны, но не вызываются ниоткуда. Это ровно тот дефект, который `drift_check.py` создан обнаруживать: код присутствует в дереве и недостижим ни из одной точки входа. Пока они не в непрерывной интеграции, вычисляемый статус остаётся декларацией. ## 1. Подключить к непрерывной интеграции Добавить в `.github/workflows/ci.yml`: - шаг `python scripts/drift_check.py` в существующий job `python`. Сборка падает при обнаружении расхождения. Список проверок — из спецификации, раздел 41.5: заявленная возможность без проходящего доказательства; модуль в дереве, недостижимый ни из одной точки входа; задокументированный endpoint, отсутствующий в таблице маршрутов; задокументированная переменная окружения, которая нигде не читается; пользовательское изменение без записи в `CHANGELOG.md`; архитектурное изменение без ADR; - отдельный job `measurability`: выполняет `roadmap_status.py`, публикует полученный `ROADMAP.md` как артефакт сборки и падает, если сгенерированный файл отличается от закоммиченного. Это и есть механизм, запрещающий ручную правку статусов; - `eval_suite.py` запускать в режиме, не требующем поставщика моделей. Пока набор состоит из черновых случаев, job проверяет только разбор контрактов и целостность набора, а не прохождение случаев. ## 2. Первый прогон будет красным Ожидаемо и правильно: `drift_check.py` на текущем дереве обязан найти как минимум четыре недостижимых модуля — ``` services/nats/src/events.py services/auth/src/totp.py services/control-plane/src/db.ts packages/contracts/src/reasoning.ts ``` Ни один из них не импортируется ниоткуда. **Не чинить эти модули в этой задаче и не ослаблять проверку, чтобы сборка позеленела.** Правильное действие: убедиться, что проверка их находит, зафиксировать список в отчёте и завести отдельную задачу на решение по каждому — подключить или удалить. Чтобы ветку можно было влить, добавь в `drift_check.py` файл известных расхождений (`docs/known-drift.json`) с ограниченным сроком: запись содержит путь, причину, дату и задачу, в которой расхождение снимается. Запись без задачи или с истёкшим сроком роняет сборку. Список должен только сокращаться. ## 3. Что не входит - наполнение случаев оценки настоящими снимками репозиториев; - метрики автономности и гейт релиза по ним; - исправление найденных расхождений. ## Критерий приёмки - ветка перебазирована на `main`, содержащий работу 0.9.0; - `drift_check.py` вызывается из CI и находит все четыре недостижимых модуля — список привести в отчёте; - `roadmap_status.py` вызывается из CI, расхождение сгенерированного и закоммиченного `ROADMAP.md` роняет сборку; - проверено, что ручная правка статуса в `ROADMAP.md` действительно роняет сборку: сделать правку, показать красный прогон, откатить; - прогон непрерывной интеграции зелёный при пустом списке известных расхождений сверх четырёх зафиксированных; - ссылка на прогон приложена. ## Границы `.github/workflows/ci.yml`, `scripts/*`, `docs/capabilities.json`, `docs/known-drift.json`, `ROADMAP.md`. Ничего в сервисах не трогать.