Cvičení 01 · Frontend → Mortgage Calculator API → databáze

Synchronní začátek

  • request/response
  • CRUD
  • časová vazba

Princip

Hypoteční kalkulačka začíná jako obyčejná CRUD aplikace: frontend zavolá API, API zapíše řádek do databáze a čeká na odpověď.

Je to jednoduché a pro začátek správné. Má to ale dvě ceny: UPDATE přepíše předchozí hodnotu (historie zmizí) a volající je svázaný s dostupností a rychlostí všech služeb v řetězci (časová vazba).

Co sledovat

  • Po druhém uložení je v databázi jen poslední příjem. Kdo ho měnil a z čeho? Nevíme.
  • Při odeslání žádosti se volají všechny služby za sebou. Jedna offline služba shodí celé volání, ale kroky před ní už data změnily.

Bez řešení / S řešením

Bez řešení

Spustit synchronní scénář

Uložíme výpočet dvakrát (příjem se změní), pak odešleme žádost přes celý synchronní řetěz, zatímco je výplatní služba offline.

Spustit v simulátoru bez řešení

S řešením

Ukázat, co přinese zápis událostí

Řešením není rychlejší databáze, ale jiný model: místo přepisování stavu zapisujeme fakta o změnách (Event Sourcing, krok 2) a návaznou práci posíláme asynchronně (kroky 9 a dál). Tady stačí vidět, že odpověď „offline“ je u synchronního řetězce nevyhnutelná.

Spustit v simulátoru s řešením

Co udělat: Klikni na „Spustit synchronní scénář“. Na co se dívat: V databázi zůstane jen poslední příjem. Ten předchozí je pryč. Simulátor potřebuje JavaScript a běží jako samostatná aplikace.

Zkus to ve svém projektu

Zkopíruj prompt do svého coding agenta (Claude Code, Copilot, Codex…) a spusť ho v repozitáři svého projektu.

Zmapovat synchronní tok kalkulačky a zjistit, kde se ztrácí historie a kde vzniká časová vazba. Zatím se nic nepřepisuje.

Jazyk
Varianta
# Úkol pro coding agenta: Synchronní začátek

Stack: Java. Režim: s vedením.
Cíl: Zmapovat synchronní tok kalkulačky a zjistit, kde se ztrácí historie a kde vzniká časová vazba. Zatím se nic nepřepisuje.

## Kontext existujícího kódu

Pracuješ v existujícím projektu (Java backend (typicky Java 21, Spring Boot, JPA nebo JDBC). Použij build nástroj a styl, který projekt už má (Maven/Gradle, JUnit 5).).
Doména: hypoteční kalkulačka, která se postupně mění v event-driven systém (kalkulačka, rizika, schvalování, identita, účet, dokumenty, výplata).

Nejdřív čti, nic neměň. Najdi a stručně shrň:
- Kontroler/endpoint, který ukládá výpočet, a vrstvu persistence (entita, repozitář, tabulka, případně IndexedDB).
- Všechna místa, kde se při odeslání žádosti volají jiné služby synchronně (HTTP/gRPC klienti).
- Kde se při UPDATE (nebo `put` v IndexedDB) přepisuje předchozí hodnota (příjem, cena, sazba).
- Které z těchto částí v projektu existují a které chybí, včetně brokeru, outboxu, retry, timeoutu a idempotence. Nic z toho teď nepiš.

## Očekávané chování

Kalkulačka začíná jako CRUD: API přepíše řádek v databázi a volající čeká na všechny služby v řetězci. Cena: UPDATE smaže historii a jedna offline služba shodí celé odeslání (časová vazba). Příklad: po dvou uloženích (příjem 80 000 → 95 000 Kč) zůstane jen 95 000 a nikde není, kdo a kdy ho změnil. Když je při odeslání výplatní služba offline, volání selže, ale služby před ní už data zapsaly; opakované odeslání může založit duplicitní záznamy (např. druhý účet).

## Konkrétní úkol

Technická specifika (Java): Spring MVC kontroler a `@Transactional` service; výpadek simuluj mockem klienta (MockWebServer/WireMock).

