[DTP-Worker 20260805_161319] Auto exec · session 20260805_161319
CI / Contraintes NON-NÉGOCIABLES (CLAUDE.md) (push) Has been cancelled
CI / Validation JSON (schémas Faisabilité) (push) Has been cancelled
CI / Qualité documentaire (liens + 4Big) (push) Has been cancelled
CI / Reproductibilité des artefacts out/ (build == commité) (push) Has been cancelled
CI / Fraîcheur matrice de régression (run == commité) (push) Has been cancelled
CI / Intégrité du câblage CI (gate agrège tout · gates statiques verrouillés) (push) Has been cancelled
CI / Intégrité des chiffres du README (valeur == artefact cité · (push) Has been cancelled
CI / Intégrité mobile-build.yml (gating portable · activation différée · (push) Has been cancelled
CI / Publiciste · parser + schéma + generator (unittest) (push) Has been cancelled
CI / RBAC · 50 rôles + schéma (unittest) (push) Has been cancelled
CI / Faisabilité · générateur 4 volets + round-trip (unittest) (push) Has been cancelled
CI / RBAC · fixtures ERPNext (Role + Custom DocPerm) (push) Has been cancelled
CI / RBAC · plan User Permission (row-level) (push) Has been cancelled
CI / RBAC · Role Profile (bundles par portail) (push) Has been cancelled
CI / RBAC · run-book d'application unifié (agrégat 3 volets) (push) Has been cancelled
CI / Faisabilité · dossier bancable trilingue FR/EN/ES (push) Has been cancelled
CI / CRM · workflow vente ERPNext (lead → CONFOTUR) (push) Has been cancelled
CI / CRM · DocType porteur OTO Dossier Vente (push) Has been cancelled
CI / CRM · barème commissions vendeurs (push) Has been cancelled
CI / CRM · Financement Bancaire (gate hypothécaire RD) (push) Has been cancelled
CI / Fiscal · e-CF DGII (Compupar) (push) Has been cancelled
CI / Frontend · Workspaces 5 portails rôle (push) Has been cancelled
CI / Legal · DocType CONFOTUR Application (push) Has been cancelled
CI / QA · Audit 5D conformité (push) Has been cancelled
CI / SEO · mots-clés trilingues + schema.org + hreflang (push) Has been cancelled
CI / Chat OTOIA · montage par portail (Custom Block) (push) Has been cancelled
CI / QA · Audit 4Big (95+/100 sur 100% deliverables) (push) Has been cancelled
CI / Démo · Scénarios (run-sheet P07 banquier / P05 client) (push) Has been cancelled
CI / QA · Matrice de régression exhaustive (Sprint 8) (push) Has been cancelled
CI / DevOps · Run-book de déploiement VPS unifié (Sprint 8) (push) Has been cancelled
CI / QA · Matrice d'acceptation / traçabilité MVP (Sprint 8) (push) Has been cancelled
CI / Mobile · config app Expo/EAS (navigation par rôle) (push) Has been cancelled
CI / PIE · manifest de dépendances (Annexe 12 · V10.1) (push) Has been cancelled
CI / E2E baseline Playwright (manuel) (push) Has been cancelled
Mobile Build (EAS) / Préflight config EAS + état secrets (push) Has been cancelled
CI / Gate qualité (agrégat) (push) Has been cancelled
Mobile Build (EAS) / EAS build iOS (App Store (push) Has been cancelled
Mobile Build (EAS) / EAS build Android (Play Store) (push) Has been cancelled
CI / Contraintes NON-NÉGOCIABLES (CLAUDE.md) (push) Has been cancelled
CI / Validation JSON (schémas Faisabilité) (push) Has been cancelled
CI / Qualité documentaire (liens + 4Big) (push) Has been cancelled
CI / Reproductibilité des artefacts out/ (build == commité) (push) Has been cancelled
CI / Fraîcheur matrice de régression (run == commité) (push) Has been cancelled
CI / Intégrité du câblage CI (gate agrège tout · gates statiques verrouillés) (push) Has been cancelled
CI / Intégrité des chiffres du README (valeur == artefact cité · (push) Has been cancelled
CI / Intégrité mobile-build.yml (gating portable · activation différée · (push) Has been cancelled
CI / Publiciste · parser + schéma + generator (unittest) (push) Has been cancelled
CI / RBAC · 50 rôles + schéma (unittest) (push) Has been cancelled
CI / Faisabilité · générateur 4 volets + round-trip (unittest) (push) Has been cancelled
CI / RBAC · fixtures ERPNext (Role + Custom DocPerm) (push) Has been cancelled
CI / RBAC · plan User Permission (row-level) (push) Has been cancelled
CI / RBAC · Role Profile (bundles par portail) (push) Has been cancelled
CI / RBAC · run-book d'application unifié (agrégat 3 volets) (push) Has been cancelled
CI / Faisabilité · dossier bancable trilingue FR/EN/ES (push) Has been cancelled
CI / CRM · workflow vente ERPNext (lead → CONFOTUR) (push) Has been cancelled
CI / CRM · DocType porteur OTO Dossier Vente (push) Has been cancelled
CI / CRM · barème commissions vendeurs (push) Has been cancelled
CI / CRM · Financement Bancaire (gate hypothécaire RD) (push) Has been cancelled
CI / Fiscal · e-CF DGII (Compupar) (push) Has been cancelled
CI / Frontend · Workspaces 5 portails rôle (push) Has been cancelled
CI / Legal · DocType CONFOTUR Application (push) Has been cancelled
CI / QA · Audit 5D conformité (push) Has been cancelled
CI / SEO · mots-clés trilingues + schema.org + hreflang (push) Has been cancelled
CI / Chat OTOIA · montage par portail (Custom Block) (push) Has been cancelled
CI / QA · Audit 4Big (95+/100 sur 100% deliverables) (push) Has been cancelled
CI / Démo · Scénarios (run-sheet P07 banquier / P05 client) (push) Has been cancelled
CI / QA · Matrice de régression exhaustive (Sprint 8) (push) Has been cancelled
CI / DevOps · Run-book de déploiement VPS unifié (Sprint 8) (push) Has been cancelled
CI / QA · Matrice d'acceptation / traçabilité MVP (Sprint 8) (push) Has been cancelled
CI / Mobile · config app Expo/EAS (navigation par rôle) (push) Has been cancelled
CI / PIE · manifest de dépendances (Annexe 12 · V10.1) (push) Has been cancelled
CI / E2E baseline Playwright (manuel) (push) Has been cancelled
Mobile Build (EAS) / Préflight config EAS + état secrets (push) Has been cancelled
CI / Gate qualité (agrégat) (push) Has been cancelled
Mobile Build (EAS) / EAS build iOS (App Store (push) Has been cancelled
Mobile Build (EAS) / EAS build Android (Play Store) (push) Has been cancelled
This commit is contained in:
@@ -32,9 +32,14 @@ périmètre — un auditeur ne s'audite jamais.
|
|||||||
**conformité** normative des hand-off.
|
**conformité** normative des hand-off.
|
||||||
|
|
||||||
## Verdict agrégé courant (source `qa/regression/out/regression_run.json`)
|
## Verdict agrégé courant (source `qa/regression/out/regression_run.json`)
|
||||||
**24 suites gated · 624 tests · 624 passés · 0 échec · 0 erreur → verdict `PASS`.**
|
**24 suites gated · 624 tests · 607 passés · 0 échec · 0 erreur → verdict `PASS`.**
|
||||||
Ce compte est **découvert automatiquement depuis le CI** (`q4lib.registry.parse_ci`,
|
Ce compte est **découvert automatiquement depuis le CI** (`q4lib.registry.parse_ci`,
|
||||||
réutilisé sans duplication) — jamais compté à la main.
|
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`)
|
## 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
|
Au-dessus des 4 modules d'audit ci-dessus, le mandat exécute une couche de **gates
|
||||||
|
|||||||
@@ -51,9 +51,16 @@ python3 regression_gen.py run # → out/regression_run.json (COMMIT
|
|||||||
```
|
```
|
||||||
|
|
||||||
`run` renvoie un code de sortie ≠ 0 si **une seule** suite est rouge → utilisable
|
`run` renvoie un code de sortie ≠ 0 si **une seule** suite est rouge → utilisable
|
||||||
comme garde de release. Sa sortie est **byte-déterministe** — elle ne porte
|
comme garde de release. Sa sortie est **byte-déterministe** : (a) elle ne porte
|
||||||
**aucun** horodatage / hôte / durée / chemin absolu (`path` relatif, compteurs
|
**aucun** horodatage / hôte / durée / chemin absolu (`path` relatif, compteurs
|
||||||
`ran/passed/failures` seuls) : deux `run` successifs sont **byte-identiques**.
|
`ran/passed/failures` seuls) ; (b) chaque suite est exécutée sous `python -S`
|
||||||
|
(sans `site-packages`), donc l'unique paquet tiers du corpus — l'oracle
|
||||||
|
**optionnel** `jsonschema` (toujours gardé par `skipUnless`) — est neutralisé,
|
||||||
|
exactement comme sur le runner Gitea pip-less. Sans (b), la matrice divergeait
|
||||||
|
selon que `jsonschema` était `pip install`é ou non (0 vs 17 `skipped`) → un
|
||||||
|
**faux-vert** : `check_regression` vert en local mais ROUGE sur le runner. Avec
|
||||||
|
les deux, deux `run` sont **byte-identiques** quel que soit l'environnement
|
||||||
|
(17 oracles ignorés ; les validateurs maison couvrent les mêmes contrats).
|
||||||
`out/regression_run.json` est donc **commité** et sert de **baseline** au gate CI
|
`out/regression_run.json` est donc **commité** et sert de **baseline** au gate CI
|
||||||
`ci/check_regression.sh`, qui régénère un `run` frais et exige l'**identité
|
`ci/check_regression.sh`, qui régénère un `run` frais et exige l'**identité
|
||||||
byte-for-byte** avec le fichier commité (+ verdict `PASS`) — c'est ce qui empêche
|
byte-for-byte** avec le fichier commité (+ verdict `PASS`) — c'est ce qui empêche
|
||||||
|
|||||||
@@ -8,10 +8,10 @@
|
|||||||
"path": "crm/commissions",
|
"path": "crm/commissions",
|
||||||
"expected_methods": 25,
|
"expected_methods": 25,
|
||||||
"ran": 25,
|
"ran": 25,
|
||||||
"passed": 25,
|
"passed": 24,
|
||||||
"failures": 0,
|
"failures": 0,
|
||||||
"errors": 0,
|
"errors": 0,
|
||||||
"skipped": 0,
|
"skipped": 1,
|
||||||
"ok": true,
|
"ok": true,
|
||||||
"returncode": 0
|
"returncode": 0
|
||||||
},
|
},
|
||||||
@@ -20,10 +20,10 @@
|
|||||||
"path": "crm/dossier_vente",
|
"path": "crm/dossier_vente",
|
||||||
"expected_methods": 31,
|
"expected_methods": 31,
|
||||||
"ran": 31,
|
"ran": 31,
|
||||||
"passed": 31,
|
"passed": 30,
|
||||||
"failures": 0,
|
"failures": 0,
|
||||||
"errors": 0,
|
"errors": 0,
|
||||||
"skipped": 0,
|
"skipped": 1,
|
||||||
"ok": true,
|
"ok": true,
|
||||||
"returncode": 0
|
"returncode": 0
|
||||||
},
|
},
|
||||||
@@ -44,10 +44,10 @@
|
|||||||
"path": "crm/workflow_vente",
|
"path": "crm/workflow_vente",
|
||||||
"expected_methods": 25,
|
"expected_methods": 25,
|
||||||
"ran": 25,
|
"ran": 25,
|
||||||
"passed": 25,
|
"passed": 24,
|
||||||
"failures": 0,
|
"failures": 0,
|
||||||
"errors": 0,
|
"errors": 0,
|
||||||
"skipped": 0,
|
"skipped": 1,
|
||||||
"ok": true,
|
"ok": true,
|
||||||
"returncode": 0
|
"returncode": 0
|
||||||
},
|
},
|
||||||
@@ -80,10 +80,10 @@
|
|||||||
"path": "faisabilite/bancable",
|
"path": "faisabilite/bancable",
|
||||||
"expected_methods": 22,
|
"expected_methods": 22,
|
||||||
"ran": 22,
|
"ran": 22,
|
||||||
"passed": 22,
|
"passed": 21,
|
||||||
"failures": 0,
|
"failures": 0,
|
||||||
"errors": 0,
|
"errors": 0,
|
||||||
"skipped": 0,
|
"skipped": 1,
|
||||||
"ok": true,
|
"ok": true,
|
||||||
"returncode": 0
|
"returncode": 0
|
||||||
},
|
},
|
||||||
@@ -92,10 +92,10 @@
|
|||||||
"path": "faisabilite/generator",
|
"path": "faisabilite/generator",
|
||||||
"expected_methods": 16,
|
"expected_methods": 16,
|
||||||
"ran": 16,
|
"ran": 16,
|
||||||
"passed": 16,
|
"passed": 15,
|
||||||
"failures": 0,
|
"failures": 0,
|
||||||
"errors": 0,
|
"errors": 0,
|
||||||
"skipped": 0,
|
"skipped": 1,
|
||||||
"ok": true,
|
"ok": true,
|
||||||
"returncode": 0
|
"returncode": 0
|
||||||
},
|
},
|
||||||
@@ -104,10 +104,10 @@
|
|||||||
"path": "fiscal/ecf_dgii",
|
"path": "fiscal/ecf_dgii",
|
||||||
"expected_methods": 39,
|
"expected_methods": 39,
|
||||||
"ran": 39,
|
"ran": 39,
|
||||||
"passed": 39,
|
"passed": 38,
|
||||||
"failures": 0,
|
"failures": 0,
|
||||||
"errors": 0,
|
"errors": 0,
|
||||||
"skipped": 0,
|
"skipped": 1,
|
||||||
"ok": true,
|
"ok": true,
|
||||||
"returncode": 0
|
"returncode": 0
|
||||||
},
|
},
|
||||||
@@ -128,10 +128,10 @@
|
|||||||
"path": "frontend/portails",
|
"path": "frontend/portails",
|
||||||
"expected_methods": 19,
|
"expected_methods": 19,
|
||||||
"ran": 19,
|
"ran": 19,
|
||||||
"passed": 19,
|
"passed": 18,
|
||||||
"failures": 0,
|
"failures": 0,
|
||||||
"errors": 0,
|
"errors": 0,
|
||||||
"skipped": 0,
|
"skipped": 1,
|
||||||
"ok": true,
|
"ok": true,
|
||||||
"returncode": 0
|
"returncode": 0
|
||||||
},
|
},
|
||||||
@@ -140,10 +140,10 @@
|
|||||||
"path": "legal/confotur",
|
"path": "legal/confotur",
|
||||||
"expected_methods": 44,
|
"expected_methods": 44,
|
||||||
"ran": 44,
|
"ran": 44,
|
||||||
"passed": 44,
|
"passed": 43,
|
||||||
"failures": 0,
|
"failures": 0,
|
||||||
"errors": 0,
|
"errors": 0,
|
||||||
"skipped": 0,
|
"skipped": 1,
|
||||||
"ok": true,
|
"ok": true,
|
||||||
"returncode": 0
|
"returncode": 0
|
||||||
},
|
},
|
||||||
@@ -164,10 +164,10 @@
|
|||||||
"path": "pie/manifest",
|
"path": "pie/manifest",
|
||||||
"expected_methods": 20,
|
"expected_methods": 20,
|
||||||
"ran": 20,
|
"ran": 20,
|
||||||
"passed": 20,
|
"passed": 19,
|
||||||
"failures": 0,
|
"failures": 0,
|
||||||
"errors": 0,
|
"errors": 0,
|
||||||
"skipped": 0,
|
"skipped": 1,
|
||||||
"ok": true,
|
"ok": true,
|
||||||
"returncode": 0
|
"returncode": 0
|
||||||
},
|
},
|
||||||
@@ -176,10 +176,10 @@
|
|||||||
"path": "publiciste",
|
"path": "publiciste",
|
||||||
"expected_methods": 23,
|
"expected_methods": 23,
|
||||||
"ran": 23,
|
"ran": 23,
|
||||||
"passed": 23,
|
"passed": 21,
|
||||||
"failures": 0,
|
"failures": 0,
|
||||||
"errors": 0,
|
"errors": 0,
|
||||||
"skipped": 0,
|
"skipped": 2,
|
||||||
"ok": true,
|
"ok": true,
|
||||||
"returncode": 0
|
"returncode": 0
|
||||||
},
|
},
|
||||||
@@ -224,10 +224,10 @@
|
|||||||
"path": "rbac",
|
"path": "rbac",
|
||||||
"expected_methods": 10,
|
"expected_methods": 10,
|
||||||
"ran": 10,
|
"ran": 10,
|
||||||
"passed": 10,
|
"passed": 9,
|
||||||
"failures": 0,
|
"failures": 0,
|
||||||
"errors": 0,
|
"errors": 0,
|
||||||
"skipped": 0,
|
"skipped": 1,
|
||||||
"ok": true,
|
"ok": true,
|
||||||
"returncode": 0
|
"returncode": 0
|
||||||
},
|
},
|
||||||
@@ -236,10 +236,10 @@
|
|||||||
"path": "rbac/apply_plan",
|
"path": "rbac/apply_plan",
|
||||||
"expected_methods": 16,
|
"expected_methods": 16,
|
||||||
"ran": 16,
|
"ran": 16,
|
||||||
"passed": 16,
|
"passed": 15,
|
||||||
"failures": 0,
|
"failures": 0,
|
||||||
"errors": 0,
|
"errors": 0,
|
||||||
"skipped": 0,
|
"skipped": 1,
|
||||||
"ok": true,
|
"ok": true,
|
||||||
"returncode": 0
|
"returncode": 0
|
||||||
},
|
},
|
||||||
@@ -248,10 +248,10 @@
|
|||||||
"path": "rbac/fixtures_gen",
|
"path": "rbac/fixtures_gen",
|
||||||
"expected_methods": 11,
|
"expected_methods": 11,
|
||||||
"ran": 11,
|
"ran": 11,
|
||||||
"passed": 11,
|
"passed": 10,
|
||||||
"failures": 0,
|
"failures": 0,
|
||||||
"errors": 0,
|
"errors": 0,
|
||||||
"skipped": 0,
|
"skipped": 1,
|
||||||
"ok": true,
|
"ok": true,
|
||||||
"returncode": 0
|
"returncode": 0
|
||||||
},
|
},
|
||||||
@@ -260,10 +260,10 @@
|
|||||||
"path": "rbac/roleprofile_gen",
|
"path": "rbac/roleprofile_gen",
|
||||||
"expected_methods": 11,
|
"expected_methods": 11,
|
||||||
"ran": 11,
|
"ran": 11,
|
||||||
"passed": 11,
|
"passed": 10,
|
||||||
"failures": 0,
|
"failures": 0,
|
||||||
"errors": 0,
|
"errors": 0,
|
||||||
"skipped": 0,
|
"skipped": 1,
|
||||||
"ok": true,
|
"ok": true,
|
||||||
"returncode": 0
|
"returncode": 0
|
||||||
},
|
},
|
||||||
@@ -272,10 +272,10 @@
|
|||||||
"path": "rbac/userperm_gen",
|
"path": "rbac/userperm_gen",
|
||||||
"expected_methods": 12,
|
"expected_methods": 12,
|
||||||
"ran": 12,
|
"ran": 12,
|
||||||
"passed": 12,
|
"passed": 11,
|
||||||
"failures": 0,
|
"failures": 0,
|
||||||
"errors": 0,
|
"errors": 0,
|
||||||
"skipped": 0,
|
"skipped": 1,
|
||||||
"ok": true,
|
"ok": true,
|
||||||
"returncode": 0
|
"returncode": 0
|
||||||
},
|
},
|
||||||
@@ -284,10 +284,10 @@
|
|||||||
"path": "seo",
|
"path": "seo",
|
||||||
"expected_methods": 36,
|
"expected_methods": 36,
|
||||||
"ran": 36,
|
"ran": 36,
|
||||||
"passed": 36,
|
"passed": 35,
|
||||||
"failures": 0,
|
"failures": 0,
|
||||||
"errors": 0,
|
"errors": 0,
|
||||||
"skipped": 0,
|
"skipped": 1,
|
||||||
"ok": true,
|
"ok": true,
|
||||||
"returncode": 0
|
"returncode": 0
|
||||||
}
|
}
|
||||||
@@ -297,10 +297,10 @@
|
|||||||
"green": 24,
|
"green": 24,
|
||||||
"red": 0,
|
"red": 0,
|
||||||
"ran": 624,
|
"ran": 624,
|
||||||
"passed": 624,
|
"passed": 607,
|
||||||
"failures": 0,
|
"failures": 0,
|
||||||
"errors": 0,
|
"errors": 0,
|
||||||
"skipped": 0
|
"skipped": 17
|
||||||
},
|
},
|
||||||
"verdict": "PASS"
|
"verdict": "PASS"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,8 +69,11 @@ def build_plan(spec: dict[str, Any]) -> dict[str, Any]:
|
|||||||
def run_matrix(spec: dict[str, Any], *, python: str | None = None) -> dict[str, Any]:
|
def run_matrix(spec: dict[str, Any], *, python: str | None = None) -> dict[str, Any]:
|
||||||
"""Exécute réellement toutes les suites du plan et agrège les compteurs.
|
"""Exécute réellement toutes les suites du plan et agrège les compteurs.
|
||||||
|
|
||||||
Byte-déterministe (aucun horodatage/hôte/chemin absolu) → l'artefact
|
Byte-déterministe (aucun horodatage/hôte/chemin absolu ; suites lancées sous
|
||||||
`regression_run.json` EST commité et byte-gaté par `ci/check_regression.sh`."""
|
`python -S` → oracle tiers optionnel `jsonschema` neutralisé, cf.
|
||||||
|
`runner.run_suite`) → l'artefact `regression_run.json` EST commité et
|
||||||
|
byte-gaté par `ci/check_regression.sh`, identique en local et sur le runner
|
||||||
|
Gitea pip-less."""
|
||||||
suites = discovery.discover_suites(spec)
|
suites = discovery.discover_suites(spec)
|
||||||
discover_cmd = list(spec["discover_cmd"])
|
discover_cmd = list(spec["discover_cmd"])
|
||||||
# `python3 -m unittest ...` → on retire le binaire, on garde les args.
|
# `python3 -m unittest ...` → on retire le binaire, on garde les args.
|
||||||
|
|||||||
@@ -10,6 +10,19 @@ des fichiers `tests/test_*.py` aux noms qui se recouvrent → un discover global
|
|||||||
in-process provoquerait des collisions de modules. Le subprocess reproduit
|
in-process provoquerait des collisions de modules. Le subprocess reproduit
|
||||||
fidèlement l'environnement du CI.
|
fidèlement l'environnement du CI.
|
||||||
|
|
||||||
|
Déterminisme cross-environnement (`-S`) : chaque suite est lancée avec l'option
|
||||||
|
`-S` (interpréteur SANS `site` → aucun `site-packages`/`dist-packages` sur
|
||||||
|
`sys.path`). C'est le contrat exact du runner Gitea (`.gitea/workflows/ci.yml` :
|
||||||
|
« stdlib pur, zéro pip » — « L'oracle jsonschema est utilisé s'il est présent,
|
||||||
|
sinon ignoré »). Sans `-S`, le seul paquet tiers du corpus — l'oracle OPTIONNEL
|
||||||
|
`jsonschema`, toujours gardé par `skipUnless`/`try…except ImportError` — ferait
|
||||||
|
diverger la matrice : présent sur un poste dev (`skipped=0`), absent sur le
|
||||||
|
runner pip-less (`skipped=N`). L'artefact `regression_run.json` commité — que
|
||||||
|
`ci/check_regression.sh` exige byte-identique au run frais — devenait alors
|
||||||
|
un FAUX-VERT : vert en local, ROUGE sur le runner. `-S` neutralise l'oracle
|
||||||
|
partout → la matrice reflète la baseline garantie (stdlib + validateurs maison)
|
||||||
|
et redevient byte-identique quel que soit ce qui est `pip install`é localement.
|
||||||
|
|
||||||
`parse_unittest_output` est PUR (str → dict) donc testable sans exécuter quoi que
|
`parse_unittest_output` est PUR (str → dict) donc testable sans exécuter quoi que
|
||||||
ce soit — on lui injecte des sorties unittest synthétiques (OK / FAILED / skipped).
|
ce soit — on lui injecte des sorties unittest synthétiques (OK / FAILED / skipped).
|
||||||
"""
|
"""
|
||||||
@@ -70,7 +83,11 @@ def run_suite(abs_path: str, *, python: str | None = None,
|
|||||||
`abs_path` = répertoire du module (contenant `tests/`). Aucune sortie n'est
|
`abs_path` = répertoire du module (contenant `tests/`). Aucune sortie n'est
|
||||||
imprimée ici — l'agrégateur décide de l'affichage."""
|
imprimée ici — l'agrégateur décide de l'affichage."""
|
||||||
py = python or sys.executable
|
py = python or sys.executable
|
||||||
cmd = list(discover_cmd or ["-m", "unittest", "discover", "-s", "tests"])
|
# `-S` : interpréteur sans `site` → pas de `site-packages` → l'oracle tiers
|
||||||
|
# optionnel `jsonschema` est absent, exactement comme sur le runner Gitea
|
||||||
|
# pip-less. Garantit une matrice byte-déterministe indépendante de ce qui est
|
||||||
|
# `pip install`é en local (cf. docstring du module).
|
||||||
|
cmd = ["-S", *list(discover_cmd or ["-m", "unittest", "discover", "-s", "tests"])]
|
||||||
tests_dir = os.path.join(abs_path, "tests")
|
tests_dir = os.path.join(abs_path, "tests")
|
||||||
if not os.path.isdir(tests_dir):
|
if not os.path.isdir(tests_dir):
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -25,9 +25,12 @@ Sous-commandes :
|
|||||||
live + verdict ; sort en erreur (code ≠ 0) si une suite est
|
live + verdict ; sort en erreur (code ≠ 0) si une suite est
|
||||||
rouge. Écrit `regression_run.json` : bien qu'il porte les
|
rouge. Écrit `regression_run.json` : bien qu'il porte les
|
||||||
compteurs réellement exécutés, il ne contient AUCUN
|
compteurs réellement exécutés, il ne contient AUCUN
|
||||||
horodatage/hôte/chemin absolu → deux `run` sont
|
horodatage/hôte/chemin absolu, ET chaque suite tourne sous
|
||||||
byte-identiques, donc l'artefact EST commité et byte-gaté
|
`python -S` (oracle tiers optionnel `jsonschema` neutralisé,
|
||||||
par `ci/check_regression.sh` (toute dérive = CI rouge).
|
comme sur le runner pip-less · cf. `reglib/runner.py`) →
|
||||||
|
deux `run` sont byte-identiques quel que soit l'environnement,
|
||||||
|
donc l'artefact EST commité et byte-gaté par
|
||||||
|
`ci/check_regression.sh` (toute dérive = CI rouge).
|
||||||
|
|
||||||
Toutes les sous-commandes productrices sont déterministes (tri stable, aucun
|
Toutes les sous-commandes productrices sont déterministes (tri stable, aucun
|
||||||
horodatage) → artefacts diffables + commités + byte-gatés : `regression_plan.json`
|
horodatage) → artefacts diffables + commités + byte-gatés : `regression_plan.json`
|
||||||
|
|||||||
@@ -22,7 +22,12 @@
|
|||||||
# rend impossible à re-commettre.
|
# rend impossible à re-commettre.
|
||||||
#
|
#
|
||||||
# Déterminisme : `regression_run.json` ne contient AUCUN horodatage / hôte /
|
# Déterminisme : `regression_run.json` ne contient AUCUN horodatage / hôte /
|
||||||
# chemin absolu — deux `run` successifs sont byte-identiques (vérifié). La
|
# chemin absolu, ET chaque suite est exécutée sous `python -S` (sans
|
||||||
|
# `site-packages`) par `reglib/runner.py` → l'oracle tiers OPTIONNEL `jsonschema`
|
||||||
|
# est neutralisé partout (comme sur le runner Gitea pip-less). Sans ce `-S`, la
|
||||||
|
# matrice divergeait selon que `jsonschema` était installé localement (0 vs 17
|
||||||
|
# `skipped`) — un faux-vert VERT en local / ROUGE sur le runner. Avec, deux `run`
|
||||||
|
# successifs sont byte-identiques quel que soit l'environnement (vérifié). La
|
||||||
# comparaison exacte est donc licite et constitue la preuve la plus forte.
|
# comparaison exacte est donc licite et constitue la preuve la plus forte.
|
||||||
#
|
#
|
||||||
# Contrat vérifié : `regression_gen.py run` régénéré vers un tmp DOIT produire un
|
# Contrat vérifié : `regression_gen.py run` régénéré vers un tmp DOIT produire un
|
||||||
|
|||||||
Reference in New Issue
Block a user