[DTP-Worker] Sprint 8 · buffer L75 · Domaine CRM/Commissions : la CROSS-COHÉRENCE du barème vendeurs (« cœur du livrable ») — états BROUILLON exclus (lead/visite/devis/abandonné), CHAMPS DE BASE (montant_reservation, montant_contrat) et INVARIANT 3 « on ne commissionne QUE des états soumis (doc_status=1) » — était énumérée À LA MAIN dans le README du module crm/commissions sans AUCUN gate d'IDENTITÉ. Le bloc racine ne gate que le COMPTE de tests (« 25 », via l'agrégat « Total CRM ») — surface distincte. Ces trois faits sont DATA-DERIVED : brouillons = {update_value | doc_status==0} de crm/workflow_vente/out/workflow.json (= {lead,visite,devis,abandonne}) · champs de base = {base_field} des évènements de crm/commissions/out/commission_plan.json · états soumis = {update_value | doc_status==1} — les deux artefacts byte-gatés par check_artifacts. Aucun gate ne comparait ces ENSEMBLES à la prose : PROMOUVOIR un brouillon en soumis (abandonne → doc_status 1) le retire de l'ensemble brouillon pendant que la prose l'énumère encore · AJOUTER/RENOMMER un champ de base OU ÉCHANGER un état passe aussi — « vert trompeur » qu'aucune suite tests/ (qui teste des FONCTIONS finance/résolution, pas la prose) n'attrape → nouveau bloc recomputant chaque ENSEMBLE depuis SON artefact byte-gaté (zéro duplication du contrat du générateur #6) et exigeant que la prose l'énumère EXACTEMENT. Contrôle par ENSEMBLE (absent ET en trop mordus via set-diff · accents/casse normalisés via unicodedata). Cohérence croisée en bonus (mord un plan INTERNEMENT incohérent avec le workflow) : tout update_value commissionné ∈ états soumis ET ∉ brouillons — l'INVARIANT 3 du module, non vide. Un claim absent échoue AUSSI. 5 morsures vérifiées : échange brouillon (abandonné→perdu) capté (absents=[abandonne] en trop=[perdu]) · sous-ensemble champs de base (retrait montant_contrat) capté · énumération des brouillons supprimée (INTROUVABLE) · plan pointant un brouillon (reservation→lead, invariant 3 cassé) capté · promotion de l'état abandonne en soumis dans l'artefact (draft set change, « en trop » dans la prose) capté ; restauré = green : brouillons [abandonne,devis,lead,visite] == workflow (doc_status=0) · champs de base == plan · invariant 3 vert. État courant : aucun ensemble périmé (anti-invention #6, rien à réécrire) — le défaut est la surface ungated. ci/README.md (table + détail) mis à jour · 7 gates re-verts.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,71 @@
|
||||
# Activity Log · 2026-07-31 · Claude Code DTP
|
||||
|
||||
## Session `20260731_163112` · Buffer S8 · Domaine CRM/Commissions : la **cross-cohérence** du barème vendeurs (« cœur du livrable ») — les états **brouillon exclus** (`lead/visite/devis/abandonné`), les **champs de base** (`montant_reservation`, `montant_contrat`) et l'**invariant 3** « on ne commissionne que des états soumis » — était énumérée À LA MAIN dans le README du module sans AUCUN gate d'IDENTITÉ ; le bloc racine ne gate que le COMPTE de tests (« 25 », via l'agrégat « Total CRM »).
|
||||
|
||||
**Tâche** : **Sprint 8 · buffer L75** (DevOps CI/CD · QA). Roadmap fonctionnellement
|
||||
close ; poursuite de la série anti-dérive (CLAUDE.md #6). Les sessions précédentes ont
|
||||
gaté les domaines tests, portails, RBAC, SEO, CRM (pipeline vente + séparation des
|
||||
pouvoirs), mobile (quadruplet + onglets), Legal/CONFOTUR, DevOps, QA (audit 5D + 4Big),
|
||||
Démo, Frontend/Chat OTOIA, recette et Fiscal/e-CF. Cette session cible le **module
|
||||
`crm/commissions`** — jamais gaté hors son compte de tests — dont la section
|
||||
« Cross-cohérence » (le CŒUR du livrable) énumère trois faits data-derived pointant les
|
||||
artefacts générés sans être recomputés par aucun gate.
|
||||
|
||||
**Dérive silencieuse fermée** :
|
||||
- `05_deliverables_mvp/crm/commissions/README.md:47` : « on ne commissionne pas un
|
||||
**brouillon** (`lead/visite/devis/abandonné`) » — l'ensemble des états brouillon.
|
||||
- `…/README.md:50` : « `base_field` … (`montant_reservation`, `montant_contrat`) » —
|
||||
l'ensemble des champs de base.
|
||||
- `…/README.md:46` : « correspondre à un état **soumis** (`doc_status = 1`) » — INVARIANT
|
||||
3 du module.
|
||||
- Sources faisant autorité (byte-gatées par `check_artifacts`) :
|
||||
`crm/workflow_vente/out/workflow.json` (brouillons = `{update_value | doc_status==0}`
|
||||
= `{lead, visite, devis, abandonne}` · soumis = `{… | doc_status==1}`) et
|
||||
`crm/commissions/out/commission_plan.json` (champs de base = `{base_field}` des
|
||||
évènements · états payés = `{update_value}`).
|
||||
- Le bloc racine ne gate QUE le **compte de tests** (« 25 »). Aucun gate ne comparait
|
||||
ces ENSEMBLES aux artefacts : **PROMOUVOIR** un brouillon en soumis (`abandonne` →
|
||||
doc_status 1) le retire de l'ensemble brouillon pendant que la prose l'énumère encore ;
|
||||
**AJOUTER/RENOMMER** un champ de base ou **ÉCHANGER** un état passe aussi — « vert
|
||||
trompeur » qu'aucune suite `tests/` (qui teste des FONCTIONS finance/résolution, pas la
|
||||
prose) n'attrape.
|
||||
- **État courant** : **aucun ensemble périmé** — les 2 énumérations recoupent les
|
||||
artefacts exactement (anti-invention #6, rien à réécrire). Le défaut est la **surface
|
||||
ungated**.
|
||||
|
||||
**Nouveau bloc dans `ci/check_readme_claims.sh`** : recompute chaque ensemble depuis SON
|
||||
artefact byte-gaté (zéro duplication du contrat du générateur · #6) et exige que la prose
|
||||
l'énumère **exactement** — contrôle par ENSEMBLE (absent ET en trop mordus via set-diff ·
|
||||
accents/casse normalisés via `unicodedata`). Cohérence croisée en bonus (mord un plan
|
||||
**internement incohérent** avec le workflow) : tout `update_value` commissionné ∈ états
|
||||
soumis (doc_status=1) ET ∉ brouillons — l'**invariant 3**, non vide. Un claim absent
|
||||
échoue AUSSI.
|
||||
|
||||
### Preuve (5 morsures vérifiées + restauration verte)
|
||||
|
||||
| Injection | Résultat |
|
||||
|---|---|
|
||||
| README brouillon `abandonné → perdu` (échange) | ✗ absents=`[abandonne]` · en trop=`[perdu]` · exit 1 |
|
||||
| README base_field retire `montant_contrat` (sous-ensemble) | ✗ absents=`[montant_contrat]` · exit 1 |
|
||||
| README énumération des brouillons supprimée | ✗ énumération des brouillons INTROUVABLE · exit 1 |
|
||||
| artefact plan `reservation → lead` (commissionne un brouillon) | ✗ incohérence plan↔workflow : `[lead]` PAS soumis · invariant 3 cassé · exit 1 |
|
||||
| artefact workflow `abandonne` doc_status `0→1` (draft set change) | ✗ prose en trop=`[abandonne]` vs brouillons workflow · exit 1 |
|
||||
| restauré | ✓ brouillons `[abandonne,devis,lead,visite]` == workflow (doc_status=0) · champs de base == plan · invariant 3 vert · exit 0 |
|
||||
|
||||
- **`ci/README.md`** — surface ajoutée à la table récap du pipeline + paragraphe
|
||||
descriptif (classe « cross-cohérence du barème de commissions »).
|
||||
|
||||
Suite CI complète re-verte (7 gates) : `guard_constraints` · `validate_json` ·
|
||||
`check_docs` · `check_artifacts` · `check_regression` · `check_ci_integrity` ·
|
||||
`check_readme_claims`.
|
||||
|
||||
**Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo ;
|
||||
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact).
|
||||
|
||||
**Auto-score 4Big** : 96/100.
|
||||
|
||||
---
|
||||
|
||||
## Session `20260731_160111` · Buffer S8 · Domaine Fiscal/e-CF : le **contrat de format de l'e-NCF** (« `E + tipoeCF(2) + secuencia(10)` » = **13**) était retranscrit À LA MAIN dans **QUATRE** endroits de prose (README ×3 + fiche agent `erpnext_backend`) sans AUCUN gate d'IDENTITÉ — le bloc racine ne gate que le COMPTE de tests e-CF (« 39 »).
|
||||
|
||||
**Tâche** : **Sprint 8 · buffer L75** (DevOps CI/CD · QA). Roadmap fonctionnellement
|
||||
|
||||
Reference in New Issue
Block a user