31 KiB
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:
- Claims — Sunt afirmatiile adevarate? (cel mai important — textul poate fi bine scris dar mincinos)
- Techniques — Foloseste tactici de manipulare? (al doilea — indica intentie)
- AI Tampered — E generat de AI? (relevant doar daca e nedeclarat)
- 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:
- Source — De unde vine? (sursa da context critic — cu URL avem si axa domain)
- Claims — Sunt afirmatiile adevarate?
- Techniques — Manipuleaza?
- 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:
- AI Tampered — E deepfake? E generata de AI? (PRIMAR pentru imagini)
- Techniques — Are text manipulativ? (doar daca textul e extras)
- Claims — Textul din imagine contine afirmatii false? (secundar)
- 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:
- Techniques — Discursul foloseste manipulare? (cel mai relevant pentru audio)
- Claims — Ce se spune e adevarat?
- AI Tampered — Sunetul e sintetizat? (LIMITARE: analizam doar transcriptul, NU amprenta vocii)
- 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:
- AI Tampered — Videoul e deepfake? Fete generate? (PRIMAR — vizualul domina)
- Techniques — Discursul/textul e manipulativ?
- Claims — Ce se spune/scrie e adevarat?
- 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:
- Recalculam fiecare sesiune cu ponderile NOI (per input_type profil)
- Comparam: scor vechi vs scor nou — cate verddicte se schimba?
- Verificam: Sesiunile care stim ca erau misinformare → le prinde mai bine?
- Verificam: Sesiunile benigne → primesc scor mai mic?
- 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 |