docs(plan-audit): implementation plan для аудита проекта на 2026-05-09
По 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) <noreply@anthropic.com>
This commit is contained in:
@@ -849,6 +849,8 @@ override
|
||||
банов
|
||||
SRP
|
||||
тулами
|
||||
тул
|
||||
коммитится
|
||||
|
||||
# v1.81 — Plugin Stack Rules v1.3 (Frontend Design + Superpowers paired stack)
|
||||
инвокация
|
||||
|
||||
@@ -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_<domain>.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_<domain>.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_<domain>.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_<domain>.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_<domain>.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_<domain>.md` (через `grep "^### P0-" .tmp/audit/stage2_<domain>.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 "<!-- DOMAIN: $domain -->"
|
||||
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` записать: `<key> → <merged description from domains [A, B]>`.
|
||||
|
||||
Если ключи уникальны — оставить как есть.
|
||||
|
||||
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` с пометкой `<!-- reclassified from <old> to <new> -->` для каждой переклассифицированной.
|
||||
|
||||
### 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 <HEAD>). Охват: 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 — <имя>
|
||||
- Файл: <path>:<line>
|
||||
- Категория: <фактическая нестыковка | дубль | устаревшая версия | битая ссылка | 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 — <имя>
|
||||
- Файл: <path>:<line>
|
||||
- Категория: 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 ссылки в отчёте существуют**
|
||||
|
||||
Извлечь все `<path>:<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|<имя>|<path>|<line>|<категория>|<описание>|<конкретно>" docs/audit_2026-05-09.md
|
||||
```
|
||||
|
||||
Expected: пустой вывод (только legitimate упоминания «0 TBD» в чеклистах НЕ должны попадать). Если есть — поправить.
|
||||
|
||||
- [ ] **Step 5: Verify 0 цитат без атрибуции**
|
||||
|
||||
Найти все `Цитата: «...»` в отчёте и проверить, что у каждой выше есть `Файл: <path>:<line>`.
|
||||
|
||||
```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) <noreply@anthropic.com>
|
||||
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 `<hash>`) — 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_<domain>.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_<domain>.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_<domain>.md` с 0 находок (false-negative). Митигация — code review на Phase 4 проверяет полноту.
|
||||
- **Риск:** Дедуп Phase 3 объединяет разные находки с одинаковым `(file, line)` ошибочно. Митигация — `stage3_dedup_map.md` фиксирует все слияния, code review проверяет.
|
||||
- **Риск (предохранитель):** Early-stop на одном из 6 субагентов. Это не риск, а фича — позволяет заказчику решить рано, до затрат на оставшиеся 5.
|
||||
Reference in New Issue
Block a user