К основному содержанию
скилл CX Codex

fix-bug — скилл для Claude Code: починка багов через TDD

Скилл ведёт агента по шагам: воспроизвести баг, написать падающий тест, починить минимально и проверить. Для правок в проекте ClaudeBar.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add tddworks/ClaudeBar --skill fix-bug -a claude-code
Открыть на GitHub

Что делает fix-bug

Скилл задаёт порядок работы с дефектом. Сначала агент воспроизводит баг, сравнивает ожидаемое поведение с фактическим и ищет причину в коде. Потом пишет тест, который этот баг вскрывает: до правки он должен падать. Затем идёт минимальная починка, и тест проходит вместе с остальными.

Тесты строятся по Chicago School TDD — проверяются состояние и возвращаемые значения, а не вызовы методов. Имена тестов пишутся словами человека: should <outcome> [when <situation>]. Моки подставляют данные, а не подтверждают вызовы.

Скилл заточен под проект ClaudeBar: он ссылается на USER_JOURNEYS, CANONICAL_MODEL, TARGET_ARCHITECTURE и design.md как источник истины. Баг здесь обычно означает, что код нарушает закон из CANONICAL_MODEL.md §5, и чинить надо у единственного владельца закона, а не в месте вызова. Если правильный фикс меняет сам закон или переносит его к другому владельцу — это уже изменение дизайна: сначала правят документ и спрашивают подтверждение у пользователя. Провайдеры правятся в их JSON или скрипте маппинга, либо в DataSources; вендорный Swift и строки в ClaudeBarApp с именем провайдера не годятся. Логи лежат в ~/Library/Logs/ClaudeBar/ClaudeBar.log, а account.lastFailedStep и lastError показывают, где сломалось. При разборе реального ответа CLI или API берите его в тест как фикстуру в обезличенном виде: токены, ключи и cookie в лог не пишутся.

Какие задачи решает

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

Примеры запросов агенту

  • разбери этот баг по скиллу fix-bug: сначала воспроизведи, потом тест
  • пользователь жалуется, что провайдер показывает не то — пройди по fix-bug
  • почини дефект в ClaudeBar через fix-bug, тест до правки должен падать

Как установить fix-bug

1Через Skills CLI (Vercel)

npx skills add tddworks/ClaudeBar --skill fix-bug -a claude-code

2Вручную: положить файлы

~/.claude/skills/fix-bug/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/fix-bug/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Из того же набора2

Похожие

bug-fix-brief giuseppe-trisciuoglio Скилл собирает структурированный Bug Fix Brief: причина, шаги воспроизведения, варианты правки и чек-лист. Пригодится, когда баг уже разобран, а фикс ещё не написан. CX Codex +1 3 000установок tdd backnotprop Скилл заставляет агента сначала написать падающий тест на баг, а потом править код. Включается только когда тест дешёвый и очевидный. CX Codex +1 5 100установок sentry-fix-issues getsentry Ищет ошибки в Sentry через MCP-сервер, разбирает трейсы и готовит исправления в коде. Пригодится при разборе инцидентов и багов в продакшене. CX Codex +1 10 000установок meticulous-fix alwaysmeticulous Скилл берёт отклонённые визуальные диффы из прогона Meticulous и вносит правки по комментариям ревьюеров. Нужен, когда ревью уже прошло и пора чинить. CX Codex +1 4 500установок bug-report Donchitos Скилл оформляет отчёты об ошибках по описанию или ищет баги в коде, а также помогает проверить исправления. Пригодится QA-инженерам и разработчикам игр для единого формата баг-репортов. CX Codex +1 473установок bug-detective Galaxy-Dawn Пошаговый сценарий отладки и справочник типовых ошибок для агента. Включается при запросах о багах, падениях тестов и непонятных исключениях. CX Codex +1 404установок

Рядом в теме «Тесты и QA»

Всё по теме «Тесты и QA» →

Вопросы о fix-bug

Как установить fix-bug в Claude?

Выполните npx skills add tddworks/ClaudeBar --skill fix-bug -a claude-code. Скилл окажется в ~/.claude/skills/fix-bug/SKILL.md.

Что делает fix-bug?

Проводит агента по циклу: воспроизведение бага, падающий тест, минимальная правка, проверка. Тесты пишутся по Chicago School TDD, с проверкой состояния вместо вызовов методов.

Где искать причину, если провайдер отвечает неправильно?

Смотрите ~/Library/Logs/ClaudeBar/ClaudeBar.log, а также account.lastFailedStep и lastError — они показывают, сломался ключ, запрос или чтение ответа.

Исходный текст

