dominds 0.6.2 → 0.6.4

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 (149) hide show
  1. package/dist/access-control.js +2 -2
  2. package/dist/agent-priming.js +826 -92
  3. package/dist/cli/read.js +406 -12
  4. package/dist/dialog.js +4 -0
  5. package/dist/docs/design.md +1 -0
  6. package/dist/docs/design.zh.md +1 -0
  7. package/dist/docs/dialog-system.md +12 -7
  8. package/dist/docs/dialog-system.zh.md +7 -3
  9. package/dist/docs/dominds-agent-priming.md +10 -1
  10. package/dist/docs/dominds-agent-priming.zh.md +9 -1
  11. package/dist/docs/dominds-terminology.md +8 -8
  12. package/dist/docs/fbr-implementation.md +77 -0
  13. package/dist/docs/fbr-implementation.zh.md +77 -0
  14. package/dist/docs/fbr.md +142 -141
  15. package/dist/docs/fbr.zh.md +129 -123
  16. package/dist/docs/keep-going.zh.md +162 -0
  17. package/dist/docs/showing-by-doing.md +208 -0
  18. package/dist/docs/showing-by-doing.zh.md +177 -0
  19. package/dist/docs/tellask-collab.md +250 -0
  20. package/dist/docs/tellask-collab.zh.md +254 -0
  21. package/dist/docs/txt-editing-tools.md +2 -2
  22. package/dist/docs/txt-editing-tools.zh.md +2 -2
  23. package/dist/llm/defaults.yaml +82 -4
  24. package/dist/llm/driver.js +280 -104
  25. package/dist/llm/gen/codex.js +49 -2
  26. package/dist/log.js +385 -30
  27. package/dist/mcp/supervisor.js +113 -40
  28. package/dist/minds/builtin/pangu/persona.zh.md +2 -2
  29. package/dist/minds/load.js +49 -284
  30. package/dist/minds/minds-i18n.js +2 -2
  31. package/dist/minds/promptdocs.js +263 -0
  32. package/dist/minds/system-prompt-parts.js +231 -0
  33. package/dist/minds/system-prompt.js +190 -223
  34. package/dist/persistence.js +66 -1
  35. package/dist/server/websocket-handler.js +14 -0
  36. package/dist/shared/diligence.js +40 -6
  37. package/dist/shared/utils/inter-dialog-format.js +3 -5
  38. package/dist/showing-by-doing.js +34 -31
  39. package/dist/snippets/README.en.md +3 -0
  40. package/dist/static/assets/{_baseUniq-C9vbtHF9.js → _baseUniq-C7IpU2Uk.js} +2 -2
  41. package/dist/static/assets/{_baseUniq-C9vbtHF9.js.map → _baseUniq-C7IpU2Uk.js.map} +1 -1
  42. package/dist/static/assets/{arc-hulXG01i.js → arc-1bhQqjON.js} +2 -2
  43. package/dist/static/assets/{arc-hulXG01i.js.map → arc-1bhQqjON.js.map} +1 -1
  44. package/dist/static/assets/{architectureDiagram-VXUJARFQ-DdLIAMT5.js → architectureDiagram-VXUJARFQ-CkEi1QpB.js} +6 -6
  45. package/dist/static/assets/{architectureDiagram-VXUJARFQ-DdLIAMT5.js.map → architectureDiagram-VXUJARFQ-CkEi1QpB.js.map} +1 -1
  46. package/dist/static/assets/{blockDiagram-VD42YOAC-DACsx66C.js → blockDiagram-VD42YOAC-DaBQ5-pY.js} +7 -7
  47. package/dist/static/assets/{blockDiagram-VD42YOAC-DACsx66C.js.map → blockDiagram-VD42YOAC-DaBQ5-pY.js.map} +1 -1
  48. package/dist/static/assets/{c4Diagram-YG6GDRKO-Cd5xZlLy.js → c4Diagram-YG6GDRKO-ChUgpgkP.js} +3 -3
  49. package/dist/static/assets/{c4Diagram-YG6GDRKO-Cd5xZlLy.js.map → c4Diagram-YG6GDRKO-ChUgpgkP.js.map} +1 -1
  50. package/dist/static/assets/{channel-NQehis0Z.js → channel-CxvmwllM.js} +2 -2
  51. package/dist/static/assets/{channel-NQehis0Z.js.map → channel-CxvmwllM.js.map} +1 -1
  52. package/dist/static/assets/{chunk-4BX2VUAB-DZDPl76b.js → chunk-4BX2VUAB-CKsrU2yk.js} +2 -2
  53. package/dist/static/assets/{chunk-4BX2VUAB-DZDPl76b.js.map → chunk-4BX2VUAB-CKsrU2yk.js.map} +1 -1
  54. package/dist/static/assets/{chunk-55IACEB6-CFSRDUbl.js → chunk-55IACEB6-BAau9SFt.js} +2 -2
  55. package/dist/static/assets/{chunk-55IACEB6-CFSRDUbl.js.map → chunk-55IACEB6-BAau9SFt.js.map} +1 -1
  56. package/dist/static/assets/{chunk-B4BG7PRW-BqQQ9M_z.js → chunk-B4BG7PRW--IiJ7W1m.js} +5 -5
  57. package/dist/static/assets/{chunk-B4BG7PRW-BqQQ9M_z.js.map → chunk-B4BG7PRW--IiJ7W1m.js.map} +1 -1
  58. package/dist/static/assets/{chunk-DI55MBZ5-FiFzz1Gh.js → chunk-DI55MBZ5-B83KrPQj.js} +4 -4
  59. package/dist/static/assets/{chunk-DI55MBZ5-FiFzz1Gh.js.map → chunk-DI55MBZ5-B83KrPQj.js.map} +1 -1
  60. package/dist/static/assets/{chunk-FMBD7UC4-DqqtCyWK.js → chunk-FMBD7UC4-BlDXzeza.js} +2 -2
  61. package/dist/static/assets/{chunk-FMBD7UC4-DqqtCyWK.js.map → chunk-FMBD7UC4-BlDXzeza.js.map} +1 -1
  62. package/dist/static/assets/{chunk-QN33PNHL-F0laQQ-J.js → chunk-QN33PNHL-B596W_v7.js} +2 -2
  63. package/dist/static/assets/{chunk-QN33PNHL-F0laQQ-J.js.map → chunk-QN33PNHL-B596W_v7.js.map} +1 -1
  64. package/dist/static/assets/{chunk-QZHKN3VN-CWhEZPaV.js → chunk-QZHKN3VN-UBBCxgBb.js} +2 -2
  65. package/dist/static/assets/{chunk-QZHKN3VN-CWhEZPaV.js.map → chunk-QZHKN3VN-UBBCxgBb.js.map} +1 -1
  66. package/dist/static/assets/{chunk-TZMSLE5B-Dx9cnwUy.js → chunk-TZMSLE5B-D-wCX2wJ.js} +2 -2
  67. package/dist/static/assets/{chunk-TZMSLE5B-Dx9cnwUy.js.map → chunk-TZMSLE5B-D-wCX2wJ.js.map} +1 -1
  68. package/dist/static/assets/{classDiagram-2ON5EDUG-Dp-dyEGy.js → classDiagram-2ON5EDUG-DvtmzPcu.js} +6 -6
  69. package/dist/static/assets/{classDiagram-2ON5EDUG-Dp-dyEGy.js.map → classDiagram-2ON5EDUG-DvtmzPcu.js.map} +1 -1
  70. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-Dp-dyEGy.js → classDiagram-v2-WZHVMYZB-DvtmzPcu.js} +6 -6
  71. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-Dp-dyEGy.js.map → classDiagram-v2-WZHVMYZB-DvtmzPcu.js.map} +1 -1
  72. package/dist/static/assets/{clone-C6mKvxs5.js → clone-DgJ0ZR-k.js} +2 -2
  73. package/dist/static/assets/{clone-C6mKvxs5.js.map → clone-DgJ0ZR-k.js.map} +1 -1
  74. package/dist/static/assets/{cose-bilkent-S5V4N54A-Dbwh3GoX.js → cose-bilkent-S5V4N54A-DXMyFQvy.js} +2 -2
  75. package/dist/static/assets/{cose-bilkent-S5V4N54A-Dbwh3GoX.js.map → cose-bilkent-S5V4N54A-DXMyFQvy.js.map} +1 -1
  76. package/dist/static/assets/{dagre-6UL2VRFP-BD_6e0Uk.js → dagre-6UL2VRFP-BdaUG-j_.js} +7 -7
  77. package/dist/static/assets/{dagre-6UL2VRFP-BD_6e0Uk.js.map → dagre-6UL2VRFP-BdaUG-j_.js.map} +1 -1
  78. package/dist/static/assets/{diagram-PSM6KHXK-BWt7Q59-.js → diagram-PSM6KHXK-NLiqKBzn.js} +7 -7
  79. package/dist/static/assets/{diagram-PSM6KHXK-BWt7Q59-.js.map → diagram-PSM6KHXK-NLiqKBzn.js.map} +1 -1
  80. package/dist/static/assets/{diagram-QEK2KX5R-D0BvBR_a.js → diagram-QEK2KX5R-D-0fyvY_.js} +6 -6
  81. package/dist/static/assets/{diagram-QEK2KX5R-D0BvBR_a.js.map → diagram-QEK2KX5R-D-0fyvY_.js.map} +1 -1
  82. package/dist/static/assets/{diagram-S2PKOQOG-D8uRdKXp.js → diagram-S2PKOQOG-BQ_FU59m.js} +6 -6
  83. package/dist/static/assets/{diagram-S2PKOQOG-D8uRdKXp.js.map → diagram-S2PKOQOG-BQ_FU59m.js.map} +1 -1
  84. package/dist/static/assets/{erDiagram-Q2GNP2WA-CQoifjFq.js → erDiagram-Q2GNP2WA-DyftKeuC.js} +5 -5
  85. package/dist/static/assets/{erDiagram-Q2GNP2WA-CQoifjFq.js.map → erDiagram-Q2GNP2WA-DyftKeuC.js.map} +1 -1
  86. package/dist/static/assets/{flowDiagram-NV44I4VS-CGhdeaG8.js → flowDiagram-NV44I4VS-9SGefONA.js} +6 -6
  87. package/dist/static/assets/{flowDiagram-NV44I4VS-CGhdeaG8.js.map → flowDiagram-NV44I4VS-9SGefONA.js.map} +1 -1
  88. package/dist/static/assets/{ganttDiagram-JELNMOA3-D8W0wb9H.js → ganttDiagram-JELNMOA3-k_WLhf-r.js} +3 -3
  89. package/dist/static/assets/{ganttDiagram-JELNMOA3-D8W0wb9H.js.map → ganttDiagram-JELNMOA3-k_WLhf-r.js.map} +1 -1
  90. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-ChHni_jP.js → gitGraphDiagram-NY62KEGX-3eoLlCOY.js} +7 -7
  91. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-ChHni_jP.js.map → gitGraphDiagram-NY62KEGX-3eoLlCOY.js.map} +1 -1
  92. package/dist/static/assets/{graph-BWoi_FgC.js → graph-vUevIs4s.js} +3 -3
  93. package/dist/static/assets/{graph-BWoi_FgC.js.map → graph-vUevIs4s.js.map} +1 -1
  94. package/dist/static/assets/{index-th_praGg.js → index-BNBG2CE1.js} +399 -68
  95. package/dist/static/assets/index-BNBG2CE1.js.map +1 -0
  96. package/dist/static/assets/{infoDiagram-WHAUD3N6-B_XKKZTV.js → infoDiagram-WHAUD3N6-CwEhVxkU.js} +5 -5
  97. package/dist/static/assets/{infoDiagram-WHAUD3N6-B_XKKZTV.js.map → infoDiagram-WHAUD3N6-CwEhVxkU.js.map} +1 -1
  98. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-ChGuQ6T9.js → journeyDiagram-XKPGCS4Q-Dtdq4G4Q.js} +5 -5
  99. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-ChGuQ6T9.js.map → journeyDiagram-XKPGCS4Q-Dtdq4G4Q.js.map} +1 -1
  100. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BjWe623u.js → kanban-definition-3W4ZIXB7-Bli-AycJ.js} +3 -3
  101. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BjWe623u.js.map → kanban-definition-3W4ZIXB7-Bli-AycJ.js.map} +1 -1
  102. package/dist/static/assets/{layout-BPyT310w.js → layout-CGlA8c09.js} +5 -5
  103. package/dist/static/assets/{layout-BPyT310w.js.map → layout-CGlA8c09.js.map} +1 -1
  104. package/dist/static/assets/{linear-xUsVjXWq.js → linear-Da2jDWL3.js} +2 -2
  105. package/dist/static/assets/{linear-xUsVjXWq.js.map → linear-Da2jDWL3.js.map} +1 -1
  106. package/dist/static/assets/{min-xFt7zeOd.js → min-Co741hTV.js} +3 -3
  107. package/dist/static/assets/{min-xFt7zeOd.js.map → min-Co741hTV.js.map} +1 -1
  108. package/dist/static/assets/{mindmap-definition-VGOIOE7T-DT_dvf2c.js → mindmap-definition-VGOIOE7T-DvkIjoq8.js} +4 -4
  109. package/dist/static/assets/{mindmap-definition-VGOIOE7T-DT_dvf2c.js.map → mindmap-definition-VGOIOE7T-DvkIjoq8.js.map} +1 -1
  110. package/dist/static/assets/{pieDiagram-ADFJNKIX-B1DQ-OaG.js → pieDiagram-ADFJNKIX-BGuGhTu8.js} +7 -7
  111. package/dist/static/assets/{pieDiagram-ADFJNKIX-B1DQ-OaG.js.map → pieDiagram-ADFJNKIX-BGuGhTu8.js.map} +1 -1
  112. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-IHqyr3iT.js → quadrantDiagram-AYHSOK5B-DAZcrJMg.js} +3 -3
  113. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-IHqyr3iT.js.map → quadrantDiagram-AYHSOK5B-DAZcrJMg.js.map} +1 -1
  114. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-CKBpht7B.js → requirementDiagram-UZGBJVZJ-CXN0DxZs.js} +4 -4
  115. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-CKBpht7B.js.map → requirementDiagram-UZGBJVZJ-CXN0DxZs.js.map} +1 -1
  116. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-D2uGjv3i.js → sankeyDiagram-TZEHDZUN-B7-yAePZ.js} +2 -2
  117. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-D2uGjv3i.js.map → sankeyDiagram-TZEHDZUN-B7-yAePZ.js.map} +1 -1
  118. package/dist/static/assets/{sequenceDiagram-WL72ISMW-wLFRhAKd.js → sequenceDiagram-WL72ISMW-DfBNY6h_.js} +4 -4
  119. package/dist/static/assets/{sequenceDiagram-WL72ISMW-wLFRhAKd.js.map → sequenceDiagram-WL72ISMW-DfBNY6h_.js.map} +1 -1
  120. package/dist/static/assets/{stateDiagram-FKZM4ZOC-BFGQTbx5.js → stateDiagram-FKZM4ZOC-BLo1xRVY.js} +9 -9
  121. package/dist/static/assets/{stateDiagram-FKZM4ZOC-BFGQTbx5.js.map → stateDiagram-FKZM4ZOC-BLo1xRVY.js.map} +1 -1
  122. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-DF7AjJuk.js → stateDiagram-v2-4FDKWEC3-Dq7MAD0I.js} +5 -5
  123. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-DF7AjJuk.js.map → stateDiagram-v2-4FDKWEC3-Dq7MAD0I.js.map} +1 -1
  124. package/dist/static/assets/{timeline-definition-IT6M3QCI-ChHFOb0o.js → timeline-definition-IT6M3QCI-ySWyBF3b.js} +3 -3
  125. package/dist/static/assets/{timeline-definition-IT6M3QCI-ChHFOb0o.js.map → timeline-definition-IT6M3QCI-ySWyBF3b.js.map} +1 -1
  126. package/dist/static/assets/{treemap-KMMF4GRG-BxaNvQU4.js → treemap-KMMF4GRG-DOp4sqOh.js} +4 -4
  127. package/dist/static/assets/{treemap-KMMF4GRG-BxaNvQU4.js.map → treemap-KMMF4GRG-DOp4sqOh.js.map} +1 -1
  128. package/dist/static/assets/{xychartDiagram-PRI3JC2R-CrNKeY_-.js → xychartDiagram-PRI3JC2R-vkmh67qb.js} +3 -3
  129. package/dist/static/assets/{xychartDiagram-PRI3JC2R-CrNKeY_-.js.map → xychartDiagram-PRI3JC2R-vkmh67qb.js.map} +1 -1
  130. package/dist/static/index.html +1 -1
  131. package/dist/team.js +29 -6
  132. package/dist/tool.js +56 -0
  133. package/dist/tools/builtins.js +4 -2
  134. package/dist/tools/context-health.js +7 -7
  135. package/dist/tools/os.js +267 -30
  136. package/dist/tools/pending-tellask-reminder.js +185 -0
  137. package/dist/tools/plan.js +1 -0
  138. package/dist/tools/ripgrep.js +145 -4
  139. package/dist/tools/shell-tools.js +21 -0
  140. package/dist/tools/team-mgmt.js +4 -4
  141. package/dist/tools/toolset-manual.js +74 -0
  142. package/dist/utils/task-doc.js +16 -16
  143. package/package.json +1 -1
  144. package/dist/minds/builtin/cmdr/persona.md +0 -3
  145. package/dist/minds/builtin/dijiang/knowledge.md +0 -287
  146. package/dist/minds/builtin/dijiang/persona.md +0 -7
  147. package/dist/static/assets/index-th_praGg.js.map +0 -1
  148. package/dist/static/testing/dom-observation-utils.js +0 -425
  149. package/dist/static/testing/e2e-test-helper.js +0 -3119
