didi-lot2-backend/backend/services/orchestration-layer/agent-v3/VERDICT_BUSINESS_ANALYSIS.md
2026-07-10 03:39:53 -07:00

31 KiB
Raw Blame History

VERDICT BUSINESS ANALYSIS

Analiza de business a sistemului de verdict DIDI. Scopul: viziune clara, modulara, parametrizabila — inainte de orice modificare de cod.

Versiune: 2 (actualizata cu decizii din discutie)


1. CE INTREBARE RASPUNDE FIECARE COMPONENTA

Componenta Intrebare fundamentala Scor produs Semnificatie scor
Techniques "Acest continut foloseste tactici de manipulare?" manipulation_score 0-100 0 = comunicare curata, 100 = propaganda agresiva
AI Tampered "Acest continut e generat/modificat de AI?" ai_probability 0-100 + risk_score 0-100 probability = cat de AI e; risk = cat de periculos e asta (moderat de disclosure)
Claims "Afirmatiile factuale din continut sunt adevarate?" credibility_score 0-100 0 = totul e fals, 100 = totul verificat adevarat
Source Assessment "Sursa acestui continut e credibila?" trust_score 0-100 0 = sursa necunoscuta/periculoasa, 100 = sursa de incredere

Observatie critica: Fiecare componenta masoara un TIP DIFERIT de risc.

  • Techniques = CUM e scris (manipulare retorica)
  • Claims = CE spune (acuratete factuala)
  • AI = CINE a scris (om vs masina) + a declarat?
  • Source = DE UNDE vine (credibilitate sursa)

Un articol poate fi: scris de om (AI=0), de la o sursa buna (Source=90), cu limbaj manipulativ (Techniques=70), si cu afirmatii false (Claims=20). Fiecare axa e independenta.


2. CE POATE RULA PE FIECARE TIP DE INPUT

Matrice disponibilitate componente

TEXT TEXT+URL IMAGE AUDIO VIDEO URL
Techniques MEREU MEREU Daca Vision extrage text Daca Whisper transcriere Daca transcript exista MEREU (din articol)
AI Tampered MEREU (text) MEREU (text) MEREU (Vision AI detection) Doar text (din transcript) — FARA fingerprint audio 2-track: text 40% + visual 60% MEREU (text)
Claims MEREU MEREU Daca text extras Daca transcript Daca merged_text MEREU (din articol)
Source Assess. DA (partial — fara axa domain) DA (complet) DA (partial — din text vizual) DA (partial — din transcript) DA (partial — din transcript + frames) DA (complet)

Nota: Source Assessment poate rula pe ORICE input. Extrage publicatie/autor/platforma din text/transcript/frames prin LLM + web search M17. Axa domain (25% din trust_score) e disponibila doar cand exista URL. Pe media fara URL, 3 din 4 axe functioneaza.

Ce dependente reale au componentele

Techniques       ──requires──> TEXT (min 20 chars)
Claims           ──requires──> TEXT (min 50 chars) + Web Search API (M17)
AI Tampered TEXT ──requires──> TEXT
AI Tampered IMG  ──requires──> IMAGE FILE (Vision API direct)
AI Tampered VID  ──requires──> VIDEO FRAMES (ffmpeg) + optional TRANSCRIPT
Source Assess.   ──requires──> TEXT sau TRANSCRIPT (pt LLM extraction) + optional URL (pt domain axis)

Cum se extrage text din media

Media Metoda extractie Fallback Timeout Hardcodari
Image Vision OCR (Qwen → Gemini → GPT-4o) Cascade 3 modele configurat in Redis
Audio Whisper (M17 → Groq → OpenAI) Cascade 3 provideri configurat in Redis
Video ffmpeg frames + Whisper audio Combined 180s video max, 420s audio max Durate HARDCODATE
Video text merged_text = transcript + text vizual din frames Trunchiat la 4000 chars pt claims (HARDCODAT)

3. BUSINESS CASES PER TIP INPUT

3.1 TEXT SIMPLU (fara URL)

Cazul tipic: Un utilizator paste-uieste un text (articol, post social media, mesaj WhatsApp).

