compose · git:20260914.27630fb · 2026-09-14 · sha256 11fc11353815b0d4

compose git:20260914.27630fbA

Immutable. This exact content never changes and is served at /api/v1/blob/11fc11353815b0d4.

---
name: compose
description: Skill se použije, když uživatel zadá "/compose" (volitelně s režimem collect nebo profile), nebo zadá "/compose write", anebo chce napsat či přepracovat článek, příspěvek na sociální sítě nebo vlákno vlastním hlasem a stylem – včetně zkrácení nebo překlopení vlastního staršího textu do jiného formátu. Výchozí režim píše text podle znalostní báze autorova psaní. Režim "collect" provede shromážděním všech jeho dosavadních textů do archivu – exporty ze sociálních sítí, články z webů, lokální zálohy. Režim "profile" nad tím archivem vydestiluje znalostní bázi, nebo ji aktualizuje o texty, které mezitím přibyly. Na rozdíl od /transcript, který přepisuje nahrávky, tenhle skill píše nový text; cizí text neredaguje ani nekorekturuje. Autorovy názory a pointy si nikdy nevymýšlí – bez nich se nerozjede.
argument-hint: [write|collect|profile]
allowed-tools: [Read, Write, Edit, Glob, Grep, Bash, Agent, WebFetch, AskUserQuestion]
---

# Compose

## Co skill dělá

Píše text hlasem konkrétního autora – ne obecnou češtinou, kterou dnes pozná každý. Opírá se o **znalostní bázi** (odvozená pravidla: styl, profily formátů, zlatý fond ukázek) a o **archiv** (korpus všeho, co autor kdy napsal). Tři režimy:

- **`/compose`** nebo **`/compose write`** (výchozí) – **psaní textu**. Článek, příspěvek na sociální sítě, vlákno.
- **`/compose collect`** – **shromáždění archivu**. Provede vyžádáním exportů ze sítí, stažením článků z webů a převodem do jednotné podoby. Pouští se opakovaně, kdykoliv přibude nový zdroj nebo nový export.
- **`/compose profile`** – **destilace báze** nad archivem. Neexistuje-li báze, postaví ji celou; existuje-li, zapracuje jen to, co v archivu přibylo od minule.

**Proč `profile`, a ne `update`.** Ustálená sada režimů (`create`/`update`/`delete`) předpokládá, že se zakládání a aktualizace ovládají zvlášť. Tady je to jeden úkon, který si stav pozná sám – pojmenovat ho `update` by lhalo při prvním běhu a `create` při každém dalším. `profile` navíc funguje jako sloveso i jako jméno výstupu. Zamítnuto `learn` a `distill`: říkají činnost, ale nepojmenují, co po nich zbude.

**Hlas ani cesty nejsou v tomhle souboru.** Skill neví, komu píše – čte to z báze, na kterou je nastavený. Bez ní neumí nic; první běh je proto vždycky `collect` a `profile`.

## Co skill nedělá

- **Nevymýšlí autorovy názory a pointy.** Zná jeho *jak*, ne jeho *co*. Když k tématu nezná postoj, doptá se – odhadnutý názor je horší než žádný text.
- **Nespravuje archiv jako korpus.** Konvence pojmenování, metadata a tematické štítky jsou věc toho archivu, ne skillu. `collect` je do něj plní podle jeho pravidel; kde žádná nejsou, založí je.
- **Nepřepisuje mluvené slovo.** Na nahrávky, schůzky a jejich shrnutí je `/transcript`. Tenhle skill vyrábí nový text.
- **Nedělá redakční korekturu cizího textu.** Kontrola proti redakčnímu standardu je `~/Dev/context/text/text.md`; tady se standard uplatňuje při psaní, ne jako samostatná služba.
- **Nepublikuje.** Výstupem je text, ne příspěvek někde venku.

## Jak je to postavené uvnitř

Převodníky exportů ze sociálních sítí leží ve `scripts/` vedle tohohle souboru:

| Skript | Vstup | Co dělá |
|---|---|---|
| `scripts/gen_twitter_md.py` | adresář `data/` z rozbaleného exportu X | tweety po letech, expanduje t.co, slučuje vlákna |
| `scripts/gen_facebook_md.py` | `your_posts__…_1.json` | příspěvky po letech, opravuje mojibake |
| `scripts/gen_linkedin_md.py` | adresář s `Shares_*.csv` a `Comments_*.csv` | příspěvky a komentáře po letech |
| `scripts/parse_bluesky.py` | `repo.car` | posty z AT Protocol repozitáře do JSON (žádá `cbor2`) |
| `scripts/gen_bluesky_md.py` | JSON z předchozího kroku | posty po letech |
| `scripts/extract_wpress.py` | archiv `.wpress` | rozbalí zálohu All-in-One WP Migration |

Volají se takhle – **cíl je vždycky druhý argument**, hranaté závorky jsou volitelné:

```
scripts/gen_twitter_md.py   <adresář data/ z rozbaleného exportu>     <cílový adresář>
scripts/gen_facebook_md.py  <your_posts__…_1.json>                    <cílový adresář> [URL profilu]
scripts/gen_linkedin_md.py  <adresář s Shares_*.csv a Comments_*.csv> <cílový adresář> [URL profilu]
scripts/parse_bluesky.py    <repo.car>                                <výstupní JSON>  [handle]
scripts/gen_bluesky_md.py   <JSON z předchozího kroku>                <cílový adresář>
scripts/extract_wpress.py   <archiv .wpress>                          <cílový adresář> [filtr]
```

**Skripty jsou implementační detail, ne rozhraní.** Smí se přepsat i vyhodit. Závazné je, co po nich zbude: **jednotný Markdown v archivu**, ze kterého `profile` čte, a **idempotence** – druhý běh nad týmž exportem vyrobí týž soubor, takže rozdíl je vidět v gitu.

**Všechny berou cíl argumentem**, nikdy si ho neodvozují ze svého umístění. Skill se instaluje jinam, než leží archiv.

------

## Fáze 0 – Příprava

Společný začátek je v `~/.claude/skills/PREFLIGHT.md`. **Body 1 až 3 z něj neplatí** – skill neběží nad projektem, ale nad archivem a bází, které leží mimo něj. Nahrazuje je tohle:

1. **Najdi bázi a archiv.** Cesty stojí v `~/.claude/CLAUDE.md` na řádku začínajícím `- **Znalostní báze psaní:**`. **Chybí-li ten řádek**, zeptej se přes `AskUserQuestion`, kde mají obě věci ležet, a řádek doplň – jinak se bude ptát každá session znovu. Neexistuje-li ani jedna cesta, řekni to a nabídni `collect`.
2. **Ověř, že báze není prázdná.** Chybí-li soubor stylu, skill nemá podle čeho psát: řekni to a nabídni `profile`. Nepokoušej se hlas odvodit za běhu z archivu – vznikne z toho průměr, ne styl.
3. **Zjisti, jestli archiv i báze leží v gitu a jestli je pracovní strom čistý.** Oboje se při běhu mění a autocommit cizí session by tvoje rozpracované změny posbíral s něčím nesouvisejícím. Je-li tam něco rozpracovaného, vypiš to a zeptej se.

**Zapisuje se do dvou repozitářů** – archivu a báze. Ani jeden z nich nemusí být ten, ve kterém session běží. Co v nich změníš, commituj sám a řekni to; v cizím pracovním stromu nikdy nenechávej nedokončený zápis.

## Fáze 1 – Zadání

Je-li v argumentu režim, jeď podle něj a jen ho oznam. Jinak piš text a **ptej se postupně, jednu otázku za druhou** (`~/.claude/RULES.md`, *Ptej se postupně, ne všechno najednou*):

