Przejdź do głównej zawartości

Jak przygotować repozytorium do pracy agentów

Repozytorium gotowe dla agentów to takie, w którym o poprawności zmiany agenta decydują automatyczne kontrole, a nie człowiek czytający diff. Umożliwia to sześć cech: jedna komenda uruchamiająca wszystkie bramki, szybka informacja zwrotna, deterministyczne testy, ścisłe typy i lint, egzekwowane granice modułów oraz powtarzalne dane testowe. Każdą cechę ocenia się w skali 0–3 promptem audytowym.

Ta strona jest dla programistów, którzy chcą przestać czytać każdą linię napisaną przez agenta, i dla tech leadów decydujących, które repozytoria nadają się do uruchomień w tle. Dałeś agentowi dobrze opisany ticket. Zgłosił „wszystkie testy przechodzą”, a ty i tak spędziłeś 40 minut nad diffem, bo komenda, którą uruchomił, pomijała testy integracyjne, dwa testy i tak padają co piąte uruchomienie, a nic nie powstrzymałoby go przed zaimportowaniem modułu rozliczeń z warstwy UI. Ticket był w porządku; to repozytorium niczego nie potrafiło udowodnić.

  • Skalę ocen 0–3 dla sześciu cech, z dowodami, które uzasadniają każdą ocenę.
  • Gotowy prompt audytowy, który zmusza agenta do pomiaru zamiast zgadywania.
  • Kolejność napraw i trzy prompty, które je wykonują: jedna komenda sprawdzająca, niestabilne testy i egzekwowane granice.
  • Test kanarkowy, który dowodzi, że kontrole łapią defekty, zanim dopuścisz uruchomienia bez nadzoru.
  • Typowe awarie, przede wszystkim agenta, który doprowadza kontrolę do zielonego wyniku, osłabiając ją.

Dlaczego to repozytorium decyduje, czy możesz przestać czytać diffy?

Dział zatytułowany „Dlaczego to repozytorium decyduje, czy możesz przestać czytać diffy?”

Deklaracja agenta, że praca jest skończona, jest warta dokładnie tyle, ile kontrola, która za nią stoi. Jeśli jedynym sposobem na stwierdzenie poprawności zmiany jest jej przeczytanie, to ją czytasz, niezależnie od jakości modelu. Każda cecha z tej strony zamienia jeden rodzaj czytania w kontrolę, która działa bez ciebie.

Najmocniejszy zewnętrzny dowód pochodzi od DORA. Raport DORA 2025 (blog Google Cloud, Nathen Harvey i Derek DeBellis, 2025-09-23) wykazał pozytywny związek między adopcją AI a przepustowością dostarczania i negatywny ze stabilnością dostarczania. Jego wyjaśnienie: „Without robust control systems, like strong automated testing, mature version control practices, and fast feedback loops, an increase in change volume leads to instability. Teams working in loosely coupled architectures with fast feedback loops see gains, while those constrained by tightly coupled systems and slow processes see little or no benefit.” Podsumowanie tego samego raportu mówi, że AI „amplifies what’s already there”, czyli wzmacnia to, co już jest.

Stripe pokazuje drugi koniec skali: jego Minions scalają ponad 1300 pull requestów tygodniowo bez kodu napisanego przez człowieka (dane wewnętrzne firmy, Alistair Gray, stripe.dev, 2026-02-19), a ich pętla kończy się po „at most two rounds of CI” (Minions, część 1, stripe.dev, 2026-02-09) i działa na „over three million” testów.

W kategoriach harnessu repozytorium leży obok siedmiu warstw harnessu, a nie w nich. Harness ogranicza, co agent może zrobić; repozytorium decyduje, czy cokolwiek potrafi sprawdzić, co zrobił.

Jakie sześć cech sprawia, że repozytorium jest gotowe dla agentów?

Dział zatytułowany „Jakie sześć cech sprawia, że repozytorium jest gotowe dla agentów?”
#CechaCo robi agent bez niejJaką kontrolę umożliwia
1Jedna komenda sprawdzającaZgaduje komendę testów, uruchamia tylko testy jednostkowe i melduje „testy przechodzą”„Gotowe” znaczy, że jedna nazwana komenda zwróciła 0, a CI uruchamia tę samą komendę
2Szybka informacja zwrotnaPomija wolne testy albo robi 30 edycji przed pierwszym uruchomieniem, więc błędy przychodzą późno i splątaneAgent uruchamia kontrolę po każdej istotnej edycji i naprawia błąd, gdy przyczyna jest jeszcze lokalna
3Deterministyczne testyUczy się, że czerwony wynik bywa szumem, powtarza do skutku albo „naprawia” niestabilny test, edytując goCzerwony wynik zawsze oznacza defekt, więc zielony coś znaczy
4Ścisłe typy i lint jako bramkiPrzepuszcza any, None albo niesprawdzony indeks i wymyśla metodę, którą kompilator by odrzuciłCałe klasy błędów (zły kształt danych, brakujące pole, wymyślone API) padają w sekundy, bez testu
5Egzekwowane granice modułówImportuje cokolwiek, co sprawia, że zmiana działa, więc diff jest dziś poprawny, a architektura się rozmywaNaruszenie warstwy oblewa kontrolę, więc recenzujesz interfejs, a nie każdy import
6Powtarzalne dane i konfiguracjaPotrzebuje wspólnej bazy, twoich poświadczeń albo ręcznego kroku, więc albo nie może zweryfikować, albo weryfikuje na złym stanieŚwieży klon dochodzi do zielonej kontroli jedną komendą startową: lokalnie, w worktree albo w środowisku chmurowym

Dwóch rzeczy celowo nie ma na liście. Nie ma pokrycia testami: wysoki procent przy słabych asercjach przepuszcza błędny kod, a o tym, jak mierzyć, co testy naprawdę łapią, mówi strona o sile wyroczni. Nie ma też pliku kontekstu (AGENTS.md, CLAUDE.md, Rules w Cursorze): nazywa on komendę, ale repozytorium bez powyższych cech nie naprawi się przez ich opisanie. Co powinno się tam znaleźć, opisuje strona o zwięzłych plikach AGENTS.md i CLAUDE.md.

Oceniaj każdą cechę na podstawie dowodu, który da się wskazać: komendy, jej wyniku, czasu działania, pliku konfiguracyjnego. Ocena bez dowodu to 0. Progi czasowe są rekomendacją tej strony dla wewnętrznej pętli agenta, a nie opublikowanym benchmarkiem; dostosuj je raz, wpisz swoją wersję do karty ocen i trzymaj je stałe, żeby wyniki były porównywalne w czasie.

Cecha0123
1. Jedna komenda sprawdzającaBrak jednej komendy; bramki żyją tylko w YAML-u CI albo w głowach ludziKomenda istnieje, ale pomija bramkę uruchamianą przez CI albo wymaga wcześniejszej ręcznej konfiguracjiJedna komenda uruchamia każdą bramkę CI ze świeżego klona i jest nazwana w AGENTS.md lub CLAUDE.mdDo tego wariant zawężony (zmieniony pakiet lub pliki), błędy w formie, na którą agent może zareagować, i hook albo goal, który ją uruchamia, zanim agent może skończyć
2. Szybka informacja zwrotnaKontrola dostępna dla agenta trwa ponad 15 minut albo działa tylko w CI5–15 minutKontrola zawężona poniżej 2 minut; pełna poniżej 15Kontrola zawężona poniżej 30 sekund; pełna, zrównoleglona, poniżej 10 minut
3. Deterministyczne testyZnane niestabilne testy, domyślnie włączone ponawianie, testy sięgające do prawdziwej sieci lub zegaraNiestabilne testy są ręcznie izolowane w kwarantannie; część testów wciąż zależy od czasu, kolejności lub sieciTrzy kolejne uruchomienia i jedno w losowej kolejności dają identyczne wyniki; zegar, losowość i sieć są w testach kontrolowaneDo tego: niestabilne wyniki na gałęzi głównej są śledzone, testy w kwarantannie mają właściciela i datę ważności, nieoczekiwane wywołanie sieci oblewa test
4. Ścisłe typy i lintBrak typów albo tryb ścisły wyłączony, a lint daje tylko ostrzeżeniaTypy są, ale tryb ścisły jest wyłączony albo błędy typów i lintu nie oblewają CITryb ścisły włączony ("strict": true w tsconfig.json, mypy --strict lub odpowiednik w twoim języku), a obie bramki oblewają CIDo tego: zero ostrzeżeń, a każde wyciszenie (@ts-expect-error, # type: ignore, wyłączenia lintu) wymaga uzasadnienia i jest liczone, z limitem, który może tylko maleć
5. Granice modułówBrak zadeklarowanych warstw; cykliczne importy; mała zmiana dotyka wielu niezwiązanych modułówArchitektura jest opisana w dokumencie, ale nic jej nie egzekwujeNarzędzie w komendzie sprawdzającej oblewa zakazane importy (na przykład dependency-cruiser dla JavaScriptu i TypeScriptu, import-linter dla Pythona)Do tego: każdy moduł ma publiczny interfejs z własnymi testami działającymi w izolacji, a własność jest przypisana (CODEOWNERS)
6. Dane i konfiguracjaTesty lub serwer deweloperski wymagają wspólnej bazy, poświadczeń kolegi albo danych produkcyjnychSkrypt seedujący istnieje, ale uruchamia się go ręcznie i rozjeżdża się ze schematemJedna komenda startowa instaluje zależności, migruje i ładuje deterministyczne fixture’y ze świeżego klona, bez sekretów produkcyjnychDo tego: izolacja per uruchomienie (blok portów i baza per worktree lub kontener), fixture’y wersjonowane razem z migracjami, atrapy usług zewnętrznych

Wynik łączny jest liczony z 18, ale minimum ma większe znaczenie niż suma, bo jedna słaba cecha podważa pozostałe. Szybki, ale niestabilny zestaw testów uczy agenta ignorować czerwony wynik. Ta strona rekomenduje trzy progi:

ProfilCo oznaczaJakie uruchomienia wspiera
Cecha 1 lub 3 na 0Nic nie potrafi wiarygodnie powiedzieć „nie”Tylko praca interaktywna; czytasz diff
Każda cecha co najmniej na 1, przynajmniej jedna wciąż na 1Kontrole łapią część defektów i wiesz, którychUruchomienia interaktywne i nadzorowane w tle; ryzykowne obszary recenzujesz, czytając
Każda cecha co najmniej na 2 (łącznie 12 lub więcej)O większości wyników decydują kontroleUruchomienia w tle i nocne na ticketach niskiego ryzyka; recenzujesz dowody, nie diffy

O autonomii decyduje się dla każdej zmiany, a nie dla całego repozytorium, więc łącz ocenę z zasięgiem skutków i odwracalnością ticketu, opisanymi na stronie o przygotowaniu backlogu dla agentów, oraz z trybem uruchomienia ze strony o uprawnieniach, sandboksach i trybach zatwierdzania.

Sam audyt to wynik pracy agenta, więc agent musi pokazać dowody, a ty powtarzasz to, na co się powołuje. Uruchamiaj go w trybie tylko do odczytu.

  1. Uruchom prompt audytowy poniżej w swoim narzędziu (zobacz zakładki dla każdego). Pozwól mu uruchamiać komendy sprawdzające, testy i kontrolę typów, bo mierzenie czasu i powtarzanie ich jest tu sednem.

  2. Weryfikuj kartę ocen, nie prozę. Dla każdej oceny 2 lub 3 uruchom ponownie wskazaną komendę i porównaj wynik oraz czas. To łapie najczęstszy błąd audytu: ocenę przyznaną, bo istnieje skrypt o właściwej nazwie.

  3. Dodaj kartę ocen do repozytorium jako docs/agent-readiness.md, z datą, narzędziem i modelem, które ją wygenerowały, oraz z użytymi progami. Odpowiada za nią tech lead; następny audyt porównuje się z nią diffem.

  4. Naprawiaj w tej kolejności: jedna komenda, determinizm, szybkość, typy, granice, dane. Komenda sprawdzająca czyni każdą późniejszą poprawkę weryfikowalną; niestabilna kontrola odbiera wiarygodność każdemu innemu sygnałowi.

  5. Przeprowadź test kanarkowy (poniżej), zanim dopuścisz repozytorium do uruchomień w tle. Ocena mówi, że bramki istnieją; test kanarkowy dowodzi, że łapią defekty.

  6. Powtarzaj audyt po każdej zmianie narzędzi, potoku CI lub domyślnego modelu, a przynajmniej raz na kwartał. Porównuj go diffem z kartą ocen zapisaną w repozytorium.

Interaktywnie: wklej prompt do sesji uruchomionej w trybie Manual (claude --permission-mode manual), żeby zatwierdzać każdą komendę audytu, albo do trybu planowania (/plan), jeśli chcesz tylko statycznej analizy, a czasy zmierzysz sam.

Bez interfejsu, dla skryptowego audytu, który co kwartał porównasz diffem, zatwierdź z góry tylko narzędzia do odczytu i komendy potrzebne audytowi. claude -p startuje w trybie Manual, więc wszystko, czego nie wymieniłeś, zostanie odrzucone, a nie zapytane (sprawdzone na Claude Code 2.1.283):

Okno terminala
# terminal, katalog główny repozytorium; readiness-audit.txt zawiera prompt powyżej
claude -p "$(cat readiness-audit.txt)" \
--allowedTools "Read,Grep,Glob,Bash(git log *),Bash(pnpm check),Bash(pnpm check:changed),Bash(pnpm lint),Bash(pnpm test),Bash(pnpm typecheck),Bash(time pnpm check),Bash(time pnpm check:changed)" \
> docs/agent-readiness.new.md

Bash(time pnpm check) i Bash(time pnpm check:changed) pozwalają audytowi zmierzyć czas tych dwóch kontroli i niczego więcej; Bash(pnpm test) jest dokładną komendą, więc audyt nie dopisze argumentów, takich jak aktualizacja snapshotów. Ocenę cechy 2 bez pomiaru czasu odrzucasz. Zamień komendy pnpm na te z twojego repozytorium.

Pierwsza poprawka to prawie zawsze jeden punkt wejścia, który uruchamia dokładnie to, co CI, plus zawężony wariant dla wewnętrznej pętli agenta. W monorepo TypeScriptu z pnpm i Vitestem:

{
"scripts": {
"typecheck": "tsc --noEmit",
"lint": "eslint . --max-warnings 0",
"boundaries": "depcruise src --ignore-known",
"test": "vitest run",
"check": "pnpm typecheck && pnpm lint && pnpm boundaries && pnpm test",
"check:changed": "pnpm typecheck && vitest run --changed origin/main"
}
}

Potem niech CI wywołuje pnpm check i nic więcej, żeby komenda lokalna i bramka nie mogły się rozjechać. (W Pythonie: cel w Makefile uruchamiający ruff check, mypy --strict, lint-imports i pytest.)

Na koniec nazwij komendę w pliku kontekstu:

## Checks
Run `pnpm check:changed` after each change and `pnpm check` before you say you are done.
Both must exit 0. Do not edit test files, tsconfig.json or .dependency-cruiser.js to make them pass.

Linia w pliku kontekstu to rada. Żeby kontrola była nie do obejścia, uruchamiaj ją w momencie, gdy agent próbuje skończyć.

Hook Stop (model zdarzeń opisuje strona o hookach jako deterministycznych zabezpieczeniach) uruchamia się za każdym razem, gdy Claude próbuje zakończyć turę; Stop nie przyjmuje matchera. Kod wyjścia 2 blokuje zakończenie tury: Claude pracuje dalej, więc wypisz wynik nieudanej kontroli na stderr, żeby mógł na niego zareagować (według dokumentacji hooków Claude Code, sprawdzone 2026-09-26). Zapisz go w .claude/settings.json i zacommituj:

{
"hooks": {
"Stop": [
{
"hooks": [{ "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/require-check.sh" }]
}
]
}
}
.claude/hooks/require-check.sh
#!/usr/bin/env bash
input=$(cat)
# Avoid an endless loop: if a Stop hook already kept Claude going, let it stop.
if echo "$input" | grep -q '"stop_hook_active": *true'; then exit 0; fi
if ! out=$(pnpm check:changed 2>&1); then
echo "pnpm check:changed failed. Fix the cause, not the test:" >&2
echo "$out" | tail -n 60 >&2
exit 2
fi

Nadaj mu prawo wykonywania: chmod +x .claude/hooks/require-check.sh.

Zabezpieczenie przed pętlą jest ważne: bez niego kontrola, której agent nie potrafi naprawić, blokuje zakończenie tury, dopóki Claude Code nie zignoruje hooka po więcej niż ośmiu kolejnych blokadach (domyślny limit, CLAUDE_CODE_STOP_HOOK_BLOCK_CAP) i nie zakończy tury. Z nim Claude dostaje jedną ponowną próbę; jeśli kontrola wciąż jest czerwona, tura się kończy, a zabezpieczeniem pozostaje CI. Przy długich uruchomieniach tę samą rolę pełni warunek /goal.

Niestabilny test szkodzi agentowi bardziej niż człowiekowi. Ty pamiętasz, że checkout.spec.ts bywa kapryśny; agent widzi czerwony wynik i przepisuje działający kod albo edytuje test, aż przejdzie. Dlatego izoluj niestabilne testy, zanim zaczniesz stroić szybkość.

Gdy zestaw testów jest już deterministyczny, szybkość to zwykle kwestia zakresu: uruchamiaj tylko to, na co zmiana może wpłynąć (vitest run --changed origin/main, które obejmuje zmiany zatwierdzone, dodane do indeksu i niedodane na gałęzi, a także nowe pliki, których Git nie ignoruje, albo cele testowe per pakiet w monorepo), wolne testy end-to-end trzymaj w pełnej kontroli i w CI, a pełną kontrolę zrównoleglij. Wzorce po stronie testów szczegółowo opisują strony o testach jednostkowych z agentami i o zarządzaniu danymi testowymi.

Agenci idą przez twoje importy drogą najmniejszego oporu: jeśli warstwa UI może zaimportować klienta bazy danych, prędzej czy później któraś zmiana to zrobi. Reguła granic zamienia komentarz w recenzji w oblaną kontrolę.

Komendy instalacji, których oczekuje prompt, to pnpm add -D dependency-cruiser (z npm: npm i -D dependency-cruiser; wersja 18.4.0 w npm, sprawdzone 2026-09-26) oraz pip install import-linter albo uv add --dev import-linter (wersja 2.15 w PyPI, sprawdzone 2026-09-26).

Ścisłe typy działają według tej samej logiki zapadki. Włączenie "strict": true w dużym kodzie TypeScriptu potrafi naraz wygenerować tysiące błędów, więc włączaj je katalog po katalogu (ostrzejszy tsconfig.json dla nowych lub zmigrowanych pakietów) i licz wyciszenia w kontroli, żeby ich liczba mogła tylko maleć. Podział tej pracy na sesje agenta opisuje strona o dużych bazach kodu.

Udowodnij testem kanarkowym, że kontrole łapią defekty

Dział zatytułowany „Udowodnij testem kanarkowym, że kontrole łapią defekty”

Wysoka ocena mówi, że bramki istnieją i działają. Nie mówi, że cokolwiek łapią. Zanim dopuścisz repozytorium do uruchomień w tle, podłóż znane defekty i sprawdź, że kontrola zmienia się na czerwono przy każdym z nich. To mała, ręczna forma testowania mutacyjnego; wersję automatyczną opisuje strona o sile wyroczni.

Każdy defekt, który przetrwał, wskazuje zawyżoną ocenę: obniż ją i zamknij lukę, zanim zwiększysz autonomię. Powtarzaj test kanarkowy co kwartał; kontrola, która w marcu złapała pięć defektów, może przestać łapać jeden, gdy ktoś w czerwcu doda --passWithNoTests.

Kto zatwierdza. Za kartę ocen i wynik testu kanarkowego odpowiada tech lead. Repozytorium przechodzi do wyższego profilu autonomii dopiero wtedy, gdy karta spełnia próg z tabeli powyżej, a ostatni test kanarkowy złapał każdy podłożony defekt. Od tego momentu zmiany przyjmuje się na podstawie dowodów, jak opisuje strona dowody zamiast diffów.

Co się psuje, gdy przygotowujesz repozytorium dla agentów?

Dział zatytułowany „Co się psuje, gdy przygotowujesz repozytorium dla agentów?”

Agent doprowadza kontrolę do zielonego wyniku, osłabiając ją. Dodaje @ts-expect-error, oznacza test jako .skip albo edytuje konfigurację lintu lub granic; egzekwowana kontrola staje się celem. Jak naprawić: zablokuj agentowi zapis do konfiguracji testów, lintu, granic i CI; licz wyciszenia; kieruj te pliki do recenzji człowieka przez CODEOWNERS. Pełny wzorzec opisuje strona o ochronie wyroczni.

Audyt podaje oceny, których nie zmierzył. Skrypt test:e2e, który od miesięcy nie przeszedł, dostaje 2. Jak naprawić: odrzucaj każdy wiersz bez kodu wyjścia i czasu, a wskazane komendy uruchamiaj sam (krok 2 audytu).

Tryb ścisły daje tysiące błędów i praca staje. Jak naprawić: włączaj ścisłość po jednym pakiecie, zapisz istniejące naruszenia granic jako bazę odniesienia i niech agent porządkuje jeden moduł na sesję.

Kontrola zawężona przechodzi, a CI pada. check:changed pominął konsumenta w innym pakiecie. Jak naprawić: przy zmianach we wspólnych pakietach trzymaj pełne check w hooku Stop lub w celu i dodaj pominiętą ścieżkę zależności do zawężonego wyboru.

Kwarantanna testów zamienia się w cmentarz. Dwadzieścia pominiętych testów bez właściciela, a agent dodaje dwudziesty pierwszy. Jak naprawić: każde pominięcie ma właściciela i datę ważności; przeterminowane ograniczają determinizm do 1.

Dane seedujące rozjeżdżają się ze schematem. Jak naprawić: komenda startowa migruje świeżą bazę przed seedowaniem, w ramach pełnej kontroli, więc rozjazd oblewa kontrolę, zamiast się ukrywać.

Dwóch agentów dzieli jedną bazę albo jeden port. Jak naprawić: jeden worktree i jeden blok portów na agenta; zobacz strony o równoległych agentach w worktree i o środowiskach efemerycznych.

Audyt mówi, gdzie stoi repozytorium. Wymaganiem wstępnym jest przegląd harnessu; tech leadzi przechodzą dalej do wspólnych reguł agentów, programiści do funkcji dopasowania.