Files
oto-enterprise-os-dtp/05_deliverables_mvp/qa/regression/out/regression_run.json
T
Claude Code DTP Worker e7cc3c4a3c [DTP-Worker 20260812_080104] fix correctness · commissions vendeurs — la formule traçable base×taux cassait sur montants réels
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>
2026-08-12 08:11:32 +00:00

307 lines
6.0 KiB
JSON

{
"matrix": "OTO QA · Matrice de régression exhaustive",
"version": "1.0",
"self_module": "qa/regression",
"suites": [
{
"id": "crm.commissions",
"path": "crm/commissions",
"expected_methods": 27,
"ran": 27,
"passed": 26,
"failures": 0,
"errors": 0,
"skipped": 1,
"ok": true,
"returncode": 0
},
{
"id": "crm.dossier_vente",
"path": "crm/dossier_vente",
"expected_methods": 31,
"ran": 31,
"passed": 30,
"failures": 0,
"errors": 0,
"skipped": 1,
"ok": true,
"returncode": 0
},
{
"id": "crm.financement_bancaire",
"path": "crm/financement_bancaire",
"expected_methods": 35,
"ran": 35,
"passed": 35,
"failures": 0,
"errors": 0,
"skipped": 0,
"ok": true,
"returncode": 0
},
{
"id": "crm.workflow_vente",
"path": "crm/workflow_vente",
"expected_methods": 25,
"ran": 25,
"passed": 24,
"failures": 0,
"errors": 0,
"skipped": 1,
"ok": true,
"returncode": 0
},
{
"id": "demo.scenarios",
"path": "demo/scenarios",
"expected_methods": 39,
"ran": 39,
"passed": 39,
"failures": 0,
"errors": 0,
"skipped": 0,
"ok": true,
"returncode": 0
},
{
"id": "devops.deploy_runbook",
"path": "devops/deploy_runbook",
"expected_methods": 29,
"ran": 29,
"passed": 29,
"failures": 0,
"errors": 0,
"skipped": 0,
"ok": true,
"returncode": 0
},
{
"id": "faisabilite.bancable",
"path": "faisabilite/bancable",
"expected_methods": 22,
"ran": 22,
"passed": 21,
"failures": 0,
"errors": 0,
"skipped": 1,
"ok": true,
"returncode": 0
},
{
"id": "faisabilite.generator",
"path": "faisabilite/generator",
"expected_methods": 17,
"ran": 17,
"passed": 16,
"failures": 0,
"errors": 0,
"skipped": 1,
"ok": true,
"returncode": 0
},
{
"id": "fiscal.ecf_dgii",
"path": "fiscal/ecf_dgii",
"expected_methods": 39,
"ran": 39,
"passed": 38,
"failures": 0,
"errors": 0,
"skipped": 1,
"ok": true,
"returncode": 0
},
{
"id": "frontend.chat_otoia",
"path": "frontend/chat_otoia",
"expected_methods": 31,
"ran": 31,
"passed": 31,
"failures": 0,
"errors": 0,
"skipped": 0,
"ok": true,
"returncode": 0
},
{
"id": "frontend.portails",
"path": "frontend/portails",
"expected_methods": 19,
"ran": 19,
"passed": 18,
"failures": 0,
"errors": 0,
"skipped": 1,
"ok": true,
"returncode": 0
},
{
"id": "legal.confotur",
"path": "legal/confotur",
"expected_methods": 44,
"ran": 44,
"passed": 43,
"failures": 0,
"errors": 0,
"skipped": 1,
"ok": true,
"returncode": 0
},
{
"id": "mobile.app_config",
"path": "mobile/app_config",
"expected_methods": 22,
"ran": 22,
"passed": 22,
"failures": 0,
"errors": 0,
"skipped": 0,
"ok": true,
"returncode": 0
},
{
"id": "pie.manifest",
"path": "pie/manifest",
"expected_methods": 20,
"ran": 20,
"passed": 19,
"failures": 0,
"errors": 0,
"skipped": 1,
"ok": true,
"returncode": 0
},
{
"id": "publiciste",
"path": "publiciste",
"expected_methods": 26,
"ran": 26,
"passed": 24,
"failures": 0,
"errors": 0,
"skipped": 2,
"ok": true,
"returncode": 0
},
{
"id": "qa.acceptance",
"path": "qa/acceptance",
"expected_methods": 37,
"ran": 37,
"passed": 37,
"failures": 0,
"errors": 0,
"skipped": 0,
"ok": true,
"returncode": 0
},
{
"id": "qa.audit_4big",
"path": "qa/audit_4big",
"expected_methods": 37,
"ran": 37,
"passed": 37,
"failures": 0,
"errors": 0,
"skipped": 0,
"ok": true,
"returncode": 0
},
{
"id": "qa.audit_5d",
"path": "qa/audit_5d",
"expected_methods": 37,
"ran": 37,
"passed": 37,
"failures": 0,
"errors": 0,
"skipped": 0,
"ok": true,
"returncode": 0
},
{
"id": "rbac",
"path": "rbac",
"expected_methods": 10,
"ran": 10,
"passed": 9,
"failures": 0,
"errors": 0,
"skipped": 1,
"ok": true,
"returncode": 0
},
{
"id": "rbac.apply_plan",
"path": "rbac/apply_plan",
"expected_methods": 16,
"ran": 16,
"passed": 15,
"failures": 0,
"errors": 0,
"skipped": 1,
"ok": true,
"returncode": 0
},
{
"id": "rbac.fixtures_gen",
"path": "rbac/fixtures_gen",
"expected_methods": 11,
"ran": 11,
"passed": 10,
"failures": 0,
"errors": 0,
"skipped": 1,
"ok": true,
"returncode": 0
},
{
"id": "rbac.roleprofile_gen",
"path": "rbac/roleprofile_gen",
"expected_methods": 11,
"ran": 11,
"passed": 10,
"failures": 0,
"errors": 0,
"skipped": 1,
"ok": true,
"returncode": 0
},
{
"id": "rbac.userperm_gen",
"path": "rbac/userperm_gen",
"expected_methods": 12,
"ran": 12,
"passed": 11,
"failures": 0,
"errors": 0,
"skipped": 1,
"ok": true,
"returncode": 0
},
{
"id": "seo",
"path": "seo",
"expected_methods": 36,
"ran": 36,
"passed": 35,
"failures": 0,
"errors": 0,
"skipped": 1,
"ok": true,
"returncode": 0
}
],
"totals": {
"suites": 24,
"green": 24,
"red": 0,
"ran": 633,
"passed": 616,
"failures": 0,
"errors": 0,
"skipped": 17
},
"verdict": "PASS"
}