Postupuj po krocích. Po bodu 1 (plán) napiš, co zjistíš a co navrhuješ, a počkej na potvrzení:
1. Plán: nakresli sekvenci volání od UI po databázi a vypiš, kolik synchronních skoků má odeslání žádosti.
2. Ověř tři případy, kdy se ztratí informace: přepsaný příjem, přepsaná sazba zadaná uživatelem, kdo/kdy změnu udělal.
3. Napiš test, který zafixuje současné chování (characterization test): uložení dvou změn za sebou vrátí jen poslední hodnotu.
4. Napiš test, který simuluje výpadek poslední služby v řetězci (služba neběží; služba vrací 5xx) a ověří, co zůstane zapsané v předchozích službách, v jakém stavu zůstane žádost a co udělá opakované odeslání.
5. Shrň nálezy do krátkého dokumentu v `docs/` a navrhni, kde by vznikl event stream. Nic neimplementuj.

Na co si dát pozor:
- Nezaměňuj „test prošel“ s „chování je správné“: zachycuješ stávající stav, ne ideál.
- Částečný výpadek zahrnuje i kroky, které už zapsaly data.
- Characterization testy pojmenuj `*.characterization.test.*`; pozdější záměrná změna chování je smí upravit nebo nahradit.
- Služba, která neodpovídá, test bez timeoutu zasekne: zapiš to jako nález, netestuj.

## Co nesmíš měnit

- Stávající veřejné API a chování endpointů kalkulačky, které teď funguje.
- Databázové schéma stávajících tabulek (nové tabulky/migrace jsou v pořádku, přejmenování a mazání ne).
- Cizí testy, seed data a existující hodnoty. Když je změna nutná, dej ji do samostatného commitu a uveď ji. Pokud změna tvaru události nebo nový konzument nutně mění existující test, uprav ho v samostatném commitu a v závěru uveď proč.
- Veřejné kontrakty (API, schémata událostí) bez zpětné kompatibility.

## Hotovo, když

- Existují characterization testy pro přepisování stavu a pro částečný výpadek řetězce.
- Dokument popisuje nálezy a návrh dalšího kroku.
- Produkční kód je beze změny.
- JUnit 5 testy ve stávající struktuře `src/test/java` projdou build nástrojem projektu.
- V závěru uveď: co jsi změnil, co jsi předpokládal, co zbývá.
# Úkol pro coding agenta: Synchronní začátek

Stack: Java. Režim: challenge.
Cíl: Zmapovat synchronní tok kalkulačky a zjistit, kde se ztrácí historie a kde vzniká časová vazba. Zatím se nic nepřepisuje.

## Kontext existujícího kódu

Pracuješ v existujícím projektu (Java backend (typicky Java 21, Spring Boot, JPA nebo JDBC). Použij build nástroj a styl, který projekt už má (Maven/Gradle, JUnit 5).).
Doména: hypoteční kalkulačka, která se postupně mění v event-driven systém (kalkulačka, rizika, schvalování, identita, účet, dokumenty, výplata).

Nejdřív čti, nic neměň. Najdi a stručně shrň:
- Kontroler/endpoint, který ukládá výpočet, a vrstvu persistence (entita, repozitář, tabulka, případně IndexedDB).
- Všechna místa, kde se při odeslání žádosti volají jiné služby synchronně (HTTP/gRPC klienti).
- Kde se při UPDATE (nebo `put` v IndexedDB) přepisuje předchozí hodnota (příjem, cena, sazba).
- Které z těchto částí v projektu existují a které chybí, včetně brokeru, outboxu, retry, timeoutu a idempotence. Nic z toho teď nepiš.

## Očekávané chování

Kalkulačka začíná jako CRUD: API přepíše řádek v databázi a volající čeká na všechny služby v řetězci. Cena: UPDATE smaže historii a jedna offline služba shodí celé odeslání (časová vazba). Příklad: po dvou uloženích (příjem 80 000 → 95 000 Kč) zůstane jen 95 000 a nikde není, kdo a kdy ho změnil. Když je při odeslání výplatní služba offline, volání selže, ale služby před ní už data zapsaly; opakované odeslání může založit duplicitní záznamy (např. druhý účet).

## Zadání (Challenge)

Zdokumentuj tok uložení a odeslání žádosti, zafixuj ho testy a prokaž, kde se ztrácí historie a kde je řetězec křehký. Bez změny produkčního kódu.

Technická specifika (Java): Spring MVC kontroler a `@Transactional` service; výpadek simuluj mockem klienta (MockWebServer/WireMock).

Postup si zvol sám. Pasti v tomto tématu nejsou vypsané: najdi je (souběh, opakované doručení, pořadí, selhání uprostřed) a ke každé napiš test, který by ji odhalil. Na konci vypiš, jaké pasti jsi našel a které jsi vědomě nechal otevřené.

## Co nesmíš měnit

- Stávající veřejné API a chování endpointů kalkulačky, které teď funguje.
- Databázové schéma stávajících tabulek (nové tabulky/migrace jsou v pořádku, přejmenování a mazání ne).
- Cizí testy, seed data a existující hodnoty. Když je změna nutná, dej ji do samostatného commitu a uveď ji. Pokud změna tvaru události nebo nový konzument nutně mění existující test, uprav ho v samostatném commitu a v závěru uveď proč.
- Veřejné kontrakty (API, schémata událostí) bez zpětné kompatibility.

## Hotovo, když

- Existují characterization testy pro přepisování stavu a pro částečný výpadek řetězce.
- Dokument popisuje nálezy a návrh dalšího kroku.
- Produkční kód je beze změny.
- JUnit 5 testy ve stávající struktuře `src/test/java` projdou build nástrojem projektu.
- V závěru uveď: co jsi změnil, co jsi předpokládal, co zbývá.
# Úkol pro coding agenta: Synchronní začátek

Stack: C#. Režim: s vedením.
Cíl: Zmapovat synchronní tok kalkulačky a zjistit, kde se ztrácí historie a kde vzniká časová vazba. Zatím se nic nepřepisuje.

## Kontext existujícího kódu

Pracuješ v existujícím projektu (C# backend (.NET, ASP.NET Core, EF Core nebo Dapper). Použij solution, styl a DI konvence, které projekt už má (xUnit/NUnit).).
Doména: hypoteční kalkulačka, která se postupně mění v event-driven systém (kalkulačka, rizika, schvalování, identita, účet, dokumenty, výplata).

Nejdřív čti, nic neměň. Najdi a stručně shrň:
- Kontroler/endpoint, který ukládá výpočet, a vrstvu persistence (entita, repozitář, tabulka, případně IndexedDB).
- Všechna místa, kde se při odeslání žádosti volají jiné služby synchronně (HTTP/gRPC klienti).
- Kde se při UPDATE (nebo `put` v IndexedDB) přepisuje předchozí hodnota (příjem, cena, sazba).
- Které z těchto částí v projektu existují a které chybí, včetně brokeru, outboxu, retry, timeoutu a idempotence. Nic z toho teď nepiš.

## Očekávané chování

Kalkulačka začíná jako CRUD: API přepíše řádek v databázi a volající čeká na všechny služby v řetězci. Cena: UPDATE smaže historii a jedna offline služba shodí celé odeslání (časová vazba). Příklad: po dvou uloženích (příjem 80 000 → 95 000 Kč) zůstane jen 95 000 a nikde není, kdo a kdy ho změnil. Když je při odeslání výplatní služba offline, volání selže, ale služby před ní už data zapsaly; opakované odeslání může založit duplicitní záznamy (např. druhý účet).

## Konkrétní úkol

Technická specifika (C#): ASP.NET Core controller a EF Core `DbContext`; výpadek simuluj `HttpMessageHandler` stubem.

Postupuj po krocích. Po bodu 1 (plán) napiš, co zjistíš a co navrhuješ, a počkej na potvrzení:
1. Plán: nakresli sekvenci volání od UI po databázi a vypiš, kolik synchronních skoků má odeslání žádosti.
2. Ověř tři případy, kdy se ztratí informace: přepsaný příjem, přepsaná sazba zadaná uživatelem, kdo/kdy změnu udělal.
3. Napiš test, který zafixuje současné chování (characterization test): uložení dvou změn za sebou vrátí jen poslední hodnotu.
4. Napiš test, který simuluje výpadek poslední služby v řetězci (služba neběží; služba vrací 5xx) a ověří, co zůstane zapsané v předchozích službách, v jakém stavu zůstane žádost a co udělá opakované odeslání.
5. Shrň nálezy do krátkého dokumentu v `docs/` a navrhni, kde by vznikl event stream. Nic neimplementuj.

Na co si dát pozor:
- Nezaměňuj „test prošel“ s „chování je správné“: zachycuješ stávající stav, ne ideál.
- Částečný výpadek zahrnuje i kroky, které už zapsaly data.
- Characterization testy pojmenuj `*.characterization.test.*`; pozdější záměrná změna chování je smí upravit nebo nahradit.
- Služba, která neodpovídá, test bez timeoutu zasekne: zapiš to jako nález, netestuj.

## Co nesmíš měnit

- Stávající veřejné API a chování endpointů kalkulačky, které teď funguje.
- Databázové schéma stávajících tabulek (nové tabulky/migrace jsou v pořádku, přejmenování a mazání ne).
- Cizí testy, seed data a existující hodnoty. Když je změna nutná, dej ji do samostatného commitu a uveď ji. Pokud změna tvaru události nebo nový konzument nutně mění existující test, uprav ho v samostatném commitu a v závěru uveď proč.
- Veřejné kontrakty (API, schémata událostí) bez zpětné kompatibility.

## Hotovo, když

- Existují characterization testy pro přepisování stavu a pro částečný výpadek řetězce.
- Dokument popisuje nálezy a návrh dalšího kroku.
- Produkční kód je beze změny.
- Testy ve stávajícím testovacím projektu projdou (`dotnet test`).
- V závěru uveď: co jsi změnil, co jsi předpokládal, co zbývá.
# Úkol pro coding agenta: Synchronní začátek

Stack: C#. Režim: challenge.
Cíl: Zmapovat synchronní tok kalkulačky a zjistit, kde se ztrácí historie a kde vzniká časová vazba. Zatím se nic nepřepisuje.

## Kontext existujícího kódu

Pracuješ v existujícím projektu (C# backend (.NET, ASP.NET Core, EF Core nebo Dapper). Použij solution, styl a DI konvence, které projekt už má (xUnit/NUnit).).
Doména: hypoteční kalkulačka, která se postupně mění v event-driven systém (kalkulačka, rizika, schvalování, identita, účet, dokumenty, výplata).

Nejdřív čti, nic neměň. Najdi a stručně shrň:
- Kontroler/endpoint, který ukládá výpočet, a vrstvu persistence (entita, repozitář, tabulka, případně IndexedDB).
- Všechna místa, kde se při odeslání žádosti volají jiné služby synchronně (HTTP/gRPC klienti).
- Kde se při UPDATE (nebo `put` v IndexedDB) přepisuje předchozí hodnota (příjem, cena, sazba).
- Které z těchto částí v projektu existují a které chybí, včetně brokeru, outboxu, retry, timeoutu a idempotence. Nic z toho teď nepiš.

## Očekávané chování

Kalkulačka začíná jako CRUD: API přepíše řádek v databázi a volající čeká na všechny služby v řetězci. Cena: UPDATE smaže historii a jedna offline služba shodí celé odeslání (časová vazba). Příklad: po dvou uloženích (příjem 80 000 → 95 000 Kč) zůstane jen 95 000 a nikde není, kdo a kdy ho změnil. Když je při odeslání výplatní služba offline, volání selže, ale služby před ní už data zapsaly; opakované odeslání může založit duplicitní záznamy (např. druhý účet).

## Zadání (Challenge)

Zdokumentuj tok uložení a odeslání žádosti, zafixuj ho testy a prokaž, kde se ztrácí historie a kde je řetězec křehký. Bez změny produkčního kódu.

Technická specifika (C#): ASP.NET Core controller a EF Core `DbContext`; výpadek simuluj `HttpMessageHandler` stubem.

Postup si zvol sám. Pasti v tomto tématu nejsou vypsané: najdi je (souběh, opakované doručení, pořadí, selhání uprostřed) a ke každé napiš test, který by ji odhalil. Na konci vypiš, jaké pasti jsi našel a které jsi vědomě nechal otevřené.

## Co nesmíš měnit

- Stávající veřejné API a chování endpointů kalkulačky, které teď funguje.
- Databázové schéma stávajících tabulek (nové tabulky/migrace jsou v pořádku, přejmenování a mazání ne).
- Cizí testy, seed data a existující hodnoty. Když je změna nutná, dej ji do samostatného commitu a uveď ji. Pokud změna tvaru události nebo nový konzument nutně mění existující test, uprav ho v samostatném commitu a v závěru uveď proč.
- Veřejné kontrakty (API, schémata událostí) bez zpětné kompatibility.

## Hotovo, když

- Existují characterization testy pro přepisování stavu a pro částečný výpadek řetězce.
- Dokument popisuje nálezy a návrh dalšího kroku.
- Produkční kód je beze změny.
- Testy ve stávajícím testovacím projektu projdou (`dotnet test`).
- V závěru uveď: co jsi změnil, co jsi předpokládal, co zbývá.
# Úkol pro coding agenta: Synchronní začátek

Stack: Web (HTML/JS nebo stack aplikace). Režim: s vedením.
Cíl: Zmapovat synchronní tok kalkulačky a zjistit, kde se ztrácí historie a kde vzniká časová vazba. Zatím se nic nepřepisuje.

## Kontext existujícího kódu

Pracuješ v existujícím projektu (webová aplikace: frontend v prohlížeči, případně s vlastním backendem. Když má projekt backend, patří event store, broker a služby na backend a body o endpointech a tabulkách se týkají jeho. Když backend nemá, použij IndexedDB v prohlížeči a v testech `fake-indexeddb`. Framework a test runner projektu zachovej; nové závislosti přidávej jen s odůvodněním.).
Doména: hypoteční kalkulačka, která se postupně mění v event-driven systém (kalkulačka, rizika, schvalování, identita, účet, dokumenty, výplata).

Nejdřív čti, nic neměň. Najdi a stručně shrň:
- Kontroler/endpoint, který ukládá výpočet, a vrstvu persistence (entita, repozitář, tabulka, případně IndexedDB).
- Všechna místa, kde se při odeslání žádosti volají jiné služby synchronně (HTTP/gRPC klienti).
- Kde se při UPDATE (nebo `put` v IndexedDB) přepisuje předchozí hodnota (příjem, cena, sazba).
- Které z těchto částí v projektu existují a které chybí, včetně brokeru, outboxu, retry, timeoutu a idempotence. Nic z toho teď nepiš.

## Očekávané chování

Kalkulačka začíná jako CRUD: API přepíše řádek v databázi a volající čeká na všechny služby v řetězci. Cena: UPDATE smaže historii a jedna offline služba shodí celé odeslání (časová vazba). Příklad: po dvou uloženích (příjem 80 000 → 95 000 Kč) zůstane jen 95 000 a nikde není, kdo a kdy ho změnil. Když je při odeslání výplatní služba offline, volání selže, ale služby před ní už data zapsaly; opakované odeslání může založit duplicitní záznamy (např. druhý účet).

## Konkrétní úkol

Technická specifika (Web (HTML/JS nebo stack aplikace)): Najdi `fetch`/`axios` volání z formuláře kalkulačky a sleduj je až tam, kde se volají další služby. Výpadek simuluj tam, kde řetězec běží (na backendu zastavená služba nebo dvojník klienta přes `vi.fn()`); MSW jen, když ho projekt už má.

Postupuj po krocích. Po bodu 1 (plán) napiš, co zjistíš a co navrhuješ, a počkej na potvrzení:
1. Plán: nakresli sekvenci volání od UI po databázi a vypiš, kolik synchronních skoků má odeslání žádosti.
2. Ověř tři případy, kdy se ztratí informace: přepsaný příjem, přepsaná sazba zadaná uživatelem, kdo/kdy změnu udělal.
3. Napiš test, který zafixuje současné chování (characterization test): uložení dvou změn za sebou vrátí jen poslední hodnotu.
4. Napiš test, který simuluje výpadek poslední služby v řetězci (služba neběží; služba vrací 5xx) a ověří, co zůstane zapsané v předchozích službách, v jakém stavu zůstane žádost a co udělá opakované odeslání.
5. Shrň nálezy do krátkého dokumentu v `docs/` a navrhni, kde by vznikl event stream. Nic neimplementuj.

Na co si dát pozor:
- Nezaměňuj „test prošel“ s „chování je správné“: zachycuješ stávající stav, ne ideál.
- Částečný výpadek zahrnuje i kroky, které už zapsaly data.
- Characterization testy pojmenuj `*.characterization.test.*`; pozdější záměrná změna chování je smí upravit nebo nahradit.
- Služba, která neodpovídá, test bez timeoutu zasekne: zapiš to jako nález, netestuj.

## Co nesmíš měnit

- Stávající veřejné API a chování endpointů kalkulačky, které teď funguje.
- Databázové schéma stávajících tabulek (nové tabulky/migrace jsou v pořádku, přejmenování a mazání ne).
- Cizí testy, seed data a existující hodnoty. Když je změna nutná, dej ji do samostatného commitu a uveď ji. Pokud změna tvaru události nebo nový konzument nutně mění existující test, uprav ho v samostatném commitu a v závěru uveď proč.
- Veřejné kontrakty (API, schémata událostí) bez zpětné kompatibility.

## Hotovo, když

- Existují characterization testy pro přepisování stavu a pro částečný výpadek řetězce.
- Dokument popisuje nálezy a návrh dalšího kroku.
- Produkční kód je beze změny.
- Testy projdou stávajícím test runnerem; lint a build projdou, pokud je projekt má.
- V závěru uveď: co jsi změnil, co jsi předpokládal, co zbývá.
# Úkol pro coding agenta: Synchronní začátek

Stack: Web (HTML/JS nebo stack aplikace). Režim: challenge.
Cíl: Zmapovat synchronní tok kalkulačky a zjistit, kde se ztrácí historie a kde vzniká časová vazba. Zatím se nic nepřepisuje.

## Kontext existujícího kódu

Pracuješ v existujícím projektu (webová aplikace: frontend v prohlížeči, případně s vlastním backendem. Když má projekt backend, patří event store, broker a služby na backend a body o endpointech a tabulkách se týkají jeho. Když backend nemá, použij IndexedDB v prohlížeči a v testech `fake-indexeddb`. Framework a test runner projektu zachovej; nové závislosti přidávej jen s odůvodněním.).
Doména: hypoteční kalkulačka, která se postupně mění v event-driven systém (kalkulačka, rizika, schvalování, identita, účet, dokumenty, výplata).

Nejdřív čti, nic neměň. Najdi a stručně shrň:
- Kontroler/endpoint, který ukládá výpočet, a vrstvu persistence (entita, repozitář, tabulka, případně IndexedDB).
- Všechna místa, kde se při odeslání žádosti volají jiné služby synchronně (HTTP/gRPC klienti).
- Kde se při UPDATE (nebo `put` v IndexedDB) přepisuje předchozí hodnota (příjem, cena, sazba).
- Které z těchto částí v projektu existují a které chybí, včetně brokeru, outboxu, retry, timeoutu a idempotence. Nic z toho teď nepiš.

## Očekávané chování

Kalkulačka začíná jako CRUD: API přepíše řádek v databázi a volající čeká na všechny služby v řetězci. Cena: UPDATE smaže historii a jedna offline služba shodí celé odeslání (časová vazba). Příklad: po dvou uloženích (příjem 80 000 → 95 000 Kč) zůstane jen 95 000 a nikde není, kdo a kdy ho změnil. Když je při odeslání výplatní služba offline, volání selže, ale služby před ní už data zapsaly; opakované odeslání může založit duplicitní záznamy (např. druhý účet).

## Zadání (Challenge)

Zdokumentuj tok uložení a odeslání žádosti, zafixuj ho testy a prokaž, kde se ztrácí historie a kde je řetězec křehký. Bez změny produkčního kódu.

Technická specifika (Web (HTML/JS nebo stack aplikace)): Najdi `fetch`/`axios` volání z formuláře kalkulačky a sleduj je až tam, kde se volají další služby. Výpadek simuluj tam, kde řetězec běží (na backendu zastavená služba nebo dvojník klienta přes `vi.fn()`); MSW jen, když ho projekt už má.

Postup si zvol sám. Pasti v tomto tématu nejsou vypsané: najdi je (souběh, opakované doručení, pořadí, selhání uprostřed) a ke každé napiš test, který by ji odhalil. Na konci vypiš, jaké pasti jsi našel a které jsi vědomě nechal otevřené.

## Co nesmíš měnit

- Stávající veřejné API a chování endpointů kalkulačky, které teď funguje.
- Databázové schéma stávajících tabulek (nové tabulky/migrace jsou v pořádku, přejmenování a mazání ne).
- Cizí testy, seed data a existující hodnoty. Když je změna nutná, dej ji do samostatného commitu a uveď ji. Pokud změna tvaru události nebo nový konzument nutně mění existující test, uprav ho v samostatném commitu a v závěru uveď proč.
- Veřejné kontrakty (API, schémata událostí) bez zpětné kompatibility.

## Hotovo, když

- Existují characterization testy pro přepisování stavu a pro částečný výpadek řetězce.
- Dokument popisuje nálezy a návrh dalšího kroku.
- Produkční kód je beze změny.
- Testy projdou stávajícím test runnerem; lint a build projdou, pokud je projekt má.
- V závěru uveď: co jsi změnil, co jsi předpokládal, co zbývá.

Školení pro váš tým

Chcete školení pro svůj tým?

Školení vedeme na vašem kódu a vašem doménovém problému. Domluvíme rozsah, termín a formu.

Probrat školení