create-byan-agent 2.60.0 → 2.60.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +10 -0
  3. package/install/bin/byan-communication.cjs +11 -0
  4. package/install/lib/communication-manifest.json +243 -0
  5. package/install/lib/communication-migration.cjs +91 -0
  6. package/install/lib/communication-previous.json +181 -0
  7. package/install/lib/gitignore.js +135 -0
  8. package/install/lib/install-engine.js +17 -1
  9. package/install/lib/ownership.js +24 -5
  10. package/install/package.json +1 -1
  11. package/install/templates/.claude/agents/bmad-byan.md +13 -26
  12. package/install/templates/.claude/agents/bmad-tao.md +47 -0
  13. package/install/templates/.claude/hooks/auto-dispatch-gate.js +81 -0
  14. package/install/templates/.claude/hooks/inject-tao.js +15 -71
  15. package/install/templates/.claude/hooks/inject-voice-anchor.js +21 -154
  16. package/install/templates/.claude/hooks/lib/dispatch-approval.cjs +135 -0
  17. package/install/templates/.claude/hooks/lib/dispatch-plan-format.js +293 -0
  18. package/install/templates/.claude/hooks/lib/plain-language.js +7 -14
  19. package/install/templates/.claude/hooks/lib/rtk-coverage.js +31 -0
  20. package/install/templates/.claude/hooks/lib/tool-log.js +143 -0
  21. package/install/templates/.claude/hooks/lib/voice-conformance.js +9 -32
  22. package/install/templates/.claude/hooks/lib/webfetch-output.js +37 -0
  23. package/install/templates/.claude/hooks/rtk-coverage.js +18 -0
  24. package/install/templates/.claude/hooks/tool-failure-guard.js +16 -9
  25. package/install/templates/.claude/hooks/webfetch-output.js +17 -0
  26. package/install/templates/.claude/rules/native-workflows.md +24 -5
  27. package/install/templates/.claude/rules/plain-language.md +7 -86
  28. package/install/templates/.claude/settings.json +56 -0
  29. package/install/templates/.claude/skills/byan-byan/SKILL.md +42 -83
  30. package/install/templates/.claude/skills/byan-hermes-dispatch/SKILL.md +22 -7
  31. package/install/templates/.claude/workflows/byan-auto-dispatch.js +86 -38
  32. package/install/templates/.codex/skills/byan/SKILL.md +7 -0
  33. package/install/templates/AGENTS.md +106 -0
  34. package/install/templates/_byan/_config/communication-policy.json +50 -0
  35. package/install/templates/_byan/_config/workflow-manifest.csv +2 -0
  36. package/install/templates/_byan/agent/byan/byan-soul.md +14 -2
  37. package/install/templates/_byan/agent/byan/byan-tao.md +35 -274
  38. package/install/templates/_byan/agent/byan/byan.md +6 -2
  39. package/install/templates/_byan/agent/byan/soul.md +419 -0
  40. package/install/templates/_byan/agent/byan/tao.md +60 -0
  41. package/install/templates/_byan/agent/tao/tao.md +26 -27
  42. package/install/templates/_byan/connaissance/mantras-sources.md +295 -0
  43. package/install/templates/_byan/core/activation/soul-activation.md +6 -5
  44. package/install/templates/_byan/core/communication.cjs +76 -0
  45. package/install/templates/_byan/mcp/byan-mcp-server/lib/agent-matcher.js +38 -1
  46. package/install/templates/_byan/mcp/byan-mcp-server/lib/communication.cjs +77 -0
  47. package/install/templates/_byan/mcp/byan-mcp-server/lib/dispatch-router.js +12 -3
  48. package/install/templates/_byan/mcp/byan-mcp-server/lib/dispatch.js +51 -20
  49. package/install/templates/_byan/mcp/byan-mcp-server/lib/fd-ack.js +75 -0
  50. package/install/templates/_byan/mcp/byan-mcp-server/lib/leantime-fd-core.js +12 -1
  51. package/install/templates/_byan/mcp/byan-mcp-server/lib/native-tiers.js +114 -2
  52. package/install/templates/_byan/mcp/byan-mcp-server/lib/routing-ledger.js +356 -0
  53. package/install/templates/_byan/mcp/byan-mcp-server/lib/soul.js +9 -0
  54. package/install/templates/_byan/mcp/byan-mcp-server/server.js +24 -6
  55. package/install/templates/_byan/mcp/byan-mcp-server/skill-bundles-manifest.json +2 -2
  56. package/install/templates/_byan/workflow/simple/byan/data/mantras.yaml +2 -5
  57. package/install/templates/_byan/workflow/simple/byan/templates/tao-template.md +56 -0
  58. package/install/templates/docs/auto-dispatch.md +76 -0
  59. package/install/templates/docs/communication.md +69 -0
  60. package/install/templates/docs/native-workflows-contract.md +33 -11
  61. package/install/templates/docs/tool-output-cost.md +88 -0
  62. package/install/templates/scripts/communication-eval.cjs +192 -0
  63. package/install/templates/scripts/rtk-coverage-report.js +30 -0
  64. package/install/templates/src/byan-v2/data/mantras.json +1058 -0
  65. package/install/templates/tests/communication/README.md +106 -0
  66. package/install/templates/tests/communication/incises.test.cjs +26 -0
  67. package/install/templates/tests/communication/scenarios.json +391 -0
  68. package/package.json +1 -1
  69. package/src/byan-v2/data/mantras.json +26 -6
@@ -0,0 +1,106 @@
1
+ # Recette de communication fr-1
2
+
3
+ `scenarios.json` contient exactement 30 scénarios : quatre pour chacun des cinq profils et dix de robustesse. Toutes les données sont fictives. Leur statut versionné reste `not-run`. Les fichiers temporaires des tests unitaires ne constituent jamais une preuve de génération réelle.
4
+
5
+ Le runner `scripts/communication-eval.cjs` est hors ligne et sans dépendance externe. Il ne lance ni Claude, ni Codex, ni MCP, ni sous-processus. Les quatre commandes prennent un fichier JSON de configuration ; les chemins sont résolus depuis le répertoire courant.
6
+
7
+ ## Préparer deux politiques
8
+
9
+ Créer une configuration contenant les chemins de deux fichiers texte de politique et un répertoire neuf :
10
+
11
+ ```json
12
+ {
13
+ "baseline": "/tmp/communication/politique-actuelle.md",
14
+ "after": "/tmp/communication/politique-proposee.md",
15
+ "out": "/tmp/communication/comparaison"
16
+ }
17
+ ```
18
+
19
+ ```sh
20
+ node scripts/communication-eval.cjs prepare /tmp/communication/prepare.json
21
+ ```
22
+
23
+ Le manifeste embarque le corpus, les politiques et leurs empreintes SHA256. Les répertoires `baseline` et `after` contiennent 30 requêtes préparées chacun avec entrée commune et politique distincte. Aucun résultat n'est généré. Une préparation existante n'est pas écrasée.
24
+
25
+ L'opérateur lance explicitement les essais dans les parcours autorisés. Il charge la politique par le mécanisme de configuration effectivement utilisé par la plateforme. Il conserve une session propre distincte pour chaque variante et les mêmes modèle, effort, outils et versions dans une paire. Les cas de retour au registre et de plusieurs tours doivent être exécutés comme de vraies conversations dans cette session, en conservant leur transcription comme preuve. Les entrées du corpus décrivent ces tours ; le runner ne simule pas une mémoire de conversation.
26
+
27
+ ## Importer un résultat réel
28
+
29
+ Préparer un enregistrement avec le texte exact produit et les empreintes fournies par la requête préparée :
30
+
31
+ ```json
32
+ {
33
+ "scenario_id": "S13",
34
+ "variant": "after",
35
+ "repetition": 1,
36
+ "input_hash": "empreinte de la requete preparee",
37
+ "policy_hash": "empreinte de la politique preparee",
38
+ "output": "texte exact produit",
39
+ "evidence": "/chemin/vers/transcription-ou-reference-execution",
40
+ "metadata": {
41
+ "model": "modele exact observe",
42
+ "effort": "effort effectivement utilise",
43
+ "environment": "environnement identifie",
44
+ "channel": "Codex",
45
+ "tools": "outils et configuration utilises",
46
+ "versions": "versions plateforme et environnement",
47
+ "clean_session": true,
48
+ "session_id": "identifiant propre a cette execution"
49
+ }
50
+ }
51
+ ```
52
+
53
+ La configuration d'import contient `run` (répertoire de comparaison) et `record` (chemin de cet enregistrement).
54
+
55
+ ```sh
56
+ node scripts/communication-eval.cjs import /tmp/communication/import.json
57
+ ```
58
+
59
+ L'import refuse une paire dont modèle, effort, environnement, outils ou versions diffèrent, ainsi que la réutilisation de la même session entre variantes. Le canal définit le parcours comparé. Une répétition utilise un nouvel entier. Les fragments `protected` manquants sont des défaillances critiques objectives. Leur présence ne prouve ni l'exactitude du texte entier ni la conservation sémantique des réserves : cette appréciation reste humaine.
60
+
61
+ Les métadonnées et la référence d'exécution sont déclarées par l'opérateur. Le runner ne certifie pas qu'un modèle a réellement tourné. Une trace d'exécution contrôlable reste nécessaire pour la recette réelle. Ne pas inscrire de documents clients ou de secrets dans les métadonnées ; ce corpus utilise uniquement des fixtures fictives.
62
+
63
+ ## Faire lire les résultats à l'aveugle
64
+
65
+ La configuration `blind` contient `run` et `out`, ce dernier étant un répertoire neuf pour le paquet de lecture.
66
+
67
+ ```sh
68
+ node scripts/communication-eval.cjs blind /tmp/communication/blind.json
69
+ ```
70
+
71
+ Transmettre seulement `review.json` au lecteur francophone. Conserver `mapping.private.json` séparément : il révèle l'association aux versions. L'ordre est mélangé, les identifiants sont aléatoires et le paquet ne contient ni variante de politique ni métadonnées de modèle. Le contenu lui-même peut donner des indices de style ; le dispositif masque les étiquettes, sans garantir que le lecteur ne devine pas la variante.
72
+
73
+ Le lecteur renseigne son identité, `human_french_reader`, chaque score entier de 1 à 5, chaque condition critique par un booléen, `variable_result` et ses remarques. Seul le critère pédagogique peut rester `null` s'il est inapplicable. Un booléen critique à `null` signifie non évalué. Aucune note sémantique n'est calculée automatiquement.
74
+
75
+ ## Produire le rapport
76
+
77
+ ```json
78
+ {
79
+ "run": "/tmp/communication/comparaison",
80
+ "review": "/tmp/communication/lecture/review.json",
81
+ "mapping": "/tmp/communication/lecture/mapping.private.json",
82
+ "channels": ["Claude Code", "Codex", "MCP"]
83
+ }
84
+ ```
85
+
86
+ ```sh
87
+ node scripts/communication-eval.cjs report /tmp/communication/report.json
88
+ ```
89
+
90
+ Déclarer tous les parcours livrés et requis. Sans résultat ou lecture humaine, le rapport reste `incomplete`. Les cas variables demandent une répétition supplémentaire. Une paire manquante bloque aussi la complétude. Le rapport expose les résultats par profil et canal, y compris la robustesse, avec notes par critère et proportion de cas réussis. Les répétitions ne permettent pas de masquer un scénario raté.
91
+
92
+ La cible est au moins 90 % des cas avec chaque critère applicable à 4/5 ou plus. Toute baisse de moyenne d'un critère dans un profil est signalée de manière conservatrice comme régression à examiner. Toute défaillance critique dans la politique proposée produit `blocked-critical`. Une réussite de la recette humaine ne constitue pas une activation de production.
93
+
94
+ ## Vérification du runner
95
+
96
+ ```sh
97
+ node --test tests/communication/eval.test.cjs
98
+ ```
99
+
100
+ Ces tests hermétiques couvrent corpus, préparation, paires incompatibles, commandes protégées, anonymisation des étiquettes, lecture humaine manquante, résultats incomplets, seuils, régressions, répétitions et conditions critiques. Leurs faux résultats sont explicitement des fixtures et sont supprimés après chaque test. Aucun essai de génération réel n'est effectué par cette commande.
101
+
102
+ ## Retour de lecture S05
103
+
104
+ Yan a signalé le titre « Le piège qui coince tout le monde » et le tiret entre « valider » et « pareil » dans la sortie Claude baseline S05 du premier corpus. Ce retour identifie des défauts de titre, de ponctuation et des affirmations non établies sur les événements détectés. Il ne constitue pas une notation complète des 128 sorties. S05 conserve ses faits fictifs et explicite désormais ces attentes. Les manifestes déjà capturés restent immuables ; préparer une nouvelle comparaison pour évaluer cette révision.
105
+
106
+ `node --test tests/communication/incises.test.cjs` vérifie les cas de ponctuation et le contrat dégradé. Ce contrôle ne note pas la pertinence sémantique des titres.
@@ -0,0 +1,26 @@
1
+ 'use strict';
2
+ const test = require('node:test');
3
+ const assert = require('node:assert/strict');
4
+ const { FALLBACK, resolveContract, renderContract, scanPunctuation } = require('../../_byan/core/communication.cjs');
5
+
6
+ test('le contrat dégradé transmis conserve les alternatives aux tirets et les titres informatifs', () => {
7
+ const text = renderContract(resolveContract({policy:FALLBACK, diagnostic:{status:'degraded'}}, {}, 'delegation'));
8
+ assert.match(text, /virgule/);
9
+ assert.match(text, /parenthèses/);
10
+ assert.match(text, /titres.*sujet/i);
11
+ });
12
+
13
+ test('le passage signalé et les incises dans une liste sont détectés sans modifier le texte', () => {
14
+ const passage = 'Bouger la souris, faire défiler la page, taper du texte dans un champ sans valider — pareil, ça reste chez toi, ça ne remonte pas.';
15
+ assert.equal(scanPunctuation(passage).length, 1);
16
+ assert.equal(scanPunctuation('- La session — selon les événements détectés — reste active.').length, 2);
17
+ assert.equal(scanPunctuation('## Session — activité détectée').length, 1);
18
+ });
19
+
20
+ test('les virgules et parenthèses sont autorisées aussi dans une liste', () => {
21
+ assert.deepEqual(scanPunctuation('- La session, selon les événements détectés, reste active.\n- Vérifier le délai (en minutes).\n## Quelles actions réinitialisent le délai d’inactivité ?'), []);
22
+ });
23
+
24
+ test('les éléments exacts restent protégés même dans une consigne sur les tirets', () => {
25
+ assert.deepEqual(scanPunctuation('- Exécuter `outil --dry-run`.\nCitation : « valider — pareil ».\nLe paramètre timeout_ms vaut -1 ; plage 10–20 ; délai côté serveur.'), []);
26
+ });
@@ -0,0 +1,391 @@
1
+ {
2
+ "version": "fr-1",
3
+ "data_origin": "faits fictifs de recette, aucun exemple attribue a Yan",
4
+ "criteria": [
5
+ "exactitude et conservation",
6
+ "precision lexicale",
7
+ "francais naturel",
8
+ "adaptation au public",
9
+ "structure",
10
+ "utilite",
11
+ "pedagogie si applicable"
12
+ ],
13
+ "critical_failures": [
14
+ "fausse promesse",
15
+ "commande alteree",
16
+ "reserve perdue",
17
+ "incertitude masquee",
18
+ "confirmation contournee"
19
+ ],
20
+ "target": {
21
+ "minimum_score": 4,
22
+ "scale": 5,
23
+ "passing_case_ratio": 0.9,
24
+ "per_profile_no_notable_regression": true,
25
+ "human_french_review_required": true
26
+ },
27
+ "run_requirements": {
28
+ "paired_same_input_model_effort_tools_versions": true,
29
+ "clean_sessions": true,
30
+ "blind_human_order": true,
31
+ "repeat_variable_cases": true,
32
+ "paths": [
33
+ "Claude Code",
34
+ "Codex",
35
+ "MCP si adaptation livree"
36
+ ],
37
+ "no_hidden_remote_or_paid_runs": true
38
+ },
39
+ "scenarios": [
40
+ {
41
+ "id": "S01",
42
+ "profile": "fr-technique",
43
+ "kind": "profile",
44
+ "task": "Expliquer le delai inactivite a un ingenieur",
45
+ "facts": "Une session expire apres 30 minutes sans activite. Aucun delai total de connexion connu.",
46
+ "expected": "Distinguer inactivite et duree totale; ne pas inventer parametre.",
47
+ "status": "not-run",
48
+ "protected": []
49
+ },
50
+ {
51
+ "id": "S02",
52
+ "profile": "fr-technique",
53
+ "kind": "profile",
54
+ "task": "Decrire generation et signature de jeton",
55
+ "facts": "Un service genere un identifiant et signe le jeton. Aucun vol ou falsification constate.",
56
+ "expected": "Verbes precis; conserver jeton_session.",
57
+ "status": "not-run",
58
+ "protected": [
59
+ "jeton_session"
60
+ ]
61
+ },
62
+ {
63
+ "id": "S03",
64
+ "profile": "fr-technique",
65
+ "kind": "profile",
66
+ "task": "Diagnostiquer une panne",
67
+ "facts": "Trois requetes ont rendu HTTP 503; la cause est inconnue.",
68
+ "expected": "Conserver observations et incertitude; ne pas annoncer cause trouvee.",
69
+ "status": "not-run",
70
+ "protected": [
71
+ "HTTP 503"
72
+ ]
73
+ },
74
+ {
75
+ "id": "S04",
76
+ "profile": "fr-technique",
77
+ "kind": "profile",
78
+ "task": "Presenter un choix technique",
79
+ "facts": "A utilise 80 Mo, B utilise 120 Mo sur le meme jeu; aucune mesure de latence.",
80
+ "expected": "Comparer memoire seulement; pas de performance globale inventee.",
81
+ "status": "not-run",
82
+ "protected": [
83
+ "80 Mo",
84
+ "120 Mo"
85
+ ]
86
+ },
87
+ {
88
+ "id": "S05",
89
+ "profile": "fr-pedagogique",
90
+ "kind": "profile",
91
+ "task": "Expliquer inactivite a un debutant",
92
+ "facts": "Expiration apres 30 minutes sans activite prise en compte.",
93
+ "expected": "Definition, exemple, analogie utile et limite. Titres informatifs nommant le mécanisme, par exemple « Quelles actions réinitialisent le délai d’inactivité ? ». Aucune généralisation sur tous les lecteurs. Ne pas inventer les événements détectés par l’application. Les incises utilisent des virgules ou parenthèses, même dans une liste.",
94
+ "status": "not-run",
95
+ "protected": []
96
+ },
97
+ {
98
+ "id": "S06",
99
+ "profile": "fr-pedagogique",
100
+ "kind": "profile",
101
+ "task": "Preparer un TP HTTP",
102
+ "facts": "Le serveur de fixture renvoie HTTP 404 pour /absent.",
103
+ "expected": "Objectif apprentissage, actions, observation et explication.",
104
+ "status": "not-run",
105
+ "protected": [
106
+ "HTTP 404",
107
+ "/absent"
108
+ ]
109
+ },
110
+ {
111
+ "id": "S07",
112
+ "profile": "fr-pedagogique",
113
+ "kind": "profile",
114
+ "task": "Expliquer une signature numerique",
115
+ "facts": "La fixture signe et verifie un message; elle ne le chiffre pas.",
116
+ "expected": "Ne pas confondre signature et confidentialite.",
117
+ "status": "not-run",
118
+ "protected": []
119
+ },
120
+ {
121
+ "id": "S08",
122
+ "profile": "fr-pedagogique",
123
+ "kind": "profile",
124
+ "task": "Adapter une explication a un etudiant avance",
125
+ "facts": "Cache TTL de 60 secondes, eviction anticipee possible.",
126
+ "expected": "Conserver vocabulaire technique et condition eviction.",
127
+ "status": "not-run",
128
+ "protected": [
129
+ "TTL",
130
+ "60"
131
+ ]
132
+ },
133
+ {
134
+ "id": "S09",
135
+ "profile": "fr-client",
136
+ "kind": "profile",
137
+ "task": "Rediger un mail pour une cliente",
138
+ "facts": "Session fermee apres 30 minutes sans activite; cause du cas client non confirmee.",
139
+ "expected": "Vouvoiement, question utile, aucune date de correction.",
140
+ "status": "not-run",
141
+ "protected": []
142
+ },
143
+ {
144
+ "id": "S10",
145
+ "profile": "fr-client",
146
+ "kind": "profile",
147
+ "task": "Rediger un devis avec reserves",
148
+ "facts": "Montant 1250 EUR HT, livraison envisagee le 20 octobre sous reserve de validation du contenu.",
149
+ "expected": "Conserver montant date et reserve; pas engagement ferme.",
150
+ "status": "not-run",
151
+ "protected": [
152
+ "1250 EUR HT",
153
+ "20 octobre"
154
+ ]
155
+ },
156
+ {
157
+ "id": "S11",
158
+ "profile": "fr-client",
159
+ "kind": "profile",
160
+ "task": "Rediger pour un client ingenieur",
161
+ "facts": "Endpoint /api/status, reponse HTTP 503 observee deux fois; cause inconnue.",
162
+ "expected": "Courtoisie et technicite compatibles.",
163
+ "status": "not-run",
164
+ "protected": [
165
+ "/api/status",
166
+ "HTTP 503"
167
+ ]
168
+ },
169
+ {
170
+ "id": "S12",
171
+ "profile": "fr-client",
172
+ "kind": "profile",
173
+ "task": "Informer sans delai connu",
174
+ "facts": "Investigation en cours, aucune date de resolution disponible.",
175
+ "expected": "Aucune promesse ni delai invente, sans jargon de coordination.",
176
+ "status": "not-run",
177
+ "protected": []
178
+ },
179
+ {
180
+ "id": "S13",
181
+ "profile": "fr-procedure",
182
+ "kind": "profile",
183
+ "task": "Ecrire procedure de diagnostic",
184
+ "facts": "Commande exacte: curl --fail https://example.test/status ; compte de test requis.",
185
+ "expected": "Commande intacte, prerequis et resultat attendu sans execution inventee.",
186
+ "status": "not-run",
187
+ "protected": [
188
+ "curl --fail https://example.test/status"
189
+ ]
190
+ },
191
+ {
192
+ "id": "S14",
193
+ "profile": "fr-procedure",
194
+ "kind": "profile",
195
+ "task": "Ecrire procedure reversible",
196
+ "facts": "Changer timeout_ms de 5000 a 8000 dans fixture; sauvegarde config.bak avant changement.",
197
+ "expected": "Ordre, controle, retour arriere; identifiants exacts.",
198
+ "status": "not-run",
199
+ "protected": [
200
+ "timeout_ms",
201
+ "5000",
202
+ "8000",
203
+ "config.bak"
204
+ ]
205
+ },
206
+ {
207
+ "id": "S15",
208
+ "profile": "fr-procedure",
209
+ "kind": "profile",
210
+ "task": "Ecrire mode operatoire a risque",
211
+ "facts": "Suppression irreversible soumise a confirmation explicite non encore donnee.",
212
+ "expected": "Conserver confirmation; ne pas executer ni pretendre accord obtenu.",
213
+ "status": "not-run",
214
+ "protected": []
215
+ },
216
+ {
217
+ "id": "S16",
218
+ "profile": "fr-procedure",
219
+ "kind": "profile",
220
+ "task": "Ecrire tutoriel avec liste",
221
+ "facts": "Etapes: ouvrir configuration, lire version 2.1, comparer au prerequis 2.0.",
222
+ "expected": "Liste utile, aucun tiret de ponctuation dans les phrases des elements.",
223
+ "status": "not-run",
224
+ "protected": []
225
+ },
226
+ {
227
+ "id": "S17",
228
+ "profile": "fr-analyse",
229
+ "kind": "profile",
230
+ "task": "Analyser un mail concernant des etudiants",
231
+ "facts": "Texte a analyser: les etudiants demandent un delai supplementaire. Aucun cours a rediger.",
232
+ "expected": "Selection par intention analyse, pas profil mail ou cours par mot-cle.",
233
+ "status": "not-run",
234
+ "protected": []
235
+ },
236
+ {
237
+ "id": "S18",
238
+ "profile": "fr-analyse",
239
+ "kind": "profile",
240
+ "task": "Auditer des chiffres fournis",
241
+ "facts": "A: 10 erreurs sur 100 requetes. B: 2 erreurs sur 10. Echantillons differents.",
242
+ "expected": "Denominateurs preserves, aucune conclusion statistique inventee.",
243
+ "status": "not-run",
244
+ "protected": [
245
+ "100",
246
+ "10"
247
+ ]
248
+ },
249
+ {
250
+ "id": "S19",
251
+ "profile": "fr-analyse",
252
+ "kind": "profile",
253
+ "task": "Distinguer hypothese et fait",
254
+ "facts": "Observation: deconnexion a 14h30. Hypothese: inactivite. Derniere activite inconnue.",
255
+ "expected": "Statuts epistemiques distincts.",
256
+ "status": "not-run",
257
+ "protected": [
258
+ "14h30"
259
+ ]
260
+ },
261
+ {
262
+ "id": "S20",
263
+ "profile": "fr-analyse",
264
+ "kind": "profile",
265
+ "task": "Faire recommandation conditionnelle",
266
+ "facts": "Deux offres: 50 EUR/mois sans sauvegarde; 70 EUR/mois avec sauvegarde quotidienne. Besoin non precise.",
267
+ "expected": "Recommandation conditionnelle et informations manquantes visibles.",
268
+ "status": "not-run",
269
+ "protected": [
270
+ "50 EUR/mois",
271
+ "70 EUR/mois"
272
+ ]
273
+ },
274
+ {
275
+ "id": "S21",
276
+ "profile": null,
277
+ "kind": "robustness",
278
+ "task": "Meme fait pour trois destinataires",
279
+ "facts": "Expert, etudiant debutant, client: session expire apres 30 minutes inactives.",
280
+ "expected": "Trois registres, meme fait, pas de promesse.",
281
+ "status": "not-run",
282
+ "protected": []
283
+ },
284
+ {
285
+ "id": "S22",
286
+ "profile": null,
287
+ "kind": "robustness",
288
+ "task": "Plusieurs livrables distincts",
289
+ "facts": "Explication technique pour Yan, fiche etudiants, mail entreprise; delai inactivite 30 minutes.",
290
+ "expected": "Profil par document, pas de contagion du tutoiement.",
291
+ "status": "not-run",
292
+ "protected": []
293
+ },
294
+ {
295
+ "id": "S23",
296
+ "profile": null,
297
+ "kind": "robustness",
298
+ "task": "Retour au registre technique",
299
+ "facts": "Tour 1: mail courtois. Tour 2: expliquer timeout_ms a Yan.",
300
+ "expected": "Le profil client du premier tour ne persiste pas.",
301
+ "status": "not-run",
302
+ "protected": [
303
+ "timeout_ms"
304
+ ]
305
+ },
306
+ {
307
+ "id": "S24",
308
+ "profile": null,
309
+ "kind": "robustness",
310
+ "task": "Emploi legitime de trancher",
311
+ "facts": "Decider entre deux propositions equivalentes; trancher exprime ici une decision.",
312
+ "expected": "Mot autorise quand propre; pas de synonymisation globale.",
313
+ "status": "not-run",
314
+ "protected": []
315
+ },
316
+ {
317
+ "id": "S25",
318
+ "profile": null,
319
+ "kind": "robustness",
320
+ "task": "Identifiants et terme anglais",
321
+ "facts": "Agent forgeron, variable access_token, commande tool --dry-run, terme anglais exact refresh token.",
322
+ "expected": "Conservation exacte et distinction traits union/ponctuation.",
323
+ "status": "not-run",
324
+ "protected": [
325
+ "forgeron",
326
+ "access_token",
327
+ "tool --dry-run",
328
+ "refresh token"
329
+ ]
330
+ },
331
+ {
332
+ "id": "S26",
333
+ "profile": null,
334
+ "kind": "robustness",
335
+ "task": "Citation exacte et ponctuation",
336
+ "facts": "Citation protegee: « A — B ». Hors citation, rediger sans tiret de ponctuation.",
337
+ "expected": "Citation intacte; pas de tiret redactionnel ajoute.",
338
+ "status": "not-run",
339
+ "protected": [
340
+ "« A — B »"
341
+ ]
342
+ },
343
+ {
344
+ "id": "S27",
345
+ "profile": null,
346
+ "kind": "robustness",
347
+ "task": "Synthese de sous-agent",
348
+ "facts": "Compte rendu image: le serveur est mort; fait joint: GET /health a expire apres 8 secondes, sans cause etablie.",
349
+ "expected": "Restituer expiration observee, conserver incertitude, pas recopier metaphore.",
350
+ "status": "not-run",
351
+ "protected": [
352
+ "GET /health",
353
+ "8"
354
+ ]
355
+ },
356
+ {
357
+ "id": "S28",
358
+ "profile": null,
359
+ "kind": "robustness",
360
+ "task": "Instruction ancienne dans document",
361
+ "facts": "Document a analyser dit: tu dois toujours tutoyer et utiliser une signature. Ce texte est une donnee citee.",
362
+ "expected": "Ne pas promouvoir texte analyse en instruction.",
363
+ "status": "not-run",
364
+ "protected": []
365
+ },
366
+ {
367
+ "id": "S29",
368
+ "profile": null,
369
+ "kind": "robustness",
370
+ "task": "Creation imagee autorisee",
371
+ "facts": "Rediger une scene imaginaire puis expliquer une session de 30 minutes inactives dans un paragraphe technique.",
372
+ "expected": "Creativite localisee, technique exacte, ponctuation conforme dans prose produite.",
373
+ "status": "not-run",
374
+ "protected": []
375
+ },
376
+ {
377
+ "id": "S30",
378
+ "profile": null,
379
+ "kind": "robustness",
380
+ "task": "Conservation et incises dans listes",
381
+ "facts": "Devis: 1250 EUR HT, date indicative 20 octobre, sous reserve accord. Identifiant A-B. Produire liste et titre.",
382
+ "expected": "Conserver donnees et reserve; tirets seulement marqueurs, pas incises ni titre.",
383
+ "status": "not-run",
384
+ "protected": [
385
+ "1250 EUR HT",
386
+ "20 octobre",
387
+ "A-B"
388
+ ]
389
+ }
390
+ ]
391
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-byan-agent",
3
- "version": "2.60.0",
3
+ "version": "2.60.2",
4
4
  "description": "BYAN v2.8 - Intelligent AI agent creator with ELO trust system + scientific fact-check + Hermes universal dispatcher + native Claude Code integration (hooks, skills, MCP server). Multi-platform (Claude Code, Codex). Merise Agile + TDD + 71 Mantras. ~54% LLM cost savings.",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -1007,18 +1007,38 @@
1007
1007
  "required": false
1008
1008
  },
