train-agent
Nechá agenta nastudovat zadaný vstup a zapsat si z něj do vlastní trvalé paměti zobecněný poznatek, který se týká jeho role. Kanonický případ je vyřešená review/retry smyčka nad issue — kolo, které na
SKILL.mdskills/train-agent/SKILL.md
GitHubTrain Agent
Cílem je agent, který se učí ze zkušenosti projektu, místo aby všechno nesl ve
statické definici. Definice drží trvalou identitu a hranice role; všechno
ostatní — rozhodnutí, konvence, pasti — se hromadí v paměti, kterou si agent
píše sám. Závazným kontraktem je
${CLAUDE_PLUGIN_ROOT}/skills/train-agent/memory-conventions.md; při rozporu
s tímto skillem má přednost on.
Vstupní kontext
- Zadání od uživatele nebo volajícího skillu: $ARGUMENTS
Postup
1. Načtení vstupu
Kanonický vstup je vyřešená review/retry smyčka nad issue. Skill sám do
trackeru nesahá — allowed-tools na to záměrně nemá nástroj (viz frontmatter) —
takže záznam dostaneš v zadání od toho, kdo tě spustil, buď jako vložený
text, nebo jako odkaz. Ať dorazí v jakékoli podobě, potřebuješ celou smyčku,
ne jen poslední stav: kolo, které problém našlo, i retry, který ho opravil.
Jediný finální komentář ukáže výsledek, ne chybu, ze které se má agent poučit —
chybí-li ti kterákoli půlka, vrať se na volajícího a vyžádej si ji, nedomýšlej.
Vstupem může být i cokoli jiného, co jde přečíst — soubor v repozitáři, odkaz,
výstup předchozího běhu, nebo prostý text v zadání. Nikdy ADR — architektonické
rozhodnutí se do paměti agenta nezapisuje (viz when_to_use), i kdyby ho
zadání jmenovalo jako vstup. Rozpoznej, o který případ jde, a vstup si
přečti celý, než začneš cokoli odvozovat.
Rozhodni zároveň, jestli na vstup dosáhne i trénovaný agent. Cestu v repozitáři
si otevře sám, URL přes WebFetch, pokud ho má v tools. Záznam review/retry
smyčky mu vlož do zadání vždycky (krok 3) — mcp__gitea__* ani gh skripty
trénovaný agent v tools typicky nemá, takže dostat se k trackeru sám neumí.
Totéž udělej s čímkoli, co nikde neleží nebo na co agent nemá čtecí nástroj.
Agent, který si vstup nemá jak přečíst, si vymyslí, co v něm asi bylo.
Nejde-li vstup přečíst, ohlas to a skonči. Trénovat z domněnky je horší než netrénovat: špatný záznam v paměti se tváří stejně důvěryhodně jako správný a agent podle něj bude jednat, dokud si ho někdo nevšimne.
Přečti si v tomhle kroku i memory-conventions.md — bez nich neumíš sestavit
zadání pro agenta v kroku 3.
2. Určení cílových agentů
- Jméno v zadání platí. Je-li uvedené, neodvozuj nic dalšího. U kanonického vstupu (review/retry smyčka) je tohle běžná cesta: volající zná agenta, který review dělal, nebo agenta, který dostal retry, a jméno rovnou předá.
- U review/retry smyčky bez jména v zadání vezmi cíl ze záznamu samotného — agenta, jehož review nález vzneslo, a agenta, který retry implementoval — ne podle domény kódu, kterého se PR týkalo. Poučení z konkrétní chyby patří tomu, kdo ji udělal nebo kdo ji hledal, ne celé oblasti kolem ní.
- Jinak (mimo kanonický vstup) odvoď z projektu. Projdi
.claude/agents/*.mdcílového projektu i${CLAUDE_PLUGIN_ROOT}/agents/a přečti jejichdescription— agenty dodává obojí a v katalogu se potkají. Plugin ukotvi proměnnou, ne relativně: běžíš nad cizím repozitářem, kde byagents/mířilo do projektu a agenti pluginu by z odvození tiše vypadli. Cílem je každý agent, do jehož domény vstup spadá. - Víc agentů je normální stav, ne chyba — vstup, který mění průřezovou konvenci, se týká všech, kdo podle ní pracují. Nemačkej to na jednoho. Nepleť si to s bodem 2: poučení z jedné konkrétní chyby jednoho agenta se na celou oblast nerozesílá.
- Žádný agent → ohlas, že vstup nespadá do domény nikoho, a skonči. Nedispatchuj agenta „aspoň nějakého“; paměť mimo doménu je jen šum, který se načítá při každém jeho spuštění.
Než kohokoli dispatchneš, ověř u každého cíle tři věci. Všechny tři selhávají tiše — dispatch proběhne, agent ohlásí práci a teprve krok 4 najde prázdnou složku:
- Soubor agenta existuje. Jméno ze zadání ber jako tvrzení, ne jako fakt; překlep by se jinak projevil až chybou nástroje Agent.
- Agent má pole
memory:. Bez něj k paměti nemá přístup. - Agent má v
toolsWriteaEdit. Paměť se zapisuje jimi, takže posuzovatel s právy jen pro čtení zápis neprovede, i kdyžmemory:má. Chybí-li poletoolsúplně, agent dědí všechny nástroje a podmínka je splněná — nesplněná je jen tehdy, kdyžtoolsexistuje a zápisové nástroje v něm nejsou.
Agenta, který některou podmínku nesplní, vynech a ohlas v reportu i s tím,
která podmínka chybí. Doplnění je úprava definice a patří do write-agent;
sám do definice agenta nesahej.
Dvě další zjištění z tools běh neruší, ale mění zadání v kroku 3:
- Nemá-li agent čtecí nástroj na daný typ vstupu (
Readu souboru,WebFetchu odkazu), nevynechávej ho — vlož mu obsah vstupu rovnou do zadání. Jinak dostane cestu, kterou nemá čím otevřít, a domyslí si, co v ní bylo. - Nemá-li čím smazat soubor (
WriteaniEditto neumí), řekni mu v zadání, ať neplatný záznam místo smazání přepíše na platný a odebere jen jeho řádek z indexu. Konsolidace se tím dokončí i bez mazacího nástroje.
U každého cíle, který prošel, si nakonec přečti stávající stav jeho paměti —
MEMORY.md a názvy souborů ve složce. Je to jediný snímek, proti kterému půjde
v kroku 4 poznat duplicitu a odlišit první trénink od chybějícího odkazu:
po dispatchi už složka vypadá jinak a zbylo by ti jen tvrzení agenta.
3. Dispatch
Každého cílového agenta spusť nástrojem Agent s subagent_type rovným jeho
jménu a run_in_background: false.
Nepoužívej nástroj Skill ani jiný způsob načtení jeho definice. Právo zapisovat
do .claude/agent-memory/<agent>/ plyne z pole memory: v jeho vlastní definici
a uplatní se jen když skutečně běží jako on. Načteš-li jeho obsah do
generického kontextu, zápis selže — a selže tiše.
Zasahuje-li vstup víc agentů, spusť je paralelně: každý píše do vlastní složky, takže se nemají o co přetahovat a sekvenční běh by jen prodloužil čekání.
Jméno v subagent_type ber podle původu agenta: agent cílového projektu se volá
holým jménem, agent dodávaný pluginem svým scoped tvarem <plugin>:<agent>.
Odmítne-li nástroj Agent dispatch, agenta neztrácej z reportu — uveď ho mezi
vynechanými i s chybou, kterou nástroj vrátil.
Zadání sestav podle šablony ve Formátu výstupu a dosaď do něj rozvinuté absolutní cesty — ke složce paměti i ke konvenci. Placeholder ani proměnná nemá v odeslaném zadání co dělat; agent si je nedopočítá.
Na memory-conventions.md uvnitř pluginu navíc trénovaný agent dosáhnout
nemusí — jeho tools bývají užší než tvoje a plugin leží mimo jeho projekt.
Nedosáhne-li, vlož mu podstatné části rovnou do zadání: tvar indexu, frontmatter
tematického souboru, doklad původu, řádky Why a How to apply
a tabulku hodnot type. Právě proto sis konvenci přečetl už v kroku 1.
Vynecháš-li z výčtu cokoli, co kontrolní seznam konvence vymáhá, označí krok 4
za nesoulad každý soubor, který agent zapsal.
Nevíš-li jistě, vkládej vždy. Pár set tokenů navíc je levnější než agent, který si tvar paměti domyslí — ten pak vypadá, že si zapsal správně, a nikdo to neodhalí, dokud paměť někdo nečte ručně.
4. Ověření zápisu
Po doběhnutí si přečti složku paměti každého agenta a porovnej ji s tím, co agent hlásí. Agentovo tvrzení, že si něco zapsal, není důkaz — a neprovedený zápis vypadá v reportu úplně stejně jako provedený.
Ověřuj podle hlášené operace — u smazaného záznamu jsou existující soubor a odkaz v indexu příznakem selhání, ne pořádku, takže paušální kontrola by správně provedenou konsolidaci označila za chybu a neprovedenou pustila dál:
založeno/upraveno→ soubor existuje, nese to, co agent tvrdí,MEMORY.mdna něj odkazuje, a záznam neduplikuje nic, co ve snímku z kroku 2 už bylo;smazáno→ soubor zmizel (nebo je přepsaný na platný, neměl-li agent čím mazat) a jeho řádek zmizel zMEMORY.md. Osiřelý řádek v indexu je nesoulad stejně jako neprovedené smazání.
U všech založených a upravených souborů navíc ověř tvar podle kontrolního
seznamu v závěru memory-conventions.md — frontmatter, doklad původu, řádky
Why a How to apply, háček říkající kdy soubor otevřít. Bez téhle
kontroly projde nekonformní záznam jako v pořádku a nikdo to nezjistí, protože
paměť nikdo netestuje.
Jde-li o první trénink, složka ani index předtím neexistovaly — to není nesoulad, ale výchozí stav. Nesoulad je až index, který nový soubor nezmiňuje.
Nesoulad neopravuj — zapiš ho do reportu. Zápis patří agentovi.
5. Report
Shrň výsledek podle šablony ve Formátu výstupu. Uveď i agenty, které jsi vynechal, i s důvodem — nenatrénovaný agent je informace, ne mlčení.
Formát výstupu
Zadání pro trénovaného agenta
Nastuduj tento vstup a zapiš si z něj do své vlastní paměti to, co se týká
tvé role.
Vstup: <cesta, odkaz, nebo celý obsah, pokud na něj trénovaný agent nedosáhne>
Postupuj takto:
1. Přečti vstup celý. Je-li to review/retry smyčka, najdi v ní **obojí**: co
review nalezlo (konkrétní chyba) a jak se to opravilo.
2. Projdi svou stávající paměť ve složce <cesta ke složce paměti> — MEMORY.md
i tematické soubory, kterých se téma dotýká. Neexistuje-li složka nebo
MEMORY.md, je tohle tvůj první trénink: založ index podle konvencí.
3. **Zobecni, nepřepisuj.** Z konkrétního nálezu odvoď pravidlo platné pro
příště: co se pokazilo → podle čeho to poznat dřív → co udělat místo toho.
Zapiš to pravidlo, ne převyprávění kola review; doklad původu (např. „PR
#74, kolo 3") u něj nech, aby šlo dohledat, odkud pravidlo pochází. Zapiš
si jen to, co se týká tvé role — ne otevřené otázky, ne to, co zjistíš
přečtením kódu. Pravidlo nemusí být rozhodnutí (`decision`): stejně tak
může jít o návyk, který se v projektu osvědčil (`convention`), nebo past,
které se má agent příště vyhnout (`pitfall`).
4. Existující záznam raději zpřesni než zdvojuj; co tenhle vstup vyvrací,
oprav nebo smaž včetně řádku v indexu. Nemáš-li čím soubor smazat, přepiš
ho na platný a odeber aspoň jeho řádek z indexu.
5. Drž tvar předepsaný v <rozvinutá cesta ke konvenci, nebo její podstatné
části vložené sem>: MEMORY.md je index s háčky, detail patří do tematických
souborů s frontmatterem name/description/metadata.type a s řádky Why
a How to apply.
Do volné části svého reportu vlož seznam dotčených souborů, jeden na řádek
a přesně v tomhle tvaru:
<cesta> — založeno|upraveno|smazáno — <důvod>
Cestu ke složce paměti odvoď z pole memory: cílového agenta podle tabulky
v memory-conventions.md — u project je to .claude/agent-memory/<agent>/.
Report uživateli
Vstup: <co se studovalo>
<agent> — <založeno N, upraveno N, smazáno N | bez zápisu — zdůvodnění agenta>
<soubor> — <co nese>
…
Vynecháno: <agent → důvod, nebo „nic">
Neověřené tvrzení: <co agent hlásil a co jsi ve složce nenašel, nebo „žádné">
Nesoulad: <soubor → v čem se rozchází s konvencí nebo co duplikuje, nebo „žádný">
Usoudí-li agent, že se ho vstup netýká, a nezapíše nic, je to platný výsledek — uveď ho jako „bez zápisu" s jeho zdůvodněním, ne mezi vynechanými. Tichý nezápis a vědomé rozhodnutí nezapisovat se v reportu nesmí splynout.
Zásady
- Zápis patří agentovi, ne tobě. Do paměti nezapisuješ ani ji neopravuješ —
právo k ní plyne z jeho
memory:a mimo jeho běh neplatí. Tvoje role je vstup, cíl a ověření. - Netrénuj z domněnky. Nepřečtený vstup, odvozený obsah ani „nejspíš tam bylo“ nestačí. Špatný záznam přežije v paměti déle než chyba v kódu, protože ho nikdo netestuje.
- Definice agenta se tímhle skillem nemění. Chybějící
memory:, úzkétoolsi jakákoli jiná úprava frontmatteru jsou práce prowrite-agent, který jde přes review. - Paměť je rozpočet, ne archiv. Načítá se agentovi při každém spuštění, takže každý nadbytečný záznam se platí pořád. Konsolidace není úklid navíc, je součást zápisu.