SKILL.md · Apache-2.0
---
name: fix-bug
description: |
  Guide for fixing bugs in ClaudeBar following Chicago School TDD and rich domain design. Use this skill when:
  (1) User reports a bug or unexpected behavior
  (2) Fixing a defect in existing functionality
  (3) User asks "fix this bug" or "this doesn't work correctly"
  (4) Correcting behavior that violates the user's mental model
---

# Fix Bug in ClaudeBar

Fix bugs using Chicago School TDD, root cause analysis, and rich domain design.

## Workflow

```
┌─────────────────────────────────────────────────────────────┐
│  1. REPRODUCE & UNDERSTAND                                   │
├─────────────────────────────────────────────────────────────┤
│  • Reproduce the bug                                         │
│  • Identify expected vs actual behavior                      │
│  • Locate the root cause in code                             │
└─────────────────────────────────────────────────────────────┘
                            │
                            ▼
┌─────────────────────────────────────────────────────────────┐
│  2. WRITE FAILING TEST (Red)                                 │
├─────────────────────────────────────────────────────────────┤
│  • Write test that exposes the bug                           │
│  • Test should FAIL before fix                               │
│  • Test should verify CORRECT behavior                       │
└─────────────────────────────────────────────────────────────┘
                            │
                            ▼
┌─────────────────────────────────────────────────────────────┐
│  3. FIX & VERIFY (Green)                                     │
├─────────────────────────────────────────────────────────────┤
│  • Implement minimal fix                                     │
│  • Test now PASSES                                           │
│  • All existing tests still pass                             │
└─────────────────────────────────────────────────────────────┘
```

## Phase 1: Reproduce & Understand

### Identify the Bug

