598 lines
31 KiB
YAML
598 lines
31 KiB
YAML
name: roa-fix
|
|
description: |
|
|
Pilot ROA: plan (Opus, cu auto-review eng inglobat) -> aprobare plan -> implementare
|
|
(Pi/DeepSeek, write-back+test permise dupa -DryRun) -> verificare mecanica
|
|
(cp1252/CRLF/txt2vcx -DryRun) cu 1 reincercare si escaladare la Opus -> review
|
|
(Pi/DeepSeek, cu acces la cod) cu escaladare la Opus pe verdict BLOCANT -> re-review
|
|
dupa escaladare (verdict vizibil, fara bucla infinita) -> control fisiere suspecte ->
|
|
propunere de documentare (nvatare, neaplicata) -> diff in docs/ -> aprobare finala
|
|
(arata si propunerea de doc) -> aplicare doc aprobat.
|
|
Commit-ul (git/svn) ramane manual, in afara workflow-ului.
|
|
|
|
worktree:
|
|
enabled: false
|
|
provider: claude
|
|
interactive: true
|
|
|
|
nodes:
|
|
# ============================================================
|
|
# a. PLAN (Opus) - citeste regulile, localizeaza codul, confirma headless
|
|
# presupunerile critice, scrie planul, se auto-revizuieste (eng review inglobat)
|
|
# ============================================================
|
|
- id: plan
|
|
model: opus
|
|
idle_timeout: 900000
|
|
skills: [roa-vfp-text-edit, roa-vfp-headless-test, roa-vfp-null-guards, roa-vfp-go-recno, roa-oracle-sqlexec-no-data]
|
|
prompt: |
|
|
Sarcina ROA de planificat: $ARGUMENTS
|
|
|
|
Esti agentul de PLANIFICARE (nu implementezi, doar citesti, probezi headless si scrii
|
|
planul).
|
|
|
|
## Pasi obligatorii
|
|
1. Citeste `CLAUDE.md` (radacina proiectului) - context, layout, reguli de versionare.
|
|
2. Citeste `COMUN\docs\reguli_lucru.md` integral, in special punctul 7 (rutare pe zona
|
|
atinsa) - identifica ce skill-uri/docs sunt obligatorii pentru sarcina de mai sus.
|
|
Citeste INTEGRAL (nu doar titlul) fiecare doc de conventie din zona atinsa pe care
|
|
punctul 7 il indica (ex. conventii `oExecute`/`goExecutor`, ALTER TABLE, NULL, GO/Recno).
|
|
In plan, la fiecare decizie relevanta, citeaza regula aplicabila `fisier:linie`. Daca
|
|
solutia aleasa CONTRAZICE un doc de conventie, scrie explicit de ce (nu il ignora tacut).
|
|
3. Localizeaza codul relevant. **Niciodata `grep -r`/`grep -rn` pe tot arborele
|
|
`D:\ROA\ROACONT` fara scop** (masurat: un singur `grep -rn` nescopat in aceasta faza a
|
|
costat 120s intr-o rulare anterioara, cel mai lung apel din nodul `plan`). Foloseste
|
|
`rg` cu excluderi (`rg --glob '!.svn' --glob '!*.exe' --glob '!*.fxp' --glob '!*.vct'
|
|
--glob '!*.sct' <expresie>`) sau scopeaza pe director/extensie. Pentru cod in
|
|
`.vc2`/`.sc2`, foloseste `vfp_symbols.ps1` (nu Grep simplu - nu poate spune carei
|
|
clase/metode apartine un hit):
|
|
```
|
|
$s = 'D:\ROA\UTIL\foxbin2prg\vfp_symbols.ps1'
|
|
$c = @('-CacheRoot', 'D:\ROA\ROACONT', '-ProjectRoot', 'D:\ROA\ROACONT', '-IndexFile', 'D:\ROA\_vfp_textcache\roacont\_symbols.tsv')
|
|
powershell -ExecutionPolicy Bypass -File $s @c -Grep '<expresie>' -CodeOnly
|
|
powershell -ExecutionPolicy Bypass -File $s @c -Find '<nume>'
|
|
```
|
|
Ruleaza intai `git_sync.ps1` daca textul `.??2` pare vechi fata de binar.
|
|
4. **Proba headless obligatorie pentru orice presupunere critica de runtime.** Daca planul
|
|
se bazeaza pe un comportament neverificat (ex. "ALTER TABLE e permis pe acest cursor",
|
|
"acest camp Oracle nu poate fi NULL", "GO pe acest Recno e stabil intre requery-uri"),
|
|
scrie si ruleaza O PROBA MICA SI RAPIDA headless (`.prg` de test, in scratchpad, sters
|
|
dupa) care demonstreaza comportamentul PE CALEA REALA (nu pe un cursor izolat de test)
|
|
inainte de a scrie planul pe baza acelei presupuneri. Motiv: intr-o rulare anterioara
|
|
(f50d54a2), presupunerea "ALTER TABLE permis pe cursor rematerializat" nu a fost
|
|
verificata pe lantul real `oExecute` -> a picat cu eroarea 1115, iar reparatia a costat
|
|
42 min de escaladare Opus. Include in plan, la sectiunea "Verificari", dovada probei
|
|
(comanda + rezultat pe scurt).
|
|
5. Scrie planul in `docs/plan_<slug>.md` (`<slug>` = un nume scurt kebab-case derivat din
|
|
sarcina). Planul e fisier-cu-fisier, cu `fisier:linie` exact pentru fiecare schimbare,
|
|
modificari MINIME (doar ce s-a cerut, nimic in plus). Include sectiune "Verificari" cu
|
|
ce trebuie sa treaca (cens octeti, CRLF, txt2vcx -DryRun, teste, proba headless de la
|
|
pasul 4) si sectiune "Conventii citate" cu regulile de la pasul 2.
|
|
6. Clasifica sarcina pentru nodul urmator de review (`plan_review`), campul `tip_sarcina`:
|
|
`"ui"` daca sarcina atinge un formular/grid/UI (colorari, layout, interactiune),
|
|
`"mare"` daca schimba scope sau atinge mai multe module/zone, `"ui_mare"` daca ambele,
|
|
altfel `"simplu"`. NU faci tu auto-review-ul (asta e in nodul separat `plan_review`,
|
|
care ruleaza skill-urile gstack reale, nu un checklist inglobat aici).
|
|
7. NU edita niciun fisier de cod in acest pas (doar proba headless de la pasul 4, care se
|
|
sterge dupa).
|
|
|
|
La final raspunde STRICT cu campurile cerute de output_format (plan_file = calea relativa
|
|
a fisierului de plan, ex. `docs/plan_exemplu.md`).
|
|
output_format:
|
|
type: object
|
|
properties:
|
|
plan_file: { type: string }
|
|
summary: { type: string }
|
|
tip_sarcina: { type: string, enum: [simplu, ui, mare, ui_mare] }
|
|
required: [plan_file, tip_sarcina]
|
|
|
|
# ============================================================
|
|
# a2. PLAN_REVIEW (Opus) - ruleaza REAL skill-urile gstack de review pe plan,
|
|
# headless (auto-decide pe AskUserQuestion, nu exista utilizator).
|
|
# Verificat empiric 25.09 (scratchpad final_wf/smoke_repo): nod cu
|
|
# skills: [plan-eng-review], context: fresh, ruleaza complet in ~78s,
|
|
# varf context 76k, 0 blocaje pe cele 7 AskUserQuestion intalnite -
|
|
# modelul a auto-decis pe fiecare, conform instructiunii din prompt.
|
|
# ============================================================
|
|
- id: plan_review
|
|
depends_on: [plan]
|
|
model: opus
|
|
context: fresh
|
|
idle_timeout: 900000
|
|
skills: [plan-eng-review, plan-design-review, plan-ceo-review]
|
|
prompt: |
|
|
Ruleaza skill-ul `plan-eng-review` REAL (tool-ul Skill, nu un checklist inglobat) pe
|
|
fisierul de plan $plan.output.plan_file.
|
|
|
|
tip_sarcina din nodul anterior: $plan.output.tip_sarcina
|
|
- Daca tip_sarcina e "ui" sau "ui_mare", ruleaza SI skill-ul `plan-design-review` pe
|
|
acelasi fisier.
|
|
- Daca tip_sarcina e "mare" sau "ui_mare", ruleaza SI skill-ul `plan-ceo-review`.
|
|
- Daca tip_sarcina e "simplu", ruleaza doar `plan-eng-review`.
|
|
|
|
Nu exista utilizator uman disponibil in acest nod. Daca un skill invoca
|
|
`AskUserQuestion`, alege TU insuti, imediat, optiunea recomandata (nu astepta raspuns
|
|
uman, nu te opri BLOCKED) si continua.
|
|
|
|
Scrie constatarile si deciziile fiecarui skill rulat intr-o sectiune noua in
|
|
$plan.output.plan_file: `## Review eng` (obligatoriu), `## Review design` (doar daca ai
|
|
rulat plan-design-review), `## Review CEO` (doar daca ai rulat plan-ceo-review).
|
|
|
|
Raspunde STRICT conform output_format (summary = 2-3 randuri cu cele mai importante
|
|
decizii, din toate sectiunile de review scrise).
|
|
output_format:
|
|
type: object
|
|
properties:
|
|
summary: { type: string }
|
|
required: [summary]
|
|
|
|
# ============================================================
|
|
# b. APROBARE PLAN (Marius)
|
|
# ============================================================
|
|
- id: aprobare_plan
|
|
depends_on: [plan_review]
|
|
approval:
|
|
message: |
|
|
Plan scris in $plan.output.plan_file (tip_sarcina: $plan.output.tip_sarcina)
|
|
$plan.output.summary
|
|
|
|
Review (skill-uri gstack reale, deciziile sunt deja scrise in plan la sectiunile
|
|
"Review eng"/"Review design"/"Review CEO"):
|
|
$plan_review.output.summary
|
|
|
|
Aprobi implementarea conform acestui plan?
|
|
|
|
# ============================================================
|
|
# c. IMPLEMENT (Pi / DeepSeek V4.1 Flash, prin abonamentul opencode go)
|
|
# ============================================================
|
|
- id: implement
|
|
depends_on: [aprobare_plan]
|
|
provider: pi
|
|
model: opencode-go/deepseek-v4.1-flash
|
|
idle_timeout: 900000
|
|
allowed_tools: [read, bash, edit, write, grep, find, ls]
|
|
skills: [roa-vfp-text-edit, roa-vfp-headless-test, roa-vfp-null-guards, roa-vfp-go-recno, roa-oracle-sqlexec-no-data]
|
|
prompt: |
|
|
Esti un agent EXECUTANT pe o singura sarcina, intr-un proiect ROA (Visual FoxPro 9 + Oracle).
|
|
|
|
## Cautare rapida (obligatorie)
|
|
Niciodata `grep -r` pe tot arborele `D:\ROA\ROACONT` (10+ minute). In ordine:
|
|
1. Unealta `grep`/`find` (rapide, bazate pe ripgrep) sau `rg` direct din bash - exclude
|
|
`.svn` si binarele: `rg --glob '!.svn' --glob '!*.exe' --glob '!*.fxp' --glob '!*.vct' --glob '!*.sct' <expresie>`.
|
|
2. Pentru cod VFP text (`.vc2`/`.sc2`), `vfp_symbols.ps1` - Grep simplu nu spune carei
|
|
clase/metode apartine un hit:
|
|
```
|
|
$s = 'D:\ROA\UTIL\foxbin2prg\vfp_symbols.ps1'
|
|
$c = @('-CacheRoot', 'D:\ROA\ROACONT', '-ProjectRoot', 'D:\ROA\ROACONT', '-IndexFile', 'D:\ROA\_vfp_textcache\roacont\_symbols.tsv')
|
|
powershell -ExecutionPolicy Bypass -File $s @c -Grep '<expresie>' -CodeOnly # hits etichetate clasa.metoda
|
|
powershell -ExecutionPolicy Bypass -File $s @c -Where '<fisier>.vc2:<linie>' # cine detine linia
|
|
powershell -ExecutionPolicy Bypass -File $s @c -Find '<nume>' # unde e DEFINIT
|
|
powershell -ExecutionPolicy Bypass -File $s @c -Class '<nume clasa>' # lant de mostenire + metode
|
|
```
|
|
3. ORICE comanda bash (nu doar VFP headless) primeste un timeout explicit (`timeout 120
|
|
...` sau echivalent) si nu se ruleaza interactiv - un dialog modal sau un proces
|
|
agatat blocheaza nodul pana la idle_timeout, nu doar comanda. Niciodata doua sau mai
|
|
multe comenzi bash paralele care se astepta una pe alta (blocant) - un nod din acest
|
|
workflow (`review2`) a atins idle_timeout de 15 min exact asa (25.09, run 3c029727).
|
|
|
|
## Rol
|
|
- Aplici STRICT planul din $plan.output.plan_file, nimic mai mult.
|
|
- Inainte de orice editare, respecta `COMUN\docs\reguli_lucru.md` si punctul 7 de acolo
|
|
pentru zona atinsa (byte-safe pe `.vc2`/`.sc2`, CRLF, comentarii de maxim o linie).
|
|
|
|
## Write-back si teste (permise in acest nod)
|
|
- Dupa editarea `.vc2`/`.sc2`, ruleaza intai `txt2vcx.ps1 -DryRun` (fidelity-check).
|
|
Daca trece, poti rula write-back-ul REAL (`txt2vcx.ps1` FARA `-DryRun`) si testul
|
|
headless din plan, imediat, in acest nod - conform `CLAUDE.md`
|
|
("Write-back-ul cu txt2vcx.ps1 si testele se fac imediat dupa editare; doar commit-ul
|
|
asteapta aprobarea"). Nu sari peste `-DryRun`.
|
|
- Probele, backup-urile si scripturile ajutatoare temporare (`_probe*`, `*.bak`,
|
|
`_patch*`, loguri de proba) se scriu STRICT intr-un director temporar, NU in repo:
|
|
`%TEMP%\archon_roa\<run-id>\` (foloseste variabila de mediu/`$ARTIFACTS_DIR` daca e
|
|
disponibila, altfel `%TEMP%\archon_roa\manual\`). Le stergi la final daca nu mai sunt
|
|
necesare pentru dovada in plan.
|
|
|
|
## Interzis
|
|
- commit git sau svn; `svn update`/`revert`; `git checkout`/`reset` pe fisiere neatinse.
|
|
- editarea binarelor VFP (`.vcx .vct .scx .sct .frx .mnx .dbf .pjx`) sau a fisierelor compilate.
|
|
- `sed -i`, scrieri cu `python` (stub Windows, nu scrie nimic), refactorizari din oficiu.
|
|
- modificari pe Oracle de productie; pe productie doar SELECT.
|
|
- fisiere de proba/backup/scratch lasate in `D:\ROA\ROACONT` sau `COMUN\` (vezi mai sus).
|
|
|
|
## Editare
|
|
- Modificari minime, doar ce e in plan. Refolosesti ce exista.
|
|
- `.vc2/.sc2/.prg`: strict ASCII (fara diacritice) in codul scris de tine.
|
|
- Pastrezi CRLF pe tot fisierul editat.
|
|
- Comentarii: maxim o linie, doar unde codul nu se citeste singur.
|
|
|
|
Daca planul e neclar sau cere o decizie, opreste-te si scrie problema in raspunsul tau
|
|
(acest workflow nu are un pas separat de intrebari - descrie exact ce e blocat).
|
|
|
|
Plan: $plan.output.plan_file (citeste-l de pe disc pentru detalii complete).
|
|
|
|
# ============================================================
|
|
# d. VERIFICA (bash, 0 tokeni) - primul rand
|
|
# ============================================================
|
|
- id: verifica
|
|
depends_on: [implement]
|
|
bash: |
|
|
mkdir -p "$ARTIFACTS_DIR"
|
|
powershell -ExecutionPolicy Bypass -File D:/roa/roacont/.archon/scripts/verifica_vfp_text.ps1 -ProjectRoot D:\roa\roacont > "$ARTIFACTS_DIR/verifica_log.txt" 2>&1
|
|
RC=$?
|
|
cat "$ARTIFACTS_DIR/verifica_log.txt"
|
|
if [ $RC -eq 0 ]; then echo OK; else echo FAIL; fi
|
|
|
|
# ============================================================
|
|
# e. RETRY: implement inca o data cu eroarea, apoi re-verifica
|
|
# ============================================================
|
|
- id: implement_retry
|
|
depends_on: [verifica]
|
|
when: "$verifica.output == 'FAIL'"
|
|
provider: pi
|
|
model: opencode-go/deepseek-v4.1-flash
|
|
idle_timeout: 900000
|
|
prompt: |
|
|
Prima ta incercare de implementare a picat verificarea automata. Corecteaza STRICT
|
|
problemele de mai jos, fara sa te abati de la planul din $plan.output.plan_file si fara
|
|
sa introduci alte schimbari. Write-back real + test headless permise (vezi nodul
|
|
`implement` pentru reguli complete de write-back/probe temporare).
|
|
|
|
ORICE comanda bash primeste timeout explicit; nu lansa apeluri bash paralele blocante
|
|
(vezi nodul `implement` pentru reguli complete de cautare/write-back).
|
|
|
|
Iesirea verificarii (citeste si $ARTIFACTS_DIR/verifica_log.txt pentru detalii complete):
|
|
$verifica.output
|
|
|
|
- id: verifica2
|
|
depends_on: [implement_retry]
|
|
bash: |
|
|
powershell -ExecutionPolicy Bypass -File D:/roa/roacont/.archon/scripts/verifica_vfp_text.ps1 -ProjectRoot D:\roa\roacont > "$ARTIFACTS_DIR/verifica_log2.txt" 2>&1
|
|
RC=$?
|
|
cat "$ARTIFACTS_DIR/verifica_log2.txt"
|
|
if [ $RC -eq 0 ]; then echo OK; else echo FAIL; fi
|
|
|
|
# ============================================================
|
|
# al doilea esec -> escaladare la Opus
|
|
# ============================================================
|
|
- id: escaladare
|
|
depends_on: [verifica2]
|
|
when: "$verifica2.output == 'FAIL'"
|
|
model: opus
|
|
idle_timeout: 900000
|
|
skills: [roa-vfp-text-edit, roa-vfp-headless-test, roa-vfp-null-guards, roa-vfp-go-recno, roa-oracle-sqlexec-no-data]
|
|
prompt: |
|
|
Doua incercari de implementare (Pi/DeepSeek) au picat verificarea automata pentru
|
|
planul din $plan.output.plan_file. Repara TU direct, minim, respectand planul si
|
|
`COMUN\docs\reguli_lucru.md`. Write-back real (`txt2vcx.ps1` FARA `-DryRun`, dupa
|
|
`-DryRun` OK) si testul headless din plan sunt permise in acest nod, imediat dupa
|
|
editare. Probele/scripturile temporare merg in `%TEMP%\archon_roa\<run-id>\`, NU in repo
|
|
(vezi nodul `implement` pentru regula completa).
|
|
|
|
ORICE comanda bash primeste timeout explicit; nu lansa apeluri bash paralele blocante.
|
|
|
|
Iesirea ultimei verificari (si $ARTIFACTS_DIR/verifica_log2.txt pentru detalii complete):
|
|
$verifica2.output
|
|
|
|
Dupa ce repari, ruleaza din nou verificarea mecanica manual:
|
|
powershell -ExecutionPolicy Bypass -File D:/roa/roacont/.archon/scripts/verifica_vfp_text.ps1 -ProjectRoot D:\roa\roacont
|
|
si confirma in raspuns ca trece (exit 0).
|
|
|
|
# ============================================================
|
|
# f. REVIEW (Pi / DeepSeek, cu acces la cod)
|
|
# ============================================================
|
|
- id: review
|
|
depends_on: [verifica, verifica2, escaladare]
|
|
trigger_rule: none_failed_min_one_success
|
|
provider: pi
|
|
model: opencode-go/deepseek-v4.1-flash
|
|
context: fresh
|
|
idle_timeout: 900000
|
|
allowed_tools: [read, bash, edit, write, grep, find, ls]
|
|
skills: [roa-vfp-text-edit, roa-vfp-headless-test, roa-vfp-null-guards, roa-vfp-go-recno, roa-oracle-sqlexec-no-data]
|
|
prompt: |
|
|
Esti reviewer de cod Visual FoxPro 9 cu backend Oracle. Gaseste bug-urile reale din
|
|
diff (corectitudine, nu stil). Verifica fiecare afirmatie pe codul real inainte de
|
|
verdict - citeste fisierele schimbate, nu doar diful.
|
|
|
|
## Cautare rapida (obligatorie)
|
|
Niciodata `grep -r` pe tot arborele `D:\ROA\ROACONT`. In ordine:
|
|
1. Unealta `grep`/`find` (rapide, bazate pe ripgrep) sau `rg` direct din bash - exclude
|
|
`.svn` si binarele: `rg --glob '!.svn' --glob '!*.exe' --glob '!*.fxp' --glob '!*.vct' --glob '!*.sct' <expresie>`.
|
|
2. Pentru cod VFP text (`.vc2`/`.sc2`), `vfp_symbols.ps1`:
|
|
```
|
|
$s = 'D:\ROA\UTIL\foxbin2prg\vfp_symbols.ps1'
|
|
$c = @('-CacheRoot', 'D:\ROA\ROACONT', '-ProjectRoot', 'D:\ROA\ROACONT', '-IndexFile', 'D:\ROA\_vfp_textcache\roacont\_symbols.tsv')
|
|
powershell -ExecutionPolicy Bypass -File $s @c -Grep '<expresie>' -CodeOnly # hits etichetate clasa.metoda
|
|
powershell -ExecutionPolicy Bypass -File $s @c -Where '<fisier>.vc2:<linie>' # cine detine linia
|
|
powershell -ExecutionPolicy Bypass -File $s @c -Find '<nume>' # unde e DEFINIT
|
|
powershell -ExecutionPolicy Bypass -File $s @c -Class '<nume clasa>' # lant de mostenire + metode
|
|
```
|
|
3. ORICE comanda bash (nu doar VFP headless) primeste timeout explicit - nu rula
|
|
interactiv si nu lansa apeluri bash paralele blocante (au dus la idle_timeout de 15
|
|
min pe `review2`, 25.09, run 3c029727).
|
|
|
|
Probele tale de reproducere merg in `%TEMP%\archon_roa\<run-id>\`, NU in repo.
|
|
|
|
Ruleaza:
|
|
git diff --stat HEAD
|
|
git diff HEAD
|
|
git -C COMUN diff --stat HEAD
|
|
git -C COMUN diff HEAD
|
|
(COMUN e repo git separat; modificarile de acolo apar doar cu `git -C COMUN`.)
|
|
|
|
Planul original e in $plan.output.plan_file.
|
|
|
|
Verdict final: OK sau BLOCANT (raspunde strict conform output_format).
|
|
output_format:
|
|
type: object
|
|
properties:
|
|
verdict: { type: string, enum: [OK, BLOCANT] }
|
|
findings: { type: string }
|
|
required: [verdict, findings]
|
|
|
|
# ============================================================
|
|
# review BLOCANT -> escaladare la Opus
|
|
# ============================================================
|
|
- id: escaladare_review
|
|
depends_on: [review]
|
|
when: "$review.output.verdict == 'BLOCANT'"
|
|
model: opus
|
|
idle_timeout: 900000
|
|
skills: [roa-vfp-text-edit, roa-vfp-headless-test, roa-vfp-null-guards, roa-vfp-go-recno, roa-oracle-sqlexec-no-data]
|
|
prompt: |
|
|
Review-ul (Pi/DeepSeek) a dat verdict BLOCANT pe implementarea planului
|
|
$plan.output.plan_file. Constatari:
|
|
|
|
$review.output.findings
|
|
|
|
Repara TU direct, minim, respectand planul si `COMUN\docs\reguli_lucru.md`. Write-back
|
|
real si testul headless sunt permise in acest nod, imediat dupa editare (dupa
|
|
`-DryRun` OK). Probele temporare merg in `%TEMP%\archon_roa\<run-id>\`, NU in repo.
|
|
ORICE comanda bash primeste timeout explicit; nu lansa apeluri bash paralele blocante.
|
|
Dupa ce repari, ruleaza din nou verificarea mecanica:
|
|
powershell -ExecutionPolicy Bypass -File D:/roa/roacont/.archon/scripts/verifica_vfp_text.ps1 -ProjectRoot D:\roa\roacont
|
|
si confirma in raspuns ca trece (exit 0).
|
|
|
|
# ============================================================
|
|
# g. RE-REVIEW dupa escaladare_review - RULEAZA MEREU (scurt-circuit daca
|
|
# review 1 a fost deja OK), ca sa poata fi referentiat in siguranta mai
|
|
# jos ($review2.output... nu e niciodata pe un nod SKIPPED - un nod
|
|
# skipped nu poate fi referentiat in template, testat empiric 25.09).
|
|
# Nu se opreste bucla la infinit: daca verdictul e tot BLOCANT, nu mai
|
|
# exista alt nod de escaladare dupa - se merge direct spre aprobare, cu
|
|
# verdictul vizibil acolo.
|
|
# ============================================================
|
|
- id: review2
|
|
depends_on: [review, escaladare_review]
|
|
trigger_rule: none_failed_min_one_success
|
|
provider: pi
|
|
model: opencode-go/deepseek-v4.1-flash
|
|
idle_timeout: 900000
|
|
allowed_tools: [read, bash, edit, write, grep, find, ls]
|
|
skills: [roa-vfp-text-edit, roa-vfp-headless-test, roa-vfp-null-guards, roa-vfp-go-recno, roa-oracle-sqlexec-no-data]
|
|
prompt: |
|
|
Verdictul review-ului initial: $review.output.verdict
|
|
|
|
Daca verdictul de mai sus e OK, escaladarea la Opus NU a rulat (nimic de reparat) -
|
|
raspunde IMEDIAT cu verdict OK, findings: "review initial deja OK, escaladarea nu a
|
|
rulat", FARA sa mai citesti cod (raspuns scurt, ieftin, fara tool-uri).
|
|
|
|
Daca verdictul de mai sus e BLOCANT, Opus tocmai a incercat o reparare pe baza
|
|
constatarilor de mai jos - verifica pe codul REAL (nu doar presupunand ca fixul e
|
|
corect) daca problema e rezolvata si daca nu s-a introdus alta:
|
|
|
|
$review.output.findings
|
|
|
|
Aceleasi reguli de cautare rapida si probe temporare ca la nodul `review` (probele in
|
|
`%TEMP%\archon_roa\<run-id>\`, NU in repo). ORICE comanda bash primeste timeout explicit
|
|
(`timeout 120 ...` sau echivalent) si nu se ruleaza interactiv. Niciodata doua sau mai
|
|
multe comenzi bash paralele care se astepta una pe alta (blocant) - acest nod a atins
|
|
idle_timeout de 15 min exact asa (25.09, run 3c029727).
|
|
|
|
git diff --stat HEAD
|
|
git diff HEAD
|
|
git -C COMUN diff --stat HEAD
|
|
git -C COMUN diff HEAD
|
|
|
|
Verdict final: OK sau BLOCANT. Daca e tot BLOCANT, NU se mai escaladeaza automat -
|
|
workflow-ul se opreste la aprobarea finala cu verdictul tau vizibil, ca Marius sa
|
|
decida manual.
|
|
|
|
Inainte sa raspunzi, scrie verdictul si in fisier (nodul `review2_status` de dupa il
|
|
citeste de acolo, nu din raspunsul tau, ca sa nu se piarda daca acest nod
|
|
esueaza/timeout): prima linie `VERDICT: OK` sau `VERDICT: BLOCANT`, apoi findings, in
|
|
`$ARTIFACTS_DIR/review2_verdict.txt`.
|
|
|
|
Raspunde strict conform output_format.
|
|
output_format:
|
|
type: object
|
|
properties:
|
|
verdict: { type: string, enum: [OK, BLOCANT] }
|
|
findings: { type: string }
|
|
required: [verdict, findings]
|
|
|
|
# ============================================================
|
|
# g2. STATUS REVIEW2 (bash, 0 tokeni) - citeste verdictul din fisier, NU din
|
|
# $review2.output.verdict: referirea directa la un nod ESUAT/idle_timeout
|
|
# pica randarea mesajului care o foloseste (confirmat 25.09, run 3c029727
|
|
# - aprobare_final a picat exact asa, vezi docs/pilot_archon_diagnoza_47.md,
|
|
# "Rulare 2 sarcina 47"). trigger_rule: all_done -> ruleaza chiar daca
|
|
# review2 a esuat/timeout, ca probe_check/invatare/diff/aprobare_final din
|
|
# aval sa nu mai depinda de succesul lui review2.
|
|
# ============================================================
|
|
- id: review2_status
|
|
depends_on: [review2]
|
|
trigger_rule: all_done
|
|
bash: |
|
|
F="$ARTIFACTS_DIR/review2_verdict.txt"
|
|
if [ -s "$F" ]; then
|
|
cat "$F"
|
|
else
|
|
echo "VERDICT: NECUNOSCUT"
|
|
echo "review2 esuat - verifica manual"
|
|
fi
|
|
|
|
# ============================================================
|
|
# h. CONTROL fisiere suspecte (bash, 0 tokeni) - inainte de diff
|
|
# ============================================================
|
|
- id: probe_check
|
|
depends_on: [review2_status]
|
|
bash: |
|
|
mkdir -p "$ARTIFACTS_DIR"
|
|
cd D:/roa/roacont
|
|
{
|
|
echo "=== ROACONT netracked suspecte ==="
|
|
git ls-files --others --exclude-standard | grep -Ei '_probe|\.bak$|_patch|\.FXP$|_log\.txt$' || echo "(niciunul)"
|
|
echo "=== COMUN netracked suspecte ==="
|
|
git -C COMUN ls-files --others --exclude-standard | grep -Ei '_probe|\.bak$|_patch|\.FXP$|_log\.txt$' || echo "(niciunul)"
|
|
} > "$ARTIFACTS_DIR/probe_check.txt"
|
|
cat "$ARTIFACTS_DIR/probe_check.txt"
|
|
if grep -q "(niciunul)" "$ARTIFACTS_DIR/probe_check.txt" && [ "$(grep -c '(niciunul)' "$ARTIFACTS_DIR/probe_check.txt")" -eq 2 ]; then
|
|
echo CURAT
|
|
else
|
|
echo ATENTIE_FISIERE_SUSPECTE
|
|
fi
|
|
|
|
# ============================================================
|
|
# i. INVATARE - propunere de documentare (neaplicata), roa-actualizare-doc headless
|
|
# ============================================================
|
|
- id: invatare
|
|
depends_on: [probe_check]
|
|
model: sonnet
|
|
idle_timeout: 900000
|
|
skills: [roa-actualizare-doc]
|
|
prompt: |
|
|
Rulezi skill-ul `roa-actualizare-doc` HEADLESS (fara sa astepti aprobare interactiva -
|
|
doar pana la pasul "Propune", NU aplici nimic). Scop: capcanele/regulile descoperite in
|
|
aceasta rulare sa nu se piarda si sa nu se repete la urmatoarea sarcina similara.
|
|
|
|
Surse (citeste iesirile nodurilor din acest run, nu presupune):
|
|
- Plan: $plan.output.plan_file (si sectiunea "Review eng")
|
|
- Verdict review 1: $review.output.verdict / $review.output.findings
|
|
- Verdict review 2 (daca a rulat): vezi `git log`/artefacte pentru contextul escaladarii
|
|
- Verifica/verifica2: $ARTIFACTS_DIR/verifica_log.txt, $ARTIFACTS_DIR/verifica_log2.txt
|
|
(daca exista)
|
|
|
|
Concentreaza-te pe BLOCANT-uri si esecuri (nu pe ce a mers bine din prima) - acolo e
|
|
capcana care merita documentata. Exemplu real (f50d54a2, 25.09): documentul
|
|
`conventie_goexecutor_alter_table.md` deja lista simptomul (eroarea 1115 la ALTER TABLE
|
|
pe cursor din oExecute), dar planul l-a citit gresit ("rematerializare -> ALTER permis")
|
|
- propunerea corecta ar fi clarificat regula in doc, nu ar fi adaugat un doc nou.
|
|
|
|
Verifica INTAI daca subiectul exista deja in `COMUN\docs\README.md` / `docs\cercetare\`
|
|
(nu duplica). Scrie propunerea (NU o aplica) in `docs/propunere_doc_<slug>.md` (acelasi
|
|
`<slug>` ca planul): lista de modificari, fiecare cu fisierul tinta exact si textul
|
|
propus (2-5 randuri, ASCII, fara diacritice, ton ca notele din MEMORY.md - regula +
|
|
strictul de context, fara istoric/motivatie). Daca nu exista nimic reutilizabil de
|
|
documentat (sarcina a mers fara capcane noi), scrie in fisier "Nimic de propus." si atat.
|
|
|
|
Raspunde STRICT conform output_format.
|
|
output_format:
|
|
type: object
|
|
properties:
|
|
propunere_file: { type: string }
|
|
are_propuneri: { type: boolean }
|
|
required: [propunere_file, are_propuneri]
|
|
|
|
# ============================================================
|
|
# j. DIFF (bash, 0 tokeni) - include si fisierele noi netracked
|
|
# ============================================================
|
|
- id: diff
|
|
depends_on: [invatare]
|
|
bash: |
|
|
mkdir -p docs
|
|
cd D:/roa/roacont
|
|
PLANFILE=$plan.output.plan_file
|
|
SLUG=$(basename "$PLANFILE" .md | sed 's/^plan_//')
|
|
OUT="docs/diff_${SLUG}.patch"
|
|
: > "$OUT"
|
|
|
|
git diff HEAD >> "$OUT"
|
|
git -C COMUN diff --src-prefix=a/COMUN/ --dst-prefix=b/COMUN/ HEAD -- "*.prg" "*.vc2" "*.sc2" >> "$OUT"
|
|
|
|
# fisiere noi netracked (ROACONT), exclus .archon/ si docs/plan_*
|
|
git ls-files --others --exclude-standard | grep -v '^\.archon/' | grep -v '^docs/plan_' | while IFS= read -r f; do
|
|
git diff --no-index -- /dev/null "$f" >> "$OUT" || true
|
|
done
|
|
|
|
# fisiere noi netracked (COMUN), cu prefix COMUN/
|
|
git -C COMUN ls-files --others --exclude-standard | while IFS= read -r f; do
|
|
git -C COMUN diff --no-index --src-prefix=a/COMUN/ --dst-prefix=b/COMUN/ -- /dev/null "$f" >> "$OUT" || true
|
|
done
|
|
|
|
echo "Diff scris in $OUT"
|
|
wc -l "$OUT"
|
|
|
|
# ============================================================
|
|
# k0. RAPORT CONTEXT (bash, 0 tokeni) - varf de context + timp per nod, din
|
|
# archon.db (evenimente node_started/node_completed, exacte) + sesiunile
|
|
# brute Pi/Claude de pe disc (varf real, .archon/scripts/*_extract.pl).
|
|
# trigger_rule: all_done - ruleaza chiar daca ceva a picat mai devreme in
|
|
# lant (Marius vrea sa vada tabelul si dupa un esec, nu doar pe happy path).
|
|
# ============================================================
|
|
- id: raport_context
|
|
depends_on: [diff]
|
|
trigger_rule: all_done
|
|
bash: |
|
|
mkdir -p docs
|
|
cd D:/roa/roacont
|
|
PLANFILE=$plan.output.plan_file
|
|
SLUG=$(basename "$PLANFILE" .md | sed 's/^plan_//')
|
|
OUT="docs/context_${SLUG}.md"
|
|
{
|
|
echo "# Context si timp per nod - $SLUG"
|
|
echo
|
|
perl .archon/scripts/raport_context.pl
|
|
} > "$OUT" 2>&1
|
|
cat "$OUT"
|
|
|
|
# ============================================================
|
|
# k. APROBARE FINALA (Marius vede diff-ul, verdictul si propunerea de doc)
|
|
# Verdictul review2 e citit din nodul `review2_status` (bash, all_done), NU
|
|
# direct din $review2.output.verdict: referirea directa la un nod ESUAT
|
|
# (idle_timeout) pica randarea acestui mesaj - confirmat 25.09, run 3c029727
|
|
# (vezi docs/pilot_archon_diagnoza_47.md, "Rulare 2 sarcina 47"). Un nod
|
|
# SKIPPED tot nu poate fi referentiat in template (confirmat empiric 25.09);
|
|
# review2_status ruleaza mereu (all_done), deci nu se sare niciodata.
|
|
# ============================================================
|
|
- id: aprobare_final
|
|
depends_on: [raport_context, review2_status]
|
|
approval:
|
|
message: |
|
|
Diff scris in docs/ (vezi nodul 'diff' pentru numele exact al fisierului).
|
|
Control fisiere suspecte (probe/backup uitate): vezi artefactul `probe_check.txt`.
|
|
Context si timp per nod (varf peste 200k e marcat ATENTIE): vezi docs/context_<slug>.md
|
|
(vezi nodul 'raport_context' pentru numele exact al fisierului).
|
|
|
|
Verdict review 1: $review.output.verdict
|
|
Verdict final (review2 - re-review dupa escaladare, sau scurt-circuit daca review 1
|
|
a fost deja OK; daca review2 a esuat/timeout, verdictul de mai jos e "NECUNOSCUT -
|
|
verifica manual"):
|
|
$review2_status.output
|
|
(daca verdictul final e tot BLOCANT sau NECUNOSCUT, workflow-ul NU escaladeaza din
|
|
nou - decizi tu: aprobi cu rezerve, respingi, sau ceri o interventie manuala)
|
|
Propunere documentatie (NEAPLICATA): $invatare.output.propunere_file
|
|
(are_propuneri: $invatare.output.are_propuneri)
|
|
|
|
Testeaza in VFP. Commit-ul (git/svn) ramane manual, in afara acestui workflow.
|
|
Write-back-ul (txt2vcx, dupa -DryRun) a fost facut deja in nodurile de implementare/
|
|
escaladare. Aprobi (inclusiv aplicarea propunerii de documentatie de mai sus)?
|
|
|
|
# ============================================================
|
|
# l. APLICA DOC (dupa aprobare) - aplica propunerea de documentare aprobata
|
|
# ============================================================
|
|
- id: aplica_doc
|
|
depends_on: [aprobare_final]
|
|
when: "$invatare.output.are_propuneri == 'true'"
|
|
provider: pi
|
|
model: opencode-go/deepseek-v4.1-flash
|
|
allowed_tools: [read, bash, edit, write, grep, find, ls]
|
|
prompt: |
|
|
Marius a aprobat propunerea de documentare din $invatare.output.propunere_file. Aplic-o
|
|
STRICT (nu adauga altceva): pentru fiecare modificare din propunere, editeaza fisierul
|
|
tinta exact (creeaza-l doar daca propunerea cere explicit un fisier nou). `COMUN\docs`
|
|
e un repo git SEPARAT de ROACONT - editarile de acolo se fac normal pe disc (commit-ul
|
|
ramane manual, la fel ca pentru cod). Fisierele `.md` sunt text obisnuit: pastreaza
|
|
terminatia de linie existenta a fiecarui fisier (nu forta CRLF ca la `.vc2`/`.sc2` - aia
|
|
e o regula doar pentru codul VFP). Daca propunerea cere randul nou in
|
|
`COMUN\docs\README.md` si declansatorul in `reguli_lucru.md` pct. 7, adauga-le.
|
|
Nu rula `roa_sync`, nu da commit.
|