Ce conteaza cel mai mult:

  1. Claims — Sunt afirmatiile adevarate? (cel mai important — textul poate fi bine scris dar mincinos)
  2. Techniques — Foloseste tactici de manipulare? (al doilea — indica intentie)
  3. AI Tampered — E generat de AI? (relevant doar daca e nedeclarat)
  4. Source — Cine a scris? (partial — fara domain, dar publicatie+autor+platforma functioneaza)

Ponderi propuse:

Componenta Pondere Justificare
Techniques 35% Manipularea retorica e un semnal puternic de intentie
Claims 35% Acuratetea factuala e la fel de importanta
AI Tampered 15% Relevant doar daca e nedeclarat
Source 15% Partial disponibil (fara axa domain), dar publicatie/autor/platforma conteaza

Cand e INCONCLUSIVE: Claims SI Techniques au crapat (nu doar claims!) Cand NU e INCONCLUSIVE: Claims nu a gasit claims extractabile → scor neutral, NU INCONCLUSIVE

Override-uri relevante:

  • False claims: DA (cel mai important semnal)
  • Severe techniques: DA
  • Undisclosed AI: DA
  • Unverified verifiable claims: DA (NOU)
  • Domain overrides: NU (nu avem URL)

Exemplu concret — text benign:

Input: "Astazi a fost o zi frumoasa. Am fost la piata si am cumparat rosii."
Techniques: 0 (nicio manipulare)
Claims: credibility 75% (neverificabil dar inofensiv) → risk 25
AI: risk 5 (probabil om)
Source: trust 50 (neutru — nu putem identifica publicatia) → risk 50
Scor: 0×35% + 25×35% + 5×15% + 50×15% = 0 + 8.75 + 0.75 + 7.5 = 17 → MOSTLY_RELIABLE

Exemplu concret — text manipulativ cu claims false:

Input: "URGENT! Guvernul ascunde ADEVARUL! Vaccinul contine cip 5G! TREZITI-VA!"
Techniques: 85 (apel emotional, urgenta, conspiratie)
Claims: credibility 10% (verificat fals) → risk 90
AI: risk 10 (probabil om)
Source: trust 30 (anonim, fara publicatie) → risk 70
Scor: 85×35% + 90×35% + 10×15% + 70×15% = 29.75 + 31.5 + 1.5 + 10.5 = 73.25
Override false claims: +15
Total: 88 → UNRELIABLE

3.2 TEXT CU URL

Cazul tipic: Utilizatorul paste-uieste un articol de pe un site, cu link-ul sursei.

Ce conteaza cel mai mult:

  1. Source — De unde vine? (sursa da context critic — cu URL avem si axa domain)
  2. Claims — Sunt afirmatiile adevarate?
  3. Techniques — Manipuleaza?
  4. AI — E generat de AI?

Ponderi propuse:

Componenta Pondere Justificare
Techniques 25% Important dar nu dominant cand avem sursa
Claims 25% Acuratete factuala
Source 35% Sursa e cel mai bun predictor de calitate (cu domain complet)
AI Tampered 15% Relevant daca e nedeclarat

Cand e INCONCLUSIVE: Mai putin de 2 componente au produs rezultat Override-uri relevante: TOATE (inclusiv domain/blacklist/red flags din Source Assessment)

Exemplu — sursa buna, continut ok:

Reuters.com: articol standard
Techniques: 5, Claims: cred 90% → risk 10, Source: trust 95 → risk 5, AI: 3
Scor: 5×25% + 10×25% + 5×35% + 3×15% = 1.25 + 2.5 + 1.75 + 0.45 = 6 → RELIABLE

Exemplu — sursa rea, claims false:

conspiratii-adevarate.ro: articol despre "microcipi in vaccin"
Techniques: 70, Claims: cred 5% → risk 95, Source: trust 15 → risk 85, AI: 20
Scor: 70×25% + 95×25% + 85×35% + 20×15% = 17.5 + 23.75 + 29.75 + 3 = 74
Override: 2 false claims (+30), source UNTRUSTED (+20) → capped 50
Total: min(100, 74+50) = 100 → DISINFORMATION

3.3 IMAGINE

Cazul tipic: Utilizatorul uploadeaza o imagine (foto, screenshot, meme, infografic).

Ce conteaza cel mai mult:

  1. AI Tampered — E deepfake? E generata de AI? (PRIMAR pentru imagini)
  2. Techniques — Are text manipulativ? (doar daca textul e extras)
  3. Claims — Textul din imagine contine afirmatii false? (secundar)
  4. Source — Cine e autorul? (partial — din text vizual, fara domain)

