вариант

systematic-debugging

obra/superpowers obra/superpowers

Прежде чем предлагать какие-либо исправления, выясните первопричины ошибок, сбоев при тестировании или непредвиденного поведения.

...Расширить все
21
Обновлено время 3 сентября 2026 г.

Систематическая отладка

Обзор

Случайные исправления приводят к потере времени и появлению новых ошибок. Быстрые исправления лишь маскируют основные проблемы.

Основной принцип: ВСЕГДА находите первопричину, прежде чем пытаться исправить проблему. Исправление симптомов — это провал.

Нарушение буквы этого процесса — это нарушение духа отладки.

Железный закон

НИКАКИХ ИСПРАВЛЕНИЙ БЕЗ ПРЕДВАРИТЕЛЬНОГО РАССЛЕДОВАНИЯ ПРИЧИНЫ

Если вы не завершили Фазу 1, вы не можете предлагать исправления.

Когда применять

Используйте при ЛЮБОЙ технической проблеме:

  • Сбои при тестировании
  • Ошибки в рабочей среде
  • Неожиданное поведение
  • Проблемы с производительностью
  • Сбои сборки
  • Проблемы с интеграцией

Используйте это ОСОБЕННО в следующих случаях:

  • В условиях дефицита времени (в чрезвычайных ситуациях возникает соблазн полагаться на догадки)
  • «Просто одно быстрое исправление» кажется очевидным
  • Вы уже пробовали несколько способов исправления
  • Предыдущее решение не сработало
  • Вы не до конца понимаете суть проблемы

Не пропускайте этот шаг, если:

  • Проблема кажется простой (у простых ошибок тоже есть первопричины)
  • Вы спешите (спешка гарантирует переделку)
  • Руководитель хочет, чтобы это исправили СЕЙЧАС (систематический подход быстрее, чем хаотичные попытки)

Четыре этапа

Вы ДОЛЖНЫ завершить каждую фазу, прежде чем переходить к следующей.

Этап 1: Исследование первопричины

ПЕРЕД тем, как приступить к ЛЮБОМУ исправлению:

  1. Внимательно прочитайте сообщения об ошибках

    • Не пропускайте ошибки или предупреждения
    • Они часто содержат точное решение
    • Прочитайте трассировку стека полностью
    • Запишите номера строк, пути к файлам и коды ошибок
  2. Постоянно воспроизводите ошибку

    • Можете ли вы надежно вызвать эту ошибку?
    • Каковы точные шаги?
    • Происходит ли это каждый раз?
    • Если не удается воспроизвести → соберите больше данных, не делайте предположений
  3. Проверьте недавние изменения

    • Что изменилось, что могло привести к этому?
    • Git diff, последние коммиты
    • Новые зависимости, изменения в конфигурации
    • Различия в среде
  4. Сбор доказательств в многокомпонентных системах

    КОГДА система состоит из нескольких компонентов (CI → сборка → подпись, API → сервис → база данных):

    ПЕРЕД тем, как предлагать исправления, добавьте диагностические инструменты:

    Для КАЖДОЙ границы компонента:
      - Регистрируйте, какие данные поступают в компонент
      - Регистрируйте, какие данные выходят из компонента
      - Проверяйте распространение настроек и конфигурации
      - Проверяйте состояние на каждом уровне
    
    Запустите один раз, чтобы собрать данные, показывающие, ГДЕ происходит сбой
    ЗАТЕМ проанализируйте данные, чтобы определить неисправный компонент
    ЗАТЕМ исследуйте этот конкретный компонент
    

    Пример (многоуровневая система):

    # Уровень 1: Рабочий процесс
    echo "=== Секретные данные, доступные в рабочем процессе: ==="
    echo "IDENTITY: ${IDENTITY:+SET}${IDENTITY:-UNSET}"
    
    # Уровень 2: Скрипт сборки
    echo "=== Переменные среды в скрипте сборки: ==="
    env | grep IDENTITY || echo "IDENTITY отсутствует в среде"
    
    # Уровень 3: Скрипт подписи
    echo "=== Состояние ключевого цепочки: ==="
    security list-keychains
    security find-identity -v
    
    # Уровень 4: Фактическая подпись
    codesign --sign "$IDENTITY" --verbose=4 "$APP"
    

    Это показывает: какой уровень вызывает сбой (секретные данные → рабочий процесс ✓, рабочий процесс → сборка ✗)

  5. Отслеживание потока данных

    ЕСЛИ ошибка находится глубоко в стеке вызовов:

    См. фа йл root-cause-tracing.md в этом каталоге для ознакомления с полной методикой обратного отслеживания.

    Краткое описание:

    • Откуда взялось некорректное значение?
    • Что вызвало эту функцию с некорректным значением?
    • Продолжайте отслеживание вверх по стеку, пока не найдете источник
    • Устраняйте проблему у источника, а не по симптомам

