[DTP-Worker] Sprint 8 · buffer · Chat OTOIA : IDENTITÉ persona (Amélie/voix multilingual_v2) + 4 CAPABILITIES OTOIA (aec.py+knowledge.py+prompt_engine.py+chat.py) du montage Chat par portail frontend/chat_otoia ANCRÉE sur CLAUDE.md §Architecture cible
Les artefacts `out/chat_mount.json` (5 configs runtime, une par portail) + `out/MANIFEST.json` portent la persona + les capabilities, BYTE-GATÉS pour la REPRODUCTIBILITÉ par check_artifacts (reconstruction depuis `chat_spec.json`) mais JAMAIS ANCRÉS à CLAUDE.md §Architecture cible (l.30 « Voix Amélie QC (multilingual_v2) » · l.28 « OTOIA capabilities : aec.py + knowledge.py + prompt_engine.py + chat.py »), leur source faisant autorité. Le bloc chat_otoia amont ne gate que la COMPOSITION (portails métier · 1 block⇔1 mount) ; le SEUL contrôle d'identité vit dans tests/ (`test_persona_amelie_sourcee`/`test_capabilities_sourcees_sans_ajout`) mais son ORACLE est HARDCODÉ (`"Amélie"`, `["aec.py",…]`) — une copie de plus, jamais comparée à CLAUDE.md. Piège #6 : renommer la persona (`Amélie`→`Sophie`), changer la voix, ou renommer/RETIRER une capability dans `chat_spec.json` (ou dans CLAUDE.md) reconstruit l'artefact fidèlement (byte-gate VERTE) sans toucher l'oracle (tests VERTS) → le chat monté dans CHAQUE portail annoncerait une persona/voix/capabilities CONTREDISANT le mandat — « vert trompeur » de la classe des tokens branding ancrés sur #4 et de la marque SEO §Entités. Aucune suite tests/ (FONCTIONS de génération, jamais l'ancre à CLAUDE.md) ne l'attrape. Gate ajouté (bloc « Chat OTOIA · persona + capabilities ancrées CLAUDE.md ») : persona+capabilities re-dérivées de §Architecture cible (regex `Voix … QC (…)` + `OTOIA capabilities : …` split `+`, NFC), puis (a) `chat_spec.json` persona/capabilities == CLAUDE.md (ordre exact) · (b) le spec DÉCLARE l'ancrage (`persona.source` + chaque `capability.source` citent CLAUDE.md) · (c) CHACUN des 5 mounts + le MANIFEST == CLAUDE.md · (d) README cite l'ancre §Architecture cible + nomme persona + chaque capability (notation compacte matchée par radical) · (e) l'ORACLE du test == CLAUDE.md (set-diff). Un claim absent échoue AUSSI. 8 morsures vérifiées : CLAUDE.md `Amélie→Sophie` (mord SIMULTANÉMENT spec/mount/README/oracle — l'ancre est vive) · CLAUDE.md retire `chat.py` · spec `aec.py→exfil.py` (capability injectée) · spec `persona.source` sans CLAUDE.md · UN SEUL mount à voix altérée (byte-gate aveugle) · README retire le radical `prompt_engine` · oracle du test persona `Amélie→Bob` · oracle du test capabilities réordonné/tronqué ; restauré = green, exit 0. Working tree byte-restauré (`git checkout --`, JAMAIS `git clean`) · 7 gates re-verts · unittest module re-vert. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -735,3 +735,64 @@ gates re-verts**.
|
||||
- **Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo ;
|
||||
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact).
|
||||
- **Auto-score 4Big** : 96/100.
|
||||
|
||||
## Session `20260801_063234` · Buffer S8 · Chat OTOIA/persona+capabilities : l'**IDENTITÉ de la persona** (`Amélie` / voix `multilingual_v2`) et des **4 CAPABILITIES OTOIA** (`aec.py` + `knowledge.py` + `prompt_engine.py` + `chat.py`) du montage Chat par portail `frontend/chat_otoia` — portées par `out/chat_mount.json` (5 configs runtime) + `out/MANIFEST.json`, **byte-gatés pour la reproductibilité** (`check_artifacts` prouve la reconstruction depuis `chat_spec.json`) mais **JAMAIS ANCRÉES à CLAUDE.md §Architecture cible**, leur source faisant autorité (« Voix Amélie QC (multilingual_v2) » l.30 · « OTOIA capabilities : aec.py + knowledge.py + prompt_engine.py + chat.py » l.28).
|
||||
|
||||
**Tâche** : **Sprint 8 · buffer** (DevOps CI/CD · QA). Roadmap fonctionnellement
|
||||
close ; poursuite de la série anti-dérive d'ANCRAGE à CLAUDE.md (classe
|
||||
[[claude-md-constant-anchor-gate]]). **Même patron EXACT** que les tokens branding
|
||||
`publiciste/branding` ancrés sur CLAUDE.md #4, la marque SEO `Organization` ancrée sur
|
||||
§Entités, les paramètres canoniques `faisabilite/generator` ancrés sur #9/#10 —
|
||||
appliqué à une **surface distincte** : la persona + les capabilities émises dans CHAQUE
|
||||
portail rôle, dont la reproductibilité byte était gatée mais pas l'ancrage.
|
||||
|
||||
**Dérive silencieuse fermée** :
|
||||
- `05_deliverables_mvp/frontend/chat_otoia/out/chat_mount.json` — les 5 mounts,
|
||||
chacun `persona: {nom: "Amélie", voix: "multilingual_v2"}` +
|
||||
`capabilities: [aec.py, knowledge.py, prompt_engine.py, chat.py]` ; idem
|
||||
`out/MANIFEST.json` ; l'INPUT `chat_spec.json` (persona + `capabilities[].module`) ;
|
||||
la table README:28-29 (« Persona `Amélie` / `multilingual_v2` » · « Capabilities
|
||||
`aec/knowledge/prompt_engine/chat.py` » toutes deux annotées « `CLAUDE.md
|
||||
§Architecture cible` »).
|
||||
- Source faisant autorité : **CLAUDE.md §Architecture cible** (l.28 capabilities ·
|
||||
l.30 « Voix Amélie QC (multilingual_v2) »).
|
||||
- Piège #6 : le SEUL contrôle d'identité vit dans `tests/`
|
||||
(`test_persona_amelie_sourcee` / `test_capabilities_sourcees_sans_ajout`) mais son
|
||||
**ORACLE est HARDCODÉ** (`self.assertEqual(spec["persona"]["nom"], "Amélie")` ·
|
||||
`caps == ["aec.py", …]`) — une **copie de plus, jamais comparée à CLAUDE.md**.
|
||||
Renommer la persona (`Amélie`→`Sophie`), changer la voix, ou renommer/RETIRER une
|
||||
capability dans `chat_spec.json` (ou dans CLAUDE.md) reconstruit l'artefact
|
||||
fidèlement (byte-gate VERTE) sans toucher l'oracle du test (tests VERTS) → le chat
|
||||
monté dans CHAQUE portail annoncerait une persona/voix/capabilities qui CONTREDIT le
|
||||
mandat — « vert trompeur » qu'aucune suite `tests/` (FONCTIONS de génération, jamais
|
||||
l'ancre à CLAUDE.md) n'attrape.
|
||||
- **État courant** : **aucune valeur périmée** — persona + capabilities recoupent
|
||||
CLAUDE.md exactement (anti-invention #6, rien à réécrire). Le défaut est l'**ancrage
|
||||
ungated**.
|
||||
|
||||
**Gate ajouté** (`ci/check_readme_claims.sh`, nouveau bloc « Chat OTOIA · persona +
|
||||
capabilities ancrées CLAUDE.md » avant `sys.exit`) : persona+capabilities re-dérivées
|
||||
de CLAUDE.md §Architecture cible (regex `Voix … QC (…)` + `OTOIA capabilities : …`
|
||||
split `+`, NFC), puis : **(a)** `chat_spec.json` persona/capabilities == CLAUDE.md
|
||||
(ordre exact) ; **(b)** le spec DÉCLARE l'ancrage (`persona.source` + chaque
|
||||
`capability.source` citent CLAUDE.md) ; **(c)** CHACUN des 5 mounts + le MANIFEST
|
||||
portent persona/capabilities == CLAUDE.md ; **(d)** README cite l'ancre §Architecture
|
||||
cible + nomme persona (`Amélie`+`multilingual_v2`) + chaque capability (notation
|
||||
compacte matchée par radical) ; **(e)** l'ORACLE du test == CLAUDE.md (set-diff). Un
|
||||
claim absent échoue AUSSI (traçabilité #6).
|
||||
|
||||
**8 morsures vérifiées** : CLAUDE.md `Amélie→Sophie` (mord SIMULTANÉMENT
|
||||
spec/mount/README/oracle — 5 fails, l'ancre est vive) · CLAUDE.md retire `chat.py`
|
||||
(3 fails) · spec `aec.py→exfil.py` (**capability injectée**) · spec `persona.source`
|
||||
sans CLAUDE.md · **UN SEUL** mount à voix altérée (byte-gate aveugle) · README retire
|
||||
le radical `prompt_engine` · oracle du test persona `Amélie→Bob` · oracle du test
|
||||
capabilities réordonné/tronqué ; restauré = green : 5 sous-checks (a/b/c/d/e) verts ·
|
||||
exit 0. Working tree byte-restauré (`git checkout --`, **JAMAIS** `git clean`, interdit
|
||||
absolu) · **7 gates re-verts** · unittest module `chat_otoia` re-vert.
|
||||
|
||||
- `ci/README.md` (table récap du pipeline + paragraphe détaillé « Persona &
|
||||
capabilities du Chat OTOIA ancrées sur CLAUDE.md §Architecture cible ») mis à jour.
|
||||
- **Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo ;
|
||||
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact ; l'import réel des
|
||||
`Custom Block` + le câblage de l'endpoint OTOIA restent côté agent ERPNext Backend / VPS).
|
||||
- **Auto-score 4Big** : 96/100.
|
||||
|
||||
Reference in New Issue
Block a user