@@ -111,11 +111,11 @@
111
111
  - EN (term): `TellaskBack`
112
112
  - ZH(术语): `回问诉请`
113
113
 
114
- - EN (meaning): Ask the **origin dialog** (the dialog that issued the current Tellask) for clarification instead of guessing.
115
- - ZH(含义): 当被诉请方需要补充信息时,应**回问发起本次诉请的对话**澄清,而不是自行猜测。
114
+ - EN (meaning): Ask the **tellasker dialog** (the dialog that issued the current Tellask) for clarification instead of guessing.
115
+ - ZH(含义): 当被诉请方需要补充信息时,应**回问诉请者对话**澄清,而不是自行猜测。
116
116
 
117
- - EN (what “Back” means): “Back” refers to routing back to the origin dialog; it does **not** imply hierarchy/seniority.
118
- - ZH(Back 的含义): “Back” 指回到发起方对话,**不暗示上下级**。
117
+ - EN (what “Back” means): “Back” refers to routing back to the tellasker dialog; it does **not** imply hierarchy/seniority.
118
+ - ZH(Back 的含义): “Back” 指回到诉请者对话,**不暗示上下级**。
119
119
 
120
120
  - EN (typical carrier): `!?@tellasker ...` (only available inside a sideline dialog)
121
121
  - ZH(典型载体): `!?@tellasker ...`(只在你处于支线对话语境时可用)