Этап 2: Анализ закономерностей

Прежде чем устранять проблему, найдите закономерность:

  1. Найдите рабочие примеры

    • Найдите похожий рабочий код в той же кодовой базе
    • Что из работающего кода похоже на то, что не работает?
  2. Сравните с эталонными реализациями

    • Если реализуете паттерн, ПРОЧТИТЕ ССЫЛОЧНУЮ РЕАЛИЗАЦИЮ ПОЛНОСТЬЮ
    • Не просматривайте поверхностно — читайте каждую строку
    • Полностью поймите паттерн, прежде чем применять его
  3. Определите различия

    • Чем отличается работающий вариант от неработающего?
    • Перечислите все различия, даже самые незначительные
    • Не думайте: «это не может иметь значения»
  4. Поймите зависимости

    • Какие еще компоненты для этого нужны?
    • Какие настройки, конфигурация, среда?
    • На каких допущениях он основан?

Этап 3: Гипотеза и тестирование

Научный метод:

  1. Сформулируйте одну гипотезу

    • Чётко сформулируйте: «Я считаю, что X является первопричиной, потому что Y»
    • Запишите это
    • Будьте конкретны, не расплывайтесь
  2. Проведите минимальное тестирование

    • Внесите как можно МЕНЬШЕ изменений, чтобы проверить гипотезу
    • По одной переменной за раз
    • Не исправляйте сразу несколько вещей
  3. Проверьте, прежде чем продолжить

    • Сработало ли? Да → Этап 4
    • Не сработало? Сформулируйте НОВУЮ гипотезу
    • НЕ добавляйте дополнительные исправления
  4. Когда вы не знаете

    • Скажите: «Я не понимаю X»
    • Не притворяйтесь, что знаете
    • Обратитесь за помощью
    • Изучите вопрос подробнее

Этап 4: Реализация

Устраняйте первопричину, а не симптом:

  1. Создайте тестовый случай, приводящий к сбою

    • Простейшая возможная репродукция
    • Автоматизированный тест, если возможно
    • Одноразовый тестовый скрипт, если нет фреймворка
    • ОБЯЗАТЕЛЬНО нужно выполнить перед исправлением
    • Используйте навык «test-driven-development» для написания правильных тестов , дающих сбой
  2. Реализуйте «однократное исправление»

    • Устраните выявленную первопричину
    • Вносите по ОДНОМУ изменению за раз
    • Никаких улучшений по принципу «раз уж я здесь»
    • Никакого пакетного рефакторинга
  3. Проверьте исправление

    • Тест теперь проходит?
    • Не сломаны ли другие тесты?
    • Проблема действительно решена?
  4. Если исправление не сработало

    • СТОП
    • Подсчёт: сколько исправлений вы уже попробовали?
    • Если < 3: Вернитесь к этапу 1, проведите повторный анализ с учётом новой информации
    • Если ≥ 3: ОСТАНОВИТЕСЬ и проанализируйте архитектуру (шаг 5 ниже)
    • НЕ пытайтесь применить исправление № 4 без обсуждения архитектуры
  5. Если 3 и более способов устранения не сработали: проанализируйте архитектуру

    Паттерн, указывающий на архитектурную проблему:

    • Каждое исправление выявляет новое общее состояние/связь/проблему в другом месте
    • Для реализации исправлений требуется «масштабный рефакторинг»
    • Каждое исправление порождает новые симптомы в других местах

    ОСТАНОВИТЕСЬ и пересмотрите основополагающие принципы:

    • Является ли эта модель принципиально верной?
    • Не «держимся ли мы за него просто из-за инерции»?
    • Стоит ли рефакторить архитектуру вместо того, чтобы продолжать устранять симптомы?

    Перед тем как предпринимать дальнейшие попытки исправления, обсудите это со своим коллегой

    Это НЕ проваленная гипотеза — это неправильная архитектура.

