sync SVN r18206
This commit is contained in:
597
.archon/workflows/roa-fix.yaml
Normal file
597
.archon/workflows/roa-fix.yaml
Normal file
@@ -0,0 +1,597 @@
|
||||
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.
|
||||
Reference in New Issue
Block a user