# Bilko — Retention entity_type mapping (V133, MC #105965)

# Retention entity_type mapping (V133)

**MC:** #105965 (parent #105872 audit-trail program) · **Autor:** Bruce Momjian (CodeCraft) · **Verdict:** PASS (FORGE MLX peer-verify PASS) · **Grana:** azdo `feat/105965-entity-type-mapping` (nije u main)

## Problem

`document_retention_manifest.entity_type` je čuvao IMENA TABELA ('expenses','inbox_items' iz B5), a `entity_type_retention_policy` (B1) je seedovana PRAVNIM KATEGORIJAMA ('isprave','eracun'). Nisu se mapirali → RetentionPurgeWorker fail-safe skip → dry-run nalazi ~0 kandidata. Worker je (linije 53-68, 336-342) eksplicitno imenovao ovaj gap kao MC #105965.

## Rješenje — dedicated lookup tabela

**`entity_type_mapping(jurisdiction, table_entity_type, legal_entity_type)`** (V133). Odluka: zasebna tabela, NE kolona na policy tabeli.
- **Zašto tabela, ne kolona:** composite FOREIGN KEY `(jurisdiction, legal_entity_type) → entity_type_retention_policy(jurisdiction, entity_type)` na DB nivou onemogućava da mapping red pokazuje na nepostojeću pravnu kategoriju (dokazano V133MigrationTest FK-rejection testom). Kolona bi rekreirala isti "entity_type znači dvije stvari" ambiguitet i ne bi izrazila jurisdikcijski-skoupovanu many-to-one vezu.
- **Seed:** HR + BA_FED expenses/inbox_items → isprave. **RS / BA_RS namjerno NEmapirani** — nema odgovarajućeg policy reda (zasebna pravna-verifikaciona rupa, MC follow-up, NE izmišljati kategorije).
- **Worker:** rezolvira entity_type kroz mapping prvo; ako nemapiran, fallback = tretira entity_type kao već-pravnu-kategoriju (čuva staro ponašanje za fixture koji koriste 'isprave' direktno); fail-safe skip samo ako oba lookupa promaše.

## Testovi (V121 standard, Testcontainers postgres:16)

21/21 zeleno: V133MigrationTest (5: seed exactness, UNIQUE, CHECK, composite-FK rejection, grants) + 16 RetentionPurgeWorkerTest uklj. `candidatesFound > 0` na realnom seedu + companion "ukloni mapping red → isti kandidat nestane" (doslovni V121 'dokaz = ukloni → test pada'). V131/V132 regresija re-run zelena.

## Odnos prema purge lancu

Ovo je PREP: odblokira **#105881 (B2 dry-run)**. **B3 live purge (#105882) ostaje CEO-sign-off gated** — nijedan živi DELETE nije pokrenut. Evidence: `~/system/evidence/105965/verdict.md`.