fix(server): fall back to local-only base branches - #8241

Closed
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:fix/start-from-origin-local-branch
Closed

fix(server): fall back to local-only base branches#8241
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:fix/start-from-origin-local-branch

Conversation

@cheruvian

@cheruviancheruvian commented Aug 26, 2026

Copy link
Copy Markdown

What Changed

When Start from origin is enabled, check whether the selected base branch has an origin tracking ref after fetching. If it does, create the worktree from the fetched remote commit. If it only exists locally, create the worktree from the local branch instead.

This keeps unrelated Git resolution failures visible instead of treating every failure as a missing branch.

Why

T3 previously checked only whether the repository had an origin remote. Selecting a valid local-only base branch then caused resolveRemoteTrackingCommit to fail, aborting bootstrap and deleting the provisional thread.

Closes#8191

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Added focused regression coverage for remote-backed, no-origin, and local-only base branches
  • Ran the complete server test file (132 tests)
  • Ran the server typecheck

Created with GPT-5.6 Sol through the Codex harness.


Note

Medium Risk
Changes thread bootstrap and worktree creation when “Start from origin” is on; mistakes could pick the wrong base commit, but scope is narrow and covered by new regression tests.

Overview
Bootstrap worktrees with “Start from origin” no longer always resolve the base branch through origin. After fetching origin, the server checks whether origin/<baseBranch> exists via a new remoteBranchExists API on the Git workflow/VCS driver stack. Only when that ref exists does it call resolveRemoteTrackingCommit and base the worktree on the remote commit; otherwise it keeps the local base branch name, so local-only branches bootstrap successfully instead of failing and tearing down the thread.

remoteBranchExists is wired from GitVcsDriverCore (git show-ref on refs/remotes/<remote>/<ref>) through GitVcsDriver, GitWorkflowService, and the WS bootstrap path. Server tests mock the new hook and add a regression case asserting createWorktree uses the local branch and skips remote commit resolution when the origin tracking ref is missing.

Reviewed by Cursor Bugbot for commit 5762a2b. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fall back to local base branch when remote tracking ref is missing

Adds a remoteBranchExists method to GitVcsDriver and GitWorkflowService so the server can check whether a remote branch exists before resolving it. In the prepareWorktree bootstrap flow in ws.ts, when startFromOrigin is true the server now calls gitWorkflow.remoteBranchExists; if the remote base branch does not exist, it skips resolveRemoteTrackingCommit and creates the worktree from the local base branch instead.

  • Risk: if remoteBranchExists throws (e.g. network failure to remote), the ensureGitCommand guard in GitWorkflowService.make surfaces a GitCommandError rather than silently falling back to local; callers in ws.ts rely on this error propagating correctly.
📊 Macroscope summarized 5762a2b. 4 files reviewed, 1 issue evaluated, 0 issues filtered, 1 comment posted

