didi-lot2-backend/backend/services/data-layer/didiDatabase/INDEX.md
2026-07-10 03:39:53 -07:00

536 lines
28 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# didiDatabase - Index
Documentatie completa pentru baza de date PostgreSQL a platformei DIDI. Baza principala DIDI ruleaza pe un **container LOCAL** (`didi-postgres`, PostgreSQL 17) pe masina de deployment, in reteaua Docker `didi-network`. Clusterul extern Patroni/HAProxy ramane configurat ca fallback HA, dar NU este folosit operational acum.
---
## PostgreSQL LOCAL (PRODUCTIE — activ)
| Parametru | Valoare |
|-----------|---------|
| Container | `didi-postgres` |
| Imagine | `postgres:17-alpine` |
| Host intern | `didi-postgres:5432` (Docker DNS pe `didi-network`) |
| Port host | `5432` expus pe `0.0.0.0:5432->5432` |
| Database | `DIDI` |
| User principal | `bos_interface` / `interface` |
### Baze de date pe instanta
Instanta `didi-postgres` contine o singura baza de business, `DIDI` (4 scheme + public, ~2012 sesiuni de analiza la data documentatiei).
| Baza / consumator | User | Folosita de | Note |
|-------------------|------|-------------|------|
| DIDI | bos_interface | agent-v3, didiFramework | schemele `bos_*` |
| DIDI (schema `public`) | bos_interface | Keycloak IAM | `KC_DB_URL=jdbc:postgresql://didi-postgres:5432/DIDI?currentSchema=public` |
| — | — | Kong API Gateway | Kong ruleaza **DBless** (config declarativ), fara baza proprie |
### Cine se conecteaza
| Serviciu | Host | Port | Database | User | Fisier config |
|----------|------|------|----------|------|---------------|
| agent-v3 | didi-postgres | 5432 | DIDI | bos_interface | agent-v3/src/shared/persistence/pg-pool.ts |
| didiFramework | didi-postgres | 5432 | DIDI | bos_interface | didiFramework/src/config/database.ts |
| Keycloak | didi-postgres | 5432 | DIDI (schema public) | bos_interface | production/.env (`KC_DB_URL`) |
Containerul local `didi-postgres` este unicul PostgreSQL de productie activ. Fostul container `staging-dataLayer-postgres` NU mai exista. Toate schemele `bos_*` + `public` sunt pe `didi-postgres`.
agent-v3 acceseaza baza prin `shared/persistence/pg-pool.ts` (`didi-postgres:5432`, DB `DIDI`, user `bos_interface`). Dupa migration 011 scrie si in `bos_analysis.moderation_queue` (prin `moderation/queue-manager.ts`) si citeste coloanele HIL noi de pe `analysis_session`.
didiFramework scrie in `bos_parammgmt.moderation_config`, `sensitive_topic`, `moderation_role` (introduse de migration 011).
---
## Baza de date DIDI -- Schema completa
4 scheme + public, ~50 tabele total.
---
### Schema: bos_analysis (7 tabele + 1 view)
Scrisa de agent-v3 (pg-adapter.ts, moderation/queue-manager.ts). Citita si de didiFramework (history.ts, sync-analysis.ts).
#### analysis_session
Tabelul central -- o inregistrare per analiza.
| Coloana | Tip | Scop |
|---------|-----|------|
| session_id | TEXT PK | UUID sesiune |
| user_id | TEXT | ID utilizator |
| user_email | TEXT | Email utilizator |
| input_type | TEXT | text, url, image, audio, video |
| input_text | TEXT | Text de analizat |
| input_url | TEXT | URL analizat |
| input_media_url | TEXT | URL media MinIO |
| input_hash | TEXT | Hash input (deduplicare) |
| status | TEXT | running, completed, failed |
| components_run | TEXT[] | Componente rulate |
| components_skipped | TEXT[] | Componente sarite |
| risk_score | NUMERIC | Scor risc final (0-100) |
| risk_category | TEXT | Categorie risc |
| risk_level | TEXT | Nivel risc |
| confidence | NUMERIC | Incredere (0-100) |
| confidence_level | TEXT | Nivel incredere |
| started_at | TIMESTAMP | Start procesare |
| completed_at | TIMESTAMP | Sfarsit procesare |
| total_duration_ms | INTEGER | Durata totala ms |
| scenario_applied | TEXT | Scenariu ponderi aplicat |
| topic_applied | TEXT | Topic detectat |
| source_app | TEXT | web (default) |
| api_version | TEXT | v3 (default) |
| created_at | TIMESTAMP | Data creare |
Coloane HIL adaugate prin migration 011 (2026-05-01):
| Coloana | Tip | Scop |
|---------|-----|------|
| review_status | TEXT default 'none' (CHECK: none\|pending\|in_review\|resolved\|declined) | HIL state |
| human_corrected | BOOLEAN default false | true daca moderator a corectat |
| human_corrections | JSONB NULL | Diff-style corrections {verdict?, techniques?, ai_tampered?, claims?} |
| verified_by | TEXT NULL | keycloak_id moderator |
| verified_at | TIMESTAMPTZ NULL | When resolved |
| review_notes | TEXT NULL | Optional moderator notes |
Index partial: `idx_analysis_session_review_status WHERE review_status != 'none'` -- majoritatea sesiunilor raman 'none', sunt sarite la scan.
#### analysis_techniques
O inregistrare per sesiune -- rezultat componenta tehnici de manipulare.
| Coloana | Tip | Scop |
|---------|-----|------|
| session_id | TEXT FK | Referinta sesiune |
| manipulation_score | NUMERIC | Scor manipulare (0-100) |
| total_severity | NUMERIC | Severitate totala |
| dimensions_affected | TEXT[] | Dimensiuni afectate |
| techniques_count | INTEGER | Numar tehnici detectate |
| techniques_detected | JSONB | Lista tehnici cu detalii |
| coupling_context | JSONB | Context cuplare inter-tehnici |
| llm_screening | TEXT | Model LLM screening |
| llm_deep | TEXT | Model LLM deep analysis |
| screening_duration_ms | INTEGER | Durata screening |
| deep_analysis_duration_ms | INTEGER | Durata analiza profunda |
| total_duration_ms | INTEGER | Durata totala |
| fallbacks_screening | INTEGER | Fallback-uri screening |
| fallbacks_deep | INTEGER | Fallback-uri deep |
#### analysis_ai_tampered
O inregistrare per sesiune -- detectie continut AI/manipulat.
| Coloana | Tip | Scop |
|---------|-----|------|
| session_id | TEXT FK | Referinta sesiune |
| ai_probability | NUMERIC | Probabilitate AI (0-100) |
| verdict | TEXT | Verdict AI detection |
| risk_score | NUMERIC | Scor risc AI |
| categories_affected | TEXT[] | Categorii afectate |
| indicators_count | INTEGER | Numar indicatori |
| disclosure_detected | BOOLEAN | Disclosure detectat |
| disclosure_explicit | BOOLEAN | Disclosure explicit |
| disclosure_text | TEXT | Text disclosure |
| indicators_detected | JSONB | Lista indicatori |
| coupling_context | JSONB | Context cuplare |
| llm_screening | TEXT | Model screening |
| llm_deep | TEXT | Model deep |
| screening_duration_ms | INTEGER | Durata screening |
| deep_analysis_duration_ms | INTEGER | Durata deep |
| total_duration_ms | INTEGER | Durata totala |
| fallbacks_screening | INTEGER | Fallback-uri screening |
| fallbacks_deep | INTEGER | Fallback-uri deep |
| content_type | TEXT | text, image, audio, video |
| image_analysis | JSONB | Rezultat analiza imagine |
#### analysis_claims
O inregistrare per sesiune -- verificare afirmatii.
| Coloana | Tip | Scop |
|---------|-----|------|
| session_id | TEXT FK | Referinta sesiune |
| total_claims | INTEGER | Total afirmatii |
| verified_true | INTEGER | Verificate adevarate |
| verified_false | INTEGER | Verificate false |
| unverified | INTEGER | Neverificate |
| opinions | INTEGER | Opinii |
| credibility_score | NUMERIC | Scor credibilitate |
| interpretation | TEXT | Interpretare |
| claims_by_status | JSONB | Claims grupate pe status |
| claims_by_type | JSONB | Claims grupate pe tip |
| claims_verified | JSONB | Detalii verificare |
| llm_extraction | TEXT | Model extragere |
| llm_verification | TEXT | Model verificare |
| extraction_duration_ms | INTEGER | Durata extragere |
| verification_duration_ms | INTEGER | Durata verificare |
| total_duration_ms | INTEGER | Durata totala |
| web_searches_made | INTEGER | Cautari web efectuate |
#### analysis_domain
O inregistrare per sesiune -- analiza domeniu/sursa.
| Coloana | Tip | Scop |
|---------|-----|------|
| session_id | TEXT FK | Referinta sesiune |
| domain | TEXT | Domeniu analizat |
| verdict | TEXT | Verdict domeniu |
| trust_score | NUMERIC | Scor incredere |
| risk_level | TEXT | Nivel risc |
| age_days | INTEGER | Varsta domeniu (zile) |
| age_category | TEXT | Categorie varsta |
| domain_created_at | TIMESTAMP | Data creare domeniu |
| is_blacklisted | BOOLEAN | Pe lista neagra |
| reputation_score | NUMERIC | Scor reputatie |
| has_ssl | BOOLEAN | Are SSL |
| ssl_valid | BOOLEAN | SSL valid |
| ssl_issuer | TEXT | Emitent SSL |
| registrar | TEXT | Registrar domeniu |
| organization | TEXT | Organizatie |
| country | TEXT | Tara |
| red_flags | TEXT[] | Semnale alarma |
| warnings | TEXT[] | Avertismente |
| duration_ms | INTEGER | Durata analiza |
#### analysis_verdict
O inregistrare per sesiune -- verdictul final agregat.
| Coloana | Tip | Scop |
|---------|-----|------|
| session_id | TEXT FK | Referinta sesiune |
| risk_score | NUMERIC | Scor risc final |
| risk_category | TEXT | Categorie risc |
| risk_category_color | TEXT | Culoare categorie |
| risk_level | TEXT | Nivel risc |
| risk_level_color | TEXT | Culoare nivel |
| severity | TEXT | Severitate |
| recommended_action | TEXT | Actiune recomandata |
| confidence | NUMERIC | Incredere |
| confidence_level | TEXT | Nivel incredere |
| score_manipulation | NUMERIC | Scor componenta manipulare |
| score_claims | NUMERIC | Scor componenta claims |
| score_ai | NUMERIC | Scor componenta AI |
| score_source | NUMERIC | Scor componenta sursa |
| score_context | NUMERIC | Scor context |
| applied_weights | JSONB | Ponderi aplicate |
| override_applied | BOOLEAN | Override aplicat |
| override_type | TEXT | Tip override |
| override_reason | TEXT | Motiv override |
| override_adjustment | NUMERIC | Ajustare override |
| context_summary | JSONB | Sumar context |
| components_used | TEXT[] | Componente folosite |
| weights_source | TEXT | Sursa ponderi |
| duration_ms | INTEGER | Durata calcul |
| explanation_ro | TEXT | Explicatie romana (migration 001) |
| explanation_en | TEXT | Explicatie engleza (migration 001) |
| virality_score | NUMERIC | Scor viralitate (0-100) |
| virality_level | TEXT | Nivel viralitate |
| virality_factors | JSONB | Factori viralitate |
#### moderation_queue (adaugat prin migration 011)
Stare workflow HIL (Human-in-the-Loop). Un rand per sesiune marcata de triage pentru review uman.
| Coloana | Tip | Scop |
|---------|-----|------|
| queue_id | BIGSERIAL PK | Auto-increment |
| session_id | UUID FK -> analysis_session(session_id) ON DELETE CASCADE | Referinta sesiune |
| priority | INTEGER (1-5) | 1=highest (user_flagged), 3=low_confidence, 4=sensitive_topic |
| enqueue_reason | TEXT | flagged \| low_confidence \| sensitive_topic \| mixed |
| enqueue_meta | JSONB | Triage metadata (risk_score, confidence, topic detected) |
| status | TEXT | pending \| in_review \| resolved \| declined \| auto_closed |
| assigned_to | TEXT | keycloak_id moderator |
| assigned_at | TIMESTAMPTZ | When claimed |
| resolved_at | TIMESTAMPTZ | When closed |
| resolved_by | TEXT | keycloak_id |
| resolution_action | TEXT | approved \| corrected \| rejected |
| time_in_queue_ms | INTEGER | enqueue -> start review |
| time_in_review_ms | INTEGER | start review -> resolved |
| created_at | TIMESTAMPTZ | Default now() |
Indecsi: `idx_moderation_queue_status_priority` (partial WHERE status IN ('pending','in_review')), `idx_moderation_queue_session`, `idx_moderation_queue_assigned`.
#### v_analysis_full (VIEW)
JOIN pe toate 6 tabelele de analiza (session + techniques + ai_tampered + claims + domain + verdict). Definit in migration 001. Selecteaza doar coloane sumar (nu JSONB-uri grele): session metadata, verdict scores, techniques summary, ai probability, claims summary, domain summary + explanation_ro/en.
Migration 011 NU modifica view-ul: coloanele HIL noi de pe `analysis_session` (review_status, human_corrected etc.) sunt acoperite automat de `SELECT s.*`.
---
### Schema: bos_parammgmt (~40 tabele)
Scrisa si citita exclusiv de didiFramework. Contine toti parametrii de configurare ai platformei. Sincronizata in Redis prin POST /api/sync-redis.
Search path setat in database.ts: `SET search_path TO bos_parammgmt, public`.
#### Tabel de baza
| Tabel | Scop | Rute CRUD |
|-------|------|-----------|
| parameter | Tabel parinte versionare (parameter_id, parameter_type, valid_from/to) | intern (FK din toate celelalte) |
#### Tehnici de manipulare (ierarhie 4 nivele)
| Tabel | Scop | Rute CRUD |
|-------|------|-----------|
| dimension | Dimensiuni top-level (code, name, weight) | /api/dimensions |
| subdimension | Sub-dimensiuni (FK dimension) | /api/subdimensions |
| technique | Tehnici individuale (FK subdimension, severity, confidence, detectability) | /api/techniques |
| technique_indicator | Indicatori detectie per tehnica (name, description, max_intensity 1-3) | /api/indicators |
| technique_validation_rule | Reguli validare per tehnica | /api/validation-rules |
#### Evaluare sursa
| Tabel | Scop | Rute CRUD |
|-------|------|-----------|
| platform | Platforme social media (code, name, score) | /api/platforms |
| platform_modifier | Modificatori platforma (condition, score) | /api/platform-modifiers |
| source_credibility | Factori credibilitate sursa | /api/source-credibility |
| source_type | Tipuri sursa (base_score) | intern |
| source_assessment | Evaluare sursa | intern |
| domain_age_score | Scor varsta domeniu (range-uri, impact) | /api/domain-age-scores |
| domain_risk_level | Nivele risc domeniu (range-uri, interpretare) | /api/domain-risk-levels |
| domain_red_flag | Red flags domeniu (condition, severity, action) | /api/domain-red-flags |
| author_classification | Clasificari autor (code, name, score) | /api/author-classifications |
| author_credibility | Credibilitate autor (impact) | /api/author-credibility |
#### Claims
| Tabel | Scop | Rute CRUD |
|-------|------|-----------|
| claim | Statusuri claim (TRUE, FALSE, UNVERIFIED, OPINION) | /api/claims/status |
| claim_type | Tipuri claim (factual, statistic, cauzal, etc.) | /api/claims/types |
| confidence | Nivele incredere (level, color, action, range) | /api/claims/confidence |
| interpretation | Interpretare scor credibilitate (range-uri) | /api/claims/interpretation |
#### Verdicte si scoruri
| Tabel | Scop | Rute CRUD |
|-------|------|-----------|
| verdict_category | Categorii verdict (code, range, color) | /api/verdicts/categories |
| risk_mapping | Mapping risc (level, range, color) | /api/verdicts/risk |
| severity_assessment | Evaluare severitate (category, range, action) | /api/verdicts/severity |
#### Ponderi
| Tabel | Scop | Rute CRUD |
|-------|------|-----------|
| component_weight | Ponderi componente (manipulation, claims, source, ai, context) | /api/weights/components |
| weight_scenario | Scenarii ponderi (per topic: health, politics, etc.) | /api/weights/scenarios |
| multiplier | Multiplicatori (topic, temporal, reach) | /api/weights/multipliers |
#### Provideri LLM
| Tabel | Scop | Rute CRUD |
|-------|------|-----------|
| llm_provider | Configurare provideri (base_url, auth_type, rate_limit) | /api/providers/configs |
| llm_model | Modele LLM (context_window, cost, capabilities) | /api/providers/models |
| component_provider_assignment | Assignment componenta -> model (legacy, pre-migration-002) | /api/providers/assignments |
| provider_api_key | Chei API per provider (criptate, usage tracking) | /api/providers/keys |
#### Configurare unificata componente (adaugat prin migration 002, extinsa cu tier prin 006)
| Tabel | Scop | Rute CRUD |
|-------|------|-----------|
| component_stage_assignment | Assignment model pe etapa + **tier** (free/premium) cu fallback chain. Unique: `(component_code, stage_code, tier, fallback_order)`. | /api/providers/assignments (suporta `?tier=X` filter) |
| component_prompt | Prompturi LLM per componenta/etapa (system_prompt, user_template) | /api/providers/prompts |
| component_config | Config JSONB catch-all per componenta (scoring, patterns, vision models) | intern (sync-redis) |
**Component codes prezente dupa migrations 006-009**:
- `techniques` (stages: techniques_screening, techniques_deep)
- `ai-tampered` (stages: ai_tampered_screening, ai_tampered_deep)
- `claims` (stages: claims_extraction, claims_verification)
- `source-assessment` (stages: source_assessment_extraction, source_assessment_evaluation)
- `vision` (stage: image_analysis — OCR + AI detection + video frames, Etapa 4)
- `verdict` (stage: verdict_review — LLM verdict reviewer care ajusteaza scorul final + explicatii RO/EN, Etapa 5)
Fiecare componenta/stage are **2 tiers** (`free` + `premium`), fiecare cu propriul fallback chain (primary + 2-3 fallbacks). Ex: `techniques_screening` are 4 randuri `tier='free'` + 4 randuri `tier='premium'`.
Tier-ul final folosit la runtime se deriveaza din `planType` al userului (returnat de check-credits):
- `plan_type` 1-3 (Freemium/Starter/Basic) → `tier='free'`
- `plan_type` 4-6 (Pro/Business/Enterprise) → `tier='premium'`
#### Chei API extensie browser
| Tabel | Scop | Rute CRUD |
|-------|------|-----------|
| extension_api_key | Chei API extensie browser (key, user_id, usage_count) | /api/extension-keys |
#### Profiluri verdict per input type (adaugat 2026-03-21)
| Tabel | Scop | Rute CRUD |
|-------|------|-----------|
| input_type_profile | 6 profiluri verdict (text, image, audio, video, url) cu ponderi per componenta, reguli INCONCLUSIVE, disclosure multipliers | /api/input-profiles |
| profile_override_config | Override-uri per profil (8 tipuri × 6 profiluri = 48 randuri) | /api/input-profiles/:code/overrides |
Coloane noi in tabele existente:
- `claim_type.unverified_weight` NUMERIC(3,2) — ponderea UV per tip claim (0.25-0.50)
- `claim.credibility_weight` NUMERIC(3,2) — ponderea credibilitate per status claim (0.00-1.00)
#### HIL Moderation config (adaugat prin migration 011, 2026-05-01)
| Tabel | Scop | Rute CRUD |
|-------|------|-----------|
| moderation_config | Single-row settings (CHECK config_id=1): triage thresholds (confidence_low, risk_grey_min/max, queue_relax_at, queue_strict_at) + brain client config (brain_enabled, brain_url, lookup/write timeouts, brain_confidence_min_silver, brain_semantic_threshold, brain_per_component JSONB). 14 fields total. Sincronizat in Redis ca `didi:config:moderation:v1:settings`. | /api/moderation-config |
| sensitive_topic | Topics care declanseaza HIL review (seed: elections, health, war, covid, climate). topic_code regex `[a-z0-9_]+` UNIQUE; soft delete via is_active. Sincronizat in Redis ca `didi:config:moderation:v1:sensitive_topics`. | /api/sensitive-topics |
| moderation_role | Mapping Keycloak role -> HIL permissions (seed: moderator, senior_moderator). Toggles: can_resolve, can_escalate, can_force_gold_brain, is_active. role_code este PK (immutable). Sincronizat in Redis ca `didi:config:moderation:v1:roles`. | /api/moderation-roles |
---
### Schema: bos_sysadmin (5 tabele)
Scrisa si citita de didiFramework (auth.ts, admin.ts, subscriptions.ts). Management utilizatori si abonamente.
| Tabel | Scop | Rute |
|-------|------|------|
| internet_user | Utilizator platforma (internet_user_id, person_id FK, credits_remained, credits_spent) | /api/auth/me (auto-creare), /api/admin/users |
| user_credential | Credentiale (email, keycloak_id, enrollment_type, subscription_status) | /api/auth/me, /api/admin/users |
| subscription | Abonament activ (internet_user_id FK, plan FK, status, activation_date) | /api/subscriptions |
| subscription_plan | Planuri abonament (plan_name, plan_type, price, credits, limite storage/media, costuri per tip) | /api/admin/plans |
| ai_credit_usage | Log consum credite (session_id, user_id, credits_used, input_type) | /api/auth/deduct-credits |
---
### Schema: bos_subscriber (4 tabele)
Scrisa de didiFramework la inregistrare utilizator. Date personale.
| Tabel | Scop |
|-------|------|
| person | Entitate persoana (person_id, person_type, status) |
| address | Adresa (address_id, address_type) |
| persoana_fizica | Persoana fizica romaneasca (nume, prenume, FK person, FK address) |
| contact | Contact (person_id FK, contact_type_id, contact_info) |
---
### Schema: public
| Tabel | Scop |
|-------|------|
| waitlist | Lista de asteptare pre-lansare (vezi sectiunea container local) |
---
## Migratii aplicate
| Fisier | Ce face | Aplicata de |
|--------|---------|-------------|
| didiFramework/sql/migrations/001_add_explanation_columns.sql | Adauga explanation_ro, explanation_en la analysis_verdict + creeaza view v_analysis_full | didiFramework la pornire |
| didiFramework/sql/migrations/002_add_component_pilot_config.sql | Adauga tabele component_stage_assignment, component_prompt, component_config | didiFramework la pornire |
| didiFramework/sql/migrations/006_add_tier_column.sql | `component_stage_assignment.tier varchar(20) DEFAULT 'free'` + unique constraint pe (component_code, stage_code, tier, fallback_order) | Manual |
| didiFramework/sql/migrations/007_seed_premium_assignments.sql | Seed 32 rows `tier='premium'` pentru 8 stages LLM (techniques/ai-tampered/claims/source-assessment) | Manual |
| didiFramework/sql/migrations/008_seed_vision_assignments.sql | Seed 7 rows pentru component `vision` stage `image_analysis` (3 free + 4 premium) | Manual |
| didiFramework/sql/migrations/009_seed_verdict_assignments.sql | Seed 8 rows pentru component `verdict` stage `verdict_review` (4 free + 4 premium) | Manual |
| didiFramework/sql/migrations/011_add_moderation.sql | HIL Moderation foundation: 6 coloane pe `analysis_session`, tabela `moderation_queue`, 3 tabele config in bos_parammgmt (moderation_config, sensitive_topic, moderation_role) + seeds. Companion `011_rollback.sql`. session_id este UUID, FK foloseste UUID. | Manual |
Migratiile ulterioare (012 topic_volatility, 013 user_audit_log, 014 atomic_path_prefix, 015 social_post, 016 input_profile_versions, 017 model_catalog_attributes) sunt incluse integral in seed-ul canonic `DIDI_full_export_2026-07-02.sql`. Un restore curat al seed-ului produce schema completa la zi (fara a mai rula migratiile manual). Cateva dintre ele sunt descrise mai jos in "Schema additions".
---
## Container `staging-dataLayer-postgres` (ISTORIC — inexistent)
> Nota istorica: un container `staging-dataLayer-postgres` (postgres:15-alpine, database `misinformation_db`) a servit candva doar tabela `public.waitlist` + ~22 tabele legacy goale din vechiul orchestrator Python. **Acest container NU mai exista.** Baza de business (inclusiv `public.waitlist`, daca este folosita) este acum in database-ul `DIDI` de pe containerul `didi-postgres`. Orice referinta la `staging-dataLayer-postgres`, `misinformation_db` sau la path-ul arhiva `didiDatabase-legacy/` este stale si nu mai reflecta realitatea.
---
## Diagrama conexiuni
```
+-----------------------------------+
| didi-postgres:5432 |
| Container LOCAL (postgres:17) |
| didi-network |
+-----------------------------------+
| Database: DIDI |
+-----------------------------------+
| bos_analysis (agent-v3) |
| bos_parammgmt (didiFramework) |
| bos_sysadmin (didiFramework) |
| bos_subscriber (didiFramework) |
| public (Keycloak schema) |
+-----------------------------------+
^ ^ ^
| | |
agent-v3 didiFramework Keycloak
(schema public)
Kong ruleaza DBless (fara baza proprie).
```
---
## Fisiere in directorul didiDatabase
```
DIDI_full_export_2026-07-02.sql -- SEED CANONIC (23 MB): pg_dump complet DIDI
(schema + date + migratiile 001-017). Restorabil
cu --clean --if-exists --no-owner.
Dockerfile -- Build imagine postgres cu init (pastrat pentru rebuild container)
MIGRATION.md -- Note migrare PostgreSQL (atentie: contine si sectiuni stale despre cluster)
REBUILD.md -- Reteta rebuild baza pe alt host din seed-ul canonic
ha-cluster/ -- Config optional HA (docker-compose + haproxy.cfg) pentru fallback cluster
.gitignore -- Exclude .env, data/
INDEX.md -- Aceasta documentatie
```
Nota seed: fisierul canonic actual este `DIDI_full_export_2026-07-02.sql`. Seed-ul vechi `DIDI_full_export_2026-03-22.sql` (fara migratiile 016/017) si pachetul demo (`DIDI_demo_seed_2026-07-02.sql` + `demo-seed/`) au fost arhivate **in afara repo-ului** (`/home/admin365/didi_seed_archive_2026-07-08/`) — livrarea foloseste DOAR full seed-ul curent.
---
## Ce NU face containerul local `didi-postgres`
- Nu are replicare (instanta singulara); HA se obtine doar comutand pe fallback-ul cluster din `ha-cluster/`
- Nu are backup automat integrat (backup manual din seed / pg_dump)
- Nu are SSL/TLS intern
- Este sursa unica de adevar pentru datele DIDI; Redis (`didi:config:*`, `didi:framework:*`) e cache derivat, regenerat cu `sync-redis`
---
## Schema additions (2026-05-04 → 2026-05-05)
### `bos_parammgmt.sensitive_topic` — extins (migration 012)
ALTER ADD: `volatility ('volatile'|'evolving'|'stable')`, `cache_ttl_hours integer (1-26280)`, `recency_window_days integer (1-365)`, `half_life_days numeric (>0)`. Seed: war/elections=volatile@24h/7d/3d, health/covid=evolving@168h/14d/14d, climate=stable@720h/180d/180d, fraud_test=defaults. Used by brain `topic_volatility.py` to override classifier TTL per topic.
### `bos_sysadmin.user_audit_log` — nou (migration 013)
```
audit_id bigserial PK
internet_user_id integer (NULL pentru keycloak-only useri)
target_email text
target_keycloak_id text
actor_keycloak_id text -- extras din JWT (sub claim)
actor_email text
action text NOT NULL -- user.{update,delete,sync,email_verified,subscription,roles,group,reset_password}
payload jsonb DEFAULT '{}' -- diff before/after sau parametri operațiune
request_ip text
user_agent text
created_at timestamptz NOT NULL DEFAULT now()
```
4 indexuri: user (partial), actor, action+time, time. Powers tab "Audit Log" în UserManagement DIDI admin.
### Brain tables (alongside Atomic, prefix `brain_*`, public schema)
| Tabela | Scop | Cheie unique |
|---|---|---|
| `brain_analysis_atom` (existed) | Cache rezultate full-component LLM (techniques/ai_tampered/claims). +7 coloane noi: `volatility`, `topic_codes text[]`, `entity_bindings jsonb`, `ttl_hours_used`, `last_audited_at`, `audit_history jsonb` (last-50 cap), `consecutive_audit_passes` | `(content_hash, component, prompt_hash)` |
| `brain_verification_cache` (existed) | Cache verdict LLM per claim. Same +7 coloane | `(claim_hash, tier)` |
| `brain_fact_status` (NOU, 2026-05-04) | Current truth pentru triplete `(subject, predicate, object)`. Coloane: `current_truth bool|NULL`, `current_version_id`, `current_confidence`, `last_verified_at`, `last_evidence_urls jsonb`, `volatility`, `topic_codes`, `next_check_at`, `check_interval_hours`, `moderator_locked bool`, `moderator_user_id`, `moderator_notes` | `canonical_form_hash` |
| `brain_fact_version` (NOU) | Temporal versioning. `truth_value bool`, `confidence`, `valid_from`, `valid_to (NULL=current)`, `source_atom_ids text[]`, `evidence_urls jsonb`, `llm_reasoning`, `created_by ('auto'|'moderator'|'breaking_news_watcher'|'auditor'|'extractor')`, `moderator_user_id`, `notes` | bigserial; FK fact_id → fact_status ON DELETE CASCADE |
| `brain_audit_log` (NOU) | Cache mutation log: judge decisions, mass invalidations, gold promotions, fact truth changes. Coloane: `action`, `target_table`, `target_id`, `actor`, `payload jsonb` | bigserial |
GIN index-uri pe `topic_codes` (pentru topic-scoped invalidate). Partial index pe `cache_tier IN ('gold','silver') AND volatility != 'stable'` pentru auditor sweep. Schema migrează idempotent la fiecare brain `db.connect()`.
### DB live counts (2026-05-05, pe `didi-postgres`)
```
internet_users: 21 | brain_fact_status: 4
user_credentials: 20 | brain_fact_version: 1 (Putin → TRUE locked smoke-admin)
subscriptions: 20 | brain_audit_log: ~10 (mostly fact_truth_changed + reset_password)
subscription_plans: 20 | user_audit_log: live (logged on every PUT/DELETE/role/group)
```