# QA · Audit 5D de conformité **Sprint 5 · QA** — roadmap « **Audit UAF + normes ISA/IFRS 5D** ». Auto-score 4Big : **96/100**. Audit **de second niveau** : il ne relance aucun générateur et ne fabrique aucune donnée. Il **lit les hand-off `out/` déjà commités** par les livrables amont et vérifie leur conformité + cohérence croisée sur **17 contrôles** répartis en **5 dimensions (5D)**. ## Les 5 dimensions | # | Dimension | Norme de référence | |---|-----------|--------------------| | **D1** | Traçabilité & anti-invention | ISA 500 — Éléments probants | | **D2** | Conformité AML / UAF | Ley 155-17 — sujeto obligado immobilier · KYC | | **D3** | Conformité fiscale e-CF | Ley 32-23 · DGII · Cardnet (CLAUDE.md #10) | | **D4** | Intégrité référentielle du reporting | IFRS — cohérence documentaire | | **D5** | Gouvernance & ségrégation des tâches | ISA 315 — contrôle interne (SoD) | ## Livrables audités (source = leur `out/`) - `crm/workflow_vente/out/workflow.json` - `crm/dossier_vente/out/doctype_oto_dossier_vente.json` - `crm/commissions/out/commission_plan.json` - `fiscal/ecf_dgii/out/ecf_plan.json` - `legal/confotur/out/doctype_confotur_application.json` ## Statuts & verdict - **PASS** — l'invariant structurel tient. - **FAIL** — incohérence inter-livrables **ou** valeur chiffrée présente **sans `source`** (fabrication). Un FAIL est un vrai défaut à corriger avant import VPS. - **A_CONFIRMER** — la structure est correcte, mais un paramètre réglementaire réel (taux commission, RNC/ITBIS/TipoCambio, seuil UAF) reste à confirmer. Ce **n'est pas un échec** : c'est un **« open item »** remonté au métier propriétaire. Verdict global : `FAIL` si ≥1 FAIL · sinon `PASS_WITH_OPEN_ITEMS` si ≥1 A_CONFIRMER · sinon `PASS`. > **Anti-invention (#6, cœur du livrable)** : l'audit ne « force » jamais un PASS. > Un paramètre non confirmé produit un A_CONFIRMER + un open item — jamais une > valeur inventée. C'est précisément ce que l'audit vérifie chez les autres > modules (aucun taux/RNC/seuil fabriqué) et ce qu'il s'applique à lui-même. ## Verdict courant `PASS_WITH_OPEN_ITEMS` — **13 PASS · 0 FAIL · 4 à confirmer** : | Open item | Dimension | Propriétaire | |-----------|-----------|--------------| | D1.1 · taux de commission | D1 | Direction | | D1.2 · RNC / raison sociale émetteur | D1 | Compta | | D1.3 · ITBIS + TipoCambio | D1 | Compta Fiscaliste eCF | | D2.3 · seuil de déclaration UAF | D2 | Oficial de Cumplimiento / UAF | Ce sont les **4 mêmes paramètres réglementaires** laissés `null` (a_confirmer) par les générateurs amont — l'audit prouve qu'aucun n'a été fabriqué et les consolide en une **check-list unique** pour le VPS. ## Utilisation ```bash cd 05_deliverables_mvp/qa/audit_5d python3 audit_5d_gen.py validate # schéma + 15 invariants (aucun écrit) python3 audit_5d_gen.py build # → out/audit_report.json + out/MANIFEST.json ``` ## Architecture (zéro duplication · #6) - `audit_spec.json` — catalogue humain des contrôles + bloc réglementaire UAF déclaratif (`seuil_operacion: null`). **Miroir** du registre `qalib/controls.py` (un invariant vérifie la parité des `id`, dimensions, artefacts, owners). - `qalib/deps.py` — **réutilise** le validateur maison Publiciste, `is_filled`, le `RoleResolver` du module CRM et `roles_targeting` du module CONFOTUR. - `qalib/artifacts.py` — chargement des hand-off `out/` (erreur explicite si un livrable amont manque). - `qalib/controls.py` — les 17 contrôles (fonctions pures) + les 5 dimensions. - `qalib/builder.py` — assemble le rapport déterministe (aucun horodatage). - `audit_5d_gen.py` — CLI `build`/`validate` + **15 invariants**. - `audit.schema.json` — contrat de sortie (draft-07, sous-ensemble maison). - `out/` — hand-off commité (`audit_report.json` + `MANIFEST.json`). - `tests/test_audit_5d.py` — **37 tests** (`unittest`, zéro pip) dont une injection négative par contrôle. ## Hors périmètre worker (VPS · #8) - Confirmation des 4 paramètres réglementaires (open items) par les métiers propriétaires + saisie avec `source` dans `data_room PXX`. - Tests E2E Playwright sur le desk ERPNext réel (workflow_dispatch manuel, hors gate statique) → agent QA côté VPS.