refactor: comentarii strict functionale, fara referinte PRD/stories
Curatare globala a comentariilor si docstring-urilor (app, tools, teste, scripturi): eliminate referintele la PRD-uri, US-xxx, task-uri istorice si review-uri; pastrata doar informatia functionala, formulata scurt. Regula adaugata in CLAUDE.md (sectiunea Stil). Fara modificari de cod sau comportament. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Backup online SQLite (T7) — copie consistenta a bazei pe volum persistent.
|
||||
"""Backup online SQLite — copie consistenta a bazei pe volum persistent.
|
||||
|
||||
SQLite in WAL NU se copiaza sigur cu `cp` (WAL-ul poate avea tranzactii necheckpoint-ate).
|
||||
Folosim API-ul `Connection.backup` (online, consistent, fara oprirea worker-ului).
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
"""CLI carantina randuri tinute — atenuare hazard de rollback (PRD 5.19 Riscul R4).
|
||||
"""CLI carantina randuri tinute — atenuare hazard de rollback.
|
||||
|
||||
Daca se face revert pe cod DUPA ce randuri au primit `held=1`, worker-ul pierde
|
||||
filtrul `AND held=0` din `claim_one` -> ar trimite TOATE randurile tinute la RAR
|
||||
@@ -40,7 +40,7 @@ def carantina(conn: sqlite3.Connection, dry_run: bool = False) -> int:
|
||||
Seteaza si `purge_after` (retentia randurilor blocate, `blocked_retention_days`): fara
|
||||
el un rand `error` iesit din `queued` NU primeste niciodata purge_after -> PII criptat
|
||||
ar sta la nesfarsit (`purge_expired` sterge doar randuri cu purge_after setat). Aliniat
|
||||
cu calea normala worker `error` (/code-review #4).
|
||||
cu calea normala worker `error`.
|
||||
"""
|
||||
n = _count(conn)
|
||||
if dry_run or n == 0:
|
||||
@@ -56,7 +56,7 @@ def carantina(conn: sqlite3.Connection, dry_run: bool = False) -> int:
|
||||
|
||||
def main(argv: list[str] | None = None) -> int:
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Carantineaza randurile tinute (queued AND held=1) inainte de un revert de cod (PRD 5.19 R4)."
|
||||
description="Carantineaza randurile tinute (queued AND held=1) inainte de un revert de cod."
|
||||
)
|
||||
parser.add_argument(
|
||||
"--dry-run", action="store_true",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Import DBF ROAAUTO -> SQLite gateway (T5).
|
||||
"""Import DBF ROAAUTO -> SQLite gateway.
|
||||
|
||||
Plan.md sect. 7: dry-run + raport intai (randuri valide, mapari orfane, coduri
|
||||
necunoscute in nomenclator), apoi scrie in SQLite. Surse:
|
||||
@@ -217,7 +217,7 @@ def run(
|
||||
|
||||
|
||||
def main(argv: list[str] | None = None) -> int:
|
||||
parser = argparse.ArgumentParser(description="Import DBF ROAAUTO -> SQLite gateway (T5)")
|
||||
parser = argparse.ArgumentParser(description="Import DBF ROAAUTO -> SQLite gateway")
|
||||
parser.add_argument("--commit", action="store_true", help="scrie in SQLite (implicit: doar raport)")
|
||||
parser.add_argument("--account-id", type=int, default=DEFAULT_ACCOUNT_ID, help="cont tinta pentru mapari")
|
||||
parser.add_argument("--mapare", type=Path, default=MAPARE_DBF, help="cale mapare_prestatii.DBF")
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
"""Etichetator offline operatii service -> coduri RAR (US-002, PRD 5.18).
|
||||
"""Etichetator offline operatii service -> coduri RAR.
|
||||
|
||||
Backend implicit = **LM Studio local** (Qwen3-4B, GPU RX 6600M via Tailscale),
|
||||
backend-ul APROBAT pentru bootstrap-ul v1 (decizia D4). Groq / OpenRouter raman
|
||||
fallback-uri interschimbabile, dar NU sunt calea aprobata pentru v1.
|
||||
Backend implicit = **LM Studio local** (Qwen3-4B, GPU RX 6600M via Tailscale).
|
||||
Groq / OpenRouter raman fallback-uri interschimbabile, dar nu backend-ul implicit.
|
||||
|
||||
Particularitati care justifica un tool NOU (nu reuse de `or_common.call`):
|
||||
- LM Studio RESPINGE `response_format: json_object` (eroare 400). Cere envelope
|
||||
@@ -12,12 +11,12 @@ Particularitati care justifica un tool NOU (nu reuse de `or_common.call`):
|
||||
- Qwen3 emite `<think>...` daca nu dezactivam thinking-ul -> umfla tokeni/latenta
|
||||
sub structured output strict. Punem `/no_think` in promptul de sistem.
|
||||
|
||||
Setari conservatoare OBLIGATORII pe GPU-box (a facut shutdown sub sarcina 2026-06-29,
|
||||
Setari conservatoare OBLIGATORII pe GPU-box (a facut shutdown sub sarcina,
|
||||
probabil termic/alimentare): in LM Studio incarca modelul cu `n_parallel=1`,
|
||||
`n_ctx=4096`, batch 32-40, monitorizeaza temperatura. NU mari batch/context fara
|
||||
headroom termic. Vezi memorie `lmstudio-gpu-etichetare`.
|
||||
headroom termic.
|
||||
|
||||
Reutilizeaza din `or_common`: scrub-ul PII (F3) si lista de coduri.
|
||||
Reutilizeaza din `or_common`: scrub-ul PII si lista de coduri.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
"""Generare seed etichetat operatie->cod (US-003, PRD 5.18).
|
||||
"""Generare seed etichetat operatie->cod.
|
||||
|
||||
Produce artefactul `app/data/operatii-etichetate.json` (comis in repo), consumat de
|
||||
seeder (US-004) si de corpusul embeddings (US-005). NU cheama LLM la runtime — o
|
||||
singura data, offline, pe LM Studio (backend implicit, D4).
|
||||
seeder si de corpusul embeddings. NU cheama LLM la runtime — o singura data,
|
||||
offline, pe LM Studio (backend implicit).
|
||||
|
||||
Pipeline dedup OBLIGATORIU, in ordine, INAINTE de orice apel LLM (D5):
|
||||
1. Agrega cele N CSV-uri -> freq pe denumire RAW (NR ne-numeric -> skip rand, F9).
|
||||
Pipeline dedup OBLIGATORIU, in ordine, INAINTE de orice apel LLM:
|
||||
1. Agrega cele N CSV-uri -> freq pe denumire RAW (NR ne-numeric -> skip rand).
|
||||
2. `cheie = normalize_for_match(denumire)` (ACEEASI functie ca DB/k-NN, NU strip exact).
|
||||
Arunca randurile cu `cheie == ""` inainte de dedup (coliziune pe slot UNIQUE gol, F6).
|
||||
Arunca randurile cu `cheie == ""` inainte de dedup (coliziune pe slot UNIQUE gol).
|
||||
3. Dedup pe cheie: un reprezentant per cheie, `freq = suma NR`.
|
||||
4. Harta `cheie -> cod` din TOATE etichetele existente: `labels-groq-partial.json` (cheiat
|
||||
brut) + seedul comis anterior (cheiat normalizat). Conflict (acelasi cheie, coduri diferite
|
||||
pe variante raw) -> castiga codul cu freq-max, tie-break pe cod sortat (F3).
|
||||
pe variante raw) -> castiga codul cu freq-max, tie-break pe cod sortat.
|
||||
5. `de_etichetat = corpus(in prag) - harta`. Sortat desc pe freq = SINGURUL input la LLM.
|
||||
|
||||
Idempotenta cross-run (F2/F7): seedul comis = cache de etichete -> re-run = 0 apeluri LLM.
|
||||
Idempotenta cross-run: seedul comis = cache de etichete -> re-run = 0 apeluri LLM.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
"""Harness de evaluare held-out pentru sistemul de mapare operatii->coduri RAR.
|
||||
|
||||
Scop (L14-S5, Decision #19 PRD 5.14):
|
||||
Scop:
|
||||
Masurarea ACURATETEI REALE a clasificatorului inainte de a permite orice tier
|
||||
auto-send peste GOLD propriu.
|
||||
|
||||
@@ -19,12 +19,11 @@ Continut:
|
||||
exclusiv responsabilitatea operatorului.
|
||||
3. eval_predictions() — date (predictii, gold) -> precizie globala + per-cod
|
||||
+ matrice confuzie + rata cod-gresit.
|
||||
4. kill_criterion() — evalueaza daca sistemul indeplineste pragul de acceptanta
|
||||
(F-E, PRD 5.14).
|
||||
4. kill_criterion() — evalueaza daca sistemul indeplineste pragul de acceptanta.
|
||||
|
||||
Ce NU face:
|
||||
NU eticheteaza ground-truth-ul. Etichetarea de cod ar fi exact "antrenare pe test"
|
||||
si ar invalida precizia raportata (Decision #19). Fisierul exportat se completeaza
|
||||
si ar invalida precizia raportata. Fisierul exportat se completeaza
|
||||
MANUAL de operatorul uman.
|
||||
|
||||
CLI:
|
||||
@@ -71,10 +70,10 @@ DEFAULT_SEED = 42
|
||||
_STRAT_HEAD_END_PCT = 0.20
|
||||
_STRAT_MID_END_PCT = 0.50 # head+mid = 50%, deci mid = 30%
|
||||
|
||||
# Kill-criterion (F-E, PRD 5.14):
|
||||
# Kill-criterion:
|
||||
#
|
||||
# DEFAULT_WRONG_CODE_THRESHOLD = 0.005 (0.5%)
|
||||
# Justificare: un cod gresit = FINALIZATA ireversibila la RAR (Premisa 3).
|
||||
# Justificare: un cod gresit = FINALIZATA ireversibila la RAR.
|
||||
# La 200 operatii/zi auto-rezolvate cu 0.5% rata gresita = 1 FINALIZATA
|
||||
# gresita/zi, ceea ce depaseste toleranta operationala acceptabila.
|
||||
# Pragul poate fi RELAXAT empiric pe baza de date reale; NU inasprit post-hoc.
|
||||
@@ -98,7 +97,7 @@ def sample_stratified(
|
||||
) -> list[dict]:
|
||||
"""Esantionare stratificata aleatorie pe trei strate Zipf: cap/mijloc/coada.
|
||||
|
||||
Determinista cu seed; NU apeleaza LLM (PRD L14-S5).
|
||||
Determinista cu seed; NU apeleaza LLM.
|
||||
|
||||
rows: lista de (denumire, nr) — frecventele absolute.
|
||||
Nu trebuie sortata in prealabil.
|
||||
@@ -182,7 +181,7 @@ def export_for_labeling(sample: list[dict], path: str) -> None:
|
||||
|
||||
Coloana `cod_gold` ramane GOALA in fisierul exportat.
|
||||
NU o completa cu etichete LLM sau automate: ar fi "antrenare pe test"
|
||||
si ar invalida precizia raportata (Decision #19, PRD 5.14).
|
||||
si ar invalida precizia raportata.
|
||||
|
||||
sample: lista de {denumire, nr, strat} returnata de sample_stratified()
|
||||
path: fisierul CSV de scris (suprascrie daca exista)
|
||||
@@ -323,7 +322,7 @@ def eval_predictions(
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Kill-criterion (F-E, PRD 5.14)
|
||||
# Kill-criterion
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def kill_criterion(
|
||||
@@ -331,7 +330,7 @@ def kill_criterion(
|
||||
wrong_code_threshold: float = DEFAULT_WRONG_CODE_THRESHOLD,
|
||||
coverage_threshold: float = DEFAULT_COVERAGE_THRESHOLD,
|
||||
) -> dict:
|
||||
"""Evalueaza daca sistemul de clasificare indeplineste pragul de acceptanta (F-E).
|
||||
"""Evalueaza daca sistemul de clasificare indeplineste pragul de acceptanta.
|
||||
|
||||
Sistemul TRECE daca:
|
||||
wrong_code_rate < wrong_code_threshold (implicit 0.5%)
|
||||
@@ -339,7 +338,7 @@ def kill_criterion(
|
||||
coverage_rate > coverage_threshold (implicit 50%)
|
||||
|
||||
Un sistem care nu trece kill-criterion NU trebuie folosit pentru auto-send
|
||||
dincolo de GOLD propriu (Decision #19, #17, PRD 5.14).
|
||||
dincolo de GOLD propriu.
|
||||
|
||||
metrics: dict returnat de eval_predictions() sau compatibil
|
||||
(must have keys: wrong_code_rate, coverage_rate).
|
||||
@@ -375,7 +374,7 @@ def kill_criterion(
|
||||
elif not cond_wrong_code:
|
||||
reason = (
|
||||
f"ESUEAZA: rata cod-gresit {wcr:.2%} >= {wrong_code_threshold:.2%}. "
|
||||
f"Un cod gresit = FINALIZATA ireversibila la RAR (Premisa 3, PRD 5.14). "
|
||||
f"Un cod gresit = FINALIZATA ireversibila la RAR. "
|
||||
f"Auto-send dincolo de GOLD dezactivat pana la recalibrat."
|
||||
)
|
||||
else:
|
||||
@@ -442,7 +441,7 @@ def _load_corpus_from_csvs(data_dir: str) -> list[tuple[str, int]]:
|
||||
def _print_report(metrics: dict) -> None:
|
||||
sep = "=" * 70
|
||||
print(sep)
|
||||
print("RAPORT EVALUARE HELD-OUT (L14-S5, PRD 5.14)")
|
||||
print("RAPORT EVALUARE HELD-OUT")
|
||||
print(sep)
|
||||
print(f" Total intrari evaluate: {metrics['total']}")
|
||||
print(f" Corecte: {metrics['correct']}")
|
||||
@@ -480,7 +479,7 @@ def main() -> None:
|
||||
import argparse
|
||||
|
||||
p = argparse.ArgumentParser(
|
||||
description="Harness eval held-out L14-S5 (PRD 5.14).",
|
||||
description="Harness eval held-out pentru mapare operatii->coduri RAR.",
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
epilog="""
|
||||
Moduri de utilizare:
|
||||
@@ -559,7 +558,7 @@ Moduri de utilizare:
|
||||
print(" '?' = incert (clasificatorul nu poate decide)")
|
||||
print()
|
||||
print(" ATENTIE: NU folosi etichete LLM drept cod_gold!")
|
||||
print(" Asta ar fi 'antrenare pe test' (Decision #19, PRD 5.14) si ar")
|
||||
print(" Asta ar fi 'antrenare pe test' si ar")
|
||||
print(" invalida orice masurare de acuratete.")
|
||||
|
||||
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
"""Etichetator batch offline OpenRouter (Layer 1) — L14-S1.
|
||||
"""Etichetator batch offline OpenRouter (Layer 1).
|
||||
|
||||
Clasifica denumirile de operatii service in cele 18 coduri RAR + NUL.
|
||||
|
||||
Cerinte implementate (PRD 5.14 / Decision Audit Trail):
|
||||
Cerinte implementate:
|
||||
1. Prioritizare pe FRECVENTA (desc): corpus_by_freq() din or_common
|
||||
2. Grupare pe similaritate (rapidfuzz token_sort_ratio, threshold conservator
|
||||
Eng-F7): LLM eticheteaza doar reprezentantul, codul se propaga la grup
|
||||
3. Ensemble NVIDIA (super-120b + nano-9b, PRD #9): acord unanim -> high;
|
||||
2. Grupare pe similaritate (rapidfuzz token_sort_ratio, threshold conservator):
|
||||
LLM eticheteaza doar reprezentantul, codul se propaga la grup
|
||||
3. Ensemble NVIDIA (super-120b + nano-9b): acord unanim -> high;
|
||||
dezacord (orice divergenta) -> needs_mapping. Vot pe coduri, nu pe
|
||||
self-confidence. ultra-550b EXCLUS (4-5x mai lent, zero castig)
|
||||
4. Scrub PII (F3): integrat in or_common.call() (regex nr inmatriculare/VIN)
|
||||
4. Scrub PII: integrat in or_common.call() (regex nr inmatriculare/VIN)
|
||||
5. Resumabil: scrie *-partial.json incremental, reia de unde a ramas;
|
||||
retry/backoff pe 429 gestionat de or_common.call()
|
||||
6. Output: {denumire, cod, sursa, confidence, grup_rep}
|
||||
NUL = ancore negativa + supresie, NU promovat la cod RAR (#4)
|
||||
NUL = ancore negativa + supresie, NU promovat la cod RAR
|
||||
|
||||
CLI: python3 tools/mapare-llm/or_label.py [N] [--out path] [--partial path]
|
||||
[--threshold 85] [--batch 20] [--pace 4.0]
|
||||
@@ -28,7 +28,7 @@ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
import or_common as oc
|
||||
from rapidfuzz import fuzz
|
||||
|
||||
# Modele NVIDIA (decizie PRD #9: pastram super-120b + nano-9b; aruncam ultra-550b)
|
||||
# Modele NVIDIA: pastram super-120b + nano-9b; aruncam ultra-550b
|
||||
MODELS = [
|
||||
"nvidia/nemotron-3-super-120b-a12b:free",
|
||||
"nvidia/nemotron-nano-9b-v2:free",
|
||||
@@ -85,8 +85,8 @@ def ensemble_vote(votes):
|
||||
- Toate N modele cu acelasi cod valid -> (cod, "high", "ensemble-unanim")
|
||||
- Toate N modele cu "NUL" -> ("NUL", "high", "ensemble-unanim-nul")
|
||||
- Orice divergenta / parse-fail partial -> ("?", "needs_mapping", "ensemble-dezacord")
|
||||
Vot pe coduri, NU pe self-confidence (PRD #10, Eng-F7).
|
||||
NUL tratat SEPARAT: ancore negativa, nu e cod RAR (#4).
|
||||
Vot pe coduri, NU pe self-confidence.
|
||||
NUL tratat SEPARAT: ancore negativa, nu e cod RAR.
|
||||
|
||||
Intoarce: (cod_final, confidence, sursa)
|
||||
cod_final: cod RAR valid | "NUL" | "?" (needs human review)
|
||||
|
||||
Reference in New Issue
Block a user