@@ -191,8 +191,8 @@ Example / 示例(概念):
191
191
 
192
192
  ### 系统提示可复用的一句话(One-Sentence Summary for System Prompts)
193
193
 
194
- - EN: `TellaskBack` asks the origin dialog for clarification; `Tellask Session` uses `!tellaskSession <slug>` for resumable multi-turn work; `Fresh Tellask` is one-shot and non-resumable.
195
- - ZH: `TellaskBack` 回问发起方澄清;`Tellask Session` 用 `!tellaskSession <slug>` 进行可续用多轮协作;`Fresh Tellask` 是一次性且不可恢复。
194
+ - EN: `TellaskBack` asks the tellasker dialog for clarification; `Tellask Session` uses `!tellaskSession <slug>` for resumable multi-turn work; `Fresh Tellask` is one-shot and non-resumable.
195
+ - ZH: `TellaskBack` 回问诉请者澄清;`Tellask Session` 用 `!tellaskSession <slug>` 进行可续用多轮协作;`Fresh Tellask` 是一次性且不可恢复。
196
196
 
197
197
  ### 为何保留 `!` 前缀?(Why keep the `!` prefix?)
198
198
 
@@ -402,8 +402,8 @@ Example / 示例(概念):
402
402
  - EN: The implementation may still use the internal labels **Type A/B/C** to classify teammate-tellask patterns.
