Przejdź do głównej zawartości

Debugowanie i odzyskiwanie po błędach

Odzyskiwanie po błędach w Cursorze to cofnięcie zmiany agenta, która zepsuła build albo zachowanie aplikacji, i powtórzenie pracy w ciaśniejszych ramach. Checkpointy cofają edycje plików w obrębie jednego czatu, commity gita chronią wszystko pomiędzy czatami, a naprawa jest zaakceptowana dopiero wtedy, gdy build, testy i zawężony diff mówią to samo, a nie wtedy, gdy agent twierdzi, że już działa.

Ta strona jest dla programisty, który zbudował pierwszą funkcję z agentem Cursora i właśnie patrzy, jak coś się sypie. Agent zrefaktoryzował moduł uwierzytelniania, przeniósł funkcje między plikami i dodał warstwę walidacji. Testy przechodzą, ale strona logowania w przeglądarce jest pusta. Prosisz o poprawkę, agent edytuje sześć kolejnych plików i nagle padają dwa testy, które godzinę temu były zielone.

  • Dwie warstwy cofania (checkpointy i git), które przygotowujesz, zanim agent zacznie pracę
  • Tabelę decyzji: kiedy przywrócić checkpoint, kiedy wrócić do commita, a kiedy poprawiać na bieżąco (fix forward)
  • Cztery prompty do skopiowania: diagnoza w nowym czacie, zawężona poprawka, instrumentacja w czasie działania i bramka przed PR
  • Polecenia gita, które mierzą, co agent zmienił, bez czytania całego diffa
  • Sposoby wyjścia z sześciu sytuacji, w których samo odzyskiwanie idzie źle

Pomyłki agenta rzadko wyglądają jak literówki. Wyglądają jak skończona praca.

Typowy błąd człowiekaTypowy błąd agenta
Literówka albo błąd o jeden (off-by-one)Kod, który się kompiluje i przechodzi sprawdzanie typów, ale robi coś innego, niż trzeba
Pominięty przypadek brzegowyPewne siebie, błędne założenie co do wymagania
Pomyłka przy kopiuj-wklejWzorzec z jednej części kodu zastosowany tam, gdzie nie pasuje
Jedna zepsuta funkcjaZmiany rozsiane po wielu plikach, część z nich niezwiązana z zadaniem

Wynikają z tego dwie rzeczy, na których opiera się cała reszta. Po pierwsze, zielony build niewiele dowodzi, więc potrzebujesz dowodu z zachowania: testu, który odtwarza błąd, albo logów z działania aplikacji. Po drugie, relacja agenta o tym, co zmienił, nie jest wiarygodna, więc zmianę mierzysz gitem, a nie czytając czat.

Cursor zapisuje w obrębie czatu checkpointy edycji plików wykonanych przez agenta, więc możesz wrócić do stanu sprzed danej odpowiedzi. Są lokalne dla Cursora i niezależne od gita. Git to warstwa, która przetrwa zamknięty czat, restart edytora i przejście na maszynę kolegi. Używaj obu.

  1. Każde zadanie dla agenta zaczynaj od czystego drzewa roboczego na osobnej gałęzi. W terminalu:

    Okno terminala
    git status --short # nie może niczego wypisać; najpierw commit albo stash
    git switch -c fix/login-blank-page
  2. Commituj po każdym etapie, który agent kończy, a nie dopiero na końcu. Przy funkcji budowanej fazami to jeden commit po schemacie, jeden po API i jeden po UI:

    Okno terminala
    git add -A && git commit -m "wip: API endpoints pass their tests"
  3. Przed ryzykownym promptem (refaktoryzacja, aktualizacja zależności, migracja) zrób kolejny commit. To commit, a nie checkpoint, jest twoim punktem powrotu, gdy edytor się zamknie albo czat przepadnie.

  4. Wiedz, czego checkpoint nie cofnie. Wszystko, co agent zrobił przez terminal, leży poza migawką plików: migracja wykonana na lokalnej bazie, zainstalowany pakiet, plik wygenerowany skryptem. Traktuj to jako niechronione i cofaj ręcznie.