Ponderi propuse:

Componenta Pondere Justificare
AI Tampered 50% Detectia AI/deepfake e SCOPUL PRINCIPAL pt imagini
Techniques 20% Daca exista text, manipularea conteaza
Claims 15% Daca exista text verificabil
Source 15% Partial — publicatie/autor din text vizual

Cand e INCONCLUSIVE: AI Tampered a crapat (componenta primara pt imagini) Cand NU e INCONCLUSIVE: Claims nu a rulat (NU e componenta primara pt imagini!)

DIFERENTA FATA DE ACUM: Actualmente, orice imagine fara claims → INCONCLUSIVE. E gresit. Un deepfake detectat cu ai_probability=95 si zero text nu ar trebui sa fie "date insuficiente".

Exemplu — deepfake clar:

Imagine AI-generata cu politician
AI: probability 92%, disclosure=none → risk 92
Techniques: N/A (fara text) → redistribuit la AI
Claims: N/A (fara text) → redistribuit la AI
Source: trust 50 (neutru) → risk 50
Ponderi efective: AI=50+20+15=85%, Source=15%
Scor: 92×85% + 50×15% = 78.2 + 7.5 = 85.7
Override undisclosed AI: +15 → 100 (capped)
Verdict: DISINFORMATION — NU "INCONCLUSIVE"

Exemplu — meme cu text:

Meme cu statistici false si apel emotional
AI: probability 20%, disclosure=none → risk 20
Techniques: 60 (apel emotional, simplificare)
Claims: credibility 30% → risk 70
Source: trust 50 (neutru) → risk 50
Scor: 20×50% + 60×20% + 70×15% + 50×15% = 10 + 12 + 10.5 + 7.5 = 40 → MIXED

3.4 AUDIO

Cazul tipic: Utilizatorul uploadeaza un clip audio (podcast, inregistrare, mesaj vocal).

TOTUL depinde de transcriere. Fara transcript → nimic nu ruleaza.

Ce conteaza cel mai mult:

  1. Techniques — Discursul foloseste manipulare? (cel mai relevant pentru audio)
  2. Claims — Ce se spune e adevarat?
  3. AI Tampered — Sunetul e sintetizat? (LIMITARE: analizam doar transcriptul, NU amprenta vocii)
  4. Source — Cine vorbeste? (partial — din transcript, fara domain)

Ponderi propuse:

Componenta Pondere Justificare
Techniques 35% Manipularea in discurs e principalul semnal
Claims 30% Verificarea factuala a ce s-a spus
AI Tampered 20% Limitat — doar text, fara analiza audio reala
Source 15% Partial — publicatie/autor din transcript

Cand e INCONCLUSIVE: Transcrierea a esuat (prereq → nimic nu ruleaza) Cand NU e INCONCLUSIVE: Claims nu a gasit claims in transcript → scor neutru, nu INCONCLUSIVE

LIMITARE MAJORA CURENTA: AI Tampered pe audio = analiza text din transcript. Nu detecteaza voice cloning, audio deepfake, sau sinteza vocala. Utilizatorul ar trebui avertizat.

Exemplu — podcast conspirativ:

Audio 3 min cu discurs conspirativ despre "elitele globale"
Transcript: 800 cuvinte cu claims verificabile
Techniques: 75 (apel emotional, conspiratie, us-vs-them)
Claims: credibility 25% → risk 75 (3 false din 5)
AI: risk 5 (voce umana)
Source: trust 30 (podcast anonim) → risk 70
Scor: 75×35% + 75×30% + 5×20% + 70×15% = 26.25 + 22.5 + 1 + 10.5 = 60.25
Override false claims: 3 × 15 = min(40, 45) = +40
Total: 100 (capped) → DISINFORMATION

3.5 VIDEO

Cazul tipic: Utilizatorul uploadeaza un clip video (stire, TikTok, YouTube, deepfake).

Cel mai complex tip. Doua axe independente: VIZUAL + AUDIO.

Ce conteaza cel mai mult:

  1. AI Tampered — Videoul e deepfake? Fete generate? (PRIMAR — vizualul domina)
  2. Techniques — Discursul/textul e manipulativ?
  3. Claims — Ce se spune/scrie e adevarat?
  4. Source — De unde vine videoul? (daca YouTube URL, complet; altfel partial)