Предупреждающие сигналы — ОСТАНОВИТЕСЬ и следуйте процессу

Если вы поймали себя на мысли:

  • «Пока что быстро исправим, а потом разберемся»
  • «Просто попробуй изменить X и посмотри, сработает ли»
  • «Внесите несколько изменений, запустите тесты»
  • «Пропустим тест, я проверю вручную»
  • «Наверное, дело в X, давайте это исправим»
  • «Я не до конца понимаю, но это может сработать»
  • «Согласно шаблону должно быть X, но я адаптирую это по-своему»
  • «Вот основные проблемы: [перечисляет исправления без предварительного анализа]»
  • Предложение решений до отслеживания потока данных
  • «Ещё одна попытка исправить» (когда уже пробовали 2 и более раз)
  • Каждое исправление выявляет новую проблему в другом месте

Всё это означает: ОСТАНОВИТЕСЬ. Вернитесь к фазе 1.

Если 3 и более попыток исправления не увенчались успехом: пересмотрите архитектуру (см. фазу 4.5)

Сигналы от вашего партнёра о том, что вы делаете что-то не так

Обращайте внимание на следующие перенаправления:

  • «Разве это не происходит?» — вы сделали предположение, не проверив
  • «Это нам покажет…?» — вам следовало бы собрать дополнительные доказательства
  • «Хватит гадать» — вы предлагаете исправления, не разобравшись в сути
  • «Проанализируй это досконально» — анализируйте причины, а не только симптомы
  • «Мы застряли?» (с разочарованием) — ваш подход не работает

Когда вы видите такие фразы: ОСТАНОВИТЕСЬ. Вернитесь к фазе 1.

Распространённые оправдания

Оправдание Реальность
«Проблема простая, процесс не нужен» У простых проблем тоже есть первопричины. Процедура позволяет быстро устранять простые ошибки.
«Чрезвычайная ситуация, нет времени на процедуру» Систематическая отладка проходит БЫСТРЕЕ, чем метод «проб и ошибок».
«Сначала просто попробуй это, а потом уже разбирайся» Первое исправление задает шаблон. Делайте всё правильно с самого начала.
«Я напишу тест после того, как убежусь, что исправление работает» Непроверенные исправления не приживаются. Сначала нужно проверить, чтобы убедиться в этом.
«Несколько исправлений за раз экономят время» Невозможно определить, что именно сработало. Это приводит к появлению новых ошибок.
«Документация слишком длинная, я адаптирую шаблон» Неполное понимание гарантирует появление ошибок. Прочитайте его полностью.
«Я вижу проблему, позвольте мне её исправить» Увидеть симптомы ≠ понять первопричину.
«Ещё одна попытка исправить» (после 2 и более неудач) 3 и более неудач = проблема архитектуры. Пересмотрите шаблон, не пытайтесь исправлять снова.

Краткое руководство

Этап Ключевые действия Критерии успеха
1. Коренная причина Проанализировать ошибки, воспроизвести их, проверить изменения, собрать доказательства Понять, ЧТО и ПОЧЕМУ
2. Закономерность Найти рабочие примеры, сравнить Выявить различия
3. Гипотеза Сформулируйте теорию, проведите минимальное тестирование Подтвержденная или новая гипотеза
4. Реализация Создание теста, исправление, проверка Ошибка устранена, тесты пройдены