1. **Reproduce**: Follow exact steps to trigger the bug
2. **Expected**: What SHOULD happen (the person's mental model — USER_JOURNEYS)
3. **Actual**: What IS happening (current behavior)
4. **Root cause**: WHY it's happening (code analysis)

For a provider that shows the wrong thing or fails:
- **The log**: `~/Library/Logs/ClaudeBar/ClaudeBar.log` (`info` and above) — which data source answered, which step failed (lookup · fetch · mapping); `debug` goes to OSLog only ([troubleshooting](../../../docs/troubleshooting.md)).
- **The failed step**: `account.lastFailedStep` and `lastError` say whether the key, the request or the reading broke — fix that piece.
- **The real response**: capture the CLI's or API's actual answer, **redacted** (no token, email, name or real usage), as the test's fixture. Never log a token, key or cookie while investigating.

### Find the law it breaks

Read the design in order — USER_JOURNEYS, CANONICAL_MODEL, TARGET_ARCHITECTURE,
then the feature's or provider's `design.md`. The design docs are the source of truth ([AGENTS.md](../../../AGENTS.md#design-docs-are-the-source-of-truth)).
A bug is usually a law in [CANONICAL_MODEL.md](../../../docs/architecture/CANONICAL_MODEL.md) §5 (or a feature's
`design.md`) that the code breaks: find the law and its **one owner**, and fix it there, not
at a call site. If the right fix changes a law or moves it to another owner, that is a
design change: update the doc and ask the user to confirm before fixing. If no law covers
it, propose the law first.

### Think how the domain should be

A bug is often a shape that let it happen: a rule a view could call and decide
for itself, two lifecycles in one class whose optionals disagree, a `String`
where a type would have refused the bad value, a boundary that guessed the
other side's format. Before fixing, ask how the domain should be, from the
person's problem, and ask the seven questions of the types the bug touches
→ [domain-shape.md](../implement-feature/references/domain-shape.md). Fix the
shape when it is the cause, in the same change, test first; a new aggregate or
a moved owner is a design change, confirmed first. A screen that contradicts
itself ("On track" beside "Runs out") is usually one law with two owners: fix it
by giving the law one owner, not by adjusting one copy.

### Locate in Architecture

> **Reference:** [MODULAR_DESIGN.md](../../../docs/architecture/MODULAR_DESIGN.md) (modules) ·
> [TARGET_ARCHITECTURE.md](../../../docs/architecture/TARGET_ARCHITECTURE.md) (how a provider runs) ·
> [ARCHITECTURE.md](../../../docs/architecture/ARCHITECTURE.md) (the app layers)

Find which module the behaviour lives in before you change it: the table in
[implement-feature → Architecture](../implement-feature/SKILL.md#architecture) is the
one map (where each thing lives, and where its tests go).

A bug or improvement in a provider is made in its JSON (or its mapping
script), or generically in `DataSources` — never with vendor-named Swift, and
never with a line in `ClaudeBarApp` that names it (providers are found by
`ProviderCatalog.detect()`). Modules never `import Domain`.

### Domain Invariants

Check if the bug violates domain invariants that should be maintained:

```swift
// Example: QuotaMonitor should maintain selection invariants
// - selectedProviderId should always point to an enabled provider
// - Domain should be self-validating (no external "ensure" calls needed)
```

## Phase 2: Write Failing Test (Red)

### Chicago School TDD

Name each test `should <outcome> [when <situation>]`, in the person's words, never a method, type or mechanism verb → [Naming tests](../implement-feature/references/tdd-patterns.md#naming-tests).

We follow **Chicago School TDD** (state-based testing):
- Test **state changes** and **return values**, not interactions
- Focus on the "what" (observable outcomes), not the "how" (method calls)
- Mocks stub dependencies to return data, not to verify calls
- No `verify()` calls - assert on resulting state instead

### Test Pattern

Test the CORRECT behavior, not the bug:

```swift
@MainActor
@Suite
struct {Component}Tests {

    @Test func `should {correct outcome} when {the situation that showed the bug}`() async throws {
        // Given - the response that triggers the bug, captured from the real CLI/API
        let stub = try StubbedProvider(providerId: "codex")
        defer { stub.cleanUp() }
        stub.answerRPC(#"{"id":2,"result":{"rateLimits":{"primary":{"usedPercent":30,"windowDurationMins":10080}}}}"#)

        // When - the real definition reads it
        let usage = try await stub.make("codex").refreshPlain()

        // Then - assert EXPECTED behavior (will FAIL before fix)
        #expect(usage.quota(for: .session)?.windowDuration == 7 * 86400)  // the window the provider stated
    }
}
```

### Test Location

The test goes beside the code it pins (the table in Phase 1). For a migrated
provider, add the captured response to its golden tests in
`Modules/Providers/Tests/`; for a generic worker, to `Modules/DataSources/Tests/`.

### Run Test (Should FAIL)

```bash
tuist test Providers         # one module's tests while working (schemes: Providers, DataSources, Domain, Infrastructure, AppTests, AcceptanceTests)
# tuist caches results; one suite for real, and the final check of everything:
xcodebuild test -workspace ClaudeBar.xcworkspace -scheme ClaudeBar-Workspace \
  -destination 'platform=macOS,arch=arm64' -only-testing:ProvidersTests/ClaudeAPITests
xcodebuild test -workspace ClaudeBar.xcworkspace -scheme ClaudeBar-Workspace -destination 'platform=macOS,arch=arm64'
```

## Phase 3: Fix & Verify (Green)

### Fix Guidelines

1. **Minimal change**: Fix only what's broken
2. **At the law's owner**: fix the one type that owns the rule (CANONICAL §5), not a call site or a view
3. **A provider is data**: its JSON or script, or a generic rule in `DataSources` that every definition gains — never a branch on a provider's id
4. **Maintain invariants**: the owner stays self-validating — tell, don't ask
5. **No over-engineering**: Don't refactor unrelated code

### Domain Design Principles

When fixing domain bugs, ensure:

```swift
// 1. Domain maintains its own invariants
public init(...) {
    // Validate on construction
    selectFirstEnabledIfNeeded()  // Called internally, not externally
}

// 2. Public API hides implementation details
public func setProviderEnabled(_ id: String, enabled: Bool) {
    provider.isEnabled = enabled
    if !enabled {
        selectFirstEnabledIfNeeded()  // Private - called automatically
    }
}

// 3. Private methods for internal invariant maintenance
private func selectFirstEnabledIfNeeded() { ... }
```

### Verify Fix

Run the same suite again (it should PASS now), then the full `xcodebuild test`
(`tuist test` skips cached targets). Then the docs in the same change: a
provider's `README.md` Gotchas when the person can hit it, its `design.md`
when the reading changed, and the CHANGELOG line.

## Checklist

- [ ] Bug reproduced and understood
- [ ] Root cause identified in code
- [ ] Domain thought through: is the bug a shape the [seven questions](../implement-feature/references/domain-shape.md) would have refused? Fixed there if so
- [ ] Failing test written (exposes bug)
- [ ] Test FAILS before fix
- [ ] Minimal fix implemented
- [ ] Test PASSES after fix
- [ ] All existing tests still pass
- [ ] Domain invariants maintained (if applicable)
- [ ] Full `xcodebuild test` green
- [ ] Docs updated where the person or a contributor would look (provider README / design.md)
- [ ] One line under `## [Unreleased]` in `CHANGELOG.md`, under its heading (`Fixed` / `Changed`): the effect in the person's words, ≤300 characters, an absolute issue or PR link

© tddworks · Apache-2.0 · tddworks/ClaudeBar

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой