Skip to content
This repository was archived by the owner on May 15, 2026. It is now read-only.

fix: resolve phantom subtask display on cancel during API retry (#4602) - #4893

Merged
hannesrudolph merged 3 commits into
mainfrom
fix/issue-4602-phantom-subtask-results
Jun 19, 2025
Merged

fix: resolve phantom subtask display on cancel during API retry (#4602)#4893
hannesrudolph merged 3 commits into
mainfrom
fix/issue-4602-phantom-subtask-results

Conversation

@hannesrudolph

@hannesrudolphhannesrudolph commented Jun 19, 2025

Copy link
Copy Markdown
Contributor

Description

Fixes#4602

This PR resolves an issue where canceling a task during API retry would incorrectly display "Subtask Results" and create a checkpoint initialization loop, even though no subtask was actually created.

Changes Made

  • Modified the clearTask handler in webviewMessageHandler.ts to check for the existence of a parentTask property instead of relying on stack size
  • This ensures that only actual subtasks (tasks with a parent) trigger the finishSubTask() method
  • Single tasks without parents now correctly use clearTask() instead

Testing

  • All existing tests pass
  • Added comprehensive test coverage in ClineProvider.spec.ts:
  • Manual testing completed:
    • Started a task that triggers API retry
    • Canceled during the retry period
    • Verified no phantom "Subtask Results" appears
    • Verified no checkpoint initialization loop occurs

Verification of Acceptance Criteria

  • When canceling during API retry, no "Subtask Results" display appears
  • No checkpoint initialization loop is triggered
  • The fix correctly distinguishes between actual subtasks and single tasks
  • All tests pass and the implementation is properly tested

Checklist

  • Code follows project style guidelines
  • Self-review completed
  • Comments added for complex logic
  • Documentation updated (if needed)
  • No breaking changes
  • Tests added for the fix

Technical Details

The root cause was that the previous implementation checked provider.getClineStackSize() > 1 to determine if a task was a subtask. However, during API retry scenarios, the stack could have multiple entries even for a single task, leading to incorrect behavior.

The fix now properly checks for the existence of a parentTask property on the current task, which is the definitive way to determine if a task is actually a subtask.


Important

Fixes phantom subtask display issue by checking parentTask property in webviewMessageHandler.ts during task cancellation.

This description was created by Ellipsis for 0cc9eca. You can customize this summary. It will automatically update as commits are pushed.

- Fixed clearTask handler to check for actual parent task existence
- Changed condition from getClineStackSize() > 1 to checking currentTask.parentTask
- Prevents finishSubTask() from being called on tasks without parents
- Added comprehensive test coverage for clearTask message handler
- Resolves infinite checkpoint initialization loop issue
- Modified clearTask handler to check for parentTask property instead of stack size
- This prevents single tasks from being incorrectly treated as subtasks
- Added comprehensive test coverage for the fix
- Fixes issue where canceling during API retry would show phantom 'Subtask Results' and create checkpoint initialization loop
CopilotAI review requested due to automatic review settings June 19, 2025 18:12
@dosubotdosubotBot added size:L This PR changes 100-499 lines, ignoring generated files. bug Something isn't working labels Jun 19, 2025

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Fixes an issue where canceling during an API retry incorrectly treated single tasks as subtasks.

  • Replace getClineStackSize() check with explicit parentTask existence in the clearTask handler
  • Introduce a new clearTask() method on ClineProvider for non-subtask cancellations
  • Add comprehensive tests for both subtask and single-task cancellation flows

Reviewed Changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

FileDescription
src/core/webview/webviewMessageHandler.tsUpdated clearTask case to branch on currentTask.parentTask and call finishSubTask or clearTask
src/core/webview/ClineProvider.tsAdded clearTask() helper to remove the current task without subtask logic
src/core/webview/tests/ClineProvider.spec.tsAdded tests covering the new clearTask logic, including the fix for issue #4602
Comments suppressed due to low confidence (2)

src/core/webview/tests/ClineProvider.spec.ts:675

  • This test does not mock or assert postStateToWebview; consider spying on provider.postStateToWebview to both avoid unintended side effects and verify that state is posted in this scenario.
 await messageHandler({ type: "clearTask" })

src/core/webview/webviewMessageHandler.ts:207

  • The translation function t is used here but not imported in this module. Add the appropriate import (e.g. import { t } from 'i18n';) to prevent a runtime error.
 await provider.finishSubTask(t("common:tasks.canceled"))

Comment threadsrc/core/webview/ClineProvider.ts Outdated
@hannesrudolphhannesrudolph added the Issue/PR - Triage New issue. Needs quick review to confirm validity and assign labels. label Jun 19, 2025
@hannesrudolphhannesrudolph moved this from Triage to PR [Needs Prelim Review] in Roo Code RoadmapJun 19, 2025
@hannesrudolphhannesrudolph added PR - Needs Preliminary Review and removed Issue/PR - Triage New issue. Needs quick review to confirm validity and assign labels. labels Jun 19, 2025
@daniel-lxsdaniel-lxs moved this from PR [Needs Prelim Review] to PR [Needs Review] in Roo Code RoadmapJun 19, 2025

@daniel-lxsdaniel-lxs left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGMT

@dosubotdosubotBot added the lgtm This PR has been approved by a maintainer label Jun 19, 2025
@hannesrudolph
hannesrudolph merged commit 9e96fca into mainJun 19, 2025
@hannesrudolph
hannesrudolph deleted the fix/issue-4602-phantom-subtask-results branch June 19, 2025 19:41
@github-project-automationgithub-project-automationBot moved this from PR [Needs Review] to Done in Roo Code RoadmapJun 19, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

bugSomething isn't workinglgtmThis PR has been approved by a maintainerPR - Needs Reviewsize:LThis PR changes 100-499 lines, ignoring generated files.

Projects

No open projects
Archived in project

Development

Successfully merging this pull request may close these issues.

Canceling API Retry Creates Phantom Subtask and Checkpoint Initialization Loop

4 participants

@hannesrudolph@mrubens@daniel-lxs
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
fix: resolve phantom subtask display on cancel during API retry (#4602) by hannesrudolph · Pull Request #4893 · RooCodeInc/Roo-Code · GitHub
Skip to content
This repository was archived by the owner on May 15, 2026. It is now read-only.

fix: resolve phantom subtask display on cancel during API retry (#4602) - #4893

Merged
hannesrudolph merged 3 commits into
mainfrom
fix/issue-4602-phantom-subtask-results
Jun 19, 2025
Merged

fix: resolve phantom subtask display on cancel during API retry (#4602)#4893
hannesrudolph merged 3 commits into
mainfrom
fix/issue-4602-phantom-subtask-results

Conversation

@hannesrudolph

@hannesrudolphhannesrudolph commented Jun 19, 2025

Copy link
Copy Markdown
Contributor

Description

Fixes#4602

This PR resolves an issue where canceling a task during API retry would incorrectly display "Subtask Results" and create a checkpoint initialization loop, even though no subtask was actually created.

Changes Made

  • Modified the clearTask handler in webviewMessageHandler.ts to check for the existence of a parentTask property instead of relying on stack size
  • This ensures that only actual subtasks (tasks with a parent) trigger the finishSubTask() method
  • Single tasks without parents now correctly use clearTask() instead

Testing

  • All existing tests pass
  • Added comprehensive test coverage in ClineProvider.spec.ts:
  • Manual testing completed:
    • Started a task that triggers API retry
    • Canceled during the retry period
    • Verified no phantom "Subtask Results" appears
    • Verified no checkpoint initialization loop occurs

Verification of Acceptance Criteria

  • When canceling during API retry, no "Subtask Results" display appears
  • No checkpoint initialization loop is triggered
  • The fix correctly distinguishes between actual subtasks and single tasks
  • All tests pass and the implementation is properly tested

Checklist

  • Code follows project style guidelines
  • Self-review completed
  • Comments added for complex logic
  • Documentation updated (if needed)
  • No breaking changes
  • Tests added for the fix

Technical Details

The root cause was that the previous implementation checked provider.getClineStackSize() > 1 to determine if a task was a subtask. However, during API retry scenarios, the stack could have multiple entries even for a single task, leading to incorrect behavior.

The fix now properly checks for the existence of a parentTask property on the current task, which is the definitive way to determine if a task is actually a subtask.


Important

Fixes phantom subtask display issue by checking parentTask property in webviewMessageHandler.ts during task cancellation.

This description was created by Ellipsis for 0cc9eca. You can customize this summary. It will automatically update as commits are pushed.

- Fixed clearTask handler to check for actual parent task existence
- Changed condition from getClineStackSize() > 1 to checking currentTask.parentTask
- Prevents finishSubTask() from being called on tasks without parents
- Added comprehensive test coverage for clearTask message handler
- Resolves infinite checkpoint initialization loop issue
- Modified clearTask handler to check for parentTask property instead of stack size
- This prevents single tasks from being incorrectly treated as subtasks
- Added comprehensive test coverage for the fix
- Fixes issue where canceling during API retry would show phantom 'Subtask Results' and create checkpoint initialization loop
CopilotAI review requested due to automatic review settings June 19, 2025 18:12
@dosubotdosubotBot added size:L This PR changes 100-499 lines, ignoring generated files. bug Something isn't working labels Jun 19, 2025

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Fixes an issue where canceling during an API retry incorrectly treated single tasks as subtasks.

  • Replace getClineStackSize() check with explicit parentTask existence in the clearTask handler
  • Introduce a new clearTask() method on ClineProvider for non-subtask cancellations
  • Add comprehensive tests for both subtask and single-task cancellation flows

Reviewed Changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

FileDescription
src/core/webview/webviewMessageHandler.tsUpdated clearTask case to branch on currentTask.parentTask and call finishSubTask or clearTask
src/core/webview/ClineProvider.tsAdded clearTask() helper to remove the current task without subtask logic
src/core/webview/tests/ClineProvider.spec.tsAdded tests covering the new clearTask logic, including the fix for issue #4602
Comments suppressed due to low confidence (2)

src/core/webview/tests/ClineProvider.spec.ts:675

  • This test does not mock or assert postStateToWebview; consider spying on provider.postStateToWebview to both avoid unintended side effects and verify that state is posted in this scenario.
 await messageHandler({ type: "clearTask" })

src/core/webview/webviewMessageHandler.ts:207

  • The translation function t is used here but not imported in this module. Add the appropriate import (e.g. import { t } from 'i18n';) to prevent a runtime error.
 await provider.finishSubTask(t("common:tasks.canceled"))

Comment threadsrc/core/webview/ClineProvider.ts Outdated
@hannesrudolphhannesrudolph added the Issue/PR - Triage New issue. Needs quick review to confirm validity and assign labels. label Jun 19, 2025
@hannesrudolphhannesrudolph moved this from Triage to PR [Needs Prelim Review] in Roo Code RoadmapJun 19, 2025
@hannesrudolphhannesrudolph added PR - Needs Preliminary Review and removed Issue/PR - Triage New issue. Needs quick review to confirm validity and assign labels. labels Jun 19, 2025
@daniel-lxsdaniel-lxs moved this from PR [Needs Prelim Review] to PR [Needs Review] in Roo Code RoadmapJun 19, 2025

@daniel-lxsdaniel-lxs left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGMT

@dosubotdosubotBot added the lgtm This PR has been approved by a maintainer label Jun 19, 2025
@hannesrudolph
hannesrudolph merged commit 9e96fca into mainJun 19, 2025
@hannesrudolph
hannesrudolph deleted the fix/issue-4602-phantom-subtask-results branch June 19, 2025 19:41
@github-project-automationgithub-project-automationBot moved this from PR [Needs Review] to Done in Roo Code RoadmapJun 19, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

bugSomething isn't workinglgtmThis PR has been approved by a maintainerPR - Needs Reviewsize:LThis PR changes 100-499 lines, ignoring generated files.

Projects

No open projects
Archived in project

Development

Successfully merging this pull request may close these issues.

Canceling API Retry Creates Phantom Subtask and Checkpoint Initialization Loop

4 participants

@hannesrudolph@mrubens@daniel-lxs
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: resolve phantom subtask display on cancel during API retry (#4602) by hannesrudolph · Pull Request #4893 · RooCodeInc/Roo-Code · GitHub
Skip to content
This repository was archived by the owner on May 15, 2026. It is now read-only.

fix: resolve phantom subtask display on cancel during API retry (#4602) - #4893

Merged
hannesrudolph merged 3 commits into
mainfrom
fix/issue-4602-phantom-subtask-results
Jun 19, 2025
Merged

fix: resolve phantom subtask display on cancel during API retry (#4602)#4893
hannesrudolph merged 3 commits into
mainfrom
fix/issue-4602-phantom-subtask-results

Conversation

@hannesrudolph

@hannesrudolphhannesrudolph commented Jun 19, 2025

Copy link
Copy Markdown
Contributor

Description

Fixes#4602

This PR resolves an issue where canceling a task during API retry would incorrectly display "Subtask Results" and create a checkpoint initialization loop, even though no subtask was actually created.

Changes Made

  • Modified the clearTask handler in webviewMessageHandler.ts to check for the existence of a parentTask property instead of relying on stack size
  • This ensures that only actual subtasks (tasks with a parent) trigger the finishSubTask() method
  • Single tasks without parents now correctly use clearTask() instead

Testing

  • All existing tests pass
  • Added comprehensive test coverage in ClineProvider.spec.ts:
  • Manual testing completed:
    • Started a task that triggers API retry
    • Canceled during the retry period
    • Verified no phantom "Subtask Results" appears
    • Verified no checkpoint initialization loop occurs

Verification of Acceptance Criteria

  • When canceling during API retry, no "Subtask Results" display appears
  • No checkpoint initialization loop is triggered
  • The fix correctly distinguishes between actual subtasks and single tasks
  • All tests pass and the implementation is properly tested

Checklist

  • Code follows project style guidelines
  • Self-review completed
  • Comments added for complex logic
  • Documentation updated (if needed)
  • No breaking changes
  • Tests added for the fix

Technical Details

The root cause was that the previous implementation checked provider.getClineStackSize() > 1 to determine if a task was a subtask. However, during API retry scenarios, the stack could have multiple entries even for a single task, leading to incorrect behavior.

The fix now properly checks for the existence of a parentTask property on the current task, which is the definitive way to determine if a task is actually a subtask.


Important

Fixes phantom subtask display issue by checking parentTask property in webviewMessageHandler.ts during task cancellation.

This description was created by Ellipsis for 0cc9eca. You can customize this summary. It will automatically update as commits are pushed.

- Fixed clearTask handler to check for actual parent task existence
- Changed condition from getClineStackSize() > 1 to checking currentTask.parentTask
- Prevents finishSubTask() from being called on tasks without parents
- Added comprehensive test coverage for clearTask message handler
- Resolves infinite checkpoint initialization loop issue
- Modified clearTask handler to check for parentTask property instead of stack size
- This prevents single tasks from being incorrectly treated as subtasks
- Added comprehensive test coverage for the fix
- Fixes issue where canceling during API retry would show phantom 'Subtask Results' and create checkpoint initialization loop
CopilotAI review requested due to automatic review settings June 19, 2025 18:12
@dosubotdosubotBot added size:L This PR changes 100-499 lines, ignoring generated files. bug Something isn't working labels Jun 19, 2025

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Fixes an issue where canceling during an API retry incorrectly treated single tasks as subtasks.

  • Replace getClineStackSize() check with explicit parentTask existence in the clearTask handler
  • Introduce a new clearTask() method on ClineProvider for non-subtask cancellations
  • Add comprehensive tests for both subtask and single-task cancellation flows

Reviewed Changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

FileDescription
src/core/webview/webviewMessageHandler.tsUpdated clearTask case to branch on currentTask.parentTask and call finishSubTask or clearTask
src/core/webview/ClineProvider.tsAdded clearTask() helper to remove the current task without subtask logic
src/core/webview/tests/ClineProvider.spec.tsAdded tests covering the new clearTask logic, including the fix for issue #4602
Comments suppressed due to low confidence (2)

src/core/webview/tests/ClineProvider.spec.ts:675

  • This test does not mock or assert postStateToWebview; consider spying on provider.postStateToWebview to both avoid unintended side effects and verify that state is posted in this scenario.
 await messageHandler({ type: "clearTask" })

src/core/webview/webviewMessageHandler.ts:207

  • The translation function t is used here but not imported in this module. Add the appropriate import (e.g. import { t } from 'i18n';) to prevent a runtime error.
 await provider.finishSubTask(t("common:tasks.canceled"))

Comment threadsrc/core/webview/ClineProvider.ts Outdated
@hannesrudolphhannesrudolph added the Issue/PR - Triage New issue. Needs quick review to confirm validity and assign labels. label Jun 19, 2025
@hannesrudolphhannesrudolph moved this from Triage to PR [Needs Prelim Review] in Roo Code RoadmapJun 19, 2025
@hannesrudolphhannesrudolph added PR - Needs Preliminary Review and removed Issue/PR - Triage New issue. Needs quick review to confirm validity and assign labels. labels Jun 19, 2025
@daniel-lxsdaniel-lxs moved this from PR [Needs Prelim Review] to PR [Needs Review] in Roo Code RoadmapJun 19, 2025

@daniel-lxsdaniel-lxs left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGMT

@dosubotdosubotBot added the lgtm This PR has been approved by a maintainer label Jun 19, 2025
@hannesrudolph
hannesrudolph merged commit 9e96fca into mainJun 19, 2025
@hannesrudolph
hannesrudolph deleted the fix/issue-4602-phantom-subtask-results branch June 19, 2025 19:41
@github-project-automationgithub-project-automationBot moved this from PR [Needs Review] to Done in Roo Code RoadmapJun 19, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

bugSomething isn't workinglgtmThis PR has been approved by a maintainerPR - Needs Reviewsize:LThis PR changes 100-499 lines, ignoring generated files.

Projects

No open projects
Archived in project

Development

Successfully merging this pull request may close these issues.

Canceling API Retry Creates Phantom Subtask and Checkpoint Initialization Loop

4 participants

@hannesrudolph@mrubens@daniel-lxs
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: resolve phantom subtask display on cancel during API retry (#4602) by hannesrudolph · Pull Request #4893 · RooCodeInc/Roo-Code · GitHub
Skip to content
This repository was archived by the owner on May 15, 2026. It is now read-only.

fix: resolve phantom subtask display on cancel during API retry (#4602) - #4893

Merged
hannesrudolph merged 3 commits into
mainfrom
fix/issue-4602-phantom-subtask-results
Jun 19, 2025
Merged

fix: resolve phantom subtask display on cancel during API retry (#4602)#4893
hannesrudolph merged 3 commits into
mainfrom
fix/issue-4602-phantom-subtask-results

Conversation

@hannesrudolph

@hannesrudolphhannesrudolph commented Jun 19, 2025

Copy link
Copy Markdown
Contributor

Description

Fixes#4602

This PR resolves an issue where canceling a task during API retry would incorrectly display "Subtask Results" and create a checkpoint initialization loop, even though no subtask was actually created.

Changes Made

  • Modified the clearTask handler in webviewMessageHandler.ts to check for the existence of a parentTask property instead of relying on stack size
  • This ensures that only actual subtasks (tasks with a parent) trigger the finishSubTask() method
  • Single tasks without parents now correctly use clearTask() instead

Testing

  • All existing tests pass
  • Added comprehensive test coverage in ClineProvider.spec.ts:
  • Manual testing completed:
    • Started a task that triggers API retry
    • Canceled during the retry period
    • Verified no phantom "Subtask Results" appears
    • Verified no checkpoint initialization loop occurs

Verification of Acceptance Criteria

  • When canceling during API retry, no "Subtask Results" display appears
  • No checkpoint initialization loop is triggered
  • The fix correctly distinguishes between actual subtasks and single tasks
  • All tests pass and the implementation is properly tested

Checklist

  • Code follows project style guidelines
  • Self-review completed
  • Comments added for complex logic
  • Documentation updated (if needed)
  • No breaking changes
  • Tests added for the fix

Technical Details

The root cause was that the previous implementation checked provider.getClineStackSize() > 1 to determine if a task was a subtask. However, during API retry scenarios, the stack could have multiple entries even for a single task, leading to incorrect behavior.

The fix now properly checks for the existence of a parentTask property on the current task, which is the definitive way to determine if a task is actually a subtask.


Important

Fixes phantom subtask display issue by checking parentTask property in webviewMessageHandler.ts during task cancellation.

This description was created by Ellipsis for 0cc9eca. You can customize this summary. It will automatically update as commits are pushed.

- Fixed clearTask handler to check for actual parent task existence
- Changed condition from getClineStackSize() > 1 to checking currentTask.parentTask
- Prevents finishSubTask() from being called on tasks without parents
- Added comprehensive test coverage for clearTask message handler
- Resolves infinite checkpoint initialization loop issue
- Modified clearTask handler to check for parentTask property instead of stack size
- This prevents single tasks from being incorrectly treated as subtasks
- Added comprehensive test coverage for the fix
- Fixes issue where canceling during API retry would show phantom 'Subtask Results' and create checkpoint initialization loop
CopilotAI review requested due to automatic review settings June 19, 2025 18:12
@dosubotdosubotBot added size:L This PR changes 100-499 lines, ignoring generated files. bug Something isn't working labels Jun 19, 2025

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Fixes an issue where canceling during an API retry incorrectly treated single tasks as subtasks.

  • Replace getClineStackSize() check with explicit parentTask existence in the clearTask handler
  • Introduce a new clearTask() method on ClineProvider for non-subtask cancellations
  • Add comprehensive tests for both subtask and single-task cancellation flows

Reviewed Changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

FileDescription
src/core/webview/webviewMessageHandler.tsUpdated clearTask case to branch on currentTask.parentTask and call finishSubTask or clearTask
src/core/webview/ClineProvider.tsAdded clearTask() helper to remove the current task without subtask logic
src/core/webview/tests/ClineProvider.spec.tsAdded tests covering the new clearTask logic, including the fix for issue #4602
Comments suppressed due to low confidence (2)

src/core/webview/tests/ClineProvider.spec.ts:675

  • This test does not mock or assert postStateToWebview; consider spying on provider.postStateToWebview to both avoid unintended side effects and verify that state is posted in this scenario.
 await messageHandler({ type: "clearTask" })

src/core/webview/webviewMessageHandler.ts:207

  • The translation function t is used here but not imported in this module. Add the appropriate import (e.g. import { t } from 'i18n';) to prevent a runtime error.
 await provider.finishSubTask(t("common:tasks.canceled"))

Comment threadsrc/core/webview/ClineProvider.ts Outdated
@hannesrudolphhannesrudolph added the Issue/PR - Triage New issue. Needs quick review to confirm validity and assign labels. label Jun 19, 2025
@hannesrudolphhannesrudolph moved this from Triage to PR [Needs Prelim Review] in Roo Code RoadmapJun 19, 2025
@hannesrudolphhannesrudolph added PR - Needs Preliminary Review and removed Issue/PR - Triage New issue. Needs quick review to confirm validity and assign labels. labels Jun 19, 2025
@daniel-lxsdaniel-lxs moved this from PR [Needs Prelim Review] to PR [Needs Review] in Roo Code RoadmapJun 19, 2025

@daniel-lxsdaniel-lxs left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGMT

@dosubotdosubotBot added the lgtm This PR has been approved by a maintainer label Jun 19, 2025
@hannesrudolph
hannesrudolph merged commit 9e96fca into mainJun 19, 2025
@hannesrudolph
hannesrudolph deleted the fix/issue-4602-phantom-subtask-results branch June 19, 2025 19:41
@github-project-automationgithub-project-automationBot moved this from PR [Needs Review] to Done in Roo Code RoadmapJun 19, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

bugSomething isn't workinglgtmThis PR has been approved by a maintainerPR - Needs Reviewsize:LThis PR changes 100-499 lines, ignoring generated files.

Projects

No open projects
Archived in project

Development

Successfully merging this pull request may close these issues.

Canceling API Retry Creates Phantom Subtask and Checkpoint Initialization Loop

4 participants

@hannesrudolph@mrubens@daniel-lxs
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' fix: resolve phantom subtask display on cancel during API retry (#4602) by hannesrudolph · Pull Request #4893 · RooCodeInc/Roo-Code · GitHub
Skip to content
This repository was archived by the owner on May 15, 2026. It is now read-only.

fix: resolve phantom subtask display on cancel during API retry (#4602) - #4893

Merged
hannesrudolph merged 3 commits into
mainfrom
fix/issue-4602-phantom-subtask-results
Jun 19, 2025
Merged

fix: resolve phantom subtask display on cancel during API retry (#4602)#4893
hannesrudolph merged 3 commits into
mainfrom
fix/issue-4602-phantom-subtask-results

Conversation

@hannesrudolph

@hannesrudolphhannesrudolph commented Jun 19, 2025

Copy link
Copy Markdown
Contributor

Description

Fixes#4602

This PR resolves an issue where canceling a task during API retry would incorrectly display "Subtask Results" and create a checkpoint initialization loop, even though no subtask was actually created.

Changes Made

  • Modified the clearTask handler in webviewMessageHandler.ts to check for the existence of a parentTask property instead of relying on stack size
  • This ensures that only actual subtasks (tasks with a parent) trigger the finishSubTask() method
  • Single tasks without parents now correctly use clearTask() instead

Testing

  • All existing tests pass
  • Added comprehensive test coverage in ClineProvider.spec.ts:
  • Manual testing completed:
    • Started a task that triggers API retry
    • Canceled during the retry period
    • Verified no phantom "Subtask Results" appears
    • Verified no checkpoint initialization loop occurs

Verification of Acceptance Criteria

  • When canceling during API retry, no "Subtask Results" display appears
  • No checkpoint initialization loop is triggered
  • The fix correctly distinguishes between actual subtasks and single tasks
  • All tests pass and the implementation is properly tested

Checklist

  • Code follows project style guidelines
  • Self-review completed
  • Comments added for complex logic
  • Documentation updated (if needed)
  • No breaking changes
  • Tests added for the fix

Technical Details

The root cause was that the previous implementation checked provider.getClineStackSize() > 1 to determine if a task was a subtask. However, during API retry scenarios, the stack could have multiple entries even for a single task, leading to incorrect behavior.

The fix now properly checks for the existence of a parentTask property on the current task, which is the definitive way to determine if a task is actually a subtask.


Important

Fixes phantom subtask display issue by checking parentTask property in webviewMessageHandler.ts during task cancellation.

This description was created by Ellipsis for 0cc9eca. You can customize this summary. It will automatically update as commits are pushed.

- Fixed clearTask handler to check for actual parent task existence
- Changed condition from getClineStackSize() > 1 to checking currentTask.parentTask
- Prevents finishSubTask() from being called on tasks without parents
- Added comprehensive test coverage for clearTask message handler
- Resolves infinite checkpoint initialization loop issue
- Modified clearTask handler to check for parentTask property instead of stack size
- This prevents single tasks from being incorrectly treated as subtasks
- Added comprehensive test coverage for the fix
- Fixes issue where canceling during API retry would show phantom 'Subtask Results' and create checkpoint initialization loop
CopilotAI review requested due to automatic review settings June 19, 2025 18:12
@dosubotdosubotBot added size:L This PR changes 100-499 lines, ignoring generated files. bug Something isn't working labels Jun 19, 2025

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Fixes an issue where canceling during an API retry incorrectly treated single tasks as subtasks.

  • Replace getClineStackSize() check with explicit parentTask existence in the clearTask handler
  • Introduce a new clearTask() method on ClineProvider for non-subtask cancellations
  • Add comprehensive tests for both subtask and single-task cancellation flows

Reviewed Changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

FileDescription
src/core/webview/webviewMessageHandler.tsUpdated clearTask case to branch on currentTask.parentTask and call finishSubTask or clearTask
src/core/webview/ClineProvider.tsAdded clearTask() helper to remove the current task without subtask logic
src/core/webview/tests/ClineProvider.spec.tsAdded tests covering the new clearTask logic, including the fix for issue #4602
Comments suppressed due to low confidence (2)

src/core/webview/tests/ClineProvider.spec.ts:675

  • This test does not mock or assert postStateToWebview; consider spying on provider.postStateToWebview to both avoid unintended side effects and verify that state is posted in this scenario.
 await messageHandler({ type: "clearTask" })

src/core/webview/webviewMessageHandler.ts:207

  • The translation function t is used here but not imported in this module. Add the appropriate import (e.g. import { t } from 'i18n';) to prevent a runtime error.
 await provider.finishSubTask(t("common:tasks.canceled"))

Comment threadsrc/core/webview/ClineProvider.ts Outdated
@hannesrudolphhannesrudolph added the Issue/PR - Triage New issue. Needs quick review to confirm validity and assign labels. label Jun 19, 2025
@hannesrudolphhannesrudolph moved this from Triage to PR [Needs Prelim Review] in Roo Code RoadmapJun 19, 2025
@hannesrudolphhannesrudolph added PR - Needs Preliminary Review and removed Issue/PR - Triage New issue. Needs quick review to confirm validity and assign labels. labels Jun 19, 2025
@daniel-lxsdaniel-lxs moved this from PR [Needs Prelim Review] to PR [Needs Review] in Roo Code RoadmapJun 19, 2025

@daniel-lxsdaniel-lxs left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGMT

@dosubotdosubotBot added the lgtm This PR has been approved by a maintainer label Jun 19, 2025
@hannesrudolph
hannesrudolph merged commit 9e96fca into mainJun 19, 2025
@hannesrudolph
hannesrudolph deleted the fix/issue-4602-phantom-subtask-results branch June 19, 2025 19:41
@github-project-automationgithub-project-automationBot moved this from PR [Needs Review] to Done in Roo Code RoadmapJun 19, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

bugSomething isn't workinglgtmThis PR has been approved by a maintainerPR - Needs Reviewsize:LThis PR changes 100-499 lines, ignoring generated files.

Projects

No open projects
Archived in project

Development

Successfully merging this pull request may close these issues.

Canceling API Retry Creates Phantom Subtask and Checkpoint Initialization Loop

4 participants

@hannesrudolph@mrubens@daniel-lxs
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: resolve phantom subtask display on cancel during API retry (#4602) by hannesrudolph · Pull Request #4893 · RooCodeInc/Roo-Code · GitHub
Skip to content
This repository was archived by the owner on May 15, 2026. It is now read-only.

fix: resolve phantom subtask display on cancel during API retry (#4602) - #4893

Merged
hannesrudolph merged 3 commits into
mainfrom
fix/issue-4602-phantom-subtask-results
Jun 19, 2025
Merged

fix: resolve phantom subtask display on cancel during API retry (#4602)#4893
hannesrudolph merged 3 commits into
mainfrom
fix/issue-4602-phantom-subtask-results

Conversation

@hannesrudolph

@hannesrudolphhannesrudolph commented Jun 19, 2025

Copy link
Copy Markdown
Contributor

Description

Fixes#4602

This PR resolves an issue where canceling a task during API retry would incorrectly display "Subtask Results" and create a checkpoint initialization loop, even though no subtask was actually created.

Changes Made

  • Modified the clearTask handler in webviewMessageHandler.ts to check for the existence of a parentTask property instead of relying on stack size
  • This ensures that only actual subtasks (tasks with a parent) trigger the finishSubTask() method
  • Single tasks without parents now correctly use clearTask() instead

Testing

  • All existing tests pass
  • Added comprehensive test coverage in ClineProvider.spec.ts:
  • Manual testing completed:
    • Started a task that triggers API retry
    • Canceled during the retry period
    • Verified no phantom "Subtask Results" appears
    • Verified no checkpoint initialization loop occurs

Verification of Acceptance Criteria

  • When canceling during API retry, no "Subtask Results" display appears
  • No checkpoint initialization loop is triggered
  • The fix correctly distinguishes between actual subtasks and single tasks
  • All tests pass and the implementation is properly tested

Checklist

  • Code follows project style guidelines
  • Self-review completed
  • Comments added for complex logic
  • Documentation updated (if needed)
  • No breaking changes
  • Tests added for the fix

Technical Details

The root cause was that the previous implementation checked provider.getClineStackSize() > 1 to determine if a task was a subtask. However, during API retry scenarios, the stack could have multiple entries even for a single task, leading to incorrect behavior.

The fix now properly checks for the existence of a parentTask property on the current task, which is the definitive way to determine if a task is actually a subtask.


Important

Fixes phantom subtask display issue by checking parentTask property in webviewMessageHandler.ts during task cancellation.

This description was created by Ellipsis for 0cc9eca. You can customize this summary. It will automatically update as commits are pushed.

- Fixed clearTask handler to check for actual parent task existence
- Changed condition from getClineStackSize() > 1 to checking currentTask.parentTask
- Prevents finishSubTask() from being called on tasks without parents
- Added comprehensive test coverage for clearTask message handler
- Resolves infinite checkpoint initialization loop issue
- Modified clearTask handler to check for parentTask property instead of stack size
- This prevents single tasks from being incorrectly treated as subtasks
- Added comprehensive test coverage for the fix
- Fixes issue where canceling during API retry would show phantom 'Subtask Results' and create checkpoint initialization loop
CopilotAI review requested due to automatic review settings June 19, 2025 18:12
@dosubotdosubotBot added size:L This PR changes 100-499 lines, ignoring generated files. bug Something isn't working labels Jun 19, 2025

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Fixes an issue where canceling during an API retry incorrectly treated single tasks as subtasks.

  • Replace getClineStackSize() check with explicit parentTask existence in the clearTask handler
  • Introduce a new clearTask() method on ClineProvider for non-subtask cancellations
  • Add comprehensive tests for both subtask and single-task cancellation flows

Reviewed Changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

FileDescription
src/core/webview/webviewMessageHandler.tsUpdated clearTask case to branch on currentTask.parentTask and call finishSubTask or clearTask
src/core/webview/ClineProvider.tsAdded clearTask() helper to remove the current task without subtask logic
src/core/webview/tests/ClineProvider.spec.tsAdded tests covering the new clearTask logic, including the fix for issue #4602
Comments suppressed due to low confidence (2)

src/core/webview/tests/ClineProvider.spec.ts:675

  • This test does not mock or assert postStateToWebview; consider spying on provider.postStateToWebview to both avoid unintended side effects and verify that state is posted in this scenario.
 await messageHandler({ type: "clearTask" })

src/core/webview/webviewMessageHandler.ts:207

  • The translation function t is used here but not imported in this module. Add the appropriate import (e.g. import { t } from 'i18n';) to prevent a runtime error.
 await provider.finishSubTask(t("common:tasks.canceled"))

Comment threadsrc/core/webview/ClineProvider.ts Outdated
@hannesrudolphhannesrudolph added the Issue/PR - Triage New issue. Needs quick review to confirm validity and assign labels. label Jun 19, 2025
@hannesrudolphhannesrudolph moved this from Triage to PR [Needs Prelim Review] in Roo Code RoadmapJun 19, 2025
@hannesrudolphhannesrudolph added PR - Needs Preliminary Review and removed Issue/PR - Triage New issue. Needs quick review to confirm validity and assign labels. labels Jun 19, 2025
@daniel-lxsdaniel-lxs moved this from PR [Needs Prelim Review] to PR [Needs Review] in Roo Code RoadmapJun 19, 2025

@daniel-lxsdaniel-lxs left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGMT

@dosubotdosubotBot added the lgtm This PR has been approved by a maintainer label Jun 19, 2025
@hannesrudolph
hannesrudolph merged commit 9e96fca into mainJun 19, 2025
@hannesrudolph
hannesrudolph deleted the fix/issue-4602-phantom-subtask-results branch June 19, 2025 19:41
@github-project-automationgithub-project-automationBot moved this from PR [Needs Review] to Done in Roo Code RoadmapJun 19, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

bugSomething isn't workinglgtmThis PR has been approved by a maintainerPR - Needs Reviewsize:LThis PR changes 100-499 lines, ignoring generated files.

Projects

No open projects
Archived in project

Development

Successfully merging this pull request may close these issues.

Canceling API Retry Creates Phantom Subtask and Checkpoint Initialization Loop

4 participants

@hannesrudolph@mrubens@daniel-lxs
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: resolve phantom subtask display on cancel during API retry (#4602) by hannesrudolph · Pull Request #4893 · RooCodeInc/Roo-Code · GitHub
Skip to content
This repository was archived by the owner on May 15, 2026. It is now read-only.

fix: resolve phantom subtask display on cancel during API retry (#4602) - #4893

Merged
hannesrudolph merged 3 commits into
mainfrom
fix/issue-4602-phantom-subtask-results
Jun 19, 2025
Merged

fix: resolve phantom subtask display on cancel during API retry (#4602)#4893
hannesrudolph merged 3 commits into
mainfrom
fix/issue-4602-phantom-subtask-results

Conversation

@hannesrudolph

@hannesrudolphhannesrudolph commented Jun 19, 2025

Copy link
Copy Markdown
Contributor

Description

Fixes#4602

This PR resolves an issue where canceling a task during API retry would incorrectly display "Subtask Results" and create a checkpoint initialization loop, even though no subtask was actually created.

Changes Made

  • Modified the clearTask handler in webviewMessageHandler.ts to check for the existence of a parentTask property instead of relying on stack size
  • This ensures that only actual subtasks (tasks with a parent) trigger the finishSubTask() method
  • Single tasks without parents now correctly use clearTask() instead

Testing

  • All existing tests pass
  • Added comprehensive test coverage in ClineProvider.spec.ts:
  • Manual testing completed:
    • Started a task that triggers API retry
    • Canceled during the retry period
    • Verified no phantom "Subtask Results" appears
    • Verified no checkpoint initialization loop occurs

Verification of Acceptance Criteria

  • When canceling during API retry, no "Subtask Results" display appears
  • No checkpoint initialization loop is triggered
  • The fix correctly distinguishes between actual subtasks and single tasks
  • All tests pass and the implementation is properly tested

Checklist

  • Code follows project style guidelines
  • Self-review completed
  • Comments added for complex logic
  • Documentation updated (if needed)
  • No breaking changes
  • Tests added for the fix

Technical Details

The root cause was that the previous implementation checked provider.getClineStackSize() > 1 to determine if a task was a subtask. However, during API retry scenarios, the stack could have multiple entries even for a single task, leading to incorrect behavior.

The fix now properly checks for the existence of a parentTask property on the current task, which is the definitive way to determine if a task is actually a subtask.


Important

Fixes phantom subtask display issue by checking parentTask property in webviewMessageHandler.ts during task cancellation.

This description was created by Ellipsis for 0cc9eca. You can customize this summary. It will automatically update as commits are pushed.

- Fixed clearTask handler to check for actual parent task existence
- Changed condition from getClineStackSize() > 1 to checking currentTask.parentTask
- Prevents finishSubTask() from being called on tasks without parents
- Added comprehensive test coverage for clearTask message handler
- Resolves infinite checkpoint initialization loop issue
- Modified clearTask handler to check for parentTask property instead of stack size
- This prevents single tasks from being incorrectly treated as subtasks
- Added comprehensive test coverage for the fix
- Fixes issue where canceling during API retry would show phantom 'Subtask Results' and create checkpoint initialization loop
CopilotAI review requested due to automatic review settings June 19, 2025 18:12
@dosubotdosubotBot added size:L This PR changes 100-499 lines, ignoring generated files. bug Something isn't working labels Jun 19, 2025

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Fixes an issue where canceling during an API retry incorrectly treated single tasks as subtasks.

  • Replace getClineStackSize() check with explicit parentTask existence in the clearTask handler
  • Introduce a new clearTask() method on ClineProvider for non-subtask cancellations
  • Add comprehensive tests for both subtask and single-task cancellation flows

Reviewed Changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

FileDescription
src/core/webview/webviewMessageHandler.tsUpdated clearTask case to branch on currentTask.parentTask and call finishSubTask or clearTask
src/core/webview/ClineProvider.tsAdded clearTask() helper to remove the current task without subtask logic
src/core/webview/tests/ClineProvider.spec.tsAdded tests covering the new clearTask logic, including the fix for issue #4602
Comments suppressed due to low confidence (2)

src/core/webview/tests/ClineProvider.spec.ts:675

  • This test does not mock or assert postStateToWebview; consider spying on provider.postStateToWebview to both avoid unintended side effects and verify that state is posted in this scenario.
 await messageHandler({ type: "clearTask" })

src/core/webview/webviewMessageHandler.ts:207

  • The translation function t is used here but not imported in this module. Add the appropriate import (e.g. import { t } from 'i18n';) to prevent a runtime error.
 await provider.finishSubTask(t("common:tasks.canceled"))

Comment threadsrc/core/webview/ClineProvider.ts Outdated
@hannesrudolphhannesrudolph added the Issue/PR - Triage New issue. Needs quick review to confirm validity and assign labels. label Jun 19, 2025
@hannesrudolphhannesrudolph moved this from Triage to PR [Needs Prelim Review] in Roo Code RoadmapJun 19, 2025
@hannesrudolphhannesrudolph added PR - Needs Preliminary Review and removed Issue/PR - Triage New issue. Needs quick review to confirm validity and assign labels. labels Jun 19, 2025
@daniel-lxsdaniel-lxs moved this from PR [Needs Prelim Review] to PR [Needs Review] in Roo Code RoadmapJun 19, 2025

@daniel-lxsdaniel-lxs left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGMT

@dosubotdosubotBot added the lgtm This PR has been approved by a maintainer label Jun 19, 2025
@hannesrudolph
hannesrudolph merged commit 9e96fca into mainJun 19, 2025
@hannesrudolph
hannesrudolph deleted the fix/issue-4602-phantom-subtask-results branch June 19, 2025 19:41
@github-project-automationgithub-project-automationBot moved this from PR [Needs Review] to Done in Roo Code RoadmapJun 19, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

bugSomething isn't workinglgtmThis PR has been approved by a maintainerPR - Needs Reviewsize:LThis PR changes 100-499 lines, ignoring generated files.

Projects

No open projects
Archived in project

Development

Successfully merging this pull request may close these issues.

Canceling API Retry Creates Phantom Subtask and Checkpoint Initialization Loop

4 participants

@hannesrudolph@mrubens@daniel-lxs
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); fix: resolve phantom subtask display on cancel during API retry (#4602) by hannesrudolph · Pull Request #4893 · RooCodeInc/Roo-Code · GitHub
Skip to content
This repository was archived by the owner on May 15, 2026. It is now read-only.

fix: resolve phantom subtask display on cancel during API retry (#4602) - #4893

Merged
hannesrudolph merged 3 commits into
mainfrom
fix/issue-4602-phantom-subtask-results
Jun 19, 2025
Merged

fix: resolve phantom subtask display on cancel during API retry (#4602)#4893
hannesrudolph merged 3 commits into
mainfrom
fix/issue-4602-phantom-subtask-results

Conversation

@hannesrudolph

@hannesrudolphhannesrudolph commented Jun 19, 2025

Copy link
Copy Markdown
Contributor

Description

Fixes#4602

This PR resolves an issue where canceling a task during API retry would incorrectly display "Subtask Results" and create a checkpoint initialization loop, even though no subtask was actually created.

Changes Made

  • Modified the clearTask handler in webviewMessageHandler.ts to check for the existence of a parentTask property instead of relying on stack size
  • This ensures that only actual subtasks (tasks with a parent) trigger the finishSubTask() method
  • Single tasks without parents now correctly use clearTask() instead

Testing

  • All existing tests pass
  • Added comprehensive test coverage in ClineProvider.spec.ts:
  • Manual testing completed:
    • Started a task that triggers API retry
    • Canceled during the retry period
    • Verified no phantom "Subtask Results" appears
    • Verified no checkpoint initialization loop occurs

Verification of Acceptance Criteria

  • When canceling during API retry, no "Subtask Results" display appears
  • No checkpoint initialization loop is triggered
  • The fix correctly distinguishes between actual subtasks and single tasks
  • All tests pass and the implementation is properly tested

Checklist

  • Code follows project style guidelines
  • Self-review completed
  • Comments added for complex logic
  • Documentation updated (if needed)
  • No breaking changes
  • Tests added for the fix

Technical Details

The root cause was that the previous implementation checked provider.getClineStackSize() > 1 to determine if a task was a subtask. However, during API retry scenarios, the stack could have multiple entries even for a single task, leading to incorrect behavior.

The fix now properly checks for the existence of a parentTask property on the current task, which is the definitive way to determine if a task is actually a subtask.


Important

Fixes phantom subtask display issue by checking parentTask property in webviewMessageHandler.ts during task cancellation.

This description was created by Ellipsis for 0cc9eca. You can customize this summary. It will automatically update as commits are pushed.

- Fixed clearTask handler to check for actual parent task existence
- Changed condition from getClineStackSize() > 1 to checking currentTask.parentTask
- Prevents finishSubTask() from being called on tasks without parents
- Added comprehensive test coverage for clearTask message handler
- Resolves infinite checkpoint initialization loop issue
- Modified clearTask handler to check for parentTask property instead of stack size
- This prevents single tasks from being incorrectly treated as subtasks
- Added comprehensive test coverage for the fix
- Fixes issue where canceling during API retry would show phantom 'Subtask Results' and create checkpoint initialization loop
CopilotAI review requested due to automatic review settings June 19, 2025 18:12
@dosubotdosubotBot added size:L This PR changes 100-499 lines, ignoring generated files. bug Something isn't working labels Jun 19, 2025

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Fixes an issue where canceling during an API retry incorrectly treated single tasks as subtasks.

  • Replace getClineStackSize() check with explicit parentTask existence in the clearTask handler
  • Introduce a new clearTask() method on ClineProvider for non-subtask cancellations
  • Add comprehensive tests for both subtask and single-task cancellation flows

Reviewed Changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

FileDescription
src/core/webview/webviewMessageHandler.tsUpdated clearTask case to branch on currentTask.parentTask and call finishSubTask or clearTask
src/core/webview/ClineProvider.tsAdded clearTask() helper to remove the current task without subtask logic
src/core/webview/tests/ClineProvider.spec.tsAdded tests covering the new clearTask logic, including the fix for issue #4602
Comments suppressed due to low confidence (2)

src/core/webview/tests/ClineProvider.spec.ts:675

  • This test does not mock or assert postStateToWebview; consider spying on provider.postStateToWebview to both avoid unintended side effects and verify that state is posted in this scenario.
 await messageHandler({ type: "clearTask" })

src/core/webview/webviewMessageHandler.ts:207

  • The translation function t is used here but not imported in this module. Add the appropriate import (e.g. import { t } from 'i18n';) to prevent a runtime error.
 await provider.finishSubTask(t("common:tasks.canceled"))

Comment threadsrc/core/webview/ClineProvider.ts Outdated
@hannesrudolphhannesrudolph added the Issue/PR - Triage New issue. Needs quick review to confirm validity and assign labels. label Jun 19, 2025
@hannesrudolphhannesrudolph moved this from Triage to PR [Needs Prelim Review] in Roo Code RoadmapJun 19, 2025
@hannesrudolphhannesrudolph added PR - Needs Preliminary Review and removed Issue/PR - Triage New issue. Needs quick review to confirm validity and assign labels. labels Jun 19, 2025
@daniel-lxsdaniel-lxs moved this from PR [Needs Prelim Review] to PR [Needs Review] in Roo Code RoadmapJun 19, 2025

@daniel-lxsdaniel-lxs left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGMT

@dosubotdosubotBot added the lgtm This PR has been approved by a maintainer label Jun 19, 2025
@hannesrudolph
hannesrudolph merged commit 9e96fca into mainJun 19, 2025
@hannesrudolph
hannesrudolph deleted the fix/issue-4602-phantom-subtask-results branch June 19, 2025 19:41
@github-project-automationgithub-project-automationBot moved this from PR [Needs Review] to Done in Roo Code RoadmapJun 19, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

bugSomething isn't workinglgtmThis PR has been approved by a maintainerPR - Needs Reviewsize:LThis PR changes 100-499 lines, ignoring generated files.

Projects

No open projects
Archived in project

Development

Successfully merging this pull request may close these issues.

Canceling API Retry Creates Phantom Subtask and Checkpoint Initialization Loop

4 participants

@hannesrudolph@mrubens@daniel-lxs