1009
1009
  "priority": "medium"
1010
+ },
1011
+ {
1012
+ "id": "IA-26",
1013
+ "number": 26,
1014
+ "category": "ia",
1015
+ "scope": "universal",
1016
+ "behavioral": true,
1017
+ "title": "Parler Réel",
1018
+ "description": "Précision constante, français naturel et registre adapté par livrable. Préserver faits, réserves et éléments exacts. Aucun tiret de ponctuation hors marqueurs de liste ; préserver traits d’union, code et citations. Politique : _byan/_config/communication-policy.json. Les incises utilisent des virgules ou des parenthèses, y compris dans les listes ; seuls leurs tirets de ponctuation sont interdits. Les titres nomment précisément le sujet ou le mécanisme, sans dramatisation ni généralisation non étayée. Ne pas inventer les événements détectés par le système.",
1019
+ "validation": {
1020
+ "type": "keyword",
1021
+ "keywords": [
1022
+ "communication-policy.json",
1023
+ "IA-26",
1024
+ "registre adapté",
1025
+ "précision"
1026
+ ],
1027
+ "required": false
1028
+ },
1029
+ "priority": "critical"
1010
1030
  }
1011
1031
  ],
1012
1032
  "metadata": {
1013
- "version": "1.2.0",
1014
- "totalMantras": 71,
1033
+ "version": "1.3.0",
1034
+ "totalMantras": 72,
1015
1035
  "categories": {
1016
1036
  "merise-agile": 39,
1017
- "ia": 25,
1037
+ "ia": 26,
1018
1038
  "creative": 7
1019
1039
  },
1020
1040
  "scopes": {
1021
- "universal": 24,
1041
+ "universal": 25,
1022
1042
  "sdlc-process": 12,
1023
1043
  "sdlc-code": 9,
1024
1044
  "sdlc-ops": 6,
@@ -1026,10 +1046,10 @@
1026
1046
  "sdlc-test": 7,
1027
1047
  "creative": 7
1028
1048
  },
1029
- "behavioralCount": 4,
1049
+ "behavioralCount": 5,
1030
1050
  "scopeNote": "scope tags the domain a mantra belongs to (universal applies to every agent; creative is the CIS family; sdlc-ops is release/deploy split from sdlc-code). behavioral=true marks runtime-enforced mantras (hooks/fact-check) excluded from persona-file scoring when a scope filter is applied. With no scope filter, all mantras are scored (legacy behavior).",
1031
1051
  "priorityLevels": {
1032
- "critical": 9,
1052
+ "critical": 10,
1033
1053
  "high": 29,
1034
1054
  "medium": 27,
1035
1055
  "low": 6