Когда процесс показывает, что «коренной причины нет»

Если в результате систематического исследования выясняется, что проблема действительно связана с условиями окружающей среды, зависит от времени или является внешней:

  1. Вы завершили процесс
  2. Задокументируйте результаты расследования
  3. Примените соответствующие меры (повторная попытка, таймаут, сообщение об ошибке)
  4. Добавьте мониторинг/регистрацию событий для будущих расследований

Однако: 95% случаев, когда «коренная причина не установлена», связаны с неполным расследованием.

Вспомогательные методы

Эти методы являются частью систематической отладки и доступны в этом каталоге:

  • root-cause-tracing.md — отслеживание ошибок в обратном направлении по стеку вызовов для поиска первоначального триггера
  • defense-in-depth.md — добавление проверки на нескольких уровнях после обнаружения первопричины
  • condition-based-waiting.md — замена произвольных таймаутов на опрос по условиям

Связанные навыки:

  • superpowers:test-driven-development — для создания тестового случая, вызывающего сбой (фаза 4, шаг 1)
  • superpowers:verification-before-completion — Проверка эффективности исправления перед объявлением успеха

Влияние на реальный мир

По результатам сеансов отладки:

  • Систематический подход: 15–30 минут на исправление
  • Подход с произвольными исправлениями: 2–3 часа безуспешных попыток
  • Процент исправлений с первого раза: 95 % против 40 %
  • Появление новых ошибок: практически ноль против частого
Посмотреть на GitHub
---
name: systematic-debugging
description: Find root causes of bugs, test failures, or unexpected behavior before proposing any fixes.
---

# Systematic Debugging

## Overview

Random fixes waste time and create new bugs. Quick patches mask underlying issues.

**Core principle:** ALWAYS find root cause before attempting fixes. Symptom fixes are failure.

**Violating the letter of this process is violating the spirit of debugging.**

## The Iron Law

```
NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST
```

If you haven't completed Phase 1, you cannot propose fixes.

## When to Use

Use for ANY technical issue:
- Test failures
- Bugs in production
- Unexpected behavior
- Performance problems
- Build failures
- Integration issues

**Use this ESPECIALLY when:**
- Under time pressure (emergencies make guessing tempting)
- "Just one quick fix" seems obvious
- You've already tried multiple fixes
- Previous fix didn't work
- You don't fully understand the issue

**Don't skip when:**
- Issue seems simple (simple bugs have root causes too)
- You're in a hurry (rushing guarantees rework)
- Manager wants it fixed NOW (systematic is faster than thrashing)

## The Four Phases

You MUST complete each phase before proceeding to the next.

### Phase 1: Root Cause Investigation

**BEFORE attempting ANY fix:**

1. **Read Error Messages Carefully**
   - Don't skip past errors or warnings
   - They often contain the exact solution
   - Read stack traces completely
   - Note line numbers, file paths, error codes

2. **Reproduce Consistently**
   - Can you trigger it reliably?
   - What are the exact steps?
   - Does it happen every time?
   - If not reproducible → gather more data, don't guess

3. **Check Recent Changes**
   - What changed that could cause this?
   - Git diff, recent commits
   - New dependencies, config changes
   - Environmental differences

