5af86e3518
Durcissement d'uniformité (pas bug déclenchable aujourd'hui) qui COMPLÈTE le fix
correctness de la session 070054 (aeb30b8). Ce fix-là a percent-encodé
hero['fichier'] dans src=f"/static/projets/{code}/{quote(fichier)}", mais dans la
MÊME url('…') CSS il restait un 2ᵉ segment dynamique — `code` — interpolé brut puis
html-échappé via _esc(src). C'est exactement l'anti-pattern identifié par 070054
(html.escape = mauvais encodeur pour un segment d'URL), appliqué de façon incomplète.
Fix : src = f"/static/projets/{quote(code)}/{quote(hero['fichier'])}" — quote() est
le SEUL encodeur correct pour un segment d'URL ; le CONTEXTE, pas la donnée courante,
dicte l'encodeur. Zéro dérive : codes réels = P01..P09 (§Projets), quote("p01")=="p01"
→ byte-repro inchangé. Cas frère exact de 060044/criteria.py (« durcir le SEUL membre
non-durci d'une famille ») : ici le SEUL segment d'URL non-encodé de la même url().
Test à dents (test_hero_media_code_segment_percent_encoded) : code théorique "P'X" →
prouvé FAIL sans quote(code), PASS avec. Suite publiciste 25→26, matrice 630/613→631/614.
Défaut d'abord : classe encodage-contextuel balayée sur tous les modules HTML/CSS/URL ;
2 candidats Explore réfutés non-défauts (chat mount_html = persona forcée Amélie par
invariant 7 + portail_key enum ; code segment = théorique mais durci par uniformité).
Cascade régénérée dans l'ordre (quality_report en DERNIER) · 3 fiches compteurs réalignées.
run_ci 33/0/0 · NFC-clean · zéro code moteur V18 (bloqué D-06 #6) · zéro gate (#5) · zéro invention (#6).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
307 lines
6.0 KiB
JSON
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": 25,
|
|
"ran": 25,
|
|
"passed": 24,
|
|
"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": 631,
|
|
"passed": 614,
|
|
"failures": 0,
|
|
"errors": 0,
|
|
"skipped": 17
|
|
},
|
|
"verdict": "PASS"
|
|
}
|