Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4.3 KiB
План: scope авто-обновления графа под пост-сплит (graphify-tools-scope)
Цель
Внести изменение из спеки 2026-06-21-graphify-tools-scope-design: tools/ в scope
инкрементального обнователя, app/ убран, *.test.mjs исключены; константы экспортируемы;
тест-файл переписан под новый контракт; амендмент ADR-017. RED-первым, без коммита.
["test-driven-development"]
[
{"op":"Edit","object":"tools/graphify-safe-update.test.mjs","ref":"D3"},
{"op":"Bash","object":"npx vitest run tools/graphify-safe-update.test.mjs --config vitest.config.tools.mjs --reporter dot","ref":"D3"},
{"op":"Edit","object":"tools/graphify-safe-update.mjs","ref":"D2"},
{"op":"Bash","object":"npx vitest run tools/graphify-safe-update.test.mjs --config vitest.config.tools.mjs --reporter verbose","ref":"D2"},
{"op":"Edit","object":"docs/adr/ADR-017-knowledge-graph-tooling.md","ref":"D4"}
]
[
{"id":"vc-scopes","kind":"EXTRACTED","ref":"tools/graphify-safe-update.mjs","anchor":"const ALLOWED_SCOPES = ["},
{"id":"vc-filter","kind":"EXTRACTED","ref":"tools/graphify-safe-update.mjs","anchor":"export function filterInScope("},
{"id":"vc-adr","kind":"EXTRACTED","ref":"docs/adr/ADR-017-knowledge-graph-tooling.md","anchor":"Стратегия обновлений"}
]
Содержание шагов (точные правки, без заглушек)
Шаг 1 — RED: переписать тест (tools/graphify-safe-update.test.mjs):
- импортировать
ALLOWED_SCOPES,SCAN_EXCLUDE_DIRSиз./graphify-safe-update.mjs(вместо локальных копий); - утверждения нового контракта:
tools/x.mjs— сохраняется;tools/x.test.mjs— отбрасывается;app/...— отбрасывается;docs/,.claude/— сохраняются; dir-исключения без регресса; прямая проверка:ALLOWED_SCOPES.includes('tools/') === true,.includes('app/') === false,SCAN_EXCLUDE_DIRS.includes('.test.mjs') === true.
Шаг 2 — прогон RED: ожидается FAIL (текущий код: app/ в scope, tools/ вне, нет .test.mjs-исключения, константы не экспортированы).
Шаг 3 — GREEN: правка модуля (tools/graphify-safe-update.mjs):
export const ALLOWED_SCOPES = ['docs/', '.claude/', 'tools/'];(+export, +tools/, −app/);export const SCAN_EXCLUDE_DIRS = ['node_modules/', 'vendor/', '__pycache__/', '.git/', '.test.mjs'];(+export, +.test.mjs);- поведенческий путь (AST-разбор +
build_merge+to_json) НЕ трогать.
Шаг 4 — прогон GREEN: ожидается PASS (отличается от шага 2 репортёром — не дубль).
Шаг 5 — амендмент ADR-017 (docs/adr/ADR-017-knowledge-graph-tooling.md, §«Стратегия обновлений»):
- пометить мотивацию исключения
tools/как историческую (контекст прежнего большого монорепо); - зафиксировать пост-сплит правило:
tools/в scope (прод-код управляющего слоя),*.test.mjsи удалённыйapp/исключены.
Переговоры
Круг 1
Порядок RED-первым (тест → прогон RED → код → GREEN), а не «код → тесты». Обоснование: это
TDD-дисциплина, которую судья (DR-1) требует жёстко — RED-прогон ДО починки. Рекомендация «код
сначала» из вердикта по спеке мягче этого гейта; при конфликте приоритет у TDD. Шаги 2 и 4 —
разные команды (--reporter dot vs --reporter verbose), дублей нет. Verify-шаги не-readonly
(прогон vitest пишет), указатель двигают. Зелёность полным сводом — отдельно через
produce-verify-receipt на коммите (вне этого плана).