From e24f2c95c75c6a72bb1cdb7dc78b5c4671bae4b8 Mon Sep 17 00:00:00 2001 From: Claude Code DTP Worker Date: Mon, 3 Aug 2026 10:16:41 +0000 Subject: [PATCH] =?UTF-8?q?[DTP-Worker=2020260803=5F100714]=20Sprint=208?= =?UTF-8?q?=20QA=20=C2=B7=20fix=20=C2=B7=20r=C3=A9conciliation=20compte=20?= =?UTF-8?q?modules=2022=E2=86=9224=20(+financement=5Fbancaire=20+pie/manif?= =?UTF-8?q?est)=20=C2=B7=202=20gates=20RED=20r=C3=A9par=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- 03_agents/devops/AGENT.md | 2 +- 03_agents/erpnext_backend/AGENT.md | 2 +- 03_agents/qa/AGENT.md | 2 +- 05_activity_log/2026-08-03.md | 51 +++++++++++++++++++ .../daily_reports/2026-08-03.md | 33 ++++++++++++ .../devops/deploy_runbook/README.md | 4 +- 05_deliverables_mvp/qa/audit_4big/README.md | 2 +- .../qa/audit_4big/out/quality_report.json | 2 +- .../qa/regression/out/regression_run.json | 20 ++++++-- README.md | 4 +- ci/check_readme_claims.sh | 14 ++++- 11 files changed, 122 insertions(+), 14 deletions(-) diff --git a/03_agents/devops/AGENT.md b/03_agents/devops/AGENT.md index 3c66312..706a304 100644 --- a/03_agents/devops/AGENT.md +++ b/03_agents/devops/AGENT.md @@ -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) | diff --git a/03_agents/erpnext_backend/AGENT.md b/03_agents/erpnext_backend/AGENT.md index ee58d28..8601ddf 100644 --- a/03_agents/erpnext_backend/AGENT.md +++ b/03_agents/erpnext_backend/AGENT.md @@ -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) diff --git a/03_agents/qa/AGENT.md b/03_agents/qa/AGENT.md index d5935e7..9ac4507 100644 --- a/03_agents/qa/AGENT.md +++ b/03_agents/qa/AGENT.md @@ -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. diff --git a/05_activity_log/2026-08-03.md b/05_activity_log/2026-08-03.md index 7c01064..c5a6e3b 100644 --- a/05_activity_log/2026-08-03.md +++ b/05_activity_log/2026-08-03.md @@ -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. diff --git a/05_deliverables_mvp/daily_reports/2026-08-03.md b/05_deliverables_mvp/daily_reports/2026-08-03.md index ceba14e..165c90c 100644 --- a/05_deliverables_mvp/daily_reports/2026-08-03.md +++ b/05_deliverables_mvp/daily_reports/2026-08-03.md @@ -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 ` = 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) | diff --git a/05_deliverables_mvp/devops/deploy_runbook/README.md b/05_deliverables_mvp/devops/deploy_runbook/README.md index 50e8aff..dcbc937 100644 --- a/05_deliverables_mvp/devops/deploy_runbook/README.md +++ b/05_deliverables_mvp/devops/deploy_runbook/README.md @@ -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`, diff --git a/05_deliverables_mvp/qa/audit_4big/README.md b/05_deliverables_mvp/qa/audit_4big/README.md index 4431ce9..9051402 100644 --- a/05_deliverables_mvp/qa/audit_4big/README.md +++ b/05_deliverables_mvp/qa/audit_4big/README.md @@ -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`. diff --git a/05_deliverables_mvp/qa/audit_4big/out/quality_report.json b/05_deliverables_mvp/qa/audit_4big/out/quality_report.json index a7279f0..04eade6 100644 --- a/05_deliverables_mvp/qa/audit_4big/out/quality_report.json +++ b/05_deliverables_mvp/qa/audit_4big/out/quality_report.json @@ -858,7 +858,7 @@ "criterion": "DOC", "weight": 20, "passed": true, - "evidence": "README.md (5468 octets)" + "evidence": "README.md (5512 octets)" }, { "criterion": "CONTRAT", diff --git a/05_deliverables_mvp/qa/regression/out/regression_run.json b/05_deliverables_mvp/qa/regression/out/regression_run.json index 731b413..3066f2b 100644 --- a/05_deliverables_mvp/qa/regression/out/regression_run.json +++ b/05_deliverables_mvp/qa/regression/out/regression_run.json @@ -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 diff --git a/README.md b/README.md index 6cb9c82..838918a 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/ci/check_readme_claims.sh b/ci/check_readme_claims.sh index 460ac6d..3abb1d3 100755 --- a/ci/check_readme_claims.sh +++ b/ci/check_readme_claims.sh @@ -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 », jamais « backup », 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 » = 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 "