| name | bugfix |
| description | Systematyczna naprawa bugow w dzialajcej aplikacji. Uzywaj przy bledach z Sentry, failujacych E2E, zgloszeniach userow, nieoczekiwanym zachowaniu po uzyciu. Wywoluj przez /bugfix [opis bugu lub link Sentry]. |
| argument-hint | [opis bugu lub link Sentry] |
Bugfix — systematyczna naprawa bugow
Skill do naprawy bugow wykrytych w dzialajcej aplikacji — Sentry alerty, E2E failures, zgloszenia userow, nieoczekiwane zachowanie.
Nadrzedna zasada: Znajdz root cause ZANIM zaproponujesz fix. Naprawa symptomu to porazka.
Zmienne
Instrukcje
Faza 0: Triage
- Zrodlo bugu: Sentry / E2E test / manual / zgloszenie usera
- Priorytet:
- P0 — blokuje userow, aplikacja niedostepna
- P1 — powazny, funkcjonalnosc uszkodzona
- P2 — drobny, moze poczekac
- Blast radius: ilu userow dotyczy, od kiedy, jaki % ruchu
- Sprawdz baze wiedzy:
- Przeszukaj
docs/solutions/ — czy ten problem byl juz rozwiazany
- Sprawdz Sentry — czy to regression (first seen vs last seen), czy grupuje sie z innymi bledami
- Jesli znaleziono rozwiazanie — zastosuj je i przejdz do Fazy 4 (weryfikacja)
Faza 0.5: Stabilizacja (tylko P0/P1)
- Czy rollback ostatniego deploy'a rozwiaze problem?
- Sprawdz
git log --oneline -10 — co weszlo w ostatnim deploymencie
- Jesli tak — rollback TERAZ:
- Coolify: redeploy poprzedniego taga/commita przez dashboard
- Git:
git revert <commit> + deploy
- CI/CD: trigger pipeline z poprzednim stabilnym SHA
- Investigacje przeprowadz potem, w spokoju
- Jesli nie — kontynuuj do Fazy 1
Faza 1: Investigacja
ZANIM cokolwiek naprawisz:
-
Zbierz kontekst:
- Sentry: error message, stack trace, breadcrumbs, affected users, release
- Logi: co dzialo sie PRZED bledem
- Network: request, payload, response code
- DB: stan danych ktorych bug dotyczy (jesli relevantne)
-
Reprodukuj:
- Kroki do reprodukcji, srodowisko, dane testowe
- Czy powtarzalny? Jesli nie — zbierz wiecej danych, nie zgaduj
-
Sprawdz zmiany:
git log --oneline --since="3 days ago" — co sie zmienilo
git bisect — jesli wiadomo kiedy dzialalo, a kiedy przestalo
- Nowe dependency, zmiana configu, zmiana srodowiska
-
Sledz dane (multi-component):
Jesli system ma wiele warstw (API → serwis → baza, frontend → edge function → DB):
- Dodaj diagnostic logging na KAZDEJ granicy komponentow
- Uruchom raz, zbierz evidence GDZIE sie psuje
- Dopiero potem analizuj ten konkretny komponent
Szczegolowa technika: przeczytaj techniki/root-cause-tracing.md
-
Okresl rozmiar fixa:
- Maly (1-2 pliki, oczywista zmiana) — naprawiaj na biezacym branchu
- Duzy (3+ pliki, zmiana logiki) — stworz branch
fix/opis-bugu
-
OUTPUT: Zapisz jednozdaniowe podsumowanie: "Root cause to X, bo Y"
Faza 2: Failing test
- Napisz MINIMALNY test reprodukujacy buga
- Uruchom test — MUSI failowac
- Jesli test przechodzi — nie rozumiesz buga. Wroc do Fazy 1
- Jesli buga nie da sie pokryc unit testem — napisz scenariusz E2E lub test integracyjny
Faza 3: Fix
-
Jedna zmiana naprawiajaca root cause — nie symptom
- NIE naprawiaj wielu rzeczy naraz
- NIE dodawaj "ulepszen" przy okazji
- NIE oslabiaj asercji zeby test przeszedl
-
Uruchom test z Fazy 2 — MUSI przejsc
-
Uruchom pelny suite — zero regresji
-
Jesli fix nie dziala:
- < 3 proby: wroc do Fazy 1, przeanalizuj z nowa wiedza
-
= 3 proby: STOP. Zakwestionuj architekture:
- Czy kazdy fix ujawnia nowy problem w innym miejscu?
- Czy fixy wymagaja "masowej refaktoryzacji"?
- Czy trzymamy sie wzorca z bezwladnosci?
- Omow z userem zanim podejmiesz kolejna probe
-
Opcjonalnie — defense-in-depth:
Po udanym fixie dodaj walidacje na wielu warstwach, zeby bug byl strukturalnie niemozliwy.
Szczegoly: przeczytaj techniki/defense-in-depth.md
Faza 3.5: Cleanup
Przed przejsciem do weryfikacji — usun wszelkie diagnostic logi dodane w Fazie 1:
- Usun
console.error('DEBUG:...') i tymczasowe logi
- Sprawdz
git diff — czy nie committujesz kodu diagnostycznego
- Produkcyjny kod nie moze zawierac debug logowania
Faza 4: Weryfikacja (Gate Function)
Zanim powiesz "naprawione" — URUCHOM komendy i PRZECZYTAJ output:
| Claim | Wymagany dowod | NIE wystarczy |
|---|
| "Testy przechodza" | Output komendy testowej: 0 failures | "Powinno przechodzic" |
| "Typecheck OK" | Output tsc: 0 errors | "Zmiana jest prosta" |
| "Lint czysty" | Output lintera: 0 errors | Czesciowe sprawdzenie |
| "Bug naprawiony" | Test z Fazy 2 przechodzi | "Kod wyglada dobrze" |
Kolejnosc:
- Typecheck → przeczytaj output → 0 errors?
- Testy → przeczytaj output → 0 failures?
- Lint → przeczytaj output → 0 errors?
- E2E (jesli dotyczy) → przechodzi?
DOPIERO TERAZ mozesz powiedziec "naprawione".
Jesli cokolwiek failuje — wroc do Fazy 3. NIE racjonalizuj ("to pre-existing", "to nie zwiazane").
Faza 5: Monitoring po uzyciu
- Jesli bug dotyczyl produkcji — po deploy'u fixa:
- Sprawdz Sentry — error rate spada?
- Sprawdz metryki — endpoint/funkcja wraca do normy?
- Potwierdz na zywo — nie polegaj tylko na lokalnych testach
- Jesli bug dotyczyl E2E/staging — uruchom pelny E2E suite po fixie
Faza 6: Zamkniecie
- Dokumentacja: Czy to problem warty zapamietania?
- Tak → uruchom
/dev-compound z opisem problemu, root cause i rozwiazania
- Nie (trywialny fix) → pomin
- Pattern: Czy ten typ bugu moze sie powtorzyc?
- Tak → zaproponuj regule, hook lub walidacje zapobiegajaca
- Zamknij issue/ticket jesli istnieje
Red Flags — jesli lapiesz sie na tym, STOP
- "Szybki fix, zbadamy pozniej" → Faza 1
- "Sprobujmy zmienic X i zobaczymy" → Faza 1
- "Dodajmy kilka zmian naraz" → Faza 3, punkt 1
- "Pominmy test, sprawdze recznie" → Faza 2
- "Pewnie to X, naprawmy to" → Faza 1
- "Jeszcze jedna proba" (po 2+ nieudanych) → Faza 3, punkt 4
- "Gotowe!" (bez uruchomienia komend) → Faza 4
Techniki wspierajace
Pliki w katalogu techniki/ — czytaj gdy potrzebne:
root-cause-tracing.md — sledz buga wstecz przez call stack do zrodla
defense-in-depth.md — po fixie dodaj walidacje na wielu warstwach
condition-based-waiting.md — zamien sleep()/setTimeout() na polling warunku (flaky testy)
find-polluter.sh — skrypt bisection: ktory test zanieczyszcza stan
Racjonalizacje vs rzeczywistosc
| Wymowka | Rzeczywistosc |
|---|
| "Prosty bug, nie potrzeba procesu" | Proste bugi tez maja root cause. Proces jest szybki dla prostych. |
| "Awaryjnie, nie ma czasu" | Systematyczne debugowanie jest SZYBSZE niz strzelanie na slepo. |
| "Najpierw fix, potem zbadamy" | Pierwszy fix ustala pattern. Zrob dobrze od razu. |
| "Napisze test po potwierdzeniu fixa" | Test ktory od razu przechodzi niczego nie dowodzi. |
| "Kilka fixow naraz oszczedzi czas" | Nie wiadomo co zadzialalo. Powoduje nowe bugi. |
| "Widze problem, naprawmy to" | Widziec symptom != rozumiec root cause. |