W poprzednich wpisach budowaliśmy infrastrukturę – instrukcje, skills, agenci, MCP, hooks, agentic workflows. Teraz skupiamy się na narzędziu które to wszystko spina w jeden autonomiczny przepływ pracy: Copilot Coding Agent. Nie mylić z "agent mode" w VS Code – to dwa różne produkty.
Coding Agent to asynchroniczny developer działający na GitHubie. Przypisujesz mu issue, wychodzisz na kawę, a gdy wracasz – masz gotowego draft PR z implementacją, testami i opisem zmian. Wszystko zalogowane krok po kroku w GitHub Actions. Ty tylko reviewujesz i kierujesz.
W tym wpisie pokazuję jak go uruchomić, jak pisać issues które dają dobre wyniki i – co najważniejsze – gdzie agent się myli i jak go prowadzić żeby nie robił głupot w PR-ach. Ta ostatnia sekcja to mój główny dodatek, oparty na doświadczeniu z produkcyjnymi projektami .NET.
Zanim cokolwiek, trzeba to rozróżnienie powiedzieć głośno i wyraźnie, bo dokumentacja i artykuły często je mieszają:
── dwa produkty, jedna nazwa "Copilot" ──
Agent mode (VS Code) ├─ Działa: lokalnie w edytorze, synchronicznie ├─ Inicjuje: Ty – wpisujesz prompt, czekasz na odpowiedź ├─ Edytuje: pliki na Twojej maszynie ├─ Widzisz: zmiany w edytorze w czasie rzeczywistym └─ Omawiany: wpisy 1–9 tego cyklu
Coding Agent (GitHub.com) ├─ Działa: w GitHub Actions, asynchronicznie ├─ Inicjuje: przypisanie issue lub prompt z chatu ├─ Edytuje: kod w izolowanym środowisku Actions ├─ Widzisz: draft PR z pełnym logiem sesji └─ Omawiany: ten wpis
🔍 Prosta zasada zapamiętania
Agent mode = parowanie w czasie rzeczywistym. Jesteś przy komputerze, widzisz co robi, kierujesz na bieżąco. Coding Agent = delegowanie zadania. Opisujesz co chcesz, wypisujesz się z procesu, wracasz do gotowego PR.
Analogia z zarządzania: agent mode to pair programming z juniorem, coding agent to delegowanie zadania seniorowi który pracuje autonomicznie i przynosi gotowy pull request.
Jak Coding Agent działa – cykl życia zadania
Zrozumienie kolejności kroków jest kluczem do skutecznego współdziałania z agentem. Wiedząc co robi w każdej fazie, wiesz kiedy warto interweniować i jak.
1. PRZYPISANIE👤 Ty
Przypisujesz issue do Copilota (Assignees → Copilot) lub używasz prompta w Copilot Chat. Opcjonalnie dodajesz Optional prompt z dodatkowymi wskazówkami – to bardzo ważne pole, wrócimy do niego.
2. ANALIZA🤖 Agent
Agent czyta tytuł i opis issue, wszystkie istniejące komentarze, custom instructions repozytorium i ewentualny copilot-setup-steps.yml. Analizuje strukturę repozytorium, szuka powiązanych plików. Nie widzi komentarzy dodanych po przypisaniu – to ważne ograniczenie.
3. DRAFT PR🤖 Agent
Agent natychmiast tworzy draft PR z pustym commitem. To nie błąd – tak agent sygnalizuje że zaczął pracę. Możesz obserwować postęp w zakładce Actions lub przez link w issue. PR jest draft dopóki agent nie skończy.
4. IMPLEMENTACJA🤖 Agent
Agent pracuje w izolowanym środowisku GitHub Actions: przeszukuje kod, pisze implementację, uruchamia testy. Każdy krok jest logowany. Możesz śledzić postęp w czasie rzeczywistym klikając "View session" na PR. Sesja trwa maksymalnie 60 minut.
5. REVIEW REQUEST🤖 Agent → 👤 Ty
Gdy agent skończy, dodaje Cię jako reviewera i wysyła notyfikację. PR pozostaje jako draft – agent nie może go sam oznaczyć jako "Ready for review" i nie może go zaaprobować ani zmerge'ować. Musi to zrobić człowiek z uprawnieniami write.
6. ITERACJA / MERGE👤 Ty → 🤖 Agent → 👤 Ty
Reviewujesz PR. Jeśli coś wymaga poprawki – zostawiasz komentarz z @copilot. Agent odpowiada na Twój feedback, wprowadza zmiany i aktualizuje PR. Iterujesz do satysfakcji, potem zatwierdzasz i merge'ujesz.
⚠️ Komentarze do issue po przypisaniu – agent ich nie widzi
To jedno z najczęstszych nieporozumień. Gdy przypisujesz issue do Copilota, agent robi snapshot treści issue w tym momencie. Komentarze dodane po przypisaniu są niewidoczne dla agenta. Jeśli chcesz przekazać dodatkowe instrukcje – użyj pola Optional prompt podczas przypisywania, albo skomentuj bezpośrednio na draft PR po jego stworzeniu z tagiem @copilot.
Jakie zadania delegować – a jakich nie
Coding Agent świetnie radzi sobie z zadaniami o małej do średniej złożoności i jasno zdefiniowanym wyniku. Gorzej z zadaniami które wymagają głębokiej znajomości domeny, subtelnych decyzji architektonicznych lub kreatywności. Poniższa tabela pomaga podjąć decyzję:
Typ zadania
Deleguj?
Dlaczego / zastrzeżenia
Dodanie XML doc comments do publicznych API
✅ Tak
Czyste, mechaniczne, łatwe do zweryfikowania
Refaktoryzacja powtarzającego się kodu w kilku plikach
✅ Tak
Agent dobrze radzi sobie z "extract method", "rename", "deduplicate"
Dodanie testów jednostkowych dla istniejącej klasy
✅ Tak
Szczegółowo opisz stack testowy i wzorce (patrz niżej)
Implementacja nowego endpointu według istniejącego wzorca
✅ Tak
Wskaż w issue konkretny istniejący endpoint jako przykład
Aktualizacja zależności NuGet i naprawa breaking changes
✅ Tak
Mała wersja – tak. Major upgrade – ostrożnie, sprawdź migration guide
Dodanie walidacji FluentValidation do istniejącego command
✅ Tak
Opisz dokładnie reguły walidacji w issue
Naprawienie konkretnego, dobrze opisanego buga
⚠️ Ryzyko
Zależy od złożoności. Bugs z gotową reprodukcją – ok. Bez reprodukcji – agent zgaduje
Projektowanie architektury nowego modułu
❌ Nie
Wymaga kontekstu domeny i decyzji które nie powinny być delegowane
Implementacja złożonej logiki biznesowej z wieloma regułami
❌ Nie
Agent nie zna Twojej domeny biznesowej – wygeneruje kod który kompiluje ale robi nie to
Optymalizacja wydajności bez profilu
❌ Nie
Agent optymalizuje w ciemno – często pogarsza czytelność bez mierzalnego zysku
Zmiany dotykające wielu repozytoriów naraz
❌ Nie
Twarde ograniczenie: agent pracuje tylko w jednym repo naraz
Migracja dużej bazy do nowego frameworka
❌ Nie
Zbyt złożone, zbyt dużo kontekstu, zbyt wysokie ryzyko pomyłki
🔍 Złota reguła: "1-godzinne zadanie junior developera"
Coding Agent najlepiej sprawdza się przy zadaniach które dobry junior developer zrobiłby w 30–60 minut, gdybyś mu je dobrze opisał. Jeśli zadanie trwałoby dłużej – prawdopodobnie jest za złożone. Jeśli krócej – możesz zrobić to sam w agent mode szybciej niż wypiszesz issue.
Jak pisać issues które dają dobre wyniki
Jakość PR-a jest wprost proporcjonalna do jakości issue. Agent nie odgaduje intencji – czyta to co napisałeś. Trzy minuty więcej na opis issue to godzina mniej na poprawki w review.
❌ Issue które daje złe wyniki
Tytuł: Dodaj testy do OrderService
Opis:
Potrzebujemy więcej testów.
OrderService nie ma wystarczającego pokrycia.
⛔ Agent nie wie jakiego frameworka użyć, jakich scenariuszy testować, jakie wzorce stosować. Wygeneruje coś – ale prawdopodobnie nie to czego chcesz.
✅ Issue które daje dobre wyniki
Tytuł: Dodaj testy jednostkowe do OrderService
Opis:
## Co zrobić
Napisz testy jednostkowe dla klasy
`Application/Orders/OrderService.cs`.
## Stack testowy
- xUnit 2, FluentAssertions, NSubstitute
- Wzorzec AAA z komentarzami
- Plik testowy: `Tests/Application/Orders/
OrderServiceTests.cs`
## Scenariusze do pokrycia
- CancelOrder: sukces, już anulowane, nie istnieje
- GetPendingOrders: lista, pusta lista
- UpdateStatus: prawidłowy status, nieprawidłowy status
## Przykład istniejącego testu
Zobacz: `Tests/Application/Products/
ProductServiceTests.cs`
## Czego NIE robić
- Nie pisz testów integracyjnych
- Nie modyfikuj kodu OrderService
Anatomia dobrego issue dla Coding Agenta
🔍 Sześć elementów skutecznego issue
Konkretny cel – "Napisz testy dla OrderService" zamiast "Popraw jakość kodu". Agent potrzebuje jasno zdefiniowanego celu.
Wskazanie pliku lub klasy – podaj pełną ścieżkę. Agent przeszuka repo ale wskazówka przyspiesza i zawęża zakres zmian.
Stack technologiczny – jeśli masz custom instructions to może to wystarczyć. Jeśli nie – wpisz wprost jaki framework testowy, jakiego ORM używasz, jakie wzorce stosujecie.
Przykład do naśladowania – wskaż istniejący plik jako wzorzec. Agent jest świetny w generalizowaniu wzorców z przykładów. "Zrób jak w ProductServiceTests.cs" daje zwykle lepszy wynik niż długi opis.
Lista tego czego NIE robić – guardrails w treści issue. "Nie modyfikuj migracji", "Nie dodawaj nowych zależności NuGet bez potwierdzenia", "Nie zmieniaj kontraktów publicznych API".
Kryteria akceptacji – co musi być prawdą żeby zadanie było skończone. "Testy muszą przechodzić (dotnet test)", "Pokrycie >80% dla klasy OrderService".
Optional prompt – niedoceniane pole
Gdy przypisujesz issue do Copilota, pojawia się pole Optional prompt. To jest miejsce na instrukcje które nie powinny być w opisie issue (bo są specyficzne dla tej konkretnej sesji agenta), a które chcesz przekazać bezpośrednio. Użyj go do:
Zacznij od przeczytania pliku ARCHITECTURE.md żeby zrozumieć
nasze konwencje. Użyj NSubstitute (nie Moq) – mamy je ustandaryzowane
od Q3 2025. Jeśli testy nie przejdą za pierwszym razem, debuguj
przez dotnet test --verbosity detailed zanim zmienisz implementację.
⚠️ Na co uważać – gdzie agent się myli najczęściej
To jest sekcja której nie ma w dokumentacji – zebrałem ją z własnego doświadczenia i obserwacji jak Coding Agent zachowuje się na projektach .NET z Clean Architecture. Agent jest potężny, ale ma systematyczne błędy. Wiedząc o nich możesz im zapobiegać w opisie issue, albo wyłapywać je szybciej w review.
🎭Problem #1 – Testy które testują implementację, nie zachowanieBARDZO CZĘSTE
Symptom: Testy weryfikują że metoda wywołała _repository.Received(1).SaveChangesAsync() zamiast sprawdzać wynik operacji.
Agent domyślnie generuje testy "naiwne" – sprawdza co zostało wywołane (interaction testing), a nie co jest wynikiem (behavior testing). To daje złudne poczucie pokrycia: testy zielone, refaktoryzacja prywatnych szczegółów implementacji → testy czerwone bez powodu.
Zapobieganie: W issue napisz explicite: "Testuj zachowanie, nie implementację. Używaj asercji na wynikach i stanie, nie na wywołaniach mocków (unikaj .Received() poza absolutnie niezbędnymi przypadkami jak weryfikacja że email został wysłany)." Jeśli masz skill do testów z wpisu 6 – aktywuj go przez /generate-unit-tests zamiast delegować do Coding Agenta.
🔧Problem #2 – Naruszenia architektury przez najkrótszą drogęBARDZO CZĘSTE
Symptom: Agent wstrzykuje DbContext bezpośrednio do handlera MediatR zamiast przez repozytorium. Albo dodaje logikę biznesową do kontrolera bo "tak jest szybciej".
Agent optymalizuje pod kątem "działa" – i wybiera najkrótszą ścieżkę. Nie rozumie architektury konceptualnie, rozumie ją przez wzorce w kodzie. Jeśli Twoja architektura jest niespójna (masz jedno miejsce gdzie DbContext przecieka do Application) – agent to powieli.
Zapobieganie: Opisz w issue jakiej architektury używasz i wskaż plik jako przykład: "Używamy Clean Architecture. Warstwa Application nigdy nie dotyka DbContext bezpośrednio – zawsze przez interfejs repozytorium. Wzorzec: Application/Orders/Commands/CancelOrderCommand.cs." Utrzymuj też czyste repozytorium – agent uczy się z Twojego kodu.
📦Problem #3 – Dodawanie nowych zależności NuGet bez pytaniaCZĘSTE
Symptom: PR modyfikuje pliki .csproj dodając paczki NuGet których nie zatwierdziłeś – często duplikaty funkcjonalności którą już macie (np. Newtonsoft.Json gdy używacie System.Text.Json).
Agent sięga po znane mu biblioteki gdy czegoś nie wie jak zrobić. Jeśli nie powiesz mu że macie Mapster zamiast AutoMapper, albo Serilog zamiast NLog – wybierze to co zna lepiej z danych treningowych, czyli często popularniejszą alternatywę.
Zapobieganie: W custom instructions (wpis 5) wpisz listę zatwierdzonych zależności dla głównych kategorii. W issue dodaj guardrail: "Nie dodawaj nowych zależności NuGet. Jeśli potrzebujesz czegoś czego nie ma w projekcie – opisz to w komentarzu do PR zamiast dodawać paczki." W hook preToolUse (wpis 9) możesz zablokować modyfikacje *.csproj.
📝Problem #4 – Zbyt szeroki zakres zmianCZĘSTE
Symptom: Prosisz o dodanie jednej metody, agent refaktoryzuje pięć plików bo "przy okazji poprawił kilka rzeczy".
Agent jest entuzjastyczny. Widząc problem w sąsiednim pliku – chętnie go "naprawi". To może być pomocne, ale utrudnia code review i zwiększa ryzyko wprowadzenia regresji w miejscach których nie spodziewałeś się zmian.
Zapobieganie: Dodaj do issue sekcję "Scope": "Modyfikuj tylko pliki w katalogu Application/Orders/ i Tests/Application/Orders/. Jeśli widzisz problemy poza tym zakresem – opisz je w komentarzu do PR, nie naprawiaj." W pliku agenta możesz też użyć guardrail w custom instructions repozytorium.
🌐Problem #5 – Angielski zamiast języka projektuCZĘSTE w polskich projektach
Symptom: Nazwy klas, komentarze, komunikaty błędów, log messages – wszystko po angielsku, podczas gdy Wasz projekt używa polskich nazw domenowych.
Agent domyślnie pisze po angielsku. Jeśli Twoja domena biznesowa używa polskich pojęć (Zamówienie, Faktura, Kontrahent) a agent tłumaczy je na angielski (Order, Invoice, Contractor), powstaje niespójność która utrudnia komunikację z domain expertami.
Zapobieganie: W custom instructions repozytorium wpisz explicite: "Nazwy klas i metod w warstwie Domain używają polskich pojęć domenowych zgodnie z ubiquitous language projektu. Lista terminów: [...]". Alternatywnie – jeśli projekt jest po angielsku, wpisz to jasno żeby agent nie mieszał języków.
🔄Problem #6 – Pętla bez wyjścia gdy testy nie przechodząSPORADYCZNE
Symptom: Agent próbuje naprawić failing test, każda próba zmienia coś innego, po 10 commitach wraca do punktu wyjścia. Sesja kończy się timeoutem (60 min).
Gdy agent napotka failing test który nie jest łatwy do naprawienia, wchodzi w lokalną pętlę prób i błędów. Może skończyć się tym że "naprawia" test przez zmianę asercji zamiast naprawienia kodu. To jest moment gdy musisz interweniować.
Zapobieganie: Obserwuj postęp sesji w zakładce Actions. Jeśli widzisz wiele małych commitów z "fix tests" – wejdź do draft PR i skomentuj z @copilot: "Przestań próbować naprawić ten test. Opisz w komentarzu co dokładnie nie przechodzi i dlaczego Twoim zdaniem tak jest – ja to naprawię ręcznie." Lepiej zatrzymać agenta niż pozwolić mu na 20 commitów guesswork.
🔒Problem #7 – Hardcoded secrets i connection strings w kodzieRZADKIE ale KRYTYCZNE
Symptom: Agent wstawia przykładowe connection stringi, API keys lub credentiale do kodu testów integracyjnych lub appsettings.
Zdarza się rzadko ale jest poważne. Agent kopiuje wzorzec z kontekstu – jeśli widzi connection string w innym pliku testowym (nawet zamarkowany jako placeholder) może podobny wygenerować dla nowego testu.
Zapobieganie: W custom instructions: "Nigdy nie umieszczaj connection strings, API keys ani żadnych sekretów w kodzie – używaj IConfiguration i zmiennych środowiskowych." Dodaj hook agentStop który skanuje diff pod kątem wzorców sekretów (regex na Password=, ApiKey= itp.) i blokuje jeśli znajdzie.
Jak reviewować PR od Coding Agenta
PR od agenta to nie kod kolegi – wymaga innego podejścia do review. Agent jest szybki i pewny siebie, ale nie rozumie kontekstu tak jak człowiek. Poniższy checklist pomaga wyłapać systematyczne błędy zanim trafią na main.
🌟 Kolejność review która działa
Przeczytaj opis PR – agent pisze go automatycznie. Czy rozumiał zadanie tak jak Ty chciałeś? Jeśli opis mija się z intencją – reszta kodu prawdopodobnie też.
Obejrzyj sesję agenta – kliknij "View session" na PR. Widzisz każdy krok: jakie pliki czytał, jakie komendy uruchamiał, gdzie miał problemy. To szybko ujawnia czy agent wiedział co robi czy strzelał na oślep.
Sprawdź scope zmian – przejdź do zakładki "Files changed". Czy agent modyfikował tylko pliki które powinien? Jeśli zmienił coś nieoczekiwanego – to pierwszy sygnał ostrzegawczy.
Przejrzyj testy – czy testują zachowanie czy implementację? Czy scenariusze pokrywają edge cases które opisałeś w issue?
Uruchom lokalnie – sklonuj gałąź PR i uruchom dotnet test lokalnie. Nie ufaj tylko zielonemu CI – agent mógł zmienić testy żeby przeszły zamiast naprawić kod.
Checklist review dla PR-ów od Coding Agenta
Opis PR opisuje dokładnie to co chciałem – nie ma rozbieżności z intencją issue
Zakres zmian jest ograniczony do plików które powinny być zmienione
Brak nowych zależności NuGet których nie zatwierdziłem
Brak hardcoded connection strings, sekretów ani API keys
Architektura respektowana – zależności idą we właściwym kierunku
Testy testują zachowanie a nie wywołania wewnętrzne (brak nadużycia .Received())
Nazwy klas i metod są zgodne z konwencjami i językiem domenowym projektu
Nowe publiczne metody mają XML doc comments
Kod jest asynchroniczny gdzie powinien być – brak .Result i .Wait()
Zmiany są zrozumiałe dla mnie jako reviewera – jeśli nie, proszę agenta o wyjaśnienie
Jak iterować z agentem po review
Gdy widzisz problem w PR – nie poprawiaj ręcznie (chyba że to drobiazg). Skomentuj z @copilot i opisz co poprawić. Agent odpowie na komentarz, wprowadzi zmiany i zaktualizuje PR. Ten feedback loop jest jedną z najsilniejszych stron Coding Agenta.
@copilot W pliku OrderServiceTests.cs, linia 47:
test `CancelOrder_WhenOrderExists_ShouldChangeStatus` weryfikuje
wywołanie `_repository.Received(1).UpdateAsync()` zamiast sprawdzać
czy status zamówienia zmienił się na Cancelled.
Proszę przepisz asercję żeby testowała wynik operacji:
result.Status.Should().Be(OrderStatus.Cancelled)
⚠️ Nie możesz zaaprobować własnego PR-a – to funkcja bezpieczeństwa
GitHub nie pozwoli Ci zaaprobować PR który sam zleciłeś Copilotowi. Twoje konto jest oznaczone jako "co-autor" przez mechanizm atrybucji. W repozytoriach z wymaganym review – musi to zrobić inny developer. To nie błąd, to celowe zabezpieczenie gwarantujące niezależny przegląd kodu agenta.
Konfiguracja – jak przygotować repo dla Coding Agenta
Coding Agent działa lepiej gdy repozytorium jest dobrze przygotowane. Trzy pliki które warto mieć zanim zaczniesz delegować zadania:
Najważniejszy plik. Agent czyta go przed każdym zadaniem. Powinien zawierać: stack technologiczny, konwencje kodowania, nazewnictwo, wzorce które stosujesz i czego nigdy nie robicie. Opisany szczegółowo w wpisie 4 i 5 tego cyklu.
2. Setup steps (.github/copilot-setup-steps.yml)
Plik który definiuje jak przygotować środowisko przed startem sesji agenta. Agent uruchamia go jako pierwsze zadanie. Dla projektu .NET:
# .github/copilot-setup-steps.yml
steps:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '9.0.x'
- name: Restore dependencies
run: dotnet restore
- name: Build solution
run: dotnet build --no-restore
- name: Run tests to establish baseline
run: dotnet test --no-build --verbosity normal
Bez tego pliku agent startuje "na zimno" i może tracić czas na diagnostykę środowiska zamiast pisać kod. Z plikiem – od razu wie że build przechodzi i ma baseline testów.
3. Hooks (.github/hooks/)
Hooks z wpisu 9 działają też dla Coding Agenta. Quality gate agentStop sprawdza formatowanie i build po każdej sesji. Security gate preToolUse blokuje niebezpieczne operacje. To jest Twoja siatka bezpieczeństwa dla autonomicznego agenta.
💪 Zadanie – pierwsze delegowanie do Coding Agenta
Upewnij się że masz .github/copilot-instructions.md z opisem stosu technologicznego i konwencji
Wybierz małe zadanie z backlogu: dodanie XML doc comments do jednej klasy albo napisanie testów dla jednej metody
Napisz issue według wzorca z tego wpisu: cel + plik + stack + przykład + guardrails + kryteria akceptacji
Przypisz issue do Copilota (Assignees → Copilot). W Optional prompt dodaj jedno zdanie kontekstu
Obserwuj sesję przez "View session" w draft PR – zwróć uwagę na to co agent czyta
Przejrzyj PR przez checklist z tego wpisu. Zidentyfikuj jeden problem (będzie!) i daj agentowi feedback przez @copilot
Podsumowanie
Copilot Coding Agent to nie "zrób za mnie" – to "zrób w tle, a ja sprawdzę". Zmienia rolę developera z pisania kodu na definiowanie wymagań, review i kierowanie. Im lepiej opisujesz zadania i im lepiej przygotowane repozytorium, tym mniej poprawek w review.
✅ Agent mode ≠ Coding Agent: agent mode to synchroniczny asystent w IDE, Coding Agent to asynchroniczny developer na GitHubie. Dwa różne produkty, dwa różne zastosowania.
✅ Sześciofazowy cykl: przypisanie → analiza → draft PR → implementacja → review request → iteracja. Agent nie widzi komentarzy do issue dodanych po przypisaniu.
✅ Złota reguła zadań: deleguj to co junior developer zrobiłby w 30–60 minut przy dobrym opisie. Unikaj zadań wymagających głębokiej znajomości domeny, optymalizacji bez profilu i zmian w wielu repozytoriach.
✅ Siedem systematycznych błędów (mój dodatek): testy implementacji nie zachowania, naruszenia architektury przez najkrótszą drogę, niezatwierdzone zależności NuGet, zbyt szeroki scope, mieszanie języków, pętla przy failing tests, hardcoded secrets.
✅ Checklist review: dziesięć punktów które wyłapują systematyczne błędy agenta zanim trafią na main.
✅ Trzy pliki konfiguracyjne: custom instructions, copilot-setup-steps.yml i hooks – przygotuj je zanim zaczniesz delegować zadania.
W kolejnym wpisie: Instalacja i używanie Plugins – jak rozszerzać Copilota o zewnętrzne narzędzia i integracje przez oficjalny marketplace.