Files
Claude Code DTP Worker 9d30939db9
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
[DTP-Worker 20260805_161319] Auto exec · session 20260805_161319
2026-08-05 16:28:19 +00:00

97 lines
5.2 KiB
Bash
Executable File

#!/usr/bin/env bash
# ============================================================================
# check_regression.sh · OTO Enterprise OS DTP
# ----------------------------------------------------------------------------
# Gate de FRAÎCHEUR de la matrice de régression (roadmap Sprint 8 · QA
# « Regression tests exhaustifs » · CLAUDE.md #5 — zéro régression silencieuse).
# Prouve, en une commande, que l'artefact d'EXÉCUTION commité
# `qa/regression/out/regression_run.json` (dont la doc et les logs dérivent
# leurs totaux agrégés — suites · tests · verdict PASS — jamais figés en dur
# ici, sous peine de se périmer en silence) reflète TOUJOURS la réalité du
# disque — en le régénérant et en exigeant l'identité byte-for-byte.
#
# Pourquoi un gate DÉDIÉ (et non `check_artifacts.sh`) : ce dernier ne rejoue
# QUE la sous-commande déterministe `build` (→ regression_plan.json) et exclut
# explicitement les artefacts d'EXÉCUTION issus de `run`. Or `regression_run.json`
# EST un artefact de `run` : il porte les compteurs réellement exécutés
# (ran/passed/failures) que `build` ne connaît pas. Résultat : sans ce gate, la
# matrice agrégée pouvait se périmer en silence (ex. un module + son job CI
# ajoutés sans régénérer la matrice → « 22 suites » devenu faux) sans qu'aucune
# suite `tests/` — qui teste des FONCTIONS, pas le fichier commité — ne l'attrape.
# C'est exactement la dérive « demo 18→21 » déjà corrigée à la main : ce gate la
# rend impossible à re-commettre.
#
# Déterminisme : `regression_run.json` ne contient AUCUN horodatage / hôte /
# 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.
#
# Contrat vérifié : `regression_gen.py run` régénéré vers un tmp DOIT produire un
# `regression_run.json` byte-identique au commité. Toute divergence (compteur,
# suite ajoutée/retirée, verdict) échoue le gate avec l'ordre de régénérer.
# En bonus : le verdict fraîchement calculé DOIT être « PASS » (une matrice
# rouge ne doit jamais être commitée verte).
#
# Dépendances : bash, git, python3, diff, mktemp. Aucun réseau requis
# (stdlib pur · CLAUDE.md #2 — runner Gitea sans pip).
# ============================================================================
set -uo pipefail
# shellcheck source=ci/lib.sh
source "$(dirname "${BASH_SOURCE[0]}")/lib.sh" || exit 3
cd_repo_root # racine du dépôt, ou ROUGE honnête si hors arbre git (cf. lib.sh)
FAIL=0
report() { printf ' \033[31m✗\033[0m %s\n' "$1"; FAIL=1; }
ok() { printf ' \033[32m✓\033[0m %s\n' "$1"; }
MOD="05_deliverables_mvp/qa/regression"
GEN="regression_gen.py"
ARTIFACT="out/regression_run.json"
COMMITTED="$MOD/$ARTIFACT"
echo "== Fraîcheur de la matrice de régression (run frais == commité ?) =="
if [[ ! -f "$MOD/$GEN" ]]; then
report "$MOD/$GEN — générateur introuvable (module déplacé/renommé ?)"
elif [[ ! -f "$COMMITTED" ]]; then
report "$COMMITTED — artefact d'exécution absent du dépôt (lancer 'run -o out')"
else
tmp="$(mktemp -d)"
if ! ( cd "$MOD" && python3 "$GEN" run -o "$tmp" ) >/dev/null 2>"$tmp/.err"; then
report "$MOD — 'run' a échoué (matrice non ré-exécutable) :"
sed 's/^/ /' "$tmp/.err"
else
fresh="$tmp/regression_run.json"
if [[ ! -f "$fresh" ]]; then
report "$MOD — 'run' n'a produit aucun regression_run.json (générateur cassé ?)"
elif ! diff -q "$fresh" "$COMMITTED" >/dev/null 2>&1; then
report "$ARTIFACT — DÉRIVE : le run frais diffère du commité (régénérer)"
printf ' \033[90m# diff résumé (commité → frais) :\033[0m\n'
diff <(python3 -c "import json,sys;print(json.dumps(json.load(open(sys.argv[1]))['totals'],indent=1,sort_keys=True))" "$COMMITTED" 2>/dev/null) \
<(python3 -c "import json,sys;print(json.dumps(json.load(open(sys.argv[1]))['totals'],indent=1,sort_keys=True))" "$fresh" 2>/dev/null) \
| sed 's/^/ /'
else
verdict="$(python3 -c "import json;print(json.load(open('$COMMITTED'))['verdict'])" 2>/dev/null)"
totals="$(python3 -c "import json;t=json.load(open('$COMMITTED'))['totals'];print(f\"{t['suites']} suites · {t['passed']}/{t['ran']} tests\")" 2>/dev/null)"
if [[ "$verdict" != "PASS" ]]; then
report "$ARTIFACT — reproductible MAIS verdict=$verdict (matrice rouge commitée)"
else
ok "$ARTIFACT — reproductible à l'identique ($totals · PASS)"
fi
fi
fi
rm -rf "$tmp"
fi
echo
if [[ "$FAIL" -eq 0 ]]; then
echo -e "\033[32m✅ Matrice de régression à jour (run frais == commité · PASS).\033[0m"
else
echo -e "\033[31m❌ Matrice périmée/rouge — régénérer avec 'regression_gen.py run -o out'.\033[0m"
fi
exit "$FAIL"