Skip to content

fix(host-service): list an intent-to-add rename once in git status - #7980

Merged
saddlepaddle merged 1 commit into
mainfrom
saddlepaddle/satya/file-open-crash-loop
Sep 30, 2026
Merged

saddlepaddle merged 1 commit into
mainfrom
saddlepaddle/satya/file-open-crash-loop

Conversation

@saddlepaddle

@saddlepaddle saddlepaddle commented Sep 30, 2026 •

Copy link
Copy Markdown
Collaborator

What broke

A user report: the desktop app showed "This view hit an error" as soon as a workspace opened, on every launch.

The Changes list had the same unstaged path twice. Opening the diff pane then threw CodeView.addItem: duplicate id "diff:unstaged:<path>". The diff pane is restored on launch and the git state is on disk, so the same workspace failed again every time.

Why

detectUnstagedRenames copies the index, marks untracked files intent-to-add, and diffs the whole worktree. It returned every rename in that diff. When the real index already has an intent-to-add file that git pairs with a deletion (git status shows R old -> new), that rename is already in unstaged. It came back a second time whenever the worktree also had any unrelated deletion and any untracked file. The merge in git-status.ts only drops consumed deleted/untracked entries, so the renamed entry was pushed twice.

Fix

Keep only renames onto the paths the detection marked itself.

Verification

  • New integration test: an intent-to-add rename + an unrelated deletion + an untracked file gives one renamed row. It fails on main (new.txt twice) and passes here.
  • Dev app over CDP, same git state: before the fix, two rows and the error screen, and both Reload and reopening the workspace fail again. After the fix, one row, the diff pane opens, and it still opens after a reload.
  • git/utils tests: long converging sequence of mixed batches times out at 5 s on this machine on main as well; with --timeout 60000 that file passes 39/39 with and without this change.

Not in this PR: the per-pane error boundary that would stop one pane's throw from taking over the workspace.


Summary by cubic

Fixes a workspace crash loop by listing an intent-to-add rename once in git status instead of twice. The duplicate unstaged path made the restored diff pane throw on the duplicate id, so the same workspace failed on every launch.

detectUnstagedRenames copied the index, marked untracked files intent-to-add, and diffed the whole worktree, so it also returned renames git already reported for files intent-to-add in the real index. It now only returns renames onto the files it marked itself.

Bug Fixes

  • Added an integration test with an intent-to-add rename, an unrelated deletion, and an untracked file that asserts the rename appears once.

Written for commit d7e849a. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • Bug Fixes
    • Git status now reports renames involving untracked files without duplicating rename entries already detected by Git.
    • Files marked for addition and modified before staging are correctly included in rename detection.
  • Tests
    • Added coverage for rename detection alongside deleted tracked files and other untracked files.

Rename detection copies the index, marks untracked files intent-to-add,
and diffs the whole worktree. It returned every rename in that diff,
including one git status had already reported for a file that is
intent-to-add in the real index. The Changes list then held the same
unstaged path twice, and the diff pane's CodeView threw on the duplicate
id. The pane is restored on launch and the git state is on disk, so the
workspace failed again on every launch.

Keep only renames onto the files the detection marked itself.
@coderabbitai

coderabbitai Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: 4310e41f-6351-4061-bbdb-1fc0ad117243

📥 Commits

Reviewing files that changed from the base of the PR and between 0bfe99f and d7e849a.

📒 Files selected for processing (2)
  • packages/host-service/src/trpc/router/git/utils/git-helpers.ts
  • packages/host-service/src/trpc/router/git/utils/git-status.integration.test.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.


📝 Walkthrough

Walkthrough

The unstaged rename detector now filters temporary-index diff results by untracked destination path. An integration test covers rename detection when a replacement file is staged with intent-to-add.

Changes

Unstaged Rename Filtering

Layer / File(s) Summary
Filter and verify unstaged renames
packages/host-service/src/trpc/router/git/utils/git-helpers.ts, packages/host-service/src/trpc/router/git/utils/git-status.integration.test.ts
detectUnstagedRenames skips rename entries whose destination is not in untrackedPaths. An integration test checks the resulting snapshot and rename for an intent-to-add replacement.

Priority: ➖ Normal

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix

Suggested reviewers: kitenite

Merge Risk: ⚪ Minimal · up to d7e84

The intent-to-add rename remains in the snapshot, while the filter removes only its duplicate. No material merge risk was found.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title uses conventional commit format and clearly describes the primary fix for duplicate intent-to-add renames in host-service Git status.
Description check ✅ Passed The description clearly explains the failure, cause, fix, and verification results. It does not include the required Checklist section or its checklist items, but the core description is complete and …
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 2 files.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Commit to this branch
  • Create a new PR
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


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-actions

github-actions Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

🧹 Preview Cleanup Complete

The following preview resources have been cleaned up:

  • ✅ Neon database branch

Thank you for your contribution! 🎉