403
403
  - ZH: 实现层仍可能使用 **Type A/B/C** 作为队友诉请形态的内部分类。
404
404
 
405
- - EN: Type A: ask-back call (a subdialog asking back to its initiating dialog); primary syntax `!?@tellasker` (NO `!tellaskSession`).
406
- - ZH: Type A:回问诉请(子对话回问其发起方对话);主语法 `!?@tellasker`(不带 `!tellaskSession`)。
405
+ - EN: Type A: TellaskBack call (a subdialog asking back to its tellasker dialog); primary syntax `!?@tellasker` (NO `!tellaskSession`).
406
+ - ZH: Type A:回问诉请(子对话回问其诉请者对话);主语法 `!?@tellasker`(不带 `!tellaskSession`)。
407
407
 
408
408
  - EN: Type B: registered subdialog call (resumable) keyed by `agentId!tellaskSession`.
409
409
  - ZH: Type B:registered subdialog call(可恢复),用 `agentId!tellaskSession` 作为 registry key。
@@ -0,0 +1,77 @@
1
+ # FBR Implementation Details (Implemented)
2
+
3
+ Chinese version: [中文版](./fbr-implementation.zh.md)
4
+
5
+ This doc records the implemented structure and constraints. The normative spec is `fbr.md`.
6
+
7
+ ## Implementation principles
8
+
9
+ - FBR and non-FBR use the same context assembly pipeline; differences must be explicit policy fields only.
10
+ - The FBR system prompt body must contain no tool instructions; tool availability is expressed only by a separate notice.
11
+ - Tool/tellask restrictions are enforced technically at runtime, not by prompt wording alone.
12
+
13
+ ## Code structure
14
+
15
+ ### 1) Unified drive policy (`main/llm/driver.ts`)
16
+
17
+ Before each generation, runtime builds a `DrivePolicy` that centralizes:
18
+
19
+ - `effectiveSystemPrompt`
20
+ - `effectiveAgentTools`
21
+ - `prependedContextMessages`
22
+ - `tellaskPolicy`
23
+ - `allowFunctionCalls`
24
+
25
+ For FBR policy, runtime:
26
+
27
+ - uses `buildFbrSystemPrompt(...)` (no tool instructions)
28
+ - injects a separate `buildNoToolsNotice(...)`
29
+ - forces `effectiveAgentTools = []`
30
+ - forces `tellaskPolicy = tellasker_only`
31
+ - forces `allowFunctionCalls = false`
32
+ - applies `fbr_model_params` override when configured
33
+
34
+ ### 2) Unified context assembly (`main/llm/driver.ts`)
35
+
36
+ `buildDriveContextMessages(...)` assembles context for both FBR and non-FBR. FBR does not use ad-hoc `unshift/push` special-cases in the main flow; it only differs via policy-provided `prependedContextMessages`.
37
+
38
+ ### 3) Unified violation gate (`main/llm/driver.ts`)
39
+
40
+ Both streaming and non-streaming paths call `resolveDrivePolicyViolationKind(...)` to detect:
41
+
42
+ - disallowed tellasks (FBR allows only `@tellasker`)
43
+ - disallowed tool/function calls (FBR disallows all)
44
+
45
+ On violation, runtime emits `formatDomindsNoteFbrToollessViolation(...)` consistently.
46
+
47
+ ### 4) FBR isolation invariant gate (`main/llm/driver.ts`)
48
+
49
+ Before generation, runtime runs `validateDrivePolicyInvariants(...)` and fail-fast checks:
50
+
51
+ - system prompt must exactly equal `buildFbrSystemPrompt(...)`
52
+ - `effectiveAgentTools` must be empty
53
+ - `allowFunctionCalls` must be `false`
54
+ - `tellaskPolicy` must be `tellasker_only`
55
+ - `prependedContextMessages` must contain exactly one `buildNoToolsNotice(...)`
56
+
57
+ If any check fails, runtime throws `FBR policy isolation violation`, preventing global tool-manual/tool-prompt paths from leaking into FBR.
58
+
59
+ ### 5) Single-source no-tools notice (`main/minds/system-prompt-parts.ts`)
60
+
61
+ `buildNoToolsNotice(...)` is the only tool-availability wording source, fixed to:
62
+
63
+ - no tools available / do not call tools
64
+ - no access to rtws / files / browser / shell
65
+
66
+ ## Related modules
67
+
68
+ - `main/llm/driver.ts`: policy, context assembly, violation enforcement
69
+ - `main/minds/system-prompt-parts.ts`: no-tools notice generator
70
+ - `main/agent-priming.ts`: FBR prompt text cleanup (no tool-list guidance inside FBR prompts)
71
+
72
+ ## Acceptance checklist
73
+
74
+ - FBR system prompt has no tool instructions.
75
+ - Tool-related wording appears only in the separate `buildNoToolsNotice(...)`.
76
+ - FBR/non-FBR context assembly flow is structurally identical; only policy fields differ.
77
+ - Any FBR tool/function call or non-`@tellasker` tellask is hard-rejected with explicit feedback.
@@ -0,0 +1,77 @@
1
+ # FBR 实现细节(已落地)
2
+
3
+ 英文版:[English](./fbr-implementation.md)
4
+
5
+ 本文描述当前实现结构与约束。规范以 `fbr.zh.md` 为准。
6
+
7
+ ## 实现原则
8
+
9
+ - FBR 与非 FBR 共享同一条上下文装配流水线,差异只允许通过显式策略字段声明。
10
+ - system prompt 本体禁止工具说明;工具可用性仅通过独立“无工具提示”表达。
11
+ - 工具/诉请限制在运行时技术上强制,不依赖模型“自觉遵守”。
12
+
13
+ ## 代码结构
14
+
15
+ ### 1) 统一策略对象(`main/llm/driver.ts`)
16
+
17
+ 驱动阶段先构建 `DrivePolicy`,集中给出:
18
+
19
+ - `effectiveSystemPrompt`
20
+ - `effectiveAgentTools`
21
+ - `prependedContextMessages`
22
+ - `tellaskPolicy`
23
+ - `allowFunctionCalls`
24
+
25
+ 其中 FBR 策略会:
26
+
27
+ - 切换到 `buildFbrSystemPrompt(...)`(不含工具说明)
28
+ - 注入单独 `buildNoToolsNotice(...)`
29
+ - 强制 `effectiveAgentTools = []`
30
+ - 强制 `tellaskPolicy = tellasker_only`
31
+ - 强制 `allowFunctionCalls = false`
32
+ - 在需要时对成员应用 `fbr_model_params` 覆盖
33
+
34
+ ### 2) 统一上下文装配(`main/llm/driver.ts`)
35
+
36
+ 上下文通过 `buildDriveContextMessages(...)` 组装,FBR 与非 FBR 走同一函数;FBR 仅通过 `prependedContextMessages` 体现“无工具可见性”差异,不再在主流程里零散 `unshift/push` 特判。
37
+
38
+ ### 3) 统一违规判定(`main/llm/driver.ts`)
39
+
40
+ 流式与非流式两条路径都调用 `resolveDrivePolicyViolationKind(...)`:
41
+
42
+ - 违规 tellask(FBR 仅允许 `@tellasker`)
43
+ - 违规 function/tool call(FBR 禁止)
44
+
45
+ 一旦违规,统一产出 `formatDomindsNoteFbrToollessViolation(...)`,保持用户反馈与日志语义一致。
46
+
47
+ ### 4) FBR 隔离不变量硬校验(`main/llm/driver.ts`)
48
+
49
+ 驱动前会执行 `validateDrivePolicyInvariants(...)`,对 FBR 做 fail-fast 校验:
50
+
51
+ - system prompt 必须严格等于 `buildFbrSystemPrompt(...)`
52
+ - `effectiveAgentTools` 必须为空
53
+ - `allowFunctionCalls` 必须为 `false`
54
+ - `tellaskPolicy` 必须为 `tellasker_only`
55
+ - `prependedContextMessages` 必须且仅能包含一条 `buildNoToolsNotice(...)`
56
+
57
+ 若任一条件不满足,运行时直接抛出 `FBR policy isolation violation`,防止全局工具手册/工具提示路径回流污染 FBR。
58
+
59
+ ### 5) 单一“无工具提示”源(`main/minds/system-prompt-parts.ts`)
60
+
61
+ `buildNoToolsNotice(...)` 作为唯一工具可用性文案源,固定声明:
62
+
63
+ - 不能调用任何工具
64
+ - 不能访问 rtws / 文件 / 浏览器 / shell
65
+
66
+ ## 相关模块
67
+
68
+ - `main/llm/driver.ts`:策略、上下文装配、违规判定
69
+ - `main/minds/system-prompt-parts.ts`:无工具提示生成
70
+ - `main/agent-priming.ts`:FBR 引导文案去工具化(不在 FBR 提示词内讲工具清单)
71
+
72
+ ## 验收清单
73
+
74
+ - FBR system prompt 不包含工具说明。
75
+ - “无工具”文案仅来自独立 `buildNoToolsNotice(...)`。
76
+ - FBR 与非 FBR 的上下文装配主流程一致,差异只来自策略字段。
77
+ - FBR 中任意 tool/function call 或非 `@tellasker` tellask 都被运行时硬拒绝并给出明确回执。
package/dist/docs/fbr.md CHANGED
@@ -1,217 +1,219 @@
1
- # Fresh Boots Reasoning (FBR) — Design Doc (Enhanced `@self`)
1
+ # Fresh Boots Reasoning (FBR) — Mechanism Spec
2
2
 
