You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Prerequisite for adding a Turkish UI. If the system or UI locale is tr/az, toLocaleLowerCase()/toLocaleUpperCase() called with no locale turn I into dotless ı and i into İ. Default-locale collation also stops treating I and i as base-equal. Identifier matching then breaks (we hit this class of bug in #31159).
Audit
I grepped src/ and mobile/ for toLocaleLowerCase(), toLocaleUpperCase(), localeCompare( and Intl.Collator, excluding tests, and found 278 hits. Ten parallel Codex reviewers classified slices of them, and I checked each one by hand.
Fixed
Casing on identifiers changed to toLowerCase()/toUpperCase():
Linear CLI/runtime selectors: priority flag, team id/key, label id/name, state id/name/type, assignee id/name/email, issue identifiers in retry. Example: INFRA no longer fails to match infra.
Linear error classification: RATE LIMIT turned into rate lımıt and was missed.
Searches over ASCII ids: Jira project keys, plugin keys and publishers, hidden-worktree names and paths, address-picker typeahead, slash command and skill names.
Collation pinned to 'en' where ordering or equality has to give the same result on every host:
'en' gives the same ordering en-US hosts produce today, so existing hashes and keys do not change.
Left locale-aware on purpose
Prose casing and display-list sorting.
Markdown and DOM find, which already handles İ expansion on purpose.
Tie-breaks that only order lists on one host.
'me' token checks, which contain no I/i.
Validation
Typecheck: tc:web, node and cli projects all pass.
lint:ast-grep and oxlint pass. verify:localization-extraction passes.
41 related test files pass: 548 tests. No new test was added, because a test would have to stub the ICU default locale and would only check implementation details.
Under a tr/az default locale, toLocaleLowerCase()/toLocaleUpperCase() map
I to dotless ı and İ, and default-locale collation stops treating I/i as
base-equal. Switch identifier matching (Linear CLI selectors, priorities,
error classification, plugin/Jira/worktree/address/slash-command search) to
toLowerCase()/toUpperCase(), and pin collation to 'en' where ordering feeds
hashes, canonical JSON, semver precedence, remote selection, SSH Include
order, or WSL distro equality. User-visible prose casing and display-list
sorting stay locale-aware.
The changes replace locale-sensitive case conversion with locale-independent case conversion in CLI, Linear, renderer, and native chat matching. They also specify English-locale comparisons for sorting and fingerprinting, and code-point ordering for SSH Include glob matches. The summaries report that matching criteria, error handling, and existing sorting behavior remain otherwise unchanged.
Priority: Low
Merge Risk: Low · up to 99a74
Turkish and Azerbaijani users may miss dashboard search results, and a narrow prerelease-version case may be ordered incorrectly during update decisions. These are bounded issues, so merge is possible with owner awareness and follow-up.
Pre-merge checks: 3 · 2
Failed checks: 2 warnings
Check name
Status
Explanation
Resolution
Description check
The description explains the change, motivation, audit scope, and validation results, but it omits most required template sections, including an actual linked issue, ELI5, Visual Proof, Testing checkb…
Add the required template sections and complete them. Include an actual issue link after “Fixes #”, write an ELI5 summary, state the user-visible change and mechanism, add N/A with a reason for Visual Proof if applicable, document testing…
Docstring Coverage
Docstring coverage is 11.76% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documenta…
Write docstrings for the functions missing them to satisfy the coverage threshold.
Passed checks: 3 passed
Check name
Status
Explanation
Title check
The title clearly summarizes the main change: making identifier casing locale-independent for Turkish-related issues.
Linked Issues check
Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check
Check skipped because no linked issues were found for this pull request.
Full details: Description check
Explanation
The description explains the change, motivation, audit scope, and validation results, but it omits most required template sections, including an actual linked issue, ELI5, Visual Proof, Testing checkboxes, AI Disclosure, Review, boundary confirmation, Notes, and Checklist.
Resolution
Add the required template sections and complete them. Include an actual issue link after “Fixes #”, write an ELI5 summary, state the user-visible change and mechanism, add N/A with a reason for Visual Proof if applicable, document testing and platforms, complete the AI Disclosure and Agent skill upstream boundary sections, address the Notes items, and check or explain each Checklist item.
Full details: Docstring Coverage
Explanation
Docstring coverage is 11.76% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentation-only edits and deletions within surviving functions are included; unchanged diff context and fully deleted functions are excluded. Analyzed 17 functions across 25 files.
Resolution
Write docstrings for the functions missing them to satisfy the coverage threshold.
Finishing Touches: 💡 1
📝 Generate docstrings: 💡
Commit to this branch
Create a new PR
Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
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.
scanKey serializes providerRoots after sorting them. SkillProviderRootOverrides accepts the full provider-ID union, and lowercase ASCII IDs can still sort differently by locale. Use an explicit locale.
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 4 remain after this review.
The reason will be displayed to describe this comment to others. Learn more.
Minor · Functional Correctness · Quick win
Supported by static analysis
Script executed:
git show ea6c69be9a193f1a5cf8e5a5fda28ea6c4253f46:src/shared/app-version.ts | sed -n '1,110p'
sed -n '1,110p' src/shared/app-version.ts
node -e "for(const l of ['en','tr','az','de']) console.log(l, 'Beta'.localeCompare('alpha',l), 'Beta'.localeCompare('alpha'))"
The Beta/alpha failure predates this PR: both the base default-locale comparator and the head’s English comparator return the wrong order. However, this change can worsen the same SemVer violation for other valid identifiers. Under Turkish or Azerbaijani default locales, the base orders I before i, while the explicit English comparator reverses that order.
Use code-unit ordering for non-numeric identifiers.
Proposed fix
--- "a/src/shared/app-version.ts"+++ "b/src/shared/app-version.ts"@@ -53,7 +53,7 @@
if (rightNumeric) {
return 1
}
- return left.localeCompare(right, 'en')+ return left < right ? -1 : left > right ? 1 : 0
}
/** Returns negative if left < right, 0 if equal, positive if left > right. */
Committable suggestion
IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 3 remain after this review.
The reason will be displayed to describe this comment to others. Learn more.
Minor · Functional Correctness · Quick win
Preserve locale-aware matching for prose fields.
automation.name, run.title, and hostLabel are display text, not only identifiers. The companion filter also searches task and message text. (github.com)
With a Turkish or Azerbaijani runtime, İstanbul.toLowerCase() becomes i\u0307stanbul, while the query istanbul becomes istanbul. The includes() check then hides a matching dashboard item. ECMAScript defines toLowerCase() as locale-insensitive, and Unicode assigns this default mapping to U+0130. (tc39.es)
Keep prose matching locale-aware. Apply the invariant transform only to fields with an identifier contract. Apply the same split to agent-board-filtering.ts.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Prerequisite for adding a Turkish UI. If the system or UI locale is
tr/az,toLocaleLowerCase()/toLocaleUpperCase()called with no locale turnIinto dotlessıandiintoİ. Default-locale collation also stops treatingIandias base-equal. Identifier matching then breaks (we hit this class of bug in #31159).Audit
I grepped
src/andmobile/fortoLocaleLowerCase(),toLocaleUpperCase(),localeCompare(andIntl.Collator, excluding tests, and found 278 hits. Ten parallel Codex reviewers classified slices of them, and I checked each one by hand.Fixed
Casing on identifiers changed to
toLowerCase()/toUpperCase():INFRAno longer fails to matchinfra.RATE LIMITturned intorate lımıtand was missed.Collation pinned to
'en'where ordering or equality has to give the same result on every host:stableJson.Includeglob order.'en'gives the same ordering en-US hosts produce today, so existing hashes and keys do not change.Left locale-aware on purpose
İexpansion on purpose.'me'token checks, which contain noI/i.Validation
tc:web, node and cli projects all pass.lint:ast-grepand oxlint pass.verify:localization-extractionpasses.