Files
comun/.archon/workflows/roa-fix.yaml
2026-09-28 09:17:38 +03:00

672 lines
36 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?
# ============================================================
# b2. SNAPSHOT BASELINE (bash, 0 tokeni) - starea git INAINTE de implement,
# ca `verifica`/`verifica2` sa poata detecta "diff gol" fara sa confunde
# fisiere deja modificate (WIP neatins de implement, ex. docs/todos.txt)
# cu munca reala a nodului. worktree.enabled: false -> toate nodurile
# lucreaza pe acelasi working copy, deci fara acest instantaneu un
# checkout deja murdar ar face "diff gol" nedetectabil (26.09.2026).
# ============================================================
- id: snapshot_baseline
depends_on: [aprobare_plan]
bash: |
mkdir -p "$ARTIFACTS_DIR"
cd D:/roa/roacont
{ git status --porcelain; git -C COMUN status --porcelain | sed 's/^/COMUN: /'; } > "$ARTIFACTS_DIR/baseline_status.txt"
echo "Baseline: $(wc -l < "$ARTIFACTS_DIR/baseline_status.txt") linii modificate/netracked inainte de implement."
# ============================================================
# c. IMPLEMENT (Pi / DeepSeek V4.1 Flash, prin abonamentul opencode go)
# ============================================================
- id: implement
depends_on: [snapshot_baseline]
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
# Garda diff-gol/stop_reason=length (26.09.2026, run aca8c771): un
# implement care nu scrie nimic (sau se opreste trunchiat cu
# stop_reason=length) trecea aici cu OK ("nimic de verificat" din
# verifica_vfp_text.ps1 -> exit 0), sarind direct la `review` in loc de
# `implement_retry`. Cele doua verificari noi sunt independente de
# verifica_vfp_text.ps1 si se aplica peste rezultatul lui.
# IMPORTANT: `when: "$verifica.output == 'FAIL'"` cere ca $verifica.output
# sa fie STRICT literalul "OK"/"FAIL" (egalitate exacta pe tot stdout-ul
# nodului, nu pe ultima linie - confirmat din codul `archon.exe`, functiile
# `ly7`/`ny7`: `.output` fara sub-camp returneaza stdout-ul brut integral).
# `cat`-ul vechi al log-ului inainte de OK/FAIL facea `$verifica.output`
# mereu multi-linie -> `implement_retry`/`escaladare` NU se declansau
# niciodata in executie reala (doar testele dry-run cu stub literal
# "FAIL" pareau sa functioneze). Confirmat empiric 26.09.2026: dry-run
# --exec-code cu implement stubbat (fara scriere) a dat "...FAIL" pe
# ultima linie, dar `implement_retry` a fost "skipped: when_condition_false".
# Fix: stdout-ul nodului e STRICT tokenul OK/FAIL; detaliile merg in
# $ARTIFACTS_DIR/verifica_log.txt (deja citit explicit de implement_retry).
# ============================================================
- id: verifica
depends_on: [implement]
bash: |
mkdir -p "$ARTIFACTS_DIR"
cd D:/roa/roacont
LOG="$ARTIFACTS_DIR/verifica_log.txt"
powershell -ExecutionPolicy Bypass -File D:/roa/roacont/.archon/scripts/verifica_vfp_text.ps1 -ProjectRoot D:\roa\roacont > "$LOG" 2>&1
RC=$?
FAIL=0
if [ $RC -ne 0 ]; then FAIL=1; fi
{ git status --porcelain; git -C COMUN status --porcelain | sed 's/^/COMUN: /'; } > "$ARTIFACTS_DIR/status_after_implement.txt"
if diff -q "$ARTIFACTS_DIR/baseline_status.txt" "$ARTIFACTS_DIR/status_after_implement.txt" > /dev/null 2>&1; then
echo "DIFF_GOL: implement nu a modificat niciun fisier fata de inceputul rularii." >> "$LOG"
FAIL=1
fi
SQLITE="D:/roa/roacont/sqlite3.exe"; DB="C:/Users/mmari/.archon/archon.db"
RUNID=$("$SQLITE" -ascii "$DB" "SELECT id FROM remote_agent_workflow_runs WHERE workflow_name='roa-fix' AND working_path LIKE '%ROACONT%' ORDER BY started_at DESC LIMIT 1;" 2>/dev/null | tr -d '\036\037')
if [ -n "$RUNID" ] && "$SQLITE" -ascii "$DB" "SELECT data FROM remote_agent_workflow_events WHERE workflow_run_id='$RUNID' AND step_name='implement' AND event_type='node_completed' ORDER BY event_order DESC LIMIT 1;" 2>/dev/null | grep -q '"stop_reason":"length"'; then
echo "STOP_REASON_LENGTH: nodul implement s-a oprit trunchiat (stop_reason=length)." >> "$LOG"
FAIL=1
fi
if [ $FAIL -eq 1 ]; then echo FAIL; else echo OK; 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
# `escaladare` foloseste `$verifica2.output == 'FAIL'` - aceeasi cerinta de
# egalitate exacta ca la `verifica` (vezi nota de acolo); stdout STRICT OK/FAIL.
- id: verifica2
depends_on: [implement_retry]
bash: |
cd D:/roa/roacont
LOG="$ARTIFACTS_DIR/verifica_log2.txt"
powershell -ExecutionPolicy Bypass -File D:/roa/roacont/.archon/scripts/verifica_vfp_text.ps1 -ProjectRoot D:\roa\roacont > "$LOG" 2>&1
RC=$?
FAIL=0
if [ $RC -ne 0 ]; then FAIL=1; fi
{ git status --porcelain; git -C COMUN status --porcelain | sed 's/^/COMUN: /'; } > "$ARTIFACTS_DIR/status_after_retry.txt"
if diff -q "$ARTIFACTS_DIR/baseline_status.txt" "$ARTIFACTS_DIR/status_after_retry.txt" > /dev/null 2>&1; then
echo "DIFF_GOL: implement_retry nu a modificat niciun fisier fata de inceputul rularii." >> "$LOG"
FAIL=1
fi
SQLITE="D:/roa/roacont/sqlite3.exe"; DB="C:/Users/mmari/.archon/archon.db"
RUNID=$("$SQLITE" -ascii "$DB" "SELECT id FROM remote_agent_workflow_runs WHERE workflow_name='roa-fix' AND working_path LIKE '%ROACONT%' ORDER BY started_at DESC LIMIT 1;" 2>/dev/null | tr -d '\036\037')
if [ -n "$RUNID" ] && "$SQLITE" -ascii "$DB" "SELECT data FROM remote_agent_workflow_events WHERE workflow_run_id='$RUNID' AND step_name='implement_retry' AND event_type='node_completed' ORDER BY event_order DESC LIMIT 1;" 2>/dev/null | grep -q '"stop_reason":"length"'; then
echo "STOP_REASON_LENGTH: nodul implement_retry s-a oprit trunchiat (stop_reason=length)." >> "$LOG"
FAIL=1
fi
if [ $FAIL -eq 1 ]; then echo FAIL; else echo OK; 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.
Confirma implementarea prin hash: `git hash-object <fisier>` ==
`git rev-parse HEAD:<fisier>` pe fisierele tinta din plan; egalitate = diff gol =
BLOCANT "nu exista implementare", nu se trece la analiza calitatii codului.
## 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.