29 KiB
VERDICT ALIGNMENT PLAN
Plan complet de aliniere PG ↔ Redis ↔ Cod pentru tot sistemul de verdict.
Regula de aur: PG = source of truth. Redis = cache rapid. Cod = zero hardcodari (doar defaults de fallback). Flow: Admin Dashboard → CRUD PG (didiFramework) → Sync Redis → agent-v3 citeste din Redis.
1. INVENTAR ACTUAL — UNDE E FIECARE PARAMETRU
VERDE — Aliniat PG ↔ Redis ↔ UI (functioneaza corect)
| # | Parametru | PG tabel | Redis cheie | UI | agent-v3 citeste din |
|---|---|---|---|---|---|
| 1 | Verdict categories (ranges, culori) | verdict_category |
didi:framework:verdicts |
FrameworkDashboard | Redis |
| 2 | Risk mappings (ranges) | risk_mapping |
didi:framework:verdicts |
FrameworkDashboard | Redis |
| 3 | Severity (ranges + actiuni) | severity_assessment |
didi:framework:verdicts |
FrameworkDashboard | Redis |
| 4 | Component weights (35/25/20/10/10) | component_weight |
didi:framework:weights |
FrameworkDashboard | Redis |
| 5 | Weight scenarios | weight_scenario |
didi:framework:weights |
FrameworkDashboard | Redis |
| 6 | Topic multipliers | multiplier |
didi:framework:weights |
FrameworkDashboard | Redis |
| 7 | Claim statuses (VT, LT, UV...) | claim |
didi:framework:claims |
FrameworkDashboard | Redis |
| 8 | Claim types (VF, SC, QA...) | claim_type |
didi:framework:claims |
FrameworkDashboard | Redis |
| 9 | Claim confidence levels | confidence |
didi:framework:claims |
FrameworkDashboard | Redis |
| 10 | Claim interpretations | interpretation |
didi:framework:claims |
FrameworkDashboard | Redis |
| 11 | LLM stage assignments | component_stage_assignment |
didi:config:*:stage_assignments |
LLMComponentsConfig | Redis |
| 12 | LLM prompts | component_prompt |
didi:config:*:prompts:* |
LLMComponentsConfig | Redis |
| 13 | LLM available models | derivat din assignments | didi:config:*:available_models |
LLMComponentsConfig | Redis |
| 14 | Platforms (social media) | platform |
didi:framework:sources |
FrameworkDashboard | Redis |
| 15 | Source credibility params | source_credibility + altele |
didi:framework:sources |
FrameworkDashboard | Redis |
| 16 | Techniques hierarchy | dimension/subdimension/technique/indicator |
didi:framework:techniques |
FrameworkDashboard | Redis |
Total: 16 parametri complet aliniati. Functionale, cu UI, cu sync.
GALBEN — Exista in Redis dar NU in PG (puse manual, fara persistenta)
Mecanismul component_config (tabel PG) → didi:config:* (Redis) exista in sync-redis.ts (linia 576-583).
Dar nimeni nu a inserat randurile in PG. Cheile au fost puse direct in Redis manual.
| # | Redis cheie | Continut (rezumat) | In PG? | In UI? | Risc |
|---|---|---|---|---|---|
| 17 | didi:config:techniques:v3:scoring_config |
countBonus, dimensionBonus, intensityBonus, manipulation_levels, warning_flags | NU | NU | Se pierde daca Redis se sterge |
| 18 | didi:config:techniques:v3:coupling_registry |
Coupling config | NU | NU | |
| 19 | didi:config:techniques:v3:schemas:* (3 chei) |
Zod schemas export | NU | NU | |
| 20 | didi:config:techniques:v3:dimensions_compact |
Dimensiuni compacte pt screening | NU | NU | Derivabil din techniques hierarchy |
| 21 | didi:config:ai-tampered:v1:scoring_config |
thresholds (70/50/30), disclosure_impact (0.3/0.5/0.7/1.0), category_weights, confidence_levels | NU | NU | Se pierde |
| 22 | didi:config:ai-tampered:v1:categories_compact |
Categorii AI compacte pt screening | NU | NU | |
| 23 | didi:config:ai-tampered:v1:indicators_hierarchy |
Categorii + indicatori AI | NU | NU | |
| 24 | didi:config:ai-tampered:v1:quick_patterns |
Hedging patterns (regex) | NU | NU | |
| 25 | didi:config:ai-tampered:v1:coupling_registry |
Coupling config AI | NU | NU | |
| 26 | didi:config:ai-tampered:v1:schemas:* (3 chei) |
Zod schemas AI | NU | NU | |
| 27 | didi:config:ai-tampered:v1:vision_models |
Cascade viziune (Qwen→Gemini→GPT-4o) | NU | NU | |
| 28 | didi:config:claims:v1:scoring_config |
status_thresholds, claim_type_weights, source_reliability_weights | NU | NU | Se pierde |
| 29 | didi:config:pipeline:v1:verdict_config |
synergy, overrides, confidence, confidence_levels | NU | NU | Se pierde — CRITIC |
| 30 | didi:config:pipeline:v1:component_config |
Components enabled/disabled, applies_to, timeouts | NU | NU | Se pierde |
| 31 | didi:config:pipeline:v1:session_config |
Session config | NU | NU | |
| 32 | didi:config:pipeline:v1:external_apis |
API URLs externe | NU | NU | |
| 33 | didi:config:pipeline:v1:prompts:verdict_explanation |
Prompt verdict reviewer | NU | NU | |
| 34 | didi:config:vision:v1:prompts:extraction |
Prompt Vision OCR | NU | NU | |
| 35 | didi:config:vision:v1:prompts:video_frames |
Prompt Vision video frames | NU | NU | |
| 36 | didi:config:vision:v1:prompts:ai_detection |
Prompt Vision AI detection | NU | NU | |
| 37 | didi:config:verdict:v1:available_models |
Modele LLM verdict reviewer | NU | NU | |
| 38 | didi:config:source-assessment:v1:available_models |
Modele LLM source assessment | NU | NU |
Total: 22 parametri (unele cu sub-chei) in Redis fara PG. RISC: se pierd la orice Redis flush/restart fara persistenta.
ROSU — Hardcodat DOAR in cod (nici PG, nici Redis)
| # | Parametru | Fisier | Valoare actuala | Ar trebui in |
|---|---|---|---|---|
| 39 | Count scaler divisor | techniques/executor.ts:614 |
3 (1 tech=33%) |
techniques.scoring_config |
| 40 | Severe technique threshold | techniques/executor.ts:686 |
severity >= 8 |
techniques.scoring_config |
| 41 | Intensity bonus formula | techniques/executor.ts:635 |
min(0.15, sqrt(x-1)*0.05) |
techniques.scoring_config (codul sa citeasca parametrii, nu formula string) |
| 42 | AI blend screening/deep | ai-tampered/executor.ts:705 |
0.6 / 0.4 |
ai-tampered.scoring_config |
| 43 | AI undisclosed threshold | ai-tampered/executor.ts:725 |
>= 50 |
ai-tampered.scoring_config |
| 44 | AI disclosure rating vals | ai-tampered/executor.ts:792-798 |
80/40/25/+15/+5 |
Inlocuit de disclosure_impact din Redis #21 |
| 45 | AI quick analyze scores | ai-tampered/executor.ts:378-410 |
+10/+30/+15/+40/+25 |
ai-tampered.scoring_config.quick_scores |
| 46 | Source axis weights | source-assessment/executor.ts:110-113 |
0.35/0.25/0.25/0.15 |
source-assessment.scoring_config (NOU) |
| 47 | Source verdict thresholds | source-assessment/executor.ts:296-299 |
70/50/30 |
source-assessment.scoring_config (NOU) |
| 48 | Video track weights | component-worker.ts |
0.40/0.60 |
pipeline.component_config |
| 49 | Video min text chars | component-worker.ts |
200 |
pipeline.component_config |
| 50 | Claims status weights | claims/executor.ts:681-688 |
VT=1.0,LT=0.75,UV=0.5,... |
claims.scoring_config.status_weights (exista partial in Redis dar codul NU citeste) |
| 51 | Claims "all UV = 75%" | claims/executor.ts:673 |
0.75 |
claims.scoring_config.all_unverified_credibility |
| 52 | Input profiles per type | NICAIERI | nu exista | pipeline.input_profiles (NOU) |
| 53 | INCONCLUSIVE rules | verdict-calculator.ts:321-337 |
3 if-uri | pipeline.input_profiles (NOU) |
| 54 | Context = -1 always | verdict-calculator.ts:448 |
-1 |
ELIMINAT din formula |
Total: 16 parametri hardcodati in cod.
DIVERGENTE — Acelasi parametru cu valori diferite in Redis vs Cod
| # | Parametru | In Redis | In Cod | Codul citeste din |
|---|---|---|---|---|
| D1 | Claims status weights | Redis: claim_type_weights: {EF:0.95, VF:0.85...} (tip → weight) |
Cod: {VT:1.0, LT:0.75, UV:0.5...} (status → weight) |
COD — sunt concepte DIFERITE, nu duplicate |
| D2 | Intensity bonus | Redis: formula: "(avg_intensity - 1) * 0.05" (string, neexecutat) |
Cod: min(0.15, sqrt(x-1)*0.05) (formula diferita!) |
COD — Redis are formula veche, codul are noua |
| D3 | Override false_claims | Redis: per_claim:5, max:20, threshold:3 |
Cod DEFAULT: per_claim:15, max:40, threshold:1 |
REDIS (codul citeste din Redis, defaults doar fallback) |
| D4 | Disclosure impact | Redis: explicit:0.3, partial:0.5, implied:0.7 |
Cod: doar undisclosed_ai: +15 override |
REDIS pt disclosure_impact, COD pt override bonus |
D3 e important: Redis are false_claims.per_claim=5 si max=20, dar codul DEFAULT are per_claim=15 si max=40. Daca Redis e disponibil → se folosesc valorile mici din Redis. Daca Redis e indisponibil → fallback la valorile mari din cod. Comportament inconsistent.
2. PLAN DE ALINIERE — FAZE DE IMPLEMENTARE
FAZA 0: Backup + Inventar (1 ora)
0.1 Export TOATE cheile Redis didi:config:* si didi:framework:* in JSON local
→ redis-cli --scan --pattern 'didi:*' | while read key; do echo "$key"; redis-cli -a redis123 GET "$key"; done > redis_backup.json
0.2 Verifica ca PG e accesibil si tabelele bos_parammgmt exista
→ psql → \dt bos_parammgmt.*
0.3 Lista randuri existente in component_config
→ SELECT * FROM bos_parammgmt.component_config ORDER BY component_code;
FAZA 1: Redis → PG (persistenta, fara schimbari de comportament)
Scop: Tot ce e in Redis dar nu in PG → inserat in component_config.
Impact: Zero — agent-v3 citeste tot din Redis, sync-redis le va rescrie identic.
Risc: Zero — doar adaugam randuri in PG.
1.1 Script SQL: INSERT INTO component_config pentru fiecare cheie Redis din sectiunea GALBEN
- Citeste din Redis, formateaza ca INSERT
- 22 INSERT-uri (unele cu JSONB mare)
1.2 Testeaza: POST /api/sync-redis → verifica ca Redis e identic dupa sync
- Compara output sync cu backup-ul de la 0.1
1.3 Randuri noi in component_config:
| component_code | config_key | sursa |
|---|---|---|
| techniques | scoring_config | din Redis didi:config:techniques:v3:scoring_config |
| techniques | coupling_registry | din Redis |
| techniques | schemas_screening | din Redis |
| techniques | schemas_deep_per_dimension | din Redis |
| techniques | schemas_complete | din Redis |
| ai-tampered | scoring_config | din Redis |
| ai-tampered | categories_compact | din Redis |
| ai-tampered | indicators_hierarchy | din Redis |
| ai-tampered | quick_patterns | din Redis |
| ai-tampered | coupling_registry | din Redis |
| ai-tampered | schemas_screening | din Redis |
| ai-tampered | schemas_deep_per_category | din Redis |
| ai-tampered | schemas_complete | din Redis |
| ai-tampered | vision_models | din Redis |
| claims | scoring_config | din Redis |
| pipeline | verdict_config | din Redis |
| pipeline | component_config | din Redis |
| pipeline | session_config | din Redis |
| pipeline | external_apis | din Redis |
| vision | prompts_extraction | din Redis (sau in component_prompt) |
| vision | prompts_video_frames | din Redis |
| vision | prompts_ai_detection | din Redis |
Nota: Prompturile vision pot merge in component_prompt (component_code='vision', stage_code='extraction/video_frames/ai_detection')
Nota: verdict_explanation prompt merge in component_prompt (component_code='verdict', stage_code='explanation')
Nota: source-assessment available_models si verdict available_models merg in component_stage_assignment
FAZA 2: Cod → Redis+PG (externalizare hardcodari)
Scop: Toate hardcodarile din sectiunea ROSU → adaugate in scoring_config (PG+Redis). Impact: Zero daca valorile sunt identice cu ce era hardcodat. Risc: Minim — codul citeste din Redis cu fallback la exact aceleasi valori.
2.1 Extinde techniques scoring_config in PG cu:
{
"count_scaler_divisor": 3,
"severe_threshold": 8,
"intensity_bonus_cap": 0.15,
"intensity_bonus_coefficient": 0.05,
"intensity_bonus_type": "sqrt" // sqrt | linear
}
Modifica techniques/executor.ts:
- Citeste count_scaler_divisor din scoringConfig (linia 614)
- Citeste severe_threshold din scoringConfig (linia 686)
- Citeste intensity params din scoringConfig (linia 635)
- Fallback la valorile actuale daca Redis e gol
2.2 Extinde ai-tampered scoring_config in PG cu:
{
"blend_weights": { "screening": 0.6, "deep": 0.4 },
"undisclosed_threshold": 50,
"quick_scores": { "hedging": 10, "self_reference": 30, "tool_mention": 15, "explicit_disclosure": 40, "partial_disclosure": 25 }
}
Modifica ai-tampered/executor.ts:
- Citeste blend_weights din scoringConfig (linia 705)
- Citeste undisclosed_threshold din scoringConfig (linia 725)
- Citeste quick_scores din scoringConfig (liniile 378-410)
2.3 Extinde claims scoring_config in PG cu:
{
"status_weights": { "VT": 1.0, "LT": 0.75, "UV": 0.5, "OP": 0.3, "LF": 0.25, "VF": 0.0 },
"all_unverified_credibility": 0.75,
"all_unverified_behavior": "fixed" // fixed | calculate_per_type
}
Modifica claims/executor.ts:
- Citeste status_weights din scoringConfig (linia 681)
- Citeste all_unverified din scoringConfig (linia 670-676)
2.4 Adauga source-assessment scoring_config (NOU) in PG:
{
"axis_weights": { "publication": 0.35, "domain": 0.25, "author": 0.25, "platform": 0.15 },
"verdict_thresholds": { "TRUSTED": 70, "NEUTRAL": 50, "SUSPICIOUS": 30 },
"domain_unavailable_default": 50
}
Modifica source-assessment/executor.ts:
- Citeste axis_weights din Redis (liniile 110-113)
- Citeste verdict_thresholds din Redis (liniile 296-299)
2.5 Extinde pipeline component_config in PG cu:
{
"video_track_weights": { "text": 0.40, "visual": 0.60 },
"video_min_text_chars": 200
}
Modifica component-worker.ts:
- Citeste video_track_weights din Redis
- Citeste video_min_text_chars din Redis
2.6 POST /api/sync-redis → toate valorile noi apar in Redis
2.7 Testeaza: ruleaza aceeasi analiza, scoruri identice (valorile sunt identice)
FAZA 3: Fix divergente + aliniere defaults
Scop: Rezolva cele 4 divergente (D1-D4). Defaults in cod = identice cu Redis. Impact: Mic — doar aliniaza valorile.
3.1 D2 (intensity formula): Actualizeaza Redis scoring_config cu formula noua:
"intensity_bonus_type": "sqrt",
"intensity_bonus_cap": 0.15,
"intensity_bonus_coefficient": 0.05
(sterge string-ul vechi "formula": "(avg_intensity - 1) * 0.05")
3.2 D3 (override false_claims): Decide valori canonice:
Propunere: per_claim=15, max=40, threshold=1 (valorile din cod, nu din Redis)
→ Actualizeaza Redis verdict_config.overrides.false_claims
→ Actualizeaza DEFAULT_VERDICT_CONFIG in verdict-calculator.ts sa fie identic
3.3 D4 (disclosure): disclosure_impact RAMINE in Redis (codul deja citeste de acolo)
Override undisclosed_ai RAMINE in verdict_config
Nu e divergenta — sunt mecanisme complementare
3.4 Actualizeaza TOATE DEFAULT_* in verdict-calculator.ts sa fie identice cu Redis:
- DEFAULT_VERDICTS ← sync cu PG verdict_category
- DEFAULT_WEIGHTS ← sync cu PG component_weight
- DEFAULT_VERDICT_CONFIG ← sync cu Redis verdict_config
FAZA 4: Tabele PG noi + migratie
Scop: Adauga structuri PG noi pentru input profiles si claims weights.
4.1 Migration SQL:
-- Input type profiles
CREATE TABLE bos_parammgmt.input_type_profile (
profile_id SERIAL PRIMARY KEY,
profile_code VARCHAR(30) UNIQUE NOT NULL,
profile_name VARCHAR(100) NOT NULL,
description TEXT,
weight_techniques INTEGER NOT NULL DEFAULT 25,
weight_claims INTEGER NOT NULL DEFAULT 25,
weight_ai_tampered INTEGER NOT NULL DEFAULT 25,
weight_source INTEGER NOT NULL DEFAULT 25,
role_techniques VARCHAR(20) DEFAULT 'secondary',
role_claims VARCHAR(20) DEFAULT 'secondary',
role_ai_tampered VARCHAR(20) DEFAULT 'secondary',
role_source VARCHAR(20) DEFAULT 'secondary',
min_components INTEGER DEFAULT 2,
primary_components TEXT[] DEFAULT '{}',
required_any TEXT[] DEFAULT '{}',
missing_techniques VARCHAR(30) DEFAULT 'redistribute',
missing_claims VARCHAR(30) DEFAULT 'redistribute',
missing_ai_tampered VARCHAR(30) DEFAULT 'redistribute',
missing_source VARCHAR(30) DEFAULT 'redistribute',
confidence_config JSONB DEFAULT '{}',
ai_disclosure_multipliers JSONB DEFAULT '{"explicit":0.15,"partial":0.4,"implied":0.6,"none":1.0}',
is_active BOOLEAN DEFAULT true,
parameter_id INTEGER REFERENCES bos_parammgmt.parameter(parameter_id)
);
-- Override rules per profile
CREATE TABLE bos_parammgmt.profile_override_config (
override_id SERIAL PRIMARY KEY,
profile_code VARCHAR(30) REFERENCES bos_parammgmt.input_type_profile(profile_code),
override_code VARCHAR(40) NOT NULL,
enabled BOOLEAN DEFAULT true,
threshold INTEGER,
bonus_per_unit INTEGER,
bonus_fixed INTEGER,
max_bonus INTEGER,
description TEXT,
UNIQUE(profile_code, override_code)
);
-- Override cap per profile (in input_type_profile)
ALTER TABLE bos_parammgmt.input_type_profile ADD COLUMN override_cap INTEGER DEFAULT 50;
-- Unverified weight per claim type
ALTER TABLE bos_parammgmt.claim_type ADD COLUMN unverified_weight NUMERIC(3,2) DEFAULT 0.50;
-- Credibility weight per claim status
ALTER TABLE bos_parammgmt.claim ADD COLUMN credibility_weight NUMERIC(3,2) DEFAULT 0.50;
4.2 Seed data — 6 profiluri:
INSERT INTO input_type_profile (profile_code, profile_name, weight_techniques, weight_claims, weight_ai_tampered, weight_source, role_techniques, role_claims, role_ai_tampered, role_source, primary_components, required_any, min_components) VALUES
('text_no_url', 'Text simplu', 35, 35, 15, 15, 'primary', 'primary', 'secondary', 'secondary', '{techniques,claims}', '{techniques,claims}', 2),
('text_with_url', 'Text cu URL', 25, 25, 15, 35, 'secondary', 'secondary', 'secondary', 'primary', '{source}', '{techniques,claims,source}', 2),
('image', 'Imagine', 20, 15, 50, 15, 'secondary', 'secondary', 'primary', 'secondary', '{ai_tampered}', '{ai_tampered}', 1),
('audio', 'Audio', 35, 30, 20, 15, 'primary', 'secondary', 'secondary', 'secondary', '{techniques}', '{techniques}', 1),
('video', 'Video', 25, 20, 40, 15, 'secondary', 'secondary', 'primary', 'secondary', '{ai_tampered}', '{ai_tampered}', 1),
('url', 'URL articol', 25, 25, 15, 35, 'secondary', 'secondary', 'secondary', 'primary', '{source}', '{techniques,claims,source}', 2);
4.3 Seed data — 48 override rules (8 × 6 profiluri):
(vezi VERDICT_UI_SPEC.md Tab 2 pentru valorile per profil)
4.4 Seed data — claim_type unverified_weight:
UPDATE claim_type SET unverified_weight = 0.25 WHERE claim_code IN ('VF', 'SC');
UPDATE claim_type SET unverified_weight = 0.30 WHERE claim_code = 'QA';
UPDATE claim_type SET unverified_weight = 0.35 WHERE claim_code = 'EF';
UPDATE claim_type SET unverified_weight = 0.40 WHERE claim_code IN ('CC', 'RE');
-- PC, OP, VC raman 0.50 (default)
4.5 Seed data — claim status credibility_weight:
UPDATE claim SET credibility_weight = 1.00 WHERE claim_code = 'VT';
UPDATE claim SET credibility_weight = 0.75 WHERE claim_code = 'LT';
UPDATE claim SET credibility_weight = 0.50 WHERE claim_code = 'UV';
UPDATE claim SET credibility_weight = 0.30 WHERE claim_code = 'OP';
UPDATE claim SET credibility_weight = 0.25 WHERE claim_code = 'LF';
UPDATE claim SET credibility_weight = 0.00 WHERE claim_code = 'VF';
-- NV exclus din calcul (ramane NULL sau 0)
FAZA 5: CRUD didiFramework (backend endpoints)
Scop: API-uri CRUD pentru noile tabele + extindere sync-redis.
5.1 Fisier nou: routes/input-profiles.ts
GET /api/input-profiles → lista toate profilurile
GET /api/input-profiles/:code → un profil cu override-uri
PUT /api/input-profiles/:code → update profil (ponderi, reguli)
GET /api/input-profiles/:code/overrides → override-uri per profil
PUT /api/input-profiles/:code/overrides → update override-uri
Nota: NU avem POST/DELETE — cele 6 profiluri sunt fixe, nu se adauga/sterg.
5.2 Fisier nou: routes/scoring-configs.ts (sau extinde providers.ts)
GET /api/scoring-configs → lista toate scoring_config per component
GET /api/scoring-configs/:component → scoring_config pentru o componenta
PUT /api/scoring-configs/:component → update scoring_config
GET /api/scoring-configs/disclosure-multipliers → multiplicatori disclosure
PUT /api/scoring-configs/disclosure-multipliers → update multiplicatori
Nota: Astea sunt wrapper-e peste component_config CRUD existent.
5.3 Extinde routes/claims.ts (deja exista):
- GET /api/claims/types → include unverified_weight in raspuns
- PUT /api/claims/types/:id → accepta unverified_weight
- GET /api/claims/status → include credibility_weight in raspuns
- PUT /api/claims/status/:id → accepta credibility_weight
5.4 Extinde routes/sync-redis.ts:
- fetchInputProfiles() → citeste din input_type_profile + profile_override_config
- Scrie la didi:config:pipeline:v1:input_profiles
- fetchClaimsExtended() → include unverified_weight si credibility_weight
- Include in didi:framework:claims sync
5.5 Extinde routes/sync-redis.ts:
- fetchScoringConfigs() → citeste din component_config pentru source-assessment
- Scrie la didi:config:source-assessment:v1:scoring_config (NOU)
FAZA 6: Agent-v3 — verdict-calculator citeste profiles
Scop: verdict-calculator foloseste input profiles din Redis.
6.1 VerdictCalculator.loadFramework() extins:
- Citeste didi:config:pipeline:v1:input_profiles din Redis
- Fallback la DEFAULT_PROFILES (identice cu seed data din Faza 4)
6.2 VerdictCalculator.calculate() primeste input_type:
- Selecteaza profil pe baza input_type + has_url
- Foloseste ponderi din profil (nu din didi:framework:weights global)
- Aplica override-uri din profil (nu DEFAULT_VERDICT_CONFIG global)
- Aplica INCONCLUSIVE rules din profil
6.3 Component weights globale (didi:framework:weights.components) devin FALLBACK:
- Daca input_profiles nu exista in Redis → foloseste weights globale (backward compat)
- Daca input_profiles exista → ignora weights globale
6.4 Source Assessment override-uri:
- applyOverrides() primeste source_assessment in loc de domain
- Citeste verdict, is_blacklisted, red_flags din source_assessment
6.5 Claims scoring:
- claims/executor.ts citeste status_weights din Redis (in loc de hardcodat)
- claims/executor.ts citeste unverified_weight per tip din Redis (via claims framework data)
FAZA 7: Admin Dashboard — UI verdict config
Scop: Interfata pentru editarea tuturor parametrilor.
7.1 Pagina noua: /admin/verdict-config
- Sau sub-pagina in LLM Components Config (depinde de layout)
7.2 Tab 1: Input Profiles (vezi VERDICT_UI_SPEC.md)
- Consuma: GET /api/input-profiles
- Editeaza: PUT /api/input-profiles/:code
- Slidere ponderi cu validare total=100
7.3 Tab 2: Override Rules (vezi VERDICT_UI_SPEC.md)
- Consuma: GET /api/input-profiles/:code/overrides
- Editeaza: PUT /api/input-profiles/:code/overrides
7.4 Tab 3: AI Disclosure
- Consuma: GET /api/scoring-configs/disclosure-multipliers
- Editeaza: PUT /api/scoring-configs/disclosure-multipliers
7.5 Tab 4: Claims Weights
- Consuma: GET /api/claims/types (cu unverified_weight) + GET /api/claims/status (cu credibility_weight)
- Editeaza: PUT existente
7.6 Tab 5-6: Verdict Categories + Risk/Severity
- Muta componentele existente din FrameworkDashboard (sau link catre)
7.7 Tab 7: Confidence Config
- Consuma: din input profile confidence_config JSONB
- Editeaza: ca parte din PUT /api/input-profiles/:code
7.8 Tab 8: Topic Multipliers — link/embed din FrameworkDashboard
7.9 Tab 9: LLM Reviewer
- Consuma: GET /api/scoring-configs/pipeline (verdict_config JSONB)
- Editeaza: PUT /api/scoring-configs/pipeline
7.10 Tab 10: Score Simulator
- Frontend JS pur — incarca configuratia din /api/input-profiles + /api/verdicts/all
- Calculeaza local, zero API calls per calcul
- Optiune "Compare with production" → POST la agent-v3 cu scoruri mock
FAZA 8: Cleanup + Documentare
8.1 Elimina context (10%) din component_weight PG + formula
8.2 Elimina domain legacy din verdict-calculator (inlocuit de source_assessment)
8.3 Actualizeaza DEFAULT_* constants sa fie identice cu PG seed data
8.4 Actualizeaza INDEX.md agent-v3 cu noul flow
8.5 Actualizeaza VERDICT_BUSINESS_ANALYSIS.md ca "implementat"
3. VERIFICARE FINALA — DUPA TOATE FAZELE
Fiecare parametru → exact un loc in PG, exact o cheie Redis, exact un UI element
| # | Parametru | PG | Redis | UI | Cod |
|---|---|---|---|---|---|
| 1 | Ponderi per input type | input_type_profile.weight_* |
input_profiles[code].weights |
Tab 1 slidere | citeste Redis, fallback defaults |
| 2 | INCONCLUSIVE rules | input_type_profile.primary_components etc |
input_profiles[code].inconclusive |
Tab 1 checkboxes | citeste Redis |
| 3 | Missing component handling | input_type_profile.missing_* |
input_profiles[code].missing |
Tab 1 dropdowns | citeste Redis |
| 4 | Override per profil | profile_override_config |
input_profiles[code].overrides |
Tab 2 toggles + inputs | citeste Redis |
| 5 | Override cap | input_type_profile.override_cap |
input_profiles[code].override_cap |
Tab 2 input | citeste Redis |
| 6 | Disclosure multipliers | input_type_profile.ai_disclosure_multipliers |
input_profiles[code].disclosure |
Tab 3 slidere | citeste Redis |
| 7 | Claims UV weight per tip | claim_type.unverified_weight |
didi:framework:claims.types[].unverified_weight |
Tab 4 inputs | citeste Redis |
| 8 | Claims status credibility weight | claim.credibility_weight |
didi:framework:claims.status[].credibility_weight |
Tab 4 inputs | citeste Redis |
| 9 | Verdict categories | verdict_category |
didi:framework:verdicts.categories |
Tab 5 table | citeste Redis |
| 10 | Risk mappings | risk_mapping |
didi:framework:verdicts.risk_mappings |
Tab 6 table | citeste Redis |
| 11 | Severity | severity_assessment |
didi:framework:verdicts.severity |
Tab 6 table | citeste Redis |
| 12 | Confidence config | input_type_profile.confidence_config |
input_profiles[code].confidence |
Tab 7 inputs | citeste Redis |
| 13 | Topic multipliers | multiplier |
didi:framework:weights.multipliers |
Tab 8 table | citeste Redis |
| 14 | LLM max adjustment | component_config(pipeline, verdict_config) |
verdict_config.llm_review.max_adjustment |
Tab 9 input | citeste Redis |
| 15 | LLM models + prompts | component_stage_assignment + component_prompt |
didi:config:verdict:* |
Tab 9 selects | citeste Redis |
| 16 | Techniques scoring params | component_config(techniques, scoring_config) |
didi:config:techniques:v3:scoring_config |
Tab 9 sau sectiune dedicata | citeste Redis |
| 17 | AI scoring params | component_config(ai-tampered, scoring_config) |
didi:config:ai-tampered:v1:scoring_config |
Tab 9 sau sectiune dedicata | citeste Redis |
| 18 | Claims scoring params | component_config(claims, scoring_config) |
didi:config:claims:v1:scoring_config |
Tab 9 sau sectiune dedicata | citeste Redis |
| 19 | Source scoring params | component_config(source-assessment, scoring_config) |
didi:config:source-assessment:v1:scoring_config |
Tab 9 sau sectiune dedicata | citeste Redis |
| 20 | Video track weights | component_config(pipeline, component_config) |
didi:config:pipeline:v1:component_config |
Tab 1 sub-sectiune sau Tab 9 | citeste Redis |
20 parametri × 3 locuri (PG + Redis + UI) = complet aliniat. Zero hardcodari in cod.
4. EFORT ESTIMAT PER FAZA
| Faza | Ce | Fisiere afectate | Complexitate |
|---|---|---|---|
| 0 | Backup + inventar | 0 (doar comenzi) | Mica |
| 1 | Redis → PG (22 INSERT-uri) | 1 SQL migration | Mica |
| 2 | Cod → Redis+PG (citire din Redis) | 5 executori + 1 worker | Medie |
| 3 | Fix divergente | 2 fisiere (verdict-calculator + Redis data) | Mica |
| 4 | Tabele PG noi + seed | 1 SQL migration | Medie |
| 5 | CRUD didiFramework | 2 fisiere noi + 2 extinse + sync-redis | Medie-mare |
| 6 | Agent-v3 verdict-calculator | 1 fisier (verdict-calculator.ts) + 1 (executor.ts pipeline) | Medie |
| 7 | Admin Dashboard UI | 1 pagina noua cu 10 tab-uri | Mare |
| 8 | Cleanup + docs | 3-4 fisiere | Mica |
Dependente:
- Faza 1 → independent
- Faza 2 → dupa Faza 1
- Faza 3 → dupa Faza 2
- Faza 4 → independent (poate in paralel cu 2-3)
- Faza 5 → dupa Faza 4
- Faza 6 → dupa Faza 5 (sau 3)
- Faza 7 → dupa Faza 5
- Faza 8 → dupa toate