dominds 1.23.0 → 1.23.1

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 (113) hide show
  1. package/dist/access-control.js +4 -4
  2. package/dist/docs/encapsulated-taskdoc.md +11 -8
  3. package/dist/docs/encapsulated-taskdoc.zh.md +12 -9
  4. package/dist/minds/minds-i18n.js +2 -2
  5. package/dist/minds/system-prompt-parts.js +8 -8
  6. package/dist/runtime/driver-messages.js +4 -4
  7. package/dist/tools/ctrl.d.ts +1 -1
  8. package/dist/tools/ctrl.js +29 -27
  9. package/dist/tools/prompts/control/en/principles.md +2 -2
  10. package/dist/tools/prompts/control/en/scenarios.md +25 -4
  11. package/dist/tools/prompts/control/en/tools.md +17 -8
  12. package/dist/tools/prompts/control/zh/principles.md +2 -2
  13. package/dist/tools/prompts/control/zh/scenarios.md +25 -4
  14. package/dist/tools/prompts/control/zh/tools.md +17 -8
  15. package/dist/utils/task-package.d.ts +1 -1
  16. package/dist/utils/task-package.js +3 -4
  17. package/dist/utils/taskdoc.js +18 -23
  18. package/package.json +2 -2
  19. package/webapp/dist/assets/{_basePickBy-CGhMqD96.js → _basePickBy-C3SVVywm.js} +3 -3
  20. package/webapp/dist/assets/{_basePickBy-CGhMqD96.js.map → _basePickBy-C3SVVywm.js.map} +1 -1
  21. package/webapp/dist/assets/{_baseUniq-XCMW7z1Y.js → _baseUniq-egNq6cCa.js} +2 -2
  22. package/webapp/dist/assets/{_baseUniq-XCMW7z1Y.js.map → _baseUniq-egNq6cCa.js.map} +1 -1
  23. package/webapp/dist/assets/{arc-B6fzk0T5.js → arc-CASAlRvm.js} +2 -2
  24. package/webapp/dist/assets/{arc-B6fzk0T5.js.map → arc-CASAlRvm.js.map} +1 -1
  25. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-DmSI_GUt.js → architectureDiagram-2XIMDMQ5-B6n5FQmS.js} +7 -7
  26. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-DmSI_GUt.js.map → architectureDiagram-2XIMDMQ5-B6n5FQmS.js.map} +1 -1
  27. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-Bp0nb8IZ.js → blockDiagram-WCTKOSBZ-D2UGGjic.js} +7 -7
  28. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-Bp0nb8IZ.js.map → blockDiagram-WCTKOSBZ-D2UGGjic.js.map} +1 -1
  29. package/webapp/dist/assets/{c4Diagram-IC4MRINW-gYpylqGb.js → c4Diagram-IC4MRINW-BOY_bQFP.js} +3 -3
  30. package/webapp/dist/assets/{c4Diagram-IC4MRINW-gYpylqGb.js.map → c4Diagram-IC4MRINW-BOY_bQFP.js.map} +1 -1
  31. package/webapp/dist/assets/{channel-BmQ3YyUn.js → channel-CZ_X09H1.js} +2 -2
  32. package/webapp/dist/assets/{channel-BmQ3YyUn.js.map → channel-CZ_X09H1.js.map} +1 -1
  33. package/webapp/dist/assets/{chunk-4BX2VUAB-B5pwFRwA.js → chunk-4BX2VUAB-BIwyAzZQ.js} +2 -2
  34. package/webapp/dist/assets/{chunk-4BX2VUAB-B5pwFRwA.js.map → chunk-4BX2VUAB-BIwyAzZQ.js.map} +1 -1
  35. package/webapp/dist/assets/{chunk-55IACEB6-CZf6oMWM.js → chunk-55IACEB6-zSjTFoCX.js} +2 -2
  36. package/webapp/dist/assets/{chunk-55IACEB6-CZf6oMWM.js.map → chunk-55IACEB6-zSjTFoCX.js.map} +1 -1
  37. package/webapp/dist/assets/{chunk-FMBD7UC4-yZWCDzVz.js → chunk-FMBD7UC4-CTpuRfdB.js} +2 -2
  38. package/webapp/dist/assets/{chunk-FMBD7UC4-yZWCDzVz.js.map → chunk-FMBD7UC4-CTpuRfdB.js.map} +1 -1
  39. package/webapp/dist/assets/{chunk-JSJVCQXG-Cg1ST73M.js → chunk-JSJVCQXG-CJ3DM4in.js} +2 -2
  40. package/webapp/dist/assets/{chunk-JSJVCQXG-Cg1ST73M.js.map → chunk-JSJVCQXG-CJ3DM4in.js.map} +1 -1
  41. package/webapp/dist/assets/{chunk-KX2RTZJC-ByGtlX9q.js → chunk-KX2RTZJC-B97EakhO.js} +2 -2
  42. package/webapp/dist/assets/{chunk-KX2RTZJC-ByGtlX9q.js.map → chunk-KX2RTZJC-B97EakhO.js.map} +1 -1
  43. package/webapp/dist/assets/{chunk-NQ4KR5QH-DoXvfhSY.js → chunk-NQ4KR5QH-5o1o5x0z.js} +4 -4
  44. package/webapp/dist/assets/{chunk-NQ4KR5QH-DoXvfhSY.js.map → chunk-NQ4KR5QH-5o1o5x0z.js.map} +1 -1
  45. package/webapp/dist/assets/{chunk-QZHKN3VN-2gX2qsHB.js → chunk-QZHKN3VN-D33FSIEb.js} +2 -2
  46. package/webapp/dist/assets/{chunk-QZHKN3VN-2gX2qsHB.js.map → chunk-QZHKN3VN-D33FSIEb.js.map} +1 -1
  47. package/webapp/dist/assets/{chunk-WL4C6EOR-L-9bPNxS.js → chunk-WL4C6EOR-C2InqFin.js} +6 -6
  48. package/webapp/dist/assets/{chunk-WL4C6EOR-L-9bPNxS.js.map → chunk-WL4C6EOR-C2InqFin.js.map} +1 -1
  49. package/webapp/dist/assets/{classDiagram-VBA2DB6C-B79Oe3Df.js → classDiagram-VBA2DB6C-BfLZmK48.js} +7 -7
  50. package/webapp/dist/assets/{classDiagram-VBA2DB6C-B79Oe3Df.js.map → classDiagram-VBA2DB6C-BfLZmK48.js.map} +1 -1
  51. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-B79Oe3Df.js → classDiagram-v2-RAHNMMFH-BfLZmK48.js} +7 -7
  52. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-B79Oe3Df.js.map → classDiagram-v2-RAHNMMFH-BfLZmK48.js.map} +1 -1
  53. package/webapp/dist/assets/{clone-DvlY9Sdn.js → clone-BSCHnHfl.js} +2 -2
  54. package/webapp/dist/assets/{clone-DvlY9Sdn.js.map → clone-BSCHnHfl.js.map} +1 -1
  55. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CtkGd0W6.js → cose-bilkent-S5V4N54A-CeQ1jAJJ.js} +2 -2
  56. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CtkGd0W6.js.map → cose-bilkent-S5V4N54A-CeQ1jAJJ.js.map} +1 -1
  57. package/webapp/dist/assets/{dagre-KLK3FWXG-B3W6QTXQ.js → dagre-KLK3FWXG-WUuNYzcK.js} +7 -7
  58. package/webapp/dist/assets/{dagre-KLK3FWXG-B3W6QTXQ.js.map → dagre-KLK3FWXG-WUuNYzcK.js.map} +1 -1
  59. package/webapp/dist/assets/{diagram-E7M64L7V-B6-J_E5Q.js → diagram-E7M64L7V-jOVCIExP.js} +8 -8
  60. package/webapp/dist/assets/{diagram-E7M64L7V-B6-J_E5Q.js.map → diagram-E7M64L7V-jOVCIExP.js.map} +1 -1
  61. package/webapp/dist/assets/{diagram-IFDJBPK2-C-PH_Yx3.js → diagram-IFDJBPK2-cCeQqotA.js} +7 -7
  62. package/webapp/dist/assets/{diagram-IFDJBPK2-C-PH_Yx3.js.map → diagram-IFDJBPK2-cCeQqotA.js.map} +1 -1
  63. package/webapp/dist/assets/{diagram-P4PSJMXO-CB5xXDup.js → diagram-P4PSJMXO-DjAYFRLv.js} +7 -7
  64. package/webapp/dist/assets/{diagram-P4PSJMXO-CB5xXDup.js.map → diagram-P4PSJMXO-DjAYFRLv.js.map} +1 -1
  65. package/webapp/dist/assets/{erDiagram-INFDFZHY-CuAhTGVU.js → erDiagram-INFDFZHY-Dl_6U5fV.js} +5 -5
  66. package/webapp/dist/assets/{erDiagram-INFDFZHY-CuAhTGVU.js.map → erDiagram-INFDFZHY-Dl_6U5fV.js.map} +1 -1
  67. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-D3cIOfGj.js → flowDiagram-PKNHOUZH-D80nrZ3S.js} +7 -7
  68. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-D3cIOfGj.js.map → flowDiagram-PKNHOUZH-D80nrZ3S.js.map} +1 -1
  69. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-CSFhVYXV.js → ganttDiagram-A5KZAMGK-T3WdMrgj.js} +3 -3
  70. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-CSFhVYXV.js.map → ganttDiagram-A5KZAMGK-T3WdMrgj.js.map} +1 -1
  71. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-CiEaxACG.js → gitGraphDiagram-K3NZZRJ6-ifV-jkKL.js} +8 -8
  72. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-CiEaxACG.js.map → gitGraphDiagram-K3NZZRJ6-ifV-jkKL.js.map} +1 -1
  73. package/webapp/dist/assets/{graph-CYGALRuy.js → graph-D5jmnb35.js} +3 -3
  74. package/webapp/dist/assets/{graph-CYGALRuy.js.map → graph-D5jmnb35.js.map} +1 -1
  75. package/webapp/dist/assets/{index-BTazqQrV.js → index-CGbZlct2.js} +503 -142
  76. package/webapp/dist/assets/{index-BTazqQrV.js.map → index-CGbZlct2.js.map} +1 -1
  77. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-CiWJjQyU.js → infoDiagram-LFFYTUFH-C340CY5x.js} +6 -6
  78. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-CiWJjQyU.js.map → infoDiagram-LFFYTUFH-C340CY5x.js.map} +1 -1
  79. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-MlIIUO7o.js → ishikawaDiagram-PHBUUO56-Bu4RsELK.js} +2 -2
  80. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-MlIIUO7o.js.map → ishikawaDiagram-PHBUUO56-Bu4RsELK.js.map} +1 -1
  81. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-BBqwkA3d.js → journeyDiagram-4ABVD52K-Dvv3ypKA.js} +5 -5
  82. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-BBqwkA3d.js.map → journeyDiagram-4ABVD52K-Dvv3ypKA.js.map} +1 -1
  83. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-BS4GzDbo.js → kanban-definition-K7BYSVSG-D_rsetjW.js} +3 -3
  84. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-BS4GzDbo.js.map → kanban-definition-K7BYSVSG-D_rsetjW.js.map} +1 -1
  85. package/webapp/dist/assets/{layout-DaJO-1DW.js → layout-CLmOfwnS.js} +5 -5
  86. package/webapp/dist/assets/{layout-DaJO-1DW.js.map → layout-CLmOfwnS.js.map} +1 -1
  87. package/webapp/dist/assets/{linear-SWy2Cl7G.js → linear-DFAmViqi.js} +2 -2
  88. package/webapp/dist/assets/{linear-SWy2Cl7G.js.map → linear-DFAmViqi.js.map} +1 -1
  89. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-B_gNrT3l.js → mindmap-definition-YRQLILUH-Ce3_czeS.js} +4 -4
  90. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-B_gNrT3l.js.map → mindmap-definition-YRQLILUH-Ce3_czeS.js.map} +1 -1
  91. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-CVh3lLBA.js → pieDiagram-SKSYHLDU-U6_un5Sc.js} +8 -8
  92. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-CVh3lLBA.js.map → pieDiagram-SKSYHLDU-U6_un5Sc.js.map} +1 -1
  93. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-D0zAkVD7.js → quadrantDiagram-337W2JSQ-DmVJQItS.js} +3 -3
  94. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-D0zAkVD7.js.map → quadrantDiagram-337W2JSQ-DmVJQItS.js.map} +1 -1
  95. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP--CTFD60w.js → requirementDiagram-Z7DCOOCP-BkNhSY-g.js} +4 -4
  96. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP--CTFD60w.js.map → requirementDiagram-Z7DCOOCP-BkNhSY-g.js.map} +1 -1
  97. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-XZnViaAX.js → sankeyDiagram-WA2Y5GQK-E3UEy5SX.js} +2 -2
  98. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-XZnViaAX.js.map → sankeyDiagram-WA2Y5GQK-E3UEy5SX.js.map} +1 -1
  99. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-BWAMhn_x.js → sequenceDiagram-2WXFIKYE-k0w9WKAO.js} +4 -4
  100. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-BWAMhn_x.js.map → sequenceDiagram-2WXFIKYE-k0w9WKAO.js.map} +1 -1
  101. package/webapp/dist/assets/{stateDiagram-RAJIS63D--jsLD0Dg.js → stateDiagram-RAJIS63D-DRgdJrlx.js} +9 -9
  102. package/webapp/dist/assets/{stateDiagram-RAJIS63D--jsLD0Dg.js.map → stateDiagram-RAJIS63D-DRgdJrlx.js.map} +1 -1
  103. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DUG9vyI5.js → stateDiagram-v2-FVOUBMTO-edtkX9x6.js} +5 -5
  104. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DUG9vyI5.js.map → stateDiagram-v2-FVOUBMTO-edtkX9x6.js.map} +1 -1
  105. package/webapp/dist/assets/{timeline-definition-YZTLITO2-BROLp1hL.js → timeline-definition-YZTLITO2-D0zyXyNL.js} +3 -3
  106. package/webapp/dist/assets/{timeline-definition-YZTLITO2-BROLp1hL.js.map → timeline-definition-YZTLITO2-D0zyXyNL.js.map} +1 -1
  107. package/webapp/dist/assets/{treemap-KZPCXAKY-BXuIlbYo.js → treemap-KZPCXAKY-CglsYqbQ.js} +5 -5
  108. package/webapp/dist/assets/{treemap-KZPCXAKY-BXuIlbYo.js.map → treemap-KZPCXAKY-CglsYqbQ.js.map} +1 -1
  109. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BXWd8gBB.js → vennDiagram-LZ73GAT5-DsUizzvt.js} +2 -2
  110. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BXWd8gBB.js.map → vennDiagram-LZ73GAT5-DsUizzvt.js.map} +1 -1
  111. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-DR5z9o6h.js → xychartDiagram-JWTSCODW-DvYQ4zKY.js} +3 -3
  112. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-DR5z9o6h.js.map → xychartDiagram-JWTSCODW-DvYQ4zKY.js.map} +1 -1
  113. package/webapp/dist/index.html +1 -1
@@ -311,13 +311,13 @@ function getAccessDeniedMessage(operation, targetPath, language = 'en') {
311
311
  lines.push('');
312
312
  if (language === 'zh') {
313
313
  lines.push(`- 说明:\`*.tsk/\` 是封装差遣牒。通用文件工具无法读/写/列目录/删除其中内容(硬编码无条件拒绝)。`);
314
- lines.push(`- 提示:新增章节请使用 \`do_mind\`;少量追加请使用 \`mind_more\`(默认 progress:\`mind_more({\"items\":[\"...\"]})\`);改写已有整章请使用带当前内容哈希的 \`change_mind\`(顶层:\`change_mind({\"selector\":\"goals|constraints|progress\",\"content\":\"...\",\"previous_content_hash\":\"sha256:...\"})\`;额外章节:先 \`recall_taskdoc\` 取得 \`content_hash\`,再 \`change_mind({\"category\":\"<category>\",\"selector\":\"<selector>\",\"content\":\"...\",\"previous_content_hash\":\"sha256:...\"})\`)。`);
315
- lines.push(`- 提示:读取额外章节请使用函数工具 \`recall_taskdoc\`:\`recall_taskdoc({\"category\":\"<category>\",\"selector\":\"<selector>\"})\`。`);
314
+ lines.push(`- 提示:新增章节请使用 \`do_mind\`;少量追加请使用 \`mind_more\`(默认 progress:\`mind_more({\"items\":[\"...\"]})\`);改写已有整章请先用 \`recall_taskdoc\` 取得当前内容哈希,再使用带 \`previous_content_hash\` 的 \`change_mind\`(顶层示例:先 \`recall_taskdoc({\"selector\":\"progress\"})\`,再 \`change_mind({\"selector\":\"progress\",\"content\":\"...\",\"previous_content_hash\":\"crc32:...\"})\`;额外章节:先 \`recall_taskdoc({\"category\":\"<category>\",\"selector\":\"<selector>\"})\`,再 \`change_mind({\"category\":\"<category>\",\"selector\":\"<selector>\",\"content\":\"...\",\"previous_content_hash\":\"crc32:...\"})\`)。`);
315
+ lines.push(`- 提示:读取章节或取得 content_hash 请使用函数工具 \`recall_taskdoc\`:顶层 \`recall_taskdoc({\"selector\":\"progress\"})\`;额外章节 \`recall_taskdoc({\"category\":\"<category>\",\"selector\":\"<selector>\"})\`。`);
316
316
  }
317
317
  else {
318
318
  lines.push(`- Note: \`*.tsk/\` is an encapsulated Taskdoc. It is hard-denied for all general file tools.`);
319
- lines.push(`- Hint: To create a section, use \`do_mind\`; for small append-only updates, use \`mind_more\` (defaults to progress: \`mind_more({\"items\":[\"...\"]})\`); for full-section replacements, use \`change_mind\` with the current content hash (top-level: \`change_mind({\"selector\":\"goals|constraints|progress\",\"content\":\"...\",\"previous_content_hash\":\"sha256:...\"})\`; extra sections: call \`recall_taskdoc\` for \`content_hash\` first, then \`change_mind({\"category\":\"<category>\",\"selector\":\"<selector>\",\"content\":\"...\",\"previous_content_hash\":\"sha256:...\"})\`).`);
320
- lines.push(`- Hint: To read extra sections, use \`recall_taskdoc({\"category\":\"<category>\",\"selector\":\"<selector>\"})\`.`);
319
+ lines.push(`- Hint: To create a section, use \`do_mind\`; for small append-only updates, use \`mind_more\` (defaults to progress: \`mind_more({\"items\":[\"...\"]})\`); for full-section replacements, call \`recall_taskdoc\` for the current content hash first, then use \`change_mind\` with \`previous_content_hash\` (top-level example: first \`recall_taskdoc({\"selector\":\"progress\"})\`, then \`change_mind({\"selector\":\"progress\",\"content\":\"...\",\"previous_content_hash\":\"crc32:...\"})\`; extra sections: first \`recall_taskdoc({\"category\":\"<category>\",\"selector\":\"<selector>\"})\`, then \`change_mind({\"category\":\"<category>\",\"selector\":\"<selector>\",\"content\":\"...\",\"previous_content_hash\":\"crc32:...\"})\`).`);
320
+ lines.push(`- Hint: To read a section or get content_hash, use \`recall_taskdoc\`: top-level \`recall_taskdoc({\"selector\":\"progress\"})\`; extra section \`recall_taskdoc({\"category\":\"<category>\",\"selector\":\"<selector>\"})\`.`);
321
321
  }
322
322
  }
