dominds 1.27.3 → 1.27.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.
@@ -697,8 +697,8 @@ function serializeReminderSnapshot(reminder) {
697
697
  ownerName: reminder.owner?.name,
698
698
  meta: reminder.meta,
699
699
  echoback: reminder.echoback,
700
- scope: reminder.scope ?? 'dialog',
701
- renderMode: reminder.renderMode ?? 'markdown',
700
+ scope: reminder.scope,
701
+ renderMode: reminder.renderMode,
702
702
  createdAt: reminder.createdAt ?? (0, time_1.formatUnifiedTimestamp)(new Date()),
703
703
  priority: reminder.priority ?? 'medium',
704
704
  };
@@ -9308,6 +9308,7 @@ class DialogPersistence {
9308
9308
  static resolvePendingUserInterjectionReplyFromCourseEvents(events, course) {
9309
9309
  let pendingUserInterjectionReply;
9310
9310
  let visibleReplySettled = false;
9311
+ let visibleReplyGenseq;
9311
9312
  for (const event of events) {
9312
9313
  if (event.type === 'human_text_record') {
9313
9314
  if (event.origin !== 'user')
@@ -9321,6 +9322,7 @@ class DialogPersistence {
9321
9322
  genseq: (0, storage_1.toCallSiteGenseqNo)(event.genseq),
9322
9323
  };
9323
9324
  visibleReplySettled = false;
9325
+ visibleReplyGenseq = undefined;
9324
9326
  continue;
9325
9327
  }
9326
9328
  if (pendingUserInterjectionReply === undefined) {
@@ -9328,23 +9330,38 @@ class DialogPersistence {
9328
9330
  }
9329
9331
  if (event.type === 'agent_words_record') {
9330
9332
  visibleReplySettled = true;
9333
+ visibleReplyGenseq = event.genseq;
9331
9334
  continue;
9332
9335
  }
9333
9336
  if (event.type === 'func_call_record' || event.type === 'tellask_call_record') {
9334
- visibleReplySettled = false;
9337
+ if (visibleReplyGenseq === undefined || event.genseq <= visibleReplyGenseq) {
9338
+ visibleReplySettled = false;
9339
+ visibleReplyGenseq = undefined;
9340
+ }
9335
9341
  }
9336
9342
  }
9337
9343
  return visibleReplySettled ? undefined : pendingUserInterjectionReply;
9338
9344
  }
9339
9345
  static resolveAnsweredUserInterjectionA2HFromCourseEvents(args) {
9340
9346
  let pendingUserInterjectionReply;
9341
- let lastVisibleAnswer;
9342
- let visibleReplySettled = false;
9347
+ let visibleAnswer;
9348
+ let hasAutoDriveAfterVisibleAnswer = false;
9349
+ let possibleAutoDriveStartGenseq;
9343
9350
  for (const event of args.events) {
9344
9351
  if (event.type === 'human_text_record') {
9345
- if (event.origin !== 'user')
9352
+ if (event.origin !== 'user') {
9353
+ if (visibleAnswer !== undefined &&
9354
+ possibleAutoDriveStartGenseq !== undefined &&
9355
+ event.genseq === possibleAutoDriveStartGenseq) {
9356
+ hasAutoDriveAfterVisibleAnswer = true;
9357
+ }
9346
9358
  continue;
9359
+ }
9347
9360
  if (typeof event.q4hAnswerCallId === 'string' && event.q4hAnswerCallId.trim() !== '') {
9361
+ pendingUserInterjectionReply = undefined;
9362
+ visibleAnswer = undefined;
9363
+ hasAutoDriveAfterVisibleAnswer = false;
9364
+ possibleAutoDriveStartGenseq = undefined;
9348
9365
  continue;
9349
9366
  }
9350
9367
  pendingUserInterjectionReply = {
@@ -9352,24 +9369,56 @@ class DialogPersistence {
9352
9369
  course: (0, storage_1.toDialogCourseNumber)(args.course),
9353
9370
  genseq: (0, storage_1.toCallSiteGenseqNo)(event.genseq),
9354
9371
  };
9355
- visibleReplySettled = false;
9356
- lastVisibleAnswer = undefined;
9372
+ visibleAnswer = undefined;
9373
+ hasAutoDriveAfterVisibleAnswer = false;
9374
+ possibleAutoDriveStartGenseq = undefined;
9357
9375
  continue;
9358
9376
  }
9359
9377
  if (pendingUserInterjectionReply === undefined) {
9360
9378
  continue;
9361
9379
  }
9362
9380
  if (event.type === 'agent_words_record') {
9363
- visibleReplySettled = true;
9364
- lastVisibleAnswer = { content: event.content, genseq: event.genseq };
9381
+ if (visibleAnswer !== undefined &&
9382
+ (hasAutoDriveAfterVisibleAnswer ||
9383
+ (possibleAutoDriveStartGenseq !== undefined &&
9384
+ event.genseq === possibleAutoDriveStartGenseq))) {
9385
+ hasAutoDriveAfterVisibleAnswer = true;
9386
+ continue;
9387
+ }
9388
+ visibleAnswer = { content: event.content, genseq: event.genseq };
9389
+ continue;
9390
+ }
9391
+ if (event.type === 'gen_start_record') {
9392
+ if (visibleAnswer !== undefined &&
9393
+ (typeof event.msgId !== 'string' || event.msgId.trim() === '')) {
9394
+ hasAutoDriveAfterVisibleAnswer = true;
9395
+ possibleAutoDriveStartGenseq = undefined;
9396
+ }
9397
+ else if (visibleAnswer !== undefined) {
9398
+ possibleAutoDriveStartGenseq = event.genseq;
9399
+ }
9400
+ continue;
9401
+ }
9402
+ if (event.type === 'agent_thought_record' || event.type === 'runtime_guide_record') {
9403
+ if (visibleAnswer !== undefined &&
9404
+ possibleAutoDriveStartGenseq !== undefined &&
9405
+ event.genseq === possibleAutoDriveStartGenseq) {
9406
+ hasAutoDriveAfterVisibleAnswer = true;
9407
+ }
9365
9408
  continue;
9366
9409
  }
9367
9410
  if (event.type === 'func_call_record' || event.type === 'tellask_call_record') {
9368
- visibleReplySettled = false;
9369
- lastVisibleAnswer = undefined;
9411
+ if (visibleAnswer !== undefined && event.genseq > visibleAnswer.genseq) {
9412
+ hasAutoDriveAfterVisibleAnswer = true;
9413
+ continue;
9414
+ }
9415
+ visibleAnswer = undefined;
9416
+ possibleAutoDriveStartGenseq = undefined;
9370
9417
  }
9371
9418
  }
9372
- if (!visibleReplySettled || pendingUserInterjectionReply === undefined || !lastVisibleAnswer) {
9419
+ if (pendingUserInterjectionReply === undefined ||
9420
+ visibleAnswer === undefined ||
9421
+ !hasAutoDriveAfterVisibleAnswer) {
9373
9422
  return undefined;
9374
9423
  }
9375
9424
  if (pendingUserInterjectionReply.msgId !== args.pending?.msgId) {
@@ -9379,16 +9428,16 @@ class DialogPersistence {
9379
9428
  args.dialogId.rootId,
9380
9429
  args.dialogId.selfId,
9381
9430
  `c${String(args.course)}`,
9382
- `g${String(lastVisibleAnswer.genseq)}`,
9431
+ `g${String(visibleAnswer.genseq)}`,
9383
9432
  pendingUserInterjectionReply.msgId,
9384
9433
  ].join('|');
9385
9434
  return {
9386
9435
  id: `a2h-${Buffer.from(answerIdSource).toString('base64url')}`,
9387
- content: lastVisibleAnswer.content,
9436
+ content: visibleAnswer.content,
9388
9437
  answeredAt: (0, time_1.formatUnifiedTimestamp)(new Date()),
9389
9438
  answerRef: {
9390
9439
  course: (0, storage_1.toDialogCourseNumber)(args.course),
9391
- genseq: (0, storage_1.toCallSiteGenseqNo)(lastVisibleAnswer.genseq),
9440
+ genseq: (0, storage_1.toCallSiteGenseqNo)(visibleAnswer.genseq),
9392
9441
  },
9393
9442
  };
9394
9443
  }
package/dist/priming.js CHANGED
@@ -227,7 +227,7 @@ function reminderToSnapshot(reminder) {
227
227
  meta: reminder.meta,
228
228
  echoback: reminder.echoback,
229
229
  scope: reminder.scope,
230
- renderMode: reminder.renderMode ?? 'markdown',
230
+ renderMode: reminder.renderMode,
231
231
  createdAt: reminder.createdAt,
232
232
  priority: reminder.priority,
233
233
  };
@@ -2203,8 +2203,7 @@ async function applyPrimingRemindersToDialog(args) {
2203
2203
  const taskReminders = [];
2204
2204
  const agentReminders = [];
2205
2205
  for (const reminder of args.reminders) {
2206
- const scope = reminder.scope ?? 'task';
2207
- switch (scope) {
2206
+ switch (reminder.scope) {
2208
2207
  case 'dialog':
2209
2208
  dialogReminders.push(reminder);
2210
2209
  break;
@@ -135,16 +135,18 @@ function formatNewCourseStartPrompt(language, args) {
135
135
  : `Dominds 因上下文已告急而自动开启了第 ${args.nextCourse} 程对话。`;
136
136
  return (`${noticePrefix} ${prefix} ` +
137
137
  '这是 Dominds 的换程提示,不是新的用户诉求;不要把这条提示当成新的待办,也不要只回复“收到/好的/我会先整理提醒项”。' +
138
- '现在已经进入新一程:上下文已经不再吃紧,告急状况已改观。第一步先复核并在必要时整理接续包提醒项,以清醒头脑删除冗余、纠正偏激或失真的过桥思路、压缩成高质量提醒项;若提醒项已经足够清晰,就不要为了整理而整理。' +
139
- '完成这一步后,直接继续推进原任务本身;除非任务自然需要对用户交付结果,否则不要为这条提示单独回复。');
138
+ '现在已经进入新一程:如果见到上一程的上下文吃紧/告急状况记录,此时既已消除。第一步先读取当前对话范围(scope=dialog)的接续包提醒项,尤其是其中写明的当前对话任务目标,并按这个目标恢复当前这一路主线对话/支线对话,不要仅凭同一差遣牒里的其它主线或支线内容改道。' +
139
+ '随后复核并在必要时整理接续包提醒项,以清醒头脑删除冗余、纠正偏激或失真的过桥思路、压缩成高质量提醒项;若提醒项已经足够清晰,就不要为了整理而整理。' +
140
+ '完成这一步后,直接按照当前对话范围提醒项里的任务目标继续推进;除非任务自然需要对用户交付结果,否则不要为这条提示单独回复。');
140
141
  }
141
142
  const prefix = args.source === 'clear_mind'
142
143
  ? `This is dialog course #${args.nextCourse}. You just cleared your mind.`
143
144
  : `Dominds auto-started dialog course #${args.nextCourse} because context was critical.`;
144
145
  return (`${noticePrefix} ${prefix} ` +
145
146
  'This is a Dominds course-transition notice, not a new user request; do not treat it as a new to-do, and do not reply with a standalone "acknowledged/ok/I will reorganize the reminders first". ' +
146
- 'You are now in a new course: your first step is to review and, if needed, rewrite any continuation-package reminders with a clear head, remove redundancy, correct biased or distorted bridge notes, and compress them into high-quality reminders; if the reminders are already clear enough, do not churn on them. ' +
147
- 'After that, continue the underlying task itself directly; unless the task naturally calls for a user-facing delivery, do not send a standalone reply just for this notice.');
147
+ 'You are now in a new course: if you see records that the previous course was context-tight or context-critical, that condition is now resolved. First read the current-dialog scoped (scope=dialog) continuation-package reminders, especially the current dialog task goal written there, and resume this specific Main Dialog or Side Dialog from that goal instead of drifting into other Main/Side Dialog work that shares the same Taskdoc. ' +
148
+ 'Then review and, if needed, rewrite any continuation-package reminders with a clear head, remove redundancy, correct biased or distorted bridge notes, and compress them into high-quality reminders; if the reminders are already clear enough, do not churn on them. ' +
149
+ 'After that, continue directly from the task goal in the current-dialog scoped reminders; unless the task naturally calls for a user-facing delivery, do not send a standalone reply just for this notice.');
148
150
  }
149
151
  function formatDiligenceAutoContinuePrompt(language, diligenceText) {
150
152
  const noticePrefix = formatSystemNoticePrefix(language);
@@ -795,14 +797,16 @@ function formatAgentFacingContextHealthV3RemediationGuide(language, args) {
795
797
  '',
796
798
  '影响:对话历史中的工具调用/结果信息很多已经过时,成为你的思考负担。',
797
799
  '',
798
- '行动:你当前处于支线对话。本程不要维护差遣牒,也不要整理差遣牒更新提案;当前目标是维护足够详尽的接续包提醒项,然后主动 clear_mind 开启新一程继续工作。',
800
+ '行动:你当前处于支线对话。本程不要维护差遣牒,也不要整理差遣牒更新提案;当前目标是维护足够详尽的当前对话范围(scope=dialog)接续包提醒项,然后主动 clear_mind 开启新一程继续工作。',
799
801
  '',
800
- '提醒项应覆盖:当前对话历史中下一程需要知道的讨论细节、下一步行动、关键定位信息、运行/验证信息、临时路径/ID/样例输入,以及任何恢复工作容易丢的判断依据。提醒项没有固定长度限制,宁可完整一些;允许写成多条粗略提醒项,不必在当前程强行压成单条。',
802
+ '重点提醒:接续包提醒项必须写明当前这一路支线对话的任务目标;同一差遣牒下可能还有同一智能体的其它主线/支线对话,下一程要靠 scope=dialog 提醒项继续本路对话,不能靠共享差遣牒猜目标。',
803
+ '',
804
+ '提醒项应覆盖:当前对话历史中下一程需要知道的任务目标、讨论细节、下一步行动、关键定位信息、运行/验证信息、临时路径/ID/样例输入,以及任何恢复工作容易丢的判断依据。提醒项没有固定长度限制,宁可完整一些;允许写成多条粗略提醒项,不必在当前程强行压成单条。',
801
805
  '',
802
806
  'Dominds 已提醒当前上下文吃紧:不要继续扩张上下文,也不要提前进入“按接续包做清醒复核”的模式;真正清理冗余、合并提醒项,放到 Dominds 开启新一程后再做。',
803
807
  '',
804
808
  '操作:',
805
- '- 优先新增详尽接续包提醒项:add_reminder({ "content": "..." })',
809
+ '- 优先新增详尽接续包提醒项:add_reminder({ "content": "...", "scope": "dialog" })',
806
810
  '- 只有在确实能就地复用现有提醒项、且不会额外增加当前程认知负担时,才更新:update_reminder({ "reminder_id": "<现有 reminder_id>", "content": "..." })',
807
811
  ].join('\n');
808
812
  }
@@ -813,14 +817,15 @@ function formatAgentFacingContextHealthV3RemediationGuide(language, args) {
813
817
  '',
814
818
  '影响:对话历史中的工具调用/结果信息很多已经过时,成为你的思考负担。',
815
819
  '',
816
- '行动:你当前处于主线对话。先把当前对话历史中尚未落实到文档、且下一程需要知会的讨论细节落到差遣牒合适章节。然后再把差遣牒仍未覆盖、但恢复工作会丢的信息记进新提醒项过桥(下一步行动 + 关键定位信息 + 运行/验证信息 + 容易丢的临时细节);允许先带着一定冗余,也允许先写成多条粗略提醒项,不必在当前程强行压成单条。',
820
+ '行动:你当前处于主线对话。先新增或更新当前对话范围(scope=dialog)接续包提醒项,并把当前这一路主线对话的任务目标写清楚。然后只把确实需要同一差遣牒下其它对话/队友知会的讨论事实落到差遣牒合适章节;再把差遣牒仍未覆盖、但恢复本路对话会丢的信息记进 scope=dialog 新提醒项过桥(任务目标 + 下一步行动 + 关键定位信息 + 运行/验证信息 + 容易丢的临时细节);允许先带着一定冗余,也允许先写成多条粗略提醒项,不必在当前程强行压成单条。',
817
821
  '',
818
- 'Dominds 已提醒当前上下文吃紧:不要继续扩张上下文,也不要提前进入“按接续包做清醒复核”的模式;那是 Dominds 真正开启新一程后的第一步。当前程的目标是先把未落文档的讨论细节补进差遣牒,再把差遣牒仍未覆盖、但恢复工作会丢的信息带过桥;真正清理冗余、合并提醒项,放到新一程再做。然后主动 clear_mind,开启新一程对话继续工作。',
822
+ 'Dominds 已提醒当前上下文吃紧:不要继续扩张上下文,也不要提前进入“按接续包做清醒复核”的模式;那是 Dominds 真正开启新一程后的第一步。当前程的目标是先用 scope=dialog 提醒项保住本路对话目标,再把需要共享的事实补进差遣牒,最后把差遣牒仍未覆盖、但恢复本路对话会丢的信息带过桥;真正清理冗余、合并提醒项,放到新一程再做。然后主动 clear_mind,开启新一程对话继续工作。',
819
823
  '',
820
824
  '操作:',
825
+ '- 必须确保当前对话范围提醒项写明本路任务目标:add_reminder({ "content": "...", "scope": "dialog" }) 或 update_reminder({ "reminder_id": "<现有 reminder_id>", "content": "..." })',
821
826
  '- 优先新增差遣牒章节保存讨论细节:do_mind({ "category": "<category>", "selector": "<selector>", "content": "..." })',
822
827
  '- 只有在确实需要改写已有章节、且已对照当前差遣牒内容完成合并时,才先调用 recall_taskdoc({"selector":"<selector>"}) 取得 content_hash,再更新:change_mind({"selector":"<selector>","content":"...","previous_content_hash":"crc32:..."})',
823
- '- 优先新增过桥提醒项:add_reminder({ "content": "..." })',
828
+ '- 优先新增当前对话 scope=dialog 过桥提醒项:add_reminder({ "content": "...", "scope": "dialog" })',
824
829
  '- 只有在确实能就地复用现有提醒项、且不会额外增加当前程认知负担时,才更新:update_reminder({ "reminder_id": "<现有 reminder_id>", "content": "..." })',
825
830
  ].join('\n');
826
831
  }
@@ -832,12 +837,14 @@ function formatAgentFacingContextHealthV3RemediationGuide(language, args) {
832
837
  '',
833
838
  `Dominds 最多再提醒你 ${args.promptsRemainingAfterThis} 次,之后将自动清理头脑开启新一程对话。`,
834
839
  '',
835
- '行动:你当前处于支线对话。本程不要维护差遣牒,也不要整理差遣牒更新提案;当前目标是尽快维护足够详尽的接续包提醒项,然后 clear_mind。',
840
+ '行动:你当前处于支线对话。本程不要维护差遣牒,也不要整理差遣牒更新提案;当前目标是尽快维护足够详尽的当前对话范围(scope=dialog)接续包提醒项,然后 clear_mind。',
841
+ '',
842
+ '重点提醒:接续包提醒项必须写明当前这一路支线对话的任务目标;同一差遣牒下可能还有同一智能体的其它主线/支线对话,下一程要靠 scope=dialog 提醒项继续本路对话,不能靠共享差遣牒猜目标。',
836
843
  '',
837
- '提醒项应覆盖:当前对话历史中下一程需要知道的讨论细节、下一步行动、关键定位信息、运行/验证信息、临时路径/ID/样例输入,以及任何恢复工作容易丢的判断依据。提醒项没有固定长度限制,宁可完整一些;允许写成多条粗略提醒项,甚至带一定冗余也可以,不必在当前程强行整理干净。',
844
+ '提醒项应覆盖:当前对话历史中下一程需要知道的任务目标、讨论细节、下一步行动、关键定位信息、运行/验证信息、临时路径/ID/样例输入,以及任何恢复工作容易丢的判断依据。提醒项没有固定长度限制,宁可完整一些;允许写成多条粗略提醒项,甚至带一定冗余也可以,不必在当前程强行整理干净。',
838
845
  '',
839
846
  '操作:',
840
- '- 优先新增详尽接续包提醒项:add_reminder({ "content": "..." })',
847
+ '- 优先新增详尽接续包提醒项:add_reminder({ "content": "...", "scope": "dialog" })',
841
848
  '- 只有在确实能就地复用现有提醒项、且不会额外增加当前程认知负担时,才更新:update_reminder({ "reminder_id": "<现有 reminder_id>", "content": "..." })',
842
849
  '- clear_mind({})',
843
850
  '',
@@ -851,16 +858,17 @@ function formatAgentFacingContextHealthV3RemediationGuide(language, args) {
851
858
  '',
852
859
  `Dominds 最多再提醒你 ${args.promptsRemainingAfterThis} 次,之后将自动清理头脑开启新一程对话。`,
853
860
  '',
854
- '行动:你当前处于主线对话。尽快保住易丢信息,然后 clear_mind。Dominds 已提醒当前上下文告急:先把当前对话历史中尚未落实到文档、且下一程需要知会的讨论细节落到差遣牒合适章节。然后再把差遣牒仍未覆盖、但恢复工作会丢的信息新增提醒项带过桥;允许先保留多条粗略提醒项,甚至带一定冗余也可以,不必在当前程强行整理干净。',
861
+ '行动:你当前处于主线对话。尽快保住易丢信息,然后 clear_mind。Dominds 已提醒当前上下文告急:先新增或更新当前对话范围(scope=dialog)接续包提醒项,并把当前这一路主线对话的任务目标写清楚。然后只把确实需要同一差遣牒下其它对话/队友知会的讨论事实落到差遣牒合适章节;再把差遣牒仍未覆盖、但恢复本路对话会丢的信息新增 scope=dialog 提醒项带过桥;允许先保留多条粗略提醒项,甚至带一定冗余也可以,不必在当前程强行整理干净。',
855
862
  '',
856
863
  '操作:',
864
+ '- 必须确保当前对话范围提醒项写明本路任务目标:add_reminder({ "content": "...", "scope": "dialog" }) 或 update_reminder({ "reminder_id": "<现有 reminder_id>", "content": "..." })',
857
865
  '- 优先新增差遣牒章节保存讨论细节:do_mind({ "category": "<category>", "selector": "<selector>", "content": "..." })',
858
866
  '- 只有在确实需要改写已有章节、且已对照当前差遣牒内容完成合并时,才先调用 recall_taskdoc({"selector":"<selector>"}) 取得 content_hash,再更新:change_mind({"selector":"<selector>","content":"...","previous_content_hash":"crc32:..."})',
859
- '- 优先新增过桥提醒项:add_reminder({ "content": "..." })',
867
+ '- 优先新增当前对话 scope=dialog 过桥提醒项:add_reminder({ "content": "...", "scope": "dialog" })',
860
868
  '- 只有在确实能就地复用现有提醒项、且不会额外增加当前程认知负担时,才更新:update_reminder({ "reminder_id": "<现有 reminder_id>", "content": "..." })',
861
869
  '- clear_mind({})',
862
870
  '',
863
- '接续包要点:下一步行动 + 关键定位信息 + 运行验证方式 + 容易丢的临时细节;不要重复差遣牒已有内容,本程刚落入差遣牒的讨论细节只需提示下一程先查差遣牒。Dominds 已提醒当前上下文告急:不要提前做“新一程清醒复核”;Dominds 真正开启新一程后,第一步才是重新审视并整理:删除冗余、纠正偏激/失真思路、合并并压缩成高质量提醒项。',
871
+ '接续包要点:当前对话任务目标 + 下一步行动 + 关键定位信息 + 运行验证方式 + 容易丢的临时细节;不要重复差遣牒已有内容,本程刚落入差遣牒的讨论细节只需提示下一程先查差遣牒。Dominds 已提醒当前上下文告急:不要提前做“新一程清醒复核”;Dominds 真正开启新一程后,第一步才是按当前对话范围提醒项里的任务目标继续本路对话,并重新审视整理:删除冗余、纠正偏激/失真思路、合并并压缩成高质量提醒项。',
864
872
  ].join('\n');
865
873
  }
866
874
  if (args.kind === 'caution' && args.mode === 'soft') {
@@ -872,14 +880,16 @@ function formatAgentFacingContextHealthV3RemediationGuide(language, args) {
872
880
  '',
873
881
  'Impact: stale call/results in dialog history are creating cognitive noise.',
874
882
  '',
875
- 'Action: you are in a Side Dialog. Do not maintain Taskdoc in this course, and do not draft Taskdoc update proposals. The current goal is to maintain sufficiently detailed continuation-package reminders, then proactively clear_mind to start a new dialog course.',
883
+ 'Action: you are in a Side Dialog. Do not maintain Taskdoc in this course, and do not draft Taskdoc update proposals. The current goal is to maintain sufficiently detailed current-dialog scoped (scope=dialog) continuation-package reminders, then proactively clear_mind to start a new dialog course.',
876
884
  '',
877
- 'Reminders should cover: 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 any reasoning needed to resume safely. Reminders have no fixed length limit, so prefer being complete; rough multi-reminder carry-over is acceptable, and you do not need to force everything into one clean reminder in the current course.',
885
+ 'Priority reminder: the continuation-package reminder must state this specific Side Dialog task goal. The same Taskdoc may have other Main/Side Dialogs for the same agent, so the next course must continue this dialog from scope=dialog reminders instead of guessing the goal from the shared Taskdoc.',
886
+ '',
887
+ 'Reminders should cover: the task goal, 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 any reasoning needed to resume safely. Reminders have no fixed length limit, so prefer being complete; rough multi-reminder carry-over is acceptable, and you do not need to force everything into one clean reminder in the current course.',
878
888
  '',
879
889
  'Dominds has already warned that context is tight for the current course, so do not keep expanding context and do not switch early into “clear-headed continuation-package review” mode; reminder cleanup and dedup belong to the new course.',
880
890
  '',
881
891
  'Operations:',
882
- '- Prefer adding a detailed continuation-package reminder first: add_reminder({ "content": "..." })',
892
+ '- Prefer adding a detailed continuation-package reminder first: add_reminder({ "content": "...", "scope": "dialog" })',
883
893
  '- 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": "..." })',
884
894
  ].join('\n');
885
895
  }
@@ -890,14 +900,15 @@ function formatAgentFacingContextHealthV3RemediationGuide(language, args) {
890
900
  '',
891
901
  'Impact: stale call/results in dialog history are creating cognitive noise.',
892
902
  '',
893
- 'Action: you are in the Main Dialog. First record current-dialog discussion details that are not yet documented but the next course needs to know into the appropriate Taskdoc sections. Then write information still not covered by Taskdoc but easy to lose into new bridge reminders (next step + key pointers + run/verify info + easy-to-lose volatile details). Some redundancy is acceptable, and rough multi-reminder carry-over is acceptable too; do not force everything into one clean reminder in the current course.',
903
+ 'Action: you are in the Main Dialog. First add or update a current-dialog scoped (scope=dialog) continuation-package reminder and state this specific Main Dialog task goal clearly. Then record only discussion facts that other dialogs/teammates sharing the same Taskdoc truly need to know into the appropriate Taskdoc sections. After that, write information still not covered by Taskdoc but easy to lose for resuming this dialog into scope=dialog bridge reminders (task goal + next step + key pointers + run/verify info + easy-to-lose volatile details). Some redundancy is acceptable, and rough multi-reminder carry-over is acceptable too; do not force everything into one clean reminder in the current course.',
894
904
  '',
895
- 'Dominds has already warned that context is tight for the current course, so do not keep expanding context and do not switch early into “clear-headed continuation-package review” mode; that is the first step only after Dominds actually starts the new course. In the current course, the goal is to first fill Taskdoc with undocumented discussion details, then carry forward details still not covered by Taskdoc; reminder cleanup and dedup belong to the new course. Then proactively clear_mind to start a new dialog course.',
905
+ 'Dominds has already warned that context is tight for the current course, so do not keep expanding context and do not switch early into “clear-headed continuation-package review” mode; that is the first step only after Dominds actually starts the new course. In the current course, the goal is to first preserve this dialog goal in a scope=dialog reminder, then fill Taskdoc only with facts that need to be shared, and finally carry forward details still not covered by Taskdoc but needed to resume this dialog; reminder cleanup and dedup belong to the new course. Then proactively clear_mind to start a new dialog course.',
896
906
  '',
897
907
  'Operations:',
908
+ '- Ensure a current-dialog scoped reminder states this dialog task goal: add_reminder({ "content": "...", "scope": "dialog" }) or update_reminder({ "reminder_id": "<existing reminder_id>", "content": "..." })',
898
909
  '- Prefer creating a new Taskdoc section for discussion details: do_mind({ "category": "<category>", "selector": "<selector>", "content": "..." })',
899
910
  '- 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:..."})',
900
- '- Prefer adding a bridge reminder first: add_reminder({ "content": "..." })',
911
+ '- Prefer adding a current-dialog scope=dialog bridge reminder first: add_reminder({ "content": "...", "scope": "dialog" })',
901
912
  '- 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": "..." })',
902
913
  ].join('\n');
903
914
  }
@@ -909,12 +920,14 @@ function formatAgentFacingContextHealthV3RemediationGuide(language, args) {
909
920
  '',
910
921
  `Dominds will remind you ${args.promptsRemainingAfterThis} more time(s), then automatically clear mind.`,
911
922
  '',
912
- 'Action: you are in a Side Dialog. Do not maintain Taskdoc in this course, and do not draft Taskdoc update proposals. The current goal is to maintain sufficiently detailed continuation-package reminders as soon as possible, then clear_mind.',
923
+ 'Action: you are in a Side Dialog. Do not maintain Taskdoc in this course, and do not draft Taskdoc update proposals. The current goal is to maintain sufficiently detailed current-dialog scoped (scope=dialog) continuation-package reminders as soon as possible, then clear_mind.',
924
+ '',
925
+ 'Priority reminder: the continuation-package reminder must state this specific Side Dialog task goal. The same Taskdoc may have other Main/Side Dialogs for the same agent, so the next course must continue this dialog from scope=dialog reminders instead of guessing the goal from the shared Taskdoc.',
913
926
  '',
914
- 'Reminders should cover: 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 any reasoning needed to resume safely. Reminders have no fixed length limit, so prefer being complete; multiple rough reminders, including some redundancy, are acceptable as a bridge.',
927
+ 'Reminders should cover: the task goal, 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 any reasoning needed to resume safely. Reminders have no fixed length limit, so prefer being complete; multiple rough reminders, including some redundancy, are acceptable as a bridge.',
915
928
  '',
916
929
  'Operations:',
917
- '- Prefer adding a detailed continuation-package reminder first: add_reminder({ "content": "..." })',
930
+ '- Prefer adding a detailed continuation-package reminder first: add_reminder({ "content": "...", "scope": "dialog" })',
918
931
  '- 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": "..." })',
919
932
  '- clear_mind({})',
920
933
  '',
@@ -928,16 +941,17 @@ function formatAgentFacingContextHealthV3RemediationGuide(language, args) {
928
941
  '',
929
942
  `Dominds will remind you ${args.promptsRemainingAfterThis} more time(s), then automatically clear mind.`,
930
943
  '',
931
- 'Action: you are in the Main Dialog. Preserve easy-to-lose information, then clear_mind. Because Dominds has warned that context is critical, first record current-dialog discussion details that are not yet documented but the next course needs to know into the appropriate Taskdoc sections. Then add bridge reminders for information still not covered by Taskdoc but easy to lose. Multiple rough reminders, including some redundancy, are acceptable as a bridge; do not spend the current course forcing them into a clean final package.',
944
+ 'Action: you are in the Main Dialog. Preserve easy-to-lose information, then clear_mind. Because Dominds has warned that context is critical, first add or update a current-dialog scoped (scope=dialog) continuation-package reminder and state this specific Main Dialog task goal clearly. Then record only discussion facts that other dialogs/teammates sharing the same Taskdoc truly need to know into the appropriate Taskdoc sections. After that, add scope=dialog bridge reminders for information still not covered by Taskdoc but easy to lose when resuming this dialog. Multiple rough reminders, including some redundancy, are acceptable as a bridge; do not spend the current course forcing them into a clean final package.',
932
945
  '',
933
946
  'Operations:',
947
+ '- Ensure a current-dialog scoped reminder states this dialog task goal: add_reminder({ "content": "...", "scope": "dialog" }) or update_reminder({ "reminder_id": "<existing reminder_id>", "content": "..." })',
934
948
  '- Prefer creating a new Taskdoc section for discussion details: do_mind({ "category": "<category>", "selector": "<selector>", "content": "..." })',
935
949
  '- 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:..."})',
936
- '- Prefer adding a bridge reminder first: add_reminder({ "content": "..." })',
950
+ '- Prefer adding a current-dialog scope=dialog bridge reminder first: add_reminder({ "content": "...", "scope": "dialog" })',
937
951
  '- 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": "..." })',
938
952
  '- clear_mind({})',
939
953
  '',
940
- 'Continuation package: next step + key pointers + run/verify info + easy-to-lose volatile details. Do not duplicate Taskdoc content; for discussion details just written into Taskdoc in this course, only remind the next course to review Taskdoc first. Because Dominds has warned that context is critical in the current course, do not start the new-course cleanup early; once Dominds actually starts the new course, the first step is to reconcile rough bridge reminders by removing redundancy, correcting biased or distorted bridge notes, and merging/compressing them into high-quality reminders.',
954
+ 'Continuation package: current dialog task goal + next step + key pointers + run/verify info + easy-to-lose volatile details. Do not duplicate Taskdoc content; for discussion details just written into Taskdoc in this course, only remind the next course to review Taskdoc first. Because Dominds has warned that context is critical in the current course, do not start the new-course cleanup early; once Dominds actually starts the new course, the first step is to continue this dialog from the task goal in current-dialog scoped reminders and reconcile rough bridge reminders by removing redundancy, correcting biased or distorted bridge notes, and merging/compressing them into high-quality reminders.',
941
955
  ].join('\n');
942
956
  }
943
957
  function formatAgentFacingCriticalUserInterjectionRemediationGuide(language, args) {
@@ -106,8 +106,8 @@ function serializeReminder(reminder) {
106
106
  ownerName: reminder.owner?.name,
107
107
  meta: reminder.meta,
108
108
  echoback: reminder.echoback,
109
- scope: reminder.scope ?? 'agent',
110
- renderMode: reminder.renderMode ?? 'markdown',
109
+ scope: reminder.scope,
110
+ renderMode: reminder.renderMode,
111
111
  createdAt: reminder.createdAt ?? (0, time_1.formatUnifiedTimestamp)(new Date()),
112
112
  priority: reminder.priority ?? 'medium',
113
113
  };
package/dist/tool.d.ts CHANGED
@@ -50,7 +50,11 @@ type PreparedRawToolArguments = Readonly<{
50
50
  }>;
51
51
  export interface ReminderOptions {
52
52
  readonly echoback?: boolean;
53
- readonly scope?: ReminderScope;
53
+ readonly scope: ReminderScope;
54
+ readonly renderMode: ReminderRenderMode;
55
+ }
56
+ export interface ReminderUpdateOptions {
57
+ readonly echoback?: boolean;
54
58
  readonly renderMode?: ReminderRenderMode;
55
59
  }
56
60
  export type ReminderScope = 'dialog' | 'task' | 'agent' | 'runtime';
@@ -63,7 +67,6 @@ export interface Reminder extends ReminderOptions {
63
67
  readonly meta?: JsonValue;
64
68
  readonly createdAt?: string;
65
69
  readonly priority?: ReminderPriority;
66
- readonly renderMode?: ReminderRenderMode;
67
70
  }
68
71
  export declare function reminderEchoBackEnabled(reminder: Reminder): boolean;
69
72
  export declare function reminderIsVirtual(reminder: Reminder): boolean;
@@ -75,10 +78,10 @@ export declare function materializeReminder(input: Readonly<{
75
78
  owner?: ReminderOwner;
76
79
  meta?: JsonValue;
77
80
  echoback?: boolean;
78
- scope?: ReminderScope;
81
+ scope: ReminderScope;
79
82
  createdAt?: string;
80
83
  priority?: ReminderPriority;
81
- renderMode?: ReminderRenderMode;
84
+ renderMode: ReminderRenderMode;
82
85
  }>): Reminder;
83
86
  export declare function cloneReminder(reminder: Reminder): Reminder;
84
87
  export declare function computeReminderRenderRevision(reminder: Reminder): string;
package/dist/tool.js CHANGED
@@ -63,16 +63,22 @@ function ensureReminderId(value) {
63
63
  return trimmed && trimmed.length > 0 ? trimmed : generateReminderId();
64
64
  }
65
65
  function materializeReminder(input) {
66
+ if (input.scope === undefined) {
67
+ throw new Error('materializeReminder requires explicit scope');
68
+ }
69
+ if (input.renderMode === undefined) {
70
+ throw new Error('materializeReminder requires explicit renderMode');
71
+ }
66
72
  return {
67
73
  id: ensureReminderId(input.id),
68
74
  content: input.content,
69
75
  owner: input.owner,
70
76
  meta: input.meta,
71
77
  echoback: input.echoback,
72
- scope: input.scope ?? 'dialog',
78
+ scope: input.scope,
73
79
  createdAt: input.createdAt,
74
80
  priority: input.priority,
75
- renderMode: input.renderMode ?? 'markdown',
81
+ renderMode: input.renderMode,
76
82
  };
77
83
  }
78
84
  function cloneReminder(reminder) {
@@ -94,8 +100,8 @@ function computeReminderRenderRevision(reminder) {
94
100
  content: reminder.content,
95
101
  meta: reminder.meta ?? null,
96
102
  echoback: reminder.echoback ?? true,
97
- scope: reminder.scope ?? 'dialog',
98
- renderMode: reminder.renderMode ?? 'markdown',
103
+ scope: reminder.scope,
104
+ renderMode: reminder.renderMode,
99
105
  });
100
106
  return `sha256:${(0, crypto_1.createHash)('sha256').update(payload, 'utf8').digest('hex')}`;
101
107
  }
@@ -139,7 +139,7 @@ function toReminderState(reminder) {
139
139
  content: reminder.content,
140
140
  meta: extractOwnerMeta(reminder.meta),
141
141
  echoback: reminder.echoback,
142
- renderMode: reminder.renderMode ?? 'markdown',
142
+ renderMode: reminder.renderMode,
143
143
  };
144
144
  }
145
145
  function findOwnedReminderEntries(dlg, descriptor, owner) {
@@ -201,7 +201,7 @@ async function persistAndPublishReminders(dlg) {
201
201
  renderRevision: (0, tool_1.computeReminderRenderRevision)(reminder),
202
202
  echoback: (0, tool_1.reminderEchoBackEnabled)(reminder),
203
203
  scope: reminder.scope,
204
- renderMode: reminder.renderMode ?? 'markdown',
204
+ renderMode: reminder.renderMode,
205
205
  }));
206
206
  const evt = { type: 'full_reminders_update', reminders };
207
207
  (0, evt_registry_1.postDialogEvent)(dlg, evt);
@@ -321,6 +321,7 @@ async function applyAppReminderRequests(dlg, params) {
321
321
  case 'add': {
322
322
  dlg.addReminder(result.reminder.content, owner, buildAppReminderMeta(descriptor, result.reminder.meta), normalizeInsertPosition(dlg.reminders.length, result.position), {
323
323
  echoback: result.reminder.echoback,
324
+ scope: 'dialog',
324
325
  renderMode: result.reminder.renderMode ?? 'markdown',
325
326
  });
326
327
  changed = true;
@@ -334,7 +335,7 @@ async function applyAppReminderRequests(dlg, params) {
334
335
  dlg.updateReminder(target.index, result.reminder.content, buildAppReminderMeta(descriptor, result.reminder.meta), {
335
336
  echoback: result.reminder.echoback,
336
337
  // Preserve the existing render mode when the app does not explicitly override it.
337
- renderMode: result.reminder.renderMode ?? target.reminder.renderMode ?? 'markdown',
338
+ renderMode: result.reminder.renderMode ?? target.reminder.renderMode,
338
339
  });
339
340
  changed = true;
340
341
  break;
@@ -815,7 +815,10 @@ exports.clearMindTool = {
815
815
  createdBy: 'clear_mind',
816
816
  contextHealthLevel,
817
817
  });
818
- dlg.addReminder(reminderContent, undefined, continuationMeta);
818
+ dlg.addReminder(reminderContent, undefined, continuationMeta, undefined, {
819
+ scope: 'dialog',
820
+ renderMode: 'markdown',
821
+ });
819
822
  }
820
823
  await dlg.startNewCourse(t.clearedCoursePrompt(dlg.currentCourse + 1));
821
824
  // Context health snapshot is inherently tied to the previous prompt/context.
@@ -193,6 +193,7 @@ async function syncPendingTellaskReminderState(dlg) {
193
193
  return false;
194
194
  }
195
195
  dlg.addReminder(content, exports.pendingTellaskReminderOwner, nextMeta, 0, {
196
+ scope: 'dialog',
196
197
  renderMode: 'markdown',
197
198
  });
198
199
  return true;
@@ -26,7 +26,7 @@
26
26
 
27
27
  control is Dominds' **dialog control toolset** for managing dialog state, reminders, taskdocs, and inter-dialog reply closure semantics:
28
28
 
29
- - **Reminder management**: Three reminder scopes: `dialog` / `task` / `agent`. Default to `task` for current work under the same Taskdoc; use `dialog` only for truly dialog-local notes; use `agent` only for urgent, short-lived, globally visible cues
29
+ - **Reminder management**: Three reminder scopes: `dialog` / `task` / `agent`. Default to `task` for ordinary current work under the same Taskdoc; use `dialog` for truly dialog-local notes, and continuation packages before `clear_mind` must explicitly use `scope=dialog` and state this dialog task goal; use `agent` only for urgent, short-lived, globally visible cues
30
30
  - **Taskdoc operations**: Append to, replace, or delete task contract sections (goals/constraints/progress); within Taskdoc, `progress` is the team-shared, quasi-real-time, scannable task bulletin board
31
31
  - **Context maintenance**: Reduce cognitive load without losing key resume state
32
32
  - **Reply routing**: Separate asking the tellasker back, sending the final reply, and ordinary plain text in Side Dialog / ask-back flows
@@ -56,13 +56,13 @@ Reminders are temporary current-work information for:
56
56
  - Marking pending tasks
57
57
  - Tracking current next steps / blockers
58
58
  - Recording blocking issues
59
- - Holding continuation-package bridge notes before `clear_mind`
59
+ - Holding current-dialog scoped continuation-package bridge notes before `clear_mind`
60
60
 
61
61
  Reminders are not for manually copying environment state automatically maintained by Dominds, such as background process status, in-flight background asks/collaboration, or browser/session attachment state. Dominds-managed reminders, panels, and tool outputs are the authoritative place for that state; manual notes go stale easily and create cognitive noise.
62
62
 
63
63
  Scope rule:
64
64
 
65
- - `dialog`: current-dialog current work
65
+ - `dialog`: current-dialog current work; continuation packages before `clear_mind` must explicitly use this scope and state this dialog task goal
66
66
  - `task`: current work under the current Taskdoc, and the default scope
67
67
  - `agent`: urgent, short-lived, globally visible cues you should keep seeing across later dialogs you lead
68
68
 
@@ -42,7 +42,7 @@ Default to `task`. Use `dialog` only when the note is truly dialog-local; use `a
42
42
  - `agent` reminders stay visible in later dialogs you lead
43
43
  - Can be added, modified, or deleted at any time
44
44
  - Should stay compact, scannable, and directly actionable by default
45
- - Before `clear_mind`, the Main Dialog first records undocumented discussion details the next course needs to know into Taskdoc, then creates a structured continuation-package reminder; a Side Dialog directly maintains sufficiently detailed continuation-package reminders. If Dominds has already warned that context is tight or critical, Side Dialog reminders have no fixed length limit and rough multi-reminder carry-over is acceptable
45
+ - Before `clear_mind`, first state this dialog task goal in a current-dialog scoped (`scope=dialog`) continuation-package reminder. A Main Dialog records only discussion facts that other dialogs/teammates sharing the same Taskdoc truly need to know into Taskdoc, then keeps resume-critical details for this dialog in `dialog` reminders; a Side Dialog directly maintains sufficiently detailed `dialog` continuation-package reminders. If Dominds has already warned that context is tight or critical, Side Dialog reminders have no fixed length limit and rough multi-reminder carry-over is acceptable
46
46
 
47
47
  **Difference from memory:**
48
48
  | Feature | dialog reminder | task reminder | agent reminder | personal memory |
@@ -124,7 +124,7 @@ Taskdoc is a **task contract** and the task's **team-shared source of current tr
124
124
 
125
125
  - **Current work**: next step, blockers, key pointers
126
126
  - **Easy-to-lose details**: temporary paths, ids, commands, sample inputs
127
- - **Course transition**: continuation-package notes before `clear_mind`, including rough multi-reminder carry-over when already degraded
127
+ - **Course transition**: current-dialog scoped (`scope=dialog`) continuation-package notes before `clear_mind`; they must state this dialog task goal, including rough multi-reminder carry-over when already degraded
128
128
  - **Task carry-over**: if you should keep seeing the note under the current Taskdoc, use `task`
129
129
  - **Global urgent cue**: if you should keep seeing it across later dialogs you lead, and it is urgent, short-lived, and globally visible, use `agent`
130
130
 
@@ -141,7 +141,7 @@ Taskdoc is a **task contract** and the task's **team-shared source of current tr
141
141
  - Do not duplicate system state: background process status, in-flight background asks/collaboration, browser/session attachment state, and similar environment state automatically maintained by Dominds do not belong in manual reminders. Dominds-managed reminders, panels, and tool outputs are the authoritative place for that state; manual copies go stale easily and create cognitive noise
142
142
  - 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`
143
143
  - 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
144
- - 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 Dominds has already warned that context is tight or critical, rough multi-reminder carry-over is acceptable but must be reconciled first in the new course
144
+ - Collapse before clearing: the Main Dialog first states this dialog task goal in a `scope=dialog` continuation-package reminder, then writes only facts that other dialogs/teammates sharing the same Taskdoc truly need into the appropriate Taskdoc sections, and keeps resume-critical details for this dialog in `dialog` reminders; a Side Dialog must not maintain Taskdoc or draft Taskdoc update proposals, and should directly maintain sufficiently detailed `dialog` continuation-package reminders. If Dominds has already warned that context is tight or critical, rough multi-reminder carry-over is acceptable; once the new course starts, continue this dialog from the task goal in `scope=dialog` reminders before reconciling
145
145
  - Avoid raw-material dumps: do not paste long logs or large tool outputs into reminders
146
146
  - Documentation layering: Taskdoc says “what the team should sync on / do next now”; formal rtws documentation carries “why, how, detailed evidence, and the full process”. When Taskdoc references formal rtws documentation, use a stable path/section name/relevant command instead of copying the full content
147
147
 
@@ -165,5 +165,5 @@ Taskdoc is a **task contract** and the task's **team-shared source of current tr
165
165
  1. `dialog` reminders end with the dialog; `task` reminders stay visible under the current Taskdoc; `agent` reminders stay visible in later dialogs you lead
166
166
  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`
167
167
  3. `do_mind` / `mind_more` / `change_mind` / `never_mind` do not start a new course
168
- 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 after Dominds warns that context is tight or critical, maintain sufficiently detailed continuation-package reminders only
168
+ 4. A continuation-package reminder must be current-dialog scoped (`scope=dialog`) and state this dialog task goal. In the Main Dialog, write only facts that other dialogs/teammates sharing the same Taskdoc truly need into Taskdoc, while reminders keep details still not covered by Taskdoc but easy to lose when resuming this dialog; in a Side Dialog after Dominds warns that context is tight or critical, maintain sufficiently detailed `dialog` continuation-package reminders only
169
169
  5. Do not turn `task` / `agent` reminders into a long-term fact dump; move durable knowledge into `personal_memory`