# 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.