@saddlepaddle
saddlepaddle merged commit ec1c0d5 into main Sep 30, 2026
23 of 24 checks passed
@saddlepaddle
saddlepaddle deleted the saddlepaddle/satya/file-open-crash-loop branch September 30, 2026 15:45
Kitenite added a commit that referenced this pull request Oct 1, 2026
* docs: weekly update for PRs merged 2026-09-23 to 2026-09-30

Source of truth: live Notion SOP "Weekly Docs Update (automation SOP)".
Window: merged:>=2026-09-23 (139 PRs). PRs through the morning of 09-23
were covered by #7771.

Changes
- Pages: no auto-open on publish (#7790); page links and URL links split
  into their own settings (#7916, #7962, #7946); Listening agents menu with
  per-row stop and Add listening agent (#7724, #7820, #7919); globe on the
  Share button (#7766); Report on public pages (#7886); agents offer a page
  (#7759). Files: pages.mdx, cli/cli-reference.mdx.
- Settings moves: Links replaced by Browser and Files & Editor (#7916,
  #7962). Files: editor.mdx, terminal-integration.mdx, customization.mdx.
- Editor: inline rename and drag to move (#7692), Auto Save (#7693, #7916),
  open and save files outside the workspace (#7897, #7982), Copy as Markdown
  (#7591), per-pane error screen (#7983). File: editor.mdx.
- Terminal copy follows Ghostty's whitespace rules (#7868).
  File: terminal-integration.mdx.
- Agents: UFO (#7898); GPT-6 Astra, Sonnet 5.5, retiring GPT-5.5, retired
  GPT-5.4/5.3 Codex (#7783, #7894, #7935). Files: agent-integration.mdx,
  cli/cli-reference.mdx.
- Host: superset start --daemon --auto-update and update-lock permission
  errors (#7735, #7952). Files: cli/host-server.mdx, cli/cli-reference.mdx.
- Removed the mcp CLI section and the Connected Service Plugins section:
  #7776 made plugins/mcp internal, the Plugins page is staff-flagged, and
  apps/docs/AGENTS.md keeps internal commands out. Files: skills.mdx,
  cli/cli-reference.mdx.
- Slack page unfurls and details panel (#7817, #7821, #7914, #7957).
  File: use-with-slack.mdx.
- Workspaces: instant creation with background naming (#7518); recoverable
  project deletion (#7896). File: workspaces.mdx.
- Shortcuts: prev/next workspace includes Pinned and wraps (#7851); ⌘B
  collapses the sidebar to a rail (#7964). File: keyboard-shortcuts.mdx.
- Ship controls and open-in button moved to the right sidebar strip (#7958).
  Files: diff-viewer.mdx, use-with-ide.mdx.

Deliberately skipped
- Cloud workspaces/environments/sandboxes (flag-gated, AGENTS.md rule):
  #7784 #7795 #7824 #7840 #7844 #7845 #7847 #7849 #7850 #7858 #7861 #7863
  #7874 #7911 #7913 #7918 #7922 #7931 #7932 #7937 #7956 #7961 #7969 #7981
  #7637 #7794 #7789 #7838 (its CLI docs already shipped in the PR).
- Staff-only plugins: #7912 Sentry plugin, #7716, #7727, #7955.
- Already documented in their own PRs: #7917, #7921.
- Removed feature never documented: #7796 Google Calendar triggers.
- Agents chip remove/revert/default-off, never documented: #7870 #7871 #7872.
- Billing/backend policy with no docs surface: #7947, #7812, #7786, #7792,
  #7798, #7761, #7948, #7949, #7951, #7827.
- Reverted security trio: #7828 #7829 #7830 (reverted by #7834).
- Fixes restoring expected behavior: #7683 #7696 #7707 #7743 #7751 #7756
  #7764 #7765 #7781 #7788 #7791 #7823 #7825 #7833 #7837 #7852 #7857 #7860
  #7864 #7865 #7869 #7873 #7897-covered #7903 #7938 #7980 #7943 #7964-chrome.
- Mobile (no docs page): #7746 #7747 #7748 #7749 #7750 #7782 #7793 #7810
  #7814 #7816 #7889 #7968.
- Marketing, internal docs, CI, version bumps: #7651 #7744 #7752 #7771 #7774
  #7776-infra #7777 #7785 #7811 #7818 #7822 #7826 #7834 #7884 #7885 #7895
  #7909 #7933 #7934 #7942 #7944 #7965 #7966.

Validation: bun run --cwd apps/docs typecheck, bun run lint:fix,
bun run lint (exit 0), Vale on 13 changed files (0 errors, 0 warnings),
git diff --check.

* chore: log weekly docs update follow-ups

* docs: tighten review findings in the weekly update

Only the page creator can stop or add listening agents. On focus change also
saves on window blur, and Auto Save pauses on conflicts. Taken-down pages do
not unfurl. Model picker coverage matches agent-models.ts.

This branch was previously deployed

1 inactive deployment
preview — d7e849a3 Deployed Sep 30, 2026 by saddlepaddle via Deploy Marketing #10623
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant