# Graphify Spike Implementation Plan

> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.

**Goal:** Получить evidence по экономии input-tokens Graphify на репо Лидерры (5 baseline-задач A/B), принять решение GREEN/YELLOW/RED по формализации в Tooling-канон.

**Architecture:** Worktree `worktree-graphify-spike` (от текущего HEAD) → Ollama+qwen2.5:7b сервис → Graphify CLI → индексация `app/`+`docs/`+`.claude/` (исключая секреты/телеметрию/handoff) → A/B замеры 5 задач → отчёт в `docs/discovery/` → branch-handling по exit-ветке.

**Tech Stack:** Ollama (Windows installer), qwen2.5:7b (4.7 ГБ), Python 3.10+, uv, Graphify v0.8.20.

**Spec:** [docs/superpowers/specs/2026-05-27-graphify-spike-design.md](../specs/2026-05-27-graphify-spike-design.md)

---

## Файловая структура (что создаётся/меняется)

- **Create:** `.claude/worktrees/graphify-spike/` — worktree
- **Modify (worktree):** `.gitignore` (+строка `.graphify/`)
- **Create (worktree):** `.graphify/` (содержимое — в gitignore)
- **Create (worktree):** `.graphify/config.toml` (или эквивалент, конфиг ignore-списка)
- **Create (worktree):** `docs/discovery/2026-05-27-graphify-spike.md` — отчёт
- **Create (worktree):** `docs/discovery/2026-05-27-graphify-spike-baseline-A/` — транскрипты A-варианта 5 задач (опционально)
- **Create (worktree):** `docs/discovery/2026-05-27-graphify-spike-baseline-B/` — транскрипты B-варианта

**Машинные изменения (вне репо):**

- Установка Ollama сервиса (Windows)
- Скачивание `qwen2.5:7b` в `%USERPROFILE%\.ollama\models\`
- Установка `graphifyy` через `uv tool install`

---

## Task 0: Worktree setup (обязательно через superpowers:using-git-worktrees)

**Files:**

- Create: `.claude/worktrees/graphify-spike/` (полная копия репо)
- Branch: `spike/graphify-2026-05-27`

- [ ] **Step 1: Invoke using-git-worktrees skill**

Skill сам делает: `git worktree add .claude/worktrees/graphify-spike -b spike/graphify-2026-05-27` (от текущего HEAD). NTFS-junction для `node_modules` если потребуется (квирк #108).

- [ ] **Step 2: Verify worktree**

Run from main checkout: `git worktree list`
Expected output contains: `.claude/worktrees/graphify-spike  <sha>  [spike/graphify-2026-05-27]`

- [ ] **Step 3: cd to worktree for subsequent tasks**

Все последующие команды выполняются из `.claude/worktrees/graphify-spike/` (worktree-path). Использовать absolute paths в Bash-командах, чтобы не путать checkout'ы (Pravila §15.1 prudence).

---

## Task 1: .gitignore — добавить `.graphify/`

**Files:**

- Modify: `.gitignore` (worktree)

- [ ] **Step 1: Read current .gitignore**

Read worktree `.gitignore` чтобы найти подходящую секцию (обычно есть блок «Tools» или «Cache»).

- [ ] **Step 2: Add .graphify/ entry**

Edit `.gitignore`, добавить:

```
# Graphify spike (2026-05-27)
.graphify/
```

В конец файла или в существующий «Cache» блок.

- [ ] **Step 3: Verify gitignore matches**

Run: `git check-ignore -v .graphify/test`
Expected: вывод указывает на новую строку в `.gitignore`.

- [ ] **Step 4: Commit**

```bash
git -C .claude/worktrees/graphify-spike add .gitignore
git -C .claude/worktrees/graphify-spike commit -m "chore(spike): gitignore .graphify/ before install"
```

---

## Task 2: Установить Ollama (Windows сервис)

**Files:** машинные изменения, не репо.

- [ ] **Step 1: Check if Ollama already installed**

Run: `where ollama` (PowerShell) или `which ollama` (Bash)
Expected (если установлен): путь к `ollama.exe`. Если выводит «not found» — переход к Step 2.

- [ ] **Step 2: Install via winget**

Run: `winget install --id Ollama.Ollama -e --accept-source-agreements --accept-package-agreements`
Expected: «Successfully installed».

**Если winget недоступен** (квирк #56 на старых Windows): скачать installer вручную с `https://ollama.com/download/windows`, запустить `OllamaSetup.exe`.