To, czy agent pyta cię przed każdym poleceniem w terminalu, zależy od trybu uruchamiania ustawionego w twoim workspace w ustawieniach bezpieczeństwa agenta Cursora. Pozwól uruchamiać bez pytania polecenia testów, lintu i buildu, zamiast znosić zatwierdzanie dla wszystkich poleceń. Konfigurację opisuje strona niezbędna konfiguracja.

Przywrócić checkpoint, wrócić do commita czy poprawiać na bieżąco?

Dział zatytułowany „Przywrócić checkpoint, wrócić do commita czy poprawiać na bieżąco?”

Wybierz najmniejsze cofnięcie, które usuwa szkodę.

SytuacjaCofnij przezDlaczego
Ostatnia odpowiedź agenta pogorszyła sprawę, a wcześniejsze były w porządkuPrzywróć checkpoint sprzed tej odpowiedziUsuwa jeden krok i zachowuje resztę pracy z sesji
Kilka odpowiedzi z rzędu poszło źle albo nie wiesz, która zepsuła kodŻeby zachować kopię: git stash push -u -m "agent attempt" (to przy okazji czyści drzewo). Żeby odrzucić zmiany: git restore --staged --worktree . do ostatniego commita, potem git clean -nd, żeby zobaczyć pliki utworzone przez agenta, i git clean -fd, żeby je usunąćCommit to znany dobry stan, a ciąg checkpointów może nim nie być
Czat przepadł, Cursor się zrestartował albo zmiana jest już zacommitowanagit reset --hard LAST_GOOD_COMMIT na twojej gałęzi, potem git clean -nd i git clean -fd dla plików utworzonych przez agenta. Jeśli już wypchnąłeś zmiany, uruchom zamiast tego git revert AGENT_COMMIT. LAST_GOOD_COMMIT i AGENT_COMMIT to hashe z git log --onelineNa tym etapie historię ma tylko git
Jeden fragment jest zły, a reszta poprawna i przetestowanaPoprawianie na bieżąco zawężonym promptem (poniżej)Powtarzanie dobrej pracy kosztuje więcej niż poprawienie jednej części
Sam prompt był błędny albo niepełnyCofnij (i uruchom git clean -fd), potem otwórz nowy czat z lepszym promptemPoprawianie na bieżąco dalej buduje na błędnym założeniu

Jak zatrzymać agenta, który kręci się w kółko przy tym samym błędzie

Dział zatytułowany „Jak zatrzymać agenta, który kręci się w kółko przy tym samym błędzie”

Wzorzec wygląda tak: agent coś zmienia, test pada, agent próbuje innego podejścia, znowu pada, a potem zaczyna się powtarzać albo cofać własną wcześniejszą poprawkę. Kolejne prompty w tym samym czacie rzadko pomagają, bo kontekst zawiera już kilka nieudanych podejść, które ciągną następną próbę w ich stronę.

  1. Zatrzymaj agenta w czacie, żeby przestał edytować pliki.

  2. Przywróć checkpoint sprzed pętli albo uruchom git restore --staged --worktree ., żeby wrócić do ostatniego commita, potem git clean -nd, żeby zobaczyć pliki utworzone przez agenta, i git clean -fd, żeby je usunąć.

  3. Znajdź przyczynę sam albo z agentem w Plan Mode, który planuje, zanim napisze jakikolwiek kod. Czytaj faktyczny wynik padającego testu, a nie streszczenie agenta.

  4. Otwórz nowy czat i przekaż agentowi diagnozę, plik i to, czego nie wolno mu ruszać.

Ostatnie zdanie ma znaczenie. Agent, któremu każesz zatrzymać się po jednej nieudanej próbie, wraca z raportem zamiast wchodzić w nową pętlę.

Jak ograniczyć agenta, który zmienił za dużo plików

Dział zatytułowany „Jak ograniczyć agenta, który zmienił za dużo plików”

