[DTP-Worker 20260803_083713] Sprint 8 QA · fix · gate constraints-guard RED réparé (doc REFERENCE OTO_DESIGN_SYSTEM_v1 §15 = mention VPS, pas usage)

Régression neuve depuis commit 9c062ef : OTO_DESIGN_SYSTEM_v1.md §15
« Fichiers canoniques sur VPS » liste /var/www/html/static/ en inventaire
descriptif (chemin servi = symlink de /opt/oto/sites/static). Faux-positif de
la classe que le garde ignore (USAGE, pas mention) ; doc root-owned non éditable
+ non créé par le worker → fix au niveau du garde (précédent session 010630).

- ci/guard_constraints.sh : OTO_DESIGN_SYSTEM_*.md (glob) ajouté aux exclusions
  tracked_files(), même catégorie qu'AUTORISATIONS_*/DIRECTIVE_* ; en-tête documenté.
- ci/README.md : §exclusions + NB inconsistance chemin-servi-vs-source mis à jour.
- Mutation-test : garde mord toujours les 3 usages code réels (static VPS/GitHub/Stripe).
- Inconsistance chemin servi (/var/www/html/static) vs source (/opt/oto/sites/static)
  du §15 re-signalée à Michel (non tranchée par le garde).

run_ci.sh : 30 PASS · 0 FAIL · 0 SKIP (rétabli). Zéro nouveau module, zéro gate ajouté (#5).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-08-03 08:42:59 +00:00
parent 9c062ef83d
commit 12cfaaa2ed
3 changed files with 69 additions and 4 deletions
+48
View File
@@ -1,5 +1,53 @@
# Activity Log · 2026-08-03 · Claude Code DTP Worker # Activity Log · 2026-08-03 · Claude Code DTP Worker
## Session 083713 · Gate `constraints-guard` RED réparé — nouveau doc REFERENCE `OTO_DESIGN_SYSTEM_v1.md` (mention VPS, pas usage) + inconsistance chemin re-signalée à Michel
**Contexte.** `./run_ci.sh` au démarrage : **29 PASS · 1 FAIL** — régression NEUVE
(`constraints-guard`) apparue avec le commit `9c062ef` (« REFERENCE · OTO Design System
v1 »), qui a ajouté `OTO_DESIGN_SYSTEM_v1.md` à la racine. Toutes les autres dimensions
vertes ; arbre propre.
**Cause racine (faux-positif · classe identique à la session 010630).** Le §15 du doc
« **Fichiers canoniques sur VPS** » liste, en **inventaire** descriptif, deux emplacements
`/var/www/html/static/` <!-- ci-allow : citation de la cause, jamais un usage --> (assets concierge + scripts UI canoniques). Le garde (dont
l'en-tête déclare « détecte l'**USAGE**… PAS sa simple **mention** ») a mordu ces deux
lignes — mais ce sont des **mentions** d'emplacements *servis* par nginx
(`/var/www/html/static` = **SYMLINK** de `/opt/oto/sites/static`, cf. CLAUDE.md §VPS), pas
une **écriture exécutable**. L'usage réel vivrait dans un `.sh`/`.py`/`.yml` — toujours
scannés.
**Pourquoi PAS d'édition du doc fautif.** (1) Root-owned `root:root 644`**non éditable**
par `otoclaude` (`-w` négatif) → l'escape `ci-allow` par ligne est **inapplicable**.
(2) Document **ajouté par un commit REFERENCE que je n'ai pas créé** → principe « surface,
don't overwrite ». Exactement la situation de la session 010630 (fichiers root-owned de
Michel).
**Correctif — au niveau du garde que je possède (`ci/`), 2+ solutions pesées.**
- *Option retenue* : ajout de `OTO_DESIGN_SYSTEM_*.md` (glob → survit à un futur `_v2`) aux
exclusions de `tracked_files()`, **même catégorie** que `AUTORISATIONS_*.md`/`DIRECTIVE_*.md`
(docs racine énumérant *nécessairement* des chemins VPS en tant que mention). En-tête du
garde + `ci/README.md` §exclusions mis en cohérence (raison + inventaire-vs-usage documentés).
- *Option écartée* : demander à Michel de rendre le doc éditable pour y poser des `ci-allow`
— plus lourd, casse à chaque re-push du doc ; le fix dans MON `ci/` est durable.
**Détection vraie-positive PRÉSERVÉE (mutation-test, [[guard-constraints-flags-usage-not-mention]]).**
Un `.sh` temporaire commité avec les 3 usages littéraux (écriture chemin statique VPS, URL
GitHub, appel Stripe) → le garde **mord les 3** (✗). Seule la prose de référence/gouvernance
`.md` est exclue ; `CLAUDE.md` (constitution) **reste scanné**. Aucun trou vers un usage
forbidden dans du code.
**⚠️ INCONSISTANCE RE-SIGNALÉE À MICHEL (non tranchée par le garde).** Le §15 liste le chemin
**servi** `/var/www/html/static/` <!-- ci-allow : citation de l'inconsistance signalée --> alors que le mandat (CLAUDE.md · Interdits absolus + §VPS)
préfère la **source** `/opt/oto/sites/static/` (le premier étant le symlink du second). Même
inconsistance chemin-servi-vs-source que la l.35 d'`AUTORISATIONS_*.md` déjà signalée le
010630. Documentée ici + `ci/README.md`, **pas masquée, pas tranchée** (décision archi → Michel).
**Vérifications.** `./run_ci.sh`**30 PASS · 0 FAIL · 0 SKIP** (rétabli). Mes propres
mentions du chemin dans `ci/README.md` (description de l'exclusion) marquées `ci-allow`
(motif l.100 préexistant). **Zéro nouveau module · zéro gate ajouté (#5)** — le garde n'est
pas affaibli (mutation 3/3 RED sur usage code), corrigé d'un faux-positif conforme à sa
propre philosophie. Aucune commande touchant au VPS (#8) · aucun `git clean` <!-- ci-allow : mention de l'interdit absolu, jamais exécuté -->.
## Session 063711 · Sprint 5/8 · Canal 2 `daily_reports/` remis à jour (3 sessions manquantes depuis 040643) ## Session 063711 · Sprint 5/8 · Canal 2 `daily_reports/` remis à jour (3 sessions manquantes depuis 040643)
**Contexte + choix de tâche.** `./run_ci.sh` au démarrage : **30 PASS · 0 FAIL · 0 SKIP**, **Contexte + choix de tâche.** `./run_ci.sh` au démarrage : **30 PASS · 0 FAIL · 0 SKIP**,
+9 -3
View File
@@ -92,15 +92,21 @@ Escape hatch documenté : ajouter `ci-allow` sur une ligne pour l'exclure.
**Exclusions de fichiers** (`tracked_files()`) — documents qui contiennent **Exclusions de fichiers** (`tracked_files()`) — documents qui contiennent
*nécessairement* les termes interdits en tant que **texte de politique** (mention), *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 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** CI (ils le référencent), les **mandats signés de Michel à la racine**
(`AUTORISATIONS_*.md`, `DIRECTIVE_*.md`) — prose de gouvernance listant règles ET (`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` autorisations —, et le **design system de référence** (`OTO_DESIGN_SYSTEM_*.md`,
root-owned, ajouté par commit `REFERENCE`) dont le §15 « Fichiers canoniques sur VPS »
est un **inventaire** d'emplacements servis (`/var/www/html/static/`, symlink de <!-- ci-allow : description de l'exclusion, jamais un usage -->
`/opt/oto/sites/static/`) — mention descriptive, pas une écriture. 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 (**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 à 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/` » <!-- ci-allow : citation du mandat --> de prohibition. NB · `AUTORISATIONS_*.md` l.35 « Écriture dans `/var/www/html/static/` » <!-- ci-allow : citation du mandat -->
**contredit** l'interdit absolu de CLAUDE.md (le chemin correct est le SYMLINK source **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 `/opt/oto/sites/static/`) — contradiction inter-mandats **signalée à Michel** (à trancher
par lui, pas masquée par le garde). par lui, pas masquée par le garde). Même inconsistance chemin-**servi**-vs-**source** dans
`OTO_DESIGN_SYSTEM_v1.md` §15 (liste `/var/www/html/static/` au lieu de la source <!-- ci-allow : citation de l'inconsistance signalée, jamais un usage -->
`/opt/oto/sites/static/`) — **re-signalée à Michel**, non tranchée par le garde.
**Non-dérive documentée — `michel/otov7-platform` (CLAUDE.md #2) N'EST PAS une coquille **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 de `michel/oto-enterprise-os-dtp`, à ne PAS « corriger ».** Un audit doc-vs-réalité relève
+12 -1
View File
@@ -46,12 +46,23 @@ ok() { printf ' \033[32m✓\033[0m %s\n' "$1"; }
# CONTREDIT l'interdit absolu de CLAUDE.md (le chemin correct est le SYMLINK # CONTREDIT l'interdit absolu de CLAUDE.md (le chemin correct est le SYMLINK
# source /opt/oto/sites/static/). Contradiction inter-mandats signalée à # source /opt/oto/sites/static/). Contradiction inter-mandats signalée à
# Michel (activity log 2026-08-03) — à trancher par lui, pas par le garde. # Michel (activity log 2026-08-03) — à trancher par lui, pas par le garde.
# - le DESIGN SYSTEM de référence à la racine (OTO_DESIGN_SYSTEM_*.md) :
# document root-owned, ajouté par un commit REFERENCE (non créé par un agent
# worker, non éditable → escape ci-allow par ligne inapplicable). Son §15
# « Fichiers canoniques sur VPS » est un INVENTAIRE des emplacements servis
# (nginx sert /var/www/html/static, SYMLINK de /opt/oto/sites/static) — une
# mention descriptive, pas une écriture exécutable. Même raison que ci-dessus :
# l'usage réel vivrait dans du code (.sh/.py/.yml, toujours scanné). NB · ce
# §15 liste le chemin SERVI /var/www/html/static/ alors que le mandat préfère
# la SOURCE /opt/oto/sites/static/ — même inconsistance chemin-servi-vs-source
# que la l.35 d'AUTORISATIONS, re-signalée à Michel (activity log 2026-08-03).
tracked_files() { tracked_files() {
git ls-files -- . \ git ls-files -- . \
':(exclude)ci/guard_constraints.sh' \ ':(exclude)ci/guard_constraints.sh' \
':(exclude).gitea/workflows/*.yml' \ ':(exclude).gitea/workflows/*.yml' \
':(exclude)AUTORISATIONS_*.md' \ ':(exclude)AUTORISATIONS_*.md' \
':(exclude)DIRECTIVE_*.md' ':(exclude)DIRECTIVE_*.md' \
':(exclude)OTO_DESIGN_SYSTEM_*.md'
} }
# scan_forbidden <label> <regex-terme> # scan_forbidden <label> <regex-terme>