Ship It With AI Mihai Cvasnievschi

Bucla în șase faze

9 min de citit

La finalul capitolului poți trece un feature prin Research, Plan, Execute și Ship și știi care gate-uri sunt ale tale.

TL;DR


Ce este bucla în șase faze?

Fiecare fază produce un artefact și se termină la un gate.

Cele șase faze sunt Research, Plan, Execute, Review, Verify și Ship. Fiecare fază e un skill - un set împachetat de instrucțiuni pe care agentul îl încarcă atunci când faza e activă - cu un input clar, un output clar și un hand-off clar către faza următoare. Superpowers e o implementare; Spec Kit de la GitHub, framework-urile BMAD și colecțiile de skill-uri construite de echipe se sprijină pe aceeași buclă.

Bucla în șase faze, cu rutele de eșec înapoi la Plan 1Research 2Plan 3Execute 4Review 5Verify 6Ship plan eșuat? replanifici verify picat? înapoi la plan
Figura: Bucla în șase faze. Cele mai multe eșecuri se întorc la Plan, nu la Research.
Faza Artefactul Gate-ul uman Eșecul prins
Research Nota de research (2-4 pagini) Verificare de plauzibilitate pe domeniu Context lipsă
Plan Plan de task-uri la nivel de fișier Review de scop și ordine Descompunere proastă
Execute Diff + rapoarte per task Niciunul sau lejer Drift de implementare
Review Rapoarte de conformitate cu spec-ul + calitate Review de senior Cod greșit sau slab
Verify Dovezi din teste (failing -> passing) Review de QA sau de owner Eșec comportamental
Ship PR cu lanțul de dovezi Procesul normal de PR Încălcare de proces

Bucla se sprijină pe un rezultat așteptat bine definit. Agentul poate construi aproape orice îi descrii, dar nu poate ști la care lucru te-ai referit. Research scoate la suprafață ce nu e încă hotărât, tu tranșezi, planul transformă rezultatul stabilit în verificări, iar Verify măsoară ce s-a construit față de el. Sari peste asta și „gata” e orice a decis agentul.


Feature-ul

Iată un feature urmărit prin toate fazele. E mic: adaugă un câmp priority pe recordul Wire, într-un serviciu bancar reglementat.

Priority e una dintre valorile low / normal / high / urgent, are default normal, iar flag-ul urgent declanșează un queue separat de compliance review.


Research

Research produce o notă, nu cod - iar întrebările deschise le tranșezi tu.

I-am cerut agentului să citească codebase-ul și să scrie o notă de research. A numit patru fișiere pe care nu le-aș fi găsit nici într-o oră de grep:

A ridicat și o întrebare deschisă: priority să fie enum sau text liber? Spec-ul reglementatorului folosește text liber în unele documente și enum în altele. Am ales enum. Alegerea asta nu era un detaliu - definea ținta față de care fazele de mai târziu aveau să verifice modificarea.

O notă de research are două până la patru pagini și cuprinde:

Research e faza peste care echipele sar cel mai des, pentru că nu produce cod. Din experiența mea, e și faza cu cel mai mare levier: o notă proastă garantează un plan prost, iar una bună ancorează planul în codul real, nu în prima ipoteză a agentului.

Dacă task-ul e în afara domeniului tău, începe cu un blind spot pass: cere-i agentului să te ajute să-ți găsești unknown unknowns și spune-i pe față ce nu știi. Își calibrează răspunsul după expertiza pe care o deduce din vocabularul tău, așa că o fluență de fațadă îi ține presupunerile ascunse.

Pune nota în commit, alături de modificare. Șase luni mai târziu, când cineva se întreabă de ce e structurat codul așa, răspunsul e în repository.


Plan

Planul e gate-ul unde contezi cel mai mult.

Agentul a transformat nota într-un plan de șase task-uri:

  1. Adaugă coloana în baza de date, cu default.
  2. Actualizează clasa recordului Wire.
  3. Actualizează serviciul wire-builder.
  4. Actualizează contractul de API.
  5. Actualizează logica de rutare pe compliance ca să citească noul câmp.
  6. Actualizează emitter-ul de audit log.

Fiecare task atingea un fișier sau o pereche de fișiere. Task-ul cinci depindea de schimbarea de contract din task-ul patru; ordinea era corectă, iar agentul marcase dependența. Aprobat.

Un plan pe care îl poți aproba are trei proprietăți:

