# Pracovní smyčka (https://docs.vitrinka.ai/cs/pm/work-loop)



## Úkol je předávka [#idea]

Ú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žik | Sloveso       | Co udělá server                                              |
| ------- | ------------- | ------------------------------------------------------------ |
| Začátek | **pickup**    | Složí jeden ohraničený pohled na úkol a přihlásí se k němu   |
| Objev   | **spot**      | Založí chybu nebo navazující krok jako podúkol, hned         |
| Konec   | **hand back** | Založí 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](/cs/pm/rules) a hooky session.

## Pickup [#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:

```text
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 [#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 [#handback]

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:

| Pole                   | Stane se z něj                                                                                                                                                                                                   |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `summary`              | Řádek LAST příštího pickupu — psaný pro tým, ne pro reviewera                                                                                                                                                    |
| `done`                 | Jeden řádek na hotovou věc v bloku                                                                                                                                                                               |
| `surfaces` · `buildOn` | Řádek ON pickupu — co teď existuje a kde začít                                                                                                                                                                   |
| `next`                 | Kroky 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 |
| `omitted`              | `decide: 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í                                                                                                                                              |
| `readFirst`            | Id referencí, které povedou řádky READ příštího pickupu                                                                                                                                                          |
| `refs`                 | Pull 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`:

```text
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 [#status]

Tři výchozí [pravidla](/cs/pm/rules) č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):

| Pravidlo              | Co 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-reviews`     | Otevř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-completes` | Slouč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 [#hooks]

`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.

```bash
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 [#where]

* **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](/cs/pm/brief) ukazuje, co čeká na vás, časovou osu sprintů a postup vybraného sprintu.
