From 39d2ba3dd0118616c53300c7033d4e2d77bc2b00 Mon Sep 17 00:00:00 2001 From: Claude Agent Date: Mon, 6 Jul 2026 11:55:57 +0000 Subject: [PATCH] docs: ROADMAP actualizat cu 5.19 LIVRAT + findings /code-review rezolvate (2026-07-06) Intrare noua in "Ultima actualizare": 5.19 (auto-send toggle + coada tinuta held) livrat + push (main la eade702), cu cele doua runde de corectii /code-review high: finding #1 (re-snapshot held pe caile de repunere, corectitudine) + findings #2-#6 (UX/retentie). Nota PLAN 5.19 marcata LIVRAT. 1541 passed. Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/ROADMAP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 45a0293..9846aa7 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -48,7 +48,7 @@ Reguli de contract (detalii in `docs/api-rar-contract.md`): `FINALIZATA` e termi > PRD-uri (`docs/prd/prd-X.Y-*.md`), linkate in coloana Detalii. La fiecare livrabila terminata: > schimba statusul + data + linkul PRD si actualizeaza "Ultima actualizare". -**Ultima actualizare**: 2026-07-03 — 3 PR-uri ergonomie LIVRATE + PUSH (`main` la `0a86e63`), executate in paralel prin agent team (3 subagenti, fiecare in worktree izolat + branch separat; Opus coordoneaza + merge + verify + push; git interzis subagentilor). **PR1 paritate editor mapare** (`e11a5ef`, merge `4a39083`): panoul inline „Operatii de mapat la cod RAR" din preview-ul de import avea cale divergenta (doar fuzzy `suggest_codes`, fara sursa) fata de pagina /mapari; `_collect_unmapped_ops` primeste acum `conn` si ataseaza `sugestie_principala` + `surse_sugestie` via `enrich_suggestions`+`ensure_embeddings_corpus` (o data inainte de bucla), replicand `pending_unmapped` (geamanul structural care randeaza /mapari, NU `_nemapate_pentru_submission`); `_preview_import.html` preselect sugestie_principala>fuzzy>=60 + badge `confirmat`/`similar`/`non-operatie` (clase CSS deja in base.html, zero nou); test de paritate TARE end-to-end (`_web_compute_preview["unmapped_ops"]` == `pending_unmapped` pe `sugestie_principala`+`surse_sugestie`, cate un caz per sursa gold/silver/embedding/nul). Suggestion-only (#13 intact — enrichment nu intra in `resolve_prestatii`/`load_mapping`). **PR2 mesaj onest mediu RAR** (`aac9971`, merge `5afd796`, Issue A/A1): premisa din plan INVECHITA — ruta tinta `/cont/rar-creds` (web) era cod mort (formularul live e `/cont/rar-medii`, US-008/5.20, cu sectiuni explicite Testare+Productie validate per-env); pastrat intentul A1 (mesaj onest minim, bazat pe `rar_env`, fara selector, fara schimbari de logica) adaptat la suprafata reala: global Jinja `mediu_instanta()` (eticheta ancorei globale) + note oneste in `_upload.html` (banner 0 medii) + `_cont.html`. **PR3 confirmare valori needs_review bulk+rapid** (`a881b82`, merge `367739f`, Issue B/B1): pana acum `reviewed=1` doar din modalul de editare; adaugat `POST /_import/{id}/confirma-toate-review` (bulk, om in bucla, account-scoped 404/409 pe batch comis) + buton confirm rapid per-rand direct in tabel (fara modal); reset `reviewed=0` la editare neschimbat; B2 auto-review RESPINS (risc integritate FINALIZATA ireversibil). **Cleanup post-merge** (`0a86e63`, cerut de user): eliminata ruta moarta `/cont/rar-creds` (web, scria mereu in slotul env-ului instantei — exact bug-ul Issue A) + 2 teste care o exercitau + comentariu stale US-008 corectat la `/cont/rar-medii`; ruta API `/v1/conturi/rar-creds` (in `app/api/v1/router.py`) e separata si LIVE, neatinsa. VERIFY: `pytest -q -m "not live"` **1463 passed, 1 deselected (live)** pe main merged (1465 inainte de cleanup, -2 = testele rutei moarte). Plan: `main-plan-paritate-editor-mapare.md` (autoplan review inclus). | ISTORIC: 2026-07-02 — 5.20 LIVRAT + VERIFY PASS + COMMIT (medii RAR per cont: Testare/Productie ca medii configurabile, fiecare cu bifa de activare + set propriu de credentiale). Premisa VERIFICATA live cu 2 seturi reale: test si prod = sisteme RAR complet separate, un set de creds merge pe exact unul (creds dev: test 200/prod 401; creds client real: test 401/prod 200) -> 2 sloturi creds per cont. Model: din `medii_disponibile`=enabled AND creds decurge tot UX-ul (0=blocaj, 1=fara selector/totul acolo, 2=selector import + toggle statusbar + alegere API). Reguli transversale REQ-DISP/VIZ/BADGE/DEFAULT/CONF. Decizii user (toate rezolvate): default API = default cont (NU "test" hardcodat, fiindca clientii sunt prod-only); cont client nou = Productie on/Testare off; confirmare Productie o data la activare (nu per trimitere); `accounts.rar_creds_enc` vechi se STERGE in acest PRD (US-013: ~40 citiri mutate pe per-env + endpoint `POST /v1/conturi/rar-creds` devine env-aware + DROP cu garda assert-copiere, SQLite 3.45). 13 stories / 6 valuri. Idempotenta include `rar_env`; worker sesiuni per `(account_id, rar_env)`; reconciliere pe env-ul submission-ului. **LIVRAT 2026-07-02**: toate 13 stories implementate TDD prin subagenti sonnet (Opus coordoneaza + verifica + commit; git interzis subagentilor; commit dupa fiecare story). Comituri: US-008 `1648960` (config doua medii + confirmare Productie unica L.142), US-011 `d1978e2` (statusbar indicator + toggle la >=2 medii + retragere badge-env header pt logat), US-010 `0a1df31` (badge PRODUCȚIE/Testare + `labels.eticheta_env` + audit export + ecou GET), US-012 `3d3eb71` (audit `rar_env_activat/dezactivat/default_schimbat/blocat` + e2e ambele canale), US-013 `b1d825e` (retragere `accounts.rar_creds_enc`: ~15 citiri mutate pe per-env + `POST/DELETE /v1/conturi/rar-creds` env-aware + DROP cu garda — 6a fara re-ADD, 6b fail-safe + sqlite>=3.35, 6c re-backfill, garda orfane, backup criptat, 6d PRAGMA; idempotenta boot verificata; `submissions.rar_creds_enc` neatinsa) + fix test stale `3eaf1ca`. VERIFY: `pytest -q -m "not live"` **1455 passed, 1 deselected (live)**; cele 3 esecuri sunt NE-legate de 5.20 (2 pre-existente `test_web_responsive` + 1 flake nocturn `test_web_status::test_granita_miez_noapte_local_ro` — compara boundary UTC-ziua-trecuta cu RO-now, esueaza in fereastra de dupa miezul noptii RO). grep `rar_creds_enc` in `app/` = doar `submissions`. Contract actualizat (`docs/api-rar-contract.md`). PRD: [prd-5.20](prd/prd-5.20-target-rar-test-productie.md). | ISTORIC: 2026-06-29 — 5.19 PLAN (bifa "Trimite automat la RAR" + coada tinuta/eliberare manuala). PRD prin `/prd` + `/autoplan` (CEO/Design/Eng/DX, voce unica — Codex la plafon pana 2026-07-18). Poarta premise: scop AMBELE (operational + testare), default OFF pastrat "pana devine stabil" (decizie user peste avertismentul de conformitate L.142 -> atenuari OBLIGATORII). Design: per-cont `accounts.auto_send_enabled` (default 0) + per-rand `submissions.held`; snapshot la ingestie la TOATE ~8 situri `status='queued'` printr-un `held_for_account()` (Eng a prins bug real: reactivarea `router.py:237` ocolea Auto OFF); `claim_one AND held=0`; rute web `/auto-send` (toggle, OFF->ON elibereaza in bloc cu confirmare tipata), `/trimite-toate`, `/trimitere/{id}/trimite-acum`. Crescut 6->10 stories: US-007 banner+`/metrics` coada imbatranita, US-008 retentie/purge held (gaura GDPR/L.142), US-009 fixturi teste (id=1 e schema-seeded) + audit, US-010 onestitate API (camp `held` pe `SubmissionResult`+GET, invariant 5.7). 26 taskuri (14 P1). Taste rezolvate cu user: eticheta "Trimite automat la RAR" (coliziune cu "Trimitere automata" worker); testarea sigura (rar_env/`/valideaza`) NEangajata ("doar tinut") -> TODOS. PRD: [prd-5.19](prd/prd-5.19-auto-send-manual-coada.md). NEIMPLEMENTAT. | ISTORIC: 2026-06-29 — 5.18 LIVRAT + VERIFY PASS + CLOSE (corpus k-NN exemple etichetate, pe `feat/5.18-corpus-knn-exemple-etichetate`). Cele 7 stories (US-001..007, inclusiv badge sursa) implementate TDD; seed real **17181 operatii** produs cu subagenti Haiku (blocantul GPU LM Studio rezolvat fara GPU — abatere documentata de la D4, validare Haiku>>Groq la dezacorduri); SILVER populat in productie (era gol); embeddings k-NN pe corpusul etichetat (nu pe cele 18 categorii generice); pre-filtru NUL + precedenta NUL>GOLD>exact>k-NN; badge `confirmat`/`similar`/`non-operatie` pe sugestia fuzzy in editor. VERIFY context curat **1392 passed, 1 deselected (live)** + smoke seeder (17181/NUL=2200/idempotent) + E2E render live badge-uri. `/code-review high` (3 finder x 8 unghiuri): runtime curat, invariant #13 intact, 3 findings cosmetice REPARATE+lock-uite. Commit-uri `756f777`+`308fee6`. PRD: [prd-5.18](prd/prd-5.18-corpus-knn-exemple-etichetate.md). | ISTORIC: 2026-06-29 — 5.16 + 5.17 LIVRAT + VERIFY PASS + COMMIT (`c9f9a1c` pe `feat/5.16-5.17-design-tiers`, nepush-uit). Doua PRD-uri in paralel printr-un agent team (lead orchestreaza, NU scrie cod; teammates Sonnet pe valuri cu fisiere disjuncte; `base.html`/`routes.py`/`_status.html`/`landing.html` serializate ca fisiere fierbinti), 5 valuri / 8 lane-uri: W1-A model 5.17 ∥ W1-B bug-fix chips 5.16 → W2 base.html (fonturi system-stack + scala `--fs-*` + dot RAR + antet ROMFAST + /login brandeit + selector tema + fix Renunta) → W3 enforcement 5.17 ∥ W4-B landing copy ∥ W4-C wizard import → W4-A UI plan → W5 verify. **5.16**: system font stack (zero `@font-face`/`/static/fonts/`, IBM Plex scos — decizie user), scala uniforma in tokeni, contoare separate desktop + bara compacta mobil, antet branded + nume service + badge plan, cele 4 bug-uri chips reparate (picker cod+denumire, add_extra mod operatii, cod ales salvat fara „+", Renunta inchide via `closest`), wizard colapsat + landing Autentificare->/login. **5.17**: `accounts.tier`+`trial_until` (migrare aditiva defensiva) + `app/plans.py` sursa unica (`FREE_MONTHLY_LIMIT=60`, `effective_tier` cu `now` injectabil, `monthly_usage`, `CONSUMED_STATUSES`), trial Pro 30z la creare, CLI `set-tier`, enforcement DUR INAINTE de `build_key` (volum 60 + gate API Pro+, erori 3-niveluri `PLAN_LIMITA_LUNARA`/`PLAN_FARA_API` + `log_event`; `valideaza`/`nomenclator` permise; downgrade lazy; flag `AUTOPASS_ENFORCE_PLANS` kill-switch), UI plan (badge antet + linie burger + consum N/60 + warn>=80% + 6 stari + banner one-time trial->Gratuit + pagina Cont). Regresie autoritara **1380 passed, 0 failed, 1 deselected (live)**; E2E browser real (Playwright 390/1280, logat): /login brandeit, dashboard antet+contoare+dot RAR, burger cu separatoare + RAR + plan. **1 defect prins DOAR de E2E** (invizibil la TestClient): contoare duplicate pe 390px — inline `style="display:flex"` pe `.contoare-desktop` batea `@media` -> mutat in CSS + test-lock. Backend trimitere (worker/masina stari/idempotenta/contract RAR) + `mapping`/`validation` NEATINS. **Igiena commit (decizie user): doar 5.16/5.17** — lucrul paralel 5.18 (corpus kNN: `mapping.py`/`embeddings.py`/`operatii_seed.py`/`tools/mapare-llm/*`/`prd-5.18` + teste corpus, plus `config.py`/`db.py` partial si `conftest.py`/`test_mapare_integrare_l14.py` cuplate) lasat NECOMIS; separare verificata prin worktree izolat la HEAD (booteaza + 69 teste verzi fara niciun fisier 5.18). PRD: [prd-5.16](prd/prd-5.16-tipografie-uniforma-bugfix-editare.md), [prd-5.17](prd/prd-5.17-tipuri-cont-planuri-trial.md). | ISTORIC: 2026-06-28 — 5.16 + 5.17 PLAN: autoplan review rulat in paralel pe ambele PRD-uri (2 agenti Opus; faze CEO/Design/Eng pe 5.16, CEO/Design/Eng/DX pe 5.17), single-voice (Codex la plafon de utilizare pana 2026-07-18, fara consens cross-model). Portile umane inchise cu user: **5.16** User Challenge -> system-ui (scoate IBM Plex self-hostat; risc per-OS + design slop acceptat constient), pre-ship teste Eng E1/E3; **5.17** User Challenge -> enforcement DUR direct de la deploy (CRITICAL GAP migrare legacy = MOOT, pre-productie/fara conturi legacy) + flag `AUTOPASS_ENFORCE_PLANS` optional + 3 taste decisions rezolvate (limita 60 = constanta config; banner one-time trial->Gratuit; `valideaza` dry-run permis pe orice plan). Ambele: 0 decizii deschise, gata de implementare; audit trail + GSTACK REVIEW REPORT scrise in fisierele PRD; niciun commit/push. | ISTORIC: 2026-06-28 — 5.15 + 5.14 IMPLEMENTATE + VERIFY PASS + CLOSE (asteapta confirmare commit). Doua PRD-uri in paralel pe `feat/5.15-propagare-design` (5.15 = propagare design + dashboard editare, 12 stories; 5.14 = mapare LLM distilata, 6 stories). `/code-review high` -> 8 buguri reale reparate TDD (modal rand slim, `/repune` trunchia prestatii, picker chips gol pe re-render, obs re-derivat dupa stergere, GOLD poluat cu cod_op_service, typo `nume_prestatie`, bucketare timp `+3h` gresita iarna -> `localtime`+TZ). Decizie user la CLOSE: **embeddings wire-uit functional** (corpus din nomenclator, gated `AUTOPASS_EMBEDDINGS_ENABLED` default off; era „mort dar scump") + corectie marime model ~50MB->~230MB (estimare PRD gresita). Regresie **1256 passed, 1 deselected (live)**. Backend trimitere (worker/masina stari/idempotenta/contract RAR) NEATINS; embeddings/shared store = suggestion-only (nu intra in enqueue). PRD: [prd-5.15](prd/prd-5.15-propagare-design-dashboard-editare.md), [prd-5.14](prd/prd-5.14-mapare-llm-distilata.md). | ISTORIC: 2026-06-27 — 5.13 IMPLEMENTAT + VERIFY PASS (asteapta confirmare commit). Responsive compact (mobil/tableta) + sistem de butoane + design.md, prin agent team (lead orchestreaza, NU scrie cod; teammates Sonnet pe valuri cu fisiere disjuncte; `base.html` serializat ca fisier fierbinte). Wave 0 BLOCANT (cauza probabila a revert-ului anterior, prinsa de eng review): cele 2 teste responsive feliau ferestre fixe `[idx:idx+5000]` de la PRIMUL `@media (max-width:767px)` -> rescrierea cardului impingea regulile (`min-height:0`/`100vw`) peste fereastra si pica fals; refacut sa ancoreze pe un SENTINEL CSS (`SENTINEL-TESTE-MOBIL`) + slice pana la sfarsitul `` (ar fi terminat elementul `` (ar fi terminat elementul `