3
3
  Chinese version: [中文版](./fbr.zh.md)
4
4
 
5
- ## Summary
5
+ > This is the **normative FBR spec**. For implementation notes, see: [`fbr-implementation.md`](./fbr-implementation.md).
6
6
 
7
- Fresh Boots Reasoning (FBR) is a common Dominds pattern: the agent tellasks itself (`!?@self`) to create a short-lived
8
- sideline dialog that reasons from first principles on a bounded sub-problem **without relying on existing dialog
9
- history**, then reports back to the caller.
7
+ ## 1. What it is
10
8
 
11
- This document specifies **enhancements** to the `@self`-initiated FBR flow:
9
+ **Fresh Boots Reasoning (FBR)** is a Dominds mechanism for “reasoning again from a clean slate” on a bounded sub-problem,
10
+ then reporting back to the mainline dialog.
12
11
 
13
- 1. **Tool-less FBR sideline dialogs**: FBR sideline dialogs created by `!?@self` MUST NOT have any tools/toolsets.
14
- Prompts MUST explicitly state that the tellaskee has **no tools** and can only reason from the tellask body.
15
- 2. **Configurable FBR concurrency** via `.minds/team.yaml` `fbr-effort` (default `3`):
16
- - `0` disables `!?@self` FBR for that teammate
17
- - `1..100` spawns that many FBR sideline dialogs per `!?@self`
18
- - `> 100` is a validation error
19
- 3. **FBR-only model parameter overrides** via `.minds/team.yaml` `fbr_model_params`, with the same schema as
20
- `model_params` / `model_param_options` (see `dominds/main/llm/defaults.yaml`).
12
+ In Dominds, FBR is triggered via Tellask syntax. `@self` is only the entry-point syntax (“tellask the current dialog
13
+ itself”); the mechanism is the runtime-enforced contract applied to the spawned sideline dialog(s).
21
14
 
22
- ## Goals
15
+ ## 2. Design principles and tradeoffs
23
16
 
24
- - Make `!?@self` FBR safer and more predictable by removing tool access and requiring explicit context.
25
- - Enable “many-shot” reasoning by spawning multiple FBR sideline dialogs concurrently (`fbr-effort`).
26
- - Allow tuning model parameters specifically for FBR (e.g. higher `temperature`) without affecting the mainline dialog.
17
+ ### 2.1 Predictability first: FBR is tool-less
27
18
 
28
- ## Non-goals
19
+ FBR is meant to be “reasoning over text”, not “an agent run that explores the environment”. To keep it safe and
20
+ predictable, FBR sideline dialogs must be:
29
21
 
30
- - Defining a brand-new user-facing syntax beyond existing `!?@self` / `!?@self !tellaskSession ...`.
31
- - Adding tools to FBR sideline dialogs (the entire point is that they are tool-less).
32
- - Changing teammate Tellask taxonomy in general (see [`dialog-system.md`](./dialog-system.md)); this doc scopes to `@self` only.
22
+ - **tool-less by construction** (technically enforced; not “please don’t use tools”), and
23
+ - **body-first** (the tellask body is the authoritative task context).
33
24
 
34
- ## Definitions
25
+ ### 2.2 No silent failure
35
26
 
36
- - **FBR**: Fresh Boots Reasoning reasoning from first principles without relying on existing dialog history.
37
- - **Tellask**: a structured request (`!?@...`) issued by a dialog to another dialog/teammate (including `@self`).
38
- - **tellasker / tellaskee**: requester / responder roles for a Tellask.
39
- - **Mainline dialog / sideline dialog**: user-facing terms for the primary thread and its temporary work threads.
40
- (Implementation terms like `root/main/subdialog` may appear in code; avoid surfacing them in prompts/examples.)
27
+ If FBR is disabled by configuration (e.g. `fbr-effort: 0`), the runtime MUST reject `!?@self` loudly and clearly. A
28
+ silent ignore is worse than an error.
41
29
 
42
- ## Runtime behavior: Tool-less `!?@self` FBR
30
+ ### 2.3 Many-shot reasoning, not “multi-agent collaboration”
43
31
 
44
- ### Trigger: which Tellasks are “FBR”
32
+ `fbr-effort` is for producing multiple _independent_ reasoning samples in parallel. The mainline dialog is responsible
33
+ for synthesis; FBR sidelines do not coordinate with each other.
45
34
 
46
- The following Tellasks are considered `@self` FBR:
35
+ ## 3. User syntax (`@self` is just the entry point)
47
36
 
48
- - Default (transient): `!?@self`
49
- - Rare (resumable): `!?@self !tellaskSession <tellaskSession>` (the sideline dialog carries its prior `tellaskSession` history)
37
+ ### 3.1 Trigger forms
50
38
 
51
- This spec applies to both forms: **any `@self` FBR sideline dialog is tool-less**.
39
+ Both forms below trigger FBR:
52
40
 
53
- ### Isolation contract
41
+ - **Default (transient)**: `!?@self`
42
+ - **Rare (resumable)**: `!?@self !tellaskSession <tellaskSession>`
54
43
 
55
- When the runtime drives an FBR sideline dialog created by `!?@self`, it MUST enforce:
44
+ Notes:
56
45
 
57
- - **No tools**:
58
- - no function tools
59
- - no MCP tools
60
- - no teammate Tellasks (including `!?@human`); the only exception is `!?@tellasker` (a sideline-only ask-back to the upstream tellasker dialog), and only when you must clarify critical missing context
61
- - **No caller-thread context dependency**:
62
- - the tellaskee MUST NOT assume access to the tellasker’s mainline/sideline dialog history
46
+ - `@self` means “tellask the current dialog itself (same agentId)”. It is an explicit self-tellask marker to avoid
47
+ accidental self-calls caused by echoing/quoting `@teammate` headlines.
48
+ - Resumability comes from `!tellaskSession`, not from `@self`.
49
+
50
+ ### 3.2 Scope
51
+
52
+ This document specifies the FBR mechanism and its `!?@self` contract. General teammate Tellasks (`!?@<teammate>`) follow
53
+ the taxonomy and capability model in [`dialog-system.md`](./dialog-system.md).
54
+
55
+ If you want a “fresh” sideline dialog that still has tools, do not use `@self`. Use an explicit teammate identity that
56
+ is granted the needed toolsets (or use the general `!?@<agentId>` mechanism intentionally).
57
+
58
+ ## 4. Runtime contract (normative)
59
+
60
+ This section uses MUST / MUST NOT / SHOULD / MAY for requirements.
61
+
62
+ ### 4.1 Isolation and context
63
+
64
+ When driving an FBR sideline dialog created by `!?@self`, runtime MUST enforce:
65
+
66
+ - **No dependency on tellasker dialog history**
67
+ - the tellaskee MUST NOT assume access to the tellasker’s mainline/sideline history
63
68
  - the tellaskee MUST treat the tellask body as the primary, authoritative task context
64
- - if using the resumable `!tellaskSession` form, the tellaskee MAY use its own prior `tellaskSession` history as explicit context
65
- - the tellaskee MUST NOT use tools to read files, browse, run shell commands, or fetch Memory/rtws (runtime workspace) state
69
+ - for the resumable `!tellaskSession` form, the tellaskee MAY use the sideline’s _own_ `tellaskSession` history as
70
+ explicit context
71
+ - **No tool-based context fetch**
72
+ - no reading files / running commands / browsing
73
+ - no accessing Memory or rtws (runtime workspace) state
66
74
 
67
- In practice, treat the tellaskee as “fresh relative to the caller thread”: it does not get the tellasker’s accumulated
68
- dialog history. It may still receive baseline, unconditionally injected context (persona/system policy, safety rules,
69
- formatting norms, read-only Memory excerpts, etc.), and the resumable `!tellaskSession` form includes its own prior
70
- session history.
75
+ Intuition: “fresh boots” means “fresh relative to the caller thread”, not “ignores baseline system rules”. Runtime may
76
+ still inject baseline policy/safety/formatting context, but the tellask body remains the authority (except when using
77
+ the sideline’s own resumable history).
71
78
 
72
- ### Prompting contract (system + tool prompts)
79
+ ### 4.2 Tool-less (prompt + technical enforcement)
73
80
 
74
- The runtime MUST make the tool-less constraint unambiguous in prompts.
81
+ Tool-less FBR has two layers, both required:
75
82
 
76
- ### API / transport contract (tool disablement)
83
+ 1. **Prompt contract**: the runtime must communicate the tool-less constraint unambiguously.
84
+ 2. **API/transport contract**: the runtime must make the request technically tool-less.
77
85
 
78
- The tool-less requirement is not just “prompt text”. The runtime MUST enforce it technically:
86
+ #### 4.2.1 System prompt requirements (no tool instructions)
79
87
 
80
- - The LLM request for an `@self` FBR sideline dialog MUST be issued with **zero tools available**:
81
- - do not include any tool/function definitions in the request payload (the effective tool list MUST be empty)
82
- - do not enable any “tool calling” mode / tool choice / function calling feature supported by the provider
83
- - The runtime MUST reject any attempt by the model to emit a tool call in FBR, even if the provider SDK would otherwise
84
- accept it.
88
+ The FBR system prompt MUST communicate (wording may vary, meaning must hold):
85
89
 
86
- #### System prompt requirements (minimum)
90
+ - this is an FBR sideline dialog; the tellask body is the primary context
91
+ - do not assume access to tellasker dialog history
92
+ - if critical context is missing, list what is missing and why it blocks reasoning
93
+ - `!?@tellasker` is allowed only when you must clarify critical missing context; otherwise do not emit any tellasks
87
94
 
