vitrinka.docs
Produkt

Pracovní smyčka

Úkol je předávka — session ho převezme z jednoho ohraničeného pohledu, zakládá, co uvidí, v okamžiku, kdy to uvidí, a odevzdává jedněmi dveřmi, jejichž vytištěný blok je předávka.

Úkol je předávka

Úkol, na kterém pracuje agent, má zůstat pravdivý, aniž by agent přemýšlel jak. Navazující kroky, vynechané věci a zpozorované chyby přistanou jako podúkoly v okamžiku, kdy je někdo uvidí; stav se pohybuje s běhy a pull requesty; a to, co po session zbyde, doputuje na úkol jedněmi dveřmi, jejichž vytištěný výstup je předávka v chatu. Další session vloží URL úkolu a dostane ohraničený, serverem složený pickup, který říká, co dělat, kde začít, co si přečíst nejdřív, která větev existuje a co nenačítat.

Tři okamžiky, tři slovesa:

OkamžikSlovesoCo udělá server
ZačátekpickupSloží jeden ohraničený pohled na úkol a přihlásí se k němu
ObjevspotZaloží chybu nebo navazující krok jako podúkol, hned
Konechand backZaloží další kroky, připojí shrnutí, posune stav, vrátí blok

Každé sloveso je skill (/vitrinka:pickup, /vitrinka:spot, /vitrinka:handoff v Claude Code; $pickup, $spot, $handoff v Codexu), MCP volání a příkaz CLI. Zbytek obstarají pravidla a hooky session.

Pickup

get {kind: "task", id, view: "pickup"} (vitrinka task pickup <id|url>) odpoví JSONem pickupu a polem rendered, hustým textovým blokem, který se tiskne tak, jak přišel:

pickup #718 · Checkout as one guided flow · epic · in_progress
WHAT   <the epic's outcome, else the body's first line>
LAST   <when> · by <who> · <the last hand-back's summary>
DONE   <what that hand-back finished>
ON     <surfaces it opened — APIs, components> — <where to build on>
BRANCH <branch> · worktree <path>
BEFORE <what must be true first> [#id status] · …
READ   <kind> v<n> <filename> — <hint>          (one line each)
WHO    <actor> since <relative>                  (live runs)
NEXT   ☐ <open step on this task> [type]         (the task's own checklist)
NEXT   [<key>](<url>) <title> [type]             (open children, rank order)
SKIP   17 done children · 42 events · 3 attachments · 5 comments — not loaded

Blok je anglicky, jak ho server tiskne: WHAT je výsledek, LAST poslední předávka, ON co otevřela a na čem stavět, BEFORE co musí platit nejdřív, READ co číst, WHO živé běhy, NEXT nejdřív otevřené kroky checklistu úkolu a pak otevřené podúkoly v pořadí ranku, SKIP co se nenačetlo. Řádky, pro které server nic neměl, chybí. Příloha, o které je dobré vědět, ale nestojí za načtení, se pod READ ukáže jako read on demand: <kind>. Pohled má pevný strop velikosti (6 000 bajtů): řádky za ním se zahodí celé a započítají do SKIP, nikdy se neuseknou uprostřed. Hotová práce se nikdy nerozbaluje, události a transkripty se nikdy nenačítají a CLI navíc řekne, zda větev existuje na originu.

Session z něj pracuje v pořadí: BEFORE je stopka, ne poznámka; READ jmenuje jediné přílohy, které se mají načíst (read_task_ref); na BRANCH se pokračuje, když existuje, jinak session naváže čerstvý worktree vt-<id>; úkol se přihlásí živým během (vitrinka task start, obvykle to udělá hook SessionStart); a první řádek NEXT, který nikdo ve WHO nedrží, je ta práce. U epicu jsou řádky NEXT jeho podúkoly — epic samotný se nikdy nepracuje.

URL úkolu nebo epicu vložené do promptu znamená pro každého MCP klienta „nejdřív pickup“: říkají to instrukce serveru a celý strom se nikdy nenačítá dopředu.

Spot

Co uvidíte uprostřed práce a v této změně neuděláte — chybu, navazující krok, rozhodnutí, které patří člověku — založíte v okamžiku, kdy to vidíte, nikdy nahromaděně na konec a nikdy jen v chatu. spot (vitrinka task spot <title>, POST /projects/{project}/spot) to založí jako podúkol navázaného úkolu; bez navázaného úkolu pod průběžný epic projektu Found during implementation, vyražený při prvním použití.

  • Typ podle povahy — bug pro chybu, která existuje dnes, task pro navazující práci, která potřebuje vlastní session; kontrola rozdělané práce je krok na navázaném úkolu, nikdy podúkol, a rozhodnutí, které vlastní člověk, je tam brána human (Decide: …).
  • Krok přeroste checklist — fromStep ho povýší: položka opustí checklist rodiče ve chvíli, kdy vznikne podúkol.
  • Tělo = co · kde · proč — co bylo vidět, kde (soubor, cesta, obrazovka) a proč je to tady mimo rozsah.
  • production: true přidá štítek might-affect-production, takže chyba viditelná uživatelům je k nalezení před dalším releasem.
  • Reference jedou s tím — nástěnka, pull request nebo nahraná session jako důkaz.

Nejdřív se přečtou podúkoly navázaného úkolu, aby se nic nezaložilo dvakrát.

Hand back

Práce na navázaném úkolu končí jedním voláním. hand_back (vitrinka task handback [id], POST /tasks/{id}/handback) vezme to, co by se jinak napsalo do chatu, a v jedné transakci to uloží na úkol:

PoleStane se z něj
summaryŘádek LAST příštího pickupu — psaný pro tým, ne pro reviewera
doneJeden řádek na hotovou věc v bloku
surfaces · buildOnŘádek ON pickupu — co teď existuje a kde začít
nextKroky a brány v checklistu úkolu, v zadaném pořadí (kind step · human · date · action, who / at, when, které krok odškrtne samo); task: true založí podúkol pro práci, která potřebuje vlastní session
omitteddecide: true je brána human Decide: … čekající na who — jen pro běh bez člověka; živá relace se nejdřív zeptá a odpověď zapíše do summary; ostatní vynechané věci jsou podúkoly
branch · worktreeŘádek BRANCH
prerequisitesŘádek BEFORE; neprázdný seznam označí rodičovský epic jako čekající
readFirstId referencí, které povedou řádky READ příštího pickupu
refsPull request a nástěnka, které z práce vznikly
sessionIdŽivý běh navázaný na začátku session skončí se shrnutím

Shrnutí se uloží jako další verze přílohy handoff úkolu, takže každá předávka zůstane čitelná a pickup čte vždy tu nejnovější. next_action rodičovského epicu se posune na první otevřený podúkol. Odpověď nese rendered:

Summary
<summary>

<one line per done item>

Next steps
1. <open step on this task> — human gate · <who>
2. <step>
Filed 2 child task(s): [<key>](<child url>) [<key>](<child url>)
📋 Task: [<key>](<url>) — <status>
🔀 PR (merged): [<repo>#<n>](<url>)
🖼️ Board: [<board title>](<url>)

Každý odkaz je maskovaný Markdown odkaz: krátký popisek (klíč úkolu, repo#N pull requestu, název boardu) nad přesnou URL, kterou vydal server, takže terminál nebo chat ukáže popisek a otevře adresu. Next steps je otevřený checklist úkolu — nejdřív brány, u každé lidské brány ten, na koho čeká; když nic otevřeného nezbývá, blok to řekne. Podúkoly založené přes task: true nebo jako vynechané věci jsou jeden řádek odkazů; ponesou je řádky NEXT příštího pickupu. Pull request uvádí stav před odkazem: merged, waiting (otevřený, ještě nesloučený), draft nebo closed; ref připojený bez stavu se čte unknown.

Tento blok je předávka. Agent ho vytiskne tak, jak přišel, a nic nepřidává; řádek, který by chtěl dopsat rukou, je pole, které zapomněl vyplnit.

Stav se posouvá sám a status se vyplňuje jen pro opravu — znovuotevření, zrušení, vrácení do backlogu.

Transkript session se na úkol dostane jen na požádání: vitrinka task handback --transcript ho po předávce archivuje a označí úkol štítkem eve-distill, takže kolega čte výtah místo celé session.

Stav se posouvá sám

Tři výchozí pravidla čtou události ledgeru úkolů, takže při práci nikdo nenastavuje stav ručně (první dvě jsou nová s pracovní smyčkou, třetí existovalo dřív):

PravidloCo dělá
run-starts-workŽivý běh zahájený na úkolu v backlogu nebo nezahájeném úkolu ho označí jako rozpracovaný.
open-pr-reviewsOtevřený pull request, který si úkol nárokuje, ho označí jako v review. PR, který úkol v těle jen zmiňuje, ho propojí, ale nikdy nezmění jeho stav.
merged-pr-completesSloučený pull request, který si úkol nárokuje, ho dokončí: vt-<id> úkolu ve větvi nebo názvu PR, uzavírací klíčové slovo v jeho těle (Closes vt-12) nebo PR připojený ručně. Spustí se jednou, při sloučení nebo když člověk připojí už sloučený PR: úkol znovu otevřený poté zůstane otevřený i přes pozdější přílohy a aktualizace PR, a dokončí jen práci, kterou nic dalšího nedrží: dokud je otevřená některá položka checklistu (brána, akce, krok) nebo jiný pull request, který si úkol nárokuje, sloučení se jen zapíše k jeho referenci a úkol zůstane otevřený pro toho, kdo dokončí zbytek. PR, který úkol jen zmiňuje, ho propojí, ale nikdy nedokončí — stejně jako klíč nebo klíčové slovo v PR z repozitáře mimo ty, které projekt uvádí.

Epicy jsou vyňaté: jejich uzavření vlastní portfoliový ledger. update {kind: "task", id, status} zůstává explicitními dveřmi pro znovuotevření a opravy.

Hooky session

vitrinka setup před zápisem ukáže přesné položky hooků a nainstaluje je do settings.json Claude Code a, je-li na stroji Codex, tři hooky session do ~/.codex/hooks.json:

  • SessionStart — na větvi vt-<id> naváže session na úkol jako živý běh a vytiskne pickup, takže session začíná s vědomím, co dělat; při čerstvém startu nebo /clear navíc vypíše todo projektu, jejichž podmínky nastaly, a plány, které jsou na řadě.
  • SessionEnd — zapíše do běhu to, co ví git: commity od začátku běhu, pull request na větvi, dotčené soubory. I zapomenutá session po sobě nechá stopu.
  • Stop — zablokuje závěrečný tah jen tehdy, když jeho poslední zpráva nese nadpis Next steps a navázaný úkol nemá předávku novější než běh této session. Důvod říká „call hand_back first“; odpovědí je skill handoff. Čte jen nadpis, nikdy obsah.
  • PreToolUse (jen Claude Code) — při úpravě souboru ohlásí todo, jehož podmínka path na soubor sedí, jednou za session.

Codex spouští tytéž tři hooky; jeho událost Stop předá hooku poslední zprávu asistenta přímo. Codex důvěřuje hooku jednou na stroj: po vitrinka setup otevřete Codex a spusťte /hooks, abyste tři položky schválili — do té doby je Codex přeskakuje, pod codex exec potichu. vitrinka doctor ukazuje stav jako hooks·codex a vlastní bezhlavé běhy Codexu ve vitrince (vitrinka work watch --exec codex) předávají --dangerously-bypass-hook-trust, takže tam brána běží i bez tohoto rituálu.

vitrinka task pickup 718                              # ohraničený pickup s kontrolou větve
vitrinka task spot "Checkout total ignores the coupon" --production \
  --body "seen on /checkout with a percentage coupon · cart.ts · out of scope for the address step"
vitrinka task handback --summary "Address step ships as one guided flow" \
  --done "address form validates inline" --next "Wire the payment step" \
  --pr acme/shop#42

Kde se to děje

  • Agenti — get {kind: "task", view: "pickup"}, spot, hand_back; skilly pickup, spot a handoff modulu pm.
  • Terminál — vitrinka task pickup, task spot, task handback; task start bez id naváže větev vt-<id> z checkoutu.
  • Stránka projektu — předávka je nejnovější příloha handoff úkolu, podúkoly jsou jeho děti a Přehled ukazuje, co čeká na vás, časovou osu sprintů a postup vybraného sprintu.

Na této stránce