Claude Code právě napsal „Hotovo, všechno je připravené." Ty spustíš testy — a tři padají. Znáš to: agent prohlásí práci za dokončenou, ale nic ho nenutí si to předtím ověřit. Model, který práci dělal, je zároveň ten, který hodnotí, že je hotová — a to je špatný design.
Řešení je dát agentovi ověřitelný check: podmínku, kterou po každém kole zkontroluje někdo jiný než on sám. Claude Code k tomu dnes nabízí dvě vestavěné cesty — příkaz /goal pro jednorázovou session a Stop hook pro trvalé pravidlo — plus nejtvrdší variantu: skript, který prostě spustí tvoje testy. Ukážu si, jak je zkombinovat do workflow, kde agent skutečně skončí, až když je hotovo.
Proč agent potřebuje check, ne slib
Když Claude Code doběhne konec odpovědi, defaultně prostě skončí a vrátí ti řízení. Že napsal „testy prošly", přitom nemusí znamenat, že je vůbec spustil — nebo že prošly při posledním běhu po jeho úpravách. Chybí druhý pár očí.
Ověřitelný check ten vztah obrací: po každém kole se podmínka dokončení vyhodnotí nezávisle — buď jiným modelem, nebo deterministickým skriptem. Když neplatí, turn neskončí a agent dostane zpět konkrétní důvod, co chybí. Když platí, teprve tehdy dostaneš kontrolu ty.
Tento vztah — podmínku dokončení kontroluje někdo jiný než pracující agent — jsme rozebírali už v článku o /goal jako primitivu orchestrace. Tehdy šlo o vlastní trik; dnes je /goal v Claude Code vestavěný, bez instalace čehokoli.
/goal: podmínka dokončení bez jediné konfigurace
Nejrychlejší cesta je příkaz /goal, který Claude Code v oficiální dokumentaci (říjen 2026) popisuje jako vestavěnou zkratku pro „session-scoped prompt-based Stop hook":
/goal všechny testy v tests/auth procházejí a lint je čistý
Tím se okamžitě spustí turn s tvou podmínkou jako zadáním. Po každém dokončeném turnu Claude Code pošle podmínku i průběh konverzace malému rychlému modelu (defaultně Haiku; změníš přes ANTHROPIC_DEFAULT_HAIKU_MODEL), který vrátí jeden ze tří verdiktů:
- Not yet met — agent pokračuje a důvod hodnocení dostane jako návod pro další kolo.
- Met — cíl se splnil,
/goalse sám vyčistí a ty dostaneš kontrolu. - Impossible — hodnotitel usoudí, že podmínku nelze nikdy splnit; cíl se vyčistí s důvodem v transcriptu.
Klíčový detail: o splnění nerozhoduje model, který práci dělal, ale čerstvý evaluator. To je principiálně jiné než Auto Mode, který schvaluje tool cally uvnitř turnu — /goal naopak spouští další turny. Obojí se skvěle doplňuje: v auto módu ti /goal běží bez dozoru, aniž by ses ptal na každý příkaz.
Co /goal umí navíc:
- Přežije restart session — při
--continue,--resumei v pickru se aktivní cíl obnoví (počítadlo turnů a čas se resetují). - Funguje headless:
claude -p "/goal CHANGELOG.md má záznam pro každý PR z tohoto týdne"doběhne smyčku v jediném volání — ideální pro noční běhy bez dohledu. - Pozná zacyklení: pokud agent několik turnů po sobě nepoužije žádný nástroj, smyčka se zastaví s varováním a cíl zůstane nastavený.
- Nežere tvůj čas při chybách: vyčerpané kredity, auth chyba nebo nedostupný model cíl vyčistí s jasným varováním; přetížený server zkouší znovu (3× automaticky), rate limit ho pozastaví do resetu.
/goal clearcíl kdykoli zrušíš ručně. Aktivní cíl poznáš podle indikátoru◎ /goal active.
Stop hook: tentýž princip jako trvalé pravidlo
/goal platí jen pro aktuální session. Když chceš check v každé session v daném repu, nastav Stop hook v settings.json. Stop hook se spustí pokaždé, když hlavní agent dokončí odpověď (ne při tvém přerušení Esc), a může zastavení zablokovat, jak popisuje dokumentace hooks (říjen 2026):
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "prompt",
"prompt": "Zkontroluj, jestli jsou všechny úkoly z zadání hotové. Pokud ne, odpověz {\"ok\": false, \"reason\": \"co přesně chybí\"}."
}
]
}
]
}
}
Hook má tři způsoby, jak agenta vrátit do práce:
decision: "block"+reason— důvod se předá agentovi jako instrukce pro další kolo.- Exit kód 2 — stderr se předá stejně jako
reason. hookSpecificOutput.additionalContext— zpětná vazba bez nálepkované chyby; v transcriptu figuruje jako „Stop hook feedback".
Dvě pojistky, které musíš znát. Do inputu hooku přichází pole stop_hook_active — true znamená, že turn už pokračuje kvůli Stop hooku, takže si hook ohlídá, aby neblokoval donekonečna. A Claude Code uplatňuje limit 8 po sobě jdoucích pokračování: potom další blok přepíše a turn ukončí (počítadlo se resetuje při každém tool callu; zvýšíš přes CLAUDE_CODE_STOP_HOOK_BLOCK_CAP). Smyčka se tedy nikdy neutrhne do nekonečna.
Testy jako nejtvrdší check: command hook
Modelové hodnocení je flexibilní, ale pořád je to názor modelu. Nejtvrdší check je deterministický skript — prostě spusť testy a výsledek vrať jako exit kód:
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "cd $CLAUDE_PROJECT_DIR && bin/phpunit --quiet 2>&1 | tail -20; test ${PIPESTATUS[0]} -eq 0"
}
]
}
]
}
}
Projdou-li testy, skript skončí nulou a agent smí skončit. Když ne, exit 2 a posledních 20 řádků výpisu mu přistane jako důvod, proč má pokračovat — přesně to, co potřebuje k opravě. Žádná interpretace, žádný „asymprošel".
Prakticky: drž v checku rychlou sadu testů (jednotky, ne celou integrační suitu). Stop hook běží po každém turnu, takže pětiminutový běh ti session zabije. Těžké testy nech na CI; hook má odchytit „tvrdíš, že je hotovo, ale build padá".
Kdy prompt, kdy agent, kdy skript
Claude Code rozlišuje tři typy Stop hooků a každý má svoje místo:
| Typ hooku | Rozhoduje | Kdy nasadit |
|---|---|---|
command |
Tvůj skript (exit kód) | Deterministické podmínky: testy, lint, typecheck, „soubor X existuje" |
prompt |
Malý model nad konverzací | Hodnotící podmínky: „jsou splněné akceptační kritéria ze zadání" — umí i verdikt impossible |
agent (experimentální) |
Subagent s nástroji | Check, který musí číst soubory nebo spouštět příkazy — např. „ověř, že testy procházejí, $ARGUMENTS" |
Pravidlo: co jde napsat jako skript, napiš jako skript. Model nech hodnotit jen to, co skriptem nezměříš. A všimni si, že /goal je ve skutečnosti jen pohodlný wrapper nad prompt-based Stop hookem — kdo rozumí jednomu, rozumí oběma.
Praktické workflow krok za krokem
Takhle to skládám dohromady v praxi:
Krok 1: Vyber správný nástroj pro situaci
Jednorázová úloha („migruj modul na nové API") → /goal přímo v session. Opakované pravidlo pro celý repo („nikdy neskonči s padlými testy") → Stop hook v .claude/settings.json. Pravidelná kontrola v čase → to není Stop hook, ale /loop nebo naplánovaná úloha.
Krok 2: Napiš podmínku ověřitelně, ne vágně
Špatně: /goal udělej kód lepší. Správně: /goal všechny testy v tests/billing procházejí a PHPStan hlásí 0 chyb na levelu 6. Evaluator musí poznat splnění z konverzace — čím měřitelnější formulace, tím méně falešných „met".
Krok 3: Kombinuj s auto módem
/goal nemění permission mode. V manuálním módu tě bude každý turn otravovat s povolením testů — proto ho pro delší běhy spouštěj v auto módu, který schvaluje tool cally sám. Bezpečnostní mantinely (co agent smí a nesmí) drž dál v hookách a pravidlech pro bezpečné spouštění.
Krok 4: Pro trvalé pravidlo zapiš hook a ověř ho
Hook přidej do settings, pak v CLI napiš /hooks a zkontroluj, že se objevil pod Stop. Otestuj ho záměrně rozbitým testem — agent by měl po pokusu o ukončení dostat zpět výpis chyby a pokračovat v opravě.
Krok 5: Sleduj indikátor, ne terminál
U dlouhého cíle netípni každých pět minut. Indikátor ◎ /goal active říká, že smyčka běží; zacyklení a neodstranitelné chyby se ozvou samy varováním. U běžících subagentů nebo background shellů se hodnocení odloží, dokud nedoběhnou — po 30 minutách čekání přijde automatický check-in.
Na co si dát pozor
- Hodnotitel nevidí nic mimo konverzaci. Evaluator nepoužívá nástroje — soudí jen to, co agent vypsal. Skriptové checky proto vždycky porazí prompt-based, když jde o fakta z disku.
- Cena evaluace je zanedbatelná, ne nulová. Hodnotící volání běží na malém modelu a typicky tvoří zlomek nákladů celé session.
/goalje součást hooks systému. SdisableAllHooks: trueneboallowManagedHooksOnlyv managed settings není dostupný — a platí pro něj stejné workspace-trust pravidlo jako pro hooky.- Limit 8 pokračování není bug, ale feature. Když na něj narazíš, podmínka je buď nesplnitelná, nebo agent potřebuje tvůj zásah — ne větší limit.
- Staré verze se liší. Check-iny u background práce vyžadují v2.1.234+, obnovení cíle ve všech resume trasách v2.1.239+ — před nasazením do týmu zaktualizuj.
Časté otázky
Čím se /goal liší od /loop?
/goal spouští další turn vždy po dokončení předchozího a končí splněním podmínky. /loop se spouští podle časového intervalu a končí, až ho zastavíš ty nebo Claude usoudí, že je práce hotová. Podmínka → /goal, perioda → /loop.
Musím psát Stop hook, když existuje /goal?
Ne. /goal stačí na cíle v aktuální session bez jakékoli konfigurace. Stop hook se vyplatí, když má být check trvalý pro každou session v repu — typicky „neskonči, dokud neprocházejí testy".
Co když Stop hook zacyklí session?
Nemůže donekonečna: po osmi po sobě jdoucích pokračováních Claude Code další blok přepíše a turn ukončí. Hook navíc v inputu vidí stop_hook_active, takže může přestat blokovat sám. Limit jde zvednout přes CLAUDE_CODE_STOP_HOOK_BLOCK_CAP.
Spustí Stop hook i moje testy, když agent práci přeruším?
Ne. Stop hook se spouští jen při normálním dokončení odpovědi hlavního agenta — při přerušení uživatelem neběží a API chyby zpracovává samostatný event StopFailure.
Funguje /goal i v headless režimu pro CI?
Ano. claude -p "/goal …" doběhne celou smyčku v jednom volání; pro sledování průběhu přidej --output-format stream-json --verbose. Funguje i v desktopu a přes Remote Control.
Shrnutí
Rozdíl mezi „agent řekl, že je hotovo" a „je hotovo" je jediný ověřitelný check. Pro jednorázové úlohy sáhni po /goal — podmínku napíšeš jednou větou a o splnění rozhoduje nezávislý evaluator. Pro trvalá pravidla napiš Stop hook: skript, který spustí tvoje testy, je nejtvrdší varianta, prompt-based hook zvládne hodnotící podmínky. Obojí v auto módu běží bez dozoru a obojí má vestavěné pojistky proti zacyklení.
Začni jednoduše: příště, když agentovi zadáš větší refaktor, přidej /goal všechny testy procházejí a lint je čistý. Uvidíš, kolik „hotových" prací hotových nebylo.