Files
roafacturare/docs/handoff_activ.md
2026-09-17 22:44:24 +03:00

159 lines
10 KiB
Markdown

# 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`
(+ `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
(raportul de cercetare a fost sters dupa condensare; concluzia e mai jos). 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 -- <cmd>`. 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: `<scratchpad>\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`.
Livrabilele lor au fost condensate aici si sterse; nu le cauta pe disc,
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.