- [ ] **Step 3: Verify Ollama service running**

Run (PowerShell): `Get-Service -Name Ollama | Select-Object Status, Name`
Expected: `Status: Running, Name: Ollama`.

Если `Stopped`: `Start-Service Ollama`.

- [ ] **Step 4: Verify HTTP endpoint**

Run: `curl http://localhost:11434/api/tags`
Expected: JSON `{"models":[]}` (модели ещё нет).

- [ ] **Step 5: Verify CLI**

Run: `ollama --version`
Expected: версия вида `ollama version 0.X.Y`.

---

## Task 3: Скачать модель qwen2.5:7b + проверить русский

**Files:** машинные изменения.

- [ ] **Step 1: Pull model**

Run: `ollama pull qwen2.5:7b`
Expected: progress-bar, в конце «success». Размер ~4.7 ГБ. **Это занимает 5-20 мин зависит от канала.**

- [ ] **Step 2: Verify model registered**

Run: `ollama list`
Expected: строка `qwen2.5:7b ... 4.7 GB`.

- [ ] **Step 3: Smoke-test русским**

Run: `ollama run qwen2.5:7b "Извлеки главную концепцию из абзаца: 'Pravila §15.2 — pre-flight sync обязателен перед правкой нормативных файлов чтобы избежать collision параллельных Claude-сессий'. Ответь одной фразой по-русски."`
Expected: осмысленный русский ответ, упоминающий «pre-flight sync», «параллельные сессии», или «нормативные файлы». **Если ответ — мусор/английский/хайку — это ранний RED-сигнал**, фиксируем для отчёта.

- [ ] **Step 4: Записать время и RAM первого запроса**

Run (после Step 3, в отдельном окне): `Get-Process ollama* | Select-Object Name, WorkingSet64`
Expected: WorkingSet64 ~5-7 ГБ.

Зафиксировать в черновике отчёта: «модель загружена, smoke-test русского: PASS/FAIL, RAM при запросе: X ГБ».

---

## Task 4: Установить uv + Graphify

**Files:** машинные изменения.

- [ ] **Step 1: Check uv installed**

Run: `uv --version`
Expected (если установлен): `uv X.Y.Z`. Если «not found» — переход к Step 2.

- [ ] **Step 2: Install uv**

Run (PowerShell): `powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"`
Expected: «uv installed successfully». Перезапустить shell для PATH update.

- [ ] **Step 3: Install graphifyy package**

Run: `uv tool install graphifyy`
Expected: «Installed: graphify». Note: **package name `graphifyy` с двумя y** (per разведка).

- [ ] **Step 4: Verify graphify CLI**

Run: `graphify --version`
Expected: версия `0.8.20` (или новее).

- [ ] **Step 5: Register as Claude Code skill**

Run: `graphify install`
Expected: создаётся `.claude/skills/graphify/` или эквивалент. **NB:** в spike-worktree это нормально; в main checkout — не делать (out-of-scope spike).

- [ ] **Step 6: Verify skill registered (worktree-local)**

Run: `ls .claude/skills/ | grep -i graphify`
Expected: запись `graphify` присутствует.

- [ ] **Step 7: Verify Ollama backend configured**

Run: `graphify config show` (или эквивалент, см. `graphify --help`)
Expected: backend = `ollama`, model = `qwen2.5:7b`.

Если backend другой: `graphify config set backend ollama` + `graphify config set model qwen2.5:7b`.

---

## Task 5: Сконфигурировать ignore-список Graphify

**Files:**

- Create (worktree): `.graphify/config.toml` (или эквивалент per Graphify docs)

- [ ] **Step 1: Узнать формат конфига**

Run: `graphify config init` (если поддерживается) или `graphify --help` для документации.
Expected: создаётся файл-шаблон конфигурации (`.graphify/config.toml` или `.graphifyignore` или эквивалент).

- [ ] **Step 2: Add ignore patterns**

В конфиг (формат зависит от Graphify — `.graphifyignore` gitignore-style или `[ignore]` секция в TOML):

```
# Out-of-scope spike (per spec §4.2)
node_modules/
vendor/
bin/
liderra_v8_handoff/
web/
db/schema.sql
db/00_create_roles.sql
.env
.env.*
docs/observer/episodes-*.jsonl
docs/superpowers/audits/
docs/discovery/
```

- [ ] **Step 3: Verify ignore работает**

Run: `graphify scan --dry-run .` (или эквивалент, dry-run/preview команда)
Expected: список файлов для индексации **не содержит** ни одного из ignore-паттернов выше. **Особенно важно: episodes-*.jsonl отсутствует** (PII-риск).

- [ ] **Step 4: Sanity check scope**

Manually grep dry-run output: должны быть `app/`, `docs/Pravila_*.md`, `.claude/skills/*.md`. НЕ должно быть `liderra_v8_handoff/`, `node_modules/`.

- [ ] **Step 5: Commit конфига**

```bash
git -C .claude/worktrees/graphify-spike add .graphify/config.toml  # или .graphifyignore — что Graphify создал
git -C .claude/worktrees/graphify-spike commit -m "chore(spike): graphify ignore-config (scope app+docs+.claude, exclude secrets/PII/handoff)"
```

NB: сам `.graphify/` директорий в `.gitignore` per Task 1, но config-файл коммитим явно (опция `git add -f` если потребуется).

---

## Task 6: Первая сборка графа + измерения

**Files:**

- Create (worktree, gitignored): `.graphify/graph.*` (формат — Graphify-internal)

- [ ] **Step 1: Засечь start time**

Run: `Get-Date -Format "yyyy-MM-dd HH:mm:ss"` → сохранить в черновик отчёта как `BUILD_START`.

- [ ] **Step 2: Запустить полную сборку**

Run: `graphify build .` (или `graphify index .` — точная команда per CLI)
Expected: progress-bar по фазам (Tree-sitter parse → Ollama semantic). **Tree-sitter — быстро (~1-2 мин), Ollama — главное ожидание (1-3ч).**

**Если процесс падает / висит >3ч / RAM >12 ГБ:** kill, фиксировать как ранний RED, переход к Task 12 RED-протокол.

- [ ] **Step 3: Засечь end time**

После завершения: `Get-Date -Format "yyyy-MM-dd HH:mm:ss"` → `BUILD_END`. Дельта = время первой сборки.

- [ ] **Step 4: Измерить размер графа**

Run: `(Get-ChildItem -Recurse .graphify | Measure-Object -Property Length -Sum).Sum / 1MB`
Expected (прогноз): 50-200 МБ. **Зафиксировать фактическое.**

- [ ] **Step 5: Измерить количество узлов/рёбер**

Run: `graphify stats` (или эквивалент)
Expected: `Nodes: NNNN, Edges: MMMM`. Прогноз 3-4k nodes. **Зафиксировать.**

- [ ] **Step 6: Измерить покрытие docs/**

Run: `graphify stats --filter "docs/**/*.md"` (если поддерживается) или manually считать из логов сборки сколько MD-файлов успешно обработано.
Expected: процент успешно обработанных Ollama файлов. **Если <70% — ранний YELLOW-сигнал.**

- [ ] **Step 7: Измерить RAM Ollama в idle (после сборки)**

Подождать 5 мин после сборки. Run: `Get-Process ollama* | Select-Object Name, @{N='RAM_GB';E={$_.WorkingSet64/1GB}}`
Expected (порог GREEN): <8 ГБ. **Зафиксировать.**

- [ ] **Step 8: Записать все метрики в черновик отчёта**

Edit `docs/discovery/2026-05-27-graphify-spike.md` (создан в Task 11) заполнить секцию «Базовые метрики» (даже если файл ещё не создан — держать черновик в памяти/scratch).

---

## Task 7: Baseline-задача 1 — «tenant_id в SetTenantContext»

**Files:**

- Create (опционально, для prosperity): `docs/discovery/2026-05-27-graphify-spike-baseline-A/task1-transcript.md`

- [ ] **Step 1: A-вариант (baseline без графа) — открыть свежую Claude-сессию**

В новой сессии Claude Code (или в текущей, перед загрузкой `/graphify`), задать промпт:
> «Где обрабатывается tenant_id в SetTenantContext? Покажи файл, метод, и как middleware устанавливает app.current_tenant_id в PostgreSQL.»

