feat(design-system): DS-3 最小语义 Token 影子层 - #3798
Conversation
在 packages/design-tokens 建立 reference → semantic 两层 DTCG 影子字典。 数据源仅为 DS-2b 冻结快照,零运行时接线;产品代码不改。 Signed-off-by: kirozeng <kirozeng@gmail.com>
group g1 tip 793c462b68839fc857844d55b4e9d37031153c6b Signed-off-by: kirozeng <kirozeng@gmail.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
Phase 2c 外推(不进本 PR)三审 delta 复核后按意见三分法外推,不阻塞本张:
本张 MUST-FIX 已落地:动态 import / side-effect / import-equals 探测 + 自证伪测试; |
|
| Filename | Overview |
|---|---|
| packages/design-tokens/src/classify.ts | 基于实际 light/dark 值形态完成四类互斥分类,并对五个加严保护 Token 强制只登记、不建模。 |
| packages/design-tokens/src/build-layers.ts | 从冻结快照为首批语义角色生成按值去重的 reference Token 和 light/dark semantic alias。 |
| packages/design-tokens/src/guards.ts | 提供分类完备性、保护值隔离、DTCG 结构、alias 方向、逐值一致和零运行时接线检查。 |
| packages/design-tokens/src/semantic-roles.ts | 登记首批 surface、border、text、accent 与 status 角色,并排除已声明的保护值。 |
| packages/design-tokens/src/classification.json | 生成并登记冻结快照全部 514 个 ID 的分类、目标层级和建模状态。 |
| packages/design-tokens/src/reference/color.json | 保存首批 semantic 角色实际使用且按原始值去重的 reference Token。 |
| packages/design-tokens/src/semantic/color.json | 保存首批语义角色的双模式 reference alias,不直接重复颜色字面量。 |
| packages/design-tokens/src/tests/value-consistency.test.ts | 校验每个语义角色解析后的 light/dark 值与 DS-2b 冻结快照一致,并包含可触发失败的反证测试。 |
| packages/design-tokens/src/tests/zero-wiring.test.ts | 验证产品运行时当前不能通过依赖、包导入、动态加载或源码相对路径消费影子包。 |
| scripts/test-workspaces.config.mjs | 将新包登记为必需 unit workspace,使仓库测试编排能够发现其测试。 |
Flowchart
%%{init: {'theme': 'neutral'}}%%
flowchart LR
S[DS-2b 冻结快照] --> C[四类分类登记]
S --> B[影子层生成器]
B --> R[reference color tokens]
R --> M[semantic roles]
C --> G[分类与确定性守卫]
R --> V[结构与逐值守卫]
M --> V
Z[零接线守卫] -. 禁止当前消费 .-> D[Desktop / Mobile / 其他运行时包]
M -. DS-8 才接线 .-> D
Reviews (1): Last reviewed commit: "fix-run ds3-r1b wave1 squash" | Re-trigger Greptile
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9d5d2b5694
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@kirozeng 👋 这个 PR 还有 1 条 review conversation 没 resolve(packages/design-tokens/src/build-layers.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。 如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。 |
review 指出 12 个 HSL triplet reference 节点是自造的 $type: "other"——
它不是标准 DTCG token 类型,且校验器此前显式放行,测试全绿也发现不了。
对治理合同锁定的 Terrazzo 2.7.1 实测:other 类型 token 被 CSS 插件静默
丢弃(不产出任何 CSS 变量),alias 到它同样无输出;裸 triplet 字符串在
$type: color 下被解析成黑色。DS-8 接线时影子层无法直接承担生成切换。
- dtcg.ts 新增 toDtcgColorObject / dtcgColorObjectToString:HSL triplet →
{colorSpace:"hsl",components:[h,s,l]};hex/rgba/transparent → srgb 分量
(0-1) + 可选 alpha。$type 收紧为仅 color。
- build-layers.ts 删除 dtcgTypeFor 启发式,reference/semantic 全部节点
生成标准颜色对象;重生成两层 JSON(12 个 other reference + 14 个
other semantic alias 全部消除)。
- guards.ts:$type 校验不再放行 other;reference 只许颜色对象字面量,
semantic 只许 alias;逐值一致守卫改在颜色对象层比较(hex 大小写不构成
色值差异)。
- .gitattributes 给 packages/design-tokens/src/**/*.json 钉 eol=lf(drizzle
migration .sql 同款先例):Windows autocrlf 检出把生成物转 CRLF 导致
「磁盘 = 内存生成」字节一致守卫假红(本轮 CI Windows unit tests 红),
并补 git check-attr 回归测试钉住该契约。
- value-consistency.test.ts 补往返还原与 other 拒收的回归测试。
验证:pnpm --filter @cindy/design-tokens typecheck / vitest 19 测试全绿;
pnpm test:unit:related 全量绿;生成器两次运行字节一致;最终生成物过
Terrazzo 2.7.1 tz build 零 lint 错误,136 token 全部产出 CSS 变量。
Signed-off-by: Kirozeng <kirozeng@gmail.com>
|
本轮跟进已推上(commit 1. HSL 色值不再用 意见核实: 修法(不用自造类型,也不用扩展格式,直接上标准表示):
端到端证据:把修复后的真实生成物直接喂给 Terrazzo 2.7.1 2. Windows unit tests 红灯(CRLF 假红) 根因:Windows runner 的 修法: 逐值一致没有放松:守卫改在标准颜色对象层比较(快照字符串和影子层对象两侧都归一到 DTCG 颜色对象再比,hex 大小写不构成色值差异),45 个 semantic 角色逐个核对仍与 DS-2b 冻结快照一致; 验证: dispatch:08d67dd3346c36c7 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 77db609e28
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Codex 新一轮 review 两条 P1 的跟进: ① 相对路径接线漏检(成立):兄弟 workspace(packages/foo/src/a.ts)写 `../../design-tokens/src/…` 时说明符不含 packages/ 段,旧正则 `packages\/design-tokens\/(?:src|dist|build)\//` 漏检,零运行时接线守卫 会放行真实消费者。修法:新增 relativeSpecifierHitsDesignTokens——提取 from/import()/require()/import.meta.resolve() 语境下的相对说明符,按被 扫描文件的 repo 相对位置 resolve,落进 packages/design-tokens/ 即命中; 任意 ../ 深度、兄弟包与 apps 侧路径全覆盖。findRuntimeImportsOfDesignTokens 双通道检测,并补正反两组自证伪用例(全仓扫描零误报保持)。 ② HSL 百分比分量应为 0–1(不成立):DTCG Color 模块 Color Space 表原文 是 hsl hue [0,360) / saturation / lightness [0,100]——s/l 用 0–100 不是 0–1,规范自己的白色示例就是 components: ["none", 0, 100]。Terrazzo 2.7.1 实测:[60, 12.5, 97] 产出 hsl(60 12.5% 97%)(正确),0–1 写法产出 hsl(60 0.125% 0.97%)(几乎全黑)。生成物不改。采纳意见的合理内核: 校验器现在按色彩空间检查分量合法范围(srgb 通道 [0,1]、hsl hue [0,360) 360 非法、s/l [0,100]、alpha [0,1]),把正确范围锁进守卫防止反向犯错, 并补越界反证用例。 验证:pnpm --filter @cindy/design-tokens typecheck 通过;22 个单测全绿 (新增 3 个);生成物未变(本轮零改动 rebase 在 77db609 之上)。 Signed-off-by: Kirozeng <kirozeng@gmail.com>
|
本轮跟进已推上(commit 1. HSL 百分比分量应为 0–1(dtcg.ts)——核实后不成立,分量值不改 查了 W3C DTCG Color 模块规范原文:Color Space 表写的是 HSL 的 Saturation / Lightness 范围 [0-100](hue 是 [0-360)),规范自己的白色示例就是 Terrazzo 2.7.1 实测对照: 意见里「校验器应检查各色彩空间合法范围」这半句是对的,已采纳: 2. 兄弟 workspace 相对路径接线漏检(guards.ts)——成立,已修 实测复现: 3. 旧 P2 thread(build-layers.ts 的
验证: dispatch:03e2a78a89595bc5 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a1c4b8cc9f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Codex review P2(3913379862)跟进:兄弟 workspace 写
`import '../../design-tokens/src/generate.ts'`(副作用导入,无 from 子句
无括号)时,SPECIFIER_CONTEXT_RE 四种语境都命不中,相对路径解析通道
漏检,零接线守卫会放行。
- 补 `import '…'` 分支:用 `(?=['"])` 前瞻定位引号(分支自身不吞引号,
引号由共享后继统一消费,`\s*` 覆盖换行形态),实测单行 / 换行 / 双引号
形态全部命中。
- 顺带修既有误报:import() / require() 分支此前无 `(?<![\w$.])` 守卫,
`foo.import('…')` / `foo.require('…')` 成员调用会被当 import 语句命中
(上一轮就存在,本轮一起收口);副作用 import 分支同款守卫。
- 反证用例:副作用 import 两种形态命中;foo.import / foo.require 成员
调用不误报;全仓扫描仍零命中。
验证:pnpm --filter @cindy/design-tokens typecheck 通过;22 单测全绿
(zero-wiring 新增 4 个断言形态)。
Signed-off-by: Kirozeng <kirozeng@gmail.com>
|
本轮跟进已推上(commit P2:副作用 import 相对路径漏检(guards.ts)——成立,已修 实测确认: 修法:提取器补 至此零接线守卫的相对路径通道覆盖:from / import() / require() / import.meta.resolve() / 副作用 import 五种语境 × 任意 验证:typecheck 通过;22 个单测全绿(zero-wiring 新增 4 个断言形态);生成物零变化。Windows unit tests 的「缺席」仍是扫描时上一轮 CI 未跑完—— dispatch:39d232bc1b552d98 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: fe371617ea
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Codex review P1(3913459489)跟进:守卫把源码全文直接喂正则,注释或错误 消息里出现完整 import 语句(如 `// import '@cindy/design-tokens';`)会被 当真实接线,required unit workspace 假红,无运行时接线的改动被 CI 阻断。 实测确认属实(此前『非导入语境不误报』用例能过只是因为缺完整 import 语法)。 - 新增 stripCommentsAndDataStrings:轻量状态机剥除行注释 / 块注释(替换 为等长空白,行列结构不变);字符串字面量按语境二分——开引号前以 from/import(/require(/import.meta.resolve(/import 语境结尾的是模块 说明符,保留原文;否则是数据字符串,内容替换为空白(引号保留)。 语境判定只看输出末尾 64 字符,避免全文件正则回溯。 - containsRuntimeImportOfDesignTokens / relativeSpecifierHitsDesignTokens 改两段式:先跑廉价正则,零命中(绝大多数文件)不付剥除成本;命中后 剥除复核,命中若来自注释/文案则判非真实接线。全仓扫描 3.8s,超时余量 提到 60s(Windows 慢盘)。 - 正则字面量不识别:只在『漏放』方向偏差(正则内容被清空不命中),真实 import 语句不会写在正则里,可接受——如实注释声明。 - 反证用例:注释(单行/块/JSDoc)/ 数据字符串 / 报错文案里的完整 import 语句全部不误报(两个通道都验);剥除后真实 import 全形态(含前面有 注释或数据字符串的)仍然命中;stripper 语义四组直接断言。 验证:pnpm --filter @cindy/design-tokens typecheck 通过;25 单测全绿 (zero-wiring 新增 3 个用例 17 个断言形态);全仓扫描仍零命中。 Signed-off-by: Kirozeng <kirozeng@gmail.com>
|
本轮跟进已推上(commit P1:注释/字符串里的伪导入会误报(guards.ts)——成立,已修 实测确认: 修法:新增 性能用了两段式:先跑廉价正则,零命中的文件(绝大多数)完全不付剥除成本;全仓扫描 3.8s(此前约 1.2s),对应测试超时提到 60s 留 Windows 慢盘余量。 如实声明一个边界:正则字面量( 验证:typecheck 通过;25 个单测全绿(zero-wiring 新增 3 个用例);全仓扫描仍零命中、零误报。CI「缺席」仍是扫描时上一轮未跑完—— dispatch:073e2a8b5a6a85ae |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d555e031c8
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Codex review P2(3913603623)跟进:`import(/* webpackChunkName: "tokens" */ '../../design-tokens/src/snapshot.ts')` 这类说明符前带合法注释的导入,两个 检测通道都漏检。根因是上一轮两段式的顺序缺陷:廉价正则预扫跑在原始文本 上,注释隔断了关键字→引号衔接,预扫零命中提前返回,剥除层(本可剥掉注释 恢复衔接)反而执行不到——防误报的层顺序自己制造了漏放。 - 剥除前置:containsRuntimeImportOfDesignTokens 与 relativeSpecifierHitsDesignTokens 都改为先剥注释/数据字符串、再跑正则。 注释的两个方向(伪命中 / 遮蔽真命中)都由剥除层统一解决。 - 性能:stripCommentsAndDataStrings 重写为 chunked 状态机——普通文本按 区间整段拷贝(不再逐字符拼接),语境判定从后往前拼接 chunk 凑 64 字符 窗口;7.7MB 真实包源码 59ms(125MB/s,较逐字符版 5.9MB/s 提速 21 倍)。 另加 import/require/from 关键字 includes 预检,无语法痕迹的文件零成本。 全仓扫描 1.24s(较上轮 3.8s 基线更快)。 - 反证用例:动态 import / require / 副作用 import 带注释的相对路径走 rel 通道、包 id 带注释走 id 通道,各自命中;注释/数据字符串误报形态 回归保持全绿。 验证:pnpm --filter @cindy/design-tokens typecheck 通过;26 单测全绿; 全仓扫描仍零命中零误报。 Signed-off-by: Kirozeng <kirozeng@gmail.com>
|
本轮跟进已推上(commit P2:说明符前带注释的合法导入漏检——成立,已修 实测确认: 修法:剥除前置,两个通道都先剥注释/数据字符串再跑正则。注释的两个方向(伪命中、遮蔽真命中)都由剥除层统一解决,不再依赖顺序假设。 性能不退反进:剥除层重写为 chunked 状态机(普通文本按区间整段拷贝、语境判定拼接 chunk 取窗口),7.7MB 真实源码 59ms(125MB/s,提速 21 倍)+ import/require/from 关键字预检;全仓扫描 1.24s,比上轮 3.8s 更快。 反证用例:带注释的相对路径(rel 通道)与包 id(id 通道)导入各自命中,上轮的注释误报回归保持全绿。 验证:typecheck 通过;26 单测全绿;全仓扫描零命中零误报。CI「缺席」仍是上一轮在跑( dispatch:1e063c1579c36f5e |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8f481c0ae8
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ae0e6855ca
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Codex review P1(3913883249)跟进:`import(`../../design-tokens/src/snapshot.ts`)`、
`require(`@cindy/design-tokens/src/snapshot.ts`)` 这类无插值模板字面量是
有效运行时加载,但提取正则只认单双引号——包 id 与相对路径两个通道都漏放。
实测确认。
- SPECIFIER_CONTEXT_RE / IMPORT_ENTRY_PATTERNS 的引号字符类从 ['"] 扩到
['"`],全部六种语境(from / import() / require() / require.resolve /
import.meta.resolve / 裸副作用 import)同步。
- 带 ${…} 插值的模板**同样命中**:路径在运行期拼装恰是零接线阶段不该
出现的动态消费形态,按宁误报不漏放处理(与 member-require 同一威胁
模型,如实声明)。
- 数据语境的普通模板不误报:剥离层在非说明符位置把模板内容剥成空白,
既有机制无需改动。
- 反证用例:import/require/require.resolve/from/副作用 import 的模板形态
(包 id + 相对路径 + 插值)全部命中;数据模板回归不误报。
验证:pnpm --filter @cindy/design-tokens typecheck 通过;30 单测全绿;
全仓扫描 2.4s 零命中零误报。
Signed-off-by: Kirozeng <kirozeng@gmail.com>
|
本轮跟进已推上(commit P1:模板字面量形式的模块说明符漏检——成立,已修 实测确认: 修法:引号字符类从 一个按威胁模型的扩展决策(如实声明):带 反证用例按意见要求包 id、相对路径都补了,数据模板回归不误报。 验证:typecheck 通过;30 单测全绿;全仓扫描 2.4s 零命中零误报。CI「缺席」仍是上轮在跑,本轮 push 触发新一轮 CI 以那轮为准。 dispatch:85ac5e650d4fda6a |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d9246db62d
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@kirozeng 👋 这个 PR 目前与 请在本地 merge 最新的 |
一、合并冲突(auto-review 提示):docs/design-rules/cindy-design-system.md
变更日志顶部双方同位新增条目——保留 main 的「Desktop 登录成功回调页 UX
覆盖」与本地「DS-3 最小语义 Token 影子层」两条,main 在前。
二、Codex review P1(3914259197):`readFileSync(new URL('../../design-tokens/
src/semantic/color.json', import.meta.url), 'utf8')` 直接消费影子层文件,
旧实现两通道都漏检——剥离层把 new URL 第一参数当数据清空、说明符语境
也没有 new URL。修法:`new URL('…'` 成为第七种说明符语境(按调用文件
位置 resolve 相对路径),SPECIFIER_CONTEXT_RE / SPECIFIER_PREFIX_RE 同步;
仓内既有 110 处 new URL(import.meta.url) 用法(读兄弟 tsx / css / worker)
都不指向 design-tokens,全仓扫描实测零误报。
反证用例:new URL 相对直读(引号 + 模板形态)命中;既有三类用法形态
与数据字符串不误报。
验证:pnpm --filter @cindy/design-tokens typecheck 通过;31 单测全绿;
全仓扫描(含合并后 main 代码)零命中零误报。
Signed-off-by: Kirozeng <kirozeng@gmail.com>
|
本轮跟进已推上(commit 1. 合并冲突——已解 与 2. P1: 实测确认: 修法: 误报核查(意见提到仓内已有大量这种读取模式):实测既有 110 处 验证:typecheck 通过;31 单测全绿;全仓扫描(含合并后的 main 代码)零命中零误报。CI「缺席」仍是上轮在跑,本轮 merge push 触发新一轮 CI 以那轮为准。 dispatch:ff736d7905f33486 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f0a7998d58
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Codex review 两条 P2 跟进:
① 豁免色缺 protected 登记(3914411235,成立):destructive / error-* /
warning-* / focus-ring* 已进 semantic 建模,但 DESIGN.md §10 列其为
theme-invariant 语义豁免色、治理合同 §3.2 要求 Tier-3 豁免色作为 protected
角色迁移——分类里却是无元数据的普通 literal,DS-8 生成主题入口时无法区分
可覆写 semantic 与必须保留原值的豁免族。修法:新增 SEMANTIC_EXEMPTION_IDS
与 exemption 元数据(与 PROTECTED_IDS 并列、语义不同——豁免色**照常建模**
只带标记,protected 是「只登记不建模」);ClassificationEntry 加 exemption
字段,11 个已建模豁免色重新生成登记;新守卫 assertSemanticExemptionsRegistered
校验已建模豁免色必须带标记且不与 protected 混用。
② fs 裸相对路径直读漏检(3914411249,成立):
readFileSync('../../design-tokens/src/semantic/color.json') 是最直接的
消费方式,两通道都漏。修法:fs API 路径参数成为第八类说明符语境
(readFileSync/readFile/writeFileSync/existsSync/statSync 等 13 个 API 的
第一参数,含成员链与模板形态),按调用文件位置 resolve。误报核查:第一方
代码既有 fs 读取全部走 resolve(__dirname…) / new URL(…) 包装(54 处实测),
裸相对形态为零——纳入扫描零误报,全仓扫描实证。
验证:pnpm --filter @cindy/design-tokens typecheck 通过;33 单测全绿
(新增豁免色守卫 + fs 检测两组用例);全仓扫描 3.0s 零命中零误报;
生成器两次运行字节一致。
Signed-off-by: Kirozeng <kirozeng@gmail.com>
|
本轮跟进已推上(commit P2-①:语义豁免色缺 protected 登记——成立,已修 核实:11 个已建模豁免色( 修法采用「纳入保护登记」方向,但没走 P2-②:fs 裸相对路径直读漏检——成立,已修 核实: 修法:fs API 路径参数成为第八类说明符语境(13 个常用 API 的第一参数,含成员链与模板形态),按调用文件位置 resolve。误报核查:第一方代码既有 54 处 fs 读取全部走 验证:typecheck 通过;33 单测全绿(新增两组用例);全仓扫描 3.0s 零命中零误报;生成器字节稳定。CI「缺席」仍是上轮在跑,本轮 push 触发新一轮 CI 以那轮为准。 dispatch:5138657f59acdb75 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3aa65b4636
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Codex review 两条 P2 跟进:
① 路径构造器包装漏检(3914597287,成立):
`readFileSync(resolve(__dirname, '../../design-tokens/…'))` / `join(…)`
是仓内既有 fs 读取的主流写法(54 处实测),旧实现只认 fs API 第一参数
直接以引号开始——包装形态两通道都漏。修法:resolve/join 调用内的静态
字符串片段(任意参数位置)成为第九类说明符语境,按调用文件位置 resolve
(__dirname ≈ 文件所在目录)。剥离层语境判定同步(resolve(/join( 开括号
后未闭括号内的字符串保留)。误报核查:既有 54 处用法全部不指向
design-tokens,Array.join 分隔符字符串不以 '.' 开头天然过滤——全仓扫描
零误报实证。
② Windows 反斜杠说明符漏检(3914597300,成立):
`require('..\\..\\design-tokens\\src\\x')` 在 Windows CJS 合法,
但说明符直接交给 path.posix、反斜杠不被识别为分隔符——resolve 结果不
落进 design-tokens,漏放。修法:说明符统一反斜杠归一为 / 再 resolve
(源码字符串里 \\ 是转义单反斜杠;仓内无含反斜杠字符的 POSIX 文件名,
替换是安全近似)。
验证:pnpm --filter @cindy/design-tokens typecheck 通过;35 单测全绿
(新增两组 11 个断言形态);全仓扫描 3.1s 零命中零误报。
Signed-off-by: Kirozeng <kirozeng@gmail.com>
|
本轮跟进已推上(commit P2-①:路径构造器包装漏检——成立,已修 实测确认: P2-②:Windows 反斜杠说明符漏检——成立,已修 实测确认: 验证:typecheck 通过;35 单测全绿(新增两组 11 个断言形态);全仓扫描 3.1s 零命中零误报。CI「缺席」仍是上轮在跑,本轮 push 触发新一轮 CI 以那轮为准。 dispatch:95dc4fd94150b4ea |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 838d4d726c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Codex review 两条 P2 跟进: ① 路径构造器只捕获第一个字符串参数(3914703193,成立): `join(__dirname, '..', '..', 'design-tokens/…')` 分段拼接形态实际读取 design-tokens,但正则只看第一个 '..' 就返回 false——常见分段写法绕过 守卫。修法:重建调用内**全部**静态字符串参数——PATH_CONSTRUCTOR_CALL_RE 捕获完整调用实参区,按序提取字符串字面量拼成候选路径再按文件位置 resolve(非字符串参数天然缺席,等价于从文件目录起算的相对段)。反证: 分段 join / 多段 resolve / 模板段全命中;既有 54 处用法与 Array.join 分隔符回归零误报。 ② 受保护 Tier-1 文本角色被移出 semantic(3914703199,成立): text-secondary / text-secondary-cross 是 DESIGN.md §10 Tier-1 slot, 治理合同 §3.2 明确「Tier-1 semantic slots → semantic,名称与用途延续」; 却被 PROTECTED_IDS 统一 register-only 分支标成只登记、从 semantic JSON 消失——DS-8 接管生成时无法从新真相源生成这两个核心文本变量。U2 保护 限制的是改值须裁决(never darken unilaterally),不等于禁止迁移。 修法:ProtectedRule 加 mode 字段——Tier-1 slot(text-secondary / text-secondary-cross)semantic-modeled:照常值形态分类 + 强制进 semantic + 保留 protected 元数据;Tier-3 singleton(annotation-accent、 login-brand-*)维持 register-only(治理合同「保留原位,逐项裁决,默认 不动」,本 PR 未裁决它们进 semantic)。守卫 assertProtectedNotSemantic 按 mode 分支校验;SEMANTIC_ROLES 补登记两个 Tier-1 slot。 验证:pnpm --filter @cindy/design-tokens typecheck 通过;35 单测全绿 (oracle 与保护值用例同步 mode 语义;value-consistency 验证 text-secondary 双模式值与冻结快照一致);全仓扫描零命中零误报; 生成器两次运行字节一致。 Signed-off-by: Kirozeng <kirozeng@gmail.com>
|
本轮跟进已推上(commit P2-①:路径构造器只捕获第一个字符串参数——成立,已修 实测确认: P2-②:受保护 Tier-1 文本角色被移出 semantic——成立,已修(这条对治理合同的引用很准) 核实: 修法: 验证:typecheck 通过;35 单测全绿;全仓扫描零命中零误报;生成器字节稳定。CI「缺席」仍是上轮在跑,本轮 push 触发新一轮 CI 以那轮为准。 dispatch:c501f0f11cefcf26 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5b404b2bba
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Codex review 两条 P2 跟进:
① import.meta.glob 漏检(3914869131,成立):Vite 的
`import.meta.glob('../../design-tokens/src/**/*.json')` 在构建期把影子层
内容打进产品(仓内 packages/lizi-mcps/src/browser/recipe-loader.ts 有
实际用例),但说明符语境没有 import.meta.glob 分支——两通道漏放。修法:
SPECIFIER_CONTEXT_RE / SPECIFIER_PREFIX_RE 补 import.meta.glob( 分支,
相对 glob 模式按文件位置 resolve(glob 元字符不影响前缀段判定)。
② 语境残留误报(3914869140,成立):`import x from './x'; const hint =
'packages/design-tokens/src/x';` 被误报——SPECIFIER_PREFIX_RE 的
\\bfrom / \\bimport 分支在 2320ce02 轮重写时丢失了 \\$ 锚定,匹配的是
「语境里任何位置有 import 字样」而非「语境以 import 结尾」,数据字符串被
剥除层错误保留、裸路径模式随后误报接线。修法:所有分支共享末尾 \\$ 锚定
((?:…)$ 整组包裹),保证匹配的是紧邻当前开引号的调用语境。
反证用例:glob(含模板形态与既有 recipes 用法不误报)、残留语境三种形态
不误报;此前全部九类语境 + 注释/数据字符串回归(23 形态)全绿。
验证:pnpm --filter @cindy/design-tokens typecheck 通过;37 单测全绿;
全仓扫描零命中零误报。
Signed-off-by: Kirozeng <kirozeng@gmail.com>
|
本轮跟进已推上(commit P2-①: 实测确认: P2-②:语境残留误报——成立,已修(抓的是我此前重写时引入的真 bug) 实测确认: 反证:残留语境三种形态不误报;此前九类语境全部命中形态(23 个断言)回归全绿——锚定收紧零牺牲。 验证:typecheck 通过;37 单测全绿;全仓扫描零命中零误报。CI「缺席」仍是上轮在跑,本轮 push 触发新一轮 CI 以那轮为准。 dispatch:839fc3d6ea83ebdc |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f26072ca3b
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@kirozeng 👋 这个 PR 还有 2 条 review conversation 没 resolve(packages/design-tokens/src/guards.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。 如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。 |
Codex review 两条 P2 跟进:
① fs/promises.open 漏检(3915016839,成立):
`const file = await open('../../design-tokens/src/semantic/color.json');
await file.readFile()` 真实消费影子层,但 open 不在 fs API 列表(openSync
在、异步 open 不在)——路径字符串被剥除,两通道漏放。修法:open 加入
FS_API_PATH_CONTEXT_RE 与 SPECIFIER_PREFIX_RE,预检补 open 字样(裸
open('…') 不含 File/Sync,此前连剥除层都进不去)。误报核查:window.open
的 URL 参数不以 '.' 开头天然过滤;仓内以 '.' 开头字符串参数的 open( 调用
实测为零。
② .mts/.cts 扫描缺口(3915016844,成立):扫描器扩展名正则只认
ts/tsx/js/mjs/cjs,.mts/.cts(有效 Node/TS 模块扩展,仓内 scripts/ 与
tools/ 已使用)的文件在读取内容前被跳过——相对路径消费且不留
package.json 依赖,两通道都看不见。修法:扩展名正则补 mts|cts,并用
临时 fixture(.mts 与 .cjs 消费者各一)直接验证扫描器行为。
验证:pnpm --filter @cindy/design-tokens typecheck 通过;38 单测全绿;
全仓扫描零命中零误报。
Signed-off-by: Kirozeng <kirozeng@gmail.com>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
本轮跟进已推上(commit P2-①: 实测确认: P2-②: 核实:扫描器扩展名只有 验证:typecheck 通过;38 单测全绿;全仓扫描零命中零误报。CI「缺席」仍是上轮在跑,本轮 push 触发新一轮 CI 以那轮为准。 dispatch:78d25b385e16a7a5 |
|
已核实本轮反馈,无需代码改动。逐条说明: 1. 「2 条 review conversation 未 resolve」——已过时:该提示发出于上一轮 push 之后,所指的两条 Codex thread( 2. Codex usage limits 通知——纯信息性:配额在 Codex 侧管理、会自动恢复,不是本 PR 的问题。配额恢复后的新 review 意见(如有)会另行跟进。 3. CI 红灯「缺席」——已转绿:扫描时 Windows unit tests 还在跑;现在 本轮 head 无变化( dispatch:97a2953f80603487 |
设计系统改造系列 DS-3,路线图见 docs/design-rules/design-governance.md §12
目标: 建立 packages/design-tokens 最小语义 Token 影子层(reference → semantic),数据源仅 DS-2b 冻结快照,零运行时接线。
非目标: 不接 Desktop/Mobile 运行时、不建 component token、不装 Terrazzo、不改 colors.ts / 主题 / 快照 / 台账。
验收: 分类覆盖快照全部 id 且四类互斥;semantic 与快照逐值一致;结构/零接线守卫在位;产品代码零改动。
§12 DS-2b 已回填为 ✅ #3700(2026-09-02 合入)。DS-3 自身 PR 列本次留
—,待本 PR 号出现后补一次 commit 或由下一张回填。若与在办 PR 同时改 §12,以合入顺序 rebase。弃坑复查日期 2026-11-01:届时 DS-4 仍未开工即整包删除(revert 即可,零运行时残留)。
规模闸:对 merge-base 计 6837 行(含生成的
classification.json5096 行),默认预算 800。本张不能拆——分类登记必须覆盖快照全部 id。当次豁免绑定head_sha=9d5d2b5694bb69edd52421fbdc9fe3f2780bf505(Phase 2c 修复后重绑)。这次改了什么
摘要
在仓库里放一本还没人用的颜色字典:把 DS-2b 已经冻住的 514 个颜色,分类后建成标准两层 Token(原始色 → 用途角色)。Desktop / Mobile 一行产品代码都不改,打开 Cindy 看到的界面不变。这是后面做标准按钮、再接到真正主题系统的上游。
变更类型
feat新功能docs/test/chore文档、测试或工程维护范围
design-governance.md§12)packages/design-tokens(@cindy/design-tokens),标准 DTCG JSONcolors.ts/ 主题 / Mobile 源码 / DS-2b 快照 / 台账、新语义或改名UI 变化
不涉及:零产品代码、零视觉。新 package 不被 desktop / mobile / 任何运行时 package import;颜色权威在 DS-8 之前仍是
colors.ts。design-governance.md§1.1 / §3 / §4 / §5 / §7 / §12;第一批角色对齐DESIGN.md§10 Tier-1;保护值见 §15 / U2 / annotation-accent怎么验证的
自动验证
手工验证
不涉及。未启动 Desktop / Mobile;本张证据是「运行时读不到」,不是截图对比。
未执行的验证
未做 Light/Dark 实机截图(无 UI 改动)。未跑
pnpm --filter desktop typecheck(diff 不含 desktop 产品代码;相关单测已覆盖 desktop workspace)。风险
风险分类
影响与回滚
提交前检查
git commit -s,见 DCO)