fix: improve name generation step UX and fix sentinel expansion bug#739
fix: improve name generation step UX and fix sentinel expansion bug#739
Conversation
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.Scanned FilesNone |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository UI Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (15)
📜 Recent review details⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
🧰 Additional context used📓 Path-based instructions (5)docs/design/*.md📄 CodeRabbit inference engine (CLAUDE.md)
Files:
**/*.py📄 CodeRabbit inference engine (CLAUDE.md)
Files:
src/synthorg/**/*.py📄 CodeRabbit inference engine (CLAUDE.md)
Files:
{**/*.py,cli/**/*.go}📄 CodeRabbit inference engine (CLAUDE.md)
Files:
tests/**/*.py📄 CodeRabbit inference engine (CLAUDE.md)
Files:
🧠 Learnings (14)📚 Learning: 2026-03-19T11:33:01.580ZApplied to files:
📚 Learning: 2026-03-15T19:14:27.144ZApplied to files:
📚 Learning: 2026-03-18T21:23:23.586ZApplied to files:
📚 Learning: 2026-03-15T18:28:13.207ZApplied to files:
📚 Learning: 2026-03-19T07:12:14.508ZApplied to files:
📚 Learning: 2026-03-15T18:38:44.202ZApplied to files:
📚 Learning: 2026-03-22T16:44:15.487ZApplied to files:
📚 Learning: 2026-03-20T08:28:32.845ZApplied to files:
📚 Learning: 2026-03-15T18:38:44.202ZApplied to files:
📚 Learning: 2026-03-15T19:14:27.144ZApplied to files:
📚 Learning: 2026-03-15T19:14:27.144ZApplied to files:
📚 Learning: 2026-03-17T22:08:13.456ZApplied to files:
📚 Learning: 2026-03-19T07:13:44.964ZApplied to files:
📚 Learning: 2026-03-19T07:12:14.508ZApplied to files:
🧬 Code graph analysis (2)src/synthorg/api/controllers/setup_models.py (1)
src/synthorg/api/controllers/setup.py (6)
🪛 YAMLlint (1.38.0)src/synthorg/templates/builtins/full_company.yaml[warning] 141-141: comment not indented like content (comments-indentation) [error] 142-142: syntax error: found character '%' that cannot start any token (syntax) 🔇 Additional comments (24)
WalkthroughThis change adds a new "Choose name locales" step to the setup wizard and shifts subsequent steps, updating docs to describe a seven-step flow. Backend setup controllers gained agent-name endpoints (update and randomize), name-locales parsing with an option to return raw stored values (including the sentinel __all__), and validation helpers. Several built-in templates had agent Suggested labels
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Comment |
Summary of ChangesHello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request addresses a bug in locale handling and introduces several UX improvements to the setup wizard. It also updates the documentation to reflect the changes in the setup process. The primary goal is to provide a smoother and more intuitive experience for new users during the initial setup. Highlights
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here. Footnotes
|
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #739 +/- ##
==========================================
+ Coverage 92.26% 92.27% +0.01%
==========================================
Files 573 573
Lines 29608 29655 +47
Branches 2868 2870 +2
==========================================
+ Hits 27318 27365 +47
Misses 1810 1810
Partials 480 480 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/synthorg/api/controllers/setup.py (1)
873-933:⚠️ Potential issue | 🟠 MajorKeep the raw
resolve=Falsepath sanitized.This helper now returns any stored list verbatim when
resolve=False. A legacy or manually editedcompany/name_localesvalue can therefore leak duplicate, unknown, or non-string entries throughGET /setup/name-locales, which the selector cannot render cleanly andPUT /setup/name-localeswill reject on the next save. Preserve__all__, but still sanitize explicit codes before returning them. Pulling that raw-list cleanup into a small helper would also bring_read_name_locales()back under the 50-line limit.As per coding guidelines "Validate input at system boundaries (user input, external APIs, config files)" and "Keep functions under 50 lines and files under 800 lines".Suggested fix
if resolve: from synthorg.templates.locales import resolve_locales # noqa: PLC0415 parsed = resolve_locales(parsed) + else: + from synthorg.templates.locales import ( # noqa: PLC0415 + ALL_LOCALES_SENTINEL, + VALID_LOCALE_CODES, + ) + + if ALL_LOCALES_SENTINEL in parsed: + parsed = [ALL_LOCALES_SENTINEL] + else: + sanitized = [ + loc + for loc in parsed + if isinstance(loc, str) and loc in VALID_LOCALE_CODES + ] + parsed = list(dict.fromkeys(sanitized)) return parsed or None🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/synthorg/api/controllers/setup.py` around lines 873 - 933, The resolve=False branch of _read_name_locales currently returns the stored list verbatim and must instead sanitize it: add a small helper (e.g. _sanitize_name_locales) and call it when resolve is False to (1) allow the special sentinel "__all__" unchanged, (2) filter the list to only strings, strip whitespace, drop empty strings, remove duplicates while preserving order, and (3) drop unknown/invalid locale codes (but do not expand them) — keep resolve=True behavior using resolve_locales unchanged; refactor so _read_name_locales delegates raw-list cleanup to that helper to stay under 50 lines.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@docs/user_guide.md`:
- Line 72: Update the "Create your company" step to note that the wizard now
opens with the "Startup" template preselected by default and that agents will be
auto-created when a template is selected; instruct users to choose "Start Blank"
if they want an empty organization with no auto-created agents, and adjust the
sentence that currently implies templates are only applied after an explicit
choice to reflect this default selection behavior.
In `@web/src/components/setup/SetupCompany.vue`:
- Line 19: selectedTemplate is prefilled with 'startup' before fetchTemplates()
completes, causing accidental submission of a startup template; change the flow
so selectedTemplate starts as null (remove the 'startup' default), set
selectedTemplate only after fetchTemplates() resolves and confirms the template
exists (e.g., pick 'startup' only if it's present in the fetched templates), and
update the form submit logic to guard against null (disable or prevent submit
when selectedTemplate is null) so failures or slow loads can't auto-select
startup; reference the selectedTemplate ref and the fetchTemplates() resolution
to implement this.
---
Outside diff comments:
In `@src/synthorg/api/controllers/setup.py`:
- Around line 873-933: The resolve=False branch of _read_name_locales currently
returns the stored list verbatim and must instead sanitize it: add a small
helper (e.g. _sanitize_name_locales) and call it when resolve is False to (1)
allow the special sentinel "__all__" unchanged, (2) filter the list to only
strings, strip whitespace, drop empty strings, remove duplicates while
preserving order, and (3) drop unknown/invalid locale codes (but do not expand
them) — keep resolve=True behavior using resolve_locales unchanged; refactor so
_read_name_locales delegates raw-list cleanup to that helper to stay under 50
lines.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 2e1124ff-ac4b-4017-90ca-cad1695ffbc6
📒 Files selected for processing (6)
docs/user_guide.mdsrc/synthorg/api/controllers/setup.pytests/unit/api/controllers/test_setup.pyweb/src/components/common/NameLocaleSelector.vueweb/src/components/setup/SetupCompany.vueweb/src/components/setup/SetupNameLocale.vue
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
- GitHub Check: Test (Python 3.14)
- GitHub Check: Build Backend
- GitHub Check: Build Web
- GitHub Check: Build Sandbox
- GitHub Check: Analyze (python)
🧰 Additional context used
📓 Path-based instructions (9)
**/*.{py,ts,tsx,js,vue}
📄 CodeRabbit inference engine (CLAUDE.md)
Maintain line length of 88 characters (enforced by ruff)
Files:
web/src/components/setup/SetupNameLocale.vueweb/src/components/setup/SetupCompany.vueweb/src/components/common/NameLocaleSelector.vuesrc/synthorg/api/controllers/setup.pytests/unit/api/controllers/test_setup.py
**/*.{py,ts,tsx,js,vue,go}
📄 CodeRabbit inference engine (CLAUDE.md)
**/*.{py,ts,tsx,js,vue,go}: Keep functions under 50 lines and files under 800 lines
Handle errors explicitly and never silently swallow exceptions
Validate input at system boundaries (user input, external APIs, config files)
Files:
web/src/components/setup/SetupNameLocale.vueweb/src/components/setup/SetupCompany.vueweb/src/components/common/NameLocaleSelector.vuesrc/synthorg/api/controllers/setup.pytests/unit/api/controllers/test_setup.py
web/src/components/**/*.vue
📄 CodeRabbit inference engine (CLAUDE.md)
Vue 3 components must follow PrimeVue + Tailwind CSS patterns
Files:
web/src/components/setup/SetupNameLocale.vueweb/src/components/setup/SetupCompany.vueweb/src/components/common/NameLocaleSelector.vue
web/src/**/*.{vue,ts,js}
📄 CodeRabbit inference engine (CLAUDE.md)
Use ESLint and vue-tsc for linting and type checking in the Vue dashboard
Files:
web/src/components/setup/SetupNameLocale.vueweb/src/components/setup/SetupCompany.vueweb/src/components/common/NameLocaleSelector.vue
docs/**/*.md
📄 CodeRabbit inference engine (CLAUDE.md)
Build docs with Zensical; config in
mkdocs.yml; docs are in Markdown indocs/directory
Files:
docs/user_guide.md
**/*.py
📄 CodeRabbit inference engine (CLAUDE.md)
**/*.py: Use Python 3.14+ with PEP 649 native lazy annotations; nofrom __future__ import annotations
Use PEP 758 except syntax:except A, B:without parentheses (enforced by ruff on Python 3.14)
All public functions must have type hints; mypy strict mode is enforced
Use Google-style docstrings on all public classes and functions (enforced by ruff D rules)
Implement immutability by creating new objects rather than mutating existing ones; usecopy.deepcopy()at construction andMappingProxyTypefor read-only enforcement on internal collections
Fordict/listfields in frozen Pydantic models, usecopy.deepcopy()at system boundaries (tool execution, LLM provider serialization, inter-agent delegation, persistence serialization)
Use Pydantic v2 conventions:BaseModel,model_validator,computed_field,ConfigDict; use@computed_fieldfor derived values instead of storing redundant fields
UseNotBlankStr(fromcore.types) for all identifier/name fields in Pydantic models instead of manual whitespace validators, including optional and tuple variants
Useasyncio.TaskGroupfor fan-out/fan-in parallel operations in new code (e.g. multiple tool invocations, parallel agent calls) for structured concurrency
Files:
src/synthorg/api/controllers/setup.pytests/unit/api/controllers/test_setup.py
src/synthorg/**/*.py
📄 CodeRabbit inference engine (CLAUDE.md)
src/synthorg/**/*.py: Every module with business logic must have:from synthorg.observability import get_loggerthenlogger = get_logger(__name__)
Never useimport logging/logging.getLogger()/print()in application code; always use the centralized logger
Always use logger variable namelogger(not_logger, notlog)
Use event name constants fromsynthorg.observability.events.<domain>instead of string literals (e.g.,API_REQUEST_STARTEDfromevents.api)
Use structured logging with kwargs:logger.info(EVENT, key=value)instead of string formatting likelogger.info("msg %s", val)
Log all error paths at WARNING or ERROR level with context before raising
Log all state transitions at INFO level
Use DEBUG level for object creation, internal flow, and entry/exit of key functions
Pure data models, enums, and re-exports do NOT require logging
Never use real vendor names (Anthropic, OpenAI, Claude, GPT, etc.) in project-owned code, docstrings, comments, tests, or config examples; use generic names likeexample-provider,example-large-001,test-provider
Never use vendor-agnostic names in vendor-specific contexts like LiteLLM imports or third-party module names; vendor names allowed only in: Operations design page,.claude/files, third-party import paths
UseNotBlankStrfor all identifier/name fields in Pydantic models to prevent empty/whitespace-only values
Separating config (frozen Pydantic models) from runtime state (mutable models usingmodel_copy); never mix static config fields with mutable runtime fields in one model
Files:
src/synthorg/api/controllers/setup.py
src/synthorg/api/**/*.py
📄 CodeRabbit inference engine (CLAUDE.md)
Use RFC 9457 error format for REST API responses
Files:
src/synthorg/api/controllers/setup.py
tests/**/*.py
📄 CodeRabbit inference engine (CLAUDE.md)
tests/**/*.py: Use@pytest.mark.unit,@pytest.mark.integration,@pytest.mark.e2e,@pytest.mark.slowto categorize tests
Maintain 80% minimum code coverage (enforced in CI)
Prefer@pytest.mark.parametrizefor testing similar cases
Use Python Hypothesis for property-based testing with@givenand@settingsdecorators; useHYPOTHESIS_PROFILEenv var to control examples (ci: 50, dev: 1000)
Never skip or dismiss flaky tests; fix them fundamentally by mockingtime.monotonic()andasyncio.sleep()for timing-sensitive tests and usingasyncio.Event().wait()instead ofasyncio.sleep(large_number)for indefinite blocking
Files:
tests/unit/api/controllers/test_setup.py
🧠 Learnings (1)
📚 Learning: 2026-03-19T07:12:14.508Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-19T07:12:14.508Z
Learning: Applies to src/synthorg/api/**/*.py : API package (api/): Litestar REST + WebSocket with controllers, guards, channels, JWT + API key + WS ticket auth, approval gate integration, coordination endpoint, collaboration endpoint, settings endpoint, provider management endpoint (CRUD + test + presets), backup endpoint, RFC 9457 structured errors, AppState hot-reload slots, service auto-wiring (Phase 1 at construction, Phase 2 on startup), lifecycle helpers
Applied to files:
src/synthorg/api/controllers/setup.py
🧬 Code graph analysis (2)
src/synthorg/api/controllers/setup.py (2)
src/synthorg/settings/service.py (1)
SettingsService(152-637)src/synthorg/templates/locales.py (1)
resolve_locales(183-208)
tests/unit/api/controllers/test_setup.py (1)
src/synthorg/api/controllers/setup.py (1)
_read_name_locales(873-933)
🔇 Additional comments (1)
web/src/components/common/NameLocaleSelector.vue (1)
150-150: Good use ofv-showhere.This keeps the "All" mode uncluttered without remounting the region grid, so toggling back preserves the existing region state.
| const companyName = ref('') | ||
| const companyDescription = ref('') | ||
| const selectedTemplate = ref<string | null>(null) | ||
| const selectedTemplate = ref<string | null>('startup') |
There was a problem hiding this comment.
Defer the startup default until templates finish loading.
Line 19 preselects startup before fetchTemplates() resolves. The form can now submit template_name: "startup" while no startup card is rendered yet, or after template loading fails, so users can get auto-created startup agents without ever seeing that selection.
Suggested fix
-const selectedTemplate = ref<string | null>('startup')
+const selectedTemplate = ref<string | null>(null)
+const templatesLoading = ref(true) onMounted(async () => {
- await setup.fetchTemplates()
- // fetchTemplates catches errors internally; surface to component.
- if (setup.error) {
- error.value = setup.error
- }
+ try {
+ await setup.fetchTemplates()
+ if (!setup.error && setup.templates.some((tmpl) => tmpl.name === 'startup')) {
+ selectedTemplate.value = 'startup'
+ }
+ // fetchTemplates catches errors internally; surface to component.
+ if (setup.error) {
+ error.value = setup.error
+ }
+ } finally {
+ templatesLoading.value = false
+ }
})- :disabled="!isValid"
+ :disabled="!isValid || templatesLoading"🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@web/src/components/setup/SetupCompany.vue` at line 19, selectedTemplate is
prefilled with 'startup' before fetchTemplates() completes, causing accidental
submission of a startup template; change the flow so selectedTemplate starts as
null (remove the 'startup' default), set selectedTemplate only after
fetchTemplates() resolves and confirms the template exists (e.g., pick 'startup'
only if it's present in the fetched templates), and update the form submit logic
to guard against null (disable or prevent submit when selectedTemplate is null)
so failures or slow loads can't auto-select startup; reference the
selectedTemplate ref and the fetchTemplates() resolution to implement this.
There was a problem hiding this comment.
Code Review
This pull request introduces several improvements to the setup process. It fixes a bug where the __all__ sentinel for name locales was being expanded prematurely, which is a good correction. The UX for name locale selection is enhanced by hiding region groups when 'All' is selected and using a more responsive grid layout. The default template is also now 'Startup' for a better out-of-the-box experience. The documentation has been updated accordingly.
The backend and frontend changes look solid. However, I've found a couple of issues in the tests where shared state is modified without proper cleanup, which could lead to test flakiness. I've added comments with suggestions to address this.
| resp = test_client.get("/api/v1/setup/name-locales") | ||
| assert resp.status_code == 200 | ||
| data = resp.json()["data"] | ||
| assert data["locales"] == ["en_US", "fr_FR"] |
There was a problem hiding this comment.
This test modifies the shared repo._store but doesn't clean up after itself because the try...finally block was removed. This can lead to test flakiness, as the modified state can affect other tests. Please restore the try...finally block to ensure the store is cleaned up, even if assertions fail.
try:
resp = test_client.get("/api/v1/setup/name-locales")
assert resp.status_code == 200
data = resp.json()["data"]
assert data["locales"] == ["en_US", "fr_FR"]
finally:
repo._store.pop(("company", "name_locales"), None)| app_state = test_client.app.state.app_state | ||
| repo = app_state.persistence._settings_repo | ||
| now = datetime.now(UTC).isoformat() | ||
| repo._store[("company", "name_locales")] = ( | ||
| json.dumps(["__all__"]), | ||
| now, | ||
| ) | ||
| resp = test_client.get("/api/v1/setup/name-locales") | ||
| assert resp.status_code == 200 | ||
| data = resp.json()["data"] | ||
| assert data["locales"] == ["__all__"] |
There was a problem hiding this comment.
Similar to the previous test, this new test test_returns_all_sentinel_when_explicitly_stored modifies the shared repo._store but doesn't clean it up. This can cause state to leak between tests and lead to flakiness. Please wrap the test logic in a try...finally block to ensure cleanup. Other new tests in this file already follow this pattern.
app_state = test_client.app.state.app_state
repo = app_state.persistence._settings_repo
now = datetime.now(UTC).isoformat()
repo._store[("company", "name_locales")] = (
json.dumps(["__all__"]),
now,
)
try:
resp = test_client.get("/api/v1/setup/name-locales")
assert resp.status_code == 200
data = resp.json()["data"]
assert data["locales"] == ["__all__"]
finally:
repo._store.pop(("company", "name_locales"), None)The GET /setup/name-locales endpoint was resolving the __all__ sentinel into 57 individual locale codes via resolve_locales(), even on fresh instances. The frontend checks for exactly ["__all__"] to show the toggle as ON, so it always appeared OFF. Add a resolve parameter to _read_name_locales() -- the GET endpoint uses resolve=False to return the raw sentinel, while the name generation path keeps resolve=True for expanded codes. Also hide region groups when All is toggled ON and switch to a responsive multi-column grid layout for the region selector. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Move resolve_locales import inside conditional branch (only imported when resolve=True) - Improve docstring precision for resolve=False empty-list behavior - Add unit tests for _read_name_locales(resolve=False) with sentinel and individual codes - Add endpoint test for GET /name-locales with explicitly stored __all__ - Remove unnecessary try/finally cleanup in test (function-scoped fixture) - Add Names step to user guide setup wizard description Pre-reviewed by 13 agents, 7 findings addressed. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Most users want a working template out of the box. Startup (3 agents) is the smallest practical team and the best default for getting started. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add PUT /setup/agents/{index}/name endpoint for renaming agents
- Add POST /setup/agents/{index}/randomize-name endpoint using Faker
with saved locale preferences
- Update SetupReviewOrg.vue with inline editable name fields and
randomize (dice) button per agent
- Clear predefined names from all 7 built-in templates so agents
get random Faker-generated names (template schema still supports
predefined names for custom templates)
- Fix GET /setup/name-locales sentinel expansion bug (from prior
commits, review findings addressed here)
- Add logging to _check_has_name_locales silent catch
- Extract _parse_locale_json and _validate_agent_index helpers
- Replace raw string event in locales.py with constant
- Defer startup template default until fetchTemplates resolves
- Restore try/finally cleanup in tests
- Fix docs: Japanese locale example, startup default mention,
design spec locale example
- Address 10 findings from CodeRabbit, Gemini, and local agents
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
f28611f to
ba1c5bd
Compare
🤖 I have created a release *beep* *boop* --- ## [0.4.7](v0.4.6...v0.4.7) (2026-03-22) ### Features * add system user for CLI-to-backend authentication ([#710](#710)) ([dc6bd3f](dc6bd3f)) * dev channel builds with incremental pre-releases between stable releases ([#715](#715)) ([0e8a714](0e8a714)) * replace hardcoded name pools with Faker multi-locale name generation ([#714](#714)) ([5edc6ec](5edc6ec)) ### Bug Fixes * dev-release tag creation, dependabot coverage, go -C cli convention ([#730](#730)) ([7634843](7634843)) * improve name generation step UX and fix sentinel expansion bug ([#739](#739)) ([f03fd05](f03fd05)) * settings page UX polish -- toggle bug, source badges, form improvements ([#712](#712)) ([d16a0ac](d16a0ac)) * switch dev tags to semver and use same release pipeline as stable ([#729](#729)) ([4df6b9b](4df6b9b)), closes [#713](#713) * unify CLI image discovery and standardize Go tooling ([#738](#738)) ([712a785](712a785)) * use PAT in dev-release workflow to trigger downstream pipelines ([#716](#716)) ([d767aa3](d767aa3)) ### CI/CD * bump astral-sh/setup-uv from 7.4.0 to 7.6.0 in /.github/actions/setup-python-uv in the minor-and-patch group ([#731](#731)) ([7887257](7887257)) * bump the minor-and-patch group with 3 updates ([#735](#735)) ([7cd253a](7cd253a)) * bump wrangler from 4.75.0 to 4.76.0 in /.github in the minor-and-patch group ([#732](#732)) ([a6cafc7](a6cafc7)) * clean up all dev releases and tags on stable release ([#737](#737)) ([8d90f5c](8d90f5c)) ### Maintenance * bump the minor-and-patch group across 2 directories with 2 updates ([#733](#733)) ([2b60069](2b60069)) * bump the minor-and-patch group with 3 updates ([#734](#734)) ([859bc25](859bc25)) * fix dependabot labels and add scope tags ([#736](#736)) ([677eb15](677eb15)) * remove redundant pytest.mark.timeout(30) markers ([#740](#740)) ([9ec2163](9ec2163)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
Summary
/setup/name-localeswas expanding the__all__sentinel into 57 individual locale codes viaresolve_locales(), causing the "All (worldwide)" toggle to always show as OFF on fresh instances. The endpoint now returns the raw sentinel; resolution only happens in the name-generation path.Test plan
_read_name_locales(resolve=False)with sentinel and individual codes/name-localeswith explicitly stored__all__🤖 Generated with Claude Code