Files
roafacturare/docs/s0_context_hook.md
2026-09-17 22:36:46 +03:00

5.9 KiB

S0 - Prototip context/handoff: fix SubagentStop, -StareFile, compactare mai devreme

Executat 17.09.2026, pe masina curenta (fara UI, conform plan_qa_factura_aviz.md sectiunea S0).

Ce am gasit

  • Hook-ul SubagentStop din C:\Users\mmari\.claude\settings.json (era la cheia hooks.SubagentStop[0].hooks[0].command) era un simplu echo '{"hookSpecificOutput":...}' static, executat de fiecare data cand un subagent se opreste, fara sa citeasca deloc stdin-ul hook-ului. Nu bloca explicit (nu avea decision:block/exit 2), dar reinjecta acelasi additionalContext la fiecare SubagentStop, inclusiv la reincercarile in acelasi ciclu de stop - de aici bucla observata (patru agenti raportand cicluri repetate in aceeasi sesiune). Cauza + fix documentate in docs/qa_factura_hooks_ref.md sectiunea 4 ("stop_hook_active si bucla"): campul stop_hook_active trebuie citit de pe stdin, iar la true hook-ul trebuie sa iasa imediat cu 0, fara iesire.
  • context_watch.ps1 e in D:\ROA\ROAGEST\COMUN\utile\context_watch.ps1. Verificat: acel COMUN e checkout separat al aceluiasi repo git@gitea.romfast.ro:romfast/comun.git ca si D:\ROA\ROAFACTURARE\COMUN (acelasi origin, ramuri main) - deci e intr-adevar biblioteca partajata, doar clonata separat per produs. Nu l-am mutat: mutarea in COMUN (punctul 4 din planul S0) nu a fost in cele trei sarcini primite de la team lead pentru aceasta sesiune, ramane neacoperit (vezi mai jos).
  • Scriptul deja avea parametrii -Stdout (UserPromptSubmit) si -OSinguraData (PostToolUse, dedup prin fisier marcaj in %TEMP%); nu avea niciun mecanism de scriere pe disc a starii.
  • env in settings.json nu exista CLAUDE_AUTOCOMPACT_PCT_OVERRIDE.

Ce am schimbat

1. Garda stop_hook_active pe hook-ul SubagentStop

C:\Users\mmari\.claude\settings.json, cheia hooks.SubagentStop[0].hooks[0].command (inainte de orice modificare am facut copie de siguranta la C:\Users\mmari\.claude\settings.json.bak_20260917, verificata pe disc):

Inainte:

echo '{"hookSpecificOutput":{"hookEventName":"SubagentStop","additionalContext":"..."}}'

Dupa:

grep -q '"stop_hook_active"[[:space:]]*:[[:space:]]*true' && exit 0; echo '{"hookSpecificOutput":{"hookEventName":"SubagentStop","additionalContext":"..."}}'

Mesajul additionalContext a ramas identic (neschimbat), doar prefixat cu garda. grep -q citeste stdin-ul hook-ului (JSON-ul cu stop_hook_active) fara dependenta de jq (nu e instalat pe masina - verificat). Daca patternul gaseste "stop_hook_active":true (cu sau fara spatiu dupa :), hook-ul iese cu 0 fara sa emita nimic; altfel continua la echo ca inainte.

2. -StareFile in context_watch.ps1

D:\ROA\ROAGEST\COMUN\utile\context_watch.ps1:

  • linia 20: parametru nou [string]$StareFile.
  • liniile 23-36: functia noua Scrie-AntetStare - daca fisierul exista si primul rand se potriveste cu ^<!-- context_watch:, il inlocuieste; altfel adauga antetul ca prim rand (fisier nou sau fisier existent fara antet). Restul continutului ramane neschimbat.
  • linia 92: apel if ($StareFile) { Scrie-AntetStare -cale $StareFile -tokeni $total -nivel $nivel } in blocul if ($mesaj), deci se declanseaza exact cand pragul de avertisment sau max e atins (acelasi punct unde se decide mesajul), indiferent de -Stdout/-OSinguraData.
  • Comportamentul fara -StareFile e neschimbat: parametrul e opt, iar apelul e conditionat de prezenta lui.

3. CLAUDE_AUTOCOMPACT_PCT_OVERRIDE in settings

C:\Users\mmari\.claude\settings.json, cheia env (exista deja, avea doar CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS): adaugat "CLAUDE_AUTOCOMPACT_PCT_OVERRIDE": "70". Nicio alta setare atinsa.

Rezultatul probelor cerute

  1. settings.json e JSON valid dupa modificare: Get-Content ... -Raw | ConvertFrom-Json -> a rulat fara eroare, a scris JSON_VALID.
  2. context_watch.ps1 -StareFile pe transcript de test (usage sintetic la 260000 tokeni, peste pragul implicit de 250000):
    • rulare 1: fisier inexistent -> creat, un singur rand: <!-- context_watch: 17.09.2026 21:57 | tokeni: 260000 | nivel: avertisment -->.
    • am adaugat manual un rand "text scris de model" dupa antet (simuland continutul modelului).
    • rulare 2 (o secunda mai tarziu): antetul de pe primul rand a fost INLOCUIT (ora actualizata), randul "text scris de model" a ramas neatins, nu s-a adaugat un al doilea antet (verificat cu citire BOM-aware: 2 linii total, 1 linie cu prefixul antetului).
  3. context_watch.ps1 fara -StareFile: acelasi transcript de test -> acelasi mesaj de avertisment pe stderr, exit code 2, identic cu comportamentul dinaintea modificarii (nimic scris pe disc).
  4. Hook-ul SubagentStop: comanda extrasa din settings.json dupa modificare, rulata direct:
    • stdin {"stop_hook_active":true} -> nicio iesire, exit 0.
    • stdin {"stop_hook_active":false} -> a scos exact additionalContext-ul de dinainte, exit 0.

Ce a ramas neacoperit

  • Punctul 4 din S0 al planului ("se muta in COMUN ca sa fie refolosibil de toate produsele ROA") NU a fost facut - nu a fost in lista de 3 sarcini primite de la team lead pentru aceasta rulare. Scriptul ramane in D:\ROA\ROAGEST\COMUN\utile\context_watch.ps1, neschimbat ca locatie.
  • Proba "ciclu real cu subagent care se termina, o singura rulare a hook-ului" (mentionata in plan la finalul sectiunii S0) nu a fost reprodusa printr-un subagent real - probele de mai sus au testat garda si scrierea de stare direct, in izolare, nu printr-o rulare completa Claude Code cu un subagent viu. Nu am lansat subagenti (interdictie explicita in sarcina).
  • Nu am facut niciun commit (interdictie explicita); settings.json nu e sub control de versiuni in acest repo, deci nu exista diff de revizuit acolo - doar backup-ul C:\Users\mmari\.claude\settings.json.bak_20260917. context_watch.ps1 e in repo-ul COMUN (git) - diff-ul ramane de revizuit acolo inainte de commit, conform regulii "fara commit fara review".