Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 427dd77bd2 | |||
| 256d967882 |
@@ -1,5 +1,59 @@
|
|||||||
# Activity Log · 2026-08-03 · Claude Code DTP Worker
|
# 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) » <!-- ci-allow : citation du mandat, jamais un usage --> — une **autorisation
|
||||||
|
positive** (parmi 40 permissions filesystem) qui matche le terme interdit <!-- ci-allow -->
|
||||||
|
`/var/www/html/static/` **sans** marqueur de prohibition <!-- ci-allow --> (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/` » <!-- ci-allow : citation, contradiction signalée --> alors que
|
||||||
|
**CLAUDE.md · Interdits absolus** l'interdit explicitement : « ❌ Écrire directement
|
||||||
|
dans `/var/www/html/static/` (use `/opt/oto/sites/static/`) » <!-- ci-allow : citation de l'interdit CLAUDE.md --> — 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` <!-- ci-allow : mention de l'interdit absolu, jamais exécuté -->.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Session 000623 · Audit 2 surfaces d'intégrité inter-artefacts neuves + ouverture canal 2 du jour
|
## 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,
|
**Contexte.** `./run_ci.sh` au démarrage : **30 PASS · 0 FAIL · 0 SKIP** — gate vert,
|
||||||
|
|||||||
@@ -0,0 +1,88 @@
|
|||||||
|
# 📸 DIRECTIVE COMPLÉMENTAIRE · Rendus existants aux archives · 2026-08-03
|
||||||
|
|
||||||
|
## Confirmation Michel · 2026-08-03
|
||||||
|
|
||||||
|
« Il y a beaucoup de rendus aux archives avec le site internet et les pages projet »
|
||||||
|
→ **Utiliser en priorité les rendus existants avant de regénérer via Flux**.
|
||||||
|
|
||||||
|
## Inventaire des rendus (fait 2026-08-03)
|
||||||
|
|
||||||
|
### Rendus utilisés par le site public (canonical)
|
||||||
|
Répertoire · `/var/www/html/static/projets/`
|
||||||
|
- **P01 Coralis** · 7 assets
|
||||||
|
- **P02 Coral del Sur** · 10 assets
|
||||||
|
- **P03 Nakua** · 27 assets · sous-dossier `p03_real/` avec facades HD, aerial complexe, chambres, salons, studios · WebP + JPG + PNG haute qualité
|
||||||
|
- **P05 Las Colinas** · 24 assets
|
||||||
|
- **P07 Aqua Terra** · 15 assets
|
||||||
|
- **P08 Fasano Espirilla** · 5 assets
|
||||||
|
- **P09 Résidence Gazcue** · 5 assets
|
||||||
|
|
||||||
|
### Contact sheets par projet
|
||||||
|
- `/var/www/html/static/projets/contact_sheets/`
|
||||||
|
- P02, P03, P05, P07, P08, P09 · fichiers *_sheet.png (planches contact synthétiques)
|
||||||
|
- `nakua_brochure_hd.png` (brochure haute résolution P03)
|
||||||
|
|
||||||
|
### AI renders originaux (data_room)
|
||||||
|
`/opt/oto/data_room/{PXX}/60_photos_site/ai_renders/`
|
||||||
|
- **P01** · 1 render
|
||||||
|
- **P02** · 1 render + variante `ai_renders_v_reels`
|
||||||
|
- **P03** · 2 renders (compléments du sous-dossier p03_real du site)
|
||||||
|
- **P05** · 9 renders + `ai_renders_v3_validated` (série validée qualité)
|
||||||
|
- **P07** · 20 renders
|
||||||
|
- **P08** · 12 renders + variante `renders` sans préfixe ai
|
||||||
|
- **P09** · 32 renders
|
||||||
|
|
||||||
|
### Rendus totaux par projet (data_room)
|
||||||
|
- P01 · 13 · P02 · 42 · P03 · 24 · P05 · 18 · P07 · 22 · P08 · 14 · P09 · 31
|
||||||
|
|
||||||
|
### Répertoires renders supplémentaires
|
||||||
|
- `/opt/oto/static/renders` (canonical rendus)
|
||||||
|
- `/opt/oto/otoia_aec/storage/renders` (renders généré par OTOIA AEC)
|
||||||
|
- `/opt/oto/portal/img/{PXX}/renders` (renders utilisés par portail)
|
||||||
|
- `/opt/oto/sites/static/renders` (rendu servis nginx)
|
||||||
|
|
||||||
|
### Note historique
|
||||||
|
`/opt/oto/data_room/_ARCHIVE_MAUVAIS_RENDUS_2026-07-27/` · renders rejetés (ne pas utiliser)
|
||||||
|
|
||||||
|
## Action pour agents Claude Code DTP
|
||||||
|
|
||||||
|
### Priorité INVERSÉE de la directive précédente
|
||||||
|
|
||||||
|
Au lieu de générer 200 nouveaux renders via Flux, **cataloger les rendus existants et les ré-utiliser** ·
|
||||||
|
|
||||||
|
**P0 · Catalogage rendus existants par typologie**
|
||||||
|
1. Pour chaque projet actif (P01, P02, P03, P05, P07), scanner `/var/www/html/static/projets/{pxx*}/` et `data_room/{PXX}/60_photos_site/`
|
||||||
|
2. Classer chaque image par typologie (extérieur, salon, cuisine, chambre, sdb, terrasse, vue aérienne, piscine, gym, hall)
|
||||||
|
3. Créer un fichier de mapping `/opt/oto/data/renders_catalog.json` structure ·
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"P03": {
|
||||||
|
"exterior": ["/static/projets/p03_real/nakua_hd_facade_jour.jpg", "..."],
|
||||||
|
"aerial": ["nakua_hd_aerial_complexe.jpg"],
|
||||||
|
"studio": ["nakua_int_studio_piscine_privee_hd.png"],
|
||||||
|
"salon": ["nakua_int_salon_piscine_nocturne_hd.png"],
|
||||||
|
"chambre": ["nakua_hd_chambre_vue_piscine.jpg"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**P1 · Brancher catalog dans viewer 3D**
|
||||||
|
1. Le viewer `/choisir-mon-unite-3d/` charge `renders_catalog.json`
|
||||||
|
2. Au clic sur une unité · afficher les rendus de la typologie correspondante
|
||||||
|
3. Slider / galerie premium (Swiper.js ou équivalent light)
|
||||||
|
4. Support HDR/WebP pour perf
|
||||||
|
|
||||||
|
**P2 · Compléter uniquement les manques**
|
||||||
|
1. Analyser gaps · quels typologies × projets n'ont AUCUN render existant
|
||||||
|
2. Générer uniquement ces gaps via Flux (économie 80% budget GPU vs regénération totale)
|
||||||
|
3. Priorité gaps sur projets EN VENTE (P01, P02, P03)
|
||||||
|
|
||||||
|
**P3 · Panoramas 360°**
|
||||||
|
- Vérifier si existent dans data_room ou marketing
|
||||||
|
- Sinon générer via Blender + Bonsai depuis IFC existants (audit préalable)
|
||||||
|
|
||||||
|
## Résultat attendu
|
||||||
|
|
||||||
|
Phase 2 (rendus) livrée en **48h au lieu de 2 semaines** grâce à la ré-utilisation des rendus existants.
|
||||||
|
|
||||||
|
Zéro appel Flux GPU inutile · préservation budget · rendus déjà validés visuellement par Michel (les mauvais ont été archivés le 2026-07-27).
|
||||||
@@ -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.
|
(`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.
|
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/` » <!-- ci-allow : citation du mandat -->
|
||||||
|
**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
|
**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
|
||||||
périodiquement que la contrainte #2 nomme `michel/otov7-platform` (port 3015) tandis que la
|
périodiquement que la contrainte #2 nomme `michel/otov7-platform` (port 3015) tandis que la
|
||||||
|
|||||||
+18
-2
@@ -31,11 +31,27 @@ FAIL=0
|
|||||||
report() { printf ' \033[31m✗\033[0m %s\n' "$1"; FAIL=1; }
|
report() { printf ' \033[31m✗\033[0m %s\n' "$1"; FAIL=1; }
|
||||||
ok() { printf ' \033[32m✓\033[0m %s\n' "$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() {
|
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)DIRECTIVE_*.md'
|
||||||
}
|
}
|
||||||
|
|
||||||
# scan_forbidden <label> <regex-terme>
|
# scan_forbidden <label> <regex-terme>
|
||||||
|
|||||||
Reference in New Issue
Block a user