github-issue-tower-defence-management 1.122.5 → 1.122.6

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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [1.122.6](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.122.5...v1.122.6) (2026-07-13)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **silent-monitor:** neutralize imperative reminder wording that trips model safety classifiers ([#1164](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/1164)) ([e82e704](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/e82e70438b3e6be00d20d5a3e5037c6bb7ea0325))
7
+
1
8
  ## [1.122.5](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.122.4...v1.122.5) (2026-07-12)
2
9
 
3
10
 
@@ -9,9 +9,9 @@ const formatMinutes = (seconds) => {
9
9
  const composeIdleSubAgentSection = (idleSubAgents) => {
10
10
  const lines = idleSubAgents.map((subAgent) => `- ${subAgent.label}: no output for ${formatMinutes(subAgent.silentSeconds)}`);
11
11
  return [
12
- `${silentSessionReminderSentinel_1.SILENT_SESSION_REMINDER_SENTINEL} The system has already detected, from each sub-process's last tool activity, that it has produced no output for about the minutes shown below. Treat that figure as the authoritative system signal; do NOT spend effort re-deriving whether the sub-process is alive. Around five minutes of silence is a real warning of a possible hang: do NOT speak from speculation ("probably still working") and do NOT dismiss it without evidence.`,
12
+ `${silentSessionReminderSentinel_1.SILENT_SESSION_REMINDER_SENTINEL} The system has already detected, from each sub-process's last tool activity, that it has produced no output for about the minutes shown below. Please treat that figure as the authoritative system signal; there is no need to spend effort re-deriving whether the sub-process is alive. Around five minutes of silence is a real warning of a possible hang: please base your assessment on concrete evidence rather than speculation ("probably still working"), and please keep the warning in view until evidence resolves it.`,
13
13
  ...lines,
14
- 'For each one, determine the CAUSE by a concrete check and report the result. Verify specifically: (a) whether there is genuinely no recent activity anywhere — including a very recent push or commit, or output from any nested sub-processes this sub-process itself started; and (b) whether it is legitimately blocked waiting on an external dependency (a continuous-integration run, an external API, or another process). Waiting on continuous integration is plausible, but confirm it by investigation before concluding — do not assume. Based on the check: if it is genuinely stuck, take action (restart, hand off, or replace it); if it is legitimately waiting, state that conclusion together with the concrete evidence you found. Owner notification is not required, but you MUST output your investigation result in this session so it remains as a log.',
14
+ 'For each one, determine the CAUSE by a concrete check and report the result. Verify specifically: (a) whether there is genuinely no recent activity anywhere — including a very recent push or commit, or output from any nested sub-processes this sub-process itself started; and (b) whether it is legitimately blocked waiting on an external dependency (a continuous-integration run, an external API, or another process). Waiting on continuous integration is plausible, but confirm it by investigation before concluding — do not assume. Based on the check: if it is genuinely stuck, take action (restart, hand off, or replace it); if it is legitimately waiting, state that conclusion together with the concrete evidence you found. Owner notification is not required, but please output your investigation result in this session so it remains as a log.',
15
15
  ].join('\n');
16
16
  };
17
17
  const composeLongRunningSubAgentSection = (longRunningSubAgents) => {
@@ -26,17 +26,17 @@ const composeOwnerCallFormatGuidance = (ownerCallMarker) => {
26
26
  const markerInstruction = ownerCallMarker !== null && ownerCallMarker.length > 0
27
27
  ? `Emit the owner-call as the configured owner-call marker tag "${ownerCallMarker}" as a complete matching pair — opening marker, content, then closing marker — on a single line with no newline inside the tag.`
28
28
  : `Emit the owner-call as the configured owner-call marker tag as a complete matching pair — opening marker, content, then closing marker — on a single line with no newline inside the tag.`;
29
- return `${markerInstruction} The content between the markers MUST begin with the 🔴 emoji immediately, with no space after it. The owner's app only surfaces the notification together with its content when the exact, well-formed tag with the leading 🔴 is present; a malformed tag (a broken or missing closing marker, or a missing leading 🔴) results in only a red indicator with no readable content. Make the owner-call message fully self-contained: the owner MUST understand the whole situation — what happened, what you are asking, and any decision needed — from this single latest owner-call message alone, without reading or scrolling back to earlier messages. NEVER tell the owner to scroll up, go back, or read previous or above messages; if context is needed, restate it inside the owner-call message itself.`;
29
+ return `${markerInstruction} The content between the markers needs to begin with the 🔴 emoji immediately, with no space after it. The owner's app only surfaces the notification together with its content when the exact, well-formed tag with the leading 🔴 is present; a malformed tag (a broken or missing closing marker, or a missing leading 🔴) results in only a red indicator with no readable content. Make the owner-call message fully self-contained: the owner should be able to understand the whole situation — what happened, what you are asking, and any decision needed — from this single latest owner-call message alone, without reading or scrolling back to earlier messages. Please avoid telling the owner to scroll up, go back, or read previous or above messages; if context is needed, restate it inside the owner-call message itself.`;
30
30
  };
31
31
  exports.composeOwnerCallFormatGuidance = composeOwnerCallFormatGuidance;
32
32
  const composeMainStalledMessage = (mainSilentSeconds, ownerCallMarker) => {
33
33
  const minutes = Math.floor(mainSilentSeconds / 60);
34
34
  return [
35
- `${silentSessionReminderSentinel_1.SILENT_SESSION_REMINDER_SENTINEL} You have produced no output for ${minutes} minutes. Idle waiting wastes this live session and is unacceptable. Always work proactively and stay ahead of the work: anticipate the next steps and, at every point, choose the fastest path so the whole task finishes as early as possible; never wait passively. Finish every task in the shortest possible time — but "fastest" means correct and incident-free, not merely quick: a fast but wrong result is worthless and causes incidents, so be fast without breaking things. Use parallel execution and your whole team of sub-agents to minimize total wall-clock time. Your goal is to drive every task to completion and have the owner confirm that all tasks are done. Do NOT close this session on your own — it is closed only after the owner has verified completion and tells you to close it. Self-check now:`,
35
+ `${silentSessionReminderSentinel_1.SILENT_SESSION_REMINDER_SENTINEL} You have produced no output for ${minutes} minutes. Idle waiting wastes this live session, so please keep making progress. Always work proactively and stay ahead of the work: anticipate the next steps and, at every point, choose the fastest path so the whole task finishes as early as possible, rather than waiting passively. Finish every task in the shortest possible time — but "fastest" means correct and incident-free, not merely quick: a fast but wrong result is worthless and causes incidents, so be fast without breaking things. Use parallel execution and your whole team of sub-agents to minimize total wall-clock time. Your goal is to drive every task to completion and have the owner confirm that all tasks are done. Please leave this session open rather than closing it on your own — it is closed only after the owner has verified completion and asks you to close it. Self-check now:`,
36
36
  `1. Every request from the owner is registered as a session task and your task list is kept current (mark tasks completed when done); verify nothing is missing or stale.`,
37
37
  `2. Your plan is the fastest correct path: parallelize independent work across sub-agents, delegate, and remove needless serialization. Choose the fastest safe method, not the easiest.`,
38
38
  `3. A monitor is in place that detects when any sub-agent produces no output for 5 minutes.`,
39
- `4. If you are blocked on an owner decision — or once you believe all tasks are complete — do not wait passively: the owner is not notified of passive waiting and will not reply unless you raise a new call-to-user, so raise one now (to get the decision, or to ask the owner to verify completion). If you have COMPLETED or ANSWERED a request from the owner in this session, you MUST fire the owner-call to report the RESULT to the owner: completing or answering an owner's requested action is itself a reason to fire the owner-call. Completing or answering an owner request WITHOUT firing the owner-call means the owner is NEVER notified — the owner's app only surfaces this session when the owner-call fires — so the task silently stalls. If this self-check reminder keeps arriving, it is likely because an owner request was completed or answered without firing the owner-call; fire the owner-call now to report the result to the owner. ${(0, exports.composeOwnerCallFormatGuidance)(ownerCallMarker)} If no owner input is needed yet, resume immediately and drive all remaining tasks to completion.`,
39
+ `4. If you are blocked on an owner decision — or once you believe all tasks are complete — do not wait passively: the owner is not notified of passive waiting and will not reply unless you raise a new call-to-user, so raise one now (to get the decision, or to ask the owner to verify completion). If you have COMPLETED or ANSWERED a request from the owner in this session, please fire the owner-call to report the RESULT to the owner: completing or answering an owner's requested action is itself a reason to fire the owner-call. Completing or answering an owner request WITHOUT firing the owner-call means the owner is not notified — the owner's app only surfaces this session when the owner-call fires — so the task silently stalls. If this self-check reminder keeps arriving, it is likely because an owner request was completed or answered without firing the owner-call; fire the owner-call now to report the result to the owner. ${(0, exports.composeOwnerCallFormatGuidance)(ownerCallMarker)} If no owner input is needed yet, resume immediately and drive all remaining tasks to completion.`,
40
40
  `Also, in your next output, report an estimate of how many minutes you expect to need to finish all remaining tasks.`,
41
41
  ].join('\n');
42
42
  };
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultSilentSessionMessageComposer.js","sourceRoot":"","sources":["../../../src/domain/usecases/DefaultSilentSessionMessageComposer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DefaultSilentSessionMessageComposer.js","sourceRoot":"","sources":["../../../src/domain/usecases/DefaultSilentSessionMessageComposer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-issue-tower-defence-management",
3
- "version": "1.122.5",
3
+ "version": "1.122.6",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -234,7 +234,7 @@ describe('notifySilentTmuxSessions', () => {
234
234
  `${SILENT_SESSION_REMINDER_SENTINEL} CUSTOM_MAIN_TEMPLATE`,
235
235
  );
236
236
  expect(sendCall?.[1][4]).toContain(
237
- 'NEVER tell the owner to scroll up, go back, or read previous or above messages',
237
+ 'Please avoid telling the owner to scroll up, go back, or read previous or above messages',
238
238
  );
239
239
  });
240
240
 
@@ -64,10 +64,10 @@ describe('ConfigurableSilentSessionMessageComposer', () => {
64
64
  );
65
65
  expect(section).toContain('🔴');
66
66
  expect(section).toContain(
67
- 'Make the owner-call message fully self-contained: the owner MUST understand the whole situation — what happened, what you are asking, and any decision needed — from this single latest owner-call message alone, without reading or scrolling back to earlier messages.',
67
+ 'Make the owner-call message fully self-contained: the owner should be able to understand the whole situation — what happened, what you are asking, and any decision needed — from this single latest owner-call message alone, without reading or scrolling back to earlier messages.',
68
68
  );
69
69
  expect(section).toContain(
70
- 'NEVER tell the owner to scroll up, go back, or read previous or above messages; if context is needed, restate it inside the owner-call message itself.',
70
+ 'Please avoid telling the owner to scroll up, go back, or read previous or above messages; if context is needed, restate it inside the owner-call message itself.',
71
71
  );
72
72
  });
73
73
 
@@ -30,7 +30,7 @@ describe('DefaultSilentSessionMessageComposer', () => {
30
30
  expect(section).toContain(
31
31
  'Always work proactively and stay ahead of the work',
32
32
  );
33
- expect(section).toContain('never wait passively');
33
+ expect(section).toContain('rather than waiting passively');
34
34
  expect(section).toContain('Self-check now:');
35
35
  expect(section).toContain('1.');
36
36
  expect(section).toContain('2.');
@@ -50,7 +50,7 @@ describe('DefaultSilentSessionMessageComposer', () => {
50
50
  const section = composer.composeMainStalledSection(600);
51
51
  expect(section).toContain('🔴');
52
52
  expect(section).toContain(
53
- 'The content between the markers MUST begin with the 🔴 emoji immediately, with no space after it.',
53
+ 'The content between the markers needs to begin with the 🔴 emoji immediately, with no space after it.',
54
54
  );
55
55
  expect(section).toContain(
56
56
  'complete matching pair — opening marker, content, then closing marker — on a single line with no newline inside the tag.',
@@ -63,17 +63,17 @@ describe('DefaultSilentSessionMessageComposer', () => {
63
63
  it('requires the owner-call message to be fully self-contained and forbids telling the owner to scroll back', () => {
64
64
  const section = composer.composeMainStalledSection(600);
65
65
  expect(section).toContain(
66
- 'Make the owner-call message fully self-contained: the owner MUST understand the whole situation — what happened, what you are asking, and any decision needed — from this single latest owner-call message alone, without reading or scrolling back to earlier messages.',
66
+ 'Make the owner-call message fully self-contained: the owner should be able to understand the whole situation — what happened, what you are asking, and any decision needed — from this single latest owner-call message alone, without reading or scrolling back to earlier messages.',
67
67
  );
68
68
  expect(section).toContain(
69
- 'NEVER tell the owner to scroll up, go back, or read previous or above messages; if context is needed, restate it inside the owner-call message itself.',
69
+ 'Please avoid telling the owner to scroll up, go back, or read previous or above messages; if context is needed, restate it inside the owner-call message itself.',
70
70
  );
71
71
  });
72
72
 
73
73
  it('instructs the agent to fire the owner-call when an owner request has been completed or answered', () => {
74
74
  const section = composer.composeMainStalledSection(600);
75
75
  expect(section).toContain(
76
- 'If you have COMPLETED or ANSWERED a request from the owner in this session, you MUST fire the owner-call to report the RESULT to the owner',
76
+ 'If you have COMPLETED or ANSWERED a request from the owner in this session, please fire the owner-call to report the RESULT to the owner',
77
77
  );
78
78
  expect(section).toContain(
79
79
  "completing or answering an owner's requested action is itself a reason to fire the owner-call",
@@ -83,7 +83,7 @@ describe('DefaultSilentSessionMessageComposer', () => {
83
83
  it('explains that completing an owner request without an owner-call leaves the owner unnotified', () => {
84
84
  const section = composer.composeMainStalledSection(600);
85
85
  expect(section).toContain(
86
- 'Completing or answering an owner request WITHOUT firing the owner-call means the owner is NEVER notified',
86
+ 'Completing or answering an owner request WITHOUT firing the owner-call means the owner is not notified',
87
87
  );
88
88
  expect(section).toContain(
89
89
  "the owner's app only surfaces this session when the owner-call fires",
@@ -226,7 +226,7 @@ describe('DefaultSilentSessionMessageComposer', () => {
226
226
  "The system has already detected, from each sub-process's last tool activity, that it has produced no output for about the minutes shown below.",
227
227
  );
228
228
  expect(section).toContain(
229
- 'Treat that figure as the authoritative system signal; do NOT spend effort re-deriving whether the sub-process is alive.',
229
+ 'Please treat that figure as the authoritative system signal; there is no need to spend effort re-deriving whether the sub-process is alive.',
230
230
  );
231
231
  expect(section).toContain('no output for 6m');
232
232
  });
@@ -247,7 +247,7 @@ describe('DefaultSilentSessionMessageComposer', () => {
247
247
  'Around five minutes of silence is a real warning of a possible hang',
248
248
  );
249
249
  expect(section).toContain(
250
- 'do NOT speak from speculation ("probably still working") and do NOT dismiss it without evidence.',
250
+ 'please base your assessment on concrete evidence rather than speculation ("probably still working"), and please keep the warning in view until evidence resolves it.',
251
251
  );
252
252
  });
253
253
 
@@ -291,7 +291,7 @@ describe('DefaultSilentSessionMessageComposer', () => {
291
291
  longRunningSubAgents: [],
292
292
  });
293
293
  expect(section).toContain(
294
- 'Owner notification is not required, but you MUST output your investigation result in this session so it remains as a log.',
294
+ 'Owner notification is not required, but please output your investigation result in this session so it remains as a log.',
295
295
  );
296
296
  });
297
297
 
@@ -382,6 +382,39 @@ describe('DefaultSilentSessionMessageComposer', () => {
382
382
  expect(longRunningSection).not.toContain('idle-only');
383
383
  });
384
384
 
385
+ it('composes default texts free of prohibition-styled vocabulary that trips model safety classifiers', () => {
386
+ const flaggedPatterns = [
387
+ /unacceptable/i,
388
+ /\bnever\b/i,
389
+ /\b[Dd]o NOT\b/,
390
+ /\b[Yy]ou MUST\b/,
391
+ ];
392
+ const markedComposer = new DefaultSilentSessionMessageComposer(
393
+ '<<OWNER_CALL>>',
394
+ );
395
+ const subAgent = {
396
+ label: 'sub-process-1',
397
+ silentSeconds: 360,
398
+ runningSeconds: 1200,
399
+ waitingOnExternalProcess: false,
400
+ };
401
+ const composedDefaultTexts = [
402
+ composer.composeMainStalledSection(600),
403
+ markedComposer.composeMainStalledSection(600),
404
+ composer.composeMainStalledWithStaleOwnerCallSection(600, 3600),
405
+ markedComposer.composeMainStalledWithStaleOwnerCallSection(600, 3600),
406
+ composer.composeSubAgentSection({
407
+ idleSubAgents: [subAgent],
408
+ longRunningSubAgents: [subAgent],
409
+ }),
410
+ ];
411
+ for (const text of composedDefaultTexts) {
412
+ for (const pattern of flaggedPatterns) {
413
+ expect(text).not.toMatch(pattern);
414
+ }
415
+ }
416
+ });
417
+
385
418
  it('does not contain any host-specific or internal identifiers', () => {
386
419
  const mainSection = composer.composeMainStalledSection(600);
387
420
  const subAgent = {
@@ -20,9 +20,9 @@ const composeIdleSubAgentSection = (
20
20
  )}`,
21
21
  );
22
22
  return [
23
- `${SILENT_SESSION_REMINDER_SENTINEL} The system has already detected, from each sub-process's last tool activity, that it has produced no output for about the minutes shown below. Treat that figure as the authoritative system signal; do NOT spend effort re-deriving whether the sub-process is alive. Around five minutes of silence is a real warning of a possible hang: do NOT speak from speculation ("probably still working") and do NOT dismiss it without evidence.`,
23
+ `${SILENT_SESSION_REMINDER_SENTINEL} The system has already detected, from each sub-process's last tool activity, that it has produced no output for about the minutes shown below. Please treat that figure as the authoritative system signal; there is no need to spend effort re-deriving whether the sub-process is alive. Around five minutes of silence is a real warning of a possible hang: please base your assessment on concrete evidence rather than speculation ("probably still working"), and please keep the warning in view until evidence resolves it.`,
24
24
  ...lines,
25
- 'For each one, determine the CAUSE by a concrete check and report the result. Verify specifically: (a) whether there is genuinely no recent activity anywhere — including a very recent push or commit, or output from any nested sub-processes this sub-process itself started; and (b) whether it is legitimately blocked waiting on an external dependency (a continuous-integration run, an external API, or another process). Waiting on continuous integration is plausible, but confirm it by investigation before concluding — do not assume. Based on the check: if it is genuinely stuck, take action (restart, hand off, or replace it); if it is legitimately waiting, state that conclusion together with the concrete evidence you found. Owner notification is not required, but you MUST output your investigation result in this session so it remains as a log.',
25
+ 'For each one, determine the CAUSE by a concrete check and report the result. Verify specifically: (a) whether there is genuinely no recent activity anywhere — including a very recent push or commit, or output from any nested sub-processes this sub-process itself started; and (b) whether it is legitimately blocked waiting on an external dependency (a continuous-integration run, an external API, or another process). Waiting on continuous integration is plausible, but confirm it by investigation before concluding — do not assume. Based on the check: if it is genuinely stuck, take action (restart, hand off, or replace it); if it is legitimately waiting, state that conclusion together with the concrete evidence you found. Owner notification is not required, but please output your investigation result in this session so it remains as a log.',
26
26
  ].join('\n');
27
27
  };
28
28
 
@@ -49,7 +49,7 @@ export const composeOwnerCallFormatGuidance = (
49
49
  ownerCallMarker !== null && ownerCallMarker.length > 0
50
50
  ? `Emit the owner-call as the configured owner-call marker tag "${ownerCallMarker}" as a complete matching pair — opening marker, content, then closing marker — on a single line with no newline inside the tag.`
51
51
  : `Emit the owner-call as the configured owner-call marker tag as a complete matching pair — opening marker, content, then closing marker — on a single line with no newline inside the tag.`;
52
- return `${markerInstruction} The content between the markers MUST begin with the 🔴 emoji immediately, with no space after it. The owner's app only surfaces the notification together with its content when the exact, well-formed tag with the leading 🔴 is present; a malformed tag (a broken or missing closing marker, or a missing leading 🔴) results in only a red indicator with no readable content. Make the owner-call message fully self-contained: the owner MUST understand the whole situation — what happened, what you are asking, and any decision needed — from this single latest owner-call message alone, without reading or scrolling back to earlier messages. NEVER tell the owner to scroll up, go back, or read previous or above messages; if context is needed, restate it inside the owner-call message itself.`;
52
+ return `${markerInstruction} The content between the markers needs to begin with the 🔴 emoji immediately, with no space after it. The owner's app only surfaces the notification together with its content when the exact, well-formed tag with the leading 🔴 is present; a malformed tag (a broken or missing closing marker, or a missing leading 🔴) results in only a red indicator with no readable content. Make the owner-call message fully self-contained: the owner should be able to understand the whole situation — what happened, what you are asking, and any decision needed — from this single latest owner-call message alone, without reading or scrolling back to earlier messages. Please avoid telling the owner to scroll up, go back, or read previous or above messages; if context is needed, restate it inside the owner-call message itself.`;
53
53
  };
54
54
 
55
55
  const composeMainStalledMessage = (
@@ -58,11 +58,11 @@ const composeMainStalledMessage = (
58
58
  ): string => {
59
59
  const minutes = Math.floor(mainSilentSeconds / 60);
60
60
  return [
61
- `${SILENT_SESSION_REMINDER_SENTINEL} You have produced no output for ${minutes} minutes. Idle waiting wastes this live session and is unacceptable. Always work proactively and stay ahead of the work: anticipate the next steps and, at every point, choose the fastest path so the whole task finishes as early as possible; never wait passively. Finish every task in the shortest possible time — but "fastest" means correct and incident-free, not merely quick: a fast but wrong result is worthless and causes incidents, so be fast without breaking things. Use parallel execution and your whole team of sub-agents to minimize total wall-clock time. Your goal is to drive every task to completion and have the owner confirm that all tasks are done. Do NOT close this session on your own — it is closed only after the owner has verified completion and tells you to close it. Self-check now:`,
61
+ `${SILENT_SESSION_REMINDER_SENTINEL} You have produced no output for ${minutes} minutes. Idle waiting wastes this live session, so please keep making progress. Always work proactively and stay ahead of the work: anticipate the next steps and, at every point, choose the fastest path so the whole task finishes as early as possible, rather than waiting passively. Finish every task in the shortest possible time — but "fastest" means correct and incident-free, not merely quick: a fast but wrong result is worthless and causes incidents, so be fast without breaking things. Use parallel execution and your whole team of sub-agents to minimize total wall-clock time. Your goal is to drive every task to completion and have the owner confirm that all tasks are done. Please leave this session open rather than closing it on your own — it is closed only after the owner has verified completion and asks you to close it. Self-check now:`,
62
62
  `1. Every request from the owner is registered as a session task and your task list is kept current (mark tasks completed when done); verify nothing is missing or stale.`,
63
63
  `2. Your plan is the fastest correct path: parallelize independent work across sub-agents, delegate, and remove needless serialization. Choose the fastest safe method, not the easiest.`,
64
64
  `3. A monitor is in place that detects when any sub-agent produces no output for 5 minutes.`,
65
- `4. If you are blocked on an owner decision — or once you believe all tasks are complete — do not wait passively: the owner is not notified of passive waiting and will not reply unless you raise a new call-to-user, so raise one now (to get the decision, or to ask the owner to verify completion). If you have COMPLETED or ANSWERED a request from the owner in this session, you MUST fire the owner-call to report the RESULT to the owner: completing or answering an owner's requested action is itself a reason to fire the owner-call. Completing or answering an owner request WITHOUT firing the owner-call means the owner is NEVER notified — the owner's app only surfaces this session when the owner-call fires — so the task silently stalls. If this self-check reminder keeps arriving, it is likely because an owner request was completed or answered without firing the owner-call; fire the owner-call now to report the result to the owner. ${composeOwnerCallFormatGuidance(ownerCallMarker)} If no owner input is needed yet, resume immediately and drive all remaining tasks to completion.`,
65
+ `4. If you are blocked on an owner decision — or once you believe all tasks are complete — do not wait passively: the owner is not notified of passive waiting and will not reply unless you raise a new call-to-user, so raise one now (to get the decision, or to ask the owner to verify completion). If you have COMPLETED or ANSWERED a request from the owner in this session, please fire the owner-call to report the RESULT to the owner: completing or answering an owner's requested action is itself a reason to fire the owner-call. Completing or answering an owner request WITHOUT firing the owner-call means the owner is not notified — the owner's app only surfaces this session when the owner-call fires — so the task silently stalls. If this self-check reminder keeps arriving, it is likely because an owner request was completed or answered without firing the owner-call; fire the owner-call now to report the result to the owner. ${composeOwnerCallFormatGuidance(ownerCallMarker)} If no owner input is needed yet, resume immediately and drive all remaining tasks to completion.`,
66
66
  `Also, in your next output, report an estimate of how many minutes you expect to need to finish all remaining tasks.`,
67
67
  ].join('\n');
68
68
  };