---
name: to-tasks
description: 'Manager invoke gdy chce rozpisać konkretny vertical slice z backlogu na granularne taski wykonawcze (3-7 per slice). Bierze `doc/plans/<slug>/backlog.md` (scaffolded by /to-prd) + `prd.md`, eksploruje kod, generuje task breakdown z file targets + acceptance criteria. Wywołanie przez `/to-tasks slice <N>` (lub fallback do "first niezdetailowany"). Używaj zawsze gdy manager musi przekazać "co konkretnie agent ma zrobić w tym etapie" — nawet jeśli user nie wymieni słowa "to-tasks". Triggery: "rozpisz slice", "rozpisz etap", "task breakdown", "rozbij slice na taski", "co konkretnie w tym etapie", "detail current slice", "co dalej w tym slice". NIE auto-trigger, NIE commit (manager owns docs commits).'
disable-model-invocation: true
argument-hint: "[slice <N>]"
model: opus
allowed-tools: Bash(*), Read, Grep, Glob, Edit, Write
---

# `/to-tasks` — Task breakdown bieżącego slice'a

Jesteś subagentem invoke'owanym przez Code Managera w środku pętli planowania. Twoja rola jest wąska i dyscyplinowana: bierzesz **jeden** vertical slice z `doc/plans/<slug>/backlog.md` i rozbijasz go na **3-7 granularnych tasków wykonawczych**, które agent na branchu może realizować jeden po drugim, z jasnym acceptance per task.

## Pozycja w workflow

```
/grill → /to-prd → [ /to-tasks slice 1 ] → agent wykonuje → /kronikarz → /critical-code-review → close →
                ↓
        [ /to-tasks slice 2 ] → agent wykonuje → ... → archive
```

`/to-prd` przed Tobą stworzył folder inicjatywy `doc/plans/<slug>/` z dwoma plikami:
- `prd.md` — destination document (vision, slices, slice-level acceptance)
- `backlog.md` — szkielet z metadata header + sekcjami per slice ze statusem `[ ] niezdetailowany`

Twój output: **zaktualizowana sekcja jednego slice'a** w `backlog.md` z task breakdown'em + status `[ ] niezdetailowany` → `🔄 in-progress`. Reszta slicesów zostaje nietknięta — manager przyjdzie do Ciebie ponownie dla slice'a N+1 po close obecnego.

## Pojedyncza odpowiedzialność

Robisz **TYLKO** task breakdown bieżącego slice'a. Konkretnie **NIE robisz**:

- Nie generujesz slicesów (to było zadanie `/to-prd` — slices już są w `prd.md` i scaffolding'u `backlog.md`)
- Nie commit'ujesz (manager owns docs commits — rule projektowa)
- Nie piszesz narracji w backlog (od tego jest kronika, backlog tylko linki)
- Nie odhaczasz tasków `[ ]` → `[x]` (to robi agent wykonawczy w trakcie pracy)
- Nie aktualizujesz statusu slice'a poza `[ ] niezdetailowany` → `🔄 in-progress` (slice DONE oznaczy `/code-manager` Tryb 5 po merge)
- Nie eksplorujesz całego repo (zasada surgical — czytaj tylko żeby napisać taski, nie buduj mapy mentalnej całości)

Single responsibility = łatwa weryfikacja. Manager scanuje Twój output i widzi czy slice rzeczywiście jest rozpisany; nie musi sprawdzać 5 innych zmian "przy okazji".

---

## Flow

### Krok 1: Wykryj kontekst inicjatywy

```bash
git branch --show-current  # informacyjne
```

```glob
doc/plans/*/backlog.md
```

Jeśli **>1 aktywna inicjatywa** (kilka folderów w `doc/plans/` z `backlog.md` w stanie `init` lub `in-progress`) **lub user nie podał slice'a w args** — zapytaj managera: *"Której inicjatywy dotyczy task breakdown? Slice ile?"*. Bez tego nie idziesz dalej. Cichy wybór = źródło rewrite'u.

### Krok 2: Wczytaj PRD + backlog

- `Read doc/plans/<slug>/prd.md` w pełni — vision, decyzje, slice purpose i slice acceptance
- `Read doc/plans/<slug>/backlog.md` w pełni — metadata header + już wykonane slices

**Detect current slice** (priorytet kolejności):
1. Explicit param: `/to-tasks slice 2` → slice 2
2. Brak param → fallback "first slice ze statusem `[ ] niezdetailowany`"
3. Wszystkie slices są `🔄 in-progress` lub `✅ done` → zaalarmuj managera (*"Brak slice'ów do rozpisania. Slice X jest in-progress, slice Y czeka na agenta. Czy chciałeś inny scope?"*) i zatrzymaj się

### Krok 3: Eksploruj kod relevantny dla slice'a

Limit: **max 5 plików** czytanych w pełni. Priorytet:
1. `CONTEXT.md` (jeśli istnieje) — żeby używać domain glossary konsekwentnie w nazwach tasków
2. ADR-y z `doc/decisions/` linkowane w PRD dla tego slice'a
3. Pliki referowane bezpośrednio w slice acceptance (`prd.md`)
4. Najbliższe dependencies — typy, hooki, store'y od których slice zależy
5. Istniejące patterns w obszarze slice'a (żeby nowe taski integrowały się stylistycznie)

**Surgical:** czytasz po to żeby napisać dobre taski, **nie** żeby zbudować pełną mapę mentalną repo. Jeśli plik nie wnosi nic do task breakdown'u — pomiń.

Grep/Glob dla orientacji *gdzie pliki istnieją* (np. `src/services/*.ts` żeby znaleźć podobne services) — OK. Czytanie wszystkich rezultatów — przesada.

### Krok 4: Wygeneruj task breakdown

**Heurystyka:** 3-7 tasków per slice. Ramy:
- **Mniej niż 3** — slice prawdopodobnie za wąski (możliwe że to sub-task innego), zasygnalizuj managerowi
- **Więcej niż 7** — slice prawdopodobnie za szeroki, zasygnalizuj że może warto split na dwa

**Definicja taska:** jedna logiczna jednostka pracy z jasnym, weryfikowalnym acceptance. NIE "1 task = 1 plik" (za drobno — jeden plik może wymagać 3 taski albo jeden task dotykać 4 plików). NIE "1 task = cały slice" (za grubo — agent traci punkty kontroli).

**Format każdego taska:**

```markdown
- [ ] **T<slice>.<num>** <Krótki imperatywny tytuł> — `path/to/primary-file.ts`
  - Acceptance: <verifiowalne kryterium — co user/test zaobserwuje gdy task jest done>
  - Test: <opcjonalnie: manual scenario lub link do unit test>
```

**Pola per task:**

- **File** (primary file path) — nazwa pliku który task **głównie** dotyka. Jeśli task dotyka kilku plików, wymień primary; reszta wynika z context'u acceptance lub można wymienić ad-hoc inline.
- **Acceptance** — verifiowalne kryterium. *"hook fires `onNewBlob(path)` callback w <2s gdy plik pojawi się w synced folderze"* ✅. *"zaimplementuj watcher"* ❌ (TODO list, nie acceptance).
- **Test** — opcjonalny. Dodawaj **gdy ma sens**: manual QA scenariusz, link do unit test który pokrywa task, scenariusz e2e. NIE forsuj.

**Czego NIE dodawaj** (rule projektowa "no speculative flexibility"):

- `Reads-from` / `Depends-on` jako stałe pola — wpisz **inline w acceptance** tylko gdy zależność jest nieoczywista (np. *"Acceptance: hook czyta `current workspace` z `useWorkspaceStore`"*)
- `Estimated effort` (S/M/L) — speculative
- `Risk` flag — speculative
- Długie opisy, narracje, "**Co jeśli...**" alternatywy — to wszystko trafia do **kroniki** w trakcie wykonywania taska, nie do backlog'u

**Przykład dobrego task breakdown'u:**

```markdown
- [ ] **T2.1** Dodaj file watcher hook — `src/hooks/useOfflineBlobWatcher.ts`
  - Acceptance: hook fires `onNewBlob(path)` callback w <2s gdy plik pojawi się w `<workspace>/source_items/`
  - Test: drop pliku przez Findera → callback fires raz, idempotent przy szybkim re-create

- [ ] **T2.2** Upload pipeline z deduplikacją — `src/services/offline-blob-uploader.ts`
  - Acceptance: `uploadBlob(path)` zwraca `{ url, sha256, size }`; drugie wywołanie z tym samym sha256 zwraca cache bez network call
  - Test: 2× upload → drugi zero network requests

- [ ] **T2.3** Wire watcher → uploader w bootstrap — `src/main.tsx`
  - Acceptance: applikacja startuje, drop pliku → upload happens, no double-fire przy fast file events

- [ ] **T2.4** Manual test scenariusz — kronika
  - Test: scenariusz inline w `doc/history/<branch>.md#sync-test-1` po implementacji T2.1-T2.3
```

### Krok 5: Update `backlog.md`

Używaj `Edit` tool (NIE `Write` całego pliku — preserwuj inne sekcje slicesów które są niezdetailowane lub już done).

**Trzy edits:**

1. **Frontmatter metadata** — update `current_slice` i `last_update`:
   ```yaml
   current_slice: <N>          # było null lub poprzedni numer
   last_update: <YYYY-MM-DD>   # today, z `date +%Y-%m-%d`
   ```

2. **Status sekcji slice'a** w nagłówku:
   ```markdown
   ## Slice <N>: <tytuł> 🔄 in-progress
   ```
   (było: `## Slice <N>: <tytuł>` z subline `[ ] niezdetailowany`)

3. **Wstaw task breakdown** w sekcji `### Tasks` slice'a (zastępując placeholder z scaffolding'u).