4. **Gather Evidence in Multi-Component Systems**

   **WHEN system has multiple components (CI → build → signing, API → service → database):**

   **BEFORE proposing fixes, add diagnostic instrumentation:**
   ```
   For EACH component boundary:
     - Log what data enters component
     - Log what data exits component
     - Verify environment/config propagation
     - Check state at each layer

   Run once to gather evidence showing WHERE it breaks
   THEN analyze evidence to identify failing component
   THEN investigate that specific component
   ```

   **Example (multi-layer system):**
   ```bash
   # Layer 1: Workflow
   echo "=== Secrets available in workflow: ==="
   echo "IDENTITY: ${IDENTITY:+SET}${IDENTITY:-UNSET}"

   # Layer 2: Build script
   echo "=== Env vars in build script: ==="
   env | grep IDENTITY || echo "IDENTITY not in environment"

   # Layer 3: Signing script
   echo "=== Keychain state: ==="
   security list-keychains
   security find-identity -v

   # Layer 4: Actual signing
   codesign --sign "$IDENTITY" --verbose=4 "$APP"
   ```

   **This reveals:** Which layer fails (secrets → workflow ✓, workflow → build ✗)

5. **Trace Data Flow**

   **WHEN error is deep in call stack:**

   See `root-cause-tracing.md` in this directory for the complete backward tracing technique.

   **Quick version:**
   - Where does bad value originate?
   - What called this with bad value?
   - Keep tracing up until you find the source
   - Fix at source, not at symptom

### Phase 2: Pattern Analysis

**Find the pattern before fixing:**

1. **Find Working Examples**
   - Locate similar working code in same codebase
   - What works that's similar to what's broken?

2. **Compare Against References**
   - If implementing pattern, read reference implementation COMPLETELY
   - Don't skim - read every line
   - Understand the pattern fully before applying

3. **Identify Differences**
   - What's different between working and broken?
   - List every difference, however small
   - Don't assume "that can't matter"

4. **Understand Dependencies**
   - What other components does this need?
   - What settings, config, environment?
   - What assumptions does it make?

### Phase 3: Hypothesis and Testing

**Scientific method:**

1. **Form Single Hypothesis**
   - State clearly: "I think X is the root cause because Y"
   - Write it down
   - Be specific, not vague

2. **Test Minimally**
   - Make the SMALLEST possible change to test hypothesis
   - One variable at a time
   - Don't fix multiple things at once

3. **Verify Before Continuing**
   - Did it work? Yes → Phase 4
   - Didn't work? Form NEW hypothesis
   - DON'T add more fixes on top

4. **When You Don't Know**
   - Say "I don't understand X"
   - Don't pretend to know
   - Ask for help
   - Research more

### Phase 4: Implementation

**Fix the root cause, not the symptom:**

1. **Create Failing Test Case**
   - Simplest possible reproduction
   - Automated test if possible
   - One-off test script if no framework
   - MUST have before fixing
   - Use the `superpowers:test-driven-development` skill for writing proper failing tests

2. **Implement Single Fix**
   - Address the root cause identified
   - ONE change at a time
   - No "while I'm here" improvements
   - No bundled refactoring

3. **Verify Fix**
   - Test passes now?
   - No other tests broken?
   - Issue actually resolved?

4. **If Fix Doesn't Work**
   - STOP
   - Count: How many fixes have you tried?
   - If < 3: Return to Phase 1, re-analyze with new information
   - **If ≥ 3: STOP and question the architecture (step 5 below)**
   - DON'T attempt Fix #4 without architectural discussion

5. **If 3+ Fixes Failed: Question Architecture**

   **Pattern indicating architectural problem:**
   - Each fix reveals new shared state/coupling/problem in different place
   - Fixes require "massive refactoring" to implement
   - Each fix creates new symptoms elsewhere

   **STOP and question fundamentals:**
   - Is this pattern fundamentally sound?
   - Are we "sticking with it through sheer inertia"?
   - Should we refactor architecture vs. continue fixing symptoms?

   **Discuss with your human partner before attempting more fixes**

   This is NOT a failed hypothesis - this is a wrong architecture.

## Red Flags - STOP and Follow Process

If you catch yourself thinking:
- "Quick fix for now, investigate later"
- "Just try changing X and see if it works"
- "Add multiple changes, run tests"
- "Skip the test, I'll manually verify"
- "It's probably X, let me fix that"
- "I don't fully understand but this might work"
- "Pattern says X but I'll adapt it differently"
- "Here are the main problems: [lists fixes without investigation]"
- Proposing solutions before tracing data flow
- **"One more fix attempt" (when already tried 2+)**
- **Each fix reveals new problem in different place**