1. **Formát** – článek, příspěvek, vlákno. Určuje, který profil se načte. Formát, na který báze profil nemá, neslibuj: buď se text napíše podle nejbližšího a řekne se to, nebo profil vznikne v `profile`.
2. **Vstup.** Nový text, nebo přepracování vlastního staršího – zkrácení, překlopení článku do vlákna, příspěvek postavený na starším článku. **U přepracování je zdrojem pravdy ten původní text**, ne archiv: pointa v něm už je a nevymýšlí se znovu.
3. **Téma, publikum, kanál.**
4. **Autorův postoj a pointa.** Tohle je jádro. Autor smí dodat cokoliv od holého tématu přes osnovu po hrubý draft – ale postoj musí přijít od něj. **Nezná-li ho ani on, ani ty, doptej se a bez odpovědi nepiš.**

   **Kandidátské pointy smíš nabídnout, ale jen jako výtah z archivu, ne jako vlastní návrh.** Nejmíň tři, každá s cestou a doslovným úryvkem, ze kterého plyne. Jedna nestačí – z jedné možnosti se nevybírá, ta se odkývá. Autor jednu zvolí, přepíše, nebo odmítne; teprve jeho volba je zadání. **Vlastní pointu nenavrhuj ani jako příklad**: co jednou zazní z tvé strany, autor pod tlakem času schválí a bude to vypadat jako jeho názor.

## Fáze 2 – Kontext

Načti z báze **soubor stylu**, **profil zvoleného formátu** a **odpovídající zlatý fond ukázek**.

K tomu dohledej v archivu **3 až 5 textů nejpodobnějších tématem a formátem** – přes zlatý fond a grep – a **přečti je celé**. Pravidla popisují hlas, ukázky ho nesou; bez nich vzniká text, který popis stylu splňuje a přesto zní cize.

**Bez načtených ukázek se draft nezačíná.** Je to podmínka běhu, ne optimalizace – stejně tvrdá jako autorův postoj. Žádá-li autor jejich vynechání („styl máš přece v bázi“, „nežer kontext“, „spěchám“), **odmítni a vysvětli proč**: kontext ušetřený tady se utratí na přepsání celého draftu. Tři texty jsou mez, ne odhad; míň jich znamená, že se nepíše.

## Fáze 3 – Draft

Napiš text podle stylu a profilu formátu. Platí i redakční standard `~/Dev/context/text/text.md` a česká typografie `~/Dev/context/text/typography.md`, existují-li – báze řeší hlas, standard řemeslo a typografie sazbu.

## Fáze 4 – Sebe-revize

Před odevzdáním projdi:

- **Ukázky.** Máš v kontextu celé texty z archivu, ne jen bázi? Nemáš-li, text self-checkem neprošel a věta o hotovosti se nepíše.
- **Výklad od A k B.** Mluví-li text o B, které plyne z A, stojí A dřív.
- **Šťouralové předjati.** Detail vynechaný pro jednoduchost je v textu zmíněný a zdůvodněný.
- **Srozumitelnost pro dané publikum**, bez ztráty odborné korektnosti.
- **Anti-patterny ze stylu.** Zní to jako autor, ne jako AI?
- **Horní mez.** Charakteristické obraty a expresiva smí být v textu **nanejvýš jednou** – víc už je parodie na vlastní styl. Klidně žádný. **Trvá-li autor na víc výskytech, je to připomínka do báze, ne výjimka pro tenhle text**: buď se škrtá, nebo se po odsouhlasení mění mez ve stylu. Text s překročenou mezí se za hotový neoznačí ani na vyžádání.

## Fáze 5 – Předání

Předlož draft a zapracuj připomínky.

**Připomínku obecné platnosti nabídni promítnout do báze** – do stylu, profilu formátu, nebo výměnou ukázky ve zlatém fondu. Bez toho se táž oprava dělá při každém dalším textu znovu. Zapisuj až po odsouhlasení a **řekni, do kterého souboru to šlo**.

Zakonči jednou z těchto vět, nikdy ničím vágním mezi tím:

- `Text je hotový a prošel self-checkem, můžeš ho publikovat.`
- `Text hotový není – brání tomu: <konkrétní seznam>.`

------

## Režim `collect`

Shromáždí texty do archivu. **Katalog zdrojů, postupy stahování a pasti jednotlivých exportů jsou v [`sources.md`](sources.md)** – načti si ho, neopisuj odsud.

### 1. Soupis zdrojů

Zeptej se, kde všude autor kdy psal: vlastní blogy, cizí weby a magazíny, tištěná média, sociální sítě, zaniklé weby, lokální zálohy. **Ptej se postupně** a u každého zdroje zjisti, jestli je ještě online.

**Odhad počtu od autora není zdroj pravdy.** „Bude jich přes sto“ opakovaně neodpovídalo ničemu. Úplnost se ověřuje proti datům – `X-WP-Total`, sitemapa, databáze exportu – a platí ta.

### 2. Vyžádání exportů

Exporty ze sítí se připravují **hodiny až dva dny**. Vyžádej je jako první věc, ať čekání běží na pozadí, a řekni autorovi, že mu přijde mail. Odkazy jsou v `sources.md`.

### 3. Rozhodnutí o rozsahu

Než se začne stahovat, nech potvrdit tři věci – každá pak platí pro celý archiv:

| Co | Proč se to rozhoduje předem |
|---|---|
| **Co je autorský text** | Rozhovor, kde autor jen odpovídal, napsal někdo jiný. Doklad o autorovi to je, jeho dílo ne. Dělicí čára je autorství, ne formát. |
| **Co se vyřazuje** | Mrtvé žánry, cizí zadání, texty psané pod cizí redakcí. Vyřazené se **nemaže, jen označí** – pořád dokládá vývoj. |
| **Časové vážení** | Které roky jsou norma a které už jen historie. Bez toho vznikne průměr dvaceti let, kterým autor nikdy nepsal. |

### 4. Stažení a převod

Jeď zdroj po zdroji podle `sources.md`. Skripty ze `scripts/` berou cíl argumentem.

**Texty psané AI se do archivu značí** řádkem v metadatech. Bez toho se příští `profile` učí z vlastního výstupu a hlas se stočí sám do sebe.

**Ověř úplnost každého zdroje proti datům**, ne proti dojmu, a zapiš k němu, jak se to ověřilo. Zdroj, u kterého se to neví, se v archivu označí jako neúplný.

### 5. Zápis konvencí

Archiv potřebuje vlastní popis: struktura adresářů, pojmenování souborů, povinná metadata, odkud se co bere a jak se to aktualizuje. Založ ho, nebo doplň, a **commitni**.

Zakonči jednou z těchto vět, nikdy ničím vágním mezi tím:

- `Archiv je shromážděný a úplnost každého zdroje ověřená, můžeš pustit /compose profile.`
- `Archiv shromážděný není – brání tomu: <konkrétní seznam>.`

------

## Režim `profile`

Vydestiluje z archivu znalostní bázi. **Postup destilace, struktura analýz a slepý test jsou v [`distillation.md`](distillation.md)** – načti si ho, neopisuj odsud.

### 1. Zjisti, co se profiluje

Podívej se do báze na záznam poslední profilace (leží v `_analysis/`):

| Stav | Co dělat |
|---|---|
| Báze neexistuje | **Celá destilace** podle `distillation.md`. |
| Báze i záznam existují | **Přírůstek**: jen texty, které v archivu přibyly od zapsaného data a rozsahu. |
| Báze existuje, záznam ne | Řekni to a **zeptej se**: buď celá destilace znovu, nebo datum, od kterého se má brát přírůstek. Nehádej. |

**Nikdy nepřepisuj bázi bez přečtení.** Obsahuje ruční úpravy, které vznikly z připomínek k jednotlivým textům, a ty v archivu nikde nejsou.

**Ruční pravidlo se nemaže bez zeptání – ani při celé destilaci.** Pravidlo bez dokladu v archivu obvykle vzniklo z autorovy výhrady ve slepém testu; nová destilace ho neodvodí, protože v korpusu není. Před přepsáním udělej inventuru: co doklad má a co ne, a nedoložená předlož **jedním seznamem**. „Stará verze zůstane v gitu“ náhrada není – git uchová znění, ne důvod, proč pravidlo vzniklo.

### 2. Analýza korpusu po částech

Korpus se do kontextu nevejde. Rozděl ho na části podle formátu – dlouhé texty, střední příspěvky, mikroblog a vlákna – a **každou nech projít samostatně**; jsou na sobě nezávislé.

**Každé stylistické tvrzení musí mít doklad**: cestu k souboru a doslovný úryvek. Tvrzení bez dokladu je dojem a do báze nesmí. Formát analýz je v `distillation.md`.

**Model a effort** (delta proti `~/.claude/RULES.md`, *Model a effort podle úkolu*): analýzy jedou na výchozím modelu session, protože jde o čtení proti zadané struktuře a chyba je vidět v dokladu. **Syntéza do stylu jede na nejsilnějším modelu a `xhigh`** – je vstupem každého budoucího textu, takže se její chyba násobí do všeho, co po ní přijde.

### 3. Syntéza

Z analýz sestav bázi: **styl** (co platí napříč formáty), **profil každého formátu** (co je jeho vlastní) a **zlatý fond** ukázek.

**Profil neopisuje styl, odkazuje na něj.** Dvě verze téhož pravidla se rozejdou a nikdo nepozná, která platí.

**Anti-patterny piš kontrolovatelně.** „Nezačíná text řečnickou otázkou“ jde ověřit; „píše autenticky“ ne.

### 4. Slepý test

Napiš podle nové báze tři texty – po jednom v každém formátu – a nech autora říct **„zní / nezní jako já“** s konkrétní výhradou. Bez toho se neví, jestli báze zachytila hlas, nebo jen popis hlasu.

**Zadání musí přijít od autora**, včetně jeho pointy. Text s vymyšleným názorem test znehodnotí – autor bude odmítat obsah a bude to vypadat jako vada stylu.

Každou výhradu přelož na úpravu báze a **opakuj, dokud autor neschválí všechny tři formáty.**

### 5. Záznam

Zapiš do báze datum profilace a rozsah korpusu, ze kterého vyšla – počty a poslední zpracovaný soubor u každého zdroje. To je jediné, podle čeho příští běh pozná, co je nové. **Commitni** archiv i bázi.

Zakonči jednou z těchto vět, nikdy ničím vágním mezi tím:

- `Báze je hotová a prošla slepým testem, můžeš psát /compose.`
- `Báze hotová není – brání tomu: <konkrétní seznam>.`

------

## Časté chyby

- **Píše se bez načtených ukázek, protože „báze je přece totéž“.** Není. Pravidla hlas popisují, ukázky ho nesou – text splní styl do puntíku a stejně zní cize. Je to nejdražší úspora kontextu, jakou tu jde udělat.
- **Charakteristický obrat se použije třikrát.** Jednou je to podpis, potřetí parodie. Platí na celý text, ne na odstavec.
- **Autorův názor se odhadne z jeho starších textů.** Archiv říká, jak píše, ne co si myslí o dnešním tématu.
- **Připomínka obecné platnosti se opraví jen v draftu.** Za týden se objeví znovu, protože v bázi o ní nic není.
- **Úplnost zdroje se odhadne.** Ověřuje se proti datům; odhad se opakovaně ukázal jako smyšlený.
- **Vlastník účtu se přečte z prvního identifikátoru v exportu.** Exporty jsou plné cizích ID – první `did:plc:` v Bluesky exportu patřil sledovanému účtu, ne autorovi.