Files
oto-enterprise-os-dtp/05_activity_log/2026-07-30.md
T
Claude Code DTP Worker c06e15c058 [DTP-Worker] Sprint 5 · Générateur Audit 5D conformité (QA · roadmap L58)
Audit de second niveau : lit les hand-off out/ des livrables (workflow vente,
Dossier Vente, commissions, e-CF DGII, CONFOTUR) et vérifie 17 contrôles en
5 dimensions (D1 Traçabilité/ISA 500 · D2 AML-UAF/Ley 155-17 · D3 Fiscal
e-CF/Ley 32-23 · D4 Intégrité/IFRS · D5 Gouvernance-SoD/ISA 315).

Anti-invention #6 : paramètre réglementaire non confirmé → A_CONFIRMER (open
item assigné au métier), jamais fabriqué. Verdict PASS_WITH_OPEN_ITEMS (13 PASS,
0 FAIL, 4 à confirmer). Réutilise validateur Publiciste + RoleResolver CRM +
roles_targeting CONFOTUR (zéro duplication).

37 tests · 15 invariants · build déterministe · régression 341 tests verts.
Job CI qa-audit-5d-tests + gate.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-30 08:41:57 +00:00

303 lines
16 KiB
Markdown
Raw 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.
# Activity Log · 2026-07-30 · Claude Code DTP
## Session `20260730_082714` (session 17)
**Tâche** : **Sprint 5 · QA** — Générateur de l'**Audit 5D de conformité**
(roadmap Sprint 5 · QA « **Audit UAF + normes ISA/IFRS 5D** »). Dernier volet
Sprint 5 réalisable en repo : ONAPI/Legal livré (session 16) et Mobile
(builds/submit stores) dépend d'API externes / VPS (hors périmètre worker · #8).
**Décision d'architecture** : audit de **second niveau** — sa matière première
est le hand-off `out/` **déjà commité** par les générateurs amont (workflow
vente, DocType Dossier Vente, barème commissions, plan e-CF DGII, DocType
CONFOTUR). Il ne relance rien et ne fabrique aucune donnée : il vérifie la
conformité + la cohérence croisée sur **17 contrôles** en **5 dimensions** :
D1 Traçabilité (ISA 500) · D2 AML/UAF (Ley 155-17) · D3 Fiscal e-CF (Ley 32-23 ·
DGII · Cardnet) · D4 Intégrité IFRS · D5 Gouvernance/SoD (ISA 315).
**Fichiers créés**`05_deliverables_mvp/qa/audit_5d/` :
- `audit_spec.json` (catalogue des 17 contrôles + bloc UAF déclaratif ·
`seuil_operacion: null`)
- `qalib/{__init__,deps,artifacts,controls,builder}.py` (`deps` **réutilise** le
validateur maison Publiciste, `is_filled`, le `RoleResolver` du CRM et
`roles_targeting` de CONFOTUR · `controls` = 17 contrôles purs · `builder`
déterministe)
- `audit_5d_gen.py` (CLI `build`/`validate` · **15 invariants**)
- `audit.schema.json` (contrat de sortie draft-07)
- `out/{audit_report,MANIFEST}.json` (hand-off) · `tests/test_audit_5d.py`
(**37 tests** · une injection négative par contrôle) · `README.md` · `.gitignore`
**Fichiers modifiés** :
- `.gitea/workflows/ci.yml` : job `qa-audit-5d-tests` + ajout au `gate`.
**Anti-invention (cœur · #6)** : l'audit **remonte, ne fabrique pas**. Un
paramètre réglementaire non confirmé produit **A_CONFIRMER** (open item assigné au
métier), jamais une valeur inventée « pour faire PASS ». **FAIL** = incohérence
inter-livrables OU valeur chiffrée **sans `source`**. Un invariant refuse tout
FAIL sur les livrables courants ; un test injecte une fabrication par contrôle
et vérifie le basculement en FAIL.
**Résultat** : verdict `PASS_WITH_OPEN_ITEMS` — **13 PASS · 0 FAIL · 4 à
confirmer** (D1.1 taux → Direction ; D1.2 RNC émetteur → Compta ; D1.3
ITBIS/TipoCambio → Fiscaliste eCF ; D2.3 seuil UAF → Oficial de Cumplimiento).
Ce sont les 4 mêmes paramètres `null` des générateurs amont, consolidés en une
check-list unique de confirmation VPS.
**Vérifs** : 37/37 tests ; gate CI local vert (guard + JSON + docs + YAML) ;
régression **341 tests verts** au total ; build déterministe.
**Hors périmètre worker (VPS · #8)** : confirmation des 4 paramètres
réglementaires (avec `source`, dans `data_room PXX`) + tests E2E Playwright sur
le desk réel → métiers propriétaires / agent QA VPS.
**Détail complet** : voir
[`05_deliverables_mvp/daily_reports/2026-07-30-session17.md`](../05_deliverables_mvp/daily_reports/2026-07-30-session17.md).
**Auto-score 4Big** : 96/100.
## Session `20260730_075712` (session 16)
**Tâche** : **Sprint 5 · ONAPI/Legal** — Générateur du **DocType porteur
`CONFOTUR Application`** (roadmap **L55** « Refactor `oto_module_confotur_application.py`
→ dépôts automatiques »). Sprint 4 étant clos (sessions 11-15), c'est le premier
volet Sprint 5 réalisable en repo — Mobile (builds/submit stores) et déploiement
dépendent d'API externes / VPS (hors périmètre worker · #8).
**Gap comblé** : le DocType custom `CONFOTUR Application` est référencé par le
contrat RBAC (3 rôles) et par les états terminaux du workflow vente
(`confotur_depose`/`confotur_approuve`), mais **aucun générateur ne le produisait**
(la session 15 le listait comme DocType custom « à créer » côté VPS).
**Décision d'architecture (#1 ERPNext natif)** : le porteur d'un dossier CONFOTUR
**EST un DocType Frappe custom soumissible** → on livre le fixture natif, pas de
module externe.
**Fichiers créés**`05_deliverables_mvp/legal/confotur/` :
- `confotur_spec.json` (structure métier seule · zéro chiffre)
- `cflib/{__init__,frappe,rbac_scan,builder}.py` (`frappe` VALID_PERMS incluant
`report` · `rbac_scan` lit les rôles RBAC visant le DocType · réutilise le
`RoleResolver` de `workflow_vente`)
- `confotur_application_gen.py` (CLI `build`/`validate` · **14 invariants**)
- `confotur.schema.json` (contrat de sortie draft-07)
- `out/{doctype_confotur_application,MANIFEST}.json` (hand-off) ·
`tests/test_confotur.py` (**44 tests** dont 8 négatifs) · `README.md` · `.gitignore`
**Fichiers modifiés** :
- `.gitea/workflows/ci.yml` : job `legal-confotur-tests` + ajout au `gate`.
**Anti-invention (cœur · #6)** : les **permissions du DocType SONT, mot pour mot,
les `permissions_cibles` RBAC** (ventes-confotur/legal-onapi/legal-directeur) — ni
ajout ni retrait ; `is_submittable` déduit de l'action `submit` RBAC ;
`estado`/`dossier_vente` dérivés du workflow ; **aucun** taux/loi/montant/référence
d'autorité (deux invariants refusent tout champ de type montant et tout `default`) ;
paramètres légaux réels → `data_room P05/P07` côté VPS. Les `depot_events` (« dépôts
automatiques ») dérivent des transitions confotur du workflow.
**Résultat** : DocType `CONFOTUR Application` — 18 champs (14 de donnée), 4 sections,
3 rôles, soumissible, 2 évènements de dépôt.
**Vérifs** : 44/44 tests ; gate CI local vert (guard + JSON + docs + YAML) ;
régression **304 tests verts** au total ; build déterministe.
**Hors périmètre worker (VPS · #8)** : créer le module `OTOV7 CONFOTUR`, importer
le DocType, câbler les `depot_events` sur le Workflow, renseigner les paramètres
légaux/fiscaux depuis `data_room P05/P07` → agent ONAPI/Legal / ERPNext Backend.
**Détail complet** : voir
[`05_deliverables_mvp/daily_reports/2026-07-30-session16.md`](../05_deliverables_mvp/daily_reports/2026-07-30-session16.md).
**Auto-score 4Big** : 96/100.
## Session `20260730_072711` (session 15)
**Tâche** : Sprint 4 · Frontend Console — Générateur de **Workspaces ERPNext
(5 portails rôle)** (roadmap ligne 49 « 5 portails (Ventes/Construction/Achat/
Compta/Direction) » ; dernier volet ouvert de Sprint 4, les volets CRM et ERPNext
Backend ayant été livrés sessions 11-14).
**Décision d'architecture (#1 ERPNext natif)** : dans ERPNext v15, le portail de
landing par rôle **EST le DocType `Workspace`** → on livre 5 Workspaces natifs,
pas de framework de dashboard externe.
**Fichiers créés**`05_deliverables_mvp/frontend/portails/` :
- `portails_spec.json` (mise en page seule : cartes/raccourcis/thème · aucun
DocType ni rôle hors contrat)
- `wslib/{__init__,frappe,builder}.py` (connaissance Frappe `Workspace` + enfants ·
dérive rôles et DocTypes du contrat `rbac_50_roles.json`)
- `workspaces_gen.py` (CLI `build`/`validate` · 12 invariants de cross-cohérence)
- `workspace.schema.json` (contrat de sortie draft-07)
- `out/{workspace,MANIFEST}.json` (hand-off) · `tests/test_workspaces.py`
(19 tests dont 4 négatifs) · `README.md` · `.gitignore`
**Fichiers modifiés** :
- `.gitea/workflows/ci.yml` : job `frontend-portails-tests` + ajout au `gate`.
**Anti-invention (cœur · #6)** : la source de vérité est le contrat RBAC, jamais
la spec. Tout lien/raccourci vise un DocType présent dans les `permissions_cibles`
du portail (droit prouvé) ; couverture exhaustive sans doublon ; flag `custom`
issu du contrat ; aucun chiffre stocké (compteurs live du desk) ; tokens de marque
(`#0a0a12`/`#f0b429`/Fraunces/Cormorant) repris verbatim de CLAUDE.md #4 avec source.
**Résultat** : 5 Workspaces (Ventes/Construction/Achat/Compta/Direction), 44 rôles
restreints ; console technique `plateforme` exclue (roadmap = 5 portails métier).
**Vérifs** : 19/19 tests ; gate CI local vert (guard + JSON + docs + YAML) ;
régression **260 tests verts** au total ; build déterministe.
**Hors périmètre worker (VPS · #8)** : fixer `Workspace.module` à l'import + créer
les DocTypes custom (`CONFOTUR Application`, `Faisabilité`, `Publiciste Log`) +
appliquer le thème desk → agents ERPNext Backend / Frontend Console.
**Détail complet** : voir
[`05_deliverables_mvp/daily_reports/2026-07-30-session15.md`](../05_deliverables_mvp/daily_reports/2026-07-30-session15.md).
**Auto-score 4Big** : 96/100.
## Session `20260730_065711` (session 14)
**Tâche** : Sprint 4 · ERPNext Backend — Générateur de **configuration e-CF DGII
(Compupar)** (roadmap ligne 51 « e-CF DGII intégration (Compupar) » ; les
commissions ayant été livrées session 13, l'e-CF restait ouvert · GAP §Backend).
**Fichiers créés**`05_deliverables_mvp/fiscal/ecf_dgii/` :
- `ecf_spec.json` (catalogue 10 types e-CF DGII · table FormaPago · format e-NCF ·
moneda USD/DOP · RNC/ITBIS/TipoCambio `null` · provider Compupar · 2 évènements
d'émission · `field_map` Dossier Vente → e-CF)
- `ecflib/{__init__,deps,ncf,builder}.py` (réutilise `is_filled`/`CANONICAL`/
`validate` + `RoleResolver` du module `workflow_vente` · composeur e-NCF
traçable `E+tipo(2)+seq(10)` façon `finance.py`)
- `ecf_dgii_gen.py` (CLI `build`/`validate` · 12 invariants de cross-cohérence)
- `ecf.schema.json` (contrat de sortie draft-07)
- `fixtures/dossier_exemple.json` (test only · opérandes fictifs sourcés)
- `out/{ecf_plan,MANIFEST}.json` (hand-off) · `tests/test_ecf_dgii.py`
(39 tests) · `README.md` · `.gitignore`
**Fichiers modifiés** :
- `.gitea/workflows/ci.yml` : job `fiscal-ecf-tests` + ajout au `gate`.
**Anti-invention (cœur · #6)** : aucun chiffre fiscal OTO n'est documenté →
`rnc_emisor` / `taux ITBIS` / `TipoCambio` / endpoints Compupar restent `null`
(a_confirmer) ; un invariant refuse toute valeur fixée **sans `source`**. Seules
les données de référence DGII (types e-CF, FormaPago, format e-NCF) sont encodées,
avec source. Le composeur e-NCF reste `None` tant qu'un opérande manque.
**Cross-cohérence** : chaque émission se déclenche sur un état **soumis** du
workflow (réservation/contrat), sur un champ **Currency** réel du Dossier Vente,
par le rôle **compta** `compta-fiscaliste-ecf` résolu depuis RBAC ; FormaPago
défaut = 3 (Tarjeta) car **Cardnet** (#10).
**Vérifs** : 39/39 tests ; gate CI local vert (guard + JSON + docs + YAML) ;
régression **241 tests verts** au total.
**Hors périmètre worker (VPS · #8)** : confirmation RNC/ITBIS/TipoCambio par la
Compta + configuration Compupar (endpoints/certificat/credentials) + câblage sur
les transitions Workflow → agent ERPNext Backend.
**Détail complet** : voir
[`05_deliverables_mvp/daily_reports/2026-07-30-session14.md`](../05_deliverables_mvp/daily_reports/2026-07-30-session14.md).
**Auto-score 4Big** : 96/100.
## Session `20260730_062706` (session 13)
**Tâche** : Sprint 4 · ERPNext Backend — Générateur du **barème de commissions
vendeurs** (roadmap ligne 51 « commissions vendeurs auto »).
**Fichiers créés**`05_deliverables_mvp/crm/commissions/` :
- `bareme_spec.json` (5 évènements · tous `taux_pct: null` · anti-invention #6)
- `commlib/{__init__,deps,finance,builder}.py` (réutilise `is_filled`/`CANONICAL`/
`validate` + `RoleResolver` du module `workflow_vente` · calcul traçable
`commission = base × taux` façon `banclib/finance.py`)
- `commissions_gen.py` (CLI `build`/`validate` · 10 invariants de cross-cohérence)
- `bareme.schema.json` (contrat de sortie draft-07)
- `fixtures/dossier_exemple.json` (test only · chiffres fictifs sourcés)
- `out/{commission_plan,MANIFEST}.json` (hand-off) · `tests/test_commissions.py`
(25 tests) · `README.md` · `.gitignore`
**Fichiers modifiés** :
- `.gitea/workflows/ci.yml` : job `crm-commissions-tests` + ajout au `gate`.
**Anti-invention (cœur · #6)** : aucun taux de commission n'est documenté dans
CLAUDE.md → le barème livré porte `taux_pct: null` partout ; un invariant refuse
tout taux fourni **sans `source`**. Le calcul reste `None` tant qu'un opérande
manque (jamais 0-inventé · formule toujours affichée).
**Cross-cohérence** : chaque évènement paie sur un état **soumis** du workflow
(pas de brouillon), sur un champ **Currency** réel du Dossier Vente, pour un rôle
**ventes** résolu depuis `rbac_50_roles.json`.
**Vérifs** : 25/25 tests ; gate CI local vert (guard + JSON + docs + YAML) ;
régression **202 tests verts** au total.
**Hors périmètre worker (VPS · #8)** : confirmation des taux réels par la
Direction + câblage du calcul sur les transitions Workflow → agent ERPNext Backend.
**Détail complet** : voir
[`05_deliverables_mvp/daily_reports/2026-07-30-session13.md`](../05_deliverables_mvp/daily_reports/2026-07-30-session13.md).
**Auto-score 4Big** : 96/100.
## Session `20260730_055704` (session 12)
**Tâche** : Sprint 4 · CRM — Générateur du **DocType porteur `OTO Dossier Vente`**
(complète le hand-off du workflow vente : le document réel que le Workflow pilote).
**Fichiers créés**`05_deliverables_mvp/crm/dossier_vente/` :
- `doctype_spec.json` (structure métier · zéro chiffre · Projet P01..P09 · USD/DOP)
- `dvlib/{__init__,frappe,builder}.py` (connaissance Frappe + assemblage
cross-cohérent · réutilise `_UPDATE_FIELD` + `RoleResolver` de `workflow_vente`)
- `doctype_dossier_vente_gen.py` (CLI `build`/`validate` · 12 invariants)
- `doctype.schema.json` (contrat de sortie draft-07)
- `out/{doctype_oto_dossier_vente,MANIFEST}.json` (hand-off)
- `tests/test_dossier_vente.py` (31 tests) · `README.md` · `.gitignore`
**Fichiers modifiés** :
- `.gitea/workflows/ci.yml` : job `crm-dossier-vente-tests` + ajout au `gate`.
**Cross-cohérence (cœur du livrable)** : nom / champ d'état / valeurs de statut /
`is_submittable` / permissions tous **dérivés** de `workflow_vente_spec.json`
(source unique · anti-dérive) ; rôles résolus depuis `rbac_50_roles.json` (#6).
**Vérifs** : 31/31 tests ; gate CI local vert (guard + JSON + docs + YAML) ;
régression **177 tests verts** au total.
**Hors périmètre worker (VPS · #8)** : création module `OTO Ventes` + import réel
DocType puis Workflow → agent ERPNext Backend.
**Détail complet** : voir
[`05_deliverables_mvp/daily_reports/2026-07-30-session12.md`](../05_deliverables_mvp/daily_reports/2026-07-30-session12.md).
**Auto-score 4Big** : 96/100.
## Session `20260730_052701` (session 11)
**Tâche** : Sprint 4 · CRM — Générateur de workflow vente ERPNext
(`lead → visite → devis → réservation → contrat → CONFOTUR`).
**Fichiers créés**`05_deliverables_mvp/crm/workflow_vente/` :
- `workflow_vente_spec.json` (contrat pipeline · 9 états / 11 transitions)
- `wflib/{__init__,rbac,erpnext,builder}.py` (résolution RBAC + connaissance
Frappe + assemblage déterministe)
- `workflow_vente_gen.py` (CLI `build`/`validate` · 9 invariants de graphe)
- `workflow.schema.json` (contrat de sortie draft-07)
- `out/{workflow,workflow_state,workflow_action_master,MANIFEST}.json` (hand-off)
- `tests/test_workflow_vente.py` (25 tests) · `README.md` · `.gitignore`
**Fichiers modifiés** :
- `.gitea/workflows/ci.yml` : job `crm-workflow-vente-tests` + ajout au `gate`.
**Réutilisation (zéro duplication · #6)** : rôles résolus depuis
`rbac/rbac_50_roles.json` (jamais de nom Frappe en dur) + validateur maison
Publiciste.
**Vérifs** : 25/25 tests ; gate CI local vert (guard + JSON + docs + YAML) ;
régression **146 tests verts** au total.
**Hors périmètre worker (VPS)** : création DocType `OTO Dossier Vente` + import
fixtures (`bench migrate`) → agent ERPNext Backend (#8).
**Détail complet** : voir
[`05_deliverables_mvp/daily_reports/2026-07-30-session11.md`](../05_deliverables_mvp/daily_reports/2026-07-30-session11.md).
**Auto-score 4Big** : 96/100.