🗂️ Filtered Issues

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 314f8db5-9514-4ba3-b00d-2416b10cec8a

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Aug 26, 2026
Comment threadapps/server/src/ws.ts
remoteName: "origin",
});
const resolvedRemoteBase = yield* gitWorkflow.resolveRemoteTrackingCommit({
const baseBranch = bootstrap.prepareWorktree.baseBranch;

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.

🟠 Highsrc/ws.ts:1033

When baseBranch is origin/main, the remote check looks for refs/remotes/origin/origin/main and leaves worktreeBaseRef as the ambiguous origin/main; if refs/heads/origin/main exists, createWorktree starts from that local branch instead of the selected remote branch. Strip the origin/ qualifier before calling remoteBranchExists and resolveRemoteTrackingCommit so the worktree is based on the remote commit.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/ws.ts around line 1033:
When `baseBranch` is `origin/main`, the remote check looks for `refs/remotes/origin/origin/main` and leaves `worktreeBaseRef` as the ambiguous `origin/main`; if `refs/heads/origin/main` exists, `createWorktree` starts from that local branch instead of the selected remote branch. Strip the `origin/` qualifier before calling `remoteBranchExists` and `resolveRemoteTrackingCommit` so the worktree is based on the remote commit.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Would Approve

Macroscope's review found this PR approvable — This is a focused bootstrap bug fix that adds a read-only remote-ref check and preserves existing remote-backed behavior while enabling local-only branches, with targeted regression coverage and no schema or sensitive-path impact. An unresolved high-severity finding still flags qualified base names such as origin/main as a potential wrong-commit case.

Not approved because:

  • 1 blocking correctness issue found at or above your repo's Minimum Blocking Severity

Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

We selected #8349 as the smaller active repair for local-only base branches. It uses the existing remote resolution path and avoids adding new Git workflow and VCS contract methods. This branch's explicit missing-ref versus other Git error cases are not all in #8349, so they remain useful reference.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed.

@t3dotggt3dotgg closed this Aug 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: "Start from origin" aborts thread bootstrap when the base branch has no remote-tracking ref

2 participants

@cheruvian@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(server): fall back to local-only base branches - #8241

Closed
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:fix/start-from-origin-local-branch
Closed

fix(server): fall back to local-only base branches#8241
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:fix/start-from-origin-local-branch

Conversation

@cheruvian

@cheruviancheruvian commented Aug 26, 2026

Copy link
Copy Markdown

What Changed

When Start from origin is enabled, check whether the selected base branch has an origin tracking ref after fetching. If it does, create the worktree from the fetched remote commit. If it only exists locally, create the worktree from the local branch instead.

This keeps unrelated Git resolution failures visible instead of treating every failure as a missing branch.

Why

T3 previously checked only whether the repository had an origin remote. Selecting a valid local-only base branch then caused resolveRemoteTrackingCommit to fail, aborting bootstrap and deleting the provisional thread.

Closes#8191

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Added focused regression coverage for remote-backed, no-origin, and local-only base branches
  • Ran the complete server test file (132 tests)
  • Ran the server typecheck

Created with GPT-5.6 Sol through the Codex harness.


Note

Medium Risk
Changes thread bootstrap and worktree creation when “Start from origin” is on; mistakes could pick the wrong base commit, but scope is narrow and covered by new regression tests.

Overview
Bootstrap worktrees with “Start from origin” no longer always resolve the base branch through origin. After fetching origin, the server checks whether origin/<baseBranch> exists via a new remoteBranchExists API on the Git workflow/VCS driver stack. Only when that ref exists does it call resolveRemoteTrackingCommit and base the worktree on the remote commit; otherwise it keeps the local base branch name, so local-only branches bootstrap successfully instead of failing and tearing down the thread.

remoteBranchExists is wired from GitVcsDriverCore (git show-ref on refs/remotes/<remote>/<ref>) through GitVcsDriver, GitWorkflowService, and the WS bootstrap path. Server tests mock the new hook and add a regression case asserting createWorktree uses the local branch and skips remote commit resolution when the origin tracking ref is missing.

Reviewed by Cursor Bugbot for commit 5762a2b. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fall back to local base branch when remote tracking ref is missing

Adds a remoteBranchExists method to GitVcsDriver and GitWorkflowService so the server can check whether a remote branch exists before resolving it. In the prepareWorktree bootstrap flow in ws.ts, when startFromOrigin is true the server now calls gitWorkflow.remoteBranchExists; if the remote base branch does not exist, it skips resolveRemoteTrackingCommit and creates the worktree from the local base branch instead.

  • Risk: if remoteBranchExists throws (e.g. network failure to remote), the ensureGitCommand guard in GitWorkflowService.make surfaces a GitCommandError rather than silently falling back to local; callers in ws.ts rely on this error propagating correctly.
📊 Macroscope summarized 5762a2b. 4 files reviewed, 1 issue evaluated, 0 issues filtered, 1 comment posted

🗂️ Filtered Issues

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 314f8db5-9514-4ba3-b00d-2416b10cec8a

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Aug 26, 2026
Comment threadapps/server/src/ws.ts
remoteName: "origin",
});
const resolvedRemoteBase = yield* gitWorkflow.resolveRemoteTrackingCommit({
const baseBranch = bootstrap.prepareWorktree.baseBranch;

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.

🟠 Highsrc/ws.ts:1033

When baseBranch is origin/main, the remote check looks for refs/remotes/origin/origin/main and leaves worktreeBaseRef as the ambiguous origin/main; if refs/heads/origin/main exists, createWorktree starts from that local branch instead of the selected remote branch. Strip the origin/ qualifier before calling remoteBranchExists and resolveRemoteTrackingCommit so the worktree is based on the remote commit.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/ws.ts around line 1033:
When `baseBranch` is `origin/main`, the remote check looks for `refs/remotes/origin/origin/main` and leaves `worktreeBaseRef` as the ambiguous `origin/main`; if `refs/heads/origin/main` exists, `createWorktree` starts from that local branch instead of the selected remote branch. Strip the `origin/` qualifier before calling `remoteBranchExists` and `resolveRemoteTrackingCommit` so the worktree is based on the remote commit.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Would Approve

Macroscope's review found this PR approvable — This is a focused bootstrap bug fix that adds a read-only remote-ref check and preserves existing remote-backed behavior while enabling local-only branches, with targeted regression coverage and no schema or sensitive-path impact. An unresolved high-severity finding still flags qualified base names such as origin/main as a potential wrong-commit case.

Not approved because:

  • 1 blocking correctness issue found at or above your repo's Minimum Blocking Severity

Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

We selected #8349 as the smaller active repair for local-only base branches. It uses the existing remote resolution path and avoids adding new Git workflow and VCS contract methods. This branch's explicit missing-ref versus other Git error cases are not all in #8349, so they remain useful reference.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed.

@t3dotggt3dotgg closed this Aug 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: "Start from origin" aborts thread bootstrap when the base branch has no remote-tracking ref

2 participants

@cheruvian@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): fall back to local-only base branches - #8241

Closed
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:fix/start-from-origin-local-branch
Closed

fix(server): fall back to local-only base branches#8241
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:fix/start-from-origin-local-branch

Conversation

@cheruvian

@cheruviancheruvian commented Aug 26, 2026

Copy link
Copy Markdown

What Changed

When Start from origin is enabled, check whether the selected base branch has an origin tracking ref after fetching. If it does, create the worktree from the fetched remote commit. If it only exists locally, create the worktree from the local branch instead.

This keeps unrelated Git resolution failures visible instead of treating every failure as a missing branch.

Why

T3 previously checked only whether the repository had an origin remote. Selecting a valid local-only base branch then caused resolveRemoteTrackingCommit to fail, aborting bootstrap and deleting the provisional thread.

Closes#8191

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Added focused regression coverage for remote-backed, no-origin, and local-only base branches
  • Ran the complete server test file (132 tests)
  • Ran the server typecheck

Created with GPT-5.6 Sol through the Codex harness.


Note

Medium Risk
Changes thread bootstrap and worktree creation when “Start from origin” is on; mistakes could pick the wrong base commit, but scope is narrow and covered by new regression tests.

Overview
Bootstrap worktrees with “Start from origin” no longer always resolve the base branch through origin. After fetching origin, the server checks whether origin/<baseBranch> exists via a new remoteBranchExists API on the Git workflow/VCS driver stack. Only when that ref exists does it call resolveRemoteTrackingCommit and base the worktree on the remote commit; otherwise it keeps the local base branch name, so local-only branches bootstrap successfully instead of failing and tearing down the thread.

remoteBranchExists is wired from GitVcsDriverCore (git show-ref on refs/remotes/<remote>/<ref>) through GitVcsDriver, GitWorkflowService, and the WS bootstrap path. Server tests mock the new hook and add a regression case asserting createWorktree uses the local branch and skips remote commit resolution when the origin tracking ref is missing.

Reviewed by Cursor Bugbot for commit 5762a2b. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fall back to local base branch when remote tracking ref is missing

Adds a remoteBranchExists method to GitVcsDriver and GitWorkflowService so the server can check whether a remote branch exists before resolving it. In the prepareWorktree bootstrap flow in ws.ts, when startFromOrigin is true the server now calls gitWorkflow.remoteBranchExists; if the remote base branch does not exist, it skips resolveRemoteTrackingCommit and creates the worktree from the local base branch instead.

  • Risk: if remoteBranchExists throws (e.g. network failure to remote), the ensureGitCommand guard in GitWorkflowService.make surfaces a GitCommandError rather than silently falling back to local; callers in ws.ts rely on this error propagating correctly.
📊 Macroscope summarized 5762a2b. 4 files reviewed, 1 issue evaluated, 0 issues filtered, 1 comment posted

🗂️ Filtered Issues

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 314f8db5-9514-4ba3-b00d-2416b10cec8a

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Aug 26, 2026
Comment threadapps/server/src/ws.ts
remoteName: "origin",
});
const resolvedRemoteBase = yield* gitWorkflow.resolveRemoteTrackingCommit({
const baseBranch = bootstrap.prepareWorktree.baseBranch;

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.

🟠 Highsrc/ws.ts:1033

When baseBranch is origin/main, the remote check looks for refs/remotes/origin/origin/main and leaves worktreeBaseRef as the ambiguous origin/main; if refs/heads/origin/main exists, createWorktree starts from that local branch instead of the selected remote branch. Strip the origin/ qualifier before calling remoteBranchExists and resolveRemoteTrackingCommit so the worktree is based on the remote commit.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/ws.ts around line 1033:
When `baseBranch` is `origin/main`, the remote check looks for `refs/remotes/origin/origin/main` and leaves `worktreeBaseRef` as the ambiguous `origin/main`; if `refs/heads/origin/main` exists, `createWorktree` starts from that local branch instead of the selected remote branch. Strip the `origin/` qualifier before calling `remoteBranchExists` and `resolveRemoteTrackingCommit` so the worktree is based on the remote commit.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Would Approve

Macroscope's review found this PR approvable — This is a focused bootstrap bug fix that adds a read-only remote-ref check and preserves existing remote-backed behavior while enabling local-only branches, with targeted regression coverage and no schema or sensitive-path impact. An unresolved high-severity finding still flags qualified base names such as origin/main as a potential wrong-commit case.

Not approved because:

  • 1 blocking correctness issue found at or above your repo's Minimum Blocking Severity

Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

We selected #8349 as the smaller active repair for local-only base branches. It uses the existing remote resolution path and avoids adding new Git workflow and VCS contract methods. This branch's explicit missing-ref versus other Git error cases are not all in #8349, so they remain useful reference.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed.

@t3dotggt3dotgg closed this Aug 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: "Start from origin" aborts thread bootstrap when the base branch has no remote-tracking ref

2 participants

@cheruvian@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): fall back to local-only base branches - #8241

Closed
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:fix/start-from-origin-local-branch
Closed

fix(server): fall back to local-only base branches#8241
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:fix/start-from-origin-local-branch

Conversation

@cheruvian

@cheruviancheruvian commented Aug 26, 2026

Copy link
Copy Markdown

What Changed

When Start from origin is enabled, check whether the selected base branch has an origin tracking ref after fetching. If it does, create the worktree from the fetched remote commit. If it only exists locally, create the worktree from the local branch instead.

This keeps unrelated Git resolution failures visible instead of treating every failure as a missing branch.

Why

T3 previously checked only whether the repository had an origin remote. Selecting a valid local-only base branch then caused resolveRemoteTrackingCommit to fail, aborting bootstrap and deleting the provisional thread.

Closes#8191

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Added focused regression coverage for remote-backed, no-origin, and local-only base branches
  • Ran the complete server test file (132 tests)
  • Ran the server typecheck

Created with GPT-5.6 Sol through the Codex harness.


Note

Medium Risk
Changes thread bootstrap and worktree creation when “Start from origin” is on; mistakes could pick the wrong base commit, but scope is narrow and covered by new regression tests.

Overview
Bootstrap worktrees with “Start from origin” no longer always resolve the base branch through origin. After fetching origin, the server checks whether origin/<baseBranch> exists via a new remoteBranchExists API on the Git workflow/VCS driver stack. Only when that ref exists does it call resolveRemoteTrackingCommit and base the worktree on the remote commit; otherwise it keeps the local base branch name, so local-only branches bootstrap successfully instead of failing and tearing down the thread.

remoteBranchExists is wired from GitVcsDriverCore (git show-ref on refs/remotes/<remote>/<ref>) through GitVcsDriver, GitWorkflowService, and the WS bootstrap path. Server tests mock the new hook and add a regression case asserting createWorktree uses the local branch and skips remote commit resolution when the origin tracking ref is missing.

Reviewed by Cursor Bugbot for commit 5762a2b. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fall back to local base branch when remote tracking ref is missing

Adds a remoteBranchExists method to GitVcsDriver and GitWorkflowService so the server can check whether a remote branch exists before resolving it. In the prepareWorktree bootstrap flow in ws.ts, when startFromOrigin is true the server now calls gitWorkflow.remoteBranchExists; if the remote base branch does not exist, it skips resolveRemoteTrackingCommit and creates the worktree from the local base branch instead.

  • Risk: if remoteBranchExists throws (e.g. network failure to remote), the ensureGitCommand guard in GitWorkflowService.make surfaces a GitCommandError rather than silently falling back to local; callers in ws.ts rely on this error propagating correctly.
📊 Macroscope summarized 5762a2b. 4 files reviewed, 1 issue evaluated, 0 issues filtered, 1 comment posted

🗂️ Filtered Issues

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 314f8db5-9514-4ba3-b00d-2416b10cec8a

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Aug 26, 2026
Comment threadapps/server/src/ws.ts
remoteName: "origin",
});
const resolvedRemoteBase = yield* gitWorkflow.resolveRemoteTrackingCommit({
const baseBranch = bootstrap.prepareWorktree.baseBranch;

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.

🟠 Highsrc/ws.ts:1033

When baseBranch is origin/main, the remote check looks for refs/remotes/origin/origin/main and leaves worktreeBaseRef as the ambiguous origin/main; if refs/heads/origin/main exists, createWorktree starts from that local branch instead of the selected remote branch. Strip the origin/ qualifier before calling remoteBranchExists and resolveRemoteTrackingCommit so the worktree is based on the remote commit.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/ws.ts around line 1033:
When `baseBranch` is `origin/main`, the remote check looks for `refs/remotes/origin/origin/main` and leaves `worktreeBaseRef` as the ambiguous `origin/main`; if `refs/heads/origin/main` exists, `createWorktree` starts from that local branch instead of the selected remote branch. Strip the `origin/` qualifier before calling `remoteBranchExists` and `resolveRemoteTrackingCommit` so the worktree is based on the remote commit.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Would Approve

Macroscope's review found this PR approvable — This is a focused bootstrap bug fix that adds a read-only remote-ref check and preserves existing remote-backed behavior while enabling local-only branches, with targeted regression coverage and no schema or sensitive-path impact. An unresolved high-severity finding still flags qualified base names such as origin/main as a potential wrong-commit case.

Not approved because:

  • 1 blocking correctness issue found at or above your repo's Minimum Blocking Severity

Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

We selected #8349 as the smaller active repair for local-only base branches. It uses the existing remote resolution path and avoids adding new Git workflow and VCS contract methods. This branch's explicit missing-ref versus other Git error cases are not all in #8349, so they remain useful reference.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed.

@t3dotggt3dotgg closed this Aug 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: "Start from origin" aborts thread bootstrap when the base branch has no remote-tracking ref

2 participants

@cheruvian@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(server): fall back to local-only base branches - #8241

Closed
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:fix/start-from-origin-local-branch
Closed

fix(server): fall back to local-only base branches#8241
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:fix/start-from-origin-local-branch

Conversation

@cheruvian

@cheruviancheruvian commented Aug 26, 2026

Copy link
Copy Markdown

What Changed

When Start from origin is enabled, check whether the selected base branch has an origin tracking ref after fetching. If it does, create the worktree from the fetched remote commit. If it only exists locally, create the worktree from the local branch instead.

This keeps unrelated Git resolution failures visible instead of treating every failure as a missing branch.

Why

T3 previously checked only whether the repository had an origin remote. Selecting a valid local-only base branch then caused resolveRemoteTrackingCommit to fail, aborting bootstrap and deleting the provisional thread.

Closes#8191

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Added focused regression coverage for remote-backed, no-origin, and local-only base branches
  • Ran the complete server test file (132 tests)
  • Ran the server typecheck

Created with GPT-5.6 Sol through the Codex harness.


Note

Medium Risk
Changes thread bootstrap and worktree creation when “Start from origin” is on; mistakes could pick the wrong base commit, but scope is narrow and covered by new regression tests.

Overview
Bootstrap worktrees with “Start from origin” no longer always resolve the base branch through origin. After fetching origin, the server checks whether origin/<baseBranch> exists via a new remoteBranchExists API on the Git workflow/VCS driver stack. Only when that ref exists does it call resolveRemoteTrackingCommit and base the worktree on the remote commit; otherwise it keeps the local base branch name, so local-only branches bootstrap successfully instead of failing and tearing down the thread.

remoteBranchExists is wired from GitVcsDriverCore (git show-ref on refs/remotes/<remote>/<ref>) through GitVcsDriver, GitWorkflowService, and the WS bootstrap path. Server tests mock the new hook and add a regression case asserting createWorktree uses the local branch and skips remote commit resolution when the origin tracking ref is missing.

Reviewed by Cursor Bugbot for commit 5762a2b. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fall back to local base branch when remote tracking ref is missing

Adds a remoteBranchExists method to GitVcsDriver and GitWorkflowService so the server can check whether a remote branch exists before resolving it. In the prepareWorktree bootstrap flow in ws.ts, when startFromOrigin is true the server now calls gitWorkflow.remoteBranchExists; if the remote base branch does not exist, it skips resolveRemoteTrackingCommit and creates the worktree from the local base branch instead.

  • Risk: if remoteBranchExists throws (e.g. network failure to remote), the ensureGitCommand guard in GitWorkflowService.make surfaces a GitCommandError rather than silently falling back to local; callers in ws.ts rely on this error propagating correctly.
📊 Macroscope summarized 5762a2b. 4 files reviewed, 1 issue evaluated, 0 issues filtered, 1 comment posted

🗂️ Filtered Issues

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 314f8db5-9514-4ba3-b00d-2416b10cec8a

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Aug 26, 2026
Comment threadapps/server/src/ws.ts
remoteName: "origin",
});
const resolvedRemoteBase = yield* gitWorkflow.resolveRemoteTrackingCommit({
const baseBranch = bootstrap.prepareWorktree.baseBranch;

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.

🟠 Highsrc/ws.ts:1033

When baseBranch is origin/main, the remote check looks for refs/remotes/origin/origin/main and leaves worktreeBaseRef as the ambiguous origin/main; if refs/heads/origin/main exists, createWorktree starts from that local branch instead of the selected remote branch. Strip the origin/ qualifier before calling remoteBranchExists and resolveRemoteTrackingCommit so the worktree is based on the remote commit.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/ws.ts around line 1033:
When `baseBranch` is `origin/main`, the remote check looks for `refs/remotes/origin/origin/main` and leaves `worktreeBaseRef` as the ambiguous `origin/main`; if `refs/heads/origin/main` exists, `createWorktree` starts from that local branch instead of the selected remote branch. Strip the `origin/` qualifier before calling `remoteBranchExists` and `resolveRemoteTrackingCommit` so the worktree is based on the remote commit.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Would Approve

Macroscope's review found this PR approvable — This is a focused bootstrap bug fix that adds a read-only remote-ref check and preserves existing remote-backed behavior while enabling local-only branches, with targeted regression coverage and no schema or sensitive-path impact. An unresolved high-severity finding still flags qualified base names such as origin/main as a potential wrong-commit case.

Not approved because:

  • 1 blocking correctness issue found at or above your repo's Minimum Blocking Severity

Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

We selected #8349 as the smaller active repair for local-only base branches. It uses the existing remote resolution path and avoids adding new Git workflow and VCS contract methods. This branch's explicit missing-ref versus other Git error cases are not all in #8349, so they remain useful reference.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed.

@t3dotggt3dotgg closed this Aug 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: "Start from origin" aborts thread bootstrap when the base branch has no remote-tracking ref

2 participants

@cheruvian@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): fall back to local-only base branches - #8241

Closed
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:fix/start-from-origin-local-branch
Closed

fix(server): fall back to local-only base branches#8241
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:fix/start-from-origin-local-branch

Conversation

@cheruvian

@cheruviancheruvian commented Aug 26, 2026

Copy link
Copy Markdown

What Changed

When Start from origin is enabled, check whether the selected base branch has an origin tracking ref after fetching. If it does, create the worktree from the fetched remote commit. If it only exists locally, create the worktree from the local branch instead.

This keeps unrelated Git resolution failures visible instead of treating every failure as a missing branch.

Why

T3 previously checked only whether the repository had an origin remote. Selecting a valid local-only base branch then caused resolveRemoteTrackingCommit to fail, aborting bootstrap and deleting the provisional thread.

Closes#8191

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Added focused regression coverage for remote-backed, no-origin, and local-only base branches
  • Ran the complete server test file (132 tests)
  • Ran the server typecheck

Created with GPT-5.6 Sol through the Codex harness.


Note

Medium Risk
Changes thread bootstrap and worktree creation when “Start from origin” is on; mistakes could pick the wrong base commit, but scope is narrow and covered by new regression tests.

Overview
Bootstrap worktrees with “Start from origin” no longer always resolve the base branch through origin. After fetching origin, the server checks whether origin/<baseBranch> exists via a new remoteBranchExists API on the Git workflow/VCS driver stack. Only when that ref exists does it call resolveRemoteTrackingCommit and base the worktree on the remote commit; otherwise it keeps the local base branch name, so local-only branches bootstrap successfully instead of failing and tearing down the thread.

remoteBranchExists is wired from GitVcsDriverCore (git show-ref on refs/remotes/<remote>/<ref>) through GitVcsDriver, GitWorkflowService, and the WS bootstrap path. Server tests mock the new hook and add a regression case asserting createWorktree uses the local branch and skips remote commit resolution when the origin tracking ref is missing.

Reviewed by Cursor Bugbot for commit 5762a2b. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fall back to local base branch when remote tracking ref is missing

Adds a remoteBranchExists method to GitVcsDriver and GitWorkflowService so the server can check whether a remote branch exists before resolving it. In the prepareWorktree bootstrap flow in ws.ts, when startFromOrigin is true the server now calls gitWorkflow.remoteBranchExists; if the remote base branch does not exist, it skips resolveRemoteTrackingCommit and creates the worktree from the local base branch instead.

  • Risk: if remoteBranchExists throws (e.g. network failure to remote), the ensureGitCommand guard in GitWorkflowService.make surfaces a GitCommandError rather than silently falling back to local; callers in ws.ts rely on this error propagating correctly.
📊 Macroscope summarized 5762a2b. 4 files reviewed, 1 issue evaluated, 0 issues filtered, 1 comment posted

🗂️ Filtered Issues

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 314f8db5-9514-4ba3-b00d-2416b10cec8a

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Aug 26, 2026
Comment threadapps/server/src/ws.ts
remoteName: "origin",
});
const resolvedRemoteBase = yield* gitWorkflow.resolveRemoteTrackingCommit({
const baseBranch = bootstrap.prepareWorktree.baseBranch;

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.

🟠 Highsrc/ws.ts:1033

When baseBranch is origin/main, the remote check looks for refs/remotes/origin/origin/main and leaves worktreeBaseRef as the ambiguous origin/main; if refs/heads/origin/main exists, createWorktree starts from that local branch instead of the selected remote branch. Strip the origin/ qualifier before calling remoteBranchExists and resolveRemoteTrackingCommit so the worktree is based on the remote commit.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/ws.ts around line 1033:
When `baseBranch` is `origin/main`, the remote check looks for `refs/remotes/origin/origin/main` and leaves `worktreeBaseRef` as the ambiguous `origin/main`; if `refs/heads/origin/main` exists, `createWorktree` starts from that local branch instead of the selected remote branch. Strip the `origin/` qualifier before calling `remoteBranchExists` and `resolveRemoteTrackingCommit` so the worktree is based on the remote commit.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Would Approve

Macroscope's review found this PR approvable — This is a focused bootstrap bug fix that adds a read-only remote-ref check and preserves existing remote-backed behavior while enabling local-only branches, with targeted regression coverage and no schema or sensitive-path impact. An unresolved high-severity finding still flags qualified base names such as origin/main as a potential wrong-commit case.

Not approved because:

  • 1 blocking correctness issue found at or above your repo's Minimum Blocking Severity

Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

We selected #8349 as the smaller active repair for local-only base branches. It uses the existing remote resolution path and avoids adding new Git workflow and VCS contract methods. This branch's explicit missing-ref versus other Git error cases are not all in #8349, so they remain useful reference.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed.

@t3dotggt3dotgg closed this Aug 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: "Start from origin" aborts thread bootstrap when the base branch has no remote-tracking ref

2 participants

@cheruvian@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): fall back to local-only base branches - #8241

Closed
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:fix/start-from-origin-local-branch
Closed

fix(server): fall back to local-only base branches#8241
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:fix/start-from-origin-local-branch

Conversation

@cheruvian

@cheruviancheruvian commented Aug 26, 2026

Copy link
Copy Markdown

What Changed

When Start from origin is enabled, check whether the selected base branch has an origin tracking ref after fetching. If it does, create the worktree from the fetched remote commit. If it only exists locally, create the worktree from the local branch instead.

This keeps unrelated Git resolution failures visible instead of treating every failure as a missing branch.

Why

T3 previously checked only whether the repository had an origin remote. Selecting a valid local-only base branch then caused resolveRemoteTrackingCommit to fail, aborting bootstrap and deleting the provisional thread.

Closes#8191

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Added focused regression coverage for remote-backed, no-origin, and local-only base branches
  • Ran the complete server test file (132 tests)
  • Ran the server typecheck

Created with GPT-5.6 Sol through the Codex harness.


Note

Medium Risk
Changes thread bootstrap and worktree creation when “Start from origin” is on; mistakes could pick the wrong base commit, but scope is narrow and covered by new regression tests.

Overview
Bootstrap worktrees with “Start from origin” no longer always resolve the base branch through origin. After fetching origin, the server checks whether origin/<baseBranch> exists via a new remoteBranchExists API on the Git workflow/VCS driver stack. Only when that ref exists does it call resolveRemoteTrackingCommit and base the worktree on the remote commit; otherwise it keeps the local base branch name, so local-only branches bootstrap successfully instead of failing and tearing down the thread.

remoteBranchExists is wired from GitVcsDriverCore (git show-ref on refs/remotes/<remote>/<ref>) through GitVcsDriver, GitWorkflowService, and the WS bootstrap path. Server tests mock the new hook and add a regression case asserting createWorktree uses the local branch and skips remote commit resolution when the origin tracking ref is missing.

Reviewed by Cursor Bugbot for commit 5762a2b. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fall back to local base branch when remote tracking ref is missing

Adds a remoteBranchExists method to GitVcsDriver and GitWorkflowService so the server can check whether a remote branch exists before resolving it. In the prepareWorktree bootstrap flow in ws.ts, when startFromOrigin is true the server now calls gitWorkflow.remoteBranchExists; if the remote base branch does not exist, it skips resolveRemoteTrackingCommit and creates the worktree from the local base branch instead.

  • Risk: if remoteBranchExists throws (e.g. network failure to remote), the ensureGitCommand guard in GitWorkflowService.make surfaces a GitCommandError rather than silently falling back to local; callers in ws.ts rely on this error propagating correctly.
📊 Macroscope summarized 5762a2b. 4 files reviewed, 1 issue evaluated, 0 issues filtered, 1 comment posted

🗂️ Filtered Issues

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 314f8db5-9514-4ba3-b00d-2416b10cec8a

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Aug 26, 2026
Comment threadapps/server/src/ws.ts
remoteName: "origin",
});
const resolvedRemoteBase = yield* gitWorkflow.resolveRemoteTrackingCommit({
const baseBranch = bootstrap.prepareWorktree.baseBranch;

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.

🟠 Highsrc/ws.ts:1033

When baseBranch is origin/main, the remote check looks for refs/remotes/origin/origin/main and leaves worktreeBaseRef as the ambiguous origin/main; if refs/heads/origin/main exists, createWorktree starts from that local branch instead of the selected remote branch. Strip the origin/ qualifier before calling remoteBranchExists and resolveRemoteTrackingCommit so the worktree is based on the remote commit.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/ws.ts around line 1033:
When `baseBranch` is `origin/main`, the remote check looks for `refs/remotes/origin/origin/main` and leaves `worktreeBaseRef` as the ambiguous `origin/main`; if `refs/heads/origin/main` exists, `createWorktree` starts from that local branch instead of the selected remote branch. Strip the `origin/` qualifier before calling `remoteBranchExists` and `resolveRemoteTrackingCommit` so the worktree is based on the remote commit.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Would Approve

Macroscope's review found this PR approvable — This is a focused bootstrap bug fix that adds a read-only remote-ref check and preserves existing remote-backed behavior while enabling local-only branches, with targeted regression coverage and no schema or sensitive-path impact. An unresolved high-severity finding still flags qualified base names such as origin/main as a potential wrong-commit case.

Not approved because:

  • 1 blocking correctness issue found at or above your repo's Minimum Blocking Severity

Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

We selected #8349 as the smaller active repair for local-only base branches. It uses the existing remote resolution path and avoids adding new Git workflow and VCS contract methods. This branch's explicit missing-ref versus other Git error cases are not all in #8349, so they remain useful reference.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed.

@t3dotggt3dotgg closed this Aug 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: "Start from origin" aborts thread bootstrap when the base branch has no remote-tracking ref

2 participants

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

fix(server): fall back to local-only base branches - #8241

Closed
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:fix/start-from-origin-local-branch
Closed

fix(server): fall back to local-only base branches#8241
cheruvian wants to merge 1 commit into
pingdotgg:mainfrom
cheruvian:fix/start-from-origin-local-branch

Conversation

@cheruvian

@cheruviancheruvian commented Aug 26, 2026

Copy link
Copy Markdown

What Changed

When Start from origin is enabled, check whether the selected base branch has an origin tracking ref after fetching. If it does, create the worktree from the fetched remote commit. If it only exists locally, create the worktree from the local branch instead.

This keeps unrelated Git resolution failures visible instead of treating every failure as a missing branch.

Why

T3 previously checked only whether the repository had an origin remote. Selecting a valid local-only base branch then caused resolveRemoteTrackingCommit to fail, aborting bootstrap and deleting the provisional thread.

Closes#8191

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Added focused regression coverage for remote-backed, no-origin, and local-only base branches
  • Ran the complete server test file (132 tests)
  • Ran the server typecheck

Created with GPT-5.6 Sol through the Codex harness.


Note

Medium Risk
Changes thread bootstrap and worktree creation when “Start from origin” is on; mistakes could pick the wrong base commit, but scope is narrow and covered by new regression tests.

Overview
Bootstrap worktrees with “Start from origin” no longer always resolve the base branch through origin. After fetching origin, the server checks whether origin/<baseBranch> exists via a new remoteBranchExists API on the Git workflow/VCS driver stack. Only when that ref exists does it call resolveRemoteTrackingCommit and base the worktree on the remote commit; otherwise it keeps the local base branch name, so local-only branches bootstrap successfully instead of failing and tearing down the thread.

remoteBranchExists is wired from GitVcsDriverCore (git show-ref on refs/remotes/<remote>/<ref>) through GitVcsDriver, GitWorkflowService, and the WS bootstrap path. Server tests mock the new hook and add a regression case asserting createWorktree uses the local branch and skips remote commit resolution when the origin tracking ref is missing.

Reviewed by Cursor Bugbot for commit 5762a2b. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fall back to local base branch when remote tracking ref is missing

Adds a remoteBranchExists method to GitVcsDriver and GitWorkflowService so the server can check whether a remote branch exists before resolving it. In the prepareWorktree bootstrap flow in ws.ts, when startFromOrigin is true the server now calls gitWorkflow.remoteBranchExists; if the remote base branch does not exist, it skips resolveRemoteTrackingCommit and creates the worktree from the local base branch instead.

  • Risk: if remoteBranchExists throws (e.g. network failure to remote), the ensureGitCommand guard in GitWorkflowService.make surfaces a GitCommandError rather than silently falling back to local; callers in ws.ts rely on this error propagating correctly.
📊 Macroscope summarized 5762a2b. 4 files reviewed, 1 issue evaluated, 0 issues filtered, 1 comment posted

🗂️ Filtered Issues

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 314f8db5-9514-4ba3-b00d-2416b10cec8a

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Aug 26, 2026
Comment threadapps/server/src/ws.ts
remoteName: "origin",
});
const resolvedRemoteBase = yield* gitWorkflow.resolveRemoteTrackingCommit({
const baseBranch = bootstrap.prepareWorktree.baseBranch;

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.

🟠 Highsrc/ws.ts:1033

When baseBranch is origin/main, the remote check looks for refs/remotes/origin/origin/main and leaves worktreeBaseRef as the ambiguous origin/main; if refs/heads/origin/main exists, createWorktree starts from that local branch instead of the selected remote branch. Strip the origin/ qualifier before calling remoteBranchExists and resolveRemoteTrackingCommit so the worktree is based on the remote commit.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/ws.ts around line 1033:
When `baseBranch` is `origin/main`, the remote check looks for `refs/remotes/origin/origin/main` and leaves `worktreeBaseRef` as the ambiguous `origin/main`; if `refs/heads/origin/main` exists, `createWorktree` starts from that local branch instead of the selected remote branch. Strip the `origin/` qualifier before calling `remoteBranchExists` and `resolveRemoteTrackingCommit` so the worktree is based on the remote commit.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Would Approve

Macroscope's review found this PR approvable — This is a focused bootstrap bug fix that adds a read-only remote-ref check and preserves existing remote-backed behavior while enabling local-only branches, with targeted regression coverage and no schema or sensitive-path impact. An unresolved high-severity finding still flags qualified base names such as origin/main as a potential wrong-commit case.

Not approved because:

  • 1 blocking correctness issue found at or above your repo's Minimum Blocking Severity

Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

We selected #8349 as the smaller active repair for local-only base branches. It uses the existing remote resolution path and avoids adding new Git workflow and VCS contract methods. This branch's explicit missing-ref versus other Git error cases are not all in #8349, so they remain useful reference.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed.

@t3dotggt3dotgg closed this Aug 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: "Start from origin" aborts thread bootstrap when the base branch has no remote-tracking ref

2 participants

@cheruvian@t3dotgg