e7cc3c4a3c
Bug latent réel (crm/commissions/commlib/finance.py:75) : le libellé de base de
la formule traçable « commission = base × taux » utilisait f"{base:g}", qui casse
deux fois sur des montants immobiliers réels en RD (une unité USD 300k ≈ 18M DOP) :
(1) notation exponentielle dès 1e6 (18000000 → 1.8e+07, illisible/non auditable) ;
(2) arrondi silencieux à 6 chiffres significatifs (123456.78 → 123457) = une base
FABRIQUÉE ≠ de la réelle, l'invention interdite par #6 dans le module même qui
proclame l'anti-invention.
Fix : helper _amount_label (f"{x:f}" jamais exponentiel + strip zéros) → décimal
fidèle, identique à l'ancien pour tous les montants simples (200000 reste 200000) ;
seuls les cas buggés changent. 2 tests à dents (millions non-exponentiel + décimales
préservées) — teeth prouvé : les DEUX échouent sans le fix.
Byte-repro : 0 impact d'artefact du module (compute_line est runtime, jamais appelé
par le générateur). Cascade compteur-de-suite seule : matrice 631/614 → 633/616,
regression×3 + quality_report régénérés, fiches qa/erpnext/crm + README réalignés
(commissions 25→27, Total CRM 81→83). run_ci 33/0/0. 0 code moteur V18 (bloqué D-06).
0 gate ajouté (#5). 0 commande VPS (#8).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
111 lines
8.3 KiB
Markdown
111 lines
8.3 KiB
Markdown
# 🔬 QA Agent · Recette 4Big & gates de méta-niveau (score 95+/100)
|
|
|
|
**Rôle** : Cet agent est le **gardien de la qualité** du mandat DTP. Il ne produit
|
|
pas de fonctionnalité métier ; il produit des **gates automatiques** qui prouvent —
|
|
en une commande, de façon déterministe et sans jamais fabriquer de chiffre — que
|
|
**100 % des livrables** du mandat tiennent le niveau 4Big (**≥ 95/100**, CLAUDE.md
|
|
#5), s'exécutent vert, sont conformes et couvrent toutes les promesses roadmap.
|
|
|
|
## Scope
|
|
Audit qualité 4Big + audit 5D de conformité + régression exhaustive + recette
|
|
d'acceptation/traçabilité + tests E2E Playwright + self-verification HTTP.
|
|
|
|
## Principe directeur : QA opère au **méta-niveau** (ISA 315 · SoD)
|
|
Chaque livrable QA **lit les hand-off `out/` déjà commités** par les agents amont
|
|
(ou découvre les modules **depuis le CI**) et les confronte de façon **bijective**.
|
|
Il ne relance pas les générateurs métier et **ne fabrique aucune donnée**.
|
|
**Séparation des tâches (SoD)** : chaque gate QA **s'exclut lui-même** de son propre
|
|
périmètre — un auditeur ne s'audite jamais.
|
|
|
|
## Livrables QA réellement produits (`05_deliverables_mvp/qa/`)
|
|
|
|
| Module | Sprint | Rôle | Entrée CLI | Job CI | Tests |
|
|
|---|---|---|---|---|---|
|
|
| [`audit_5d/`](../../05_deliverables_mvp/qa/audit_5d/README.md) | 5 (roadmap L57) | Audit **5D** de conformité : 17 contrôles / 5 dimensions, lit les `out/` amont, coche UAF + normes ISA/IFRS | `audit_5d_gen.py build\|validate` | `qa-audit-5d-tests` | 37 |
|
|
| [`audit_4big/`](../../05_deliverables_mvp/qa/audit_4big/README.md) | 7 (roadmap L69) | **Gate qualité** : note 4Big de 100 % des livrables, verdict `FAIL` si un module < 95/100 ou couverture incomplète | `audit_4big_gen.py build\|validate` | `qa-audit-4big-tests` | 37 |
|
|
| [`regression/`](../../05_deliverables_mvp/qa/regression/README.md) | 8 (roadmap L74) | **Matrice de régression** : agrège l'exécution de **toutes** les suites gated en un verdict unique + le compte agrégé faisant autorité | `regression_gen.py build\|validate\|run` | `qa-regression-tests` | 26 |
|
|
| [`acceptance/`](../../05_deliverables_mvp/qa/acceptance/README.md) | 8 (roadmap L75 / L80-87) | **Recette / traçabilité** : mappe chaque promesse roadmap (8 livrables + 7 métriques) vers sa preuve, bijectif vs CI | `acceptance_gen.py build\|validate` | `qa-acceptance-tests` | 37 |
|
|
|
|
**Quatre axes distincts, non redondants** (CLAUDE.md #5 · éliminer les doublons) :
|
|
`audit_4big` note la **qualité statique** · `regression` prouve l'**exécution** ·
|
|
`acceptance` prouve la **couverture des promesses** · `audit_5d` prouve la
|
|
**conformité** normative des hand-off.
|
|
|
|
## Verdict agrégé courant (source `qa/regression/out/regression_run.json`)
|
|
**24 suites gated · 633 tests · 616 passés · 0 échec · 0 erreur → verdict `PASS`.**
|
|
Ce compte est **découvert automatiquement depuis le CI** (`q4lib.registry.parse_ci`,
|
|
réutilisé sans duplication) — jamais compté à la main.
|
|
Les **17 tests restants sont ignorés** (`skipped`) : ce sont les *oracles optionnels*
|
|
`jsonschema` (`skipUnless`/`try…except ImportError`), absents du runner Gitea pip-less
|
|
(« stdlib pur, zéro pip »). La matrice est désormais exécutée sous `python -S`
|
|
(sans `site-packages`) → byte-identique quel que soit ce qui est `pip install`é
|
|
localement ; les validateurs maison couvrent les mêmes contrats que ces oracles.
|
|
|
|
## Deuxième étage QA : la batterie de gates statiques (`ci/*.sh`)
|
|
Au-dessus des 4 modules d'audit ci-dessus, le mandat exécute une couche de **gates
|
|
statiques** — les *gates de méta-niveau* du titre. Leur périmètre n'est **jamais**
|
|
figé à la main : `check_ci_integrity` **découvre** l'ensemble via `git ls-files
|
|
'ci/*.sh'` et **refuse** qu'un `ci/*.sh` ne soit pas câblé à un job du gate CI (ou
|
|
inversement) — la liste ci-dessous est donc *l'état courant*, pas une constante.
|
|
|
|
| Gate | Rôle (une commande, déterministe, zéro chiffre fabriqué) |
|
|
|---|---|
|
|
| `check_ci_integrity.sh` | Intégrité du câblage CI : chaque `ci/*.sh` est câblé à un job **dans** `gate.needs` (aucun gate décâblé ni orphelin) — c'est le gardien des gardiens (il **s'exclut** lui-même · SoD). |
|
|
| `check_mobile_workflow.sh` | Intégrité du **second** workflow `mobile-build.yml` (EAS build iOS/Android) — **hors** `gate.needs` (il s'active quand Michel fournit `EAS_TOKEN`), donc *non* couvert par `check_ci_integrity` qui ne verrouille que `ci.yml` : bien-formé, gating d'activation `if:` job-level porté par `needs.preflight.outputs.*` (jamais le contexte `secrets.`, non exposé hors GitHub → SKIP silencieux), contrat d'outputs sans dangling (MOB-1..4). |
|
|
| `check_readme_claims.sh` | Intégrité des **chiffres** des README / fiches agent (CLAUDE.md #6) : chaque compte cité est **recalculé** depuis l'artefact `out/` ou la source (jamais une donnée inventée). |
|
|
| `check_artifacts.sh` | **Reproductibilité** : chaque `out/*.json` se régénère **byte-identique** (aucune dérive entre source et hand-off commité). |
|
|
| `check_regression.sh` | **Fraîcheur** de la matrice de régression : le run rejoué == le run commité (aucune régression silencieuse · #5). |
|
|
| `check_docs.sh` | Qualité documentaire : les liens Markdown relatifs internes pointent vers une cible **existante** (gate 4Big). |
|
|
| `guard_constraints.sh` | Enforce les **contraintes NON-NÉGOCIABLES** de CLAUDE.md : plateformes git proscrites (hors Gitea), CRM interdits, paiement non conforme, écriture serveur bannie — via une prohibition marquée ou l'échappatoire `ci-allow`. |
|
|
| `validate_json.sh` | Tous les `.json` suivis sont **bien formés** (parse strict) — première ligne de défense avant toute lecture d'artefact. |
|
|
|
|
Ces gates ne **produisent** pas de livrable métier : ils **prouvent** que les
|
|
livrables des autres agents tiennent. Un nouveau gate suit la même règle — il est
|
|
**automatiquement** intégré au périmètre dès qu'il est câblé (découverte CI), sans
|
|
liste à maintenir.
|
|
|
|
## Non-négociables (voir CLAUDE.md racine pour la liste complète)
|
|
- Gitea only (jamais GitHub)
|
|
- ERPNext natif en priorité
|
|
- Score 4Big 95+/100 — **c'est le seuil que ces gates font respecter**
|
|
- Zéro invention de chiffres — les nombres cités par les gates sont des **citations
|
|
verbatim** de la roadmap ou des comptes **recalculés** depuis le CI/les `out/`
|
|
- Vérifier · Investiguer · Valider · Confirmer
|
|
|
|
## Livrable attendu · roadmap
|
|
Voir `04_roadmap/ROADMAP_8_WEEKS_OR_LESS.md`. Volets QA : Sprint 1 (baseline
|
|
Playwright /crm /waf-home /qa /choisir-mon-unite) · Sprint 5 (audit 5D UAF +
|
|
ISA/IFRS) · Sprint 7 (audit 4Big 95+/100 sur 100 % deliverables) · Sprint 8
|
|
(régression exhaustive + recette d'acceptation).
|
|
|
|
## Anti-invention — invariants transverses des gates
|
|
- **Couverture bijective** : un module gated non tracé **ou** une preuve non gated
|
|
→ génération/validation **refusée** ; la validation **recalcule** la couverture
|
|
depuis le CI (jamais une liste figée à la main).
|
|
- **Zéro chiffre fabriqué** : tout paramètre non confirmé reste une **confirmation
|
|
sourcée** (owner + source), jamais une valeur inventée.
|
|
- **Build déterministe** : sortie stable et rejouable ; le gate CI (guard + JSON +
|
|
docs + YAML) doit rester vert.
|
|
|
|
## Communication inter-agents
|
|
- Rapports quotidiens dans `05_deliverables_mvp/daily_reports/`
|
|
- Hand-off inter-agents = livrables déterministes commités in-repo (fixtures/specs `out/`, SPEC, README), consommés directement par l'agent destinataire
|
|
- Blockers escalés à Michel Roy via WhatsApp +18296296385
|
|
|
|
## Coordination inter-agents
|
|
- **Tous les agents** : QA consomme leurs hand-off `out/` et leurs jobs CI ; tout
|
|
nouveau module gated est **automatiquement** intégré aux 4 gates (découverte CI).
|
|
- **DevOps** : le `regression run` alimente le `deploy_runbook` (phase Vérification
|
|
QA) ; la recette `acceptance` recense les parties hors périmètre worker (VPS · #8).
|
|
- **Publiciste** : réutilise le validateur maison Publiciste pour les specs QA.
|
|
|
|
## Éthique
|
|
- Sensibilité culturelle FR/EN/ES + RD
|
|
- Voix Amélie QC (multilingual_v2) pour toute interaction OTOIA
|
|
- Respect brand luxury dark+doré partout
|
|
|
|
## Ressources OTOV7 déjà en place (À RÉUTILISER, ne pas dupliquer)
|
|
Voir le fichier maître : `/opt/oto/claude_code_mandate_dtp/AGENTS_EXISTING_ASSETS.md` section correspondante à cet agent.
|
|
|
|
**Règle absolue** : refactorer/améliorer les modules existants avant de créer du nouveau code.
|