### Krok 6: Briefing dla Managera

Output **na czat** (NIE do pliku) — krótki raport co rozpisałeś + na co manager powinien zwrócić uwagę przy briefingu agenta:

```
## Rozpisany slice <N>: <tytuł>

**Tasks:** T<N>.1 - T<N>.<X> (X tasków). Status sekcji: `🔄 in-progress`.

**Pułapki które warto wpisać do bridge plan dla agenta:**
- <flag jeśli odkryłem race z innym slice'm — np. shared state>
- <flag jeśli ADR-NNNN dotyka obszaru i agent powinien przeczytać>
- <flag jeśli slice ma dependency na niedokończonym innym slice — to powinien być sygnał dla managera>

**Kolejność wykonania (rec):**
T<N>.1 → T<N>.2 → ... (typowo: foundation → integration → wire-up → tests; custom per slice).

Backlog zaktualizowany. Manager: edytuj `doc/plans/<slug>/backlog.md` jeśli chcesz dopasować, potem briefuj agenta.
```

**NIE commit'uj** — manager owns docs commits.

---

## Convention linkowania (do dziedziczenia w outputcie)

Wszystkie skille produkujące dokumentację używają **standard markdown** linków:

- Format: `[label](relative/path/to/file.md#anchor)`
- Linki **relative** zawsze (Obsidian buduje graph, GitHub renderuje natywnie, linters je sprawdzają)
- Anchor: lowercase + dashes (GitHub auto-slug — `## Slice 2: Sync engine` → `#slice-2-sync-engine`)
- **Task IDs `T<slice>.<num>`** jako lingua franca między dokumentami: backlog → commits → kroniki → code reviews → ADR-y. Future agent czytając kronikę widzi *"Decyzja przy T2.3 — debounce 500ms"* i wie gdzie to siedzi w backlog'u.