Ponderi propuse:

Componenta Pondere Justificare
AI Tampered 40% Detectia deepfake vizual e SCOPUL PRINCIPAL
Techniques 25% Manipularea in discurs/text vizual
Claims 20% Verificarea factuala
Source 15% Partial sau complet (depinde daca avem URL)

Sub-cazuri video:

Sub-caz Componente disponibile INCONCLUSIVE?
Video cu dialog + text pe ecran Toate NU
Video cu dialog, fara text pe ecran AI + Techniques + Claims + Source (din transcript) NU
Video fara dialog, cu text pe ecran AI + Techniques + Claims + Source (din OCR) NU
Video fara dialog, fara text AI (visual track) + Source (partial) NU — AI e primar pt video
Video corect dar transcript esuat AI (visual track) + Source (partial) NU — AI e suficient
Video fara nimic extractabil + AI crapat Nimic DA — nimic nu a functionat

DIFERENTA FATA DE ACUM: Un video deepfake fara dialog → AI detecteaza cu 95%, dar sistemul actual pune INCONCLUSIVE pentru ca claims lipseste. Gresit.

Ponderi track-uri AI Tampered pe video (actualmente hardcodate, trebuie in Redis):

Track Pondere actuala Pondere propusa Justificare
Text (din transcript) 40% 30% Transcriptul e indirect
Visual (din frames) 60% 70% Vizualul e direct — deepfake se vede
Prag minim text track 200 chars 200 chars Sub prag → visual 100%

3.6 URL

Cazul tipic: Utilizatorul da un URL (articol, pagina, YouTube).

Se extrage continutul, apoi se analizeaza ca TEXT+URL. Cazul YouTube: se proceseaza ca VIDEO.

Ponderi propuse:

Componenta Pondere Justificare
Source 35% Cu URL avem Source Assessment complet (toate 4 axele)
Techniques 25% Din articolul extras
Claims 25% Din articolul extras
AI Tampered 15% Din articolul extras

4. DECIZII LUATE

4.1 Virality — ramane separat

Virality e un alt tip de informatie ("cat de probabil e sa devina viral"), nu risc de misinformare. Ramine scor separat (0-100), afisat independent, fara a influenta risk_score.

4.2 Disclosure AI — multiplicator pe risk, nu bonus fix

Decizie: Disclosed AI = risc mic. Undisclosed AI = risc mare.

Misinformarea prin AI vine din DECEPTIE — cineva prezinta continut AI ca fiind uman. Daca declari "scris cu ChatGPT", nu exista inselaciune.

Multiplicator disclosure pe risk_score (in loc de override fix +15):

Disclosure Multiplicator risk Exemplu (ai_prob=80) Logica
explicit 0.15 risk=12 AI declarat clar → aproape zero risc
partial ("cu ajutorul AI") 0.40 risk=32 Partial → risc mic
implied (mentionat ChatGPT) 0.60 risk=48 Indirect → risc moderat
none (nedeclarat) 1.00 risk=80 Nedeclarat → risc complet

Override undisclosed_ai: se aplica DOAR pe disclosure=none (bonus +10, nu +15).

Aceste valori se stocheaza in Redis (scoring_config.disclosure_multipliers) si sunt editabile din UI.

4.3 Claims neverificate — ponderi per tip claim

Decizie: Un claim neverificat POATE fi o minciuna. Tratamentul depinde de TIPUL claimului.

Ponderi credibility per status claim (actual → propus):

Status Actual Propus Logica
VT (Verified True) 1.0 1.0 Confirmat adevarat
LT (Likely True) 0.75 0.75 Probabil adevarat
UV (Unverified) 0.5 (mereu) Per tip (vezi mai jos) Depinde ce tip de claim e
OP (Opinion) 0.3 0.3 Opinie ca fapt
LF (Likely False) 0.25 0.25 Probabil fals
VF (Verified False) 0.0 0.0 Confirmat fals

Ponderi UV per tip claim (NOU):

Tip claim Cod UV weight Logica
Factual verificabil VF 0.25 "Guvernul a emis legea X" fara surse → SUSPECT
Stiintific SC 0.25 "Studiile arata ca X" fara surse → SUSPECT
Cantitativ QA 0.30 "70% din populatie..." fara surse → SUSPECT
Factual general EF 0.35 "Evenimentul X s-a intamplat" → MODERAT SUSPECT
Cauzal CC 0.40 "X a provocat Y" → GREU de verificat
Reglementare RE 0.40 "E legal sa..." → MODERAT
Predictiv PC 0.50 "X se va intampla" → NU SE POATE VERIFICA
Opinie/Valoare OP/VC 0.50 Opiniile nu sunt verificabile

Aceste ponderi se stocheaza in tabelul claim_type din PG (camp nou unverified_weight) si sunt editabile din UI.

Override NOU: unverified_verifiable_claims: Daca >= 3 claims verificabile (VF/SC/QA/EF) sunt neverificate → override bonus configurat (default +10). Semnificatie: "Acest continut face multiple afirmatii factuale pe care nicio sursa web nu le confirma."

Cazul special "totul neverificat fara surse": Actual: credibility_score = 75 (lean pozitiv). Propus: depinde de tipuri.

  • 5 claims factuale neverificate → credibility ~25 (lean negativ)
  • 5 opinii neverificate → credibility ~50 (neutru)

4.4 LLM Reviewer — primeste tot, putere moderata

Decizie: LLM reviewer-ul e un "senior analyst" care primeste tot dosarul.

Ce primeste (extins fata de acum):

Informatie Acum Propus
Scoruri componente DA DA
Top 3 false claims cu text DA DA + toate claims neverificate verificabile
Verdictul matematic + ponderi DA DA + profilul input_type folosit
Disclosure AI detalii NU DA (tip, tool mentionat, prominence)
Source Assessment complet NU DA (publicatie, autor, platforma, axa domain)
Red flags din toate componentele Partial DA (Source + Techniques warning_flags)
Tehnicile top cu dimensiunile Partial DA (D1=emotional, D7=narativ etc.)
Metadata media NU DA (transcript gol? cate frames? video/audio track info?)
Limitari componente NU DA (ex: "AI pe audio = doar text, fara fingerprint vocal")

Ce produce (extins):

Output Acum Propus
explanation_ro + explanation_en DA DA (3-5 propozitii)
risk_score ajustat ±50 puncte ±20 puncte
reasoning DA DA (pentru audit)
key_findings NU DA — bullet points cu descoperirile principale
warnings NU DA — avertismente specifice (ex: "AI pe audio nu detecteaza voice cloning")
confidence ajustat DA DA

Reguli LLM reviewer:

  • Putere: ±20 puncte (nu ±50 — destul pentru corectii, nu destul pentru rescriire)
  • NU poate pune INCONCLUSIVE (asta e algoritmic din profil)
  • NU poate depasi 0-100
  • POATE adauga warnings/key_findings chiar daca nu ajusteaza scorul
  • Daca toate modelele LLM pica → confidence -10, scor neschimbat, warnings="LLM review unavailable"

4.5 Validare cu date reale — backtest pe sesiuni PG

Ce inseamna: Inainte de a activa ponderile noi, rulam formula noua pe sesiunile existente din PostgreSQL si comparam.

SELECT
  s.session_id, s.input_type,
  t.manipulation_score,
  c.credibility_score, c.verified_false, c.total_claims, c.unverified,
  a.ai_probability, a.risk_score as ai_risk,
  sa.trust_score as source_trust_score,
  v.risk_score as verdict_actual, v.risk_category as category_actual
FROM bos_analysis.analysis_session s
LEFT JOIN bos_analysis.analysis_techniques t ON s.session_id = t.session_id
LEFT JOIN bos_analysis.analysis_claims c ON s.session_id = c.session_id
LEFT JOIN bos_analysis.analysis_ai_tampered a ON s.session_id = a.session_id
LEFT JOIN bos_analysis.analysis_source_assessment sa ON s.session_id = sa.session_id
LEFT JOIN bos_analysis.analysis_verdict v ON s.session_id = v.session_id
WHERE s.status = 'completed';

Cu datele astea:

  1. Recalculam fiecare sesiune cu ponderile NOI (per input_type profil)
  2. Comparam: scor vechi vs scor nou — cate verddicte se schimba?
  3. Verificam: Sesiunile care stim ca erau misinformare → le prinde mai bine?
  4. Verificam: Sesiunile benigne → primesc scor mai mic?
  5. Generam raport: "X% din sesiuni ar primi alt verdict. Y% ar primi verdict mai bun."