323
323
  if (isMindsPath(targetPath)) {
@@ -149,7 +149,7 @@ Below is the canonical copy. If you need to rephrase it for UI layout, you MUST
149
149
 
150
150
  - Any `.tsk/` directory and its subpaths (`**/*.tsk/**`) are encapsulated state: general file tools MUST NOT read/write/list them (e.g. `read_file` / `write_file` / `list_dir`).
151
151
  - Taskdoc updates MUST go through explicit Taskdoc function tools: `do_mind` creates a new section, `mind_more` appends small entries to an existing section, `change_mind` replaces an existing section, and `never_mind` deletes a section.
152
- - To read extra sections that are NOT auto-injected, use the function tool `recall_taskdoc({ category, selector })`.
152
+ - To read any Taskdoc section or get its `content_hash`, use the function tool `recall_taskdoc({ selector, category? })`.
153
153
 
154
154
  **Taskdoc auto-injection rules (system prompt)**
155
155
 
@@ -219,25 +219,25 @@ Hard prohibitions:
219
219
  - `contracts|acceptance|grants|runbook|decisions|risks` MUST NOT be written outside `category="bearinmind"`.
220
220
  - No other category is auto-injected into the system prompt (only an index may be shown).
221
221
 
222
- `previous_content_hash` is the `sha256:...` hash of the current section content after Dominds' canonical Markdown file-ending normalization. It is not stored as extra state.
222
+ `previous_content_hash` is the `crc32:...` checksum of the current section content after Dominds' canonical Markdown file-ending normalization. It is not stored as extra state.
223
223
 
224
- - For auto-injected top-level sections (`goals`, `constraints`, `progress`), the injected Taskdoc status block shows each current `content_hash`.
225
- - For non-auto-injected sections, call `recall_taskdoc({ category, selector })`; its result includes `content_hash`.
224
+ - For top-level sections (`goals`, `constraints`, `progress`), call `recall_taskdoc({ selector })`; its result includes `content_hash`.
225
+ - For extra non-auto-injected sections, call `recall_taskdoc({ category, selector })`; its result includes `content_hash`.
226
226
  - On hash mismatch, the write MUST fail. The agent must re-read/review the current section and retry only after fully merging existing content.
227
227
  - If the proposed replacement would overwrite, delete, or materially replace existing content, the agent must have either direct human confirmation for that replacement, or a human-approved explicit SOP/acceptance standard that authorizes the replacement after considering the existing content.
228
228
 
229
- ### `recall_taskdoc` (read-only; for non-auto-injected sections)
229
+ ### `recall_taskdoc` (read-only; for Taskdoc sections and content_hash)
230
230
 
231
231
  Because general file tools cannot read anything under `*.tsk/`, Dominds provides a dedicated read tool:
232
232
 
233
233
  ```
234
- recall_taskdoc({ category, selector })
234
+ recall_taskdoc({ selector, category? })
235
235
  ```
236
236
 
237
237
  Behavior:
238
238
 
239
239
  - Reads `bearinmind/<whitelisted>.md` or `<category>/<selector>.md`.
240
- - The top-level three sections (`goals` / `constraints` / `progress`) are already auto-injected, so `recall_taskdoc` does not read them.
240
+ - The top-level three sections (`goals` / `constraints` / `progress`) are auto-injected as content, but their `content_hash` is only returned by `recall_taskdoc`.
241
241
  - Returns the section `content_hash` for use as `change_mind.previous_content_hash`.
242
242
 
243
243
  Example (bearinmind):
@@ -257,8 +257,11 @@ Call the function tool `recall_taskdoc` with:
257
257
  Example:
258
258
 
259
259
  ```text
260
+ Call the function tool `recall_taskdoc` with:
261
+ { "selector": "constraints" }
262
+
260
263
  Call the function tool `change_mind` with:
261
- { "selector": "constraints", "content": "- MUST not browse the web.\n- MUST keep responses under 10 lines unless asked otherwise.\n", "previous_content_hash": "sha256:..." }
264
+ { "selector": "constraints", "content": "- MUST not browse the web.\n- MUST keep responses under 10 lines unless asked otherwise.\n", "previous_content_hash": "crc32:..." }
262
265
  ```
263
266
 
264
267
  ### Behavioral rules
@@ -148,7 +148,7 @@ Dominds 必须从任务包构造一个**有效差遣牒**用于提示词和 UI
148
148
 
149
149
  - 任何 `.tsk/` 目录及其子路径(`**/*.tsk/**`)都是封装状态:禁止使用任何通用文件工具读取/写入/列目录(例如 `read_file` / `write_file` / `list_dir` 等)。
150
150
  - 更新差遣牒只能使用显式差遣牒函数工具:`do_mind` 创建新章节,`mind_more` 向已有章节追加少量条目,`change_mind` 替换已有章节,`never_mind` 删除章节。
151
- - 读取"不会自动注入上下文"的额外章节,只能使用函数工具 `recall_taskdoc({ category, selector })`。
151
+ - 读取任意差遣牒章节或取得其 `content_hash`,只能使用函数工具 `recall_taskdoc({ selector, category? })`。
152
152
 
153
153
  **差遣牒自动注入规则(系统提示)**
154
154
 
@@ -164,7 +164,7 @@ Dominds 必须从任务包构造一个**有效差遣牒**用于提示词和 UI
164
164
 
165
165
  - Any `.tsk/` directory and its subpaths (`**/*.tsk/**`) are encapsulated state: general file tools MUST NOT read/write/list them (e.g. `read_file` / `write_file` / `list_dir`).
166
166
  - Taskdoc updates MUST go through explicit Taskdoc function tools: `do_mind` creates a new section, `mind_more` appends small entries to an existing section, `change_mind` replaces an existing section, and `never_mind` deletes a section.
167
- - To read extra sections that are NOT auto-injected, use the function tool `recall_taskdoc({ category, selector })`.
167
+ - To read any Taskdoc section or get its `content_hash`, use the function tool `recall_taskdoc({ selector, category? })`.
168
168
 
169
169
  **Taskdoc auto-injection rules (system prompt)**
170
170
 
@@ -230,25 +230,25 @@ Dominds 必须从任务包构造一个**有效差遣牒**用于提示词和 UI
230
230
  - `contracts|acceptance|grants|runbook|decisions|risks` 不得在 `category="bearinmind"` 之外编写。
231
231
  - 没有其他类别会自动注入系统提示(只会显示一个索引)。
232
232
 
233
- `previous_content_hash` 是当前章节内容在 Dominds 规范化 Markdown 文件结尾之后得到的 `sha256:...` 哈希;它不是额外持久状态。
233
+ `previous_content_hash` 是当前章节内容在 Dominds 规范化 Markdown 文件结尾之后得到的 `crc32:...` 校验值;它不是额外持久状态。
234
234
 
235
- - 顶层自动注入章节(`goals`、`constraints`、`progress`)的当前 `content_hash` 会显示在注入的差遣牒状态块中。
236
- - 非自动注入章节需要先调用 `recall_taskdoc({ category, selector })`;返回结果会包含 `content_hash`。
235
+ - 顶层章节(`goals`、`constraints`、`progress`)需要调用 `recall_taskdoc({ selector })`;返回结果会包含 `content_hash`。
236
+ - 额外非自动注入章节需要调用 `recall_taskdoc({ category, selector })`;返回结果会包含 `content_hash`。
237
237
  - 哈希不匹配时写入必须失败。智能体必须重新读取/回顾当前章节,并且只在充分合并原有内容后重试。
238
238
  - 如果拟替换内容会冲掉、删除或实质替换原有内容,智能体必须已获得该替换的直接人类确认,或存在人类认可的明确 SOP/验收标准,并且已按该标准考虑过原有内容。
239
239
 
240
- ### `recall_taskdoc`(只读;用于非自动注入的部分)
240
+ ### `recall_taskdoc`(只读;用于差遣牒章节与 content_hash)
241
241
 
242
242
  因为通用文件工具无法读取 `*.tsk/` 下的任何内容,Dominds 提供了一个专门的读取工具:
243
243
 
244
244
  ```
245
- recall_taskdoc({ category, selector })
245
+ recall_taskdoc({ selector, category? })
246
246
  ```
247
247
 
248
248
  行为:
249
249
 
250
250
  - 读取 `bearinmind/<whitelisted>.md` 或 `<category>/<selector>.md`。
251
- - 顶层三段(`goals` / `constraints` / `progress`)已经自动注入,因此 `recall_taskdoc` 不会读取它们。
251
+ - 顶层三段(`goals` / `constraints` / `progress`)会自动注入正文,但其 `content_hash` 只通过 `recall_taskdoc` 返回。
252
252
  - 返回章节 `content_hash`,供 `change_mind.previous_content_hash` 使用。
253
253
 
254
254
  示例(bearinmind):
@@ -268,8 +268,11 @@ recall_taskdoc({ category, selector })
268
268
  示例:
269
269
 
270
270
  ```text
271
+ 使用函数工具 `recall_taskdoc` 调用:
272
+ { "selector": "constraints" }
273
+
271
274
  使用函数工具 `change_mind` 调用:
272
- { "selector": "constraints", "content": "- MUST not browse the web.\n- MUST keep responses under 10 lines unless asked otherwise.\n" }
275
+ { "selector": "constraints", "content": "- MUST not browse the web.\n- MUST keep responses under 10 lines unless asked otherwise.\n", "previous_content_hash": "crc32:..." }
273
276
  ```
274
277
 
275
278
  ### 行为规则
@@ -55,7 +55,7 @@ function taskdocCanonicalCopy(language) {
55
55
  '',
56
56
  '- 任何 `.tsk/` 目录及其子路径(`**/*.tsk/**`)都是封装状态:禁止使用任何通用文件工具读取/写入/列目录(例如 `read_file` / `write_file` / `list_dir` 等)。',
57
57
  '- 更新 Taskdoc 只能使用函数工具 `do_mind` / `mind_more` / `change_mind` / `never_mind`:缺失章节用 `do_mind` 创建;少量新增用 `mind_more` 追加(默认 progress);需要删除陈旧项、重排或压缩时用 `change_mind` 整章替换;确需删除整章文件时用 `never_mind`。',
58
- '- 读取“不会自动注入上下文”的额外章节,只能使用函数工具 `recall_taskdoc({ category, selector })`。',
58
+ '- 读取章节或取得 `change_mind.previous_content_hash` 需要使用函数工具 `recall_taskdoc({ selector, category? })`;顶层三段省略 `category`,额外章节传入 `category`。',
59
59
  '',
60
60
  '**Taskdoc 自动注入规则(系统提示)**',
61
61
  '',
@@ -71,7 +71,7 @@ function taskdocCanonicalCopy(language) {
71
71
  '',
72
72
  '- Any `.tsk/` directory and its subpaths (`**/*.tsk/**`) are encapsulated state: general file tools MUST NOT read/write/list them (e.g. `read_file` / `write_file` / `list_dir`).',
73
73
  '- Taskdoc updates MUST go through `do_mind` / `mind_more` / `change_mind` / `never_mind`: use `do_mind` to create missing sections, use `mind_more` for small append-only additions (defaults to progress), use `change_mind` for full-section replacement when cleanup, reordering, or compression is needed, and use `never_mind` when a whole section file should be deleted.',
74
- '- To read extra sections that are NOT auto-injected, use the function tool `recall_taskdoc({ category, selector })`.',
74
+ '- To read a section or get `change_mind.previous_content_hash`, use the function tool `recall_taskdoc({ selector, category? })`; omit `category` for top-level sections and pass it for extra sections.',
75
75
  '',
76
76
  '**Taskdoc auto-injection rules (system prompt)**',
77
77
  '',
@@ -148,11 +148,11 @@ function getMemoryPromptCopy(ctx) {
148
148
  const taskdocLogLineZh = ctx.contextHealthPromptMode === 'critical'
149
149
  ? ctx.isSideDialog
150
150
  ? '当前是告急处置态:支线对话不要维护差遣牒,也不要整理差遣牒更新提案;把当前对话历史中下一程需要知道的讨论细节、下一步、关键定位、运行/验证信息、临时路径/ID/样例输入和恢复依据写入接续包提醒项。提醒项长度没有技术限制,宁可完整一些;允许多条粗略提醒项求稳,但不要在当前程提前做“新一程清醒复核”。系统真正开启新一程后,第一步再复核整理:删除冗余、纠正偏激/失真思路,再收敛成高质量提醒项。'
151
- : '不要把长日志/大段 tool output 直接塞进差遣牒;差遣牒只写结论+下一步。当前是告急处置态:先检查当前对话历史里尚未落文档的讨论细节;能作为全队共享状态/决策/约束/目标的,主线优先用 `do_mind` 新增章节保存;只有在确实需要改写已有章节、已完成合并且能带上当前 `content_hash` 作为 `previous_content_hash` 时,才用 `change_mind`。接续包提醒项只留差遣牒仍未覆盖、但恢复工作容易丢的细节;本程允许先保留多条粗略提醒项求稳,但不要在当前程提前做“新一程清醒复核”。系统真正开启新一程后,第一步再复核整理:删除冗余、纠正偏激/失真思路,再收敛成高质量提醒项。'
151
+ : '不要把长日志/大段 tool output 直接塞进差遣牒;差遣牒只写结论+下一步。当前是告急处置态:先检查当前对话历史里尚未落文档的讨论细节;能作为全队共享状态/决策/约束/目标的,主线优先用 `do_mind` 新增章节保存;只有在确实需要改写已有章节、已完成合并并先调用 `recall_taskdoc` 取得当前 `content_hash` 作为 `previous_content_hash` 时,才用 `change_mind`。接续包提醒项只留差遣牒仍未覆盖、但恢复工作容易丢的细节;本程允许先保留多条粗略提醒项求稳,但不要在当前程提前做“新一程清醒复核”。系统真正开启新一程后,第一步再复核整理:删除冗余、纠正偏激/失真思路,再收敛成高质量提醒项。'
152
152
  : ctx.contextHealthPromptMode === 'caution'
153
153
  ? ctx.isSideDialog
154
154
  ? '当前是吃紧处置态:支线对话不要维护差遣牒,也不要整理差遣牒更新提案;把当前对话历史中下一程需要知道的讨论细节、下一步、关键定位、运行/验证信息、临时路径/ID/样例输入和恢复依据写入接续包提醒项。提醒项长度没有技术限制,宁可完整一些;若一时来不及,可先保留多条粗略提醒项过桥,但不要在当前程提前做“新一程清醒复核”。系统真正开启新一程后,第一步再复核整理:删除冗余、纠正偏激/失真思路,再收敛成高质量提醒项。'
155
- : '不要把长日志/大段 tool output 直接塞进差遣牒;差遣牒只写结论+下一步。当前是吃紧处置态:先检查当前对话历史里尚未落文档的讨论细节;能作为全队共享状态/决策/约束/目标的,主线优先用 `do_mind` 新增章节保存;只有在确实需要改写已有章节、已完成合并且能带上当前 `content_hash` 作为 `previous_content_hash` 时,才用 `change_mind`。接续包提醒项只留差遣牒仍未覆盖、但恢复工作容易丢的细节;若一时来不及,可先保留多条粗略提醒项过桥,但不要在当前程提前做“新一程清醒复核”。系统真正开启新一程后,第一步再复核整理:删除冗余、纠正偏激/失真思路,再收敛成高质量提醒项。'
155
+ : '不要把长日志/大段 tool output 直接塞进差遣牒;差遣牒只写结论+下一步。当前是吃紧处置态:先检查当前对话历史里尚未落文档的讨论细节;能作为全队共享状态/决策/约束/目标的,主线优先用 `do_mind` 新增章节保存;只有在确实需要改写已有章节、已完成合并并先调用 `recall_taskdoc` 取得当前 `content_hash` 作为 `previous_content_hash` 时,才用 `change_mind`。接续包提醒项只留差遣牒仍未覆盖、但恢复工作容易丢的细节;若一时来不及,可先保留多条粗略提醒项过桥,但不要在当前程提前做“新一程清醒复核”。系统真正开启新一程后,第一步再复核整理:删除冗余、纠正偏激/失真思路,再收敛成高质量提醒项。'
156
156
  : '不要把长日志/大段 tool output 直接塞进差遣牒;差遣牒只写结论+下一步;提醒项也只留可扫读摘录。接续包提醒项默认应保持结构化、便于快速恢复。';
157
157
  const contextHealthLineEn = ctx.contextHealthPromptMode === 'critical'
158
158
  ? ctx.isSideDialog
@@ -166,11 +166,11 @@ function getMemoryPromptCopy(ctx) {
166
166
  const taskdocLogLineEn = ctx.contextHealthPromptMode === 'critical'
167
167
  ? ctx.isSideDialog
168
168
  ? 'Current mode is critical remediation: in a Side Dialog, do not maintain Taskdoc and do not draft Taskdoc update proposals. Put discussion details from current dialog history that the next course needs to know, next actions, key pointers, run/verify info, volatile paths/IDs/sample inputs, and resume reasoning into continuation-package reminders. Reminder length has no technical limit, so prefer being complete. Rough multi-reminder bridge notes are acceptable in this course, but do not perform the new-course “clear-headed review” early. Once the system actually starts the new course, the first step is to review/rewrite them: remove redundancy, correct biased or distorted bridge notes, then compress them into high-quality reminders.'
169
- : 'Do not paste long logs/tool outputs into Taskdoc; Taskdoc should record decisions + next steps. Current mode is critical remediation: first review current-dialog discussion details not yet written into documentation. If they belong to team-shared state, decisions, constraints, or goals, prefer creating a new section with `do_mind`; use `change_mind` only when an existing section truly needs rewriting, you have merged against the current content, and you can pass the current `content_hash` as `previous_content_hash`. Continuation-package reminders should keep only details still not covered by Taskdoc but easy to lose during resume. Rough multi-reminder bridge notes are acceptable in this course, but do not perform the new-course “clear-headed review” early. Once the system actually starts the new course, the first step is to review/rewrite them: remove redundancy, correct biased or distorted bridge notes, then compress them into high-quality reminders.'
169
+ : 'Do not paste long logs/tool outputs into Taskdoc; Taskdoc should record decisions + next steps. Current mode is critical remediation: first review current-dialog discussion details not yet written into documentation. If they belong to team-shared state, decisions, constraints, or goals, prefer creating a new section with `do_mind`; use `change_mind` only when an existing section truly needs rewriting, you have merged against the current content, and you have first called `recall_taskdoc` to get the current `content_hash` as `previous_content_hash`. Continuation-package reminders should keep only details still not covered by Taskdoc but easy to lose during resume. Rough multi-reminder bridge notes are acceptable in this course, but do not perform the new-course “clear-headed review” early. Once the system actually starts the new course, the first step is to review/rewrite them: remove redundancy, correct biased or distorted bridge notes, then compress them into high-quality reminders.'
170
170
  : ctx.contextHealthPromptMode === 'caution'
171
171
  ? ctx.isSideDialog
172
172
  ? 'Current mode is caution remediation: in a Side Dialog, do not maintain Taskdoc and do not draft Taskdoc update proposals. Put discussion details from current dialog history that the next course needs to know, next actions, key pointers, run/verify info, volatile paths/IDs/sample inputs, and resume reasoning into continuation-package reminders. Reminder length has no technical limit, so prefer being complete. If needed, rough multi-reminder bridge notes are acceptable, but do not perform the new-course “clear-headed review” early. Once the system actually starts the new course, the first step is to review/rewrite them: remove redundancy, correct biased or distorted bridge notes, then compress them into high-quality reminders.'
173
- : 'Do not paste long logs/tool outputs into Taskdoc; Taskdoc should record decisions + next steps. Current mode is caution remediation: first review current-dialog discussion details not yet written into documentation. If they belong to team-shared state, decisions, constraints, or goals, prefer creating a new section with `do_mind`; use `change_mind` only when an existing section truly needs rewriting, you have merged against the current content, and you can pass the current `content_hash` as `previous_content_hash`. Continuation-package reminders should keep only details still not covered by Taskdoc but easy to lose during resume. If needed, rough multi-reminder bridge notes are acceptable, but do not perform the new-course “clear-headed review” early. Once the system actually starts the new course, the first step is to review/rewrite them: remove redundancy, correct biased or distorted bridge notes, then compress them into high-quality reminders.'
173
+ : 'Do not paste long logs/tool outputs into Taskdoc; Taskdoc should record decisions + next steps. Current mode is caution remediation: first review current-dialog discussion details not yet written into documentation. If they belong to team-shared state, decisions, constraints, or goals, prefer creating a new section with `do_mind`; use `change_mind` only when an existing section truly needs rewriting, you have merged against the current content, and you have first called `recall_taskdoc` to get the current `content_hash` as `previous_content_hash`. Continuation-package reminders should keep only details still not covered by Taskdoc but easy to lose during resume. If needed, rough multi-reminder bridge notes are acceptable, but do not perform the new-course “clear-headed review” early. Once the system actually starts the new course, the first step is to review/rewrite them: remove redundancy, correct biased or distorted bridge notes, then compress them into high-quality reminders.'
174
174
  : 'Do not paste long logs/tool outputs into Taskdoc; Taskdoc should record decisions + next steps; reminders should also keep only scannable excerpts. Keep continuation-package reminders structured and fast to resume from by default.';
175
175
  if (ctx.language === 'zh') {
176
176
  return {
@@ -181,7 +181,7 @@ function getMemoryPromptCopy(ctx) {
181
181
  taskdocSemanticsLine: '- 章节语义约定:`progress` 是全队共享、准实时、可扫读的任务公告牌,用来记录当前有效状态、关键决策、下一步与仍成立阻塞;不是流水账,也不是个人工作记录。`goals` / `constraints` 是较稳定的任务契约;每次更新都必须保留仍然有效的他人条目。',
182
182
  taskdocSectionReplaceLine: ctx.isSideDialog && ctx.contextHealthPromptMode !== 'normal'
183
183
  ? '- 当前处于支线对话的上下文健康处置态:本程不要维护差遣牒,也不要整理差遣牒更新提案;把下一程需要恢复的细节写入足够详尽的接续包提醒项。'
184
- : `- 更新差遣牒时:少量新增条目可用 \`mind_more\` 追加(默认 progress);缺失章节用 \`do_mind\` 创建;需要删除陈旧项、重排结构或压缩时,用 \`change_mind\` 整章替换并先对照“上下文中注入的当前内容”做合并,同时带上当前 \`content_hash\` 作为 \`previous_content_hash\`;需要删除整章文件时用 \`never_mind\`;禁止覆盖/抹掉他人条目;自己负责维护的条目必须标注责任人(例如 \`- [owner:@${ctx.agentId}] ...\` 或用 \`### @${ctx.agentId}\` 分块)。`,
184
+ : `- 更新差遣牒时:少量新增条目可用 \`mind_more\` 追加(默认 progress);缺失章节用 \`do_mind\` 创建;需要删除陈旧项、重排结构或压缩时,先对照上下文中注入的当前内容完成合并,再调用 \`recall_taskdoc\` 取得当前 \`content_hash\`,然后用带 \`previous_content_hash\` \`change_mind\` 整章替换;需要删除整章文件时用 \`never_mind\`;禁止覆盖/抹掉他人条目;自己负责维护的条目必须标注责任人(例如 \`- [owner:@${ctx.agentId}] ...\` 或用 \`### @${ctx.agentId}\` 分块)。`,
185
185
  progressLine: ctx.isSideDialog && ctx.contextHealthPromptMode !== 'normal'
186
186
  ? '- 当前处于支线对话的上下文健康处置态:本程不更新 `progress`;只把下一程接续所需信息写入提醒项。'
187
187
  : '- 更新 `progress` 时:它必须始终是可供全队扫读的完整当前快照,而不是只追加自己这一轮的零散笔记。',
@@ -202,7 +202,7 @@ function getMemoryPromptCopy(ctx) {
202
202
  sideDialogWorkflowLine: ctx.contextHealthPromptMode === 'normal'
203
203
  ? `工作流:先做事 → 再提炼(\`update_reminder\`;必要时整理差遣牒追加条目/更新提案并诉请 \`@${ctx.taskdocMaintainerId}\` 合并写入)→ 然后 \`clear_mind\` 清空噪音。`
204
204
  : '工作流:停止扩张上下文 → 维护足够详尽的接续包提醒项(`add_reminder` 或 `update_reminder`,长度没有技术限制)→ 然后 `clear_mind` 开启新一程。',
205
- mainDialogWorkflowLine: '工作流:先做事 -> 再提炼(`update_reminder` + `mind_more(progress)`;需要压缩/删旧时用带 `previous_content_hash` 的 `change_mind`;要删除整章文件时用 `never_mind`)-> 然后 `clear_mind` 清空噪音。',
205
+ mainDialogWorkflowLine: '工作流:先做事 -> 再提炼(`update_reminder` + `mind_more(progress)`;需要压缩/删旧时先 `recall_taskdoc` 取得 `content_hash`,再用带 `previous_content_hash` 的 `change_mind`;要删除整章文件时用 `never_mind`)-> 然后 `clear_mind` 清空噪音。',
206
206
  contextHealthLine: contextHealthLineZh,
207
207
  taskdocLogLine: taskdocLogLineZh,
208
208
  };
@@ -215,7 +215,7 @@ function getMemoryPromptCopy(ctx) {
215
215
  taskdocSemanticsLine: '- Section semantics: `progress` is the team-shared, quasi-real-time, scannable task bulletin board for current effective state, key decisions, next steps, and still-active blockers; it is not a raw log or personal work record. `goals` / `constraints` are the more stable task contract; every update must preserve still-valid entries from others.',
216
216
  taskdocSectionReplaceLine: ctx.isSideDialog && ctx.contextHealthPromptMode !== 'normal'
217
217
  ? '- Current mode is context-health remediation in a Side Dialog: do not maintain Taskdoc and do not draft Taskdoc update proposals in this course; put resume-critical details into sufficiently detailed continuation-package reminders.'
218
- : `- When updating Taskdoc: use \`mind_more\` for small append-only additions (defaults to progress); create missing sections with \`do_mind\`; when stale entries must be removed, reordered, or compressed, use \`change_mind\` for a full-section replacement based on the current injected content and include the current \`content_hash\` as \`previous_content_hash\`; when a whole section file should be removed, use \`never_mind\`; do not overwrite other contributors; add an explicit owner tag for entries you maintain (e.g., \`- [owner:@${ctx.agentId}] ...\` or a \`### @${ctx.agentId}\` block).`,
218
+ : `- When updating Taskdoc: use \`mind_more\` for small append-only additions (defaults to progress); create missing sections with \`do_mind\`; when stale entries must be removed, reordered, or compressed, first merge against the current injected content, then call \`recall_taskdoc\` to get the current \`content_hash\`, then use \`change_mind\` for a full-section replacement with that value as \`previous_content_hash\`; when a whole section file should be removed, use \`never_mind\`; do not overwrite other contributors; add an explicit owner tag for entries you maintain (e.g., \`- [owner:@${ctx.agentId}] ...\` or a \`### @${ctx.agentId}\` block).`,
219
219
  progressLine: ctx.isSideDialog && ctx.contextHealthPromptMode !== 'normal'
220
220
  ? '- Current mode is context-health remediation in a Side Dialog: do not update `progress` in this course; put resume-critical information into reminders only.'
221
221
  : '- When updating `progress`, keep it as a complete, team-scannable current snapshot instead of appending only your own latest notes.',
@@ -236,7 +236,7 @@ function getMemoryPromptCopy(ctx) {
236
236
  sideDialogWorkflowLine: ctx.contextHealthPromptMode === 'normal'
237
237
  ? `Workflow: do work → distill (\`update_reminder\`; when Taskdoc needs updates, draft append entries, a merged replacement, or a section deletion and ask \`@${ctx.taskdocMaintainerId}\`) → then \`clear_mind\` to drop noise.`
238
238
  : 'Workflow: stop expanding context → maintain sufficiently detailed continuation-package reminders (`add_reminder` or `update_reminder`, with no technical length limit) → then `clear_mind` to start a new course.',
239
- mainDialogWorkflowLine: 'Workflow: do work -> distill (`update_reminder` + `mind_more(progress)`; use `change_mind` with `previous_content_hash` when compression/deletion is needed; use `never_mind` when removing a whole section file) -> then `clear_mind` to drop noise.',
239
+ mainDialogWorkflowLine: 'Workflow: do work -> distill (`update_reminder` + `mind_more(progress)`; when compression/deletion is needed, first use `recall_taskdoc` to get `content_hash`, then use `change_mind` with `previous_content_hash`; use `never_mind` when removing a whole section file) -> then `clear_mind` to drop noise.',
240
240
  contextHealthLine: contextHealthLineEn,
241
241
  taskdocLogLine: taskdocLogLineEn,
242
242
  };
@@ -407,7 +407,7 @@ function formatAgentFacingContextHealthV3RemediationGuide(language, args) {
407
407
  '',
408
408
  '操作:',
409
409
  '- 优先新增差遣牒章节保存讨论细节:do_mind({ "category": "<category>", "selector": "<selector>", "content": "..." })',
410
- '- 只有在确实需要改写已有章节、且已对照当前差遣牒内容完成合并并带上 `previous_content_hash` 时,才更新:change_mind({"selector":"<selector>","content":"...","previous_content_hash":"sha256:..."})',
410
+ '- 只有在确实需要改写已有章节、且已对照当前差遣牒内容完成合并时,才先调用 recall_taskdoc({"selector":"<selector>"}) 取得 content_hash,再更新:change_mind({"selector":"<selector>","content":"...","previous_content_hash":"crc32:..."})',
411
411
  '- 优先新增过桥提醒项:add_reminder({ "content": "..." })',
412
412
  '- 只有在确实能就地复用现有提醒项、且不会额外增加当前程认知负担时,才更新:update_reminder({ "reminder_id": "<现有 reminder_id>", "content": "..." })',
413
413
  ].join('\n');
@@ -443,7 +443,7 @@ function formatAgentFacingContextHealthV3RemediationGuide(language, args) {
443
443
  '',
444
444
  '操作:',
445
445
  '- 优先新增差遣牒章节保存讨论细节:do_mind({ "category": "<category>", "selector": "<selector>", "content": "..." })',
446
- '- 只有在确实需要改写已有章节、且已对照当前差遣牒内容完成合并并带上 `previous_content_hash` 时,才更新:change_mind({"selector":"<selector>","content":"...","previous_content_hash":"sha256:..."})',
446
+ '- 只有在确实需要改写已有章节、且已对照当前差遣牒内容完成合并时,才先调用 recall_taskdoc({"selector":"<selector>"}) 取得 content_hash,再更新:change_mind({"selector":"<selector>","content":"...","previous_content_hash":"crc32:..."})',
447
447
  '- 优先新增过桥提醒项:add_reminder({ "content": "..." })',
448
448
  '- 只有在确实能就地复用现有提醒项、且不会额外增加当前程认知负担时,才更新:update_reminder({ "reminder_id": "<现有 reminder_id>", "content": "..." })',
449
449
  '- clear_mind({})',
@@ -484,7 +484,7 @@ function formatAgentFacingContextHealthV3RemediationGuide(language, args) {
484
484
  '',
485
485
  'Operations:',
486
486
  '- Prefer creating a new Taskdoc section for discussion details: do_mind({ "category": "<category>", "selector": "<selector>", "content": "..." })',
487
- '- Only update when an existing section truly needs rewriting and you have merged against the current Taskdoc content and can provide `previous_content_hash`: change_mind({"selector":"<selector>","content":"...","previous_content_hash":"sha256:..."})',
487
+ '- Only update when an existing section truly needs rewriting and you have merged against the current Taskdoc content: first call recall_taskdoc({"selector":"<selector>"}) for content_hash, then change_mind({"selector":"<selector>","content":"...","previous_content_hash":"crc32:..."})',
488
488
  '- Prefer adding a bridge reminder first: add_reminder({ "content": "..." })',
489
489
  '- Only if an existing reminder is clearly the right place, and updating it would not add extra cognitive load in the current course: update_reminder({ "reminder_id": "<existing reminder_id>", "content": "..." })',
490
490
  ].join('\n');
@@ -520,7 +520,7 @@ function formatAgentFacingContextHealthV3RemediationGuide(language, args) {
520
520
  '',
521
521
  'Operations:',
522
522
  '- Prefer creating a new Taskdoc section for discussion details: do_mind({ "category": "<category>", "selector": "<selector>", "content": "..." })',
523
- '- Only update when an existing section truly needs rewriting and you have merged against the current Taskdoc content and can provide `previous_content_hash`: change_mind({"selector":"<selector>","content":"...","previous_content_hash":"sha256:..."})',
523
+ '- Only update when an existing section truly needs rewriting and you have merged against the current Taskdoc content: first call recall_taskdoc({"selector":"<selector>"}) for content_hash, then change_mind({"selector":"<selector>","content":"...","previous_content_hash":"crc32:..."})',
524
524
  '- Prefer adding a bridge reminder first: add_reminder({ "content": "..." })',
525
525
  '- Only if an existing reminder is clearly the right place, and updating it would not add extra cognitive load in the current course: update_reminder({ "reminder_id": "<existing reminder_id>", "content": "..." })',
526
526
  '- clear_mind({})',
@@ -17,7 +17,7 @@
17
17
  * - change_mind: Main Dialog only; update a `.tsk/` Taskdoc section without starting a new course
18
18
  * - mind_more: Main Dialog only; append entries to a `.tsk/` Taskdoc section without starting a new course
19
19
  * - never_mind: Main Dialog only; delete a `.tsk/` Taskdoc section file without starting a new course
20
- * - recall_taskdoc: Read a Taskdoc section from `*.tsk/` by (category, selector)
20
+ * - recall_taskdoc: Read a Taskdoc section from `*.tsk/` by selector and optional category
21
21
  *
22
22
  * USAGE CONTEXT:
23
23
  * Can both be triggered by an agent autonomously, or by human with role='user' msg,
@@ -18,7 +18,7 @@
18
18
  * - change_mind: Main Dialog only; update a `.tsk/` Taskdoc section without starting a new course
19
19
  * - mind_more: Main Dialog only; append entries to a `.tsk/` Taskdoc section without starting a new course
20
20
  * - never_mind: Main Dialog only; delete a `.tsk/` Taskdoc section file without starting a new course
21
- * - recall_taskdoc: Read a Taskdoc section from `*.tsk/` by (category, selector)
21
+ * - recall_taskdoc: Read a Taskdoc section from `*.tsk/` by selector and optional category
22
22
  *
23
23
  * USAGE CONTEXT:
24
24
  * Can both be triggered by an agent autonomously, or by human with role='user' msg,
@@ -372,8 +372,8 @@ function getCtrlMessages(language) {
372
372
  invalidFormatDoMind: '参数格式不对。用法:do_mind({ selector: string, category?: string, content: string })',
373
373
  invalidFormatChangeMind: '参数格式不对。用法:change_mind({ selector: string, category?: string, content: string, previous_content_hash: string })',
374
374
  tooManyArgsChangeMind: '参数格式不对。用法:change_mind({ selector: string, category?: string, content: string, previous_content_hash: string })',
375
- taskDocPreviousContentHashRequired: '错误:change_mind 需要 previous_content_hash。请先基于已注入的顶层差遣牒内容或 recall_taskdoc 返回的 content_hash,合并原有内容后再整段替换;没有把握时用 mind_more 追加小条目。',
376
- taskDocPreviousContentHashInvalid: '错误:previous_content_hash 格式无效。它必须是 recall_taskdoc 或已注入差遣牒状态中显示的 sha256:<64位十六进制> content_hash。',
375
+ taskDocPreviousContentHashRequired: '错误:change_mind 需要 previous_content_hash。请先调用 recall_taskdoc 显式取得当前章节的 content_hash,合并原有内容后再整段替换;没有把握时用 mind_more 追加小条目。',
376
+ taskDocPreviousContentHashInvalid: '错误:previous_content_hash 格式无效。它必须是 recall_taskdoc 返回的 crc32:<8位十六进制> content_hash。',
377
377
  taskDocContentHashMismatch: (relativePath, currentContentHash) => `错误:${relativePath} 的内容哈希不匹配,说明该章节已变化或你没有基于当前内容改写。\n` +
378
378
  `当前 content_hash:${currentContentHash}\n\n` +
379
379
  `请重新读取/回顾当前章节内容,并只在已充分合并原有内容后重试。若新内容会冲掉、删除或实质替换原有内容,必须满足其一:\n` +
@@ -384,7 +384,7 @@ function getCtrlMessages(language) {
384
384
  invalidFormatNeverMind: '参数格式不对。用法:never_mind({ selector: string, category?: string })',
385
385
  mindMoreItemsRequired: '需要提供要追加的条目(items),且每一项都必须是非空字符串。\n' +
386
386
  '示例:mind_more({"items":["- 下一步:复核验证结果(详见 <文档路径>#<章节>)","- 阻塞:等待 API 验收口径确认"]})',
387
- invalidFormatRecallTaskdoc: '参数格式不对。用法:recall_taskdoc({ category: string, selector: string })',
387
+ invalidFormatRecallTaskdoc: '参数格式不对。用法:recall_taskdoc({ selector: string, category?: string })',
388
388
  taskDocContentRequired: '需要提供差遣牒内容(content)。\n' +
389
389
  '示例:\n' +
390
390
  '```json\n' +
@@ -397,15 +397,14 @@ function getCtrlMessages(language) {
397
397
  pathMustBeWithinWorkspace: '路径必须位于 rtws(运行时工作区)内',
398
398
  invalidTaskDocPath: (taskDocPath) => `差遣牒路径 '${taskDocPath}' 无效。应为 *.tsk/ 目录。`,
399
399
  selectorRequired: '需要提供选择器(selector)。',
400
- categoryRequired: '需要提供章节目录(category)。',
401
400
  invalidSelector: (selector) => `选择器 '${selector}' 无效。可用:顶层 goals | constraints | progress;bearinmind 下 contracts | acceptance | grants | runbook | decisions | risks;或任意标识符(如 ux.checklist)。`,
402
401
  invalidCategory: (category) => `目录名 '${category}' 无效。需匹配 ^[a-zA-Z][a-zA-Z0-9_-]*(\\.[a-zA-Z0-9_-]*)*$。`,
403
402
  invalidCategorySelector: (selector) => `选择器 '${selector}' 无效。需匹配 ^[a-zA-Z][a-zA-Z0-9_-]*(\\.[a-zA-Z0-9_-]*)*$。`,
404
403
  topLevelSelectorRequiresNoCategory: (category, selector) => `选择器 '${selector}' 是顶层保留分段(goals/constraints/progress),不能与 category='${category}' 一起用。`,
405
404
  bearInMindSelectorRequiresBearInMindCategory: (category, selector) => `选择器 '${selector}' 只能在 category='bearinmind' 下用(当前 category='${category}')。`,
406
- taskDocSectionAlreadyExists: (relativePath) => `无法新增:${relativePath} 已存在。若确有把握要改写已有章节,请先取得当前 content_hash,再使用 change_mind({"selector":"<selector>","content":"...","previous_content_hash":"sha256:..."})。`,
405
+ taskDocSectionAlreadyExists: (relativePath) => `无法新增:${relativePath} 已存在。若确有把握要改写已有章节,请先用 recall_taskdoc 取得当前 content_hash,再使用 change_mind({"selector":"<selector>","content":"...","previous_content_hash":"crc32:..."})。`,
407
406
  taskDocSectionChangeMissing: (relativePath) => `无法修改:${relativePath} 不存在。若要新增章节,请使用 do_mind({ ... })。`,
408
- taskDocSectionMissing: (relativePath) => `未找到:${relativePath}。\n\n新增章节请使用 do_mind;已有章节追加小条目用 mind_more;改写已有章节用 change_mind 并带上当前 content_hash:\n- do_mind({"category":"<category>","selector":"<selector>","content":"..."})\n- mind_more({"category":"<category>","selector":"<selector>","items":["..."]})\n- change_mind({"category":"<category>","selector":"<selector>","content":"...","previous_content_hash":"sha256:..."})`,
407
+ taskDocSectionMissing: (relativePath) => `未找到:${relativePath}。\n\n新增章节请使用 do_mind;已有章节追加小条目用 mind_more;改写已有章节时先用 recall_taskdoc 取得当前 content_hash,再用 change_mind 带上它:\n- do_mind({"category":"<category>","selector":"<selector>","content":"..."})\n- mind_more({"category":"<category>","selector":"<selector>","items":["..."]})\n- recall_taskdoc({"category":"<category>","selector":"<selector>"})\n- change_mind({"category":"<category>","selector":"<selector>","content":"...","previous_content_hash":"crc32:..."})`,
409
408
  taskDocSectionDeleteMissing: (relativePath) => `无法删除:${relativePath} 不存在。请先确认要删除的差遣牒章节。`,
410
409
  clearedCoursePrompt: (nextCourse) => (0, driver_messages_1.formatNewCourseStartPrompt)('zh', { nextCourse, source: 'clear_mind' }),
411
410
  };
@@ -422,8 +421,8 @@ function getCtrlMessages(language) {
422
421
  invalidFormatDoMind: 'Error: Invalid args. Use: do_mind({ selector: string, category?: string, content: string })',
423
422
  invalidFormatChangeMind: 'Error: Invalid args. Use: change_mind({ selector: string, category?: string, content: string, previous_content_hash: string })',
424
423
  tooManyArgsChangeMind: 'Error: Invalid args. Use: change_mind({ selector: string, category?: string, content: string, previous_content_hash: string })',
425
- taskDocPreviousContentHashRequired: 'Error: change_mind requires previous_content_hash. Use the content_hash from the injected top-level Taskdoc section or recall_taskdoc result, merge the existing content, then replace the full section. If unsure, use mind_more for small append-only updates.',
426
- taskDocPreviousContentHashInvalid: 'Error: invalid previous_content_hash. It must be the sha256:<64 hex chars> content_hash shown by recall_taskdoc or the injected Taskdoc status block.',
424
+ taskDocPreviousContentHashRequired: 'Error: change_mind requires previous_content_hash. Call recall_taskdoc first to get the current section content_hash, merge the existing content, then replace the full section. If unsure, use mind_more for small append-only updates.',
425
+ taskDocPreviousContentHashInvalid: 'Error: invalid previous_content_hash. It must be the crc32:<8 hex chars> content_hash returned by recall_taskdoc.',
427
426
  taskDocContentHashMismatch: (relativePath, currentContentHash) => `Error: content hash mismatch for \`${relativePath}\`; the section changed or your replacement was not based on the current content.\n` +
428
427
  `Current content_hash: ${currentContentHash}\n\n` +
429
428
  `Re-read/review the current section and retry only after fully merging existing content. If the new content would overwrite, delete, or materially replace existing content, one of these must be true:\n` +
@@ -434,7 +433,7 @@ function getCtrlMessages(language) {
434
433
  invalidFormatNeverMind: 'Error: Invalid args. Use: never_mind({ selector: string, category?: string })',
435
434
  mindMoreItemsRequired: 'Error: items are required, and every item must be a non-empty string.\n' +
436
435
  'Example: mind_more({"items":["- Next: review verification results (details: <doc-path>#<section>)","- Blocker: API acceptance criteria pending"]})',
437
- invalidFormatRecallTaskdoc: 'Error: Invalid args. Use: recall_taskdoc({ category: string, selector: string })',
436
+ invalidFormatRecallTaskdoc: 'Error: Invalid args. Use: recall_taskdoc({ selector: string, category?: string })',
438
437
  taskDocContentRequired: 'Error: Taskdoc content is required (content).\n' +
439
438
  'Copy/paste example:\n' +
440
439
  '```json\n' +
@@ -447,15 +446,14 @@ function getCtrlMessages(language) {
447
446
  pathMustBeWithinWorkspace: 'Error: Path must be within rtws (runtime workspace)',
448
447
  invalidTaskDocPath: (taskDocPath) => `Error: Invalid Taskdoc path '${taskDocPath}'. Expected a \`*.tsk/\` directory.`,
449
448
  selectorRequired: 'Error: selector is required.',
450
- categoryRequired: 'Error: category is required.',
451
449
  invalidSelector: (selector) => `Error: Invalid selector '${selector}'. Use: top-level goals|constraints|progress; under bearinmind: contracts|acceptance|grants|runbook|decisions|risks; or any identifier (e.g. \`ux.checklist\`).`,
452
450
  invalidCategory: (category) => `Error: Invalid category '${category}'. Must match \`^[a-zA-Z][a-zA-Z0-9_-]*(\\.[a-zA-Z0-9_-]+)*$\`.`,
453
451
  invalidCategorySelector: (selector) => `Error: Invalid category selector '${selector}'. Must match \`^[a-zA-Z][a-zA-Z0-9_-]*(\\.[a-zA-Z0-9_-]+)*$\`.`,
454
452
  topLevelSelectorRequiresNoCategory: (category, selector) => `Error: Selector '${selector}' is reserved for top-level sections (goals/constraints/progress) and must not be used with category='${category}'.`,
455
453
  bearInMindSelectorRequiresBearInMindCategory: (category, selector) => `Error: Selector '${selector}' is only valid under category='bearinmind' (got category='${category}').`,
456
- taskDocSectionAlreadyExists: (relativePath) => `Cannot add: \`${relativePath}\` already exists. If you are sure you need to rewrite an existing section, get the current content_hash first, then use \`change_mind({"selector":"<selector>","content":"...","previous_content_hash":"sha256:..."})\`.`,
454
+ taskDocSectionAlreadyExists: (relativePath) => `Cannot add: \`${relativePath}\` already exists. If you are sure you need to rewrite an existing section, call \`recall_taskdoc\` for the current content_hash first, then use \`change_mind({"selector":"<selector>","content":"...","previous_content_hash":"crc32:..."})\`.`,
457
455
  taskDocSectionChangeMissing: (relativePath) => `Cannot change: \`${relativePath}\` does not exist. To create a new section, use \`do_mind({ ... })\`.`,
458
- taskDocSectionMissing: (relativePath) => `Not found: \`${relativePath}\`.\n\nUse \`do_mind\` to create a section, \`mind_more\` for small append-only updates to existing sections, and \`change_mind\` with the current content_hash to rewrite existing sections:\n- \`do_mind({\"category\":\"<category>\",\"selector\":\"<selector>\",\"content\":\"...\"})\`\n- \`mind_more({\"category\":\"<category>\",\"selector\":\"<selector>\",\"items\":[\"...\"]})\`\n- \`change_mind({\"category\":\"<category>\",\"selector\":\"<selector>\",\"content\":\"...\",\"previous_content_hash\":\"sha256:...\"})\``,
456
+ taskDocSectionMissing: (relativePath) => `Not found: \`${relativePath}\`.\n\nUse \`do_mind\` to create a section, \`mind_more\` for small append-only updates to existing sections, and \`recall_taskdoc\` then \`change_mind\` with the current content_hash to rewrite existing sections:\n- \`do_mind({\"category\":\"<category>\",\"selector\":\"<selector>\",\"content\":\"...\"})\`\n- \`mind_more({\"category\":\"<category>\",\"selector\":\"<selector>\",\"items\":[\"...\"]})\`\n- \`recall_taskdoc({\"category\":\"<category>\",\"selector\":\"<selector>\"})\`\n- \`change_mind({\"category\":\"<category>\",\"selector\":\"<selector>\",\"content\":\"...\",\"previous_content_hash\":\"crc32:...\"})\``,
459
457
  taskDocSectionDeleteMissing: (relativePath) => `Cannot delete: \`${relativePath}\` does not exist. Check the Taskdoc section target first.`,
460
458
  clearedCoursePrompt: (nextCourse) => (0, driver_messages_1.formatNewCourseStartPrompt)('en', { nextCourse, source: 'clear_mind' }),
461
459
  };
@@ -750,7 +748,7 @@ exports.changeMindTool = {
750
748
  content: { type: 'string', description: 'New section content.' },
751
749
  previous_content_hash: {
752
750
  type: 'string',
753
- description: 'Content hash of the current section being replaced. Use the content_hash shown in the injected Taskdoc for top-level sections or returned by recall_taskdoc for extra sections.',
751
+ description: 'Content hash of the current section being replaced. Call recall_taskdoc first and use the returned content_hash.',
754
752
  },
755
753
  },
756
754
  },
@@ -784,7 +782,7 @@ exports.changeMindTool = {
784
782
  const previousContentHash = typeof previousContentHashValue === 'string' ? previousContentHashValue.trim() : '';
785
783
  if (!previousContentHash)
786
784
  return (0, tool_1.toolFailure)(t.taskDocPreviousContentHashRequired);
787
- if (!/^sha256:[0-9a-f]{64}$/u.test(previousContentHash)) {
785
+ if (!/^crc32:[0-9a-f]{8}$/u.test(previousContentHash)) {
788
786
  return (0, tool_1.toolFailure)(t.taskDocPreviousContentHashInvalid);
789
787
  }
790
788
  // Taskdoc path is immutable for the dialog lifecycle.
@@ -1166,18 +1164,24 @@ exports.mindMoreTool = {
1166
1164
  exports.recallTaskdocTool = {
1167
1165
  type: 'func',
1168
1166
  name: 'recall_taskdoc',
1169
- description: 'Read one Taskdoc section by (category, selector).',
1167
+ description: 'Read one Taskdoc section and return its content_hash.',
1170
1168
  descriptionI18n: {
1171
- en: 'Read one Taskdoc section by (category, selector).',
1172
- zh: ' (category, selector) 读取一段差遣牒章节。',
1169
+ en: 'Read one Taskdoc section and return its content_hash.',
1170
+ zh: '读取一段差遣牒章节并返回 content_hash。',
1173
1171
  },
1174
1172
  parameters: {
1175
1173
  type: 'object',
1176
1174
  additionalProperties: false,
1177
- required: ['category', 'selector'],
1175
+ required: ['selector'],
1178
1176
  properties: {
1179
- category: { type: 'string', description: 'Category directory within the Taskdoc.' },
1180
- selector: { type: 'string', description: 'Section selector within the category.' },
1177
+ category: {
1178
+ type: 'string',
1179
+ description: 'Optional category directory within the Taskdoc. Omit for top-level goals|constraints|progress.',
1180
+ },
1181
+ selector: {
1182
+ type: 'string',
1183
+ description: 'Section selector. Top-level: goals|constraints|progress. With category: selector within that category.',
1184
+ },
1181
1185
  },
1182
1186
  },
1183
1187
  argsValidation: 'dominds',
@@ -1185,9 +1189,10 @@ exports.recallTaskdocTool = {
1185
1189
  const language = (0, work_language_1.getWorkLanguage)();
1186
1190
  const t = getCtrlMessages(language);
1187
1191
  const categoryValue = args['category'];
1188
- const category = typeof categoryValue === 'string' ? categoryValue.trim() : '';
1189
- if (category === '')
1190
- return (0, tool_1.toolFailure)(t.categoryRequired);
1192
+ if (categoryValue !== undefined && typeof categoryValue !== 'string') {
1193
+ return (0, tool_1.toolFailure)(t.invalidFormatRecallTaskdoc);
1194
+ }
1195
+ const category = typeof categoryValue === 'string' ? categoryValue.trim() : undefined;
1191
1196
  const selectorValue = args['selector'];
1192
1197
  const selector = typeof selectorValue === 'string' ? selectorValue.trim() : '';
1193
1198
  if (selector === '')
@@ -1228,9 +1233,6 @@ exports.recallTaskdocTool = {
1228
1233
  }
1229
1234
  }
1230
1235
  const target = parsed.target;
1231
- if (target.kind === 'top_level') {
1232
- return (0, tool_1.toolFailure)(t.invalidFormatRecallTaskdoc);
1233
- }
1234
1236
  const relPath = (0, task_package_1.taskPackageRelativePathForChangeMindTarget)(target);
1235
1237
  const sectionPath = path.resolve(fullPath, relPath);
1236
1238
  if (!isPathWithinDirectory(sectionPath, fullPath)) {
@@ -132,7 +132,7 @@ Taskdoc is a **task contract** and the task's **team-shared source of current tr
132
132
 
133
133
  - Keep concise: reminders are often 1-3 items; prefer `update_reminder` to compress/merge
134
134
  - Separate carriers: information that must synchronize the team's current effective state, key decisions, next steps, or still-active blockers belongs in `progress`, the quasi-real-time task bulletin board; reminders keep local resume details
135
- - Team-facing: keep `progress` scannable and centered on what is still effective now; do not let it degrade into a personal log, raw chronology, scratchpad, or stale history pile. Use `mind_more` for small additions and `change_mind` with the current `content_hash` as `previous_content_hash` when cleanup/reordering/compression is needed
135
+ - Team-facing: keep `progress` scannable and centered on what is still effective now; do not let it degrade into a personal log, raw chronology, scratchpad, or stale history pile. Use `mind_more` for small additions; when cleanup/reordering/compression is needed, call `recall_taskdoc` first and then use `change_mind` with the returned `content_hash` as `previous_content_hash`
136
136
  - Condense when needed: `mind_more` is not the default bookkeeping move. If one topic already has several phase notes, prefer `change_mind` to merge them into the current summary; put the detailed expansion in formal rtws documentation and keep a document pointer in Taskdoc. If the replacement would overwrite existing content, proceed only with direct human confirmation or after applying a human-approved SOP/acceptance standard that considers the existing content
137
137
  - Collapse before clearing: the Main Dialog first records undocumented discussion details the next course needs to know into the appropriate Taskdoc sections, then creates a structured continuation-package reminder; a Side Dialog must not maintain Taskdoc or draft Taskdoc update proposals, and should directly maintain sufficiently detailed continuation-package reminders. If the current course is already under system remediation, rough multi-reminder carry-over is acceptable but must be reconciled first in the new course
138
138
  - Avoid raw-material dumps: do not paste long logs or large tool outputs into reminders
@@ -156,7 +156,7 @@ Taskdoc is a **task contract** and the task's **team-shared source of current tr
156
156
  ## Limitations and Notes
157
157
 
158
158
  1. `dialog` reminders end with the dialog; `personal` reminders stay visible in all later dialogs you lead
159
- 2. Use `do_mind` to create missing Taskdoc sections; use `mind_more` for small Taskdoc additions; use `change_mind` for full-section replacement of existing sections after merging existing content and include the current `content_hash` as `previous_content_hash`; use `never_mind` when a whole section file should be deleted. Do not treat `mind_more` as a chronology tool; when cleanup, stale-entry removal, or same-topic consolidation is needed, use `change_mind`
159
+ 2. Use `do_mind` to create missing Taskdoc sections; use `mind_more` for small Taskdoc additions; use `change_mind` for full-section replacement of existing sections only after merging existing content and calling `recall_taskdoc` for the current `content_hash`; use `never_mind` when a whole section file should be deleted. Do not treat `mind_more` as a chronology tool; when cleanup, stale-entry removal, or same-topic consolidation is needed, use `recall_taskdoc` then `change_mind`
160
160
  3. `do_mind` / `mind_more` / `change_mind` / `never_mind` do not start a new course
161
161
  4. A continuation-package reminder should keep only details still not covered by Taskdoc but easy to lose during resume; in the Main Dialog, undocumented discussion details from current dialog history that the next course needs to know should be written to the appropriate Taskdoc sections first; in a Side Dialog under caution/critical remediation, maintain sufficiently detailed continuation-package reminders only
162
162
  5. Do not turn `personal` reminders into a long-term fact dump; move durable knowledge into `personal_memory`
@@ -130,11 +130,15 @@ mind_more({
130
130
  });
131
131
 
132
132
  // Full-section replacement when cleanup, reordering, same-topic consolidation, or chronology compression is needed
133
+ recall_taskdoc({
134
+ selector: 'progress',
135
+ });
136
+
133
137
  change_mind({
134
138
  selector: 'progress',
135
139
  content:
136
140
  '## Progress\n\n### Current Effective State\n- The memory-carrier boundary cleanup is complete; next we strengthen the Taskdoc bulletin-board semantics; details: <doc-path>#<section>\n\n### Decisions In Effect\n- `personal_memory` is no longer treated as a short-term junk drawer\n- `team_memory` now carries only long-lived team conventions and invariants\n\n### Next Step\n- Add stronger `progress` bulletin-board guidance in control / team_mgmt manuals\n\n### Still-Active Blockers\n- None',
137
- previous_content_hash: 'sha256:...',
141
+ previous_content_hash: 'crc32:...',
138
142
  });
139
143
  ```
140
144
 
@@ -147,11 +151,15 @@ Update task objectives.
147
151
  ### Example
148
152
 
149
153
  ```typescript
154
+ recall_taskdoc({
155
+ selector: 'goals',
156
+ });
157
+
150
158
  change_mind({
151
159
  selector: 'goals',
152
160
  content:
153
161
  '## Goals\n\n- [ ] Create all toolset manuals\n - [x] ws_mod\n - [x] team_mgmt\n - [x] personal_memory\n - [ ] control (In Progress)\n- [ ] Write tool descriptions',
154
- previous_content_hash: 'sha256:...',
162
+ previous_content_hash: 'crc32:...',
155
163
  });
156
164
  ```
157
165
 
@@ -164,11 +172,15 @@ Update task constraints.
164
172
  ### Example
165
173
 
166
174
  ```typescript
175
+ recall_taskdoc({
176
+ selector: 'constraints',
177
+ });
178
+
167
179
  change_mind({
168
180
  selector: 'constraints',
169
181
  content:
170
182
  '## Constraints\n\n- man function must dynamically filter toolsets based on team.yaml\n- Runtime effective: Changes to team.yaml immediately visible\n- Toolset names use underscore format\n- New constraint: Each toolset needs 5 topics × 2 languages',
171
- previous_content_hash: 'sha256:...',
183
+ previous_content_hash: 'crc32:...',
172
184
  });
173
185
  ```
174
186
 
@@ -181,6 +193,11 @@ Read taskdoc chapter content.
181
193
  ### Example
182
194
 
183
195
  ```typescript
196
+ // Top-level sections are injected as content, but recall_taskdoc returns their content_hash
197
+ recall_taskdoc({
198
+ selector: 'progress',
199
+ });
200
+
184
201
  // Read bearinmind runbook
185
202
  recall_taskdoc({
186
203
  category: 'bearinmind',
@@ -204,10 +221,14 @@ Maintain taskdoc integrity and consistency, and keep `progress` as a team-scanna
204
221
 
205
222
  ```typescript
206
223
  // Update progress (keep goals / constraints / progress consistent)
224
+ recall_taskdoc({
225
+ selector: 'progress',
226
+ });
227
+
207
228
  change_mind({
208
229
  selector: 'progress',
209
230
  content:
210
231
  '## Progress\n\n### Current Effective State\n- The boundary wording has been propagated into handbook sources and tests; details: <doc-path>#<section>\n\n### Decisions In Effect\n- role assets / personal_memory / team_memory / Taskdoc-progress / reminders now have separated responsibilities\n\n### Next Step\n- Re-verify control manual wording, Taskdoc display text, and boundary tests\n\n### Still-Active Blockers\n- None',
211
- previous_content_hash: 'sha256:...',
232
+ previous_content_hash: 'crc32:...',
212
233
  });
213
234
  ```