Apoi îl citești tu. Respingi task-urile prea vagi, prea mari sau prost ordonate. Adaugi ce a ratat planul, scoți ce iese din scop. Abia apoi începe Execute.

Review-ul de plan ia câteva minute. Te scutește de o după-amiază întreagă atunci când planul era greșit și ai fi aflat abia în Execute - de unde e mult mai greu de dat înapoi.


Execute

Un subagent per task, un singur scriitor per fișier.

Șase subagenți au rulat în paralel, câte unul per task, fiecare constrâns la fișierul lui. S-au întors în mai puțin de trei minute. Cinci task-uri au avut teste care treceau din prima.

Al șaselea (emitter-ul de audit log) avea și el un test care trecea, dar testul era greșit: verifica vechiul format de log. Verde - și greșit. Capitolul 5 arată cum a fost prins.

Fiecare subagent lucrează în propriul context izolat: citește doar ce are nevoie, face modificarea, rulează verificarea din plan și raportează înapoi. Raționamentul confuz din task-ul unu nu poluează task-ul patru.

Izolarea nu e o soluție-minune. Regulile care o țin să funcționeze:

Când un task eșuează, orchestratorul reîncearcă, ocolește eșecul sau se oprește și te întreabă. Cele mai multe eșecuri sunt recuperabile la a doua încercare. Un eșec blocant înseamnă că planul trebuie revizuit, iar bucla se întoarce la Plan.


Review și Verify

Review verifică diff-ul față de spec; Verify verifică comportamentul față de rezultatul așteptat.

La feature-ul wire, Review a prins testul de audit log și o migrație fără direcția de down, iar Verify a rulat suita completă plus un smoke test pe staging. Capitolul 5 se ocupă de ambele faze: cum citești un diff scris de agent și de ce o suită verde scrisă de agent e un indiciu, nu o dovadă.


Ship

Ship e un pull request obișnuit. Nu există o bandă specială pentru AI.

Agentul face commit cu un mesaj structurat, dă push pe branch și deschide un pull request a cărui descriere spune ce s-a schimbat, de ce, cum s-a verificat, ce riscuri rămân și cine e etichetat la review.

La feature-ul wire, PR-ul a venit cu nota de research, planul, rapoartele per task, ambele review-uri și dovezile din teste atașate. Un reviewer senior a petrecut unsprezece minute pe el și a pus o singură întrebare: ar trebui ca flag-ul urgent să fie vizibil în dashboard-ul de metrici? Nu mă gândisem la asta. Aprobat, merged.

PR-ul ăsta e exact artefactul pe care echipa știe deja să-l revizuiască. Agentul nu îți înlocuiește procesul de livrare; îl alimentează cu muncă mai bine formulată.


Cât costă în timp

Într-un workflow sănătos, gate-urile umane sunt limitatorul de ritm, nu agentul.

Pe un feature mic, bucla completă ia douăzeci-treizeci de minute de ceas; pe unul mediu, o oră; pe unul mare, câteva ore - muncă ce ar fi luat zile fără agent. Agentul rulează poate o treime până la jumătate din timpul ăsta; restul ești tu, citind nota, revizuind planul și aprobând diff-ul.

Feature-ul wire a luat nouăzeci de minute, de la „hai să adăugăm un câmp de prioritate” la cod în merge. Diferența o face contextul reglementat: o suită de 3.400 de teste, un smoke test pe staging și un diff de contract pentru reglementator. Mic ca scop nu înseamnă mic ca ceremonie.

Dacă un feature mic îți ia trei ore, gate-urile tale sunt supra-inginerite sau le faci într-un du-te-vino lent, nu într-o singură trecere concentrată. Agentul nu te salvează de propria cultură a ședințelor.


Când rulezi mai puțin din buclă

Sari peste o fază doar dacă poți numi ce îi face deja treaba.

Testul din Capitolul 3 îți spune când merită bucla în sine; în interiorul buclei se aplică aceeași contabilitate.

O echipă pe care am urmărit-o a lucrat cea mai mare parte a unui an cu ceea ce părea jumătate de buclă: Research-ul era un fir de comentarii, planul era trei bullet-uri în PR. A funcționat pentru că funcțiile se mutaseră în pereții echipei - o echipă mică și senioră, care își construise singură codebase-ul, o suită de CI strictă și o cultură de PR serioasă. Cele șase faze sunt funcții care trebuie să se întâmple undeva. Dacă nu poți spune unde, faza rămâne.


Când se strică


De făcut luni


Mai departe