Repository navigation
Conversation
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This is a narrowly scoped bug fix that preserves explicit grouped-project renames while leaving grouping keys, untouched-blur behavior, and fallback labels intact. Regression coverage was added for the affected web and shared-runtime paths, with no product-default or static-analysis changes. You can add or adjust custom eligibility rules. Learn more. |
|
Note Written by Hi! We are cleaning up open PRs, and this one does not say which model or harness was used to create it. If this change is really important, we recommend rebuilding the PR with a newer model and noting the model and harness in the PR description. |
|
Note Written by Reopening, this was closed by mistake. Sorry for the noise! |
Renaming a grouped project to just the repository name (e.g. stripping 'group/subgroup/' down to 'repo') silently snapped back to the derived 'group/subgroup/repo' label: deriveProjectGroupLabel ignored a shared title matching the repository name, and the settings rename gate skipped the write when every member title already equaled the new title. Honor a shared title that differs from the display path even when it equals the repository name, and persist every explicit settings edit. The shared-runtime fix covers web, desktop, and mobile; divergent titles still fall back to the derived display path. Built with Muse Spark 1.3 Free via OpenCode harness.
3a45848 to
6fc69df
Compare
|
Note This comment is posted by Julius' dot Two points need clarification before triage can finish:
|
|
Thanks for the detailed triage. On the two points: Screenshots. The five captures described in the body are being attached to the PR separately (three before, two after); I can add a short rename → blur → reload recording on request. Defaults vs explicit rename. You're right that the two states converge: a never-renamed group whose folder titles already equal the repo name, and a group explicitly renamed to exactly the repo name, reach |
|
Note 🤖 Claude Opus 5.5 responding on behalf of Theo Closing because this PR states that Muse Spark wrote code in it:
We do not accept code written by Gemini models or by Muse models other than Muse Wonder Full. See Models we do not accept. To have this considered again, open a new PR with the code written by a different model and link this one. |
Fixes #15049 (maintainer-triaged; the triage comment on the issue establishes the failure and intended behavior).
Problem
Renaming a grouped project (more than one checkout) to just the repository name — e.g. stripping
group/subgroup/down torepo— does not stick. The sidebar and settings silently snap back to the derivedgroup/subgroup/repolabel. Two causes:deriveProjectGroupLabelonly honored a shared member title when it differed from bothrepositoryIdentity.displayNameand.name, so a rename to exactly the repo name lost to the derived display path.projectGroupTitleNeedsUpdateskipped the settings write entirely when every member title already equaled the new title (the common case, since default folder-name titles already arerepo).Fix
packages/client-runtime/src/state/projectGrouping.ts: honor a shared title that differs from the display path even when it equals the repository name. Display-path exclusion and all fallbacks (divergent titles → display name → repo name → representative) are unchanged. The shared-runtime fix covers web, desktop, and mobile.apps/web/src/components/settings/ProjectSettingsPanel.logic.ts: persist every explicit settings edit; untouched blurs still skip the fan-out (the fix(web): keep grouped project renames #7831 protection).No contract, server, schema, or docs changes — nothing crossing the wire changed.
Verification
Tests:
mainbefore the fix (expected 'group/subgroup/repo' to be 'repo';expected false to be true— 2 failed, 15 passed) and pass with it: 2 files, 17 tests.environmentGrouping,settingsScope, mobileproject-grouping): 3 files, 35 passed.@t3tools/client-runtimeand@t3tools/web; oxlint and format check clean on the 4 changed files. No repo-wide checks (CI owns those).Manual, in a real client (web dev server, unfixed code vs. this branch):
Reproduction setup: two checkouts whose
originishttps://gitlab.com/group/subgroup/repo.git, which is the reported GitLab shape —repositoryIdentity.nameisrepo,displayNameisgroup/subgroup/repo, and the default folder-name title is alreadyrepo.On
main, Settings → the grouped project, delete thegroup/subgroup/prefix so the field readsrepo, then blur. The field reverts togroup/subgroup/repo, and the composer keeps showing the full path.With this change, the same edit persists: the settings header and the Name field both read
repo, and a full page reload still readsrepo— so the rename is stored, not just held in the DOM. The SQLite projection confirms the fan-out wrote both group members:Not captured: no mobile runtime pass (mobile shares the same helper and is covered by unit tests only), and no post-fix sidebar/chat composer screenshot — the preview panel became unavailable again after the settings captures.
Screenshots
Captured in the T3 web dev server (full viewport, dark appearance) with two checkouts sharing
origin = https://gitlab.com/group/subgroup/repo.git. Images to be attached below (not committed to the repo); filenames match the staged files. Nothing cropped or edited.Before - unfixed code, the rename does not apply:
1-BEFORE-typed-not-applied.png— Name field edited torepowhile the header still readsgroup/subgroup/repo2-BEFORE-snapped-back.png— After revisiting, the field has snapped back togroup/subgroup/repo3-BEFORE-picker-shows-path.png— Project picker lists the group asgroup/subgroup/repo(derived path, not the stored title)After - with this change, the same edit sticks:
4-AFTER-rename-sticks.png— Settings header ("Applying settings forrepo") and the Name field both readrepo5-AFTER-persists-reload.png— Same page after a full reload: stillrepo, so the rename persisted server-sideCompare 2 against 4: identical action, opposite outcome.
A short rename, blur and reload recording has not been captured yet and will follow separately.
Built with Muse Spark 1.3 Free via the OpenCode harness.