# 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. ```sql 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 ```json { "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 |