diff --git a/05_activity_log/2026-08-03.md b/05_activity_log/2026-08-03.md index 891ea9d..1ea994d 100644 --- a/05_activity_log/2026-08-03.md +++ b/05_activity_log/2026-08-03.md @@ -1,5 +1,59 @@ # Activity Log · 2026-08-03 · Claude Code DTP Worker +## Session 010630 · Gate `constraints-guard` RED réparé (mandat signé Michel l.35) + contradiction inter-mandats signalée + +**Contexte.** `./run_ci.sh` au démarrage : **29 PASS · 1 FAIL** — régression NEUVE du +gate depuis les commits de Michel de ce soir (`7e4456e`, `94ae143`, `9067313` ont +introduit 4 fichiers root-owned à la racine). Job en échec : `constraints-guard`. + +**Cause racine.** `AUTORISATIONS_MICHEL_20260803.md:35` +« - Écriture dans `/var/www/html/static/` (assets publics) » — une **autorisation +positive** (parmi 40 permissions filesystem) qui matche le terme interdit +`/var/www/html/static/` **sans** marqueur de prohibition (contrairement à la l.96 +`❌ git clean` qui passe) ni `ci-allow`. Les 3 autres fichiers (`DIRECTIVE_*`) sont +propres. C'est **exactement la classe de faux-positif** que le garde prétend ignorer +(en-tête : « détecte l'USAGE… PAS sa simple mention ») — une mention en prose de +gouvernance, pas un usage dans du code exécutable. + +**Pourquoi PAS d'édition du fichier fautif.** (1) Root-owned `root:root 644` — **non +éditable** par `otoclaude` (test `-w` négatif). (2) C'est un **document signé par +Michel que je n'ai pas créé** → principe « surface, don't overwrite ». La convention +`ci-allow` par ligne était donc inapplicable. + +**Correctif — au niveau du garde (que je possède, `ci/`).** Ajout de +`AUTORISATIONS_*.md` et `DIRECTIVE_*.md` aux exclusions de `tracked_files()`, **même +catégorie** que les exclusions préexistantes (`ci/guard_constraints.sh` lui-même, +`.gitea/workflows/*.yml`) : documents contenant *nécessairement* les termes interdits +en tant que **texte de politique**. Robustesse durable : survit à un re-push du doc par +Michel (le fix vit dans MON `ci/`, pas dans le doc root). + +**Détection vraie-positive PRÉSERVÉE (mutation-test).** Un `.sh` temporaire commité +avec les trois usages interdits littéraux (écriture chemin statique VPS, purge git, +URL GitHub) → le garde **mord les 3** (✗). L'usage réel vit dans `.sh`/`.py`/`.yml` (toujours scannés) ; seule +la prose de mandat est exclue. `CLAUDE.md` **reste scanné** (constitution ; sa prose +d'interdits passe via marqueurs). Aucun trou vers un usage forbidden dans du code. + +**⚠️ CONTRADICTION INTER-MANDATS SIGNALÉE À MICHEL (à trancher par lui).** +`AUTORISATIONS l.35` autorise « Écriture dans `/var/www/html/static/` » alors que +**CLAUDE.md · Interdits absolus** l'interdit explicitement : « ❌ Écrire directement +dans `/var/www/html/static/` (use `/opt/oto/sites/static/`) » — car `/var/www/html/static` +est un **SYMLINK** dont la source à écrire est `/opt/oto/sites/static/` (cf. section VPS +de CLAUDE.md). La l.35 est donc vraisemblablement une **imprécision de rédaction** : +Michel veut autoriser le déploiement d'assets publics, qui passe correctement par +`/opt/oto/sites/static/`. **Recommandation** : corriger la l.35 en +`/opt/oto/sites/static/ (assets publics · source du symlink)`. Je ne masque pas ce +signal (documenté ici + `ci/README.md`) ; je ne le tranche pas non plus (décision +architecture → Michel). + +**Vérifications.** `./run_ci.sh` → **30 PASS · 0 FAIL · 0 SKIP** (rétabli). +`ci/README.md` §guard mis en cohérence (exclusions documentées + contradiction notée). +**Zéro nouveau module · zéro gate ajouté (#5)** — le garde n'est pas affaibli (mutation +7/7 RED sur usage code), il est corrigé d'un faux-positif conforme à sa propre +philosophie. Aucune commande touchant au VPS (#8) · aucun +`git clean` . + + + ## Session 000623 · Audit 2 surfaces d'intégrité inter-artefacts neuves + ouverture canal 2 du jour **Contexte.** `./run_ci.sh` au démarrage : **30 PASS · 0 FAIL · 0 SKIP** — gate vert, diff --git a/ci/README.md b/ci/README.md index c8a6015..86639ae 100644 --- a/ci/README.md +++ b/ci/README.md @@ -74,6 +74,19 @@ Détecte l'**usage** (pas la simple mention) de : (`jamais`, `❌`, `only`, `pas de`, `interdit`…) est un rappel de règle → ignorée. Escape hatch documenté : ajouter `ci-allow` sur une ligne pour l'exclure. +**Exclusions de fichiers** (`tracked_files()`) — documents qui contiennent +*nécessairement* les termes interdits en tant que **texte de politique** (mention), +jamais en usage exécutable : le garde lui-même (il énumère les termes), les workflows +CI (ils le référencent), et les **mandats signés de Michel à la racine** +(`AUTORISATIONS_*.md`, `DIRECTIVE_*.md`) — prose de gouvernance listant règles ET +autorisations. L'usage *réel* d'un terme interdit vivrait dans un `.sh`/`.py`/`.yml` +(**toujours scannés**), donc aucune détection vraie-positive n'est perdue (mutation-test +à l'appui). **`CLAUDE.md` reste scanné** : sa prose d'interdits passe via les marqueurs +de prohibition. NB · `AUTORISATIONS_*.md` l.35 « Écriture dans `/var/www/html/static/` » +**contredit** l'interdit absolu de CLAUDE.md (le chemin correct est le SYMLINK source +`/opt/oto/sites/static/`) — contradiction inter-mandats **signalée à Michel** (à trancher +par lui, pas masquée par le garde). + **Non-dérive documentée — `michel/otov7-platform` (CLAUDE.md #2) N'EST PAS une coquille de `michel/oto-enterprise-os-dtp`, à ne PAS « corriger ».** Un audit doc-vs-réalité relève périodiquement que la contrainte #2 nomme `michel/otov7-platform` (port 3015) tandis que la diff --git a/ci/guard_constraints.sh b/ci/guard_constraints.sh index 30033f3..d18de13 100755 --- a/ci/guard_constraints.sh +++ b/ci/guard_constraints.sh @@ -31,11 +31,27 @@ FAIL=0 report() { printf ' \033[31m✗\033[0m %s\n' "$1"; FAIL=1; } ok() { printf ' \033[32m✓\033[0m %s\n' "$1"; } -# Fichiers suivis (exclut ce script lui-même : il liste les termes interdits). +# Fichiers suivis. Exclusions = documents qui contiennent NÉCESSAIREMENT les +# termes interdits en tant que TEXTE DE POLITIQUE (mention), jamais en usage : +# - ce script lui-même : il énumère tous les termes interdits ; +# - les workflows CI : ils référencent le garde ; +# - les MANDATS SIGNÉS de Michel à la racine (AUTORISATIONS_*.md, +# DIRECTIVE_*.md) : prose de gouvernance énumérant règles ET autorisations +# (ex. « Écriture dans /var/www/html/static/ » parmi 40 permissions FS). +# Ce sont des mentions dans la loi, pas un usage introduit par un agent ; +# l'usage réel vivrait dans un .sh/.py/.yml — TOUJOURS scannés — donc aucune +# détection vraie-positive n'est perdue. CLAUDE.md (la constitution) RESTE +# scanné : sa prose d'interdits passe via les marqueurs de prohibition. +# NB · AUTORISATIONS_*.md l.35 « Écriture dans /var/www/html/static/ » +# CONTREDIT l'interdit absolu de CLAUDE.md (le chemin correct est le SYMLINK +# source /opt/oto/sites/static/). Contradiction inter-mandats signalée à +# Michel (activity log 2026-08-03) — à trancher par lui, pas par le garde. tracked_files() { git ls-files -- . \ ':(exclude)ci/guard_constraints.sh' \ - ':(exclude).gitea/workflows/*.yml' + ':(exclude).gitea/workflows/*.yml' \ + ':(exclude)AUTORISATIONS_*.md' \ + ':(exclude)DIRECTIVE_*.md' } # scan_forbidden