[DTP-Worker 20260801_160354] Auto exec · session 20260801_160354
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 / 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 / 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 / E2E baseline Playwright (manuel) (push) Has been cancelled
CI / Gate qualité (agrégat) (push) Has been cancelled

This commit is contained in:
Claude Code DTP Worker
2026-08-01 16:18:55 +00:00
parent 28e5e2145b
commit 85a9ba7fca
3 changed files with 131 additions and 1 deletions
+70
View File
@@ -1768,3 +1768,73 @@ MANIFEST périmé). Restauré = vert : 4 assertions vertes · exit 0. **7 gates
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact ; la confirmation édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact ; la confirmation
des taux réels + le câblage du calcul restent côté ERPNext Backend/VPS production). des taux réels + le câblage du calcul restent côté ERPNext Backend/VPS production).
- **Auto-score 4Big** : 96/100. - **Auto-score 4Big** : 96/100.
## Session `20260801_160354` · Buffer S8 · Domaine QA/comptes de tests · Fiches agents : CINQ **comptes de tests PAR SUITE** écrits HORS de la colonne « Tests » des tables de fiches — `seo` « **36 tests** » (`03_agents/seo/AGENT.md:31`, prose libre) · `frontend_console` « **19 tests** » (portails) & « **31 tests** » (chat_otoia) (`:32`/`:34`, prose libre) · `onapi_legal` « **44 tests** » (`:32`, prose libre) · `devops` « 29 (dont 14 injections négatives) » (`:25`, **cellule de table à suffixe**) — étaient **HORS de tout gate**. Les DEUX blocs de comptes de tests existants ne les atteignent PAS : le bloc **cellules « Tests »** (`row_re`) n'accepte qu'une ancre de lien `` `<mot>/` `` ET une cellule ENTIER NU ; le bloc **agrégats en prose** ne couvre que `crm` (Total CRM) et `erpnext_backend` (RBAC + e-CF).
**Tâche** : **Sprint 8 · buffer** (DevOps CI/CD · QA — « Regression tests
exhaustifs »). Roadmap fonctionnellement close ; poursuite de la série anti-dérive
(CLAUDE.md #6). **Même classe EXACTE** que le bloc « comptes de tests PAR SUITE »
(cellules de table) et le bloc « agrégats EN PROSE » (Total CRM/RBAC/e-CF) — appliquée
à la **dernière poche** de la même surface : les claims per-suite que ces deux blocs
ne balaient pas par construction de leurs regex.
**Dérive silencieuse fermée** :
- `03_agents/seo/AGENT.md:31` — « **36 tests**, gated dans le pipeline » (suite `seo`).
- `03_agents/frontend_console/AGENT.md:32` — « **19 tests** · job CI
`frontend-portails-tests` » (suite `frontend/portails`) · `:34` — « **31 tests** ·
job CI `chat-otoia-tests` » (suite `frontend/chat_otoia`).
- `03_agents/onapi_legal/AGENT.md:32` — « **44 tests** (dont 8 négatifs) · job CI
`legal-confotur-tests` » (suite `legal/confotur`).
- `03_agents/devops/AGENT.md:25` — cellule « Tests » du run-book :
« 29 (dont 14 injections négatives) » (suite `devops/deploy_runbook`). Cette ligne
échappe à `row_re` **DEUX fois** : (a) l'ancre de lien est un CHEMIN complet
(`05_deliverables_mvp/devops/deploy_runbook/`, pas `` `<mot>/` ``) et (b) la cellule
n'est PAS un entier nu (suffixe « (dont …) »).
- Source faisant autorité : `qa/regression/out/regression_plan.json`
(`suites[].test_methods` · byte-gaté par `check_artifacts`), déjà chargée dans le
dict `auth` que les deux blocs amont utilisent (zéro duplication #6). Les 5 recomputes :
`seo`=36 · `frontend/portails`=19 · `frontend/chat_otoia`=31 · `legal/confotur`=44 ·
`devops/deploy_runbook`=29.
- Piège : ajouter/retirer un `def test_` à l'une de ces 5 suites fait DÉRIVER en
silence le nombre de la fiche pendant que la matrice de régression dit autre chose.
Une compensation entre deux suites (l'une +1, l'autre 1) laisserait même la SOMME
agrégée (« 564 tests · 22 suites », elle gatée) juste ET ces lignes fausses —
exactement le motif per-suite que le bloc des cellules corrige, sur des surfaces
qu'il ne balaie pas. Aucune suite `tests/` (qui teste des FONCTIONS, pas la prose
des fiches) n'attrape ce « vert trompeur ».
- **État courant** : **aucun compte périmé** — les 5 recoupent
`plan.suites[].test_methods` exactement (anti-invention #6, rien à réécrire). Le
défaut est la **surface ungated**.
**Gate ajouté** (`ci/check_readme_claims.sh`, nouveau bloc « Fiches agents · comptes
de tests PAR SUITE écrits HORS de la colonne Tests » après le bloc des agrégats en
prose e-CF) : table de config `PER_SUITE_HORS_TABLE` = (fiche · suite_path · motif ·
label). Pour chaque claim : (1) on RECOMPUTE `exp = auth[suite_path]` (même source
byte-gatée déjà chargée · zéro duplication) ; (2) motif ANCRÉ sur le nom de job CI
adjacent (ou le lien du module pour devops) pour viser LA bonne suite SANS ambiguïté
(les deux claims `frontend_console` 19/31 sont désambiguïsés par leurs job CI
distincts) ; (3) claim absent ⇒ ROUGE (traçabilité #6). Garde `suite_path ∈ auth`
(anti-câblage-rompu).
**7 morsures vérifiées** : (M1) fiche seo `36→35` · (M2) fiche portails `19→20` ·
(M3) fiche onapi `44→43` · (M4) **cellule devops** `29→30` (prouve que le suffixe
« (dont …) » + ancre chemin-complet est bien couvert) · (M5) **SOURCE drift** —
`plan.suites[seo].test_methods 36→37` ⇒ fiche périmée (prouve que le gate suit
l'ARTEFACT, pas un oracle figé) · (M6) ligne prose seo retirée ⇒ INTROUVABLE
(traçabilité) · (M7) fiche chat_otoia `31→32` ⇒ mord SEULE la ligne chat_otoia sans
toucher portails (prouve la désambiguïsation par job CI). Restauré = green : 5 claims
== `plan.suites[].test_methods` · exit 0. Working tree byte-restauré
(`git checkout --`, **JAMAIS** `git clean`, interdit absolu) · **7 gates re-verts**
(`check_readme_claims`/`check_docs`/`guard_constraints`/`validate_json`/
`check_artifacts`/`check_ci_integrity`/`check_regression`).
- `ci/README.md` (clause du récap `check-readme-claims` : « comptes de tests par
suite écrits HORS de cette colonne ») mis à jour.
- **Observé, hors périmètre de CE gate** : `03_agents/devops/AGENT.md:24` cellule
« 22 suites gated » = COMPTE de suites (`plan.totals.suites`), classe DISTINCTE du
`test_methods` per-suite ; déjà ancré via l'agrégat QA « 22 suites gated · 564
tests » — candidat propre pour une session future si confirmé ungated.
- **Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo ;
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact ; les suites
réelles tournent côté runner Gitea).
- **Auto-score 4Big** : 96/100.
+1 -1
View File
File diff suppressed because one or more lines are too long
+60
View File
@@ -639,6 +639,66 @@ else:
bad(f"Prose agrégée · e-CF — dit {mecf.group(1)} MAIS source dit {ecf_exp} " bad(f"Prose agrégée · e-CF — dit {mecf.group(1)} MAIS source dit {ecf_exp} "
f"(fiscal/ecf_dgii) → régénérer la fiche") f"(fiscal/ecf_dgii) → régénérer la fiche")
# ============================================================================
# Fiches agents · comptes de tests PAR SUITE écrits HORS de la colonne « Tests »
# (prose libre + cellule à suffixe) — dernière poche de la MÊME classe per-suite.
# ----------------------------------------------------------------------------
# Les deux blocs ci-dessus recomputent (a) chaque CELLULE « Tests » des tables de
# livrables via row_re — dont l'ancre de lien est `<mot>/` ET la cellule un ENTIER
# NU — et (b) les AGRÉGATS multi-suites en prose de crm/erpnext_backend. Restent
# CINQ claims de test PAR SUITE que NI l'un NI l'autre n'atteint :
# • prose libre (hors table) : seo « **36 tests** » (suite `seo`) ·
# frontend_console « **19 tests** » (frontend/portails) & « **31 tests** »
# (frontend/chat_otoia) · onapi_legal « **44 tests** » (legal/confotur) ;
# • cellule de table à SUFFIXE : devops « 29 (dont 14 injections négatives) »
# (devops/deploy_runbook) — row_re échoue DEUX fois : l'ancre de lien est un
# CHEMIN complet (`05_deliverables_mvp/devops/deploy_runbook/`, pas `<mot>/`)
# ET la cellule n'est PAS un entier nu (suffixe « (dont …) »).
# Ces cinq nombres sont SAISIS À LA MAIN et se périment dès qu'un `def test_` est
# ajouté/retiré à la suite — exactement le « vert trompeur » per-suite que le bloc
# des cellules corrige, mais sur des surfaces qu'il ne balaie pas (une suite +1 et
# une autre 1 laisserait la SOMME « 564 tests » juste et ces lignes fausses).
# Aucune suite tests/ (qui teste des FONCTIONS, pas la prose des fiches) n'attrape
# ce périmé. On RECOMPUTE chaque nombre depuis `auth` (plan.suites[path].
# test_methods / count_tests · MÊME source déjà chargée · zéro duplication #6) et
# on exige que la fiche l'écrive EXACTEMENT. Chaque motif est ANCRÉ sur le nom de
# job CI (ou le lien du module) adjacent pour viser LA bonne suite sans ambiguïté.
# Un claim absent échoue AUSSI (traçabilité #6 : le recensement qui s'évapore est
# lui-même une régression).
# ============================================================================
PER_SUITE_HORS_TABLE = [
("03_agents/seo/AGENT.md", "seo",
r"\*\*(\d+) tests\*\*, gated", "seo"),
("03_agents/frontend_console/AGENT.md", "frontend/portails",
r"\*\*(\d+) tests\*\* · job CI `frontend-portails-tests`", "portails"),
("03_agents/frontend_console/AGENT.md", "frontend/chat_otoia",
r"\*\*(\d+) tests\*\* · job CI `chat-otoia-tests`", "chat_otoia"),
("03_agents/onapi_legal/AGENT.md", "legal/confotur",
r"\*\*(\d+) tests\*\* \(dont \d+ négatifs\) · job CI `legal-confotur-tests`",
"confotur"),
("03_agents/devops/AGENT.md", "devops/deploy_runbook",
r"deploy_runbook/README\.md\).*?\| (\d+) \(dont \d+", "deploy_runbook"),
]
for path_f, suite_path, pat, label in PER_SUITE_HORS_TABLE:
try:
txt = re.sub(r"\s+", " ", open(path_f, encoding="utf-8").read())
except OSError as e:
bad(f"Test par suite (hors table) · {path_f} illisible : {e}"); continue
if suite_path not in auth:
bad(f"Test par suite (hors table) · {label} — suite `{suite_path}` absente "
f"de plan.suites/count_tests (câblage rompu ?)"); continue
exp = auth[suite_path]
m = re.search(pat, txt)
if m is None:
bad(f"Test par suite (hors table) · {path_f} · {label} — claim « N tests » "
f"INTROUVABLE (attendu {exp} · suite `{suite_path}`)")
elif int(m.group(1)) == exp:
good(f"Test par suite (hors table) · {path_f} · {label} — {m.group(1)} == "
f"source ({exp} · `{suite_path}`)")
else:
bad(f"Test par suite (hors table) · {path_f} · {label} — dit {m.group(1)} "
f"MAIS source dit {exp} (plan.suites[`{suite_path}`]) → régénérer la fiche")
# ============================================================================ # ============================================================================
# Portails frontend · comptes PAR WORKSPACE (cartes / liens / rôles) — # Portails frontend · comptes PAR WORKSPACE (cartes / liens / rôles) —
# même classe de « vert trompeur », transcrits À LA MAIN dans DEUX docs. # même classe de « vert trompeur », transcrits À LA MAIN dans DEUX docs.