**ALL of these mean: STOP. Return to Phase 1.**

**If 3+ fixes failed:** Question the architecture (see Phase 4.5)

## your human partner's Signals You're Doing It Wrong

**Watch for these redirections:**
- "Is that not happening?" - You assumed without verifying
- "Will it show us...?" - You should have added evidence gathering
- "Stop guessing" - You're proposing fixes without understanding
- "Ultra-think this" - Question fundamentals, not just symptoms
- "We're stuck?" (frustrated) - Your approach isn't working

**When you see these:** STOP. Return to Phase 1.

## Common Rationalizations

| Excuse | Reality |
|--------|---------|
| "Issue is simple, don't need process" | Simple issues have root causes too. Process is fast for simple bugs. |
| "Emergency, no time for process" | Systematic debugging is FASTER than guess-and-check thrashing. |
| "Just try this first, then investigate" | First fix sets the pattern. Do it right from the start. |
| "I'll write test after confirming fix works" | Untested fixes don't stick. Test first proves it. |
| "Multiple fixes at once saves time" | Can't isolate what worked. Causes new bugs. |
| "Reference too long, I'll adapt the pattern" | Partial understanding guarantees bugs. Read it completely. |
| "I see the problem, let me fix it" | Seeing symptoms ≠ understanding root cause. |
| "One more fix attempt" (after 2+ failures) | 3+ failures = architectural problem. Question pattern, don't fix again. |

## Quick Reference

| Phase | Key Activities | Success Criteria |
|-------|---------------|------------------|
| **1. Root Cause** | Read errors, reproduce, check changes, gather evidence | Understand WHAT and WHY |
| **2. Pattern** | Find working examples, compare | Identify differences |
| **3. Hypothesis** | Form theory, test minimally | Confirmed or new hypothesis |
| **4. Implementation** | Create test, fix, verify | Bug resolved, tests pass |

## When Process Reveals "No Root Cause"

If systematic investigation reveals issue is truly environmental, timing-dependent, or external:

1. You've completed the process
2. Document what you investigated
3. Implement appropriate handling (retry, timeout, error message)
4. Add monitoring/logging for future investigation

**But:** 95% of "no root cause" cases are incomplete investigation.

## Supporting Techniques

These techniques are part of systematic debugging and available in this directory:

- **`root-cause-tracing.md`** - Trace bugs backward through call stack to find original trigger
- **`defense-in-depth.md`** - Add validation at multiple layers after finding root cause
- **`condition-based-waiting.md`** - Replace arbitrary timeouts with condition polling

**Related skills:**
- **superpowers:test-driven-development** - For creating failing test case (Phase 4, Step 1)
- **superpowers:verification-before-completion** - Verify fix worked before claiming success

## Real-World Impact

From debugging sessions:
- Systematic approach: 15-30 minutes to fix
- Random fixes approach: 2-3 hours of thrashing
- First-time fix rate: 95% vs 40%
- New bugs introduced: Near zero vs common

Все файлы

0 файлов

Установить systematic-debugging

Скачайте файлы навыков и распакуйте их в каталог .claude/skills/.

Скачать ZIP

Клонируйте репозиторий и скопируйте файлы навыка в свой проект.

git clone https://github.com/obra/superpowers/tree/main/skills/systematic-debugging # Copy SKILL.md to your .claude/skills/ directory

Копировать Копировать
Быстрая настройка: Скопируйте папку со скиллом в каталог .claude/skills/ Claude автоматически обнаружит и начнет использовать этот скилл
Репозиторий obra/superpowers

Похожие навыки

algorithmic-art
Обновлено время 27 августа 2026 г.
receiving-code-review
Обновлено время 3 сентября 2026 г.
tech-debt-tracker
Обновлено время 29 августа 2026 г.
senior-backend
Обновлено время 30 августа 2026 г.
OR