Repository navigation
nav_sso_providers has no label in any of the four locales, and it is the one Setup nav entry the new runtime-merged gate structurally cannot see #6659
Description
Activity
Triage:
pm:queue+domain:metadata.- Landing anchor (read on
origin/main@04476e7): the minimal fix (option 1) adds four labels inpackages/platform-objects/src/apps/translations/{en,zh-CN,ja-JP,es-ES}.ts. Re-verified:nav_sso_providershas 0 hits across the four locale files while the declaring contribution exists atpackages/plugins/plugin-auth/src/auth-plugin.ts:552; control probenav_positionshits inen.ts.platform-objects⇒domain:metadata(anchoring rule — fix lands in the translations, not the gate). - Option 2 (teaching
check:app-nav-i18nto enumerate conditional contributions) changes what plugins are expected to declare — that is a separate maintainer-facing card if pursued; it is deliberately NOT folded into this queue entry. - Dedup: sibling of Setup 应用 4 条运行时贡献的导航在 zh 下仍是英文,而被两处注释同时指定的 coverage ratchet 报绿 —— 能力插件贡献的 nav 不在任何一次走查里 #5750 (four visible ids, in flight) and Four
apps.setup.navigationtranslation keys have no declaring nav item anywhere in the repo — dead weight that reads as coverage #6660 (dead keys, reverse direction); three distinct surfaces, no convergence needed. - Not
target:v17: cosmetic i18n gap behind an SSO gate — improvement class.
本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
- Landing anchor (read on
附注(来自 #6660 / PR #6767,不是新问题,故不另开 issue):#6767 已删除那四个 dead
apps.setup.navigation键,因此packages/cli/scripts/check-app-nav-i18n.mjs头部注释末尾这句话现在过期了:The dead
apps.setup.navigationkeys that exist today are tracked separately rather than removed on a verdict this gate cannot honestly reach.该句的主张依然成立(这个门禁不做反向断言,因为一次 composition 无法区分 dead key 与被条件门控的 key),过期的只是"今天仍存在 dead keys"这半句 —— 那四个已经不在了。#6660 的 file surface 明确不含这个文件,所以 #6767 没有动它。这段落归本 issue 这条线所有:无论最终选 option 1 还是 option 2,改写这段注释时顺手把这半句一起更新即可。
删除后
pnpm check:app-nav-i18n在 PR #6767 上实测仍为OK (10 contributor(s), 53 merged setup nav id(s), 4 locale(s), every id labelled in every locale)—— 正向方向不受影响,nav_sso_providers依然是本 issue 描述的那个门禁看不见的条目。
Generated by Claude Code
Claim: PM loop round 3 (
domain:metadataseat, sticker #6367)
Session:session_01W6bLax4KMrSfnE1ydFU8Dw
Branch:claude/issue-6659-sso-providers-labels
Worktree:objectstack-issue-6659
Domain:domain:metadata
File surface:packages/platform-objects/src/apps/translations/{en,zh-CN,ja-JP,es-ES}.ts(add thenav_sso_providerslabel, option 1 per triage) + a parity pin if cheap + one comment-line update inpackages/cli/scripts/check-app-nav-i18n.mjs(the half-stale header sentence this thread owns per the 2026-08-08 15:05Z note — comment-only, declared here for the cli seat's visibility; veto on the PR if unwanted) + one.changeset/*.md
Serial constraints cleared: predecessor #6660 / PR #6767 MERGEDd42a92fc6(same four locale files — landed, not in flight); #5750 / PR #6661 landed earlier. Option 2 (union-aware gate) stays un-coupled — a separate maintainer-facing card if pursued, per triage.
Generated by Claude Code
Review verdict: ACCEPT — PM
domain:metadataseat, sessionsession_01W6bLax4KMrSfnE1ydFU8Dw.PR #6787, option 1 as ruled: the four labels are sourced from each locale's existing
sys_sso_provider.pluralLabel(consistency over invention), placed to match the contribution's priority. The tombstone file now carries both halves of one ledger — dead ids that must stay gone (#6660) and conditionally-contributed ids whose labels must stay (#6659) — each with a vacuity control. The declared comment-only edit tocheck-app-nav-i18n.mjs's header landed (stale half-sentence corrected, still-true claim kept verbatim). Reverse verification's second half is the issue's own thesis turned into a measurement: with the labels removed,check:app-nav-i18nstays green byte-identical — direct proof the boot gate structurally cannot see a gated contribution, which is why the pin exists. Option 2 was not built.Process note (second occurrence today, same trap as #6660's dev):
git checkout <branch> -- <files>before the branch's first commit silently reverts to origin/main. Both devs caught it by measurement; flagged for the term retrospective as a worktree-protocol footgun worth a line in the os-dev definition.Next: CI convergence (including Check Changeset), then ready + merge queue.
Generated by Claude Code
Landing confirmed — PR #6787 merged as
e78760861.nav_sso_providersis labelled in all four locales (sourced from each locale'ssys_sso_provider.pluralLabel), the conditional-id pin holds the line the boot gate cannot, and the gate's header sentence is truthful again. Option 2 (union-aware gate) remains an un-filed maintainer-facing fork. —domain:metadataPM, sessionsession_01W6bLax4KMrSfnE1ydFU8Dw
Generated by Claude Code
Found while implementing #5750 (PR closing that card adds
pnpm check:app-nav-i18n, a gate that boots the real composition and asserts every merged Setup nav id carries a label in every locale).The gap
@objectstack/plugin-authcontributes anav_sso_providersentry into the Setup app'sgroup_access_control:No locale file carries a label for it. Measured on
origin/main487a197b5:Control probe on the same four files with an id that IS translated (
nav_positions) returns 1 each, so the zeros are real and not a bad path.Consequence is the same one #5750 reported for four other ids: a deployment with an external IdP wired shows
SSO Providersin English in an otherwise translated Setup menu. It is narrower than #5750's four only because it is gated.Why the new gate does not catch it
The contribution is conditional —
auth-plugin.tsspreadsnavigationContributionsin only whenthis.authManager.isSsoWired()is true (self-hostOS_SSO_ENABLED, or the cloud per-environmentplanAllowsSsoarriving viaplugins.sso).check:app-nav-i18njudges ONE composition, and a contribution that is gated off in that composition is not merged, so it is not judged. The gate's header states this bound explicitly rather than implying full coverage.So this is not a bug in that gate — it is the honest edge of what one runtime composition can answer, and this issue is the concrete instance sitting just past it.
Two ways to close it
check:app-nav-i18nto enumerate conditional contributions too — e.g. boot a second composition with the gating conditions forced on, or have contributors declare their conditional nav statically so a gate can read the union rather than one realisation. This is the general fix and is what would make "every declared Setup nav id is translated" a claim CI can actually stand behind.Option 2 changes what plugins are expected to declare, so it is a maintainer call rather than something to pick in passing. Filed unassigned for triage.
Related: #5750 (the four labels that were visible), and the sibling finding on dead
apps.setup.navigationkeys.