4.6 Migrare pe Source Assessment — eliminam domain legacy

Decizie: Source Assessment devine SINGURA componenta de sursa.

Pas Ce se face Impact
Domain Check API ramane Dar e apelat din interiorul Source Assessment (axa domain) Zero
Override-urile citesc din Source Assessment verdict, red_flags, domain.is_blacklisted din Source Assessment Fix bug existent
DomainResult type → deprecat Inlocuit de SourceAssessmentResult (contine deja .domain ca axa) Backward compat prin mapper
PG: analysis_domain → populat din Source Assessment Datele se scriu din SourceAssessmentResult.domain Zero
Verdict calculator: parametrul domain → eliminat Inlocuit complet de source_assessment Cod mai curat

5. MATRICE IMPACT — UN SINGUR SEMNAL IZOLAT

5.1 O singura tehnica de manipulare detectata

Masurare Valoare
manipulation_score (actual) severity * confidence/100 * (1/3) * 100 ~ 25-30 (severity=8, confidence=90, 1 tehnica → countScaler=0.33)
Impact pe verdict (text, actual) 30 * 50% (redistribuit) = 15 puncte din scor final
Impact pe verdict (text, propus) 30 * 35% = 10.5 puncte din scor final

5.2 Un singur claim verificat fals

In Claims Executor:

5 claims total: 2 true, 1 false (VF, factual), 1 unverified (QA, cantitativ), 1 opinion
Actual:   (1.0 + 1.0 + 0.0 + 0.5 + 0.3) / 5 = 2.8/5 = 0.56 → credibility 56
Propus:   (1.0 + 1.0 + 0.0 + 0.30 + 0.3) / 5 = 2.6/5 = 0.52 → credibility 52
(UV ponderat 0.30 in loc de 0.50 pentru claim cantitativ)

Cat conteaza 1 claim fals extra (model propus, text):

Claims false credibility_score claims_risk Override Impact total pe scor
0 din 5 65 35 0 ~12
1 din 5 52 48 +15 ~32
2 din 5 38 62 +30 ~52
3 din 5 22 78 +40 (cap) ~67
5 din 5 0 100 +40 (cap) ~75

5.3 AI nedeclarat detectat

Masurare Text (propus) Image (propus)
ai_probability 80% 80%
disclosure none none
risk_score (prob * disclosure_mult 1.0) 80 80
Impact pondere 80 * 15% = 12 80 * 50% = 40
Override undisclosed_ai +10 +10
Impact total ~22 puncte ~50 puncte

Corect: Pe imagini, AI detection domina (50% pondere). Pe text, e secundar (15%).

5.4 AI DECLARAT detectat

Masurare Text (propus) Image (propus)
ai_probability 80% 80%
disclosure explicit explicit
risk_score (prob * disclosure_mult 0.15) 12 12
Impact pondere 12 * 15% = 1.8 12 * 50% = 6
Override 0 (disclosed) 0 (disclosed)
Impact total ~2 puncte ~6 puncte

Corect: AI declarat explicit → impact minim. Nu e inselaciune, nu e risc.

5.5 Sursa pe lista neagra (Source Assessment)

Masurare Text+URL (propus)
trust_score 10
source_risk 90
Impact pondere 90 * 35% = 31.5
Override UNTRUSTED +20
Override BLACKLISTED +25
Impact total ~76 puncte (capped la override max)

Corect: Override-urile se aplica acum din Source Assessment, nu doar din domain legacy.

5.6 Video deepfake fara dialog

Componenta Scor Impact actual Impact propus
AI Tampered (visual) risk 90 90 * 100% = 90 (dar INCONCLUSIVE!) 90 (AI e primar pt video)
Techniques N/A -1 -1 → redistribuit
Claims N/A -1 → INCONCLUSIVE fortat -1 → ok (nu e primar)
Source N/A partial -1 trust 50 → risk 50
Verdict actual Score=90, label=INCONCLUSIVE (gri)
Verdict propus Score=~83, label=UNRELIABLE (rosu)

5.7 Claims neverificate — impact propus

Situatie Actual Propus
5 claims factuale (VF/SC), toate neverificate credibility 75% → risk 25 credibility ~25% → risk 75
5 opinii, toate neverificate credibility 75% → risk 25 credibility ~50% → risk 50
3 factuale neverificate + 2 adevarate credibility 70% → risk 30 credibility ~55% → risk 45 + override unverified_verifiable +10

Diferenta clara: Claims factuale neverificate nu mai sunt tratate ca "probabil ok". Sunt tratate ca suspecte.


6. PROFILURI INPUT — STRUCTURA PARAMETRIZABILA

Fiecare profil e stocat in Redis/PG si editabil din admin dashboard.

Structura unui profil

{
  "profile_code": "text_no_url",
  "profile_name": "Text simplu (fara URL)",
  "applies_to": ["text"],
  "has_url": false,

  "weights": {
    "techniques":      { "weight": 35, "role": "primary" },
    "claims":          { "weight": 35, "role": "primary" },
    "ai_tampered":     { "weight": 15, "role": "secondary" },
    "source":          { "weight": 15, "role": "secondary" }
  },

  "inconclusive_rules": {
    "min_components": 2,
    "required_any": ["techniques", "claims"],
    "required_all": [],
    "primary_missing_is_inconclusive": true
  },

  "overrides": {
    "false_claims":              { "enabled": true,  "per_claim": 15, "max": 40 },
    "unverified_verifiable":     { "enabled": true,  "threshold": 3, "bonus": 10 },
    "severe_techniques":         { "enabled": true,  "threshold": 2, "bonus": 10 },
    "undisclosed_ai":            { "enabled": true,  "bonus": 10 },
    "untrusted_source":          { "enabled": false },
    "blacklisted_source":        { "enabled": false },
    "source_red_flags":          { "enabled": false },
    "synergy":                   { "enabled": true,  "threshold": 70, "per_component": 5, "max": 15 }
  },

  "override_cap": 50,

  "missing_component_handling": {
    "techniques":    "redistribute",
    "claims":        "redistribute_with_confidence_penalty",
    "ai_tampered":   "redistribute",
    "source":        "redistribute"
  },

  "confidence": {
    "base_per_component": 15,
    "primary_crash_penalty": 25,
    "secondary_crash_penalty": 10,
    "optional_missing_penalty": 0
  },

  "ai_disclosure_multipliers": {
    "explicit": 0.15,
    "partial": 0.40,
    "implied": 0.60,
    "none": 1.00
  }
}

Profiluri propuse (6)

Profil Input Tech% Claims% AI% Source% Componenta primara INCONCLUSIVE daca
text_no_url text fara URL 35 35 15 15 techniques + claims ambele primare crapat
text_with_url text cu URL 25 25 15 35 source <2 componente
image imagine 20 15 50 15 ai_tampered AI crapat
audio audio 35 30 20 15 techniques transcrierea esuata
video video 25 20 40 15 ai_tampered AI crapat + transcript esuat
url URL articol 25 25 15 35 source content extraction esuat

Toate profilurile au source 15% chiar si pe media fara URL, pentru ca Source Assessment poate extrage publicatie/autor/platforma din text/transcript/frames.


7. FORMULA PROPUSA (SIMPLIFICATA)

Pasii (in ordine):

1. SELECT profil din Redis pe baza input_type + has_url
2. EXTRACT scoruri componente:
   - manipulation = round(techniques.manipulation_score) sau -1
   - claims_risk = round(100 - claims.credibility_score) sau -1
   - ai_risk = round(ai_tampered.ai_probability * disclosure_multiplier) sau -1
   - source_risk = round(100 - source_assessment.trust_score) sau -1
3. PONDERI din profil (cu redistribuire pe baza missing_component_handling)
4. MEDIA PONDERATA = sum(scor * pondere) / sum(ponderi active)
5. MULTIPLICATOR topic (daca exista): scor = scor * factor
6. OVERRIDE-URI (din profil — doar cele activate): scor += bonusuri, cap din profil
7. ROUND + CLAMP 0-100
8. MAP la categorii (din Redis, identic cu acum)
9. INCONCLUSIVE CHECK (din profil — reguli explicite)
10. CONFIDENCE (din profil — penalitati per componenta lipsa/crapat)
11. VIRALITY (separat, nu afecteaza risk_score)
12. LLM REVIEWER: primeste TOT dosarul → explicatie + ajustare ±20 + key_findings + warnings

Diferente cheie fata de acum

