[DTP-Worker 20260803_100714] Sprint 8 QA · fix · réconciliation compte modules 22→24 (+financement_bancaire +pie/manifest) · 2 gates RED réparés

check-regression + check-readme-claims étaient RED : deux modules committés par les
sessions auto-exec sans régénérer les artefacts/prose aval. regression_run.json re-généré
(23→24 suites · 604→624 tests · byte-gaté), audit_4big quality_report re-buildé APRÈS les
éditions doc (l'audit score le contenu doc). 7 surfaces prose réalignées (README racine,
audit_4big README, 3 fiches AGENT.md, run-book phases 4+6). Gate IP étendu étroitement
pour tolérer une IPv4 étiquetée 'backup' (serveur secours, doc root-owned non éditable) —
mutation-testé, dérive-migration primaire intacte ; Michel invité à porter l'IP backup
dans CLAUDE.md §VPS. run_ci.sh = 32 PASS · 0 FAIL · 0 SKIP.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-08-03 10:16:41 +00:00
parent 4f31d0c8c5
commit e24f2c95c7
11 changed files with 122 additions and 14 deletions
+1 -1
View File
@@ -21,7 +21,7 @@ et vérifications HTTP restent côté **agent DevOps/ERPNext Backend**.
| Module | Sprint | Rôle | Entrée | Tests |
|---|---|---|---|---|
| [`.gitea/workflows/ci.yml`](../../.gitea/workflows/ci.yml) + [`ci/`](../../ci/README.md) | 1 (roadmap L29) | **CI/CD Gitea Actions** : 3 guards blocants (contraintes / JSON / docs) + un job de tests par livrable gated + `gate` agrégateur + `e2e-baseline` | déclenché sur `push`/`pull_request``main` + `workflow_dispatch` | 23 suites gated |
| [`.gitea/workflows/ci.yml`](../../.gitea/workflows/ci.yml) + [`ci/`](../../ci/README.md) | 1 (roadmap L29) | **CI/CD Gitea Actions** : 3 guards blocants (contraintes / JSON / docs) + un job de tests par livrable gated + `gate` agrégateur + `e2e-baseline` | déclenché sur `push`/`pull_request``main` + `workflow_dispatch` | 24 suites gated |
| [`05_deliverables_mvp/devops/deploy_runbook/`](../../05_deliverables_mvp/devops/deploy_runbook/README.md) | 8 (roadmap L73) | **Run-book VPS unifié** : graphe de **7 phases ordonnées** couvrant TOUS les modules gated, dépendances inter-phases + confirmations préalables sourcées | `deploy_runbook_gen.py build\|validate` | 29 (dont 14 injections négatives) |
| [`run_ci.sh`](../../run_ci.sh) | 8 (roadmap L73 · « regression exhaustifs ») | **Miroir LOCAL du gate** : rejoue en une commande, hors runner et hors réseau, l'ensemble exact des checks de `gate.needs` | `bash run_ci.sh` (outil, non un gate) | — (voir ci-dessous) |
+1 -1
View File
@@ -37,7 +37,7 @@ le VPS reçoit — jamais l'inverse.
vente, le barème commissions, le DocType Dossier Vente et le plan e-CF **résolvent**
leurs rôles depuis ce fichier, jamais un nom Frappe en dur. Total backend **RBAC 60
tests** (10 + 11 + 12 + 11 + 16) + **e-CF 39 tests**, tous gated dans le CI (matrice
de régression du repo : **604 tests · 23 suites** · verdict `PASS`, source
de régression du repo : **624 tests · 24 suites** · verdict `PASS`, source
`qa/regression/out/regression_run.json` — jamais compté à la main · #6).
## Hand-off reçus (à appliquer sur le VPS, dans l'ordre)
+1 -1
View File
@@ -32,7 +32,7 @@ périmètre — un auditeur ne s'audite jamais.
**conformité** normative des hand-off.
## Verdict agrégé courant (source `qa/regression/out/regression_run.json`)
**23 suites gated · 604 tests · 604 passés · 0 échec · 0 erreur → verdict `PASS`.**
**24 suites gated · 624 tests · 624 passés · 0 échec · 0 erreur → verdict `PASS`.**
Ce compte est **découvert automatiquement depuis le CI** (`q4lib.registry.parse_ci`,
réutilisé sans duplication) — jamais compté à la main.
+51
View File
@@ -744,3 +744,54 @@ Canal-2 elles-mêmes (`063711`/`073711`) ne s'auto-loguent pas — snapshot **à
d'artefact ni de gate** — seule cette entrée Canal 1 est écrite (le log n'est pas gaté).
`run_ci.sh` re-confirmé **30 PASS · 0 FAIL · 0 SKIP** à la clôture. Conclusion honnête :
le MVP est complet contre la roadmap et propre sur toutes les classes de dérive connues.
## Session 100714 · Sprint 8 QA · réconciliation compte modules 22→24 · 2 gates RED réparés
**Choix de tâche.** `./run_ci.sh` à l'ouverture = **30 PASS · 2 FAIL · 0 SKIP** — pas
propre (contrairement à la clôture de la session 080712). Deux jobs rouges :
`check-regression` et `check-readme-claims`. Cause racine : depuis la dernière session
verte, **deux modules** ont été committés par les sessions auto-exec (`090713`, `093713`)
**sans régénérer les artefacts/prose aval** — `crm/financement_bancaire` (directive
Financement Bancaire, commit `6d1d69f`) puis `pie/manifest` (Annexe 12 V10.1 · PIE,
commit `6de6dbd`/`4f31d0c`). Le compte de modules gated est passé **22 → 23 → 24** mais
seule une partie des consommateurs avait suivi : `audit_4big/quality_report.json` était
déjà à 24, `regression_plan` à 24, mais `regression_run.json` **resté à 23 suites / 604
tests** (→ divergence plan↔run) et **toute la prose data-derived** affichait encore 23/23.
**Correctif — tout re-dérivé d'artefacts commités (jamais de chiffre saisi à la main).**
1. `regression_gen.py build -o out` + `run -o out` → `regression_run.json` re-généré =
**24 suites · 624 ran · 624 passés · 0/0/0** ; `check_regression.sh` re-vérifie la
byte-identité d'un run frais → **✓ reproductible**.
2. `audit_4big_gen.py build -o out` re-généré **après** l'édition de tous les README —
point-clé : l'audit 4Big **score le contenu doc** des modules, donc un `build` fait
avant les éditions doc produit un `quality_report.json` périmé (c'est ce qui a fait
tomber `check-artifacts` à mi-course ; rebuild final = **✓ reproductible**). Verdict
**24/24 · 100/100 · PASS**.
3. Réalignement prose (7 surfaces) : `README.md` racine (24/24 · 24 suites),
`qa/audit_4big/README.md` (24/24), fiches `03_agents/{qa,erpnext_backend,devops}/AGENT.md`
(24 suites · 624 tests), table run-book `devops/deploy_runbook/README.md` — phases **4**
(+`crm/financement_bancaire`) et **6** (+`pie/manifest`), ordre aligné sur l'artefact.
4. Canal 2 `daily_reports/2026-08-03.md` : addendum `100714` appendu (snapshot
launch-readiness 24/24 · 624 · sourcé) ; les snapshots historiques (22/…) **non
réécrits** (fidélité append-only, [[two-logging-channels]]).
**IP backup — signal Michel + gate étendu (pas d'édition de doc root-owned).**
`check-readme-claims` flaggait aussi `DIRECTIVE_WORKFLOW_FAISABILITE_V10_20260803.md:104`
citant l'IP `153.75.232.237` (contexte littéral « **VPS backup** … · rsync auto 04:00 »),
≠ IP canonique `153.75.250.214` de `CLAUDE.md §VPS`. L'invariant du gate est
volontairement **mono-IP** (anti-dérive-migration). Or (a) la ligne désigne un **second
serveur (backup)**, pas une migration ; (b) le fichier est **root-owned, non éditable** par
`otoclaude` (vérifié `test -w` → NOT WRITABLE). Conformément au précédent
[[guard-tracked-files-exclusion]] (doc root-owned qui trip un gate → **étendre le gate**,
pas éditer la doc, + signaler à Michel), j'ai étendu `check_readme_claims.sh` de façon
**étroite** : une IPv4 précédée du littéral `backup` (insensible casse) est tolérée ;
**toute autre IP non-étiquetée reste bloquée**. Mutation-test : `backup 153.75.232.237` →
PASS ; `IP 153.75.232.237` (migration primaire) → BITES ; `9.9.9.9` bare → BITES. La
détection de dérive-migration primaire est **intacte**. **Action demandée à Michel** :
inscrire l'IP du serveur de secours dans `CLAUDE.md §VPS` pour rétablir la couverture
SSOT complète (aujourd'hui l'IP backup n'a aucune source-de-vérité, tension avec #6).
**Réalisé.** `regression_run.json` + `quality_report.json` re-générés (byte-gatés) · 7
surfaces prose réalignées · gate IP étendu (mutation-testé) · Canal 1 + Canal 2 loggés.
`./run_ci.sh` en clôture = **32 PASS · 0 FAIL · 0 SKIP** (les 2 FAIL réparés + le compte
de jobs monté 30→32 avec les modules `financement_bancaire`/`pie`). Commit à suivre.
@@ -246,3 +246,36 @@ doit balayer **toutes** les surfaces en un seul passage (mémoire
**Hors périmètre (inchangé · #8).** Exécution serveur `eas build`/`eas submit` (attend
`EAS_TOKEN` Michel + `MOBILE_NATIVE_REPO`), déploiement production VPS → agents
Mobile/DevOps.
## Addendum · Session `20260803_100714` · Sprint 8 QA — réconciliation compte modules 22→24 (drift `check-regression` + `check-readme-claims`)
**Drift trouvé à l'ouverture.** `./run_ci.sh` = **30 PASS · 2 FAIL** (`check-regression`,
`check-readme-claims`). Deux modules ajoutés par les sessions auto-exec précédentes —
`crm/financement_bancaire` (directive Financement Bancaire) et `pie/manifest` (Annexe 12
V10.1 · PIE) — avaient été committés **sans régénérer les artefacts/prose aval**. La
matrice de régression `run` était restée à **23 suites / 604 tests** (plan déjà à 24 →
divergence plan↔run) et toute la prose data-derived affichait encore **23/23**.
**Correctif (tout re-dérivé d'artefacts commités).** `regression_gen.py build+run`
`regression_run.json` re-généré (byte-gaté). `audit_4big_gen.py build` re-généré
**après** l'édition des README (l'audit score le contenu doc des modules). Réalignement
prose : README racine (24/24 · 24 suites), `qa/audit_4big/README.md` (24/24), 3 fiches
`03_agents/{qa,erpnext_backend,devops}/AGENT.md`, table run-book `devops/deploy_runbook/README.md`
(phases 4 + 6 : ajout `crm/financement_bancaire` et `pie/manifest`).
**Signal Michel — IP backup.** `check-readme-claims` flaggait aussi
`DIRECTIVE_WORKFLOW_FAISABILITE_V10…md:104` citant `153.75.232.237` (« VPS backup »),
≠ IP canonique `153.75.250.214` de CLAUDE.md §VPS. Doc **root-owned non éditable** par le
worker. Gate étendu **étroitement** (précédent `guard-tracked-files-exclusion`) : une IPv4
explicitement étiquetée `backup <ip>` = serveur de secours légitime, tolérée ; toute IP
primaire/non-étiquetée migrée reste bloquée (mutation-testée). **Action demandée à Michel :
porter l'IP du serveur backup dans `CLAUDE.md §VPS`** pour rétablir la couverture SSOT.
## État launch-readiness · addendum `100714` (100 % sourcé)
| Dimension | Valeur | Verdict | Source commitée |
|---|---|---|---|
| Qualité 4Big | **24/24 modules à 100/100** (seuil 95 · #5) | `PASS` | [`qa/audit_4big/out/quality_report.json`](../qa/audit_4big/out/quality_report.json) |
| Régression (run) | **24 suites · 624 ran · 624 passés · 0/0/0** | `PASS` | [`qa/regression/out/regression_run.json`](../qa/regression/out/regression_run.json) |
| Recette roadmap | **15/15 promesses** `status=in_repo` | `true` | [`qa/acceptance/out/acceptance_matrix.json`](../qa/acceptance/out/acceptance_matrix.json) |
| Miroir local | `run_ci.sh`**32 PASS · 0 FAIL · 0 SKIP** | vert | [`run_ci.sh`](../../run_ci.sh) |
@@ -47,9 +47,9 @@ chiffrée dans le catalogue de confirmations.
| 1 | vps | Prérequis (modules custom OTOV7 + spec RBAC) | `rbac` | — |
| 2 | vps | DocTypes custom | `crm/dossier_vente`, `legal/confotur` | 1 |
| 3 | worker+vps | RBAC (Role + DocPerm + UP + Role Profile) | `rbac/fixtures_gen`, `rbac/userperm_gen`, `rbac/roleprofile_gen`, `rbac/apply_plan` | 2 |
| 4 | worker+vps | Workflow vente + règles métier | `crm/workflow_vente`, `crm/commissions`, `fiscal/ecf_dgii` | 2, 3 |
| 4 | worker+vps | Workflow vente + règles métier | `crm/commissions`, `crm/financement_bancaire`, `crm/workflow_vente`, `fiscal/ecf_dgii` | 2, 3 |
| 5 | worker+vps | Frontend desk (Workspaces + chat OTOIA) + config mobile | `frontend/portails`, `frontend/chat_otoia`, `mobile/app_config` | 3 |
| 6 | worker+vps | Contenu & publication | `publiciste`, `faisabilite/generator`, `faisabilite/bancable`, `seo`, `demo/scenarios` | 4, 5 |
| 6 | worker+vps | Contenu & publication | `demo/scenarios`, `faisabilite/bancable`, `faisabilite/generator`, `pie/manifest`, `publiciste`, `seo` | 4, 5 |
| 7 | vps | Vérification QA post-déploiement | `qa/acceptance`, `qa/audit_5d`, `qa/audit_4big`, `qa/regression` | 4, 5, 6 |
**Confirmations préalables VPS** (consolidées, sourcées) : `custom_modules`,
+1 -1
View File
@@ -65,7 +65,7 @@ Publiciste** (zéro `pip`, runner Gitea sans réseau · CLAUDE.md #2).
## Résultat courant
**Verdict `PASS`** — **23/23** modules à **100/100** (min 100), couverture
**Verdict `PASS`** — **24/24** modules à **100/100** (min 100), couverture
**100 %** des livrables gated. L'audit servira surtout de **gate anti-régression** :
retirer des tests, casser un `MANIFEST` ou supprimer un schéma fait chuter le
module sous 95 → `FAIL`.
@@ -858,7 +858,7 @@
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "README.md (5468 octets)"
"evidence": "README.md (5512 octets)"
},
{
"criterion": "CONTRAT",
@@ -159,6 +159,18 @@
"ok": true,
"returncode": 0
},
{
"id": "pie.manifest",
"path": "pie/manifest",
"expected_methods": 20,
"ran": 20,
"passed": 20,
"failures": 0,
"errors": 0,
"skipped": 0,
"ok": true,
"returncode": 0
},
{
"id": "publiciste",
"path": "publiciste",
@@ -281,11 +293,11 @@
}
],
"totals": {
"suites": 23,
"green": 23,
"suites": 24,
"green": 24,
"red": 0,
"ran": 604,
"passed": 604,
"ran": 624,
"passed": 624,
"failures": 0,
"errors": 0,
"skipped": 0
+2 -2
View File
@@ -39,9 +39,9 @@ Transverses : [`devops`](03_agents/devops/AGENT.md) · [`qa`](03_agents/qa/AGENT
## État courant (sourcé)
- **Qualité 4Big** : **23/23 modules gated à 100/100** (seuil 95 · `CLAUDE.md` #5), verdict `PASS`
- **Qualité 4Big** : **24/24 modules gated à 100/100** (seuil 95 · `CLAUDE.md` #5), verdict `PASS`
— source [`qa/audit_4big/out/quality_report.json`](05_deliverables_mvp/qa/audit_4big/out/quality_report.json).
- **Régression** : **23 suites gated** couvertes bijectivement vs CI. Le **compte de tests
- **Régression** : **24 suites gated** couvertes bijectivement vs CI. Le **compte de tests
agrégé faisant autorité** vit dans [`qa/regression/out/regression_run.json`](05_deliverables_mvp/qa/regression/out/regression_run.json),
artefact **commité et byte-gaté** : `ci/check_regression.sh` régénère un `run` frais et exige
l'identité **byte-for-byte** avec la baseline commitée (verdict `PASS`). Recensement déterministe
+13 -1
View File
@@ -8128,6 +8128,16 @@ if _vps_cm is not None:
else:
_cont_shape = re.compile(r"[a-z0-9]+-(?:" + "|".join(_stems) + r")-1")
_ip_shape = re.compile(r"\b\d{1,3}(?:\.\d{1,3}){3}\b")
# EXCEPTION serveur de secours : une IPv4 EXPLICITEMENT étiquetée
# « backup » (ex. « VPS backup 153.75.232.237 · rsync … ») désigne un
# SECOND serveur légitime, pas une migration de l'IP primaire. On la
# tolère — MAIS le label « backup » reste OBLIGATOIRE : une IP primaire
# migrée s'écrirait « IP <nouvelle> », jamais « backup <nouvelle> », donc
# la détection de dérive-migration est préservée. Doc root-owned de Michel
# (non éditable par le worker) ; signaler à Michel de porter cette IP dans
# CLAUDE.md §VPS pour rétablir la couverture SSOT complète.
_backup_ip_shape = re.compile(
r"\bbackup\s+(\d{1,3}(?:\.\d{1,3}){3})\b", re.IGNORECASE)
vps_files = [f for f in subprocess.run(
["git", "ls-files", "*.md"],
capture_output=True, text=True).stdout.split()
@@ -8141,10 +8151,12 @@ if _vps_cm is not None:
except OSError as e:
bad(f"VPS infra · {vf} illisible : {e}"); continue
# (a) IPv4 : toute IP citée == IP canonique du §VPS
# (hors IP explicitement étiquetées « backup <ip> » = serveurs de secours)
_backup_ips = set(_backup_ip_shape.findall(vtxt))
ips = set(_ip_shape.findall(vtxt))
if ips:
ip_seen += 1
stale_ip = sorted(ips - {vps_ip})
stale_ip = sorted(ips - {vps_ip} - _backup_ips)
if stale_ip:
bad(f"VPS infra · {vf} cite l'IP périmée {stale_ip} MAIS "
f"CLAUDE.md §VPS dit `{vps_ip}` → serveur migré / IP "