Single-commit clean baseline after security scrub of niche-tells, project codenames, internal jargon, and contributor-email leaks. Contents: - 100 Rust crates (_primitives/_rust/) - 37 agent manifests (_manifests/) + generated specs (_generated/) - 67 user-invocable skills (skills/) - 33 hooks (hooks/) - Composition blocks (_blocks/) - Documentation (docs/, README.md) - TS adapter packages (_ts_packages/) - Assembler (_assembler/) - Roles (_roles/) - Templates (_templates/) - Forgejo CI (.forgejo/) Author: Denis Parfionovich <info@greendragon.info> License: see LICENSE.
24 KiB
| name | description |
|---|---|
| wave-audit | 3-wave parallel audit — Wave 1 discovery (4 agents), Wave 2 verification (4 agents), Wave 3 cross-optimization (1 synthesizer). Each wave runs agents in parallel. Combines security review, runtime analysis, quality check, and constructor pattern into one unified workflow with evidence grading and Go/No-Go verdict. |
/wave-audit — 3-Wave Parallel Audit
Один аудитор находит 60%. Два параллельных — 80%. Три волны с перекрёстной проверкой — 95%+. Доказано экспериментом 2026-03-24: ни один подход в изоляции не покрыл все findings.
Команды
/wave-audit→ полный review (3 волны, все фокусы)/wave-audit review [focus]→ выборочный review/wave-audit lite→ быстрый режим (2 агента Wave 1, без Wave 2, упрощённый Wave 3)/wave-audit diff→ инкрементальный (только изменённые файлы + их зависимости)/wave-audit apply→ применить фиксы в worktree (после approve)
focus: security | runtime | quality | structure | all (default: all)
Anti-Hallucination Protocol
AI галлюцинирует. Это не баг, это свойство. Skill ОБЯЗАН это компенсировать.
Правило CODE_QUOTE
Каждый finding ОБЯЗАН содержать дословную цитату кода (3-7 строк), НЕ описание.
BAD: "Функция не верифицирует JWT подпись"
GOOD: "apple.ts:72-74: `const decoded = jwt.decode(idToken, { complete: true });`
— jwt.decode() НЕ верифицирует подпись, нужен jwt.verify()"
Если агент НЕ может процитировать код — finding отклоняется как unverified.
Правило VERIFY_CMD
Каждый finding ОБЯЗАН содержать команду верификации — как подтвердить без чтения кода:
verify: grep -n "jwt.decode" apps/api/src/external/oauth/apple.ts
verify: wc -l apps/api/src/services/auth.service.ts # expect >200
verify: grep -rn "new AuthService" apps/api/src/ # count instantiations
Правило COVERAGE_LOG
Каждый агент Wave 1 ОБЯЗАН в конце отчёта указать:
FILES_READ: [список файлов которые реально открыл через Read tool]
FILES_TOTAL: [общее число source files]
COVERAGE: N% (read/total)
NOT_CHECKED: [список файлов/модулей которые НЕ проверял]
Правило SEVERITY_CALIBRATION
Перед назначением severity, агент ОБЯЗАН ответить на вопрос:
- CRITICAL: "Можно ли эксплуатировать прямо сейчас без аутентификации?" Если нет → max HIGH.
- HIGH: "Приведёт ли это к потере данных или компрометации в production?" Если нет → max MEDIUM.
- MEDIUM: "Заметит ли это пользователь?" Если нет → LOW.
Phase 0 — Baseline Snapshot
Выполняет lead (не агент). Обязательно ДО запуска Wave 1.
- Проверить что это git-репозиторий
- Определить реальный стек (НЕ из memory — читать package.json / pubspec.yaml / go.mod / Cargo.toml)
- Снять baseline:
git log --oneline -5— последние коммитыgit status --short— текущее состояниеgit diff --stat— незакоммиченные изменения
- Определить и запустить CI-проверки стека:
- JS/TS:
npm run lint,npm run build,npm test(или turbo/nx аналоги) - Flutter:
flutter analyze,flutter test - Go:
go vet ./...,go build ./...,go test ./... - Python:
ruff check .,pytest - Rust:
cargo clippy,cargo build,cargo test
- JS/TS:
- Зафиксировать baseline-метрики:
BASELINE: - lint: PASS/FAIL (N warnings, M errors) - build: PASS/FAIL - tests: PASS/FAIL (N passed, M failed, K skipped) - stack: [detected stack] - files: [total source files count]
Wave 1 — Discovery (4 параллельных агента)
Создать TeamCreate, запустить 4 агента ОДНИМ сообщением (параллельно). Каждый агент работает независимо, НЕ знает о findings других.
Agent: w1-security
Проведи security review проекта [path].
Стек: [из baseline]. НЕ применяй фиксы.
Phase 1 — Risk Classification:
- HIGH: auth, crypto, network, memory, deserialization, FFI
- MEDIUM: input validation, error handling, config, logging, API
- LOW: docs, tests, formatting
Phase 2 — Vulnerability Checklist:
- [ ] Input validation — все входные данные валидируются?
- [ ] Auth/authz bypass — можно обойти?
- [ ] Race condition — shared state без lock? TOCTOU?
- [ ] Injection — SQL, command, path traversal, SSTI?
- [ ] Secrets — hardcoded keys, tokens в логах?
- [ ] Deserialization — untrusted input в unmarshal/decode?
- [ ] Resource exhaustion — unbounded allocations, missing timeouts?
- [ ] Crypto — правильные алгоритмы? верификация подписей?
Phase 3 — Supply Chain:
Для КАЖДОЙ зависимости: maintainers, activity, CVE, transitive deps, dead deps.
Каждый finding ОБЯЗАН содержать:
1. severity (CRITICAL/HIGH/MEDIUM/LOW) — пройди SEVERITY_CALIBRATION
2. файл:строка
3. CODE_QUOTE (3-7 строк дословно)
4. attack scenario
5. VERIFY_CMD (команда для подтверждения)
6. [E1-E6] evidence grade
В конце — COVERAGE_LOG: какие файлы читал, какие нет.
Отдай как structured list.
Agent: w1-runtime
Проведи runtime/performance review проекта [path].
Стек: [из baseline]. НЕ применяй фиксы.
Checklist:
- [ ] N+1 queries — ORM/DB calls в циклах или per-item resolvers
- [ ] Data joins — merge по индексу вместо ключа? silent corruption?
- [ ] Cache invalidation — JSON.parse теряет типы? stale data?
- [ ] Hot paths — какие функции на критическом пути?
- [ ] Allocations — per-request instantiation? можно singleton?
- [ ] I/O — sync operations на async path? blocking calls?
- [ ] Complexity — O(n²) или хуже в hot loops?
- [ ] Renders/rebuilds — лишние re-renders в UI? missing memo?
- [ ] Timeouts — есть ли на внешних API calls? unbounded waits?
- [ ] Connection pools — DB/Redis connections managed?
Каждый finding ОБЯЗАН содержать:
1. severity — пройди SEVERITY_CALIBRATION
2. файл:строка
3. CODE_QUOTE (3-7 строк дословно)
4. impact estimate (latency/memory/throughput)
5. VERIFY_CMD
6. [E1-E6] evidence grade
В конце — COVERAGE_LOG.
Agent: w1-quality
Проведи quality review проекта [path].
Стек: [из baseline]. НЕ применяй фиксы.
Checklist:
- [ ] DRY — дублированный код? одинаковая логика в разных файлах?
- [ ] SRP — файл делает больше одного? mixed responsibilities?
- [ ] Naming — нечитаемые имена? inconsistent conventions?
- [ ] Dead code — unreachable branches? unused exports/imports?
- [ ] Edge cases — null/undefined handling? empty arrays? boundary values?
- [ ] Error handling — consistent pattern? fail open vs fail closed?
- [ ] Error messages — информативные? не leakают internal details?
- [ ] Type safety — any/unknown? missing generics? loose types?
- [ ] API boundaries — чёткие контракты между модулями?
Каждый finding ОБЯЗАН содержать:
1. severity — пройди SEVERITY_CALIBRATION
2. файл:строка
3. CODE_QUOTE (3-7 строк дословно)
4. impact
5. VERIFY_CMD
6. [E1-E6] evidence grade
В конце — COVERAGE_LOG.
Agent: w1-structure
Проведи structural review проекта [path].
Стек: [из baseline]. НЕ применяй фиксы.
Constructor Pattern Checklist:
- [ ] Файлы >200 строк — перечисли ВСЕ с точным LOC
- [ ] Функции >30 строк — перечисли ВСЕ с точным LOC
- [ ] 1 файл = 1 класс = 1 ответственность — нарушения?
- [ ] Types/interfaces определены ДО реализации?
- [ ] SSOT — типы, enum, routes, configs дублируются?
CI/Pipeline Check:
- [ ] Все команды из CI (lint/build/test) проходят?
- [ ] Есть ли пустые stubs/packages ломающие pipeline?
- [ ] Lock-файлы актуальны?
Dependency Health:
- [ ] Unused dependencies (installed but never imported)
- [ ] Outdated deps (major version behind)
- [ ] Conflicting deps (multiple packages для одной задачи)
Каждый finding ОБЯЗАН содержать:
1. severity — пройди SEVERITY_CALIBRATION
2. файл:строка
3. CODE_QUOTE или точные числа (LOC count)
4. VERIFY_CMD (например: `wc -l file.ts`)
5. [E1-E6] evidence grade
В конце — COVERAGE_LOG.
Сбор результатов Wave 1
Lead собирает findings от всех 4 агентов в единый список.
Формат: W1-{agent}-{N}: [severity] description [evidence grade]
Wave 2 — Verification (4 параллельных агента)
Запустить 4 агента ОДНИМ сообщением, передав КАЖДОМУ полный список findings из Wave 1.
Agent: w2-false-positive-filter
Получи ВСЕ findings из Wave 1: [список]
Проект: [path], стек: [стек].
Для КАЖДОГО finding:
1. Прочитай код по указанному файлу:строке
2. Это РЕАЛЬНАЯ проблема или false positive?
3. Если false positive — ПОЧЕМУ (например: "anon key публичный by design Supabase")
4. Если реальная — подтверди severity или скорректируй
Output:
- CONFIRMED: [finding ID] — [подтверждённый severity]
- DOWNGRADED: [finding ID] — [новый severity] — [причина]
- REJECTED: [finding ID] — [причина]
Agent: w2-gap-hunter
Получи ВСЕ findings из Wave 1: [список]
Проект: [path], стек: [стек].
Задача: найти то, что Wave 1 ПРОПУСТИЛА.
1. Variant analysis: каждый найденный баг = КЛАСС. Проверь аналогичные места:
- Exact: тот же код в другом файле
- Structural: тот же паттерн в другом модуле
- Semantic: та же логическая ошибка с другим синтаксисом
2. Пробелы в покрытии:
- Какие файлы/модули Wave 1 не проверяла?
- Есть ли critical paths без findings? (подозрительно — или чисто, или пропущено)
3. Cross-domain gaps:
- Security нашёл auth issue — runtime проверил performance auth flow?
- Runtime нашёл N+1 — quality проверил error handling в том же resolver?
Output: список ДОПОЛНИТЕЛЬНЫХ findings с severity + файл:строка + [E1-E6].
Agent: w2-fix-impact
Получи ВСЕ findings из Wave 1: [список]
Проект: [path], стек: [стек].
Для каждого finding с предложенным фиксом:
1. Какие файлы затронет фикс? (blast radius)
2. Может ли фикс сломать существующий функционал?
3. Нужна ли миграция данных/токенов/состояния?
4. Зависит ли фикс от других фиксов? (порядок применения)
5. Estimated complexity: trivial / moderate / significant
Output:
- [finding ID]: blast_radius=[N files], breaks=[что может сломать], deps=[зависит от], complexity=[level]
Agent: w2-architecture-guard
Получи ВСЕ findings из Wave 1: [список]
Проект: [path], стек: [стек].
Для каждого предложенного фикса проверь:
1. Не нарушает ли Constructor Pattern? (файл останется <200? функция <30?)
2. Не создаёт ли новое дублирование? (SSOT)
3. Не вводит ли запрещённые паттерны? (миксины, DI-контейнеры, абстрактные фабрики)
4. Сохраняет ли API boundaries между модулями?
5. Совместим ли с текущей архитектурой проекта?
Если фикс нарушает архитектуру — предложи АЛЬТЕРНАТИВНЫЙ фикс.
Output:
- [finding ID]: architecture_safe=YES/NO, conflict=[описание], alternative=[если NO]
Сбор результатов Wave 2
Lead объединяет:
- Confirmed/rejected/downgraded findings
- New findings от gap-hunter
- Impact analysis
- Architecture conflicts
Wave 3 — Cross-Optimization (1 синтезатор)
Один агент получает ВСЕ данные из Wave 1 + Wave 2.
Agent: w3-synthesizer
Получи ВСЕ данные:
- Wave 1 findings: [список]
- Wave 2 verifications: [confirmed/rejected/downgraded]
- Wave 2 new findings: [от gap-hunter]
- Wave 2 impact analysis: [blast radius, deps]
- Wave 2 architecture conflicts: [список]
Проект: [path], стек: [стек], baseline: [метрики].
Задачи:
1. CROSS-DOMAIN ANALYSIS
Найди пересечения: security fix ломает performance?
Runtime optimization создаёт security hole?
Два фикса трогают один файл — порядок?
2. OPTIMAL SOLUTIONS
Для каждой группы связанных findings — найди ОДНО решение вместо N патчей.
Пример: 3 HTTP клиента с дублированным error handling → один base client.
Пример: N+1 + cache issue в одном resolver → DataLoader + cache fix вместе.
3. PRIORITY MATRIX
Ранжируй ВСЕ confirmed findings по формуле:
score = severity_weight × (1 / fix_complexity) × blast_radius_factor
severity: CRITICAL=10, HIGH=7, MEDIUM=4, LOW=1
complexity: trivial=1, moderate=0.5, significant=0.3
blast_radius: 1-3 files=1.0, 4-10=0.8, 10+=0.5
4. EVIDENCE GRADES
Каждый finding — [E1]-[E6] с обоснованием.
5. GO/NO-GO VERDICT
- GO: нет CRITICAL, все HIGH имеют простой фикс
- GO with constraints: есть CRITICAL но workaround возможен
- NO-GO: CRITICAL без workaround, или >3 HIGH без фиксов
6. APPLY PLAN (если GO/GO with constraints)
Порядок фиксов: low-risk → medium-risk → high-risk.
Каждый фикс = отдельный checkpoint commit.
После каждого — re-run baseline checks.
Формат итогового отчёта
=== WAVE AUDIT REPORT ===
Project: [name] | Stack: [detected] | Date: [date]
## Baseline
| Check | Status | Details |
|-------|--------|---------|
| lint | PASS/FAIL | N warnings, M errors |
| build | PASS/FAIL | ... |
| tests | PASS/FAIL | N passed, M failed |
## Wave 1 — Discovery
### Security (w1-security): N findings
### Runtime (w1-runtime): N findings
### Quality (w1-quality): N findings
### Structure (w1-structure): N findings
Total: N findings
## Wave 2 — Verification
### Confirmed: N | Rejected: N | Downgraded: N
### New findings (gap-hunter): N
### Architecture conflicts: N
### High-risk fixes: [list]
## Wave 3 — Optimized Results
### Priority Matrix
| # | Severity | Finding | Fix | Complexity | Blast | Score | [E] |
|---|----------|---------|-----|------------|-------|-------|-----|
| 1 | CRITICAL | ... | ... | trivial | 2 | 10.0 | E1 |
### Optimal Solutions (grouped)
- Group A: [related findings] → [one fix]
- Group B: [related findings] → [one fix]
### Cross-Domain Conflicts
- [conflict description + resolution]
## Verdict: GO / GO with constraints / NO-GO
Reason: [explanation]
## Apply Plan
1. checkpoint: before wave-audit fixes
2. [fix #1] — [files] — low risk
3. [fix #2] — [files] — low risk
...
N. re-run baseline → compare with pre-audit
Apply Phase (только после approve)
checkpoint:commit перед началом- Создать worktree:
git worktree add .claude/worktrees/wave-audit-fix - Применять фиксы в порядке из apply plan (low-risk → high-risk)
- Каждый фикс = отдельный commit
- Re-run baseline checks в worktree
- Strict mode: если хуже baseline по любому критерию → STOP
- Hand-off: показать diff, результаты, остаточные риски
Safety Constraints
Запрещено:
- Исправлять что-либо до завершения ВСЕХ 3 волн
- Пропускать Wave 2 ("Wave 1 всё нашла")
- Пропускать Wave 3 ("нет конфликтов") — Wave 3 ВСЕГДА
git reset --hard, удаление файлов/веток без approve- Менять секреты (
.env, ключи, токены) - Объединять findings без маркировки источника (W1/W2/W3)
Стандартный формат Finding (обязателен для ВСЕХ агентов)
Единый формат предотвращает потерю данных между волнами и упрощает дедупликацию.
ID: W{wave}-{agent}-{N}
SEVERITY: CRITICAL|HIGH|MEDIUM|LOW
CALIBRATION: [ответ на вопрос из SEVERITY_CALIBRATION]
FILE: path/to/file.ts:42-48
CODE_QUOTE: |
const decoded = jwt.decode(idToken, { complete: true });
// no jwt.verify() call — signature not checked
PROBLEM: [1-2 предложения]
IMPACT: [что произойдёт если не починить]
FIX: [конкретное изменение]
VERIFY_CMD: grep -n "jwt.decode" apps/api/src/external/oauth/apple.ts
EVIDENCE: [E1-E6]
Findings БЕЗ CODE_QUOTE или VERIFY_CMD → автоматически помечаются [UNVERIFIED] и понижаются на 1 severity.
Deduplication Protocol
4 параллельных агента Wave 1 НЕИЗБЕЖНО найдут одно и то же. Без дедупликации — отчёт раздут на 30-40%.
Lead между Wave 1 и Wave 2:
- Собрать все findings в единый список
- Группировать по
FILE— findings на один и тот же файл:строку = кандидаты на дупликат - Для каждой группы:
- Одинаковая проблема → оставить finding с лучшим CODE_QUOTE, удалить дубли, пометить
[DEDUP: merged W1-security-3 + W1-quality-7] - Разные проблемы на одном файле → оставить оба
- Одинаковая проблема → оставить finding с лучшим CODE_QUOTE, удалить дубли, пометить
- Пометить каждый finding источником:
SOURCE: w1-security
Ожидаемый dedup rate: 15-25%
Lite Mode (/wave-audit lite)
9 агентов = дорого. Для малых проектов (<30 файлов) или быстрых проверок:
- Wave 1: 2 агента (security+runtime merged, quality+structure merged)
- Wave 2: пропуск (lead делает quick false-positive check сам)
- Wave 3: упрощённый — priority list + Go/No-Go, без cross-domain analysis
Ожидаемое покрытие: ~75% от full mode. Стоимость: ~30% от full mode.
Diff Mode (/wave-audit diff)
Изменил 5 файлов — зачем аудитить все 90?
git diff --name-only HEAD~N→ список изменённых файлов- Для каждого изменённого файла → найти зависимости (importers, tests)
- Scope Wave 1 агентов ТОЛЬКО на: changed files + их прямые зависимости
- Wave 2 gap-hunter дополнительно проверяет: не пропущены ли transitive dependencies
Ожидаемое покрытие: ~90% для changed code. Стоимость: ~40% от full mode.
Lead Automation Protocol
Lead = bottleneck. Между волнами lead вручную собирает, форматирует, дедуплицирует, передаёт. Минимизируем ручную работу.
Между Wave 1 → Wave 2:
- Собрать messages от 4 агентов (автоматически через team inbox)
- Дедупликация по FILE (см. протокол выше)
- Подсчитать coverage: объединить COVERAGE_LOG всех агентов
- Если суммарный coverage <50% — WARN пользователю: "Агенты покрыли только N% файлов"
- Сформировать единый список → передать в промпты Wave 2
Между Wave 2 → Wave 3:
- Собрать verifications от 4 агентов
- Применить решения w2-false-positive-filter (удалить REJECTED)
- Добавить new findings от w2-gap-hunter
- Сформировать полный пакет → передать w3-synthesizer
Если агент не ответил за 10 минут:
- Продолжить без него, пометить
[AGENT_TIMEOUT: w1-runtime] - В финальном отчёте указать неполное покрытие
Wave 2 Context Overflow Protection
Если Wave 1 выдала 30+ findings, Wave 2 агенты теряют фокус на последних.
Правило: MAX 20 findings per Wave 2 agent
- Если findings >20: разбить на 2 batch по приоритету
- Batch 1 (HIGH+CRITICAL) → Wave 2 агентам
- Batch 2 (MEDIUM+LOW) → Wave 2 агентам вторым проходом ИЛИ lead проверяет сам
- В отчёте пометить:
BATCH_2_REVIEWED_BY: lead(менее глубокая проверка)
Метрика эффективности
После каждого запуска записать в отчёт:
AUDIT METRICS:
- Wave 1 findings: N (raw, before dedup)
- Wave 1 deduplicated: N (after dedup, -N%)
- Wave 1 coverage: N% (union of all agents' COVERAGE_LOGs)
- Wave 1 unverified: N (findings without CODE_QUOTE)
- Wave 2 rejected: N (false positive rate: N%)
- Wave 2 new findings: N (gap rate: N%)
- Wave 2 architecture conflicts: N
- Wave 3 groups: N (optimization rate: N%)
- Total agents: 9 (4+4+1) | lite: 3 (2+0+1)
- Total confirmed: N
- Agent timeouts: N
- Mode: full | lite | diff