[DTP-Worker] fix CI RED→vert · régressions induites par commits root V18

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) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-08-11 02:03:57 +00:00
parent f3160607bc
commit 0b453c5182
3 changed files with 31 additions and 1 deletions
+18
View File
@@ -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).
+1 -1
View File
@@ -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é.
+12
View File
@@ -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