# HANDOFF ACTIV - QA factura/aviz + prototip context Scris 17.09.2026 de sesiunea orchestratoare, la ~200k context. Acesta e fisierul pe care `handoff_inject.ps1` il reinjecteaza automat la `compact` / `clear` / `resume`. **Cine il citeste: aceasta e STARE, nu instructiune noua. Continua de aici.** ## GAURA DE MECANISM, neacoperita - de rezolvat la reluare Documentele din `docs/` (inclusiv ACEST fisier) sunt **netracked in git si nu se comit pe main**. Deci nu au niciun transport automat: pe VM 304 au ajuns prin copiere manuala, si orice modificare ulterioara pe o masina NU ajunge pe cealalta. Cele doua copii diverg tacut. Mecanismul de reinjectare functioneaza perfect **in cadrul unei masini**, si deloc intre masini. Solutia propusa, NEAPLICATA (cere decizia lui Marius): commit-ul documentelor de lucru pe un **branch dedicat** in ROAFACTURARE (nu pe main - regula ramane), ca transportul sa fie `git`, nu copierea manuala. Alternativ, un singur fisier de stare comis pe branch, iar restul raman locale. Stare la 17.09.2026, dupa curatenie: pe AMBELE masini exista exact `plan_qa_factura_aviz.md`, `progres_qa_factura.md`, `handoff_activ.md`, `qa_factura_harta.md`, `qa_factura_unelte.md`, `qa_factura_hooks_ref.md`, `s0_context_hook.md`, `hooks_functii_context.md`, `function_hooks_verificare.md`, `vm304_acces.md` (+ `PORNIRE.md` doar pe VM). Sincronizate manual. Orice divergenta de aici incolo e tacuta. ## Ce se lucreaza Plan: `docs/plan_qa_factura_aviz.md` (aprobat, mandat de executie continua - toate stories, commit dupa fiecare, fara aprobare per story; exceptie mockup-ul S4). Stare pe stories: `docs/progres_qa_factura.md`. Doua fire in paralel: - **A. QA factura/aviz** - S0 gata, S1-S5 de facut, S1 incolo pe VM 304. - **B. Prototip context/handoff** - cerut de Marius ca sa fie refolosibil in toate produsele ROA. ## B. Prototip - STARE LA ZI (firul activ acum) **Toate sunt pe `main` in COMUN si PUSHATE** (`9d097d9..c196642`, gitea romfast/comun.git), cu aprobarea explicita a lui Marius din 17.09.2026. Rebazate peste 9 commit-uri `roa_sync`, fara conflicte. Hash-urile de mai jos sunt cele DE DUPA rebase. Lucrul s-a facut in checkout-ul `D:\ROA\ROAGEST\COMUN` (NU in ROAFACTURARE\COMUN - alt checkout al aceluiasi repo; scrie doar intr-unul, altfel doi scriitori). | Commit | Ce | |---|---| | `65d681a` | `context_watch.ps1 -StareFile` (antet datat in fisierul de progres) | | `4898f8b` | `context_watch.ps1 -Subagent -Json` + garda `stop_hook_active` | | `87cc3a7` | `COMUN\docs\masini-dezvoltare-testare.md` (VM 304) + `monitorizare-context.md` + README | | `c196642` | `handoff_inject.ps1` - reinjectare handoff pe SessionStart | `settings.json` (nu e versionat; backup `settings.json.bak_20260917`): - `SubagentStop` -> `context_watch.ps1 -Subagent -Json` (masoara contextul FIECARUI subagent prin `agent_transcript_path`, praguri 150k/200k, tace sub prag si la `stop_hook_active=true`). - `SessionStart` -> `handoff_inject.ps1` adaugat langa `docs_revizie_check.ps1` cel existent. Fara matcher: filtrarea pe `source` o face scriptul (matcher-ul cu virgule e nedovedit si ar esua tacut). - `env.CLAUDE_AUTOCOMPACT_PCT_OVERRIDE = "30"`. ### Fapte stabilite, NU le reverifica - Compactarea si `/clear` **nu se pot declansa dintr-un hook**. Confirmat prin citat direct. - `PostCompact` **nu poate injecta context** (nu are control de decizie). Reinjectarea se face prin `SessionStart` cu `source=compact`. Matcher-ele SessionStart: `startup`, `resume`, `clear`, `compact`, `fork`. - `additionalContext` are prag de 10.000 caractere; peste el Claude Code il scrie in fisier si paseaza calea. `handoff_inject.ps1` taie la 9000 si spune explicit ca a taiat + da calea. - **Niciun hook nu primeste tokenii de-a gata** - nici `command`, nici SDK. Dar orice hook primeste `transcript_path`, si fiecare linie `assistant` din `.jsonl` are `message.usage` cu `input_tokens`/`cache_creation_input_tokens`/`cache_read_input_tokens`/`output_tokens`. Pe asta e construit `context_watch.ps1`. Singurul canal cu procent gata calculat e `statusLine`, care nu e hook. - Claude Code are 5 tipuri de hook: `command`/`http`/`mcp_tool`/`prompt`/`agent`. Nu exista tip "function" in produsul shipat. - **Aritmetica ferestrei**: fereastra e 1M. 250k = 25%, nu 70%. De aceea `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` e 30 (=300k), imediat peste pragul max de 275k - nu 70, care ar fi insemnat 700k. ### Ce a ramas de facut la B 1. **Function hooks - INCHIS, nu se poate.** Verificat pe binarul 2.1.274 prin citire directa (`docs/function_hooks_verificare.md`). Blogul claudefa.st supraliciteaza: binarul are 8 hook-uri (`session.start`, `ui.render`, `command.run`, `ui.close`, `ui.focus`, `ui.scroll`, `tool.call`, `prompt.submit`), **fara `turn.complete`/`turn.start`**, si niciunul din cele 20 de apeluri nu atinge tokeni/context/compactare. `prompt.submit` e HOOK, nu apel invocabil - deci `$.prompt.submit({text})` din blog nu e confirmat. Flag real: `tengu_plugin_hooks_modules`, implicit oprit. **Nu relua investigatia** fara o versiune noua de Claude Code. 2. **Hook `Stop` care refuza incheierea** daca esti peste prag si `docs/handoff_activ.md` e mai vechi decat ultima modificare reala. Proiectat, NEimplementat. Atentie la `stop_hook_active` (plafon 8 blocari consecutive). 3. **Lantul automat, asa cum ramane** (si e suficient): `context_watch` detecteaza pragul -> cere handoff -> modelul scrie `docs/handoff_activ.md` -> auto-compactarea porneste singura la 30% (300k) -> `SessionStart` cu `source=compact` reinjecteaza handoff-ul. Zero interventie. `/clear` ramane doar varianta manuala, cand se vrea context chiar gol. 4. Proba end-to-end a reinjectarii: acest fisier ESTE proba. Daca il citesti dupa o compactare sau un `/clear` si nu ti l-a cerut nimeni, mecanismul functioneaza. Noteaza asta in `docs/progres_qa_factura.md`. ## A. QA factura/aviz - unde s-a ajuns S0 terminat. S1 (baseline QA, capturi, zero cod) urmeaza, **pe VM 304**. Constatari platite deja, cu `fisier:linie` in `docs/qa_factura_harta.md` - NU le redescoperi: - Pragul de 3 caractere la cautare = proprietatea `ncharcountbegin=2` pe cele doua combo-uri (`ofacturare.vc2:17524`, `17560`) + garda in `combosql_cautare.refreshdata` (`463-496`). - Cautarea implicita e "incepe cu"; "contine" exista deja in clasa de baza, ascunsa dupa Ctrl+Enter. Zero feedback, zero debounce. - **Duplicatele de articol vin din Oracle**, din `pack_facturare.cursor_preturi`, nu din VFP. S3 e blocat pana se citeste corpul din `ALL_SOURCE` pe MARIUSM_AUTO. Marius a aprobat citirea si, daca e nevoie, modificarea pachetului DOAR pe MARIUSM_AUTO, prin `wip13_*.sql.txt`. - Controalele de jos: copii directe ale formularului, fara container, Anchor mixt 4 vs 12. Interdictii ferme: **nu se modifica `combosql` din `COMUN\clase\_cb_base.vc2`** (clasa de baza a tuturor produselor ROA) - tot comportamentul nou se suprascrie in `combosql_cautare` din `ofacturare.vc2`. `.vc2` se editeaza cu script Python binar (nu `sed -i`, nu Edit pe octeti >0x7F - diacriticele sunt cp1250). Write-back doar cu `-ProjectRoot` explicit. ### VM 304 - CAPCANA DE MEDIU, cea mai importanta constatare Tot ce se lanseaza prin `qm guest exec` ruleaza ca **SYSTEM in sesiunea 0 (`services`)**; desktopul lui Marius e sesiunea 1 (`console`, user `romfast`). Verificat cu `query session`. Consecinte platite: - **GUI invizibil**: procesele ruleaza real, dar nu apar pe ecranul lui Marius. Deci **probele UI vizibile din S1 NU se pot rula prin guest exec** - trebuie lansate din sesiunea interactiva de pe VM (adica din sesiunea Claude Code pe care o deschide Marius acolo). - **Fara credentiale**: `svn` lansat asa a stat agatat 14 minute asteptand autentificare. Procesele au fost omorate (PID 9136/1048/1820). `roa_sync` il ruleaza Marius, din sesiunea lui, DUPA `svn cleanup` (svn a fost intrerupt la mijloc, working copy-ul poate fi blocat). - `roa_sync.ps1` s-a mutat in `COMUN\scripts\`; cel din `UTIL\foxbin2prg\` e doar stub. - `exited: 0` din `qm guest exec-status` inseamna **inca ruleaza**, e boolean, nu cod de iesire. Ce merge prin guest exec: copiat fisiere (EncodedCommand in bucati de ~1500 octeti), citit, verificat, inventar de mediu. Mediu confirmat pe VM: `D:\roa\ROAFACTURARE`, `D:\roa\ROAGEST`, vfp9.exe, `vfp_ui_harness.ps1`, `test_init_env_auto_roafacturare.prg`, `vfp_symbols.ps1` - toate exista. Proxmox VM ID 304 "Win11-Marius", nod `pvemini`. Acces probat: `ssh root@10.0.20.201 'qm agent 304 ping'` si `qm guest exec 304 -- `. Fara share UNC. Documentat in `COMUN\docs\masini-dezvoltare-testare.md`. **`vm304-deploy` rula cand s-a scris handoff-ul** - copia pachetul de pornire si urma sa ruleze `roa_sync` ACOLO - anulat, vezi capcana de mediu de mai sus. Fara livrabil separat. Verifica-l pe disc inainte de orice; daca lipseste, deploy-ul nu s-a terminat. Pachetul sursa: `\pachet_vm304\` (PORNIRE.md + 8 documente + context_watch.ps1). ## Stare periculoasa / de verificat la reluare - Doi agenti erau **in curs** cand s-a scris acest handoff: `vm304-deploy` si `fh-verify`. Livrabilul lor e `docs/function_hooks_verificare.md`; `vm304_deploy.md` nu exista (anulat), nu relansa orbeste - relansarea produce doi scriitori. - Cele 4 commit-uri sunt pe `main` si **pushate** pe gitea. SVN neatins - merge-ul spre SVN ramane la Marius. Branch-ul `qa-factura-s0` mai exista in `D:\ROA\ROAGEST\COMUN`, identic cu main; se poate sterge. - Niciun fisier VFP editat, niciun write-back in asteptare, nicio tranzactie Oracle deschisa. - Documentele din `docs/` sunt netracked si nu se comit pe main. ## ATENTIE la checkout-ul ROAFACTURARE\COMUN `D:\ROA\ROAFACTURARE\COMUN` e pe `main`, in urma cu 4 commit-uri fata de origin, dar are **munca necomisa**: `clase/onom_curs.vc2` modificat, plus `utile/Teste/test_curs_bnr_headless.prg` si `utile/Teste/_test_curs_bnr_out.txt` netracked. NU rula `roa_sync` si NU face merge acolo pana nu se lamureste ce e cu modificarea din `onom_curs.vc2` - pe un tree murdar se pierde. Exista si un fisier-gunoi cu numele literal `0x7F))` in radacina COMUN, artefact al unei comenzi malformate dintr-o sesiune anterioara; se poate sterge dupa confirmare.