[DTP-Worker] Sprint 8 · buffer · QA/audit_4big : gate des SEUILS STRUCTURELS de la colonne « Fait vérifié »
3e surface du MÊME README audit_4big, jamais gatée : les deux seuils que le scorer applique (DOC « ≥ 400 octets » · TESTS « ≥ 8 méthodes def test_* »), transcrits à la main. Le bloc BARÈME ne capture que le POIDS voisin (regex `| `DOC` | 20 |`), aveugle à la 3e cellule. Ces nombres sont DATA-DERIVED de quality_spec.json[thresholds] (min_doc_bytes/min_test_methods) — l'INPUT byte-gaté par check_artifacts (report rebuild depuis lui). Gate ajouté (check_readme_claims.sh) : (1) cross-check d'ANCRAGE — le seuil TESTS APPLIQUÉ, lu de l'evidence « (seuil N) » de CHAQUE module du report == spec.min_test_methods pour tous (mord une divergence spec↔report) ; (2) prose DOC « ≥ N octets » == spec ; (3) prose TESTS « ≥ N méthodes » == spec ; claim absent échoue AUSSI (traçabilité #6). Élever min_test_methods (8→12 : module de 8-11 tests sous FAIL) ou changer min_doc_bytes rebuild le report SANS toucher au README → prose périmée en silence, désormais interdite. 5 morsures vérifiées (README 400→450 · README 8→10 · ligne DOC vidée · spec min_test_methods 8→12 rebuild : README+cross-check · spec min_doc_bytes 400→500 rebuild) ; restauré = green · 7 gates re-verts. ci/README.md (récap + paragraphe détaillé) mis à jour. Hors périmètre VPS : néant. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,60 @@
|
|||||||
# Activity Log · 2026-08-01 · Claude Code DTP
|
# Activity Log · 2026-08-01 · Claude Code DTP
|
||||||
|
|
||||||
|
## Session `20260801_170404` · Buffer S8 · Domaine QA/audit_4big : la colonne **« Fait vérifié »** de la table du barème (`qa/audit_4big/README.md:24,26`) — les **DEUX SEUILS STRUCTURELS** que le scorer applique réellement (`DOC` « ≥ **400 octets** » · `TESTS` « ≥ **8 méthodes** `def test_*` »), transcrits À LA MAIN — étaient **HORS de tout gate**. Le bloc BARÈME existant recompute la 2e colonne (**poids** : DOC 20 · CONTRAT 20 · TESTS 25 · CLI 15 · HANDOFF 20) mais son regex (`| \`DOC\` | 20 |`) est **AVEUGLE à la 3e cellule** ; ces deux nombres sont DATA-DERIVED de `quality_spec.json[thresholds]` (`min_doc_bytes`/`min_test_methods`).
|
||||||
|
|
||||||
|
**Tâche** : **Sprint 8 · buffer** (DevOps CI/CD · QA). Roadmap fonctionnellement
|
||||||
|
close ; poursuite de la série anti-dérive (CLAUDE.md #6). Même patron EXACT que le
|
||||||
|
bloc BARÈME (poids) et la carte de renormalisation par archétype du MÊME README —
|
||||||
|
appliqué à une **3e surface distincte du MÊME README `qa/audit_4big`** : les seuils
|
||||||
|
de la colonne « Fait vérifié », jamais gatés hors leur poids voisin.
|
||||||
|
|
||||||
|
**Dérive silencieuse fermée** :
|
||||||
|
- `05_deliverables_mvp/qa/audit_4big/README.md:24` — cellule DOC « un `*.md`
|
||||||
|
(README/SPEC) ≥ **400 octets** à la racine » (= `thresholds.min_doc_bytes`) ·
|
||||||
|
`:26` — cellule TESTS « ≥ **8 méthodes** `def test_*` dans `tests/` » (=
|
||||||
|
`thresholds.min_test_methods`).
|
||||||
|
- Source faisant autorité : `05_deliverables_mvp/qa/audit_4big/quality_spec.json`
|
||||||
|
`[thresholds]` — l'**INPUT** du générateur, byte-gaté indirectement par
|
||||||
|
`check_artifacts` qui prouve que `out/quality_report.json` se **rebuild** depuis
|
||||||
|
lui. Les seuils ne sont PAS émis en clair dans le report ; seule l'**evidence
|
||||||
|
`TESTS`** de chaque module porte « (seuil N) » (émise par `crit_tests`), ce qui en
|
||||||
|
fait un **ancrage croisé** du seuil réellement APPLIQUÉ.
|
||||||
|
- Piège : la seule vérification existante (`tests/`) teste des **FONCTIONS** de
|
||||||
|
scoring (`crit_doc`/`crit_tests` avec seuil paramétré), jamais la PROSE du README.
|
||||||
|
Élever `min_test_methods` (8→12 : un module de 8-11 tests tomberait sous `FAIL` —
|
||||||
|
la barre même que le critère pose) ou changer `min_doc_bytes` dans le spec rebuild
|
||||||
|
le report SANS TOUCHER au README → prose « ≥ 8 méthodes »/« ≥ 400 octets » périmée
|
||||||
|
en silence, l'auditeur documentant un barème qu'il **n'applique plus** (l'invention
|
||||||
|
#6 interdit).
|
||||||
|
- **État courant** : **aucun seuil périmé** — les 2 cellules recoupent le spec
|
||||||
|
exactement, et le seuil TESTS appliqué (evidence report) == spec sur les 22 modules
|
||||||
|
(anti-invention #6, rien à réécrire). Le défaut est la **surface ungated**.
|
||||||
|
|
||||||
|
**Gate ajouté** (`ci/check_readme_claims.sh`, nouveau bloc « README audit_4big ·
|
||||||
|
SEUILS STRUCTURELS » après le bloc renormalisation par archétype) : (1) **cross-check
|
||||||
|
d'ancrage** — le seuil `TESTS` APPLIQUÉ (regex `(seuil N)` sur l'evidence de CHAQUE
|
||||||
|
module du report) == `spec.min_test_methods` pour tous (mord une divergence
|
||||||
|
spec↔report) ; (2) **prose DOC** — cellule « ≥ N octets » recomputée du spec, exacte ;
|
||||||
|
(3) **prose TESTS** — cellule « ≥ N méthodes » recomputée du spec, exacte. Un claim
|
||||||
|
absent échoue AUSSI (traçabilité #6).
|
||||||
|
|
||||||
|
**5 morsures vérifiées** : README `DOC 400→450` (prose périmée) · README `TESTS 8→10`
|
||||||
|
(prose périmée) · README ligne DOC vidée du seuil (claim INTROUVABLE) · **spec**
|
||||||
|
`min_test_methods 8→12` + rebuild (README périmé ET cross-check evidence[8]≠spec[12]
|
||||||
|
spec↔report) · **spec** `min_doc_bytes 400→500` + rebuild (README DOC périmé) ;
|
||||||
|
restauré = green : seuil TESTS appliqué == spec (8) · DOC « ≥ 400 octets » == spec ·
|
||||||
|
TESTS « ≥ 8 méthodes » == spec · exit 0. Working tree byte-restauré (`git checkout --`,
|
||||||
|
**JAMAIS** `git clean`, interdit absolu) · **7 gates re-verts**
|
||||||
|
(`check_readme_claims`/`check_ci_integrity`/`check_docs`/`guard_constraints`/
|
||||||
|
`check_artifacts`/`check_regression`/`validate_json`).
|
||||||
|
|
||||||
|
- `ci/README.md` (ligne récap du pipeline `check-readme-claims` + paragraphe détaillé
|
||||||
|
« troisième surface · colonne Fait vérifié / seuils structurels ») mis à jour.
|
||||||
|
- **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 ; le branchement
|
||||||
|
du gate 4Big sur le pipeline de release reste côté VPS).
|
||||||
|
- **Auto-score 4Big** : 96/100.
|
||||||
|
|
||||||
## Session `20260801_000201` · Buffer S8 · Domaine RBAC/userperm_gen : la **table « Mapping `scope_donnees` → mécanisme »** — la **FONCTION d'enforcement ROW-LEVEL** (quel mécanisme Frappe natif applique CHAQUE portée de données + si un `User Permission` template est émis), CŒUR sécurité du module — était transcrite EN PROSE (README:33-38) SANS AUCUN gate d'IDENTITÉ. Le bloc RBAC « 3 volets » existant ne gate QUE la **ventilation** par mécanisme (« 28 `entite` · 16 `groupe` · 2 `own` · 4 `equipe` »), un COMPTE aveugle à QUEL mécanisme applique QUELLE portée.
|
## Session `20260801_000201` · Buffer S8 · Domaine RBAC/userperm_gen : la **table « Mapping `scope_donnees` → mécanisme »** — la **FONCTION d'enforcement ROW-LEVEL** (quel mécanisme Frappe natif applique CHAQUE portée de données + si un `User Permission` template est émis), CŒUR sécurité du module — était transcrite EN PROSE (README:33-38) SANS AUCUN gate d'IDENTITÉ. Le bloc RBAC « 3 volets » existant ne gate QUE la **ventilation** par mécanisme (« 28 `entite` · 16 `groupe` · 2 `own` · 4 `equipe` »), un COMPTE aveugle à QUEL mécanisme applique QUELLE portée.
|
||||||
|
|
||||||
**Tâche** : **Sprint 8 · buffer** (DevOps CI/CD · QA). Roadmap fonctionnellement
|
**Tâche** : **Sprint 8 · buffer** (DevOps CI/CD · QA). Roadmap fonctionnellement
|
||||||
|
|||||||
+20
-1
File diff suppressed because one or more lines are too long
@@ -514,6 +514,78 @@ if criteria is not None and a4_txt:
|
|||||||
bad(f"README audit_4big · archétype `{a}` — {A4} exclut {sorted(got)} MAIS "
|
bad(f"README audit_4big · archétype `{a}` — {A4} exclut {sorted(got)} MAIS "
|
||||||
f"le référentiel exclut {exp} → régénérer le README")
|
f"le référentiel exclut {exp} → régénérer le README")
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# README de l'auditeur 4Big · SEUILS STRUCTURELS de la colonne « Fait vérifié »
|
||||||
|
# (min_doc_bytes / min_test_methods) — 3e surface du MÊME README, jamais gatée.
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Le bloc BARÈME ci-dessus recompute les POIDS (2e colonne de la table
|
||||||
|
# « Critère | Poids | Fait vérifié »), mais la 3e colonne « Fait vérifié » NOMME
|
||||||
|
# les DEUX seuils structurels que le scorer applique réellement :
|
||||||
|
# • DOC « un *.md (README/SPEC) ≥ 400 octets » → thresholds.min_doc_bytes
|
||||||
|
# • TESTS « ≥ 8 méthodes def test_* dans tests/ » → thresholds.min_test_methods
|
||||||
|
# Ces deux nombres sont DATA-DERIVED de quality_spec.json[thresholds] — l'INPUT
|
||||||
|
# du générateur, byte-gaté par check_artifacts qui prouve que quality_report.json
|
||||||
|
# se rebuild depuis lui — et TRANSCRITS À LA MAIN dans la table. AUCUN gate ne
|
||||||
|
# les liait : le bloc BARÈME ne capture que le poids (`| \`DOC\` | 20 |`),
|
||||||
|
# AVEUGLE à la 3e cellule. Élever min_test_methods (8→12 : un module de 8-11
|
||||||
|
# tests tomberait sous FAIL — la barre même que le critère pose) ou changer
|
||||||
|
# min_doc_bytes dans le spec rebuild le report SANS TOUCHER au README → prose
|
||||||
|
# « ≥ 8 méthodes » / « ≥ 400 octets » PÉRIMÉE en silence, l'auditeur documentant
|
||||||
|
# un barème qu'il n'applique plus (l'invention #6 interdit). Aucune suite tests/
|
||||||
|
# (qui teste des FONCTIONS de scoring, pas la prose) n'attrape ce « vert
|
||||||
|
# trompeur ». CROSS-CHECK d'ancrage : l'evidence TESTS de CHAQUE module du report
|
||||||
|
# porte « (seuil N) » (émise par crit_tests) — on exige N == spec.min_test_methods
|
||||||
|
# pour TOUS, prouvant que le seuil ÉCRIT dans le spec == le seuil réellement
|
||||||
|
# APPLIQUÉ à la construction (mord une divergence spec↔report). Un claim absent
|
||||||
|
# échoue AUSSI (traçabilité #6).
|
||||||
|
# ============================================================================
|
||||||
|
try:
|
||||||
|
_a4_thr = load("qa/audit_4big/quality_spec.json")["thresholds"]
|
||||||
|
min_doc = int(_a4_thr["min_doc_bytes"])
|
||||||
|
min_test = int(_a4_thr["min_test_methods"])
|
||||||
|
except (OSError, KeyError, ValueError, TypeError) as e:
|
||||||
|
bad(f"README audit_4big seuils · quality_spec.json[thresholds] illisible/inattendu : {e}")
|
||||||
|
min_doc = min_test = None
|
||||||
|
if min_doc is not None and criteria is not None and a4_txt:
|
||||||
|
# cross-check d'ancrage : seuil TESTS APPLIQUÉ (evidence report) == spec
|
||||||
|
ev_seuils = set()
|
||||||
|
for m in qr_crit["modules"]:
|
||||||
|
for ck in m.get("checks", []):
|
||||||
|
if ck.get("criterion") == "TESTS":
|
||||||
|
mm = re.search(r"\(seuil (\d+)\)", ck.get("evidence", ""))
|
||||||
|
if mm:
|
||||||
|
ev_seuils.add(int(mm.group(1)))
|
||||||
|
if not ev_seuils:
|
||||||
|
bad("README audit_4big seuils · aucune evidence TESTS « (seuil N) » dans le "
|
||||||
|
"report — impossible d'ancrer le seuil réellement appliqué")
|
||||||
|
elif ev_seuils != {min_test}:
|
||||||
|
bad(f"README audit_4big seuils · seuil TESTS APPLIQUÉ (evidence report) "
|
||||||
|
f"{sorted(ev_seuils)} ≠ spec.min_test_methods ({min_test}) → spec↔report "
|
||||||
|
f"divergent (régénérer le report)")
|
||||||
|
else:
|
||||||
|
good(f"README audit_4big seuils · seuil TESTS appliqué (report) == spec "
|
||||||
|
f"({min_test}) sur tous les modules")
|
||||||
|
# prose · DOC « ≥ N octets » (3e cellule de la ligne DOC)
|
||||||
|
md = re.search(r"`DOC`[^|]*\|[^|]*\|[^|]*?≥\s*(\d+)\s*octets", a4_txt)
|
||||||
|
if md is None:
|
||||||
|
bad(f"README audit_4big seuils · ligne DOC « ≥ N octets » INTROUVABLE dans {A4} "
|
||||||
|
f"(attendu {min_doc})")
|
||||||
|
elif md.group(1) == str(min_doc):
|
||||||
|
good(f"README audit_4big seuils · DOC — « ≥ {md.group(1)} octets » == spec ({min_doc})")
|
||||||
|
else:
|
||||||
|
bad(f"README audit_4big seuils · DOC — {A4} dit « ≥ {md.group(1)} octets » MAIS "
|
||||||
|
f"spec.min_doc_bytes == {min_doc} → régénérer le README")
|
||||||
|
# prose · TESTS « ≥ N méthodes » (3e cellule de la ligne TESTS)
|
||||||
|
mt = re.search(r"`TESTS`[^|]*\|[^|]*\|[^|]*?≥\s*(\d+)\s*méthodes", a4_txt)
|
||||||
|
if mt is None:
|
||||||
|
bad(f"README audit_4big seuils · ligne TESTS « ≥ N méthodes » INTROUVABLE dans {A4} "
|
||||||
|
f"(attendu {min_test})")
|
||||||
|
elif mt.group(1) == str(min_test):
|
||||||
|
good(f"README audit_4big seuils · TESTS — « ≥ {mt.group(1)} méthodes » == spec ({min_test})")
|
||||||
|
else:
|
||||||
|
bad(f"README audit_4big seuils · TESTS — {A4} dit « ≥ {mt.group(1)} méthodes » MAIS "
|
||||||
|
f"spec.min_test_methods == {min_test} → régénérer le README")
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# Fiches agents · comptes de tests PAR SUITE (colonne « Tests » des tables) —
|
# Fiches agents · comptes de tests PAR SUITE (colonne « Tests » des tables) —
|
||||||
# même classe de « vert trompeur », au grain le PLUS FIN.
|
# même classe de « vert trompeur », au grain le PLUS FIN.
|
||||||
|
|||||||
Reference in New Issue
Block a user