88
- The FBR sideline dialog’s system prompt MUST clearly state:
95
+ And: the **system prompt body MUST NOT include tool instructions** (no tool lists, allowlists, example commands, “how to
96
+ use tools”, etc.).
89
97
 
90
- - You have **no tools** and cannot call tools.
91
- - You have **no direct rtws (runtime workspace) / files / browser / shell** access (tool calling is disabled).
92
- - The tellask body is the **primary task context**; do not assume any caller-thread history is available.
93
- - If this is a resumable `!tellaskSession` FBR, you may use your own prior `tellaskSession` history as explicit context.
94
- - If the tellask body is missing critical context, respond by listing what is missing and why it blocks reasoning.
95
- - `!?@tellasker` is allowed only when you must clarify critical missing context; otherwise do not emit any tellasks.
98
+ #### 4.2.2 Appended no tools notice (the only allowed tool-related text)
96
99
 
97
- #### Tool prompt requirements (when applicable)
100
+ All tool-availability wording MUST be confined to a separately injected “no tools” notice, and that notice MUST be:
98
101
 
99
- If the provider integration normally injects a tool prompt (or tool schema), then for `@self` FBR it MUST either:
102
+ - short, fixed, and non-extensible
103
+ - explicit: no tools available; do not call tools
104
+ - explicit: no access to rtws / files / browser / shell
105
+ - free of any tool lists, allowlists, example commands, or execution guidance
100
106
 
101
- - omit the tool prompt entirely, OR
102
- - inject a tool prompt that explicitly states “no tools are available; tool calling is disabled”
107
+ If a provider integration normally injects a tool prompt or schema, then for FBR it MUST either:
103
108
 
104
- There MUST NOT be any tool definitions visible to the FBR sideline dialog.
109
+ - omit it entirely, OR
110
+ - inject text that is identical to the appended “no tools” notice
105
111
 
106
- ### Output contract
112
+ Under no circumstances should the FBR sideline dialog see any tool definitions.
107
113
 
108
- The FBR sideline dialog should produce a compact reasoning artifact that is easy for the tellasker to integrate.
109
- Recommended structure (not rigidly required):
114
+ #### 4.2.3 The LLM request MUST be “zero tools”
110
115
 
111
- 1. **Answer / conclusion**
112
- 2. **Reasoning** (grounded in the tellask body; plus `tellaskSession` history if using the resumable form)
113
- 3. **Assumptions** (explicitly derived from the tellask body, unless clearly sourced from `tellaskSession` history)
114
- 4. **Unknowns / missing context** (if any)
115
- 5. **Next steps** (for the tellasker to take in the mainline dialog, where tools may exist)
116
+ The LLM request for an `@self` FBR sideline dialog MUST have **zero tools available**:
116
117
 
117
- ### Enforcement & error handling
118
+ - the request payload must not include tool/function definitions (effective tool list must be empty)
119
+ - provider tool-calling / function-calling modes must not be enabled
118
120
 
119
- - If the FBR sideline dialog attempts to emit a tool call, the runtime MUST treat it as a hard error for that sideline
120
- run and return a clear error back to the tellasker (do not silently ignore).
121
- - The error should be loud and debuggable (e.g., an explicit “tool_call_not_allowed_in_fbr” reason string in logs/events).
121
+ If the model attempts a tool/function call anyway, runtime MUST hard-reject it (see 4.5).
122
122
 
123
- ## Configuration: `.minds/team.yaml` additions
123
+ ### 4.3 Tellask restriction: only `!?@tellasker`
124
124
 
125
- Both additions are **per-teammate** and MAY also be placed under `member_defaults` to set rtws-wide defaults.
125
+ FBR sideline dialogs MUST NOT issue teammate Tellasks (including `!?@human`). The only exception is `!?@tellasker`:
126
126
 
127
- ### `fbr-effort` (default: `3`)
127
+ - sideline-only TellaskBack to the upstream tellasker dialog
128
+ - allowed only when critical context must be clarified
129
+ - intended for clarification, not delegation
128
130
 
129
- `fbr-effort` controls how many tool-less FBR sideline dialogs the runtime spawns for each `!?@self` Tellask.
131
+ ### 4.4 Output contract (easy to synthesize)
130
132
 
131
- Rules:
133
+ An FBR sideline dialog should produce a compact artifact that is easy for the tellasker to integrate. Suggested shape:
132
134
 
133
- - Type: integer
134
- - Default: `3` (the Chinese saying: “三个臭皮匠,顶个诸葛亮”)
135
- - `0`: disable `!?@self` FBR for that teammate
136
- - `1..100`: spawn that many FBR sideline dialogs concurrently per `!?@self`
137
- - `> 100`: validation error (reject team config; do not clamp)
138
- - `< 0` or non-integer: validation error
135
+ 1. **Conclusion**
136
+ 2. **Reasoning** (grounded in the tellask body; plus resumable history when applicable)
137
+ 3. **Assumptions** (explicitly sourced: body vs session history)
138
+ 4. **Unknowns / missing context**
139
+ 5. **Next steps for mainline** (where tools/teammates may exist)
139
140
 
140
- **Behavior when disabled (`fbr-effort: 0`)**:
141
+ ### 4.5 Violations and errors (loud + debuggable)
141
142
 
142
- - The runtime MUST reject `!?@self` Tellasks for that teammate with a clear, user-visible error (so failures are not silent).
143
+ - Any disallowed tellask (non-`@tellasker`) or any tool/function call attempt inside FBR MUST be treated as a hard
144
+ violation.
145
+ - The runtime MUST return a clear, user-visible error, and MUST log/emit a debuggable reason string (no silent swallow).
143
146
 
144
- ### Concurrency semantics (`fbr-effort > 1`)
147
+ ## 5. Concurrency: `fbr-effort`
145
148
 
146
- When `fbr-effort` is `N`:
149
+ `fbr-effort` is a per-member integer config (also allowed under `member_defaults` as rtws defaults):
147
150
 
148
- - The runtime expands a single `!?@self` Tellask into **N parallel tool-less FBR sideline dialogs**.
149
- - Each sideline dialog receives the same tellask body (and the same tool-less system/tool prompts).
150
- - The runtime returns all N responses to the tellasker. **Do not rely on any particular ordering**:
151
- - Responses may be injected/arrive in completion order (which is often effectively “mixed”).
152
- - For the resumable `!?@self !tellaskSession <tellaskSession>` form with `N > 1`, the runtime MUST derive **distinct**
153
- session keys so each parallel sideline dialog has independent history (recommended scheme: `<tellaskSession>.fbr<i>`).
151
+ - Type: integer
152
+ - Default: `3`
153
+ - `0`: disable `!?@self` FBR for that member (runtime MUST reject `!?@self` clearly)
154
+ - `1..100`: spawn N FBR sideline dialogs per `!?@self`
155
+ - `> 100` / non-integer / negative: validation error (reject; no clamping)
154
156
 
