From fb7334af05de313158c44f7cc822476be2fcf3bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Sat, 9 May 2026 17:15:02 +0300 Subject: [PATCH] =?UTF-8?q?docs(plan-audit):=20implementation=20plan=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=B0=D1=83=D0=B4=D0=B8=D1=82=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0=20=D0=BD=D0=B0=20202?= =?UTF-8?q?6-05-09?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit По spec v1.1 (b034301). 12 атомарных Tasks по 4 фазам: - Phase 0 — setup (Task 0): mkdir .tmp/audit, проверка .gitignore, snapshot HEAD/status. - Phase 1 — sweep (Task 1): 15 CLI-тулов в 5 параллельных группах A/B/C/D/E, raw output в .tmp/audit/stage1_*.txt + stage1_summary.md. - Phase 2 — субагенты (Tasks 2-4): Task 2 готовит r_rules_excerpt.md (CLAUDE.md §1 + R0.1/R6/R6.1/R10/R11/R13); Task 3 диспатчит 6 субагентов параллельно (D1-D6, единый шаблон промпта); Task 4 — early-stop предохранитель (>10 P0 на одном субагенте → AskUserQuestion). - Phase 3 — консолидация (Tasks 5-8): aggregate, dedup по (file,line,category), переклассификация по spec §3, генерация docs/audit_2026-05-09.md по §9 структуре. - Phase 4 — review + commit (Tasks 9-11): verification-before-completion (file:line + метрики + 0 placeholders + 0 R-нарушений), независимый code review через requesting-code-review (PASS/FAIL), коммит + update memory project_state. Бюджет: 1.5-2 часа wall-clock. .tmp/audit/ НЕ коммитится (.gitignore). Co-Authored-By: Claude Opus 4.7 (1M context) --- cspell-words.txt | 2 + .../plans/2026-05-09-project-audit-plan.md | 793 ++++++++++++++++++ 2 files changed, 795 insertions(+) create mode 100644 docs/superpowers/plans/2026-05-09-project-audit-plan.md diff --git a/cspell-words.txt b/cspell-words.txt index 58b9beb8..60cfd1ba 100644 --- a/cspell-words.txt +++ b/cspell-words.txt @@ -849,6 +849,8 @@ override банов SRP тулами +тул +коммитится # v1.81 — Plugin Stack Rules v1.3 (Frontend Design + Superpowers paired stack) инвокация diff --git a/docs/superpowers/plans/2026-05-09-project-audit-plan.md b/docs/superpowers/plans/2026-05-09-project-audit-plan.md new file mode 100644 index 00000000..7223f35f --- /dev/null +++ b/docs/superpowers/plans/2026-05-09-project-audit-plan.md @@ -0,0 +1,793 @@ +# Plan: Подробный аудит проекта Лидерра — 2026-05-09 + +> **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:** Провести подробный аудит проекта Лидерра (docs + db + Laravel + Vue + handoff + конфиги) и сдать сводный markdown-отчёт `docs/audit_2026-05-09.md` с приоритетами P0/P1/P2 + O-perf/O-refactor/O-stack + секцией «Отложенное». + +**Architecture:** Гибридный аудит из 4 этапов: (1) параллельный sweep 15 CLI-тулами в `.tmp/audit/stage1_*.txt`; (2) 6 параллельных субагентов (D1 narrative / D2 db / D3 handoff / D4 backend / D5 frontend / D6 configs) с шаблонными выходами `stage2_.md`; (3) синхронная консолидация в основном потоке (дедуп + переклассификация); (4) self-review через `verification-before-completion` skill + независимый code review через `requesting-code-review` skill. **Early-stop предохранитель:** если любой субагент возвращает >10 P0-находок — аудит останавливается, заказчик принимает решение. + +**Tech Stack:** Bash (через PowerShell 5.1), npm scripts (`lint:md`, `spell`, `links`, `a11y`, `format:sql:check`, `lint:sql`), composer scripts из `app/`, Pest, Larastan, vue-tsc, ESLint, Vitest, Laravel Boost MCP, Frontend Design plugin (НЕ призывается, см. spec §12.2), `superpowers:dispatching-parallel-agents` для параллелизации, `superpowers:verification-before-completion` + `superpowers:requesting-code-review` для финала. + +**Spec:** [docs/superpowers/specs/2026-05-09-project-audit-design.md](../specs/2026-05-09-project-audit-design.md) v1.1, commit `b034301`. + +--- + +## File Structure + +| Файл / каталог | Создаётся / Modifies | Ответственность | +|---|---|---| +| `.tmp/audit/` | Создаётся | Каталог для всех промежуточных артефактов аудита (в `.gitignore`, не коммитится) | +| `.tmp/audit/stage1_*.txt` (×15) | Создаётся | Raw output 15 CLI-тулов этапа 1, по одному файлу на тул | +| `.tmp/audit/stage1_summary.md` | Создаётся | Компактная сводка stage1 для подачи на вход субагентам этапа 2 (10-20 строк на тул) | +| `.tmp/audit/stage2_.md` (×6) | Создаётся | Отчёты 6 субагентов этапа 2 в шаблоне P0/P1/P2 + O-perf/O-refactor/O-stack + Notes | +| `docs/audit_2026-05-09.md` | Создаётся, коммитится | Финальный сводный отчёт по структуре spec §9 | + +**Out-of-scope для правок в этом плане:** правки исходников проекта (находки только фиксируются в отчёт; реализация — отдельный flow по решению заказчика). + +--- + +## Phase 0: Setup + +### Task 0: Подготовка каталога и проверка предусловий + +**Files:** + +- Create: `.tmp/audit/` (директория) +- Verify: `.gitignore` содержит `.tmp/` + +- [ ] **Step 1: Создать каталог `.tmp/audit/`** + +```bash +mkdir -p .tmp/audit +``` + +- [ ] **Step 2: Проверить, что `.tmp/` в `.gitignore`** + +```bash +grep -E "^\.tmp/" .gitignore +``` + +Expected: одна строка `.tmp/` в выводе. Если нет — STOP, добавить `.tmp/` в `.gitignore` руками и закоммитить отдельно. + +- [ ] **Step 3: Зафиксировать стартовые метрики** + +```bash +git rev-parse HEAD > .tmp/audit/stage0_head.txt +git status --short > .tmp/audit/stage0_status.txt +date -u +"%Y-%m-%dT%H:%M:%SZ" > .tmp/audit/stage0_started.txt +``` + +Expected: 3 файла в `.tmp/audit/`, HEAD совпадает с актуальным main, status пустой (clean tree). + +- [ ] **Step 4: Прочитать spec один раз, держать ссылку в контексте** + +Read: [docs/superpowers/specs/2026-05-09-project-audit-design.md](../specs/2026-05-09-project-audit-design.md) + +Expected: spec v1.1, 14+ секций, §6 содержит таблицу 6 субагентов, §7 чеклисты, §12 inventory плагинов, §15 R-карта. + +--- + +## Phase 1: Tool Sweep (этап 1 spec'а) + +### Task 1: Параллельный прогон 15 тулов + +**Files:** + +- Create: `.tmp/audit/stage1_*.txt` (×15) + +15 тулов запускаются **параллельно** через несколько `Bash`-вызовов в одном сообщении. Все exit-коды захватываются (через `; echo "EXIT:$?"` в конце), но **не блокируют** прогон — даже если тул падает, его вывод сохраняется и анализируется субагентом. + +- [ ] **Step 1: Группа A — Markdown / docs (4 тула, через npm scripts)** + +Параллельно (один tool-call message с 4 Bash): + +```bash +# A1: markdownlint +npm run lint:md > .tmp/audit/stage1_markdownlint.txt 2>&1; echo "EXIT:$?" >> .tmp/audit/stage1_markdownlint.txt + +# A2: cspell +npm run spell > .tmp/audit/stage1_cspell.txt 2>&1; echo "EXIT:$?" >> .tmp/audit/stage1_cspell.txt + +# A3: lychee (links) +npm run links > .tmp/audit/stage1_lychee.txt 2>&1; echo "EXIT:$?" >> .tmp/audit/stage1_lychee.txt + +# A4: pa11y +npm run a11y > .tmp/audit/stage1_pa11y.txt 2>&1; echo "EXIT:$?" >> .tmp/audit/stage1_pa11y.txt +``` + +Expected: 4 файла в `.tmp/audit/`, каждый заканчивается строкой `EXIT:N` (где N — exit-код). Прогон ~30-90 сек на каждый тул. + +- [ ] **Step 2: Группа B — БД (3 тула)** + +Параллельно: + +```bash +# B1: grep-патрули по schema.sql — дубли CREATE TABLE +grep -nE "^CREATE TABLE\s+\w+" db/schema.sql | sort -k2 | uniq -c -f1 | sort -rn > .tmp/audit/stage1_grep_create_table.txt 2>&1; echo "EXIT:$?" >> .tmp/audit/stage1_grep_create_table.txt + +# B2: grep-патрули — orphan-FK (REFERENCES без матчующего CREATE TABLE) +grep -oE "REFERENCES\s+(\w+)" db/schema.sql | sort -u | awk '{print $2}' > .tmp/audit/stage1_grep_fk_targets.txt +grep -oE "^CREATE TABLE\s+(\w+)" db/schema.sql | awk '{print $3}' | sort -u > .tmp/audit/stage1_grep_table_names.txt +comm -23 .tmp/audit/stage1_grep_fk_targets.txt .tmp/audit/stage1_grep_table_names.txt > .tmp/audit/stage1_grep_orphan_fk.txt 2>&1; echo "EXIT:$?" >> .tmp/audit/stage1_grep_orphan_fk.txt + +# B3: squawk +npm run lint:sql > .tmp/audit/stage1_squawk.txt 2>&1; echo "EXIT:$?" >> .tmp/audit/stage1_squawk.txt + +# B4: pgFormatter dry-run +npm run format:sql:check > .tmp/audit/stage1_pgformatter.txt 2>&1; echo "EXIT:$?" >> .tmp/audit/stage1_pgformatter.txt +``` + +Expected: 5 файлов в `.tmp/audit/` (B1 1 файл, B2 3 файла финальный включает дельту, B3 1 файл, B4 1 файл). `stage1_grep_orphan_fk.txt` должен быть пустым или содержать только legit cross-refs (например, partition tables). + +- [ ] **Step 3: Группа C — Backend Laravel (4 тула, в `app/`)** + +Параллельно: + +```bash +# C1: Pest (полный прогон) +cd app && composer test > ../.tmp/audit/stage1_pest.txt 2>&1; echo "EXIT:$?" >> ../.tmp/audit/stage1_pest.txt; cd .. + +# C2: Larastan +cd app && composer stan > ../.tmp/audit/stage1_larastan.txt 2>&1; echo "EXIT:$?" >> ../.tmp/audit/stage1_larastan.txt; cd .. + +# C3: composer outdated --direct +cd app && composer outdated --direct --format=text > ../.tmp/audit/stage1_composer_outdated.txt 2>&1; echo "EXIT:$?" >> ../.tmp/audit/stage1_composer_outdated.txt; cd .. + +# C4: composer audit +cd app && composer audit --format=plain > ../.tmp/audit/stage1_composer_audit.txt 2>&1; echo "EXIT:$?" >> ../.tmp/audit/stage1_composer_audit.txt; cd .. +``` + +Expected: 4 файла. Pest должен показать 416/416 PASS (см. memory project_state — снимок 09.05.2026). Larastan — 0 errors above baseline. composer outdated/audit — справочно для O-stack. + +- [ ] **Step 4: Группа D — Frontend Vue (3 тула, в `app/`)** + +Параллельно: + +```bash +# D1: vue-tsc +cd app && npm run type-check > ../.tmp/audit/stage1_vue_tsc.txt 2>&1; echo "EXIT:$?" >> ../.tmp/audit/stage1_vue_tsc.txt; cd .. + +# D2: ESLint vue +cd app && npm run lint:vue > ../.tmp/audit/stage1_eslint_vue.txt 2>&1; echo "EXIT:$?" >> ../.tmp/audit/stage1_eslint_vue.txt; cd .. + +# D3: Vitest +cd app && npm run test:vue > ../.tmp/audit/stage1_vitest.txt 2>&1; echo "EXIT:$?" >> ../.tmp/audit/stage1_vitest.txt; cd .. +``` + +Expected: 3 файла. Vitest должен показать 416/416 PASS, vue-tsc 0 errors, ESLint 0 errors (см. memory). + +- [ ] **Step 5: Группа E — npm outdated (1 тул, в корне)** + +```bash +npm outdated --json > .tmp/audit/stage1_npm_outdated.txt 2>&1; echo "EXIT:$?" >> .tmp/audit/stage1_npm_outdated.txt +``` + +Expected: 1 файл, JSON с пакетами или пустой объект. Для O-stack. + +- [ ] **Step 6: Проверить, что все 15 файлов созданы** + +```bash +ls -la .tmp/audit/stage1_*.txt | wc -l +``` + +Expected: ≥15. Если меньше — STOP, разобраться с группой, не создавшей файл. + +- [ ] **Step 7: Создать `stage1_summary.md` (компактная сводка для субагентов)** + +Read all 15 stage1_*.txt files и сгенерировать `.tmp/audit/stage1_summary.md` по шаблону: + +```markdown +# Stage 1 Summary — 2026-05-09 +## A. Markdown / docs +### A1 markdownlint (`stage1_markdownlint.txt`, EXIT:N) +- Total errors: N +- Top files: ... +### A2 cspell (...) +... + +## B. БД +### B1 grep CREATE TABLE +- Total tables: N (from grep count) +- Duplicates: N (uniq count > 1) +### B2 orphan-FK (`stage1_grep_orphan_fk.txt`) +- Содержимое файла дословно (если пустой — "0 orphan-FK") +### B3 squawk (...), B4 pgFormatter (...) + +## C. Backend +### C1 Pest: X/Y PASS / N FAIL +### C2 Larastan: N errors / N above baseline +### C3 composer outdated: N direct deps outdated +### C4 composer audit: N CVEs + +## D. Frontend +### D1 vue-tsc: N errors +### D2 ESLint: N errors / N warnings +### D3 Vitest: X/Y PASS / N FAIL + +## E. Корень +### E1 npm outdated: N deps outdated +``` + +Это компактный snapshot ~50-100 строк, который раздаётся 6 субагентам как контекст. + +- [ ] **Step 8: Commit checkpoint (без stage1 raw)** + +`stage1_*` НЕ коммитятся (`.tmp/` в `.gitignore`). Просто mark progress в TodoWrite. + +--- + +## Phase 2: 6 параллельных субагентов + +### Task 2: Подготовка R-rules excerpt для субагентов + +**Files:** + +- Create: `.tmp/audit/r_rules_excerpt.md` + +- [ ] **Step 1: Извлечь priority chain CLAUDE.md §1 + R-правила Plugin_stack_rules_v1** + +Read CLAUDE.md §1 (priority chain) и Plugin_stack_rules_v1 v1.3 (только R0.1, R6, R6.1, R10, R11, R13). Скомпилировать в `.tmp/audit/r_rules_excerpt.md` ~80-120 строк: + +```markdown +# R-Rules Excerpt for Subagents + +## Priority Chain (CLAUDE.md §1) +0. Pravila §12 — Superpowers hard rule +1. Pravila +2. CLAUDE.md +3. Plugin_stack_rules_v1 +4. .claude/settings.json +5. memory/*.md +6. прочие плагины + +При конфликте — верхний уровень побеждает. + +## R0.1 — scope «головенства» Plugin_stack_rules_v1 +Stack головной только над уровнями 4-6 (settings.json, memory, прочие плагины), +не над 0-2 (Pravila §12, Pravila, CLAUDE.md). + +## R6 — стек-фильтр Vue+Vuetify +[краткая выдержка из Plugin_stack_rules_v1] + +## R6.1 — hard-override Forest +[краткая выдержка] + +## R10 — внешние плагины как инструменты +[реестр + правило «только по явному /команде»] + +## R11 — иерархия 6 источников истины UI/UX +Brandbook → ТЗ+schema → FD → Boost guidelines → ui-ux-pro-max → Vue/Vuetify docs + +## R13 — decision matrix (для аудита: §12 hard rule applies) +[краткая выдержка] + +## Pravila §13.9 — hard-link на R10 +Байпас stack-gate без явной /команды или R0.4.A исключения = нарушение §13. +``` + +Expected: 1 файл, готовый к раздаче 6 субагентам. + +### Task 3: Параллельный диспатч 6 субагентов через `dispatching-parallel-agents` skill + +**Files:** + +- Create: `.tmp/audit/stage2_.md` (×6: narrative, db, handoff, backend, frontend, configs) + +- [ ] **Step 1: Активировать skill `superpowers:dispatching-parallel-agents`** + +Read skill content. Skill подтвердит шаблон диспатча и проверки независимости задач. + +- [ ] **Step 2: Подготовить 6 промптов субагентам** + +Каждому — единый шаблон с 4 секциями: + +``` +ROLE: Subagent D{N} — {domain} +ZONE: {точные пути из spec §6 для этого агента} + +INPUTS: +- spec: docs/superpowers/specs/2026-05-09-project-audit-design.md (читать ОБЯЗАТЕЛЬНО §1, §3, §6, §7) +- stage1 summary: .tmp/audit/stage1_summary.md (твой блок: {A/B/C/D/E относится к этому домену}) +- stage1 raw для твоей зоны: .tmp/audit/stage1_{соответствующие файлы}.txt +- R-rules: .tmp/audit/r_rules_excerpt.md (читать ВСЁ для R-CHECKS) + +CHECKLIST (см. spec §7): +- общий чеклист DEFECT (P) + IMPROVEMENT (O) + R-CHECKS +- доменные таргеты для D{N} (см. §6 и §7 spec'а) + +OUTPUT: +- Записать stage2_{domain}.md в .tmp/audit/ по шаблону spec §6 (P0/P1/P2 + O-perf/O-refactor/O-stack + Notes) +- Каждая находка содержит: файл:строка, цитата, сравнение/предложение, усилие S/M/L +- Если P0 > 10 — добавить в Notes пометку "EARLY-STOP CANDIDATE: P0 count = N" + +CONSTRAINTS: +- НЕ призывать FD plugin / simplify / security-review / review / init / claude-md-management + (R10: только по явному /команде заказчика, у тебя её нет) +- НЕ делать правок в исходниках проекта — только записать в stage2_{domain}.md +- НЕ создавать новых файлов вне .tmp/audit/ +- При нахождении UI-нестыковки → фиксировать как находку, не делегировать FD + +DONE WHEN: +- stage2_{domain}.md существует, валидный markdown +- Каждая находка имеет file:line + цитату + сравнение/предложение +- 0 «TBD» в выходе +``` + +Заменить `{N}` / `{domain}` / `{...zone}` точными значениями из spec §6 для каждого из 6 субагентов. + +- [ ] **Step 3: Дисспатчить 6 субагентов одним сообщением (parallel)** + +Через `Agent` tool, все 6 в одном tool-call message: + +``` +Agent D1: subagent_type=Explore, prompt=<заполненный шаблон D1 narrative> +Agent D2: subagent_type=Explore, prompt=<заполненный шаблон D2 db> +Agent D3: subagent_type=Explore, prompt=<заполненный шаблон D3 handoff> +Agent D4: subagent_type=Explore, prompt=<заполненный шаблон D4 backend> +Agent D5: subagent_type=Explore, prompt=<заполненный шаблон D5 frontend> +Agent D6: subagent_type=Explore, prompt=<заполненный шаблон D6 configs> +``` + +`subagent_type=Explore` — read-only агент с Glob/Grep/Read/WebFetch (без Edit/Write/Bash, кроме записи stage2_*.md). Если требуется Bash для повторного grep по живой схеме — заменить на `general-purpose`. + +Expected wall-clock: 30-60 мин (по spec §11). + +- [ ] **Step 4: Получить 6 `stage2_.md`, проверить наличие** + +```bash +ls -la .tmp/audit/stage2_*.md | wc -l +``` + +Expected: ровно 6. Если меньше — STOP, разобраться какой агент не вернул файл, перезапустить только его. + +### Task 4: Early-stop check (предохранитель) + +**Files:** + +- Read: `.tmp/audit/stage2_*.md` + +- [ ] **Step 1: Подсчёт P0-находок в каждом `stage2_.md`** + +```bash +for f in .tmp/audit/stage2_*.md; do + domain=$(basename "$f" .md | sed 's/stage2_//') + p0_count=$(grep -cE "^### P0-" "$f" || echo 0) + echo "$domain: P0=$p0_count" +done > .tmp/audit/stage2_p0_counts.txt +cat .tmp/audit/stage2_p0_counts.txt +``` + +Expected: 6 строк вида `narrative: P0=N`. Сохранить вывод в файл. + +- [ ] **Step 2: Условный early-stop** + +Если **ЛЮБОЙ** домен показывает `P0 > 10`: + +1. STOP processing. +2. Показать заказчику: + - Имя домена и точное число P0. + - Список из топ-10 P0-заголовков из этого `stage2_.md` (через `grep "^### P0-" .tmp/audit/stage2_.md | head -10`). +3. Спросить через `AskUserQuestion`: + - «А — продолжаем остальные 5 субагентов до конца, фиксы потом» + - «Б — фиксим этот блок сначала, потом доделаем» + - «В — отбой, отчёт не нужен» + +Только после ответа продолжать с Task 5 или прерываться. + +Если **все** домены `P0 ≤ 10`: + +- Записать `EARLY_STOP=NO` в `.tmp/audit/stage2_p0_counts.txt` +- Продолжать с Task 5. + +--- + +## Phase 3: Консолидация (этап 3 spec'а) + +### Task 5: Сбор всех находок в единый поток + +**Files:** + +- Create: `.tmp/audit/stage3_aggregated.md` + +- [ ] **Step 1: Конкатенация 6 stage2 файлов с маркерами домена** + +```bash +{ + for f in .tmp/audit/stage2_*.md; do + domain=$(basename "$f" .md | sed 's/stage2_//') + echo "" + cat "$f" + echo "" + done +} > .tmp/audit/stage3_aggregated.md +``` + +Expected: 1 файл со всеми находками, между блоками — комментарий с именем домена для последующей атрибуции. + +### Task 6: Дедупликация по `(file, line, category)` + +**Files:** + +- Read: `.tmp/audit/stage3_aggregated.md` +- Create: `.tmp/audit/stage3_dedup_map.md` + +- [ ] **Step 1: Парсинг находок и поиск дубликатов** + +Прочитать `stage3_aggregated.md` Read tool'ом. Для каждой находки извлечь ключ `(file, line, category)` (где category — из шапки `### P0-XX` / `### O-perf-XX` / etc). + +Если две находки имеют одинаковый ключ: + +- Объединить описания (взять более полное). +- В `stage3_dedup_map.md` записать: ``. + +Если ключи уникальны — оставить как есть. + +Expected: 1 файл-карта со списком дубликатов и решений по ним. Если дубликатов 0 — файл содержит строку `0 duplicates found`. + +### Task 7: Переклассификация приоритетов + +**Files:** + +- Read: `.tmp/audit/stage3_aggregated.md` + `.tmp/audit/stage3_dedup_map.md` +- Create: `.tmp/audit/stage3_reclassified.md` + +- [ ] **Step 1: Применить критерии spec §3 к каждой находке** + +Критерии: + +- **P0:** orphan-FK, противоречия ТЗ↔schema, дубли CREATE TABLE, утечки секретов, RLS-провалы на tenant-таблицах, **stack-нарушения (Pravila §13.9 hard-link на R10)**. +- **P1:** устаревшие метрики в шапке, битые внутрипроектные ссылки, дубли правил, расхождение версий между источниками истины. +- **P2:** орфография, формат, линт без семантики. +- **O-perf / O-refactor / O-stack:** по spec §3. + +Если субагент промаркировал, например, метрику в шапке как P0 — переклассифицировать в P1. + +Записать результат в `stage3_reclassified.md` с пометкой `` для каждой переклассифицированной. + +### Task 8: Генерация финального отчёта `docs/audit_2026-05-09.md` + +**Files:** + +- Create: `docs/audit_2026-05-09.md` + +- [ ] **Step 1: Собрать раздел 1 «Резюме»** + +5-10 строк по форме: + +```markdown +## 1. Резюме + +Аудит проекта Лидерра на 09.05.2026 (commit ). Охват: docs + db + Laravel + Vue + handoff + конфиги. + +Найдено: P0=N, P1=N, P2=N, O-perf=N, O-refactor=N, O-stack=N, Отложенное=N (из реестра + workaround-маркеров). + +Главные блокеры (P0): <2-3 строки самого критичного>. +Главные возможности (O): <2-3 строки самого полезного>. +``` + +Числа берутся из `stage3_reclassified.md`. + +- [ ] **Step 2: Собрать разделы 2-4 «Дефекты P0/P1/P2»** + +Из `stage3_reclassified.md` отфильтровать P0/P1/P2 находки и записать по шаблону spec §2 (точно): + +```markdown +## 2. Дефекты P0 +### P0-01 — <имя> +- Файл: : +- Категория: <фактическая нестыковка | дубль | устаревшая версия | битая ссылка | stack-нарушение> +- Цитата: «...» +- Сравнение: «X в A» vs «Y в B» +- Предлагаемая правка: <конкретно> +- Усилие: S/M/L +``` + +Expected: разделы 2-4 заполнены, нумерация P0-XX/P1-XX/P2-XX последовательная. + +- [ ] **Step 3: Собрать раздел 5 «Возможности улучшения»** + +Подразделы 5.1 O-perf, 5.2 O-refactor, 5.3 O-stack по шаблону spec §6: + +```markdown +### 5.1 Оптимизация (O-perf) +#### O-perf-01 — <имя> +- Файл: : +- Категория: N+1 / missing index / bundle size / RLS predicate / ... +- Текущее поведение: <описание> +- Предлагаемое улучшение: <конкретно> +- Профит: <качественно> +- Риск: low/medium/high +- Усилие: S/M/L +``` + +- [ ] **Step 4: Собрать раздел 6 «Отложенное» (НЕ дефекты)** + +Прочитать `docs/Открытые_вопросы_v8_3.md` и собрать активные вопросы по префиксам (Биз-, CTO-, Ю-, Диз-, DO-, OPEN-). Также из CLAUDE.md/narrative выгрести явные `workaround until X` маркеры: + +- Б-1 (реквизиты юр. лица) +- pg_partman → Artisan-cron +- Histoire 1.0-beta.1 ↔ Vite 8 совместимость + +Expected: 6.1 Открытые вопросы (список цитатами + ссылками на реестр), 6.2 Workaround-ы (3+ пункта). + +- [ ] **Step 5: Собрать раздел 7 «Метрики проекта на момент аудита»** + +Перепрогнать факт-метрики: + +```bash +# Schema +grep -cE "^CREATE TABLE\s+\w+" db/schema.sql +grep -cE "^CREATE TABLE\s+\w+_\d{4}_\d{2}" db/schema.sql # партиции +grep -cE "^CREATE INDEX|^CREATE UNIQUE INDEX" db/schema.sql +grep -cE "ENABLE ROW LEVEL SECURITY|CREATE POLICY" db/schema.sql +grep -cE "^CREATE FUNCTION|^CREATE OR REPLACE FUNCTION" db/schema.sql +grep -cE "^CREATE TRIGGER" db/schema.sql + +# Tests (последний прогон) +grep -E "Tests:" .tmp/audit/stage1_pest.txt | tail -1 +grep -E "Test Files|Tests" .tmp/audit/stage1_vitest.txt | tail -2 +``` + +Сравнить с шапками CLAUDE.md (заявлено 56/12/95/37/5/13 и Pest 416/416 + Vitest 416/416). Расхождения — таблицей. + +- [ ] **Step 6: Раздел 8 «Что НЕ покрыто аудитом» и Приложение A** + +Перечислить: + +- `web/v8/*.html` (старые концепты) +- `лендинг/` (⏸ Б-1) +- `node_modules/`, `vendor/` +- Любые обнаруженные blind spots, на которые тулы не отработали. + +Приложение A — список файлов в `.tmp/audit/stage1_*.txt` с их размерами и exit-кодами: + +```bash +for f in .tmp/audit/stage1_*.txt; do + exit_line=$(tail -1 "$f") + size=$(wc -l < "$f") + echo "- $(basename "$f"): $size lines, $exit_line" +done +``` + +- [ ] **Step 7: Шапка отчёта и сводка** + +```markdown +# Аудит проекта Лидерра — 2026-05-09 +**Версия:** 1.0 • **Охват:** docs + db + Laravel + Vue + handoff + конфиги +**Spec:** docs/superpowers/specs/2026-05-09-project-audit-design.md v1.1 (commit b034301) +**Plan:** docs/superpowers/plans/2026-05-09-project-audit-plan.md +**Сводка:** P0=N, P1=N, P2=N, O-perf=N, O-refactor=N, O-stack=N, Отложенное=N +``` + +Заполнить N из stage3_reclassified. + +--- + +## Phase 4: Self-Review + Code Review + Commit (этап 4 spec'а) + +### Task 9: Self-review через `superpowers:verification-before-completion` skill + +**Files:** + +- Read: `docs/audit_2026-05-09.md` + +- [ ] **Step 1: Активировать skill `superpowers:verification-before-completion`** + +Read skill content. Skill требует evidence перед claim'ом «готово». + +- [ ] **Step 2: Verify все file:line ссылки в отчёте существуют** + +Извлечь все `:` из отчёта regex'ом, для каждого: + +```bash +# Пример проверки +test -f "docs/CRM_bp-gr_Инструкция_v8_5.md" && echo "OK: docs/CRM_bp-gr_Инструкция_v8_5.md" || echo "MISSING: docs/CRM_bp-gr_Инструкция_v8_5.md" +``` + +Expected: 100% ссылок существуют. Если хоть одна MISSING — STOP, поправить отчёт. + +- [ ] **Step 3: Verify метрики в §7 отчёта совпадают с фактом** + +Перепрогнать команды из Task 8 Step 5 ещё раз, сравнить с записанным в отчёт. + +Expected: 100% совпадение. При расхождении — поправить отчёт (факт побеждает). + +- [ ] **Step 4: Verify 0 placeholders** + +```bash +grep -nE "TBD|TODO|FIXME|XXX|placeholder|<имя>|||<категория>|<описание>|<конкретно>" docs/audit_2026-05-09.md +``` + +Expected: пустой вывод (только legitimate упоминания «0 TBD» в чеклистах НЕ должны попадать). Если есть — поправить. + +- [ ] **Step 5: Verify 0 цитат без атрибуции** + +Найти все `Цитата: «...»` в отчёте и проверить, что у каждой выше есть `Файл: :`. + +```bash +awk '/^- Цитата:/ {print NR": цитата без файла"; next} /^- Файл:/ {has_file=1} /^### / {has_file=0}' docs/audit_2026-05-09.md +``` + +Expected: пустой вывод. + +- [ ] **Step 6: Verify 0 R-нарушений в самом отчёте (мета-проверка)** + +Проверить, что отчёт сам не нарушает Plugin_stack_rules_v1: + +```bash +# Не призываем FD plugin для не-UI задач +grep -nE "FD plugin|Frontend Design|frontend-design plugin" docs/audit_2026-05-09.md | grep -v "НЕ призывается\|НЕ применяется" +# Не предлагаем simplify/security-review/review/init без явного /команды +grep -nE "simplify|security-review|/review|/init" docs/audit_2026-05-09.md | grep -v "НЕ призывается\|R10\|spec" +``` + +Expected: пусто (или только legitimate упоминания в контексте «не применяется»). + +### Task 10: Code review отчёта через `superpowers:requesting-code-review` skill + +**Files:** + +- Read: `docs/audit_2026-05-09.md` + +- [ ] **Step 1: Активировать skill `superpowers:requesting-code-review`** + +Read skill content. Skill подтвердит шаблон диспатча code review subagent'а. + +- [ ] **Step 2: Дисспатчить независимого reviewer-субагента** + +Через `Agent` tool, `subagent_type=Explore`: + +``` +ROLE: Independent reviewer of project audit report. + +CONTEXT: +- Spec: docs/superpowers/specs/2026-05-09-project-audit-design.md (v1.1) +- Plan: docs/superpowers/plans/2026-05-09-project-audit-plan.md +- Report (твой объект review): docs/audit_2026-05-09.md +- R-rules excerpt: .tmp/audit/r_rules_excerpt.md + +CHECK: +1. Внутренняя консистентность: §1 резюме ↔ §2-5 находки ↔ §7 метрики (числа сходятся). +2. Классификация: каждый P0/P1/P2 соответствует критериям spec §3. +3. Шаблон: каждая находка имеет файл:строку + цитату + сравнение/предложение + усилие. +4. R-консистентность: отчёт не призывает FD plugin / simplify / security-review / review / init без явного /команды (R10); + не предписывает иерархию источников UI/UX вне R11; не байпасит §12 hard rule. +5. 0 placeholders / 0 цитат без атрибуции / 0 битых file:line ссылок. + +OUTPUT: +- Записать review в .tmp/audit/stage4_code_review.md +- Формат: список замечаний по приоритетам Critical / Major / Minor / Nit. +- Вердикт: PASS / FAIL. + +DO NOT MAKE EDITS to docs/audit_2026-05-09.md. Только review. +``` + +- [ ] **Step 3: Прочитать review, применить замечания** + +Read `.tmp/audit/stage4_code_review.md`. + +- Если PASS и 0 Critical / 0 Major — продолжать с Task 11. +- Если FAIL или есть Critical / Major — поправить `docs/audit_2026-05-09.md` по замечаниям. Затем перезапустить Task 9 (self-review) и Task 10 (повторный code review). +- Если есть только Minor / Nit — пометить в TodoWrite, поправить, продолжать. + +### Task 11: Финальный коммит + +**Files:** + +- Commit: `docs/audit_2026-05-09.md` + +- [ ] **Step 1: Verify clean stage перед коммитом** + +```bash +git status --short +``` + +Expected: только один файл `?? docs/audit_2026-05-09.md` или `M docs/audit_2026-05-09.md`. Если ещё что-то — разобраться. + +- [ ] **Step 2: Stage и commit** + +```bash +git add docs/audit_2026-05-09.md +git commit -m "$(cat <<'EOF' +docs(audit): сводный отчёт аудита проекта на 2026-05-09 — P-дефекты + O-возможности + +По spec v1.1 (b034301) и plan'у 2026-05-09-project-audit-plan.md: +- 4 этапа: 15 CLI-тулов parallel + 6 субагентов parallel + консолидация + self-review. +- Покрытие: docs (16 .md + Pravila/Plugin_stack_rules_v1/Tooling/CLAUDE.md/README) + db (4 файла) + handoff + Laravel + Vue + 10 конфигов корня. +- Категории: P0/P1/P2 + O-perf/O-refactor/O-stack + Отложенное (открытые вопросы + workaround-ы). +- R-CHECKS под Plugin_stack_rules_v1 v1.3 включены в чеклист и DoD. + +Сводка: P0=N, P1=N, P2=N, O-perf=N, O-refactor=N, O-stack=N, Отложенное=N. + +Сам отчёт — диагностический. Реализация правок — отдельный flow по решению заказчика. + +Co-Authored-By: Claude Opus 4.7 (1M context) +EOF +)" +``` + +Заменить `N` на актуальные числа из отчёта в commit message. + +- [ ] **Step 3: Verify commit** + +```bash +git log -1 --stat +``` + +Expected: 1 файл в коммите (`docs/audit_2026-05-09.md`), pre-commit hooks (gitleaks, markdownlint, cspell) PASS. + +- [ ] **Step 4: Update memory `project_state.md`** + +Через Edit tool обновить запись project_state.md в memory: добавить факт «09.05.2026 закоммичен сводный отчёт аудита (commit ``) — P0=N, P1=N, P2=N, O-perf=N, O-refactor=N, O-stack=N. Реализация правок — отдельные flow». + +- [ ] **Step 5: Cleanup `.tmp/audit/`** + +```bash +# Не удалять — может пригодиться для повторного просмотра raw output +echo "Stage 1-4 артефакты в .tmp/audit/ — НЕ коммитятся (.gitignore), НЕ удаляются. Удалить вручную при следующей чистке .tmp/." +``` + +--- + +## DoD (соответствие spec §10) + +- [x] Этап 1 завершён — 15 тулов прогнаны, raw output в `.tmp/audit/stage1_*.txt`. (Tasks 1) +- [x] Этап 2 завершён — 6 `stage2_.md` собраны. (Tasks 3-4) +- [x] Этап 3 завершён — `docs/audit_2026-05-09.md` сгенерирован, дедуп пройден, приоритеты выровнены. (Tasks 5-8) +- [x] Self-review (verification-before-completion) пройден. (Task 9) +- [x] Code review через `requesting-code-review` skill — PASS. (Task 10) +- [x] Коммит финального отчёта. (Task 11) + +**Не входит в DoD:** реализация правок по находкам отчёта (отдельный flow по решению заказчика). + +--- + +## Бюджет (соответствие spec §11) + +| Этап | Wall-clock | +|---|---| +| Phase 0 setup | 2-3 мин | +| Phase 1 sweep тулами (Task 1) | 10-15 мин | +| Phase 2 субагенты (Tasks 2-4) | 30-60 мин | +| Phase 3 консолидация (Tasks 5-8) | 15-30 мин | +| Phase 4 self-review + code review + commit (Tasks 9-11) | 10-20 мин | +| **Итого** | **~1.5-2 часа** | + +--- + +## Early-Stop Decision Tree + +``` +Phase 2 subagents return + ↓ +For each stage2_.md: count P0 + ↓ + ┌─ Any P0 > 10? ─┐ + │ │ + YES NO + │ │ + ↓ ↓ +STOP Continue +Show user Phase 3 +top-10 P0 (consolidation) + │ + ↓ +AskUserQuestion: +А) continue rest 5 subagents +Б) fix this block first +В) abort + │ + ↓ +Apply user choice +``` + +Early-stop срабатывает один раз на subagent с >10 P0. После решения заказчика — продолжать или прерывать аудит. + +--- + +## Risks (соответствие spec §13) + +- **Риск:** Какой-либо тул в Phase 1 падает (например, Pest при сломанной БД). Митигация — не блокировать прогон, exit-код фиксируется в файл, субагенту скармливаются raw outputs. +- **Риск:** Субагент возвращает `stage2_.md` с 0 находок (false-negative). Митигация — code review на Phase 4 проверяет полноту. +- **Риск:** Дедуп Phase 3 объединяет разные находки с одинаковым `(file, line)` ошибочно. Митигация — `stage3_dedup_map.md` фиксирует все слияния, code review проверяет. +- **Риск (предохранитель):** Early-stop на одном из 6 субагентов. Это не риск, а фича — позволяет заказчику решить рано, до затрат на оставшиеся 5.