8.3 KiB
Orchestrare cu subagenti: context mic, misiuni descompuse
Regula (valabila in toate proiectele ROA/VFP): un singur subagent care duce o misiune lunga (iteratii de teste, investigatii, mai multe sarcini inlantuite) acumuleaza context urias — calitate degradata, cost mare. Nu se lucreaza asa.
Predarea contextului la prag (REGULA ZERO, declansatoare, procedura, ce intra in handoff) e
regula globala din ~/.claude/CLAUDE.md, se aplica identic sesiunii principale si subagentilor.
Agenti alternativi (opencode, DeepSeek V4.1 Flash), cu mesaje trimise in timpul lucrului:
opencode_agenti_orchestrare.md.
Cum se lucreaza
- Sesiunea principala (sau un agent primar) e ORCHESTRATOR: imparte planul pe sarcini independente (un test, un audit, un scenariu = o sarcina), monitorizeaza, transmite constatarile intre agenti, verifica rezultatele.
- Fiecare sarcina merge la un SUBAGENT PROASPAT cu prompt autosuficient: context complet in prompt + trimitere la un fisier de handoff, nu context acumulat in conversatie.
- HANDOFF compact pe disc (docs\handoff_*.md, stil telegrafic): inventar livrabile, stare, ce ramane, detaliile ne-evidente pe care un agent proaspat nu le-ar putea reconstitui usor. Se actualizeaza la fiecare predare de stafeta.
- PRAG: maxim ~200-250k tokens per subagent. Orchestratorul urmareste dimensiunea contextului; la atingerea pragului: cere handoff, inchide agentul, respawneaza unul proaspat pe sarcina urmatoare.
- Sarcina se taie ca sa incapa in prag - de orchestrator, dinainte. Clauza "la ~200k
opreste-te si preda" din prompt NU se declanseaza singura: subagentul nu isi vede consumul.
Constatat pe plan #12b, 14.09.2026: toti subagentii au terminat la 226-247k, unul la ~395k,
altul la ~300k. Orchestratorul dimensioneaza fiecare sarcina sa incapa in ~150k: o story cu
proba headless VFP se imparte (proba scrisa si rulata pe codul vechi / implementare +
rerulare / mutatii + e2e + inchidere), nu se da intreaga. Dupa fiecare notificare
orchestratorul citeste
subagent_tokens; peste 250k inseamna sarcina prea mare - urmatoarele se taie mai mic, iar un agent inca viu peste prag primeste oprire + handoff. - Sarcinile independente ruleaza in PARALEL (lane-uri), ex. audit read-only + editare teste.
- Orchestratorul da utilizatorului UPDATE-URI SCURTE de progres, regulat (monitor pe artefacte: loguri/fisiere/screenshots; o propozitie-doua la fiecare schimbare relevanta, fara naratiune la evenimente fara continut).
- Orchestratorul MONITORIZEAZA ACTIV subagentii sa nu se blocheze: monitor persistent pe artefactele lor + verificare la lipsa de progres (~10 min fara schimbare = suspect): procese agatate (vfp9 zombi, dialoguri modale), semafoare orfane, timeout-uri de tool (120s implicit) care omoara procese. La blocaj: diagnostic direct (procese, fisiere, loguri), mesaj de deblocare cu constatarea concreta, si abia apoi restart daca e cazul.
- Modele: subagentii care DOAR ruleaza/editeaza teste si alte sarcini de volum/rutina -> Sonnet; ORCHESTRATORUL subagentilor (cel care imparte, monitorizeaza, deblocheaza, decide) -> Opus (sau sesiunea principala). Commit doar dupa review-ul diff-ului de catre om (vezi reguli_lucru.md).
- Un agent tinut peste prag costa scump: doua cazuri platite, aceeasi cauza (
s5-nivel2533k,s2d-modifica-gestiuni434k tokens) — predarea la timp e aproape gratuita, raportul e oricum deja scris.
Verificarea a ce se intoarce
Pentru executie delegarea merge, pentru concluzii nu:
- citeste contractul functiei apelate, nu-l presupune. Un raport care descrie corect
structura codului poate gresi sensul: ex.
goExecutor.oExecuteintoarce succes/insucces (CT_SUCCES/CT_INSUCCES), NU numarul de randuri — o gardaIf lnSucces > 0citita ca "are randuri" a produs un bug inexistent, raportat ca blocant. Deschide functia. - fix ingust, nu supra-constructie. Cand premisa se corecteaza, corectia se restrange: mecanismele noi introduse "ca sa fie sigur" diverg de la codul-sablon si blocheaza refolosirea lui in alta parte.
- "zero cazuri in date" nu dovedeste nimic pe scheme cu date de test; raspunsul vine din cod. Si invers: o potrivire de cifre pe 1-2 documente nu e o regula.
- cere raportul sa separe "testat" de "analizat static", si ce n-a putut fi acoperit. Un agent care nu e intrebat explicit va prezenta amandoua la fel.
- spune-i ca poate infirma briefingul. Altfel implementeaza corectia ceruta chiar cand a descoperit ca nu e nevoie de ea.
Semne ca ai gresit impartirea
- Acelasi agent primeste "inca o sarcina" a treia oara -> trebuia agent nou + handoff.
- Agentul re-descopera capcane deja documentate -> handoff-ul/docs-ul e incomplet; completeaza-l, nu repeta investigatia.
- Orchestratorul face el insusi munca de volum -> deleaga si pastreaza-si contextul pentru decizii, verificari si deblocari.
Disciplina de context a ORCHESTRATORULUI
Pragul de ~200-250k e pentru subagenti, dar orchestratorul se umple la fel de repede daca isi lasa in sesiune munca de CITIT (masurat: o runda de implementare + 4 rulari de teste a dus sesiunea principala la ~570k desi tot codul fusese scris de subagenti). Principalii consumatori: citirea rezultatelor de test dupa fiecare rulare (cu tot cu liniile "OK"), citirea codului pentru diagnostic, fixuri aplicate direct in loc de delegate.
- Nu citi log-uri brute. Scripturile de raportare afiseaza DOAR esecurile plus un total
("22 OK, 3 FAIL: <nume + linia de esec>"). Tabelul complet se citeste o singura data, la
baseline - nu dupa fiecare rulare. Pentru suitele VFP exista deja:
COMUN\utile\Teste\raport_teste.ps1 -Dir <folder> [-Tot] [-Baseline <fisier>]- fara-Totafiseaza doar esecurile, iar cu-Baselinele marcheaza[preexistent]vs[NOU - REGRESIE]. - Nu citi cod ca sa diagnostichezi. Deleaga cu "adu-mi dovada, nu fisierul": agentul intoarce cauza + linia + citatul minim. Verifici afirmatia, nu o redescoperi.
- Verifica prin assert, nu prin citire. Daca vrei sa stii ca ceva e adevarat, cere o comanda care intoarce da/nu, nu continutul din care ai deduce singur.
- Nu aplica fixuri direct decat sub ~5 linii si doar daca ai deja contextul in sesiune.
- Prag si pe orchestrator: la ~50% din fereastra, scrie handoff-ul si reia orchestrarea
dintr-o sesiune noua. Handoff-ul e deja pe disc - exact pentru asta exista. Vezi REGULA ZERO din
~/.claude/CLAUDE.md: obligatia e aceeasi ca pentru subagenti, fara portita pentru "eu doar coordonez".
Model de lucru: backlog de story-uri mici, context mic per story
Impartirea pe "lane-uri" mari (o clasa, un modul) produce subagenti cu context mare si serializare pe fisier. Alternativa mai ieftina si mai robusta: backlog de story-uri mici, fiecare rezolvabila cu context mic, rulate in bucla de agenti PROASPETI.
Doua fisiere pe disc tin toata starea:
docs/handoff_<subiect>.md- contextul stabil: reguli de editare, cai, ancore verificate, capcane confirmate, decizii luate. Il citeste fiecare agent; se actualizeaza rar.docs/backlog_<subiect>.md- starea vie: story-uri cu ID, criteriu de acceptare VERIFICABIL, fisiere atinse, stare (todo/in lucru/gata/blocat de #N).
Bucla:
- orchestratorul ia primul story
todoneblocat; - spawneaza un agent proaspat cu prompt = trimitere la handoff + textul story-ului + criteriul de acceptare. Nimic altceva - fara istoric, fara rapoartele celorlalti agenti;
- agentul modifica, ruleaza verificarea din criteriu si raporteaza verdict + ce a schimbat + ce a descoperit neasteptat, atat;
- orchestratorul marcheaza story-ul in backlog si trece la urmatorul.
O story buna: are criteriu de acceptare care se poate RULA (un test, un grep, o comanda da/nu); atinge un singur fisier sau o singura zona (altfel story-urile se serializeaza intre ele); incape in 15-20 de linii de descriere; nu cere citirea intregului fisier ca sa fie inteleasa.
Sablon:
### S7 - garda pe randul protejat in recalcule
Fisiere: COMUN\clase\<x>.vc2 (do_executa, recalc_tva_document)
Blocat de: S4
De facut: <2-4 propozitii>
Acceptare: test_<y>.ps1 trece 12/12 SI `rand_protejat()` nu mai apare in nicio clauza Where
Stare: todo
Cand un story pica de doua ori la rand, nu-l reincerca a treia oara cu acelasi prompt: semnul e ca descrierea sau criteriul e gresit, nu executia. Rescrie story-ul (mai mic, sau cu criteriul corectat) inainte de a mai cheltui un agent.