Что это 🧩
Click-Path State Auditor — это инструмент для поиска «багов второго порядка» в интерактивных интерфейсах. Статический анализ и юнит-тесты обычно проверяют, существует ли функция, не падает ли она, правильный ли тип возвращает. Но они не ловят ситуацию, когда две рабочие функции, вызванные последовательно, отменяют друг друга, или состояние UI после клика не соответствует обещанию на кнопке. Навык построчно трассирует реакции на каждое пользовательское действие (клик, отправка формы, переключение) и проверяет, не возникает ли Sequential Undo, Async Race, Stale Closure, Missing State Transition, Conditional Dead Path или useEffect Interference.
Реальный пример из практики: кнопка «New Email» вызывала setComposeMode(true), а затем selectThread(null). Обе функции работали, но внутри selectThread был прописан сброс composeMode: false. Кнопка ничего не делала. 54 ошибки были найдены обычным дебаггингом — эту пропустили.
Как работает 🔍
Аудит проходит в три этапа.
1. Составление карты сторов (Step 1)
Перед разбором каждого touchpoint нужно задокументировать все побочные эффекты каждого экшена Zustand / React Context:
- Какие поля он устанавливает?
- Какие поля он сбрасывает (часто не свои)?
- Например:
selectThread(thread|null) → устанавливает selectedThread, messages, но сбрасывает composeMode, composeData, redraftOpen.
Этот шаг — критическая база. Без него не увидеть, что функция «украла» чужое состояние.
Пример вывода:
STORE: emailStore
setComposeMode(bool) → sets: {composeMode}
selectThread(thread|null) → sets: {...} RESETS: {composeMode: false, ...}
DANGEROUS RESETS:
selectThread → resets composeMode (owned by setComposeMode)
2. Аудит каждого touchpoint (Step 2)
Для каждой интерактивной точки (кнопка, переключатель, сабмит) в целевой области выполняется трассировка:
TOUCHPOINT: [Button label] in [Component:line]
HANDLER: onClick → {
call 1: functionA() → sets {X: true}
call 2: functionB() → RESETS {X: false} ← CONFLICT
}
EXPECTED: …
ACTUAL: X is false
VERDICT: BUG — Sequential Undo
Проверяются 6 паттернов:
- Sequential Undo 🌀 — первый вызов ставит флаг, второй его сбрасывает.
- Async Race 🏁 — загрузка из двух асинхронных вызовов, итоговое состояние зависит от порядка разрешения.
- Stale Closure 📦 — замыкание «запоминает» устаревшее значение (например, два
setCount(count+1) с одним и тем же count).
- Missing Transition 🚫 — кнопка «Save» только валидирует, но не сохраняет, или «Delete» не вызывает API.
- Conditional Dead Path 🧟 — условие всегда ложно, нужный код никогда не выполняется.
- useEffect Interference 👻 —
useEffect смотрит на установленное состояние и сбрасывает его обратно.
3. Формат отчёта (Step 3)
Каждый найденный баг получает ID CLICK-PATH-NNN, уровень серьёзности (CRITICAL/HIGH/MEDIUM/LOW), описание touchpoint, шаблон ошибки, полную трассировку, ожидаемое и фактическое поведение и конкретное предложение по исправлению.
CLICK-PATH-001: HIGH
Touchpoint: "New Email" button in ThreadList.tsx:23
Pattern: Sequential Undo
Trace:
1. setComposeMode(true) → sets {composeMode: true}
2. selectThread(null) → RESETS {composeMode: false} ← CONFLICT
Expected: composeMode = true
Actual: composeMode = false
Fix: Remove reset of composeMode from selectThread, or reorder calls
4. Контроль области видимости 🎯
Аудит может быть дорогим. Рекомендуется:
- Полный аудит приложения — перед релизом или после крупного рефакторинга. Запускать параллельных агентов по страницам.
- Аудит одной страницы — после добавления новой функциональности или по репорту пользователя.
- Store-focused аудит — после изменения Zustand-стора, проверить всех потребителей изменённых экшенов.
Для полного аудита предлагается разделение: Agent 1 составляет карту сторов, Agents 2–8 поочерёдно разбирают страницы (Dashboard, Chat, Emails, Projects, CRM, Profile, Management Suite).
Когда использовать 🎯
- После этапа систематического дебаггинга (который нашёл 54 других типа багов) — Click-Path State Auditor ловит то, что пропустил статический анализ.
- После любого изменения в общем состоянии (например, Zustand store) — проверить все места, где он используется.
- После рефакторинга, затрагивающего общие сторы.
- Перед релизом на критических пользовательских сценариях.
- Когда пользователи сообщают «кнопка не работает» — это основной инструмент для такого симптома.
Не использовать для:
- Багов на уровне API (неверный ответ, отсутствующий endpoint) — для этого есть
systematic-debugging.
- Стилей и вёрстки — используйте визуальный осмотр.
- Производительности — профилирование.
Важно знать 🛠️
- Аудит встраивается в пайплайн: запускается после
/superpowers:systematic-debugging и до /superpowers:verification-before-completion.
- Каждый найденный баг рекомендуется обернуть в тест (интеграция с
/superpowers:test-driven-development).
- Карта сторов (Step 1) — единый источник истины для всех параллельных агентов. Она должна быть составлена первой.
- Инструмент особенно эффективен для приложений на Zustand или Redux, где экшены имеют скрытые побочные эффекты.
Комментарии
Комментариев пока нет. Будьте первым.