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
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Activity
yinlianghui commentedon Aug 7, 2026
认领(发现分诊轮晋级)— 会话
session_01GTRjn8xBqp75dk7kFupVRt,分支claude/issue-3530-callsite-key-guard。分诊裁定:晋级实现"调用点→en 包"守卫,先量再定形:dev 先测静态扫描(grep
t('...')字面量类)在当前 main 上的真实命中面与误报量,再选实现载体(scripts/ 检查 vs 包内测试)。PM 定的验收下限:当前 main 零假红;I18N_PROBE_FLAG探针正确排除;动态拼 key 的调用点有显式处理策略(报告-允许清单或跳过,写明理由);逆向验证 = 临时引用一个无包 key,守卫必红。#3517(十包缺 key 数月无门禁看见)是本守卫要挡的实例类。文件面:守卫脚本/测试本体 + 其配置,必要时
ci.yml一个 step;⛔ 不改任何语言包与组件(若量出真实缺 key,报告立单,不顺手修)。越界即停。Generated by Claude Code
yinlianghui commentedon Aug 7, 2026
完成 — PR #3547(draft),会话
session_01GTRjn8xBqp75dk7kFupVRt,分支claude/issue-3530-callsite-key-guard。先量再定形 —— 量出来的数(
main@a2c8f2a29)packages/**+apps/**,排除测试/dist/.d.ts)t()/tt()调用点en一条都不匹配(整族缺失)I18N_PROBE_FLAG探针(结构性排除)metadata-admin/i18n.ts,声明式排除)x.t()方法调用(接收者类型不可知)裸 grep 会命中 3485 处、误判约三分之一 ——
t不是一个函数。所以分类单位是绑定不是拼写。存量已立单:#3546
258 个 key 全部在报告里,按命名空间给了拆单轴(
organization90 /console43 /auth+oauth+acceptInvitation54 /marketplace19 /preview18 / 其余零散)。其中 8 处连内联defaultValue都没有,用户直接看到 raw key —— 已核实两个现场:ObjectView.tsx的toast.error(t(key) || '…')(i18next 缺 key 返回 key 本身,是真值,||永远不触发),GanttView.tsx刷新按钮的aria-label就是gantt.toolbar.refresh这行字。本 PR 不改任何语言包与组件(文件面约束)。载体:
scripts/check-i18n-call-site-keys.mjs理由:仓内五个全仓静态门禁都在
scripts/(各配scripts/__tests__/行为测试);它扫所有包,放进packages/i18n会让 i18n 的测试因别的包的改动而红;纯读源码 AST,不需要构建产物、不读dist/,node scripts/…约 13s 本地可跑。已接进ci.yml的type-checkjob(install 之后 —— 它 importtypescript),pnpm check:i18n-keys。CI 实测该 job 已绿。三条验收对应
scripts/i18n-call-site-key-baseline.json,258 key + 4 前缀,每条带 258 个 t() 调用点引用的 key 在任何语言包里都不存在(#3530 守卫首跑实测),其中 8 处直接把 raw key 渲染给用户 #3546)。它是棘轮不是允许清单:未声明的 key 报红,已修好却还留着的条目也报红,只能变小。[I18N_PROBE_FLAG]这个标记判,不按路径。missing-prefix把其中能静态判定的那部分捞回来(多找到 4 个整族缺失)。逆向验证(先写预测再跑)
en.ts/parity 的 hintforwardedScope排除engine.*误报回归第四条是反直觉方向,如实记录:今天两处真实探针用的都是模板 key(
`${ns}.${suffix}`),静态前缀为空 —— 既没有字面量可缺、也触发不了missing-prefix,所以删掉排除只是把它们挪进动态计数器,不会红。排除对下一个写字面量 key 探针的人才承重,该形状由测试里的合成 fixture 钉住(带 flag 跳过 / 去掉 flag 立刻红)。useSafeTranslation族:在范围内createSafeTranslation(defaults, testKey)的 defaults map 只在没有 provider 时生效;console 里 provider 挂着,交出的是 i18next 的t,缺 key 直接返回 key 本身。所以这一族的t()调用点判定,理由写在守卫头注释里。(defaults map 的 map 字面量本身不扫 —— 那是另一条,gantt.toolbar.refresh就是「map 里有、包里没有」的活标本,已并进 #3546。)无 changeset(门禁基础设施)。
Generated by Claude Code
yinlianghui commentedon Aug 7, 2026
验收:ACCEPT — PR #3547。
核过实物(git 三点差恰 5 文件,+1464,全在围栏内:守卫脚本、棘轮基线、行为测试、package.json 一条 script、ci.yml 一步)。裁定要点:
toast.error(t(key) || '…')恒真陷阱与 1 处读屏 aria-label)已按命名空间给出五路可并行的拆分建议,PM 零誊写成本。按维护者暂停纪律冻结,解除后为头号派发项。CI:Type Check(含新 gate)已绿,shard 报告时在跑 —— auto-merge 由队列把关。PR 转 ready + auto-merge(配额恢复后执行,undraft 队列第 5 位)。
Generated by Claude Code
feat(ci): assert every t() call-site key exists in the en locale pack (…
docs(ci): type-check 作业行补两道 i18n 门禁,并把该表的钉粒度降到步骤级 (objectstack-ai#3653)…
fix(i18n): 回填 auth 家族 54 个缺失语言 key,十包补齐 (objectstack-ai#3546 切片三) (ob…
fix(i18n): 回填 console 命名空间 41 个缺失语言 key + console.ai.group. 前缀家族,十包补齐 (…
fix(i18n): 回填 marketplace + preview 两命名空间 37 个缺失语言 key 及 marketplace.…
fix(i18n): fail on an inline defaultValue that contradicts its en val…