Poprosiłeś o ponawianie jednego wywołania płatności, a agent przy okazji przeformatował moduł rozliczeń, zmienił nazwę funkcji pomocniczej i ruszył trzy testy. Najpierw to zmierz:

Okno terminala
git diff --stat # pliki i liczba linii zmienionych od ostatniego commita

Jeśli na liście są pliki, których zadanie nie wymagało, przywróć checkpoint i zawęź zakres w samym prompcie. Nazwij plik, wskaż funkcję pomocniczą do użycia i powiedz, co jest poza zakresem.

Jeśli agent w każdej sesji robi tę samą niechcianą zmianę, poprawka należy do reguły projektu, a nie do każdego promptu osobno.

Czytanie kodu nie znajdzie tej klasy błędów. Agent potrzebuje dowodów z działania programu: co kod faktycznie zrobił, po kolei, na ścieżce, która zawodzi. Poproś o tymczasowe, oznaczone logowanie w każdym kroku, sam odtwórz błąd i wklej wynik z powrotem. Jeśli w wyborze trybu jest tryb przeznaczony do tej pętli z dowodami z działania, kroki są takie same.

Znacznik sprawia, że sprzątanie da się sprawdzić: przed commitem git grep -n --untracked "DEBUG-LOGIN" nie może niczego wypisać. Przy błędach sporadycznych, wyścigach i regresjach, które wymagają git bisect, przejdź pełny proces opisany w debugowaniu z pomocą AI w Cursorze.

„Wszystkie testy przechodzą” w ustach agenta to deklaracja. Akceptuj naprawę na podstawie dowodów, które sprawdzisz w minutę, w tej kolejności.

  1. Bramka jest zielona. Build, lint, sprawdzanie typów i testy kończą się w terminalu, a nie w podsumowaniu agenta.

  2. Zakres jest taki, o jaki prosiłeś. git diff --stat main...HEAD pokazuje tylko pliki, których zadanie wymagało.

  3. Testów nie osłabiono. git diff main...HEAD -- '*.test.*' '*.spec.*' nie pokazuje usuniętych asercji, nowych .skip ani poluzowanych oczekiwanych wartości. Agent naciskany, by test zrobił się zielony, czasem edytuje test zamiast kodu; zobacz chroń wyrocznię testową.

  4. Kodu debugującego już nie ma. git grep -n --untracked "DEBUG-" niczego nie wypisuje.

  5. Pierwotny objaw zniknął. Odtwórz błąd tak, jak zobaczyłeś go za pierwszym razem, a jeszcze lepiej zachowaj test, który go odtwarzał.

Żeby bramka działała automatycznie, uruchamiaj polecenie testów i grep na DEBUG- z hooka stop w Cursorze, który odsyła agenta do pracy, gdy któreś z nich zawiedzie; zobacz, jak kazać Cursorowi ponowić bramkę, zanim powie „gotowe”. Resztę agent może wykonać za ciebie jednym przebiegiem, zanim otworzysz pull request.

Jako autor bierzesz odpowiedzialność za pull request i wpisujesz pięć powyższych sprawdzeń do jego opisu. Potem CI uruchamia tę samą bramkę, a automatyczny recenzent, taki jak Bugbot, oraz kolega z zespołu przeglądają pull request. Podział tych sprawdzeń w zespole opisuje strona kontrola wersji i współpraca zespołowa w Cursorze.

Rozpoczęcie od nowa to świadomy wybór, a nie porażka. Traktuj poniższe jako ustawienia domyślne i dopasuj je do swojego kodu.

Zacznij od nowa, gdyPoprawiaj na bieżąco, gdy
Agent trzy razy poległ na tej samej poprawceBłąd jest mały i odizolowany, a reszta kodu jest dobra
Zrozumienie splątanych zmian zajęłoby dłużej niż ich powtórzenieWiększość zmiany jest poprawna i pokryta przechodzącymi testami
Orientujesz się, że pierwotny prompt był błędny albo niepełnyPracę trudno byłoby odtworzyć, a zły jest jeden fragment
Czat jest długi i wciąż wraca do nieudanych podejśćBłąd ma jasną diagnozę, którą przekażesz w jednym prompcie

Jak zacząć od nowa czysto: wróć do ostatniego dobrego commita, usuń nowe pliki agenta przez git clean -fd (podgląd: git clean -nd), otwórz nowy czat, napisz prompt z jawnymi limitami plików i kryteriami akceptacji, a jeśli Plan Mode wygenerował plik planu, odwołaj się do niego. Ogólnie trzymaj rozmowy krótkie; dlaczego długie czaty tracą jakość, wyjaśnia zarządzanie kontekstem.

Czasem agent działa dobrze, a zawodzi edytor.

  • Agent przestaje odpowiadać albo zwraca błąd przy każdym żądaniu. Sprawdź sieć i wykorzystanie limitu w swoim planie, potem wybierz inny model w selektorze modeli, żeby wykluczyć awarię jednego dostawcy. Zobacz wybór modelu.
  • Serwer MCP nie działa albo znikają jego narzędzia. Otwórz logi tego serwera MCP (zobacz konfigurację MCP w Cursorze), popraw polecenie albo dane uwierzytelniające, które zgłaszają, potem zrestartuj serwer albo edytor.
  • Wysokie użycie CPU zaraz po otwarciu dużego repozytorium. Zwykle to indeksowanie i uspokaja się po jego zakończeniu. Jeśli nie, wyklucz katalogi z wygenerowanymi plikami plikiem ignore; zobacz niezbędną konfigurację.
  • Praca zniknęła po awarii. Najpierw sprawdź git stash list i git reflog. Zacommitowaną pracę da się odzyskać z refloga nawet po twardym resecie.
ObjawPrzyczynaJak wyjść
Pliki przywrócone, a aplikacja wciąż pada tak samoAgent uruchomił w terminalu migrację, instalację albo generator, a checkpoint tego nie obejmuje, albo utworzył nowe, nieśledzone pliki, które git restore --staged --worktree . zostawiaCofnij efekt uboczny ręcznie (wycofaj migrację, przeinstaluj zależności z lockfile przez npm ci), wypisz nowe pliki przez git clean -nd i usuń je przez git clean -fd, potem ponownie uruchom bramkę
git reset --hard usunął pracę, której potrzebowałeśNiezacommitowane zmiany nie trafiły do stashaZacommitowana praca: git reflog. Dodana do indeksu, ale niezacommitowana: czasem znajdzie ją git fsck --lost-found. Niezaindeksowane edycje: przywróć checkpoint, jeśli ten czat jest wciąż otwarty. Od teraz uruchamiaj git stash push -u przed każdym resetem
Test jest zielony, a błąd nadal jestAgent poluzował test zamiast naprawić kodPrzywróć test z main przez git restore --source main -- TEST_FILE (TEST_FILE to ścieżka poluzowanego testu), potem ponów prompt z zawężoną poprawką z dopiskiem „do not modify tests”
Nowy czat znowu robi tę samą błędną zmianęBłędne założenie siedzi w kodzie albo w nieaktualnej regule, a nie w starym czaciePopraw albo dodaj regułę projektu, która opisuje konwencję, potem spróbuj ponownie
Po poprawce testy przechodzą osobno, a razem padająAgent wprowadził współdzielony stan: zmienną na poziomie modułu, niewyczyszczony mock, ponownie używane połączenie z baząPoproś agenta, by znalazł stan współdzielony między testami i go odizolował; zobacz wzorce testowania w Cursorze
Logi debugujące trafiają do pull requestaInstrumentacja nie była oznaczona, więc nic jej nie wychwyciłoOznaczaj każdą tymczasową linię logu i włącz git grep -n --untracked "DEBUG-" do bramki przed PR

Wersję tej strony dla Codeksa znajdziesz w artykule odzyskiwanie po błędach w Codeksie.