Дать Claude отработать классически (Read/Grep/Glob).

- [ ] **Step 2: Зафиксировать A-метрики**

Записать в черновик:

- Кол-во tool-calls (Read+Grep+Glob): N_A
- Суммарный размер прочитанных файлов в KB: SIZE_A
- Время до финального ответа: T_A (грубо)
- Качество ответа (1-5 субъективно)

Источник tool-calls — посчитать вручную по UI или из episodes JSONL (если включена observer).

- [ ] **Step 3: B-вариант (с графом) — загрузить Graphify в той же или новой сессии**

В Claude Code: `/graphify .` (активация skill). Дождаться подтверждения «граф загружен».

- [ ] **Step 4: Задать тот же промпт**

Тот же текст вопроса. Claude должен сначала запросить граф через graphify-команды, потом отвечать.

- [ ] **Step 5: Зафиксировать B-метрики**

- Кол-во tool-calls: N_B
- Суммарный размер запросов к графу + последующих Read: SIZE_B
- Время: T_B
- Качество (1-5)

- [ ] **Step 6: Вычислить дельту**

Экономия токенов task1: `(SIZE_A - SIZE_B) / SIZE_A * 100%`
Экономия tool-calls task1: `(N_A - N_B) / N_A * 100%`

Записать в черновик отчёта строкой задачи 1.

- [ ] **Step 7: Commit транскрипта (опционально)**

```bash
git -C .claude/worktrees/graphify-spike add docs/discovery/2026-05-27-graphify-spike-baseline-A/task1-transcript.md
git -C .claude/worktrees/graphify-spike commit -m "spike: baseline task 1 A-transcript (tenant_id setter)"
```

---

## Task 8: Baseline-задача 2 — «Pravila про параллельные сессии»

**Files:** аналогично Task 7.

- [ ] **Step 1: A-вариант — свежая сессия, без `/graphify`**

Промпт:
> «Что говорит Pravila про параллельные Claude-сессии? Перечисли подсекции §15 с кратким смыслом каждой.»

- [ ] **Step 2: A-метрики (N_A, SIZE_A, T_A, quality_A)**

- [ ] **Step 3: B-вариант — `/graphify .`**

- [ ] **Step 4: Тот же промпт**

- [ ] **Step 5: B-метрики (N_B, SIZE_B, T_B, quality_B)**

- [ ] **Step 6: Дельта task 2**

- [ ] **Step 7: Commit транскрипта (опционально)**

```bash
git -C .claude/worktrees/graphify-spike add docs/discovery/2026-05-27-graphify-spike-baseline-A/task2-transcript.md
git -C .claude/worktrees/graphify-spike commit -m "spike: baseline task 2 A-transcript (Pravila §15 parallel sessions)"
```

---

## Task 9: Baseline-задача 3 — «Job-классы, трогающие LedgerService»

**Files:** аналогично.

- [ ] **Step 1: A-вариант**

Промпт:
> «Покажи все Job-классы (`app/Jobs/`), которые вызывают методы `LedgerService`. Перечисли имя джоба и какой метод сервиса зовётся.»

- [ ] **Step 2-7: повтор паттерна Task 7-8**

Code-graph навигация — здесь Graphify должен сиять (function-call graph). Если экономии нет здесь — это серьёзный RED-сигнал.

- [ ] **Step 8: Commit транскрипта**

---

## Task 10: Baseline-задача 4 — «ADR Universal Icons MCP граница»

- [ ] **Step 1: A-вариант**

Промпт:
> «В каком ADR решение про границу Universal Icons MCP против Lucide icons? Покажи Decision-item и Consequences.»

- [ ] **Step 2-7: повтор паттерна**

Кросс-доковая навигация. Graphify должен найти ADR-006 Decision-4 без чтения 12 ADR-файлов.

- [ ] **Step 8: Commit**

---

## Task 11: Baseline-задача 5 — «DEFERRED узлы Tooling»

- [ ] **Step 1: A-вариант**

Промпт:
> «Какие узлы в Tooling Прил.Н помечены как DEFERRED (статус pending install / pending Б-1 / нет нужного окружения)? Перечисли номера и причину defer.»

- [ ] **Step 2-7: повтор**

Структурный запрос по нормативке. Если Graphify не извлёк attribute-блоки из Tooling — это YELLOW-сигнал для русско-язычной семантики.

- [ ] **Step 8: Commit**

---

## Task 12: Инкрементальная пере-сборка — измерить время

**Files:**

- Modify (worktree, throwaway): любой markdown в `docs/` (вернуть после)

- [ ] **Step 1: Сделать throwaway-правку**

Edit `docs/Pravila_raboty_Claude_v1_1.md` — добавить в конец строку `<!-- spike-test 2026-05-27 -->`. Сохранить.

- [ ] **Step 2: Засечь время инкремента**

Run: `Get-Date -Format "HH:mm:ss"` → start.
Run: `graphify update .` (или эквивалент инкрементальной команды).
Run: `Get-Date -Format "HH:mm:ss"` → end. Дельта = время инкремента.

Expected (порог GREEN): <2 мин. **Зафиксировать фактическое.**

- [ ] **Step 3: Откатить правку**

Run (worktree): `git checkout docs/Pravila_raboty_Claude_v1_1.md`
Verify: правка ушла, файл чистый.

- [ ] **Step 4: Записать метрику инкремента в отчёт**

---

## Task 13: Написать отчёт `docs/discovery/2026-05-27-graphify-spike.md`

**Files:**

- Create (worktree): `docs/discovery/2026-05-27-graphify-spike.md`

- [ ] **Step 1: Создать файл по шаблону**

```markdown
# Graphify Spike — Results Report

**Дата:** 2026-05-27
**Spec:** [../superpowers/specs/2026-05-27-graphify-spike-design.md](../superpowers/specs/2026-05-27-graphify-spike-design.md)
**Plan:** [../superpowers/plans/2026-05-27-graphify-spike.md](../superpowers/plans/2026-05-27-graphify-spike.md)
**Вердикт:** GREEN / YELLOW / RED (заполнить по итогам)

## 1. Окружение

- Ollama: vX.Y.Z, qwen2.5:7b (4.7 ГБ)
- Graphify: vX.Y.Z
- Worktree: `.claude/worktrees/graphify-spike`
- OS: Windows Server 2022

## 2. Базовые метрики

| Метрика | Значение | Порог GREEN |
|---|---|---|
| Время первой сборки | XX мин | <3ч |
| Размер `.graphify/` | XX МБ | (прогноз 50-200) |
| Узлов графа | XXXX | (прогноз 3-4k) |
| Покрытие docs/ (% MD успешно обработано) | XX% | ≥70% |
| RAM Ollama idle (после сборки, 5 мин позже) | X.X ГБ | <8 ГБ |
| Время инкрементальной пере-сборки 1 файла | X мин | <2 мин |

## 3. Smoke-test русского

Запрос: «Извлеки концепцию из абзаца про Pravila §15.2».
Ответ Ollama qwen2.5:7b: [вставить дословно]
Оценка: PASS / FAIL.

## 4. A/B замеры 5 задач

| # | Задача | N_A | SIZE_A KB | T_A | qual_A | N_B | SIZE_B KB | T_B | qual_B | Экономия KB | Экономия calls |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | tenant_id setter | | | | | | | | | XX% | XX% |
| 2 | Pravila §15 | | | | | | | | | XX% | XX% |
| 3 | LedgerService jobs | | | | | | | | | XX% | XX% |
| 4 | ADR Universal Icons | | | | | | | | | XX% | XX% |
| 5 | DEFERRED Tooling | | | | | | | | | XX% | XX% |
| **Среднее** | | | | | | | | | | **XX%** | **XX%** |

## 5. Qualitative observations

- Качество русского markdown семантики: (описание)
- Поведение Graphify на code-graph задачах: (описание)
- Поведение на кросс-доковых задачах: (описание)
- Stability / crashes / quirks Windows: (описание)

## 6. Exit decision

Применяя exit criteria spec §6:

- [ ] GREEN: все 4 условия GREEN → формализация Approach B следующей задачей
- [ ] YELLOW: одно из YELLOW-условий → личный инструмент контроллера, без Tooling-канона
- [ ] RED: одно из RED-условий → полный откат

**Вердикт:** ...

**Обоснование:** ...

## 7. Next steps (по вердикту)

(заполнить из spec §6 для выбранной ветки)
```

- [ ] **Step 2: Заполнить метрики собранные в Tasks 6-12**

Все числовые ячейки таблиц заполнить фактическими.

- [ ] **Step 3: Заполнить qualitative observations**

Чёрные субъективные впечатления — особенно про русский Ollama и поведение на нашем markdown-стиле.

- [ ] **Step 4: Commit отчёта (без вердикта)**

```bash
git -C .claude/worktrees/graphify-spike add docs/discovery/2026-05-27-graphify-spike.md
git -C .claude/worktrees/graphify-spike commit -m "docs(spike): graphify spike metrics report (pre-verdict)"
```

---

## Task 14: Принять решение GREEN/YELLOW/RED

**Files:**

- Modify (worktree): `docs/discovery/2026-05-27-graphify-spike.md` (заполнить вердикт)

- [ ] **Step 1: Применить exit criteria spec §6**

Проверить по таблице:

```
GREEN (все 4):
  avg_savings >= 30%  AND
  min 3 of 5 tasks >= 20%  AND
  incremental_time < 2min  AND
  ram_idle < 8GB

YELLOW (хотя бы одно):
  avg_savings 15-30%  OR
  works only on code (not markdown)  OR
  ram 8-12 GB

RED (хотя бы одно):
  avg_savings < 15%  OR
  Russian semantics = mess  OR
  build_time > 3h  OR
  ram > 12GB  OR
  Windows crashes
```

- [ ] **Step 2: Заполнить §6 «Exit decision» в отчёте**

Поставить чекбокс на выбранной ветке. Обоснование с цифрами.

- [ ] **Step 3: Заполнить §7 «Next steps»**

Скопировать соответствующие действия из spec §6 для выбранной ветки.

- [ ] **Step 4: Commit вердикта**

```bash
git -C .claude/worktrees/graphify-spike add docs/discovery/2026-05-27-graphify-spike.md
git -C .claude/worktrees/graphify-spike commit -m "docs(spike): graphify spike verdict <GREEN|YELLOW|RED> + next steps"
```

- [ ] **Step 5: Show user the verdict + ask for next-step confirmation**

Пользователю — короткое summary вердикта + предложить переход к Task 15 (один из 15-GREEN / 15-YELLOW / 15-RED).

---

## Task 15-GREEN: Branch handling — merge to main, оставить Graphify установленным

**Только если verdict = GREEN.**

**Files:**

- Modify: `.gitignore` (main)
- Add: `docs/discovery/2026-05-27-graphify-spike.md` (main)

- [ ] **Step 1: cd to main checkout**

`cd c:/моя/проекты/портал crm/Документация`

- [ ] **Step 2: Pre-flight sync per Pravila §15.2**

Хотя spike не трогал 8 нормативных файлов, перед merge — стандартный sync:

```bash
git fetch origin
git log HEAD..origin/main --oneline
```

Если есть unmerged commits на origin/main — rebase спайк-ветки.

- [ ] **Step 3: Merge spike branch**

```bash
git merge --no-ff spike/graphify-2026-05-27 -m "merge: graphify spike GREEN — verdict + .gitignore"
```

Expected: merge без конфликтов (только `.gitignore` +отчёт), оба файла новые/не пересекаются с main.

- [ ] **Step 4: Push**

```bash
git push origin main
```

- [ ] **Step 5: Memory entry**

Создать `memory/project_graphify_spike_green.md`:

```markdown
---
name: project-graphify-spike-green
description: Graphify spike 2026-05-27 — GREEN verdict, awaiting Approach B (full integration as 19th off-phase)
metadata:
  type: project
---

Graphify spike (2026-05-27) показал GREEN: avg экономия XX%, RAM XX ГБ, build XX мин.

**Why:** evidence-driven решение перед формализацией; spec [[../specs/2026-05-27-graphify-spike-design.md]] выбрал spike-first.

**How to apply:** при следующей сессии — предложить Approach B (ADR-017 + #89 Tooling + 19-я off-phase подкатегория `knowledge-graph-tooling` + IS9 vet + lefthook + observer integration). До тех пор Graphify установлен и работает локально, но не в Tooling-каноне.

См. отчёт `docs/discovery/2026-05-27-graphify-spike.md`.
```

Добавить запись в `MEMORY.md` index:

```
- [Graphify spike GREEN](project_graphify_spike_green.md) — verdict GREEN 2026-05-27, awaiting Approach B
```

- [ ] **Step 6: Worktree cleanup**

Worktree оставить активным (можно использовать дальше) ИЛИ удалить если уже не нужен:

```bash
git worktree remove .claude/worktrees/graphify-spike  # optional
```

Branch не удаляем — merge зафиксирован в истории main.

- [ ] **Step 7: Доложить пользователю**

«GREEN — мерж в main `<commit-sha>`, push'нуто. Approach B (формализация) — отдельной задачей. Memory обновлён.»

---

## Task 15-YELLOW: Branch handling — merge to main, личный инструмент без формализации

**Только если verdict = YELLOW.**

**Files:**

- Same as 15-GREEN (`.gitignore` + отчёт)
- Memory: `memory/feedback_graphify_yellow.md`

- [ ] **Step 1-4: same as 15-GREEN** (cd main, pre-flight, merge, push)

- [ ] **Step 5: Memory entry с правилами использования**

Создать `memory/feedback_graphify_yellow.md`:

```markdown
---
name: feedback-graphify-yellow
description: Graphify spike 2026-05-27 — YELLOW verdict, личный инструмент контроллера без формализации в Tooling
metadata:
  type: feedback
---

Graphify работает частично (avg экономия XX%, [причина частичной]).

**Why:** spike 2026-05-27 показал YELLOW per exit criteria spec §6.

**How to apply:**
- Звать Graphify на: [конкретные классы задач где экономия была — например только код-граф, не markdown]
- НЕ звать на: [классы где экономии не было — например русский markdown семантика]
- Graphify установлен локально, в Tooling-каноне НЕ зарегистрирован (без #89, без ADR, без §3.3 row).
- Пересмотр при выходе Graphify v1.0 ИЛИ если появится более качественная локальная LLM для русского.

См. отчёт `docs/discovery/2026-05-27-graphify-spike.md`.
```

Добавить в `MEMORY.md` index аналогично GREEN.

- [ ] **Step 6: Worktree остаётся (для дальнейших вызовов graphify)**

- [ ] **Step 7: Доложить пользователю**

«YELLOW — мерж в main, Graphify работает частично, правила использования зафиксированы в memory.»

---

## Task 15-RED: Branch handling — cherry-pick report, полный откат всего

**Только если verdict = RED.**

**Files:**

- Cherry-pick to main: `docs/discovery/2026-05-27-graphify-spike.md`
- Memory: `memory/project_graphify_spike_negative.md`

- [ ] **Step 1: cd to main checkout**

`cd c:/моя/проекты/портал crm/Документация`

- [ ] **Step 2: Pre-flight sync per Pravila §15.2**

```bash
git fetch origin
git log HEAD..origin/main --oneline
```

- [ ] **Step 3: Cherry-pick только отчёт (без .gitignore)**

Найти SHA коммита отчёта (Task 13 Step 4 + Task 14 Step 4):

```bash
git log spike/graphify-2026-05-27 --oneline | grep "spike): graphify"
```

Cherry-pick последний (с вердиктом):

```bash
git cherry-pick <verdict-commit-sha>
```

Если конфликт (например файл `docs/discovery/` оба ветки трогали) — `git checkout --theirs <file>` для версии из спайк-ветки.

- [ ] **Step 4: Push отчёт**

```bash
git push origin main
```

- [ ] **Step 5: Memory entry (negative result)**

Создать `memory/project_graphify_spike_negative.md`:

```markdown
---
name: project-graphify-spike-negative
description: Graphify spike 2026-05-27 — RED verdict, полный откат; не пробовать снова без [условие]
metadata:
  type: project
---

Graphify v0.8.20 + Ollama qwen2.5:7b на Лидерре — RED.

**Why:** [конкретная RED-причина из вердикта — экономия <15% / Ollama-семантика мусор / RAM >12GB / crashes].

**How to apply:**
- НЕ предлагать Graphify-аналогичные инструменты до тех пор пока не изменилось [условие — например выйдет v1.0, или появится локальная LLM лучше qwen2.5:7b на русском].
- Альтернатива codegraph (colbymchenry) — не пробована, может быть пересмотрена отдельно если RED-причина была не в semantic-качестве.

См. отчёт `docs/discovery/2026-05-27-graphify-spike.md` (cherry-pick'нутый на main).
```

Добавить в `MEMORY.md` index.

- [ ] **Step 6: Удалить worktree**

```bash
git worktree remove --force .claude/worktrees/graphify-spike
```

Expected: директория удалена.

- [ ] **Step 7: Удалить branch**

```bash
git branch -D spike/graphify-2026-05-27
```

- [ ] **Step 8: Uninstall Graphify**

```bash
uv tool uninstall graphifyy
```

- [ ] **Step 9: Удалить Ollama-модель**

```bash
ollama rm qwen2.5:7b
```

Expected: освобождено ~4.7 ГБ диска.

- [ ] **Step 10: Uninstall Ollama сервис**

Run (PowerShell): `winget uninstall Ollama.Ollama -e`
Expected: «Successfully uninstalled».

Альтернативно — через Control Panel → Programs.

- [ ] **Step 11: Verify cleanup**

```bash
where ollama  # should fail with "not found"
where graphify  # should fail with "not found"
Get-ChildItem $env:USERPROFILE\.ollama  # should not exist or be empty
```

- [ ] **Step 12: Доложить пользователю**

«RED — откат завершён. Worktree/branch удалены, Graphify+Ollama+model снесены, отчёт cherry-pick'нут на main `<sha>`. Memory обновлён negative result. Освобождено ~5 ГБ диска.»

---

## Self-Review (выполнено)

**Spec coverage:**

- §1 Контекст → Tasks выполняют spike с реальными измерениями. ✅
- §2 Цель → Task 14 принимает решение по данным Tasks 7-12. ✅
- §3 Решения (7 штук) → Task 2 (Ollama), 3 (qwen2.5:7b), 4 (Graphify+install), 5 (ignore+scope), 6 (build). ✅
- §4.1 Окружение → Tasks 0+2+3+4. ✅
- §4.2 Scope → Task 5 ignore-конфиг. ✅
- §4.3 Хранение артефактов → Task 1 (.gitignore) + Task 13 (отчёт). ✅
- §5.1 Базовые метрики → Task 6 Steps 3-7 + Task 12. ✅
- §5.2 5 baseline-задач → Tasks 7-11. ✅
- §5.3 Не меряем → не нужны task'и (negative scope). ✅
- §6 Exit criteria → Task 14 + Tasks 15-GREEN/YELLOW/RED. ✅
- §7 Timeline → распределено по task'ам. ✅
- §8 Out-of-scope → не делается ни в одном task'е (явные пропуски нормативки/lefthook/observer). ✅
- §9 Что коммитим → .gitignore (Task 1) + отчёт (Tasks 13, 14) + опционально config (Task 5) + опционально транскрипты A (Tasks 7-11). ✅
- §10 Отложенное до Approach B → не делается. ✅
- §11 Связанные артефакты → ссылки в отчёте. ✅

**Placeholder scan:**

- ✅ Все «Step N» содержат конкретные команды.
- ⚠️ Качество ответа A/B — субъективная оценка (1-5), это OK для спайка но не «implement later».
- ✅ Нет «TODO», «TBD», «implement later».
- ⚠️ Точные команды Graphify CLI могут отличаться от реальных — fallback через `graphify --help` явно указан в Tasks 5+6.

**Type consistency:**

- `qwen2.5:7b` — везде с двоеточием. ✅
- `graphifyy` (double y) — npm-name, везде одинаково. ✅
- `spike/graphify-2026-05-27` ветка — везде одинаково. ✅
- `.claude/worktrees/graphify-spike` путь — везде одинаково. ✅

Self-review закрыт. Issues найденные — fix'ить inline по ходу исполнения если реальная CLI отличается.

---

## Execution Handoff

**Plan complete and saved to** `docs/superpowers/plans/2026-05-27-graphify-spike.md`.

**Two execution options:**

**1. Subagent-Driven (recommended)** — я диспатчу свежий subagent на каждую task, ревьюю между задачами, быстрая итерация. Особенно подходит здесь — Task 6 (сборка графа 1-3ч) и Tasks 7-11 (по 30 мин каждая) — естественные точки чекпойнтов.

**2. Inline Execution** — выполняю tasks в этой сессии через executing-plans, batch-исполнение с чекпойнтами для ревью.

Какой подход?
