diff --git a/02_master_prompt/MASTER_PROMPT_DTP_v2.md b/02_master_prompt/MASTER_PROMPT_DTP_v2.md index 8adf822..6ed2256 100644 --- a/02_master_prompt/MASTER_PROMPT_DTP_v2.md +++ b/02_master_prompt/MASTER_PROMPT_DTP_v2.md @@ -25,7 +25,7 @@ Livrer une plateforme intégrée BIM + ERPNext + Console luxury + OTOIA orchestr - **Speckle** : bim-cloud.otov7.com (viewer 3D) - **Design system** : `#0a0a12` dark + `#f0b429` doré · Fraunces + Cormorant Garamond -## Tes 12 agents spécialisés (voir `03_agents/`) +## Tes 13 agents spécialisés (voir `03_agents/`) Chaque agent a son propre `AGENT.md` avec scope + outils + non-négociables. ## Ton livrable final (semaine 8) diff --git a/05_activity_log/2026-08-02.md b/05_activity_log/2026-08-02.md index e96ae2a..036947e 100644 --- a/05_activity_log/2026-08-02.md +++ b/05_activity_log/2026-08-02.md @@ -1284,3 +1284,48 @@ Aucune commande touchant au VPS. **Non fait (hors périmètre #8)** — déploiement serveur réel, runner Gitea, Playwright serveur : VPS `153.75.250.214`, plan ordonné `devops/deploy_runbook`. + +--- + +## Session 20260802_123546 · Dérive « 12 agents » sur les docs de mandat de tête (hors README) + +**Contexte** — Reprise en **Sprint 8 · buffer**. Relu CLAUDE.md, roadmap (0 item +ouvert), MEMORY.md, journal du jour. Re-vérification indépendante multi-angle de la +santé (recompute `python3` sur artefacts commités) : **7 gates → exit 0** · qualité +**22/22 @ 100/100** (verdict PASS · scores tous à 100, pas seulement le seuil) · +régression **22 suites / 564 tests / 0 échec**, **13/13 modules** présents dans la +matrice · recette **15/15 `in_repo`** · constantes canoniques (3 %/8.5 %/52 %) toutes +ancrées · README (13 agents ×2, 22/22, 15 promesses) exact vs artefacts. + +**Blind-spot RÉEL trouvé** (surface distincte de l'audit fiches `03_agents/*` clos au +`2bc3afb`) — audit des **docs de mandat de TÊTE**, non couverts par le gate de claims +(scopé README.md uniquement). `PORTAIL_BANCABLES_4BIG.md` vérifié exact (commande + +sorties `50_financier_bancable/{fr,en,es}.md` concordent avec `bancable_gen.py`). Mais +**deux docs affichaient encore « 12 agents »** : +- `AGENTS_EXISTING_ASSETS.md:1` (titre) · `02_master_prompt/MASTER_PROMPT_DTP_v2.md:28`. + +Réalité re-dérivée : **13 agents** — 13 répertoires `03_agents/`, README canonique +« 13 agents » (×2, déjà gaté), le 13e (**publiciste**) **LIVRÉ+GATÉ** (fiche + +générateur `05_deliverables_mvp/publiciste/` **100/100** + suite de régression +`publiciste`). Les « 12 » précédaient l'ajout du publiciste → dérive doc-vs-réalité. + +**Réalisé** +- **Correction du compte** 12 → 13 dans les deux docs (fait objectif, `03_agents/` + = source unique · #6 anti-invention). +- **Clarification publiciste** (`AGENTS_EXISTING_ASSETS.md` §13) : marqueur « (à créer) » + levé, **note « Statut mandat : LIVRÉ »** pointant fiche + générateur gaté, tout en + **préservant** la liste « À développer » comme **runtime VPS** hors périmètre worker + (#8) — respecte la convention « VPS-runtime `à créer` ≠ dérive » (memory + `fiche-accuracy-audit-closed`). Deux liens Markdown ajoutés → résolus (`check_docs`). +- **Extension du gate** `check_readme_claims.sh` (surface prouvée NON couverte par + mutation-test) : nouvelle boucle qui **réutilise le `n_agents` déjà dérivé** de + `git ls-files 03_agents/*/AGENT.md` (pas de nouvelle machinerie · #5 pas de doublon) + et exige que les DEUX docs de tête citent exactement ce compte. Classe + `doc-numeric-claims-gate`. + +**Vérifications** — nouveau check **mutation-testé** (12 réinjecté → gate ROUGE +« dit 12 MAIS 03_agents/ en compte 13 », restauré → exit 0). **7 gates re-joués → +exit 0**. Aucune commande touchant au VPS. + +**Non fait (hors périmètre #8)** — runtime VPS publiciste (`publiciste.py`, systemd/ +inotify, WhatsApp), déploiement serveur : hors périmètre worker. diff --git a/AGENTS_EXISTING_ASSETS.md b/AGENTS_EXISTING_ASSETS.md index 45f28de..430ce54 100644 --- a/AGENTS_EXISTING_ASSETS.md +++ b/AGENTS_EXISTING_ASSETS.md @@ -1,4 +1,4 @@ -# Actifs existants OTOV7 · Mapping vers les 12 agents DTP +# Actifs existants OTOV7 · Mapping vers les 13 agents DTP ## Principe : NE PAS REPARTIR DE ZÉRO Chaque agent hérite/réutilise les modules déjà présents avant de créer du nouveau code. @@ -112,9 +112,16 @@ Chaque agent hérite/réutilise les modules déjà présents avant de créer du 4. **Capabilities OTOIA** = fondation → chaque agent DTP branche dessus 5. **Éliminer le vieux** : si un module est obsolète, l'archiver dans `_ARCHIVES/`, ne pas laisser deux versions -## 13. Publiciste Agent — NOUVEAU (à créer) +## 13. Publiciste Agent — NOUVEAU **Rôle** : Maintient automatiquement le site public `vente.otov7.com` à partir des faisabilités. +> **Statut mandat** : la fiche + le générateur déterministe côté dépôt sont **LIVRÉS** +> ([`03_agents/publiciste/AGENT.md`](03_agents/publiciste/AGENT.md) · +> [`05_deliverables_mvp/publiciste/`](05_deliverables_mvp/publiciste/README.md), gated +> 100/100 · suite de régression `publiciste`). La liste **« À développer »** ci-dessous +> recense le **runtime VPS** (orchestrateur `publiciste.py`, triggers systemd/inotify, +> notifications WhatsApp) qui reste hors périmètre worker (`CLAUDE.md` #8). + **Ressources existantes à réutiliser** : - `/opt/oto/config/projets_config.json` (déjà en place) - `/opt/oto/config/projets_editor.py` (API GET/POST déjà en place) diff --git a/ci/check_readme_claims.sh b/ci/check_readme_claims.sh index e7cf204..41d717d 100755 --- a/ci/check_readme_claims.sh +++ b/ci/check_readme_claims.sh @@ -216,6 +216,35 @@ if re.search(r"verdict `true`", norm): else: bad("Recette · verdict `true` non cité dans README (attendu)") +# ============================================================================ +# Comptes d'agents dans les docs de mandat de tête (hors README) · même classe. +# ---------------------------------------------------------------------------- +# Le README est déjà gaté (« 13 agents » ×2 ci-dessus, recompté depuis +# 03_agents/*/AGENT.md). Or DEUX autres docs de tête retranscrivent ce même +# compte en dur et se périmaient en silence : ils affichaient « 12 agents » alors +# que le 13e (publiciste) était livré+gaté (fiche + générateur 100/100 + suite de +# régression). Aucun gate ne les comparait à la réalité du disque. On réutilise +# le `n_agents` DÉJÀ dérivé de `git ls-files 03_agents/*/AGENT.md` (source unique, +# pas de nouvelle machinerie) et on exige que chaque doc cite exactement ce compte. +# ============================================================================ +for path, pat, label in [ + ("AGENTS_EXISTING_ASSETS.md", + r"Mapping vers les (\d+) agents DTP", "Actifs existants · titre"), + ("02_master_prompt/MASTER_PROMPT_DTP_v2.md", + r"Tes (\d+) agents spécialisés", "Master prompt · titre"), +]: + try: + doc = re.sub(r"\s+", " ", open(path, encoding="utf-8").read()) + except OSError as e: + bad(f"{label} — {path} illisible : {e}"); continue + m = re.search(pat, doc) + if m is None: + bad(f"{label} — compte d'agents INTROUVABLE dans {path} (attendu {n_agents}) · motif=/{pat}/") + elif m.group(1) == str(n_agents): + good(f"{label} — {path} cite {m.group(1)} == 03_agents/ ({n_agents})") + else: + bad(f"{label} — {path} dit {m.group(1)} MAIS 03_agents/ en compte {n_agents} → corriger le doc") + # ============================================================================ # Fiche QA (03_agents/qa/AGENT.md) · même classe de « vert trompeur » — # ----------------------------------------------------------------------------