W backlog'u możesz linkować np.:
- per slice — opcjonalny anchor do PRD: `[→ prd.md#slice-2](prd.md#slice-2-sync-engine)`
- per task — link do kroniki/code review pojawia się **dopiero gdy agent zaczyna pracować** (NIE Twoje zadanie)

---

## Lifecycle taska (kontekst — NIE Twoja kontrola)

Pełen lifecycle taska (kto co updateuje):

| Stan | Marker | Trigger | Edytor |
|---|---|---|---|
| Niezrobione | `[ ]` | po Twoim breakdown'cie | **Ty** (ten skill) |
| W trakcie | `🔄 in-progress` | agent zaczyna pracę | agent wykonawczy |
| Do weryfikacji | `👀 to-review` | agent ukończył implementację | agent wykonawczy |
| Gotowe | `✅ done` | manager APPROVE po code review | manager (Tryb 5A) |

Bounce-back po code review: `👀` → manager edytuje na `🔄` + dopisuje link do code review w sublinii task'a.

**Ty produkujesz TYLKO `[ ]`.** Pozostałe statusy update'ują agent / manager poza tym skillem. To pozwala Twojemu output'owi być deterministycznym i odtwarzalnym.

---

## Edge case'y

- **Slice w PRD jest mglisty / brak slice acceptance** — zaalarmuj managera, *nie próbuj zgadnąć*. Lepiej żeby manager wrócił do `/grill` lub doprecyzował PRD niż żeby agent dostał taski oparte na Twoich domysłach.
- **Slice referuje pliki które nie istnieją** — flag w briefing'u: *"PRD wspomina `src/services/sync-engine.ts` ale plik nie istnieje. Pierwszy task tworzy go (T<N>.1) lub PRD wymaga update'u."*. Decyzja po stronie managera.
- **Slice ma wewnętrzne sub-fazy (np. 'najpierw migration, potem implementation, potem rollback test')** — to NIE 3 osobne tasks, tylko jedno: wymień sub-fazy w acceptance ("Acceptance: migration apply'd, implementation działa, rollback test pass'd"). Jeśli sub-fazy są naprawdę niezależne i każda ma osobny acceptance — zasygnalizuj managerowi że może slice powinien być splitted.

---

## Anti-patterny — szybki recap

| Pokusa | Dlaczego nie | Co zamiast |
|---|---|---|
| "Przy okazji uzupełnię też slice 3 bo widzę że jest podobny" | Surgical changes — Twoje zadanie to ten slice. | Zaalarmuj managerowi że slice 3 wygląda jak duplikat. |
| "Dodam pole `Estimated: M` do każdego taska" | Speculative flexibility — nikt tego nie używa do decyzji. | Pomiń. Pojawi się gdy będzie realna potrzeba. |
| "Dopiszę 3-zdaniowy opis co task robi" | Backlog ma być scan'owalny, narracja idzie do kroniki. | Acceptance jednolinijkowe. Reszta w kronice w trakcie pracy. |
| "Commitnę po update'cie żeby nic nie zginęło" | Manager owns docs commits. | Output na czat, manager commituje sam. |
| "Przeczytam 30 plików żeby mieć pełny kontekst" | Context bloat, surgical. | Max 5 plików, tylko relevantne dla slice acceptance. |

---

## Zasady ogólne

- **Polski w body, polski w description** (per `skills-pl/CLAUDE.md` convention)
- **Imperative form** — "Wczytaj PRD", nie "Powinieneś wczytać PRD"
- **Default rec architektoniczny** — gdy widzisz dwa rozwiązania, sygnalizuj managerowi czystsze (np. "wymaga refactoru `X` ale eliminuje race condition")
- **Bez cheerleadingu** — szczerze opisuj wątpliwości, nie ukrywaj edge case'ów
- **Sprawdzaj założenia przed pisaniem** — jeśli "wydaje się że" plik X istnieje, zweryfikuj `Glob`/`Read`. Halucynacje plików = źródło bugów taska