155
- The intent is to allow the tellasker (mainline) to synthesize multiple independent reasoning traces into a better decision.
157
+ When `fbr-effort = N`:
156
158
 
157
- ### `fbr_model_params` (optional)
159
+ - runtime expands a single `!?@self` into **N parallel tool-less FBR sideline dialogs**
160
+ - each sideline receives the same tellask body and the same tool-less constraints
161
+ - mainline receives all N responses; **ordering must not be relied on** (completion order is fine)
158
162
 
159
- `fbr_model_params` provides model parameter overrides used **only when driving `@self` FBR sideline dialogs**.
163
+ For resumable `!?@self !tellaskSession <tellaskSession>` with `N > 1`, runtime MUST derive **distinct** session keys so
164
+ parallel sidelines do not share history (recommended: `<tellaskSession>.fbr-<i>`).
160
165
 
161
- - Schema: identical to `model_params` (and documented via `model_param_options` in `dominds/main/llm/defaults.yaml`)
162
- - Scope: applies only to `!?@self` FBR sideline dialogs
163
- - The teammate’s normal `model_params` continue to apply to non-FBR runs
166
+ ## 6. FBR-only model overrides: `fbr_model_params`
164
167
 
165
- **Merge rule (recommended)**:
168
+ `fbr_model_params` overrides model params **only when driving FBR sideline dialogs**:
166
169
 
167
- - Compute the teammate’s effective `model_params` as usual (defaults + teammate overrides).
168
- - For `@self` FBR only, deep-merge `fbr_model_params` on top (so it can override just a few fields like `temperature`).
169
- - Provider-agnostic `max_tokens` may be configured either as `max_tokens` (top-level) or `general.max_tokens` (mirrors
170
- `model_param_options` grouping). Do not set both.
170
+ - Schema: identical to `model_params` (documented by `model_param_options` in `dominds/main/llm/defaults.yaml`)
171
+ - Scope: `!?@self` only
172
+ - Merge: recommended deep-merge on top of the member’s effective `model_params`
173
+ - `max_tokens` may be configured as top-level `max_tokens` or `general.max_tokens` (pick one; do not set both)
171
174
 
172
- ## Examples
175
+ ## 7. Examples
173
176
 
174
- ### Tool-less FBR: tellask body must include full context
177
+ ### 7.1 Tellask body should be self-contained
175
178
 
176
- Bad (relies on external context and tools):
179
+ Bad (depends on external context/tools):
177
180
 
178
181
  ```text
179
182
  !?@self
180
- Figure out what the bug is and fix it.
183
+ Find the bug and fix it.
181
184
  ```
182
185
 
183
- Good (self-contained context):
186
+ Good (puts the actual context into the body):
184
187
 
185
188
  ```text
186
189
  !?@self
187
- You are doing FBR with no tools. Use ONLY the text below.
190
+ You are doing tool-less FBR. Use ONLY the text below.
188
191
 
189
- Goal: explain the likely root cause and propose 2–3 fixes.
192
+ Goal: identify the most likely root cause and propose 2–3 viable fixes.
190
193
 
191
- Observed behavior:
194
+ Observed:
192
195
  - Clicking “Run” sometimes freezes the UI for ~10s.
193
196
 
194
- Constraints:
197
+ Constraint:
195
198
  - We cannot change the backend protocol.
196
199
 
197
- Relevant snippet:
198
- <paste the relevant log lines / code / stack trace here>
200
+ Evidence:
201
+ <paste relevant logs / code / stack trace here>
199
202
  ```
200
203
 
201
- ### `.minds/team.yaml` configuration
204
+ ### 7.2 `.minds/team.yaml`
202
205
 
203
206
  ```yaml
204
207
  member_defaults:
205
- # Spawn 3 tool-less FBR sideline dialogs per `!?@self` by default
206
- # (the Chinese saying: “三个臭皮匠,顶个诸葛亮”).
208
+ # Spawn 3 tool-less FBR sideline dialogs per `!?@self` by default.
207
209
  fbr-effort: 3
208
210
 
209
211
  members:
210
212
  ux:
211
- # Spawn 5 independent FBR sideline dialogs per `!?@self`.
213
+ # Spawn 5 independent reasoning samples per `!?@self`.
212
214
  fbr-effort: 5
213
215
 
214
- # Make FBR more exploratory without affecting mainline behavior.
216
+ # Make FBR more exploratory without changing mainline behavior.
215
217
  fbr_model_params:
216
218
  codex:
217
219
  temperature: 0.9
@@ -220,17 +222,16 @@ members:
220
222
  max_tokens: 1200
221
223
  ```
222
224
 
223
- ## Compatibility notes
225
+ ## 8. Relationship to general sideline dialogs
224
226
 
225
- - This spec intentionally makes `!?@self` behave differently from general transient sideline dialogs:
226
- normal `!?@<teammate>` sideline dialogs remain fully capable (they can have tools/toolsets) as specified in
227
- [`dialog-system.md`](./dialog-system.md).
228
- - If you need a tool-capable “fresh subdialog” for the same persona, use an explicit teammate identity that is granted
229
- the needed toolsets, rather than `@self`.
227
+ - `!?@self` is a special case: tool-less, body-first, tellask-restricted, optionally fanned out via `fbr-effort`.
228
+ - General `!?@<teammate>` sidelines remain fully capable (tools/toolsets as configured).
229
+ - If you need “same persona + tools” in a sideline, do not use `@self`; use an explicit teammate identity.
230
230
 
231
- ## Acceptance criteria (implementation checklist)
231
+ ## 9. Acceptance checklist
232
232
 
233
- - `!?@self` creates tool-less sideline dialog(s) with explicit prompt text stating no tools; body-only context”.
234
- - `fbr-effort` defaults to `3`, accepts `0..100`, rejects `>100` and non-integers.
235
- - `fbr-effort: 0` causes `!?@self` to fail loudly with a clear error.
236
- - `fbr_model_params` is applied only to `@self` FBR sideline dialogs and follows the same schema as `model_params`.
233
+ - `!?@self` triggers tool-less FBR; the LLM request is technicallyzero tools”.
234
+ - The system prompt body contains no tool instructions; tool-related wording comes only from the separate fixed notice.
235
+ - FBR sidelines cannot issue teammate Tellasks; only `!?@tellasker` is allowed when necessary.
236
+ - `fbr-effort` defaults to `3`, accepts `0..100`, rejects invalid values, and fails loudly when disabled.
237
+ - `fbr_model_params` applies only to FBR and follows the same schema/merge intent as `model_params`.