# DIDI Platform - Audit Complet: Prompt-uri, Separare Lingvistica, Parametri **Data audit**: 2026-03-23 **Scope**: Toate prompt-urile LLM din agent-v3, fluxul de date Framework->Redis->Executor, separare lingvistica RO/EN, parametri injectati, formate raspuns, probleme gasite. --- ## CUPRINS 1. [Arhitectura generala prompt-uri](#1-arhitectura-generala) 2. [Inventar complet prompt-uri](#2-inventar-complet) 3. [Techniques - Screening + Deep Analysis](#3-techniques) 4. [AI-Tampered - Disclosure + Screening + Deep + Image](#4-ai-tampered) 5. [Claims - Extraction + Verification](#5-claims) 6. [Source Assessment - Extraction + Evaluation](#6-source-assessment) 7. [Verdict - Calculator + Explanation + Virality](#7-verdict) 8. [Vision + Transcription (media pipeline)](#8-media-pipeline) 9. [Fluxul PG -> Redis -> Executor](#9-flux-pg-redis) 10. [Audit Separare Lingvistica](#10-separare-lingvistica) 11. [Probleme Gasite (32 issues)](#11-probleme) 12. [Recomandari](#12-recomandari) --- ## 1. ARHITECTURA GENERALA ### Cum ajung prompt-urile la LLM ``` Admin Dashboard (UI) | v didiFramework PUT /api/providers/prompts/:id | v PostgreSQL: bos_parammgmt.component_prompt | (component_code, stage_code, system_prompt, user_template) | v POST /api/sync-redis (manual trigger) | v Redis: didi:config:{component}:{version}:prompts:{stage} | JSON: { "system": "...", "user_template": "..." } | v agent-v3 Executor: loadFromRedis() / loadConfig() / loadPrompt() | v Template variable replacement: {{text}}, {{dimensions_list}}, etc. | v wrapUserContent() - securitate anti-injection | v LLM API call (model cascade: primary -> fallback_1 -> fallback_2 -> fallback_3) | v JSON parse + Zod schema validation ``` ### Trei tipuri de prompt-uri | Tip | Descriere | Editabil din UI? | Exemple | |-----|-----------|------------------|---------| | **Redis-only** | Incarcat din Redis, FARA fallback hardcodat | Da | Techniques screening/deep, AI-Tampered screening/deep, Claims extraction/verification | | **Redis + Fallback** | Redis override cu default hardcodat in cod | Da | Source Assessment extraction/evaluation, Vision prompts, Verdict explanation | | **Hardcodat** | Fix in cod, nu poate fi modificat din UI | Nu | AI Image detection, Disclosure patterns (regex), Virality calculator | --- ## 2. INVENTAR COMPLET PROMPT-URI ### 15 prompt-uri LLM identificate | # | Componenta | Etapa | Redis Key | Fallback? | Limba | Fisier | |---|-----------|-------|-----------|-----------|-------|--------| | 1 | Techniques | Screening | `didi:config:techniques:v3:prompts:screening` | NU | EN (Redis) | executor.ts:322 | | 2 | Techniques | Deep Analysis | `didi:config:techniques:v3:prompts:deep_analysis` | NU | EN (Redis) | executor.ts:380 | | 3 | AI-Tampered | Screening | `didi:config:ai-tampered:v1:prompts:screening` | NU | EN (Redis) | executor.ts:519 | | 4 | AI-Tampered | Deep Analysis | `didi:config:ai-tampered:v1:prompts:deep_analysis` | NU | EN (Redis) | executor.ts:579 | | 5 | AI-Tampered | Image Detection | N/A (hardcodat) | N/A | EN | ai-tampered-routes.ts:634 | | 6 | Claims | Extraction | `didi:config:claims:v1:prompts:extraction` | NU | EN (Redis) | executor.ts:358 | | 7 | Claims | Verification | `didi:config:claims:v1:prompts:verification` | NU | EN (Redis) | executor.ts:406 | | 8 | Source Assess. | Extraction | `didi:config:source-assessment:v1:prompts:extraction` | DA | EN | executor.ts:124-154 | | 9 | Source Assess. | Evaluation | `didi:config:source-assessment:v1:prompts:evaluation` | DA | EN | executor.ts:156-209 | | 10 | Verdict | Explanation | `didi:config:pipeline:v1:prompts:verdict_explanation` | DA | EN prompt, RO+EN output | verdict-explanation.ts:88-131 | | 11 | Vision | Text Extraction | `didi:config:vision:v1:prompts:extraction` | DA | EN | pipeline-routes.ts:103 | | 12 | Vision | Video Frames | `didi:config:vision:v1:prompts:video_frames` | DA | EN | video-processor.ts | | 13 | Vision | AI Detection (video) | `didi:config:vision:v1:prompts:ai_detection` | DA | EN | video-processor.ts | | 14 | AI-Tampered | Disclosure Check | N/A (regex) | N/A | EN | executor.ts:190-231 | | 15 | Verdict | Virality Calc | N/A (algoritm) | N/A | N/A | virality-calculator.ts | ### 3 prompt-uri NON-LLM (regex/algoritm) | # | Ce face | Tip | Configurabil? | |---|---------|-----|---------------| | 14 | Disclosure detection (ChatGPT, Claude, etc.) | Regex patterns | NU (hardcodat) | | 15 | Virality score (emotie, urgenta, reach) | Algoritm numeric | NU | | - | Domain analysis (varsta, SSL, blacklist) | API extern + scoring | Partial (Redis) | --- ## 3. TECHNIQUES ### 3.1 Screening (Etapa 1) **Scop**: Detectie rapida a dimensiunilor de manipulare prezente in text. **Redis Key**: `didi:config:techniques:v3:prompts:screening` **Variabile injectate**: - `{{dimensions_list}}` - Lista celor 8 dimensiuni, format: `- D1: Emotional Manipulation - short_description` - `{{text}}` - Primele 3000 caractere, wrappate in `...` **Sursa dimensiuni**: `didi:framework:dimensions_compact` sau `didi:config:techniques:v3:dimensions_compact` **Format raspuns asteptat** (Zod validated): ```json { "detected_dimensions": ["D1", "D3"], "confidence_per_dimension": { "D1": 85, "D3": 72 }, "quick_reasoning": "Text shows emotional appeals and logical fallacies" } ``` **Early exit**: Daca 0 dimensiuni detectate, se opreste (nu ruleaza deep analysis). ### 3.2 Deep Analysis (Etapa 2) **Scop**: Per dimensiune detectata, identifica tehnicile specifice de manipulare. **Redis Key**: `didi:config:techniques:v3:prompts:deep_analysis` **Variabile injectate**: - `{{dimension_name}}` - ex: "Emotional Manipulation" - `{{dimension_code}}` - ex: "D1" (replaced global) - `{{techniques_list}}` - Ierarhie completa: subdimensiuni -> tehnici -> indicatori, format markdown - `{{text}}` - Primele 12000 caractere, wrappate in `` **Format raspuns asteptat** (Zod validated): ```json { "detected_techniques": [ { "technique_id": 12, "technique_name": "Appeal to Authority", "confidence": 82, "intensity": 7, "evidence": "Uses unnamed experts to claim credibility" } ] } ``` **Paralelizare**: Cate un call LLM per dimensiune detectata, toate in paralel. ### 3.3 Model Cascade Configurat in Redis `didi:config:techniques:v3:stage_assignments`: - Primary + 3 fallbacks per etapa - Fiecare model are: temperature, max_tokens, timeout_ms ### 3.4 Scoring (post-LLM) Din Redis `didi:config:techniques:v3:scoring_config`: - count_scaler, intensity_weight, severe_threshold - manipulation_score = f(tehnici detectate, intensitate, severitate) --- ## 4. AI-TAMPERED ### 4.1 Disclosure Check (Etapa 0 - fara LLM) **Tip**: Regex pattern matching, hardcodat in executor.ts:190-231 **Patterns detectate**: - AI Tool names: ChatGPT, GPT-3/4, Claude, Bard, Llama, Gemini, Copilot, Jasper, Writesonic, Copy.ai, Notion AI, Bing Chat - Explicit disclosure: `[AI-generated]`, `This content was AI generated`, etc. - Partial disclosure: `AI tools`, `AI assistance`, `used AI` **Output**: `{ type: 'explicit' | 'partial' | 'implied' | 'none', text?: string }` **PROBLEMA**: Patterns hardcodate, nu pot fi actualizate din UI. Nu detecteaza tool-uri noi (Sora, Udio, etc.). ### 4.2 Screening (Etapa 1) **Redis Key**: `didi:config:ai-tampered:v1:prompts:screening` **Variabile injectate**: - `{{categories_list}}` - Categorii AI detection: `- CODE: NAME - SHORT_DESCRIPTION` - `{{text}}` - Text wrappat, truncat la SCREENING_TEXT_LIMIT **Format raspuns**: ```json { "ai_probability": 75, "detected_categories": ["SYNTAX", "STYLE"], "confidence_per_category": { "SYNTAX": 80, "STYLE": 65 }, "quick_indicators": ["uniform sentence length", "lack of typos"], "quick_reasoning": "Text exhibits AI-like patterns" } ``` **Early exit**: Daca ai_probability < 20 AND no disclosure AND no categories -> skip deep analysis. ### 4.3 Deep Analysis (Etapa 2) **Redis Key**: `didi:config:ai-tampered:v1:prompts:deep_analysis` **Variabile injectate**: - `{{category_name}}`, `{{category_code}}` - `{{indicators_list}}` - Indicatori per categorie: `- ID: NAME\n DESCRIPTION` - `{{text}}` - Text complet (fara truncare) **Format raspuns**: ```json { "category": "SYNTAX", "detected_indicators": [ { "indicator_id": "SYN_01", "confidence": 85, "evidence": "..." } ] } ``` ### 4.4 Image AI Detection (Vision) **Tip**: HARDCODAT in ai-tampered-routes.ts:634-653 **Prompt complet**: ``` Analyze this image to determine if it was AI-generated (by DALL-E, Midjourney, Stable Diffusion, etc.) or is a real photograph/human-created image. Look for these AI generation indicators: 1. Anatomical errors: Extra fingers, merged hands, distorted faces 2. Texture anomalies: Overly smooth skin, plastic-like appearance 3. Background artifacts: Blurred or nonsensical backgrounds 4. Lighting inconsistencies: Shadows going different directions 5. Text/writing errors: Garbled text, nonsensical letters 6. Repetitive patterns: Unnatural repetition in textures 7. Watermarks/signatures: AI tool watermarks 8. Style indicators: Characteristic AI art styles 9. Edge artifacts: Unnatural edges, halos 10. Composition issues: Unnatural object placement Return JSON only: { "ai_generated_probability": 75, "indicators": [...], "evidence": "..." } ``` **Vision Cascade**: Qwen Local (10.11.10.17:14011) -> Gemini Flash -> GPT-4o **Fallback daca toate esueaza**: Returns neutral 50% probability **PROBLEMA**: Nu este configurabil din Redis (key definit in keys.ts dar nefolosit). ### 4.5 Scoring (post-LLM) Din Redis `didi:config:ai-tampered:v1:scoring_config`: - blend_weights (screening vs deep) - disclosure_impact multipliers - thresholds for verdict categories --- ## 5. CLAIMS ### 5.1 Extraction (Etapa 1) **Redis Key**: `didi:config:claims:v1:prompts:extraction` **System Prompt** (din seed 002): ``` You are a claim extraction expert. Extract all verifiable factual claims from the given text. A claim is a statement that can potentially be verified as true or false. DO NOT include opinions, questions, or subjective statements unless they are presented as facts. ``` **Variabile injectate**: - `{{types_list}}` - Tipuri claim din framework: `- VF: Verifiable Fact - Can be checked (Web Search)` - `{{text}}` - Max 10000 caractere, wrappat in `` **Tipuri claim** (9): EF, VF, RE, SC, QA, CC, PC, OF, VC **Format raspuns**: ```json { "claims": [ { "text": "exact claim", "type": "VF", "priority": "high", "context": "..." } ] } ``` **IMPORTANT**: Max 7 claims verificate (restul silentios filtrate). Claims cu priority='low' sunt sarite. ### 5.2 Verification (Etapa 2) **Redis Key**: `didi:config:claims:v1:prompts:verification` **Flux**: Per claim extras -> M17 Web Search -> LLM verification **M17 Web Search API**: `POST http://10.11.10.17:51100/v1/gather` ```json { "claim": "...", "max_search_results": 5, "auto_fallback": true, "include_full_text": true, "timeout_seconds": 90, "language": "auto" } ``` **Variabile injectate in prompt verificare**: - `{{claim}}` - Text claim, wrappat in `` - `{{claim_type}}` - ex: "VF - Verifiable Fact" - `{{evidence}}` - Rezultate web search formatate: `[1] title\nURL: ...\nSource: ...\nContent: ...` - `{{statuses}}` - Status codes: VT, LT, UV, LF, VF, OP, NV **Format raspuns**: ```json { "sources_analysis": [ { "url": "...", "stance": "SUPPORTS|CONTRADICTS|NEUTRAL", "reliability": "official|news|blog|unknown" } ], "agreement_score": 75, "confidence": 80, "status": "VT", "reasoning": "explanation" } ``` **IMPORTANT**: Server-ul IGNORA status-ul si agreement_score de la LLM si le recalculeaza din stances! LLM-ul furnizeaza doar analiza surselor, nu decizia finala. ### 5.3 Scoring (post-LLM) Din Redis `didi:config:claims:v1:scoring_config`: - status_thresholds (VT: min_confidence 85, min_agreement 85, etc.) - source_reliability_weights (official: 1.2, news: 1.0, blog: 0.7, unknown: 0.5) - claim_type_weights (EF: 0.95, VF: 0.85, etc.) --- ## 6. SOURCE ASSESSMENT ### 6.1 Extraction (Etapa 1) **Redis Key**: `didi:config:source-assessment:v1:prompts:extraction` **Fallback hardcodat**: DA (DEFAULT_EXTRACTION_PROMPT, executor.ts:124-154) **System**: "You extract source attribution metadata from text. Output ONLY valid JSON." **Variabile**: - `{{text}}` - Primele 2000 caractere - `{{url_context}}` - URL daca exista **Output**: `{ publication, author, platform_code, content_type, url_found, queries[] }` ### 6.2 Evaluation (Etapa 2) **Redis Key**: `didi:config:source-assessment:v1:prompts:evaluation` **Fallback hardcodat**: DA (DEFAULT_EVALUATION_PROMPT, executor.ts:156-209) **Variabile**: - `{{publication}}`, `{{author}}`, `{{content_type}}`, `{{platform_code}}` - `{{domain_context}}` - Rezultat Domain Check API - `{{evidence_summary}}` - Rezultate M17 search - `{{source_type_options}}`, `{{author_options}}`, `{{platform_options}}` - `{{credibility_indicators}}` **Output**: `{ source_type_id, author_classification_code, platform_code, credibility_indicators[], publication_confirmed, author_confirmed, reasoning }` ### 6.3 Scoring Din Redis `didi:config:source-assessment:v1:scoring_config`: - axis_weights: publication 0.35, domain 0.25, author 0.25, platform 0.15 - verdict_thresholds: TRUSTED >=70, NEUTRAL >=50, SUSPICIOUS >=30, else UNTRUSTED ### 6.4 API-uri externe - M17 Search: `POST http://10.11.10.17:51100/v1/search` (timeout 20s) - Domain Check: `POST http://:11000/api/v1/check/check` (timeout 15s) --- ## 7. VERDICT ### 7.1 Verdict Calculator (algoritm, fara LLM) **Fisier**: verdict-calculator.ts **Formula de baza**: ``` risk_score = SUM(component_score * weight) pentru fiecare componenta activa ``` **Ponderi default** (din Redis `didi:framework:weights`): - manipulation (techniques): 35% - claims: 25% - source: 20% - ai_tampered: 10% - context: 10% **Input Profiles** (din Redis `didi:config:pipeline:v1:input_profiles`): 6 profiluri: text_no_url, text_with_url, url, image, audio, video Fiecare profil defineste: - Ponderi per componenta (suprascriu default-urile) - Reguli INCONCLUSIVE (min_components, required_any, primary_components) - Override-uri (false_claims, severe_techniques, undisclosed_ai, untrusted_domain) - AI disclosure multipliers (explicit, partial, implied, none) **Overrides** (bonusuri la risk_score): - false_claims: +15 per claim fals, max +40 - severe_techniques: +10 daca >= 2 tehnici severe - undisclosed_ai: +15 daca AI nedezvaltuit - untrusted_domain: +20/+10/+25 (untrusted/suspicious/blacklisted) - domain_red_flags: +5 per flag, max +15 - synergy: +5 per componenta peste threshold, max +15 **Categorii verdict** (din Redis `didi:framework:verdicts`): RELIABLE (0-15), MOSTLY_RELIABLE (16-30), MIXED (31-55), QUESTIONABLE (56-75), UNRELIABLE (76-90), DISINFORMATION (91-100), INCONCLUSIVE (special) ### 7.2 Verdict Explanation (LLM review) **Redis Key**: `didi:config:pipeline:v1:prompts:verdict_explanation` **Fallback hardcodat**: DA (verdict-explanation.ts:88-131) **System Prompt** (esenta): ``` You are the final judge. Use your own knowledge to evaluate. Treat unverified claims as suspicious if verifiable. Do NOT rubber-stamp the algorithm. Override when reasoning demands it. ``` **Variabile injectate**: - `{{framework_params}}` - Categorii, ponderi, flow algoritm, nivele confidence - `{{component_results}}` - Rezultate per componenta: [RAN]/[CRASHED]/[SKIPPED] + scoruri - `{{math_verdict}}` - Verdict algoritmic: risk_score, confidence, severity, weights, overrides - `{{max_adjustment}}` - Cat poate ajusta (default 30 puncte) - `{{baseline_score}}` - Scorul matematic de referinta - `{{valid_categories}}` - RELIABLE, MOSTLY_RELIABLE, MIXED, QUESTIONABLE, UNRELIABLE, DISINFORMATION, INCONCLUSIVE **FORMAT RASPUNS** (singurul cu output bilingv): ```json { "risk_score": 0-100, "risk_category": "UNRELIABLE", "confidence": 0-100, "explanation_ro": "3-5 propozitii in romana", "explanation_en": "3-5 sentences in English", "adjusted": true, "reasoning": "1-2 sentences why adjustment was made" } ``` **Fallback parsing**: Daca JSON fail, regex: `RO: ...` si `EN: ...` **Modele** (din Redis `didi:config:verdict:v1:available_models`): 1. local:qwen3-235b (primary, temp=0.1, 2000 tokens, 45s) 2. openrouter:gemini-flash (fallback, temp=0.1, 2000 tokens, 30s) 3. openrouter:gpt-4o-mini (fallback, temp=0.1, 2000 tokens, 30s) **IMPORTANT**: LLM-ul poate AJUSTA scorul cu max +-30 puncte. Ajustarea e clamped la baseline +/- maxAdjustment. ### 7.3 Virality Calculator (algoritm, fara LLM) Factori: emotie, urgenta, reach, controversy Output: virality_score 0-100, virality_level, virality_factors --- ## 8. MEDIA PIPELINE ### 8.1 Vision - Text Extraction (OCR) **Redis Key**: `didi:config:vision:v1:prompts:extraction` **Fallback**: - System: "You are a text extraction specialist. Extract only the meaningful content from images..." - User: "Extract the main text content from this image. Return ONLY the actual message... If no meaningful text, respond with NO_TEXT_FOUND." **Folosit de**: pipeline-routes.ts, claims-routes.ts, routes.ts, component-runner.ts, source-assessment-routes.ts ### 8.2 Vision - Video Frames (Misinformation) **Redis Key**: `didi:config:vision:v1:prompts:video_frames` **Fallback**: - System: "You are a video frame analyst specializing in misinformation detection..." - User: "Analyze these {{frame_count}} video frames in sequence. Focus on: text overlays, visual manipulation, narrative..." ### 8.3 Vision - Video AI Detection **Redis Key**: `didi:config:vision:v1:prompts:ai_detection` **Fallback**: - System: "You are a video frame analyst specializing in detecting AI-generated content..." - User: "Analyze these {{frame_count}} frames for: face consistency, lighting coherence, background stability, texture anomalies, motion artifacts... End with AI_CONFIDENCE: <0-100>" ### 8.4 Vision Model Cascade | Order | Model | Provider | Endpoint | Timeout | |-------|-------|----------|----------|---------| | 1 | Qwen3.5-397B-A17B | qwen-local | http://10.11.10.17:14011/v1/chat/completions | 60s | | 2 | gemini-2.0-flash-001 | openrouter | https://openrouter.ai/api/v1/chat/completions | 60s | | 3 | gpt-4o | openrouter | https://openrouter.ai/api/v1/chat/completions | 60s | Configurabil din Redis: `didi:config:ai-tampered:v1:vision_models` ### 8.5 Transcription (Audio/Video) | Order | Provider | Model | Endpoint | Timeout | |-------|----------|-------|----------|---------| | 1 | M17-Whisper | whisper-large-v3 | http://10.11.10.17:11000/audio/v1/transcriptions | 180s | | 2 | Groq-Whisper | whisper-large-v3-turbo | https://api.groq.com/openai/v1/audio/transcriptions | 120s | | 3 | OpenAI-Whisper | whisper-1 | https://api.openai.com/v1/audio/transcriptions | 120s | - Limba: auto-detect (Whisper) - Limba detectata returnata dar NU folosita downstream - Min transcript: 10 caractere (sub = fallback la urmatorul provider) ### 8.6 Video Processing Pipeline 1. Download video (yt-dlp / direct fetch) 2. Check durata (max 180s) 3. Extract frames ffmpeg (interval 5s, max 10 frames, min 3) 4. Extract audio ffmpeg -> transcribe 5. Analyze frames via vision cascade 6. Merge: `[AUDIO TRANSCRIPT]\n...\n\n[VISUAL ANALYSIS]\n...` --- ## 9. FLUX PG -> REDIS -> EXECUTOR ### Tabelul component_prompt (PostgreSQL) ```sql bos_parammgmt.component_prompt ( prompt_id SERIAL PK, component_code VARCHAR(50), -- 'techniques', 'ai-tampered', 'claims', etc. stage_code VARCHAR(50), -- 'techniques_screening', 'claims_extraction', etc. system_prompt TEXT, user_template TEXT, description TEXT, UNIQUE (component_code, stage_code) ) ``` ### Sync Redis (sync-redis.ts) ``` fetchPrompts() -> SELECT * FROM component_prompt | v Group by component_code -> { "techniques": { "screening": {system, user_template} } } | v For each component+stage: shortStage = stage_code.replace(component_prefix, '') redis.SET("didi:config:{comp}:{version}:prompts:{shortStage}", JSON) ``` ### Version Map ``` techniques -> v3 ai-tampered -> v1 claims -> v1 source-assessment -> v1 pipeline -> v1 vision -> v1 ``` ### Executor Loading Patterns | Componenta | Pattern | Fallback? | |-----------|---------|-----------| | Techniques | `loadFromRedis('prompts:screening')` -> throw if missing | NU | | AI-Tampered | `loadFromRedis('prompts:screening')` -> throw if missing | NU | | Claims | `loadConfig('prompts:extraction')` -> throw if missing | NU | | Source Assessment | `loadPrompt('extraction', DEFAULT)` -> return default | DA | | Verdict Explanation | `redis.get(key)` -> use hardcoded | DA | | Vision prompts | `redis.get(key)` -> use hardcoded | DA | **PROBLEMA CRITICA**: Techniques, AI-Tampered si Claims CRAPA daca Redis nu are prompt-urile. Source Assessment si Verdict au fallback. --- ## 10. AUDIT SEPARARE LINGVISTICA ### Matrice limba per componenta | Componenta | Limba System Prompt | Limba User Template | Limba LLM Output | Limba Finala User | |-----------|--------------------|--------------------|-------------------|-------------------| | Techniques Screening | EN | EN + data any lang | EN (JSON codes) | Coduri dimensiuni (D1-D8) | | Techniques Deep | EN | EN + data any lang | EN (JSON codes) | Tehnici: id + name EN | | AI-Tampered Screening | EN | EN + data any lang | EN (JSON codes) | Categorii: codes | | AI-Tampered Deep | EN | EN + data any lang | EN (JSON codes) | Indicatori: codes | | AI-Tampered Image | EN | EN | EN (JSON) | ai_probability + evidence EN | | Claims Extraction | EN | EN + data any lang | EN (JSON) | Claims in limba originala textului | | Claims Verification | EN | EN + evidence any lang | EN (JSON) | Status codes + reasoning EN | | Source Extraction | EN | EN + data any lang | EN (JSON) | Publication/author names | | Source Evaluation | EN | EN + evidence any lang | EN (JSON) | Codes + reasoning EN | | **Verdict Explanation** | **EN** | **EN** | **RO + EN** | **explanation_ro + explanation_en** | | Vision Text Extraction | EN | EN | Any (text content) | Text extras in limba imaginii | | Vision Video Frames | EN | EN | EN | Analiza vizuala EN | | Vision AI Detection | EN | EN | EN | Evidence EN | ### Constatari cheie 1. **SINGURUL output bilingv este Verdict Explanation** - produce `explanation_ro` + `explanation_en` 2. **Toate prompt-urile sunt in engleza** - indiferent de limba textului analizat 3. **Textul utilizatorului poate fi in orice limba** - LLM-ul primeste text RO/EN/etc wrappat in `` 4. **Claims sunt extrase in limba originala** - daca textul e in romana, claims sunt in romana 5. **Evidence de la web search poate fi in orice limba** - M17 are `language: 'auto'` 6. **Codurile sunt language-neutral** - D1, VT, SYNTAX etc. nu depind de limba 7. **Descrierile tehnicilor** din framework prefera `.en` hardcodat (executor.ts:475): `tech.description?.en` 8. **Categoriile verdict** din framework au descrieri in ROMANA (din seed) 9. **Nu exista parametru de limba** pasat la niciun executor ### Probleme lingvistice identificate | # | Problema | Severitate | Locatie | |---|---------|------------|---------| | L1 | Claims extrase in RO dar verificate cu prompt EN - LLM poate confunda | MEDIE | claims/executor.ts | | L2 | Technique descriptions hardcodat `.en` - nu exista fallback `.ro` | MICA | techniques/executor.ts:475 | | L3 | Evidence M17 poate fi in RO dar prompt-ul de verificare e EN | MICA | claims/executor.ts:474 | | L4 | Verdict explanation cere RO+EN dar nu specifica "Romanian" explicit in prompt | MEDIE | verdict-explanation.ts | | L5 | Disclosure patterns doar EN (nu detecteaza "generat de AI" in romana) | MEDIE | ai-tampered/executor.ts:190 | | L6 | Vision prompts doar EN - nu specifica limba textului din imagine | MICA | vision.ts | | L7 | Transcription detecteaza limba dar nu o paseaza downstream | MICA | transcription.ts | | L8 | Framework verdict categories au descrieri RO in DB dar coduri EN - mixing | INFO | didiFramework seed | --- ## 11. PROBLEME GASITE (32 issues) ### CRITICE (3) | # | Problema | Impact | Locatie | |---|---------|--------|---------| | C1 | Techniques/AI-Tampered/Claims CRAPA daca prompt-urile lipsesc din Redis (no fallback) | Serviciul devine inoperabil dupa un flush Redis | techniques/executor.ts, ai-tampered/executor.ts, claims/executor.ts | | C2 | Float gap in verdict categories: 90.x nu se potriveste UNRELIABLE(76-90) nici DISINFORMATION(91-100) -> RELIABLE | Verdic complet gresit (deja documentat in VERDICT_BUGS_AUDIT.md Bug #1) | verdict-calculator.ts | | C3 | Sync Redis este MANUAL - nu exista auto-sync la update prompt | Dupa editare prompt din UI, trebuie trigger manual POST /api/sync-redis | sync-redis.ts | ### MARI (10) | # | Problema | Impact | Locatie | |---|---------|--------|---------| | M1 | Image AI detection prompt HARDCODAT, nu foloseste Redis key (definit dar nefolosit) | Nu poate fi actualizat fara deploy | ai-tampered-routes.ts:634 | | M2 | Disclosure patterns HARDCODATE (nu detecteaza tool-uri noi: Sora, Udio, Flux) | False negatives pe AI tool-uri noi | ai-tampered/executor.ts:190-231 | | M3 | Max 7 claims verificate, restul silentios filtrate (utilizatorul nu stie) | Texte lungi pierd claims importante | claims/executor.ts:415 | | M4 | Claims cu priority='low' sarite silentios fara indicator in raspuns | Utilizatorul nu stie ce a fost exclus | claims/executor.ts:408 | | M5 | Server ignora status-ul LLM si agreement_score dar nu logeaza discrepanta | Debug dificil cand server si LLM dau rezultate diferite | claims/executor.ts:507 | | M6 | Techniques descriptions hardcodat `.en` prefer English, fara fallback `.ro` | Daca prompt-ul e RO dar descrierile sunt EN = mixing | techniques/executor.ts:475 | | M7 | Prompt keys Techniques nu sunt in keys.ts (missing from registry) | Greu de auditat, inconsistenta cod | shared/redis/keys.ts | | M8 | Text truncat silentios (3000/10000/12000 chars) fara log sau avertizare | Context pierdut pentru texte lungi, utilizator neinformat | techniques/executor.ts, claims/executor.ts | | M9 | Disclosure patterns doar EN - nu detecteaza "generat de AI" sau "creat cu inteligenta artificiala" | Miss pe continut romanesc | ai-tampered/executor.ts:190 | | M10 | Transcription detecteaza limba dar NU o paseaza la executor | Executorul nu stie ca textul e RO/EN/FR | transcription.ts, video-processor.ts | ### MEDII (12) | # | Problema | Impact | Locatie | |---|---------|--------|---------| | m1 | Zod schemas folosesc `.passthrough()` - extra fields trec nevalidate | LLM hallucinations trec netectate | toate executoarele | | m2 | Fallback defaults prea generice: ai_probability=0 vs "analysis failed" | Nu se poate distinge 0% real de eroare | ai-tampered/executor.ts | | m3 | Evidence formatata ca text plain, nu JSON structurat | LLM poate interpreta gresit | claims/executor.ts:462 | | m4 | Indicators din framework incarcati dar NU pasati in prompt (Techniques) | LLM nu stie ce indicatori sa caute | techniques/executor.ts:473 | | m5 | Toate modelele fallback primesc acelasi prompt (no model-specific tuning) | Modele slabe pot esua pe prompt complex | toate executoarele | | m6 | Verdict explanation parsing are fallback regex dar e fragil | Daca LLM nu respecta formatul, pierde explicatia | verdict-explanation.ts:523 | | m7 | Verdict explanation cere RO+EN dar "Romanian" nu apare explicit in prompt | Depinde de LLM sa ghiceasca limba din "explanation_ro" field name | verdict-explanation.ts:101 | | m8 | Video AI detection prompt cere "AI_CONFIDENCE: X" la final - fragil | Orice variatie in format pierde scorul | video-processor.ts | | m9 | Temperature fixe per etapa, nu per complexitate text | Text scurt vs lung poate necesita temperature diferite | toate executoarele | | m10 | Status code mismatch: prompt Claims listeaza 7 coduri (incl NV) dar framework poate avea 6 | LLM poate returna cod inexistent | claims seed vs framework | | m11 | Vision model Qwen converteste URL-uri public->internal dar Gemini/GPT nu pot accesa MinIO intern | Fallback la Gemini/GPT poate esua pe imagini MinIO | vision.ts:189-196 | | m12 | Source Assessment models au timeout 15s - prea scurt pentru modele lente | Timeout prematur pe Qwen local daca e incarcat | source-assessment/executor.ts | ### MICI / INFORMATIONALE (7) | # | Problema | Impact | Locatie | |---|---------|--------|---------| | i1 | Nu exista versionare prompt-uri (nu se stie ce versiune ruleaza) | Rollback imposibil | component_prompt table | | i2 | Console logging in engleza cu emoji-uri, nu structured logging | Parse dificil in monitoring | toate executoarele | | i3 | Framework categories verdict au descrieri RO in seed dar coduri EN | Inconsistenta cosmetica | didiFramework seed | | i4 | Claim types au 9 coduri dar unele rareori folosite (PC, VC) | Polueaza prompt-ul de extragere | claims framework | | i5 | wrapUserContent() elimina `` dar nu alte tag-uri XML | Injection partial posibil cu alte tag-uri | prompt-safety.ts | | i6 | Video frames: min 3, max 10, interval 5s - hardcodat | Nu se poate ajusta per analiza | video-processor.ts | | i7 | Redis keys permanente (no TTL) - daca sync esueaza, date vechi raman la infinit | Date potentiale stale | sync-redis.ts | --- ## 12. RECOMANDARI ### Prioritate 1 - Fix imediat (fara impact frontend) 1. **Adauga fallback prompts la Techniques, AI-Tampered, Claims** (ca Source Assessment) - Hardcodeaza default-uri in executor care se folosesc daca Redis e gol - Estimare: 1-2 ore per componenta 2. **Muta Image AI detection prompt in Redis** (foloseste ConfigKeys.visionPromptAiDetection deja definit) - Estimare: 30 min 3. **Adauga disclosure patterns in romana** - "generat de AI", "creat cu inteligenta artificiala", "produs de ChatGPT" etc. - Estimare: 1 ora 4. **Fix keys.ts** - adauga prompt keys lipsa pentru Techniques - Estimare: 15 min ### Prioritate 2 - Imbunatatiri lingvistice 5. **Adauga parametru `language` la toate executoarele** - Detectat automat din transcription sau configurat per analiza - Pasează limba in prompt: "The text is in {{language}}. Analyze accordingly." - Estimare: 2-3 ore 6. **Specifica explicit "Romanian" in verdict explanation prompt** - "Write explanation_ro in Romanian language" nu doar field name - Estimare: 30 min (in Redis via UI) 7. **Paseaza limba detectata de transcription la executor** - transcription.ts deja returneaza `language` - trebuie propagat - Estimare: 1 ora ### Prioritate 3 - Imbunatatiri calitate 8. **Logeaza text truncation** - cand textul depaseste limita, log + metadata in raspuns 9. **Logeaza discrepanta LLM vs server** la Claims verification (cand server overrides LLM) 10. **Indica in raspuns claims sarite** - adauga `skipped_claims_count` in output 11. **Auto-sync Redis la update prompt** (webhook sau trigger in providers.ts) 12. **Adauga prompt versioning** - `version` column in component_prompt + Redis key cu versiune ### Prioritate 4 - Arhitecturala 13. **Standardizeaza pattern-ul de incarcare prompts** - toate executoarele sa foloseasca acelasi mecanism (cu fallback) 14. **Adauga health check prompt-uri** - endpoint care verifica ca toate prompt-urile exista in Redis 15. **Structured logging** - JSON logs cu session_id, component, stage, model, duration 16. **Model-specific prompt variations** - prompt-uri optimizate per tier de model --- ## ANEXA: Redis Keys Complete Map ``` # Framework data (permanent, synced manual) didi:framework:techniques # Ierarhie completa tehnici didi:framework:dimensions_compact # Lista compacta dimensiuni didi:framework:claims # Tipuri, statusuri, confidence claims didi:framework:verdicts # Categorii verdict, risk mappings didi:framework:weights # Ponderi componente + scenarii didi:framework:sources # Evaluare surse didi:framework:providers # Config LLM providers + API keys # Prompt-uri per componenta (permanent, synced manual) didi:config:techniques:v3:prompts:screening didi:config:techniques:v3:prompts:deep_analysis didi:config:ai-tampered:v1:prompts:screening didi:config:ai-tampered:v1:prompts:deep_analysis didi:config:claims:v1:prompts:extraction didi:config:claims:v1:prompts:verification didi:config:source-assessment:v1:prompts:extraction didi:config:source-assessment:v1:prompts:evaluation didi:config:pipeline:v1:prompts:verdict_explanation didi:config:vision:v1:prompts:extraction didi:config:vision:v1:prompts:video_frames didi:config:vision:v1:prompts:ai_detection # Stage assignments (modele LLM per etapa) didi:config:techniques:v3:stage_assignments didi:config:ai-tampered:v1:stage_assignments didi:config:claims:v1:stage_assignments didi:config:source-assessment:v1:stage_assignments # Scoring configs didi:config:techniques:v3:scoring_config didi:config:ai-tampered:v1:scoring_config didi:config:claims:v1:scoring_config didi:config:source-assessment:v1:scoring_config # Pipeline config didi:config:pipeline:v1:component_config didi:config:pipeline:v1:input_profiles didi:config:pipeline:v1:verdict_config didi:config:pipeline:v1:session_config # Vision models didi:config:ai-tampered:v1:vision_models # Verdict models didi:config:verdict:v1:available_models ```