/goal v Claude Code: drž sezení v autonomním režimu, dokud podmínka neplatí

/goal v Claude Code: drž sezení v autonomním režimu, dokud podmínka neplatí

Anthropic vydal slash command /goal. Session-scoped wrapper nad prompt-based Stop hookem: napíšeš podmínku, malý evaluátor po každém turnu zhodnotí transcript a sezení končí, až řekne yes. Kdy sáhnout po /goal, kdy po /loop, kdy po Stop hooku — a proč podmínku píšeš pro Haiku, ne pro hlavní model.

Jakub Kontra
Jakub Kontra
Developer

Claude Code dostal nový slash command /goal, který drží sezení v autonomním režimu tak dlouho, dokud externí evaluátor po každém turnu nepotvrdí, že zadaná podmínka platí.

/goal drží sezení v autonomním režimu, dokud podmínka neplatí

Syntaxe:

/goal all tests in test/auth pass and the lint step is clean

Jakmile příkaz odešleš, spustí se první turn s podmínkou jako directive. Hlavní model pracuje normálně, volá tooly, edituje soubory. Po dokončení turnu nastoupí malý rychlý evaluátor (defaultně Haiku) a rozhodne, jestli podmínka platí. Pokud ne, Claude rovnou pokračuje dalším turnem. Pokud ano, goal se sám smaže a sezení se vrátí do běžného režimu.

Ve status řádku vidíš indikátor ◎ /goal active a dobu běhu. Žádné okno navíc, jen řádek se stavem.

Jak to běží turn po turnu

Mechanika je střídmá. Hlavní model dokončí turn a vypíše do konverzace, co považuje za výsledek: test output, git status, exit kódy, diff. Pak je řada na evaluátoru. Ten přečte transcript a vrátí krátký reason, proč podmínka platí nebo neplatí. Reason se objeví v status view i v transcriptu.

Strop podmínky je 4 000 znaků, na vrstvený popis end state dost. Pokud chceš pojistku, přidej limit běhu:

/goal migration to v2 API complete or stop after 20 turns

Spotřeba tokenů evaluátoru je řádově menší než spotřeba hlavního modelu. Cena za to, že nemusíš mezi turny psát „pokračuj".

Píšeš podmínku pro evaluátora, ne pro Claude

Evaluátor nevolá žádné tooly. Nečte soubory, nespouští testy, nedělá ls. Vidí jen to, co hlavní model vypsal do konverzace.

Z toho plyne anti-pattern. Tohle nefunguje:

/goal code is clean and refactor is done

Evaluátor nemá jak ověřit, co je „čisté". Bude tipovat z toho, co Claude napsal, a tipy bývají optimistické.

Funkční podmínky vypadají takhle:

/goal npm test exits 0, git status shows no uncommitted changes,
and no file in src/auth exceeds 200 lines

Tři složky, které dobrá podmínka spojuje: stated check, kterým se to ověří (npm test exits 0), měřitelný end state (git status shows no uncommitted changes) a constraint, co se nesmí změnit (no file in src/auth exceeds 200 lines).

Důsledek: aby evaluátor mohl rozhodnout, hlavní model musí check skutečně spustit a output vypsat do konverzace. Pokud Claude jen napíše „opraveno" a nepustí npm test, evaluátor řekne „dosud neověřeno" a turn pokračuje.

/goal vs /loop vs Stop hook

Tři nástroje s podobným cílem (udržet sezení v běhu), ale jiným spouštěčem.

/loop startuje další turn po časovém intervalu. Hodí se na monitoring a polling úlohy, kde čekáš na externí stav (deploy, build, queue). Stop podmínka je manuální nebo když model sám usoudí, že je hotovo.

Stop hook v settings.json je deterministický a permanent. Spustí se po každém turnu, rozhodne podle vlastního skriptu nebo promptu, a žije napříč sezeními. Pokud máš pravidlo „po každém turnu spusť tsc --noEmit", patří do Stop hooku.

/goal je session-scoped, podmínkový, ad-hoc. Žije jen pro aktuální sezení, evaluuje promptem, a zmizí jakmile podmínka platí nebo ho clearneš. Implementačně je /goal wrapper nad prompt-based Stop hookem. Nestaví proti existující abstrakci, jen z ní dělá jednořádkový příkaz pro úlohu, kvůli které by sis settings hook nikdy nepsal.

S Auto mode se doplňují čistě. Auto mode odstraňuje per-tool prompty uvnitř turnu, /goal odstraňuje per-turn prompty mezi turny.

Status, clear, resume

/goal bez argumentu vrátí status: aktivní podmínka, doba běhu, počet vyhodnocených turnů, spotřeba tokenů a poslední reason od evaluátoru.

Zrušení je /goal clear, případně aliasy stop, off, reset, none, cancel. Nová konverzace přes /clear goal odstraní automaticky.

Současně může běžet vždycky jen jeden goal. Nový /goal přepíše aktivní bez ptaní – pohodlné když dolaďuješ podmínku, méně pohodlné když si toho nevšimneš.

--resume a --continue obnoví aktivní goal z předchozího sezení, ale resetují turn count, timer i token-spend baseline. Dosažený nebo zrušený goal se neobnovuje. Jakmile podmínka jednou platila nebo jsi ji sám zahodil, nemá smysl ji oživovat v dalším sezení.

Headless mode pro CI a scripty

/goal funguje i non-interactive přes claude -p:

claude -p "/goal CHANGELOG.md has an entry for every PR merged this week"

Je to nejjednodušší způsob, jak z Claude Code udělat jednorázový agent run s jasnou exit podmínkou. Ctrl+C funguje jako kill switch.

/goal není dostupný, pokud máš disableAllHooks zapnuté na jakékoliv úrovni nebo allowManagedHooksOnly v managed settings, a workspace trust dialog musí být přijatý. Důvod je technický: wrapper nad Stop hookem nemůže žít tam, kde hooks nejsou povolené.

Kdy /goal použít

/goal se hodí na úlohy, kde víš end state, ale ne kolik turnů zabere se tam dostat:

  • migrace modulu na nové API
/goal all imports updated, npm test exits 0, no references to oldClient remain
  • implementace design dokumentu
/goal all endpoints from docs/spec.md respond with expected status, integration tests pass
  • rozdělení velkého souboru na moduly pod size budget
/goal src/billing.ts split so no file exceeds 300 lines, tests pass
  • vyčištění labeled issue backlogu
/goal every open issue with label "good-first" has either a PR or a justification comment

Kdy ne: úlohy bez měřitelného end state. Pokud neumíš podmínku napsat tak, aby ji Haiku z transcriptu rozhodlo, sahej po /loop nebo si napiš deterministický Stop hook.

Mění se default. Doteď platilo „jeden prompt = jeden turn" a všechno mezi tím sis musel ošetřit ručně: buď čekáním u terminálu, nebo settings hookem, který sis málokdy napsal. /goal s Auto mode posouvá default k „jeden prompt = kondicionální blok sezení", který se sám ukončí, jakmile podmínka platí. Pro úlohy s jasným end state je to rozdíl mezi babysittingem a zadáním.