Aspect Acum Propus
Ponderi Fixe 35/25/20/10/10, identice pe orice input Per profil input, din Redis
Source Domain legacy separat; Source Assessment partial integrat Source Assessment unic, domain ca axa interna
Componenta lipsa Redistribuire oarba proportionala Reguli explicite per profil: redistribute / penalty / ignore
INCONCLUSIVE 3 reguli hardcodate identice pe orice input Reguli per profil: componenta primara crapat
Override-uri Toate active mereu; domain-only, nu source_assessment Per profil; citesc din Source Assessment
Disclosure AI Override fix +15 pe undisclosed Multiplicator pe risk (0.15-1.0) + override mic (+10) pe undisclosed
Claims neverificate UV = 0.5 mereu, totul neverificat = 75 UV = per tip claim (0.25-0.50); override nou pe verifiable unverified
Multiplicator topic Dupa override (amplifica bonusuri) Inainte de override (nu amplifica)
LLM adjustment ±50 puncte ±20 puncte
LLM output explicatie + scor ajustat + key_findings + warnings
Context (10%) Mort permanent (-1) Eliminat din formula
Virality Desconectat de verdict Ramine desconectat (corect asa)

8. CE AR TREBUI IN REDIS/PG/UI

8.1 Tabele PG noi (in bos_parammgmt)

Tabel Ce stocheaza Editabil din UI
input_type_profile Profilurile complete (cod, nume, ponderi, reguli, override config, confidence config) DA — tab nou in FrameworkDashboard

Alternativ: un singur tabel cu profile_code PK si config JSONB (mai simplu, mai flexibil).

8.2 Camp nou in tabel existent

Tabel Camp nou Ce stocheaza
claim_type (existent) unverified_weight NUMERIC Ponderea UV per tip claim (0.25-0.50)

8.3 Chei Redis

Cheie Ce contine Cine scrie Cine citeste
didi:config:pipeline:v1:input_profiles Toate profilurile (JSON) didiFramework sync-redis agent-v3 verdict-calculator

8.4 UI Admin Dashboard

Tab nou: "Verdict Profiles" in LLM Components Config (sau tab separat)

Sectiune Ce editeaza
Profile selector Dropdown: text, text+url, image, audio, video, url
Component weights Slidere 0-100% per componenta (total=100, validat)
Override configuration Toggle + valori per override (per profil!)
INCONCLUSIVE rules Componente primare, minimum componente
AI Disclosure multipliers Slidere: explicit, partial, implied, none
Confidence config Penalitati per componenta lipsa
Score preview Simulator: introdu scoruri mock → vezi verdictul instant

Score preview e cea mai importanta feature UI. Adminul introduce:

  • Input type: video
  • Techniques: 60, Claims: N/A, AI: 85, Source: 40
  • Override: 1 false claim, undisclosed AI

Si vede: "Risk Score: 78, UNRELIABLE, confidence HIGH, override +25"


9. ORDINE DE IMPLEMENTARE PROPUSA

Faza Ce se face Impact Breaking changes
0 Backtest: query sesiuni PG, calculeaza cu ponderi noi, compara Zero NU
1 Extrage TOATE hardcodarile in DEFAULT_PROFILES (JSON static in cod) Zero — comportament identic NU
2 Verdict-calculator citeste profil din Redis cu fallback la defaults Zero NU
3 Fix Source Assessment override-uri (citeste verdict/blacklist/red_flags) Fix bug existent NU
4 Claims: adauga unverified_weight per tip + override unverified_verifiable Scoruri claims se schimba Scoruri noi pe claims neverificate
5 AI: disclosure multiplier pe risk (0.15-1.0) in loc de override fix AI declarat → risc scazut Scoruri AI se schimba
6 Verdict-calculator selecteaza profil pe baza input_type Ponderi per input type Scoruri pe media se schimba
7 Elimina domain legacy, migreaza pe Source Assessment Cod mai curat NU (backward compat)
8 Tabel PG input_type_profile + CRUD didiFramework + sync Redis Zero (doar admin) NU
9 UI admin dashboard — tab verdict profiles + score preview Zero (doar admin) NU
10 LLM reviewer: input extins + output extins + adjustment ±20 Explicatii mai bune Scoruri pot diferi
11 Elimina context (10%) din formula Ponderi mai curate Redistribuire minora