[DTP-Worker] Sprint 7 · Générateur Audit 4Big qualité (95+/100 sur 100% deliverables) (QA · roadmap L69)

Audit de méta-niveau + gate : note la qualité 4Big de 100% des livrables gated
et bloque (FAIL) si un module < 95/100 (CLAUDE.md #5). Couverture PROUVÉE par
recoupement bijectif registre ↔ working-directory du CI (moins l'auditeur · SoD
ISA 315). 5 critères déterministes (DOC/CONTRAT/TESTS/CLI/HANDOFF) renormalisés
par archétype. Anti-invention (#6) : chaque note est recalculée depuis des faits
du dépôt, jamais saisie ; un invariant recompute chaque note.

Résultat : PASS · 17/17 modules à 100/100. Régression 442 tests verts (+34).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-07-30 10:11:02 +00:00
parent 17ad5c0a01
commit a517619432
17 changed files with 2157 additions and 1 deletions
@@ -0,0 +1,16 @@
{
"generated_from": "quality_spec.json",
"generator": "audit_4big_gen.py",
"audit": "OTO QA · Audit 4Big Qualité",
"version": "1.0",
"verdict": "PASS",
"modules_audited": 17,
"min_score": 100,
"pass_score": 95,
"coverage_ok": true,
"artifacts": [
"quality_report.json"
],
"roadmap": "Sprint 7 · QA · Audit 4Big 95+/100 sur 100% deliverables",
"hors_perimetre_worker": "Publication du rapport dans le desk ERPNext + branchement du gate 4Big sur le pipeline de release VPS → agent QA / DevOps (#8)."
}
@@ -0,0 +1,736 @@
{
"audit": "OTO QA · Audit 4Big Qualité",
"version": "1.0",
"reference_cadre": "CLAUDE.md #5 (score minimum 95/100 · niveau 4Big obligatoire) · Roadmap Sprint 7 · QA « Audit 4Big niveau 95+/100 sur 100% deliverables »",
"pass_score": 95,
"coverage": {
"ok": true,
"ci_modules_count": 17,
"registry_modules_count": 17,
"missing_in_registry": [],
"missing_in_ci": [],
"not_in_gate": [],
"self_module_excluded": "qa/audit_4big"
},
"criteria": [
{
"id": "DOC",
"label": "Documentation livrable (README / SPEC ≥ seuil)",
"weight": 20
},
{
"id": "CONTRAT",
"label": "Contrat de sortie explicite (*.schema.json)",
"weight": 20
},
{
"id": "TESTS",
"label": "Couverture de tests (≥ seuil de méthodes test_*)",
"weight": 25
},
{
"id": "CLI",
"label": "CLI reproductible (entrypoint __main__ + sous-commandes argparse)",
"weight": 15
},
{
"id": "HANDOFF",
"label": "Hand-off VPS présent et intègre (out/MANIFEST.json + artefact JSON valide)",
"weight": 20
}
],
"modules": [
{
"id": "faisabilite-generator",
"path": "faisabilite/generator",
"sprint": "S2",
"archetype": "data_room",
"applicable_weight": 80,
"earned_weight": 80,
"score": 100,
"verdict": "PASS",
"checks": [
{
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "README.md (4797 octets)"
},
{
"criterion": "CONTRAT",
"weight": 20,
"passed": true,
"evidence": "brief.schema.json"
},
{
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "16 méthodes test_* dans 1 fichier(s) (seuil 8)"
},
{
"criterion": "CLI",
"weight": 15,
"passed": true,
"evidence": "faisabilite_gen.py (argparse + __main__)"
}
]
},
{
"id": "publiciste",
"path": "publiciste",
"sprint": "S2",
"archetype": "parser",
"applicable_weight": 60,
"earned_weight": 60,
"score": 100,
"verdict": "PASS",
"checks": [
{
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "README.md (3901 octets)"
},
{
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "22 méthodes test_* dans 1 fichier(s) (seuil 8)"
},
{
"criterion": "CLI",
"weight": 15,
"passed": true,
"evidence": "publiciste.py (argparse + __main__)"
}
]
},
{
"id": "rbac",
"path": "rbac",
"sprint": "S2",
"archetype": "contract",
"applicable_weight": 65,
"earned_weight": 65,
"score": 100,
"verdict": "PASS",
"checks": [
{
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "RBAC_50_ROLES_SPEC.md (10040 octets)"
},
{
"criterion": "CONTRAT",
"weight": 20,
"passed": true,
"evidence": "rbac.schema.json"
},
{
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "10 méthodes test_* dans 1 fichier(s) (seuil 8)"
}
]
},
{
"id": "rbac-applyplan",
"path": "rbac/apply_plan",
"sprint": "S2",
"archetype": "generator",
"applicable_weight": 100,
"earned_weight": 100,
"score": 100,
"verdict": "PASS",
"checks": [
{
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "README.md (5249 octets)"
},
{
"criterion": "CONTRAT",
"weight": 20,
"passed": true,
"evidence": "apply_plan.schema.json"
},
{
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "16 méthodes test_* dans 1 fichier(s) (seuil 8)"
},
{
"criterion": "CLI",
"weight": 15,
"passed": true,
"evidence": "rbac_apply_plan.py (argparse + __main__)"
},
{
"criterion": "HANDOFF",
"weight": 20,
"passed": true,
"evidence": "MANIFEST + 1 artefact(s) JSON valides"
}
]
},
{
"id": "rbac-fixtures",
"path": "rbac/fixtures_gen",
"sprint": "S2",
"archetype": "generator",
"applicable_weight": 100,
"earned_weight": 100,
"score": 100,
"verdict": "PASS",
"checks": [
{
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "README.md (3858 octets)"
},
{
"criterion": "CONTRAT",
"weight": 20,
"passed": true,
"evidence": "fixtures.schema.json"
},
{
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "11 méthodes test_* dans 1 fichier(s) (seuil 8)"
},
{
"criterion": "CLI",
"weight": 15,
"passed": true,
"evidence": "rbac_fixtures_gen.py (argparse + __main__)"
},
{
"criterion": "HANDOFF",
"weight": 20,
"passed": true,
"evidence": "MANIFEST + 2 artefact(s) JSON valides"
}
]
},
{
"id": "rbac-roleprofile",
"path": "rbac/roleprofile_gen",
"sprint": "S2",
"archetype": "generator",
"applicable_weight": 100,
"earned_weight": 100,
"score": 100,
"verdict": "PASS",
"checks": [
{
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "README.md (5358 octets)"
},
{
"criterion": "CONTRAT",
"weight": 20,
"passed": true,
"evidence": "roleprofile.schema.json"
},
{
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "11 méthodes test_* dans 1 fichier(s) (seuil 8)"
},
{
"criterion": "CLI",
"weight": 15,
"passed": true,
"evidence": "roleprofile_gen.py (argparse + __main__)"
},
{
"criterion": "HANDOFF",
"weight": 20,
"passed": true,
"evidence": "MANIFEST + 1 artefact(s) JSON valides"
}
]
},
{
"id": "rbac-userperm",
"path": "rbac/userperm_gen",
"sprint": "S2",
"archetype": "generator",
"applicable_weight": 100,
"earned_weight": 100,
"score": 100,
"verdict": "PASS",
"checks": [
{
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "README.md (5241 octets)"
},
{
"criterion": "CONTRAT",
"weight": 20,
"passed": true,
"evidence": "userperm.schema.json"
},
{
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "12 méthodes test_* dans 1 fichier(s) (seuil 8)"
},
{
"criterion": "CLI",
"weight": 15,
"passed": true,
"evidence": "userperm_gen.py (argparse + __main__)"
},
{
"criterion": "HANDOFF",
"weight": 20,
"passed": true,
"evidence": "MANIFEST + 1 artefact(s) JSON valides"
}
]
},
{
"id": "bancable",
"path": "faisabilite/bancable",
"sprint": "S3",
"archetype": "data_room",
"applicable_weight": 80,
"earned_weight": 80,
"score": 100,
"verdict": "PASS",
"checks": [
{
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "README.md (6103 octets)"
},
{
"criterion": "CONTRAT",
"weight": 20,
"passed": true,
"evidence": "bancable.schema.json"
},
{
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "22 méthodes test_* dans 1 fichier(s) (seuil 8)"
},
{
"criterion": "CLI",
"weight": 15,
"passed": true,
"evidence": "bancable_gen.py (argparse + __main__)"
}
]
},
{
"id": "crm-commissions",
"path": "crm/commissions",
"sprint": "S4",
"archetype": "generator",
"applicable_weight": 100,
"earned_weight": 100,
"score": 100,
"verdict": "PASS",
"checks": [
{
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "README.md (4838 octets)"
},
{
"criterion": "CONTRAT",
"weight": 20,
"passed": true,
"evidence": "bareme.schema.json"
},
{
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "25 méthodes test_* dans 1 fichier(s) (seuil 8)"
},
{
"criterion": "CLI",
"weight": 15,
"passed": true,
"evidence": "commissions_gen.py (argparse + __main__)"
},
{
"criterion": "HANDOFF",
"weight": 20,
"passed": true,
"evidence": "MANIFEST + 1 artefact(s) JSON valides"
}
]
},
{
"id": "crm-dossier-vente",
"path": "crm/dossier_vente",
"sprint": "S4",
"archetype": "generator",
"applicable_weight": 100,
"earned_weight": 100,
"score": 100,
"verdict": "PASS",
"checks": [
{
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "README.md (4383 octets)"
},
{
"criterion": "CONTRAT",
"weight": 20,
"passed": true,
"evidence": "doctype.schema.json"
},
{
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "31 méthodes test_* dans 1 fichier(s) (seuil 8)"
},
{
"criterion": "CLI",
"weight": 15,
"passed": true,
"evidence": "doctype_dossier_vente_gen.py (argparse + __main__)"
},
{
"criterion": "HANDOFF",
"weight": 20,
"passed": true,
"evidence": "MANIFEST + 1 artefact(s) JSON valides"
}
]
},
{
"id": "crm-workflow-vente",
"path": "crm/workflow_vente",
"sprint": "S4",
"archetype": "generator",
"applicable_weight": 100,
"earned_weight": 100,
"score": 100,
"verdict": "PASS",
"checks": [
{
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "README.md (6852 octets)"
},
{
"criterion": "CONTRAT",
"weight": 20,
"passed": true,
"evidence": "workflow.schema.json"
},
{
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "25 méthodes test_* dans 1 fichier(s) (seuil 8)"
},
{
"criterion": "CLI",
"weight": 15,
"passed": true,
"evidence": "workflow_vente_gen.py (argparse + __main__)"
},
{
"criterion": "HANDOFF",
"weight": 20,
"passed": true,
"evidence": "MANIFEST + 3 artefact(s) JSON valides"
}
]
},
{
"id": "fiscal-ecf",
"path": "fiscal/ecf_dgii",
"sprint": "S4",
"archetype": "generator",
"applicable_weight": 100,
"earned_weight": 100,
"score": 100,
"verdict": "PASS",
"checks": [
{
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "README.md (6064 octets)"
},
{
"criterion": "CONTRAT",
"weight": 20,
"passed": true,
"evidence": "ecf.schema.json"
},
{
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "39 méthodes test_* dans 1 fichier(s) (seuil 8)"
},
{
"criterion": "CLI",
"weight": 15,
"passed": true,
"evidence": "ecf_dgii_gen.py (argparse + __main__)"
},
{
"criterion": "HANDOFF",
"weight": 20,
"passed": true,
"evidence": "MANIFEST + 1 artefact(s) JSON valides"
}
]
},
{
"id": "frontend-portails",
"path": "frontend/portails",
"sprint": "S4",
"archetype": "generator",
"applicable_weight": 100,
"earned_weight": 100,
"score": 100,
"verdict": "PASS",
"checks": [
{
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "README.md (5109 octets)"
},
{
"criterion": "CONTRAT",
"weight": 20,
"passed": true,
"evidence": "workspace.schema.json"
},
{
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "19 méthodes test_* dans 1 fichier(s) (seuil 8)"
},
{
"criterion": "CLI",
"weight": 15,
"passed": true,
"evidence": "workspaces_gen.py (argparse + __main__)"
},
{
"criterion": "HANDOFF",
"weight": 20,
"passed": true,
"evidence": "MANIFEST + 1 artefact(s) JSON valides"
}
]
},
{
"id": "legal-confotur",
"path": "legal/confotur",
"sprint": "S5",
"archetype": "generator",
"applicable_weight": 100,
"earned_weight": 100,
"score": 100,
"verdict": "PASS",
"checks": [
{
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "README.md (4402 octets)"
},
{
"criterion": "CONTRAT",
"weight": 20,
"passed": true,
"evidence": "confotur.schema.json"
},
{
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "44 méthodes test_* dans 1 fichier(s) (seuil 8)"
},
{
"criterion": "CLI",
"weight": 15,
"passed": true,
"evidence": "confotur_application_gen.py (argparse + __main__)"
},
{
"criterion": "HANDOFF",
"weight": 20,
"passed": true,
"evidence": "MANIFEST + 1 artefact(s) JSON valides"
}
]
},
{
"id": "qa-audit-5d",
"path": "qa/audit_5d",
"sprint": "S5",
"archetype": "generator",
"applicable_weight": 100,
"earned_weight": 100,
"score": 100,
"verdict": "PASS",
"checks": [
{
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "README.md (4374 octets)"
},
{
"criterion": "CONTRAT",
"weight": 20,
"passed": true,
"evidence": "audit.schema.json"
},
{
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "37 méthodes test_* dans 1 fichier(s) (seuil 8)"
},
{
"criterion": "CLI",
"weight": 15,
"passed": true,
"evidence": "audit_5d_gen.py (argparse + __main__)"
},
{
"criterion": "HANDOFF",
"weight": 20,
"passed": true,
"evidence": "MANIFEST + 1 artefact(s) JSON valides"
}
]
},
{
"id": "frontend-chat-otoia",
"path": "frontend/chat_otoia",
"sprint": "S6",
"archetype": "generator",
"applicable_weight": 100,
"earned_weight": 100,
"score": 100,
"verdict": "PASS",
"checks": [
{
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "README.md (3762 octets)"
},
{
"criterion": "CONTRAT",
"weight": 20,
"passed": true,
"evidence": "chat.schema.json"
},
{
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "31 méthodes test_* dans 1 fichier(s) (seuil 8)"
},
{
"criterion": "CLI",
"weight": 15,
"passed": true,
"evidence": "chat_otoia_gen.py (argparse + __main__)"
},
{
"criterion": "HANDOFF",
"weight": 20,
"passed": true,
"evidence": "MANIFEST + 2 artefact(s) JSON valides"
}
]
},
{
"id": "seo",
"path": "seo",
"sprint": "S6",
"archetype": "generator",
"applicable_weight": 100,
"earned_weight": 100,
"score": 100,
"verdict": "PASS",
"checks": [
{
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "README.md (3900 octets)"
},
{
"criterion": "CONTRAT",
"weight": 20,
"passed": true,
"evidence": "seo.schema.json"
},
{
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "36 méthodes test_* dans 1 fichier(s) (seuil 8)"
},
{
"criterion": "CLI",
"weight": 15,
"passed": true,
"evidence": "seo_gen.py (argparse + __main__)"
},
{
"criterion": "HANDOFF",
"weight": 20,
"passed": true,
"evidence": "MANIFEST + 3 artefact(s) JSON valides"
}
]
}
],
"totals": {
"modules": 17,
"pass": 17,
"fail": 0,
"min_score": 100,
"max_score": 100,
"pass_rate_pct": 100
},
"verdict": "PASS",
"notes": [
"Audit de MÉTA-NIVEAU : chaque note de module est CALCULÉE depuis des faits du dépôt (présence README/schéma, nombre de méthodes test_*, entrypoint CLI, intégrité out/) — jamais saisie à la main (#6).",
"Un critère non applicable à l'archétype d'un module est EXCLU du dénominateur (pas de pénalité pour un hand-off qu'un module de contrat n'a jamais vocation à produire) ; les poids restants sont renormalisés à 100.",
"Le verdict global est PASS si et seulement si les 17 modules atteignent ≥ 95/100 ET la couverture == 100% des livrables gated (hors auditeur)."
]
}