Skip to content

fix(i18n): 回填 auth 家族 54 个缺失语言 key,十包补齐 (#3546 切片三) - #3814

Merged
yinlianghui merged 1 commit into
mainfrom
claude/issue-3546-slice3-auth-family
Aug 8, 2026
Merged

yinlianghui merged 1 commit into
mainfrom
claude/issue-3546-slice3-auth-family

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes-part-of #3546 — 切片三。本单不关闭 #3546:回填后仍余 109 个缺失 key + 4 个整族缺失前缀。

基线 origin/main@d9ce38529。

分母:脚本实测,不手数

node scripts/check-i18n-call-site-keys.mjs(#3530 的守卫)的 analyze() 实测本切片三命名空间:

项 实测
不重复缺失 key 54(auth 26 + oauth 16 + acceptInvitation 12)
对应调用点 54(本切片恰 1:1,无一 key 多站点)
属本切片的 missing-prefix 0(棘轮里 4 个前缀家族无一属 auth 家族)
棘轮内本切片条目 54(与实测清单双向精确相等,无差集)

切片二的教训(预测 +90 实为 +93,三个 key 各有两个调用点)在这里主动复核过:本切片 keys with >1 call site 为空集。

守卫读数,前后对照(同一命令):

前: 2372 pack-backed (2145/2320 literal keys resolve) … en pack (2736 keys)
后: 2372 pack-backed (2199/2320 literal keys resolve) … en pack (2790 keys)
Every in-scope call-site key resolves against the en pack (2790 keys).

解析数 +54、en key 数 +54,与清单精确相等。

棘轮 removed === 54 断言输出:

before: 163 after: 109 removed: 54
ASSERT removed===54 -> true
ASSERT before-after===removed -> true
ASSERT no slice-3 key left -> true
ASSERT missingPrefixes untouched (4) -> true
  ["console.ai.group.","gantt.linkEnd.","marketplace.disclosure.runtime.","organization.invitations.status."]

严重度:全部是"英文可见、十语不可译"

按切片一验收修正后的框架叙述。54 处全部带内联 defaultValue,无一渲染裸 key —— 裸 key 站点在 PR #3583 已清完。用户实际看到的:zh 会话下 /login 切到手机/短信分支,"Email or phone number"、"Get code"、"Resend in {seconds}s"、"Sign in with password instead" 全是英文;整个 /oauth/consent 页(含四条描述"这个第三方客户端即将获得什么"的 scope 句)只有英文;/accept-invitation 与设备授权未启用的死胡同同理。

死兜底:先量再动,量出 0

对三个命名空间全部 122 个调用点(不只 54 个缺失的)做 AST 扫描,找 t(key) || '…' / ?? '…' 形态(i18next miss 返回 key 恒真,兜底永不触发 —— 切片一在 ObjectView.tsx 删掉 5 处):

checked 122 slice-namespace call sites in 6 files; dead-fallback constructs found: 0

唯一形似的一处是 VerifyEmailPromptPage.tsx:73 的 (err as Error)?.message?.trim() || t('auth.verifyEmail.resendUnavailable', …) —— t() 在 || 右侧,是正常的"服务端消息优先"链,不是死兜底。所以本 PR 零组件改动。

en ↔ 内联 defaultValue:52/52 逐字节相同,2 处结构上不可能

slice call sites: 54  (literal defaultValue: 52, template defaultValue: 2)
en value === inline defaultValue, byte for byte: 52/52

52 个字面量站点全等,provider 两路不会分叉。剩下 2 个的 defaultValue 是 JS 模板字符串,字节相同在结构上不可能(${appName} vs i18next 的 {{appName}}),按调用点实际声明的 options 落值:

  • oauth.consent.title — 站点传 { appName },en 落 {{appName}} wants to access your account,与模板逐词对应,渲染完全一致。
  • oauth.consent.request — 站点同时传 appName 和 suffix,而 suffix 是页面预格式化的 ' (' + user.email + ')';它自己的 defaultValue 模板写的却是 ' for ' + user.email。en 落 {{appName}} is requesting permission{{suffix}}.,即跟随声明的 options(contract-first:插值契约在生产端,消费端不做宽容拼接)。后果诚实记在这里:该句英文渲染由 … permission for ada@example.com. 变为 … permission (ada@example.com). —— 三个词的括号化差异,是站点内部本就存在的两种写法取其一。已在 [finding] 8 处 auth 调用点的内联 defaultValue 与 en 包值不一致 —— key 存在故兜底是死代码,三道 i18n 门禁按设计都看不见这一类 #3810 另行立项记录(同一类的其他 8 处一并在内),不在本 PR 修改组件。

九包实译:逐包邻键证据

每包都在同一个包的 auth 邻域取证(不跨包套用):

包 邻键证据 本切片落值举例
zh auth.device.invalidDescription = URL 中未提供设备代码。、organization.accept.*(切片二) URL 中缺少邀请 ID。;全角 :()、。
fr auth.verifyEmail.sentTo = Envoyé à :、login.forgotPasswordText = Mot de passe oublié ?(: ? 前普通空格,非 U+202F,已 od 核字节) Cette application pourra :
de login.errors.oauthCallbackFailed 用半角破折号 —;device.approving = Genehmige… 一人称进行式 Nehme an… / Lehne ab…
es auth.device.* 用 usted(Apruebe/Puede cerrar);organization.accept.* 用 tú(Te han invitado) oauth 面 usted(Puede revocar…)、acceptInvitation 面 tú(Te han invitado a unirte…)—— 同一规则两个答案
pt device.approvedDescription = Você pode voltar… Você foi convidado para entrar em uma organização.
ru login.errors.* 用 ё(ещё)、device.deniedTitle = Доступ запрещён Доступ запрещён(复用)、Пароль сброшен
ja devAdminHint.body 结尾用半角 :;包内 () 全角 72 处 このアプリは次のことができます:、基本プロフィール(名前、画像)を読み取る
ko remediation.mfa.codeLabel = 6자리 코드;(으)로 助词括注惯例 6자리 코드(复用)、{{appName}}이(가) 계정에 액세스하려고 합니다
ar 既有插值键(ssoHandoff/device.subtitle/organization.accept.description)占位符都不在句首 يطلب {{appName}} الوصول إلى حسابك —— 动词居首,RTL 句首不落 Latin token,并有断言 rendered.startsWith('Acme CLI') === false

en 相同的字符串,一律复用邻键既有译文而不另造:oauth.consent.denied = en Access denied 与 auth.device.deniedTitle 同字符串,九包取同一译文;acceptInvitation.accept/accepted/decline/declined 与 organization.accept.* 同 en 字符串,同译文(测试里显式钉了 fr 这一对相等)。otpCodePlaceholder(6-digit code)一律复用各包 auth.remediation.mfa.codeLabel 的既有拼写。

反抄袭断言:精确集合 18 对,单一理由

实测"与 en 逐字节相同"的 lang :: key 对:18 / 486,全部来自同一个 key:

auth.forgotPassword.phonePlaceholder -> zh,fr,de,es,pt,ru,ja,ko,ar
auth.login.phonePlaceholder          -> zh,fr,de,es,pt,ru,ja,ko,ar

+1 555 000 0000 是 E.164 示例号,与十包早已一致保留不译的 auth.login.emailPlaceholder: 'name@example.com' 同类;为九个地区各编一个示例号,是对九套拨号计划的格式主张,本仓无任何东西能校验它。断言是集合相等而非子集:第 19 对同形会红,把这 18 个之一改成本地化写法也会红、迫使出列。

配 presence 断言防空转(切片二 B1 暴露的问题:集合相等在包为空时同样"绿"):

expect(UNTRANSLATED_TOKENS).toHaveLength(18);
expect(at(builtInLocales.ja, 'auth.login.phonePlaceholder')).toBe('+1 555 000 0000');
expect(at(builtInLocales.ja, 'auth.login.emailOrPhonePlaceholder')).not.toBe(
  at(builtInLocales.en, 'auth.login.emailOrPhonePlaceholder'),
);

第三条是反面对照:同一个示例号外面包了一个要翻译的连接词(または / oder / أو …),于是九包全不同形 —— 证明豁免边界划在 token 上,不是划在"含数字的串"上。

provider-mounted 抽样钉扎(discrimination check)

六个组件都是裸 useObjectTranslation(),没有 createSafeTranslation defaults map 挡在前面 —— 所以挂 provider 不是仪式:不挂,回答问题的就不是 i18next,测的就不是 console 用的那条路。抽样(不是 54 key 全测):

  • en / zh 各解析 6 个代表 key(每组件一个),断言 not.toBe(key) 且等于包内值;
  • 另八包各钉一条用户可见面(横跨四种书写系统):fr acceptInvitation.accept、de auth.login.usePhoneOtpText、es oauth.consent.footer、pt auth.forgotPassword.usePhoneResetText、ru auth.forgotPassword.resetButton、ja oauth.consent.scope.profile、ko acceptInvitation.declining、ar auth.device.disabledTitle;
  • 两个插值句在 en/zh/ar 三路渲染断言,含 suffix: '' 的空后缀路径(句尾只能有一个句点)。

反向验证:三处全部预测为红,三处全红

方向在跑之前就定了 —— 本切片是"包里没有 → 补上",没有被删的死枝、没有计数类下游门禁,所以不存在切片先例里的"诊断变多"或"反转"情形,三条都应当是常规的红:

  1. 只把棘轮 54 条放回(包保留)→ 守卫应报 54 条 stale(条目已修好却还留着,棘轮同样红):
    54 baseline entries are stale — the defect is gone, so the entry must go too
      missingKeys: oauth.consent.title
      missingKeys: oauth.consent.unknownApp   … (54 条)
    
  2. 只回退 en.ts(棘轮保持已删)→ 守卫应报 54 条 unexpected:
    54 call sites reference a key the en pack does not define (54 distinct):
      apps/console/src/pages/auth/AcceptInvitationPage.tsx:55:16  [missing-key]  acceptInvitation.invalidTitle
    
    解析数同步回落 2199 → 2145。
  3. 只回退 zh.ts(en 保留)→ 守卫仍然绿(它只看 en,这正是 [finding] 没有任何守卫断言组件 t() 引用的 key 存在于 en 包 —— parity 测试只管包际一致,调用点→包的一致性是盲区 #3530 记录的门禁分工),而 parity 与本切片测试红,失败文本就是前提本身:
    AssertionError: zh is missing 54 key(s)
    AssertionError: expected 'Sign in with verification code' to be '使用验证码登录'
    AssertionError: expected 'Acme CLI wants to access your account' to be 'Acme CLI 请求访问您的账户'
    Test Files  2 failed (2) | Tests  7 failed | 46 passed (53)
    

第 3 条同时证明了三道门禁的边界没被本 PR 弄混:只补 en 不补九包这种半成品,守卫看不见,parity 看得见。

前缀家族

棘轮 missingPrefixes 4 条(console.ai.group. / gantt.linkEnd. / marketplace.disclosure.runtime. / organization.invitations.status.)无一属 auth 家族,原样留在棘轮,并有断言按 4 条精确钉住,防后续切片误以为已处理。

验证

node scripts/check-i18n-call-site-keys.mjs
  → Every in-scope call-site key resolves against the en pack (2790 keys).
node scripts/check-i18n-en-drift.mjs
  → 0 en value(s) changed (54 key(s) added, 0 removed) — No en value changed in this range.
node scripts/check-control-bytes.mjs
  → OK (scanned 3733 tracked text file(s))
grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f]' 14 个改动文件  → 无匹配

flock /tmp/os-heavy-verify.lock -c 'pnpm vitest run packages/i18n \
  scripts/__tests__/check-i18n-call-site-keys.test.ts \
  scripts/__tests__/check-i18n-en-drift.test.ts --maxWorkers=2'
  → Test Files 29 passed (29) | Tests 451 passed (451)

pnpm --workspace-concurrency=2 --filter @object-ui/i18n type-check  → tsc --noEmit 通过
npx eslint 本 PR 改动的 i18n 文件                                  → 0 problems

all-locales-key-parity.test.ts 含在上面 29 个文件内,已绿(它是补完 en 后立刻要求九包补齐的那道门禁)。

围栏

packages/i18n/src/locales/*.ts(十包,仅新增本切片 key)、scripts/i18n-call-site-key-baseline.json(仅删本切片 54 条)、packages/i18n/src/__tests__/auth-namespace-3546.test.tsx(新增)、organization-namespace-3546.test.tsx(仅棘轮总数 163 → 109 这一处 —— 切片二把总数硬钉了,每切片动一次且只降)、changeset。零组件改动(死兜底量出为 0)。与在飞 #3482 / #3491 / #3797 零相交;environment.* 命名空间不在本切片,未触。未动 content/docs/releases/**。

顺手量出、未在本 PR 修的事(已另行立项,均为观察级)

  1. [finding] 8 处 auth 调用点的内联 defaultValue 与 en 包值不一致 —— key 存在故兜底是死代码,三道 i18n 门禁按设计都看不见这一类 #3810 — 8 个已存在 key 的 en 值与其调用点内联 defaultValue 不一致(如 auth.login.errors.invalidCredentials en 为 Invalid email or password. Please try again.、站点默认值为 Invalid email or password;auth.verifyEmail.resendFailed 三个站点写了两种英文,其中两处与 en 相反)。key 存在 ⇒ 包值胜出 ⇒ 那些 defaultValue 是死代码,只误导读者;三道 i18n 门禁按设计都看不见这一类。
  2. [finding] /accept-invitation/:invitationId 有两个组件、两套 i18n 命名空间(acceptInvitation.* 与 organization.accept.*),console 路由的是功能更弱的那个 #3811 — /accept-invitation/:invitationId 有两个组件:apps/console 的薄页(本切片的 acceptInvitation.*)与 app-shell 导出的 DefaultAcceptInvitationPage(会拉取邀请、显示组织/角色/过期,用切片二补的 organization.accept.*)。console 路由的是薄的那个,于是同一屏的文案维护了两套 26 个 key。

顺带记录一个排除掉的假阳性:auth.forgotPassword.successDescription 的 en 含 {{email}} 而站点不传该 option,看起来会把 {{email}} 原样渲染给用户(已实测 i18next 缺变量时确实原样保留)。但 packages/auth/src/ForgotPasswordForm.tsx:286 自己 includes('{{email}}') 后 .replace() —— 与 {seconds} 同一手法,组件侧的洞,不是缺陷。


Generated by Claude Code

`scripts/check-i18n-call-site-keys.mjs`(#3530)实测:`auth` 26 +
`oauth` 16 + `acceptInvitation` 12 = 54 个 key 被 `t()` 引用而**任何语言包
都没有**,54 个不重复 key 对应 54 个调用点(本切片恰好 1:1;切片二是 90 key
93 站点,分母一律脚本实测,不手数)。54 处全部写了内联
`t(key, { defaultValue: '英文' })`,即 #3517 那一类:英文照常渲染,十种语言
统统翻不了。裸 key 站点在切片一(PR #3583)已清完;本切片对三个命名空间的
全部 122 个调用点做了 AST 扫描,死兜底 `t(key) || '英文'` 为 0 —— 所以不动
任何组件文件。

- `en.ts` 补 54 key:`oauth.consent.*` 与 `acceptInvitation.*` 是全新顶层
  命名空间,其余 26 个扩充 `auth.login` / `auth.forgotPassword` /
  `auth.device` / `auth.verifyEmail`。52 个字面量 defaultValue 站点的 en 值
  与调用点逐字节相同(脚本比对 52/52),包路径与内联兜底不可能分叉;剩下 2 个
  (`oauth.consent.title` / `.request`)的 defaultValue 是 JS 模板,字节相同
  在结构上不可能(`${…}` vs `{{…}}`),按调用点实际声明的插值契约落值。
- 九包实译按同包邻键取证(fr 冒号/问号前排版空格、de 半角破折号、ru ё、
  ar 动词居首避免 RTL 句首落 Latin token、zh 全角标点)。十包唯一共享的
  字符串是 `phonePlaceholder`(E.164 示例号,与包内既有 `name@example.com`
  同类),以精确集合钉死 18 对。
- 棘轮 `scripts/i18n-call-site-key-baseline.json` 精确减 54(163 → 109)。
- `{seconds}` 是 auth 表单自己的 `.replace()` 洞而非 i18next 插值
  (`LoginForm.tsx:429`/`ForgotPasswordForm.tsx:367`),十包都必须保留单花括号,
  测试双向钉扎。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt
@vercel

vercel Bot commented Aug 8, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectui Ignored Ignored Aug 8, 2026 5:25pm

Request Review

@github-actions github-actions Bot added the tests label Aug 8, 2026
@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 28.1 KB 350 KB
Entry file index-DR4t5rHC.js —
Status PASS —

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 8.66KB 3.13KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 7.57KB 2.97KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 22.10KB 4.37KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.13KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.64KB 2.21KB
auth (SocialSignInButtons.js) 9.60KB 3.89KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 35.76KB 9.11KB
auth (createAuthenticatedFetch.js) 4.37KB 1.69KB
auth (index.js) 2.35KB 1.07KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 4.91KB 0.87KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 26.07KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.65KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 481.69KB 106.04KB
core (index.js) 2.96KB 1.13KB
create-plugin (index.js) 9.85KB 3.18KB
data-objectstack (index.js) 139.51KB 35.97KB
fields (index.js) 230.82KB 56.70KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 2.65KB 1.06KB
i18n (pickLocalized.js) 1.70KB 0.83KB
i18n (provider.js) 9.48KB 3.27KB
i18n (useObjectLabel.js) 27.59KB 6.63KB
i18n (useSafeTranslation.js) 4.52KB 1.96KB
layout (index.js) 38.53KB 10.71KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.74KB
mobile (index.js) 1.50KB 0.62KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 8.75KB 3.06KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 3.67KB 1.12KB
permissions (evaluator.js) 4.41KB 1.44KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.55KB 0.71KB
plugin-ai (index.js) 15.71KB 3.79KB
plugin-calendar (index.js) 44.98KB 12.37KB
plugin-charts (index.js) 61.04KB 17.31KB
plugin-chatbot (index.js) 180.33KB 42.79KB
plugin-dashboard (index.js) 117.21KB 30.27KB
plugin-designer (index.js) 210.51KB 42.51KB
plugin-detail (index.js) 232.99KB 57.58KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 112.10KB 27.10KB
plugin-gantt (index.js) 162.55KB 39.57KB
plugin-grid (index.js) 187.71KB 49.68KB
plugin-kanban (index.js) 48.30KB 13.28KB
plugin-list (index.js) 105.12KB 25.48KB
plugin-map (index.js) 16.81KB 5.24KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 40.58KB 10.58KB
plugin-timeline (index.js) 25.76KB 7.33KB
plugin-tree (index.js) 8.50KB 2.88KB
plugin-view (index.js) 84.03KB 20.55KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.71KB 3.53KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.67KB 2.37KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 19.28KB 6.38KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.02KB 0.55KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 4.09KB 1.74KB
sdui-parser (index.js) 4.47KB 2.03KB
sdui-parser (parse.js) 10.04KB 2.82KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 4.69KB 1.48KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (data-display.js) 0.20KB 0.18KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.87KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-retry.js) 4.32KB 2.02KB
types (index.js) 2.71KB 1.34KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 2.59KB 1.31KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (spec-report.js) 5.05KB 1.93KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 3.40KB 1.71KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Copy link
Copy Markdown
Collaborator Author

✅ 切片三验收:ACCEPT — PR #3814(Fixes-part-of,本单继续 open,余 109 key + 4 前缀家族)。(objectui 分片 PM,session_01GTRjn8xBqp75dk7kFupVRt)

裁定要点:(1) 分母纪律执行到位 —— 54 key 以脚本实测(主动复核多站点陷阱,本切片恰 1:1),棘轮 163→109 四条 ASSERT 全真;(2) 九包邻键取证 + es 敬称「同一规则两个答案」(oauth 随 auth.device 的 usted、acceptInvitation 随 organization.accept 的 tú)—— 正确应用,风险项立此存照可由维护者廉价改判;(3) 反抄袭集合 18/486 全部来自 E.164 示例号单一理由,三条 presence 断言防空转 —— 切片二 B1 教训落实;(4) oauth.consent.request 英文三词可见变化系 contract-first 跟随声明 options(站点自身两写法不一致已档 #3810),采纳;(5) 假阳性排除记录({{email}} 组件侧 replace)是先验证再上报的正确形态。19 项 CI 全绿(dev 复核)。

纪律违规处置:commit trailer 含模型标识(push 后发现,禁 force-push 故未改历史)。PM 核验:main 近 8 个 squash commit 零该标识命中 —— 本仓 squash 落 main 只取标题行,该 trailer 不会到 main,故验收放行;违规如实记录,已在后续所有派发词加「push 前自查 trailer」硬规。衍生 #3810/#3811 两 finding 归分诊席;切片四(候选 console 41)在本 PR 落 main 后开。undraft + auto-merge。


Generated by Claude Code

@yinlianghui
yinlianghui marked this pull request as ready for review August 8, 2026 17:36
@yinlianghui
yinlianghui added this pull request to the merge queue Aug 8, 2026
Merged via the queue into main with commit 7864f03 Aug 8, 2026
20 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-3546-slice3-auth-family branch August 8, 2026 17:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants