886 lines
35 KiB
Markdown
886 lines
35 KiB
Markdown
# 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-исполнение с чекпойнтами для ревью.
|
||
|
||
Какой подход?
|