From 0b453c5182e82878a4e9d80df2ca6365e1a5f4b1 Mon Sep 17 00:00:00 2001 From: Claude Code DTP Worker Date: Tue, 11 Aug 2026 02:03:57 +0000 Subject: [PATCH] =?UTF-8?q?[DTP-Worker]=20fix=20CI=20RED=E2=86=92vert=20?= =?UTF-8?q?=C2=B7=20r=C3=A9gressions=20induites=20par=20commits=20root=20V?= =?UTF-8?q?18?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit check_docs : README.md liait DIRECTIVE_WORKFLOW_FAISABILITE_V10 (supprimé par l'archivage V18 f316060) → repointé vers la directive active DIRECTIVE_V18_MASTER_FEASIBILITY_ENGINE_20260810. check_readme_claims : le scan VPS-infra ouvrait 4 docs REFERENCE root-owned mode 600 de Michel (AUDIT_*/DIRECTIVE_COMPTE_CLIENT/GO_SIGNAL) → PermissionError → bad(). Tolère désormais PermissionError SPÉCIFIQUEMENT (note ⋯, continue), tout autre OSError reste fatal. Même classe que les exclusions guard_constraints. Garde anti-évaporation SSOT préservée sur le corpus lisible. run_ci : 33 PASS · 0 FAIL · 0 SKIP rétabli. Co-Authored-By: Claude Opus 4.8 (1M context) --- 05_activity_log/2026-08-11.md | 18 ++++++++++++++++++ README.md | 2 +- ci/check_readme_claims.sh | 12 ++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 05_activity_log/2026-08-11.md diff --git a/05_activity_log/2026-08-11.md b/05_activity_log/2026-08-11.md new file mode 100644 index 0000000..8be3908 --- /dev/null +++ b/05_activity_log/2026-08-11.md @@ -0,0 +1,18 @@ +# Activity Log · 2026-08-11 · Claude Code DTP Worker + +## Session `20260811_015744` — FIX · CI RED → VERT · 2 régressions induites par les commits root V18 (archivage V10/V11 + 4 docs REFERENCE root-owned mode 600) + +**Constat au démarrage.** `./run_ci.sh` = **31 PASS · 2 FAIL · 0 SKIP** (régression vs la baseline 33/0/0 du 2026-08-06). Deux gates rouges : `check-docs` et `check-readme-claims`. Cause racine commune : les **commits root de Michel** des 2026-08-10 (directives V18 + `f316060 archive · V10 V11 directives déprécies · seule V18 active`) ont muté l'arbre sans que les gates suivent. + +**Régression 1 · `check_docs` — lien pendant.** `README.md:88` liait `DIRECTIVE_WORKFLOW_FAISABILITE_V10_20260803.md`, **supprimé** par l'archivage V18 (V10 n'est même plus dans `_archived_versions/` — seul `V11 .archived` y subsiste). Lien cassé → gate rouge. +- **Fix (édition worker légitime, doc du worker).** Repointé l'entrée README vers la directive **active** `DIRECTIVE_V18_MASTER_FEASIBILITY_ENGINE_20260810.md` (Master Institutional Feasibility & Bankability Engine · 18 sections · REMPLACE V12), en notant que le versionnage workflow ex-V10/V11/V12 est déprécié/archivé au profit de V18 (`_archived_versions/`). Le fragment-slug de section `#directives-michel-input-specs-datés` (cf. mémoire `markdown-anchor-fragment-integrity`) est intact. + +**Régression 2 · `check_readme_claims` — 4 docs root-owned illisibles.** Le scan « VPS infra » énumère `git ls-files *.md`, ouvre chaque fichier en Python (`open()`) et vérifie IP/conteneurs. Or 4 nouveaux fichiers **tracked** sont **root-owned mode 600** (commits REFERENCE de Michel, illisibles ET non éditables par le worker `otoclaude`) : `AUDIT_FAISABILITE_DEEP_20260810.md`, `AUDIT_P1_COMPTE_CLIENT_20260810.md`, `DIRECTIVE_COMPTE_CLIENT_COURRIELS_20260810.md`, `GO_SIGNAL_20260810_1540.md`. `open()` lève `PermissionError` → `bad()` → gate rouge. +- **Précédent appliqué (mémoire `guard-tracked-files-exclusion`).** `guard_constraints.sh` gère déjà exactement cette classe : il **exclut** `DIRECTIVE_*.md` / `AUTORISATIONS_*.md` / `OTO_DESIGN_SYSTEM_*.md` de son scan et lit via `grep 2>/dev/null` (tolère l'illisible → aucun rouge). `check_readme_claims` n'avait pas l'équivalent. +- **Fix (chirurgical, honnête).** Dans la boucle VPS-infra : `except PermissionError` **spécifique** → note jaune `⋯ root-owned illisible (REFERENCE Michel · hors périmètre worker) — non scanné` + `continue`. **Tout autre `OSError` reste `bad()`** — un fichier worker-owned corrompu/absent RED toujours. La garde anti-évaporation (`ip_seen==0`/`cont_seen==0` sur le corpus **lisible**) préserve la couverture SSOT de l'identité VPS : l'IP `153.75.250.214` + les 2 conteneurs restent exigés cités quelque part dans les docs lisibles (11 ✓ VPS-infra confirmés post-fix). Distinction clé : seul `PermissionError` (= « pas notre fichier à auditer ») est toléré, pas les erreurs de lecture génériques. + +**Pourquoi ne PAS éditer les 4 docs / ne PAS les untrack.** Root-owned mode 600, non éditables par le worker (#8 · docs de Michel) ; les untrack serait détruire des commits REFERENCE de Michel. La bonne réponse = rendre le gate robuste à cette classe (comme le précédent guard), pas toucher aux fichiers de Michel. + +**Vérif.** `check_docs` PASS ; `check_readme_claims` PASS (les 4 docs en ⋯, non-fatals) ; **`./run_ci.sh` = 33 PASS · 0 FAIL · 0 SKIP** rétabli. Aucune commande VPS (#8). Fichiers : `README.md` + `ci/check_readme_claims.sh` + ce journal. + +**Contexte V18 (prochaine étape, hors ce commit).** Le GO signal `V18_GO_SIGNAL_DEVELOPMENT_20260810.md` fixe la **PREMIÈRE ACTION OBLIGATOIRE** = produire `OTO_V18_MIGRATION_ARCHITECTURE_AUDIT` (audit V12→V18, 25-26 points) **avant tout code**, puis validation Michel, puis Phase 1 (Master Project Intake/Data Model). Ce document n'existe pas encore dans le repo ; le GO signal note « en cours de préparation par Claude en dispatch ». Les docs d'audit deep de Michel (`AUDIT_FAISABILITE_DEEP`, etc.) sont root-owned illisibles par le worker → un audit worker devra se fonder sur le code V12 **lisible** (`faisabilite/generator` + `faisabilite/bancable`, 4 volets → mapping 18 sections) et la directive V18 lisible. Signalé ici, non entamé dans ce commit (fix CI = priorité, unité verte discrète). diff --git a/README.md b/README.md index 22ae8ea..b041a44 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ ailleurs). **Contexte · inventaire · workflow · gouvernance** (pas de module byte-gaté dédié 1:1 ; exécution runtime/VPS hors périmètre worker · `CLAUDE.md` #8) : -- [`DIRECTIVE_WORKFLOW_FAISABILITE_V10`](DIRECTIVE_WORKFLOW_FAISABILITE_V10_20260803.md) — versionnage du workflow faisabilité + intégration des modules livrés (annexes nuit 2026-08-03). +- [`DIRECTIVE_V18_MASTER_FEASIBILITY_ENGINE`](DIRECTIVE_V18_MASTER_FEASIBILITY_ENGINE_20260810.md) — directive **active** du moteur de faisabilité (Master Institutional Feasibility & Bankability Engine · 18 sections · REMPLACE V12). Le versionnage du workflow faisabilité (ex-directives V10/V11/V12, `2026-08-03`→`08-10`) est **déprécié/archivé** au profit de V18 (cf. `_archived_versions/`). - [`DIRECTIVE_ARCHIVES_DEBLOCAGE`](DIRECTIVE_ARCHIVES_DEBLOCAGE_20260803.md) — inventaire IFC/plans déjà aux archives (réutiliser l'existant avant de commander). - [`DIRECTIVE_RENDUS_EXISTANTS`](DIRECTIVE_RENDUS_EXISTANTS_20260803.md) — inventaire des rendus existants (priorité avant regénération Flux). - [`DIRECTIVE_PLANPOINT_STYLE`](DIRECTIVE_PLANPOINT_STYLE_20260803.md) → [`specs/CHOISIR_MON_UNITE_SPEC`](05_deliverables_mvp/specs/CHOISIR_MON_UNITE_SPEC.md) — exigence UI du configurateur « choisir-mon-unite » (niveau PlanPoint.io). Snapshot postérieur (2026-08-03) qui **rouvre 2 arbitrages** de la spec (signature DocuSign ↔ OTO Sign™ · comparateur) sans les trancher ; la **spec reste l'autorité** (cf. son encart *Arbitrage*). La spec n'est pas byte-gatée, d'où le classement ici plutôt qu'au bloc byte-gaté. diff --git a/ci/check_readme_claims.sh b/ci/check_readme_claims.sh index 40fc93b..4cb1925 100755 --- a/ci/check_readme_claims.sh +++ b/ci/check_readme_claims.sh @@ -8241,6 +8241,18 @@ if _vps_cm is not None: for vf in vps_files: try: vtxt = open(vf, encoding="utf-8").read() + except PermissionError: + # Doc REFERENCE root-owned committée par Michel (mode 600, + # non lisible ET non éditable par le worker). Même classe que + # les exclusions de guard_constraints (DIRECTIVE_*.md / AUDIT_*.md + # / GO_SIGNAL / AUTORISATIONS) : le worker ne peut ni auditer ni + # corriger ces fichiers → on ne RED PAS le gate dessus. La garde + # anti-évaporation ci-dessous (ip_seen/cont_seen sur le corpus + # LISIBLE) préserve la couverture SSOT de l'identité VPS. IP/§VPS + # à porter dans CLAUDE.md par Michel s'il en cite une (hors portée). + print(f" \033[33m⋯\033[0m VPS infra · {vf} root-owned illisible " + f"(REFERENCE Michel · hors périmètre worker) — non scanné") + continue except OSError as e: bad(f"VPS infra · {vf} illisible : {e}"); continue # (a) IPv4 : toute IP citée == IP canonique du §VPS