Skip to content

feat(design-system): DS-3 最小语义 Token 影子层 - #3798

Open
kirozeng wants to merge 16 commits into
mainfrom
ds/3-token-shadow-layer
Open

feat(design-system): DS-3 最小语义 Token 影子层#3798
kirozeng wants to merge 16 commits into
mainfrom
ds/3-token-shadow-layer

Conversation

@kirozeng

@kirozeng kirozeng commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

设计系统改造系列 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.json 5096 行),默认预算 800。本张不能拆——分类登记必须覆盖快照全部 id。当次豁免绑定 head_sha=9d5d2b5694bb69edd52421fbdc9fe3f2780bf505(Phase 2c 修复后重绑)。

这次改了什么

摘要

在仓库里放一本还没人用的颜色字典:把 DS-2b 已经冻住的 514 个颜色,分类后建成标准两层 Token(原始色 → 用途角色)。Desktop / Mobile 一行产品代码都不改,打开 Cindy 看到的界面不变。这是后面做标准按钮、再接到真正主题系统的上游。

变更类型

  • feat 新功能
  • docs / test / chore 文档、测试或工程维护

范围

  • 关联 Issue / 需求:设计系统改造系列 DS-3(路线图 design-governance.md §12)
  • 本 PR 包含:
    • 新建 packages/design-tokens@cindy/design-tokens),标准 DTCG JSON
    • 以 DS-2b 冻结快照为唯一数据源的分类登记(literal / alias / hsl-triplet / runtime-derived-or-protected)
    • 最小 reference → semantic 两层;第一批角色对齐 DESIGN.md §10 Tier-1(surface / border / text / accent)+ status
    • 逐值一致、结构、零接线守卫(含错误 fixture)
    • 多入口投放合同(只写合同,DS-8 才接线)
    • §12 回填 DS-2b = ci(design-system): DS-2b 主题兼容冻结守卫 #3700;cindy-design-system 版本记录
  • 明确不包含:运行时接线与生成物(DS-8)、component token(DS-4)、Terrazzo、colors.ts / 主题 / Mobile 源码 / DS-2b 快照 / 台账、新语义或改名
  • 用户可见变化:无
  • 是否存在 breaking change:无

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

怎么验证的

自动验证

pnpm --filter @cindy/design-tokens test
结果:4 files / 16 tests passed

pnpm --filter @cindy/design-tokens run typecheck
结果:通过

pnpm test:unit:related
结果:全绿(因改 package.json / pnpm-lock.yaml / test-workspaces.config.mjs,自动退回全量 unit)

手工验证

不涉及。未启动 Desktop / Mobile;本张证据是「运行时读不到」,不是截图对比。

未执行的验证

未做 Light/Dark 实机截图(无 UI 改动)。未跑 pnpm --filter desktop typecheck(diff 不含 desktop 产品代码;相关单测已覆盖 desktop workspace)。

风险

风险分类

  • 其他:零视觉基建。第三份数值真相(影子层)若与快照漂移,由逐值一致守卫拦住。弃坑日 2026-11-01 前若无人消费须删除。

影响与回滚

  • 影响范围:新 package、测试工作区登记、lockfile importer、两份设计文档。产品界面与主题加载路径不变。
  • 回滚 / 降级方式:revert 本 PR(删整个 package 与测试、还原 §12/版本记录)。因零接线,删除不留运行时或构建残留。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s,见 DCO
  • UI 改动已在「UI 变化」注明引用的设计规范章节(不涉及 UI 则跳过)
  • 未提交凭证、令牌或授权文件
  • 已补充必要文档
  • 已确认测试结果或说明未执行原因

在 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>
@kirozeng
kirozeng requested a review from a team as a code owner September 2, 2026 08:59
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 2, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-02T14:11:51.408128Z f26072c New commits
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@kirozeng

kirozeng commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

Phase 2c 外推(不进本 PR)

三审 delta 复核后按意见三分法外推,不阻塞本张:

  1. 零接线守卫后续可覆盖 require.resolve('@cindy/design-tokens') 与反引号 import(\@cindy/design-tokens`)`。
  2. hslPairOf 对无 hex 双胞胎的 -hsl id(如 border-shadcn-hsl)可加存在性校验。
  3. modeledAsSemantic 可对全部 SEMANTIC_ROLES 做正向断言。
  4. generate.ts 多文件覆盖写入可改为 tmp+rename 原子提交。

本张 MUST-FIX 已落地:动态 import / side-effect / import-equals 探测 + 自证伪测试;-hsl 必须双模式 triplet + 独立分类 oracle。

@greptile-apps

greptile-apps Bot commented Sep 2, 2026

Copy link
Copy Markdown

Greptile Summary

新增一个尚未接入产品运行时的 DTCG 设计 Token 影子包,以 DS-2b 冻结快照生成 reference → semantic 两层,并补充分类、结构、逐值一致和零接线守卫。

  • 覆盖冻结快照全部颜色 ID 的四类互斥分类登记
  • 建立首批 surface、border、text、accent 与 status 语义角色
  • 登记测试工作区、生成命令及路线图/弃坑日期文档
  • 未修改 Desktop 或 Mobile 产品消费路径

Confidence Score: 5/5

该 PR 看起来可以安全合入;未发现影子 Token 数据、生成守卫或零运行时接线合同中的具体缺陷。

新包以既定冻结快照为唯一数据源,生成结果受分类完备性、双模式、alias 方向、逐值一致和零接线检查约束,且没有产品运行时消费者。

Important Files Changed

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
Loading

Reviews (1): Last reviewed commit: "fix-run ds3-r1b wave1 squash" | Re-trigger Greptile

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread packages/design-tokens/src/build-layers.ts Outdated
@MagicLizi

Copy link
Copy Markdown
Contributor

@kirozeng 👋 这个 PR 还有 1 条 review conversation 没 resolve(packages/design-tokens/src/build-layers.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。

如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。

@MagicLizi MagicLizi added status:ci-failed CI 失败(review-pr 自动维护,仅展示) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:large-diff 改动量较大(review-pr 自动维护,仅展示) touches:new-dependency 新增第三方依赖(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示) touches:security 改动碰到安全边界(review-pr 自动维护,仅展示) labels Sep 2, 2026
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>
@kirozeng

kirozeng commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

本轮跟进已推上(commit 77db609e2),两条反馈都处理了:

1. HSL 色值不再用 $type: "other"(review P2 意见,属实)

意见核实:other 确实不是标准 DTCG token 类型。我用治理合同 §5 锁定的 Terrazzo 2.7.1 实测验证了危害:other 类型的 token 会被 CSS 插件静默丢弃(不产出任何 CSS 变量),alias 到它同样无输出;而裸 triplet 字符串 "60 12.5% 97%" 挂在 $type: "color" 下会被解析成黑色。也就是说 DS-8 接线时这批节点要么消失、要么变黑,意见完全成立。

修法(不用自造类型,也不用扩展格式,直接上标准表示):

  • dtcg.ts 新增 toDtcgColorObject / dtcgColorObjectToString:HSL triplet → {"colorSpace":"hsl","components":[60,12.5,97]},hex/rgba/transparent → srgb 分量(0–1)+ 可选 alpha;$type 类型收紧为仅 color
  • 重新生成两层 JSON:12 个 other reference 节点 + 14 个 other semantic alias 全部消除
  • guards.ts 校验器同步收紧:不再放行 other,并补了反证测试(旧形态必须被拒收)

端到端证据:把修复后的真实生成物直接喂给 Terrazzo 2.7.1 tz build,136 个 token 全部构建成功、零 lint 错误,HSL token 正确产出 --hsl-60-12-5pct-97pct: hsl(60 12.5% 97%) 这样的 CSS 变量。

2. Windows unit tests 红灯(CRLF 假红)

根因:Windows runner 的 core.autocrlf=true 检出时把生成物 JSON 转成 CRLF,classification.test.ts 的「磁盘 = 内存生成」字节一致断言直接炸(CI 日志里能看到 expected '{\r\n…' to be '{\n…')。

修法:.gitattributespackages/design-tokens/src/**/*.jsoneol=lf(仓库里 drizzle migration .sql 的同款先例),并补了一个 git check-attr 回归测试——以后有人删掉这条规则,本地就红,不用等 Windows CI。

逐值一致没有放松:守卫改在标准颜色对象层比较(快照字符串和影子层对象两侧都归一到 DTCG 颜色对象再比,hex 大小写不构成色值差异),45 个 semantic 角色逐个核对仍与 DS-2b 冻结快照一致;transparent 往返、rgba alpha 往返都有专门测试。

验证:pnpm --filter @cindy/design-tokens typecheck 通过;包内 19 个单测全绿;pnpm test:unit:related 全量绿;生成器两次运行字节一致(md5 相同)。Linux/Windows 双端 CI 以这次 push 的运行为准。

dispatch:08d67dd3346c36c7

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread packages/design-tokens/src/dtcg.ts
Comment thread packages/design-tokens/src/guards.ts
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>
@kirozeng

kirozeng commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

本轮跟进已推上(commit a1c4b8cc9)。这轮的输入是 Codex 在新 head 上的两条新 P1 意见 + 1 条旧 P2 thread 未 resolve,逐一处理如下:

1. HSL 百分比分量应为 0–1(dtcg.ts)——核实后不成立,分量值不改

查了 W3C DTCG Color 模块规范原文:Color Space 表写的是 HSL 的 Saturation / Lightness 范围 [0-100](hue 是 [0-360)),规范自己的白色示例就是 components: ["none", 0, 100]。0–1 是 srgb 等通道型空间的规则,HSL 不是。

Terrazzo 2.7.1 实测对照:[60, 12.5, 97] 产出 hsl(60 12.5% 97%)(正确颜色);意见建议的 [60, 0.125, 0.97] 产出 hsl(60 0.125% 0.97%)(几乎全黑)。「除以 100」会把 12 个 HSL token 全部改错。

意见里「校验器应检查各色彩空间合法范围」这半句是对的,已采纳:guards.ts 现在按色彩空间检查分量范围(srgb 通道 [0,1]、hsl hue [0,360) 且 360 本身非法、s/l [0,100]、alpha [0,1]),把这个正确范围锁进守卫,两个方向的写错都会被拦。

2. 兄弟 workspace 相对路径接线漏检(guards.ts)——成立,已修

实测复现:packages/foo/src/a.tsimport … from '../../design-tokens/src/…' 时说明符不含 packages/ 段,旧正则命不中,零接线守卫会放行真实消费者。修法是按被扫描文件的位置解析相对说明符(任意 ../ 深度、兄弟包、apps 侧全覆盖),扫描器改双通道检测,正反两组反证用例已补,全仓扫描仍零命中。

3. 旧 P2 thread(build-layers.ts 的 $type: "other")——上一轮已修,本轮补 resolve

77db609e2 已消除全部 other 节点并收紧校验器;这条 thread 一直没点 resolve 导致 auto-review 被卡。三条 thread 均已回复说明并 resolve,auto-review 可以继续了。

验证pnpm --filter @cindy/design-tokens typecheck 通过;22 个单测全绿(新增 3 个反证用例);生成物本轮零变化。Windows unit tests 的「缺席」是扫描时上一轮 CI 还在跑——77db609e2 的 Windows 双分片已跑完且全绿(CRLF 假红已修),本轮 push 会触发新一轮 CI,以那轮结果为准。

dispatch:03e2a78a89595bc5

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread packages/design-tokens/src/guards.ts Outdated
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>
@kirozeng

kirozeng commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

本轮跟进已推上(commit fe371617e)。这轮信号里两条 P1 是上一轮已处理的(HSL 分量范围已用规范原文 + Terrazzo 实证回复并 resolve;相对路径检测已修),真正的新意见是一条 P2,已修:

P2:副作用 import 相对路径漏检(guards.ts)——成立,已修

实测确认:import '../../design-tokens/src/generate.ts' 这种副作用导入(没有 from 子句、没有括号),上一轮加的相对说明符提取器只有 from / import() / require() / import.meta.resolve() 四种语境,命不中。

修法:提取器补 import '…' 分支,用前瞻定位引号((?=['"]),分支不吞引号,由共享后继统一消费),换行、双引号形态都覆盖。顺带收掉一个既有误报:foo.import('…') / foo.require('…') 成员调用此前会被误当 import 语句(上一轮就存在,这次一起修,统一加 (?<![\w$.]) 守卫)。反证用例已补,全仓扫描仍零命中、零误报。

至此零接线守卫的相对路径通道覆盖:from / import() / require() / import.meta.resolve() / 副作用 import 五种语境 × 任意 ../ 深度 × 兄弟包与 apps 侧位置。

验证:typecheck 通过;22 个单测全绿(zero-wiring 新增 4 个断言形态);生成物零变化。Windows unit tests 的「缺席」仍是扫描时上一轮 CI 未跑完——a1c4b8cc9 那轮已全绿,本轮 push 触发新一轮 CI,以那轮结果为准。

dispatch:39d232bc1b552d98

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread packages/design-tokens/src/guards.ts Outdated
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>
@kirozeng

kirozeng commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

本轮跟进已推上(commit d555e031c),处理 Codex 的新 P1:

P1:注释/字符串里的伪导入会误报(guards.ts)——成立,已修

实测确认:// import '@cindy/design-tokens'; 会被零接线守卫当真实接线,块注释、JSDoc、错误消息字符串里的完整 import 语句同样误报——一个无害注释就能把 required unit workspace 弄红。既有的「非导入语境不误报」测试能过只是因为用例里不含完整 import 语法,没覆盖到这个形态。

修法:新增 stripCommentsAndDataStrings 剥除层——注释整体替换为等长空白;字符串按语境二分:import 语境前的字符串是模块说明符(保留),其它是数据(内容剥除、引号保留)。两个检测通道都在剥除后的文本上复核。

性能用了两段式:先跑廉价正则,零命中的文件(绝大多数)完全不付剥除成本;全仓扫描 3.8s(此前约 1.2s),对应测试超时提到 60s 留 Windows 慢盘余量。

如实声明一个边界:正则字面量(/…/)不识别,内容会被当字符串剥除——只在「漏放」方向偏差,真实 import 语句不会写在正则里,可接受(thread 回复里有完整说明)。

验证:typecheck 通过;25 个单测全绿(zero-wiring 新增 3 个用例);全仓扫描仍零命中、零误报。CI「缺席」仍是扫描时上一轮未跑完——fe371617e 的 Linux 双分片已绿,Windows 在跑;本轮 push 会再触发一轮。

dispatch:073e2a8b5a6a85ae

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread packages/design-tokens/src/guards.ts Outdated
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>
@kirozeng

kirozeng commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

本轮跟进已推上(commit 8f481c0ae),处理 Codex 的新 P2:

P2:说明符前带注释的合法导入漏检——成立,已修

实测确认:import(/* webpackChunkName: 'tokens' */ '../../design-tokens/src/snapshot.ts') 两个检测通道都漏检。根因是上一轮两段式的顺序缺陷:廉价正则预扫跑在原始文本上,注释隔断了关键字→引号衔接,预扫零命中提前返回,剥除层(本可剥掉注释恢复衔接)根本执行不到——防误报的层顺序自己制造了漏放。

修法:剥除前置,两个通道都先剥注释/数据字符串再跑正则。注释的两个方向(伪命中、遮蔽真命中)都由剥除层统一解决,不再依赖顺序假设。

性能不退反进:剥除层重写为 chunked 状态机(普通文本按区间整段拷贝、语境判定拼接 chunk 取窗口),7.7MB 真实源码 59ms(125MB/s,提速 21 倍)+ import/require/from 关键字预检;全仓扫描 1.24s,比上轮 3.8s 更快。

反证用例:带注释的相对路径(rel 通道)与包 id(id 通道)导入各自命中,上轮的注释误报回归保持全绿。

验证:typecheck 通过;26 单测全绿;全仓扫描零命中零误报。CI「缺席」仍是上一轮在跑(d555e031c 的 Windows 双分片当时 pending),本轮 push 触发新一轮 CI,以那轮为准。

dispatch:1e063c1579c36f5e

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread packages/design-tokens/src/guards.ts Outdated
Comment thread packages/design-tokens/src/guards.ts Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread packages/design-tokens/src/guards.ts Outdated
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>
@kirozeng

kirozeng commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

本轮跟进已推上(commit d9246db62),处理 Codex 的新 P1:

P1:模板字面量形式的模块说明符漏检——成立,已修

实测确认:import(`../../design-tokens/src/snapshot.ts`)require(`@cindy/design-tokens/src/snapshot.ts`) 这类无插值模板字面量是有效运行时加载,但提取正则只认单双引号,两个通道都漏检。

修法:引号字符类从 ['"] 扩到 ['"\]`,全部六种语境(from / import() / require() / require.resolve / import.meta.resolve / 裸副作用 import)在包 id 与相对路径两个通道同步。

一个按威胁模型的扩展决策(如实声明):带 ${…} 插值的模板同样命中——路径在运行期拼装恰是零接线阶段不该出现的动态消费形态,与 member-require 同一「宁误报不漏放」口径。数据语境的普通模板不受影响(剥离层在非说明符位置剥内容,既有机制不变)。

反证用例按意见要求包 id、相对路径都补了,数据模板回归不误报。

验证:typecheck 通过;30 单测全绿;全仓扫描 2.4s 零命中零误报。CI「缺席」仍是上轮在跑,本轮 push 触发新一轮 CI 以那轮为准。

dispatch:85ac5e650d4fda6a

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread packages/design-tokens/src/guards.ts Outdated
@MagicLizi

Copy link
Copy Markdown
Contributor

@kirozeng 👋 这个 PR 目前与 main 有合并冲突,auto-review 因此暂时跳过、没法继续审查 / 合并。

请在本地 merge 最新的 origin/main 解决冲突后推送;冲突解除后,下一轮 auto-review 会自动重新处理这个 PR。

@MagicLizi MagicLizi added status:conflict 与目标分支有冲突(review-pr 自动维护,仅展示) and removed status:awaiting-bot-review 等外部审查机器人表态(review-pr 自动维护,仅展示) labels Sep 2, 2026
一、合并冲突(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>
@kirozeng

kirozeng commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

本轮跟进已推上(commit f0a7998d5),两件事都处理了:

1. 合并冲突——已解

main 的冲突在 docs/design-rules/cindy-design-system.md 变更日志顶部(双方同位新增条目):保留 main 的「Desktop 登录成功回调页 UX 覆盖」与本 PR 的「DS-3 最小语义 Token 影子层」两条。推送后 GitHub 已报 MERGEABLE,auto-review 可以继续了。

2. P1:new URL 直接文件读取漏检——成立,已修

实测确认:readFileSync(new URL('../../design-tokens/src/semantic/color.json', import.meta.url), 'utf8') 两个通道都漏检——剥离层把 new URL 第一参数当数据清空,语境清单里也没有它。

修法:new URL('…' 成为第七种说明符语境,相对路径按调用文件位置 resolve,落进 packages/design-tokens/ 即命中(含模板字面量形态)。

误报核查(意见提到仓内已有大量这种读取模式):实测既有 110 处 new URL(…, import.meta.url) 用法(读兄弟 tsx / css / worker)全部不指向 design-tokens——判定标准是「resolve 后的落点」而非「用了 new URL」,既有用法天然不命中,全仓扫描零误报。

验证:typecheck 通过;31 单测全绿;全仓扫描(含合并后的 main 代码)零命中零误报。CI「缺席」仍是上轮在跑,本轮 merge push 触发新一轮 CI 以那轮为准。

dispatch:ff736d7905f33486

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread packages/design-tokens/src/classify.ts
Comment thread packages/design-tokens/src/guards.ts Outdated
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>
@kirozeng

kirozeng commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

本轮跟进已推上(commit 3aa65b463),处理 Codex 的两条新 P2,都成立、都修了:

P2-①:语义豁免色缺 protected 登记——成立,已修

核实:11 个已建模豁免色(destructive / error-* / warning-* / focus-ring*)在 classification 里确实是无元数据的普通 literal,DS-8 生成主题入口时无法与可覆写 semantic 区分。

修法采用「纳入保护登记」方向,但没走 PROTECTED_IDS——那个的语义是「只登记、不建模」(守卫会把建模的豁免色拒掉)。解法:新增独立的 SEMANTIC_EXEMPTION_IDSexemption 元数据,豁免色照常 semantic 建模、只带标记;新守卫 assertSemanticExemptionsRegistered 校验登记完整性。范围只覆盖已建模的 11 个,DESIGN.md §10 豁免表其余未建模项(diff-* 等)按「进 shadow 层时再登记」处理。

P2-②:fs 裸相对路径直读漏检——成立,已修

核实:readFileSync('../../design-tokens/src/semantic/color.json') 两通道都漏——这是最直接的文件消费方式。

修法:fs API 路径参数成为第八类说明符语境(13 个常用 API 的第一参数,含成员链与模板形态),按调用文件位置 resolve。误报核查:第一方代码既有 54 处 fs 读取全部走 resolve(__dirname…) / new URL(…) 包装,裸相对形态为零——纳入扫描零误报,全仓实证;绝对路径与裸文件名不命中。

验证:typecheck 通过;33 单测全绿(新增两组用例);全仓扫描 3.0s 零命中零误报;生成器字节稳定。CI「缺席」仍是上轮在跑,本轮 push 触发新一轮 CI 以那轮为准。

dispatch:5138657f59acdb75

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread packages/design-tokens/src/guards.ts Outdated
Comment thread packages/design-tokens/src/guards.ts Outdated
@MagicLizi MagicLizi added status:awaiting-bot-review 等外部审查机器人表态(review-pr 自动维护,仅展示) and removed status:conflict 与目标分支有冲突(review-pr 自动维护,仅展示) labels Sep 2, 2026
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>
@kirozeng

kirozeng commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

本轮跟进已推上(commit 838d4d726),处理 Codex 的两条新 P2,都成立、都修了:

P2-①:路径构造器包装漏检——成立,已修

实测确认:readFileSync(resolve(__dirname, '../../design-tokens/…'))join(…) 包装形态两通道都漏——而仓内既有 fs 读取的主流写法恰恰全是这种包装(54 处),意见点得准。修法:resolve / join 调用内的静态字符串片段(任意参数位置)成为第九类说明符语境,按调用文件位置 resolve;剥离层语境判定同步。误报核查:既有 54 处用法全部不指向 design-tokens,Array.join('、') 分隔符不以 . 开头天然过滤——全仓扫描零误报实证。

P2-②:Windows 反斜杠说明符漏检——成立,已修

实测确认:require('..\\..\\design-tokens\\src\\x')(Windows CJS 合法形态)——反斜杠不被 path.posix 识别为分隔符,落点判定失败。修法:说明符 resolve 前做反斜杠归一(\\ 序列 → /);仓内无含反斜杠字符的 POSIX 文件名,替换是安全近似。

验证:typecheck 通过;35 单测全绿(新增两组 11 个断言形态);全仓扫描 3.1s 零命中零误报。CI「缺席」仍是上轮在跑,本轮 push 触发新一轮 CI 以那轮为准。

dispatch:95dc4fd94150b4ea

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread packages/design-tokens/src/guards.ts Outdated
Comment thread packages/design-tokens/src/classify.ts
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>
@kirozeng

kirozeng commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

本轮跟进已推上(commit 5b404b2bb),处理 Codex 的两条新 P2,都成立、都修了:

P2-①:路径构造器只捕获第一个字符串参数——成立,已修

实测确认:join(__dirname, '..', '..', 'design-tokens/…') 分段拼接形态漏检——正则只看第一个 '..'。修法:重建调用内全部静态字符串参数(按序拼成候选路径再按文件位置 resolve,非字符串参数天然缺席等价于从文件目录起算)。分段 join / 多段 resolve / 模板段全命中,既有用法零误报。

P2-②:受保护 Tier-1 文本角色被移出 semantic——成立,已修(这条对治理合同的引用很准)

核实:text-secondary / text-secondary-cross 是 Tier-1 slot,治理合同 §3.2 明确「名称与用途延续」;却被 PROTECTED_IDS 统一 register-only 分支移出 semantic JSON——DS-8 将无法从新真相源生成它们。U2 保护限制的是改值须裁决,不是禁止迁移。

修法:ProtectedRulemode——Tier-1 slot(这两个)semantic-modeled:照常建模 + 保留 protected 元数据(已重新生成进 semantic,逐值一致守卫验证与冻结快照相符);Tier-3 singleton(annotation-accent / login-brand-*)维持 register-only(治理合同「保留原位,逐项裁决,默认不动」,本 PR 未裁决它们进 semantic)。守卫按 mode 分支校验,oracle 测试与 README 同步。

验证:typecheck 通过;35 单测全绿;全仓扫描零命中零误报;生成器字节稳定。CI「缺席」仍是上轮在跑,本轮 push 触发新一轮 CI 以那轮为准。

dispatch:c501f0f11cefcf26

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread packages/design-tokens/src/guards.ts Outdated
Comment thread packages/design-tokens/src/guards.ts Outdated
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>
@kirozeng

kirozeng commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

本轮跟进已推上(commit f26072ca3),处理 Codex 的两条新 P2,都成立、都修了:

P2-①:import.meta.glob 漏检——成立,已修

实测确认:import.meta.glob('../../design-tokens/src/**/*.json') 两通道漏检。意见引用的仓内用例也核实了(packages/lizi-mcps/src/browser/recipe-loader.ts 确实是这种 Vite 加载形态)。修法:import.meta.glob( 成为第十类说明符语境,相对 glob 模式按文件位置 resolve;既有 recipes 用法不误报。

P2-②:语境残留误报——成立,已修(抓的是我此前重写时引入的真 bug)

实测确认:import x from './x'; const hint = 'packages/design-tokens/src/x'; 误报。根因:SPECIFIER_PREFIX_RE\bfrom / \bimport 分支在早前重写时丢失 $ 锚定——匹配「语境里任何位置有 import 字样」而非「语境以 import 结尾」,数据字符串被剥除层错误保留后由裸路径模式误报。修法:所有分支共享末尾 $ 锚定,只匹配紧邻当前开引号的调用语境。

反证:残留语境三种形态不误报;此前九类语境全部命中形态(23 个断言)回归全绿——锚定收紧零牺牲。

验证:typecheck 通过;37 单测全绿;全仓扫描零命中零误报。CI「缺席」仍是上轮在跑,本轮 push 触发新一轮 CI 以那轮为准。

dispatch:839fc3d6ea83ebdc

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread packages/design-tokens/src/guards.ts Outdated
Comment thread packages/design-tokens/src/guards.ts Outdated
@MagicLizi

Copy link
Copy Markdown
Contributor

@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>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@kirozeng

kirozeng commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

本轮跟进已推上(commit 947e8e8a5),处理 Codex 的两条新 P2,都成立、都修了:

P2-①:node:fs/promisesopen 漏检——成立,已修

实测确认:const file = await open('../../design-tokens/src/semantic/color.json'); await file.readFile() 两通道漏检——openSync 在列表里但异步 open 不在。修法:open 加入 fs API 路径语境;预检也补了 open 字样(裸 open('…') 不含 File/Sync,此前连剥除层都进不去——修的时候发现的连带问题)。误报核查:window.open 的 URL 参数不以 . 开头天然过滤,仓内实测零误报。

P2-②:.mts / .cts 扫描缺口——成立,已修

核实:扫描器扩展名只有 ts/tsx/js/mjs/cjs.mts/.cts 文件读取前就被跳过;仓内确有 .mts 使用(意见引用准确)。修法:扩展名补 mts|cts,并用临时 fixture(.mts + .cjs 消费者各一)直接验证扫描器命中——常驻测试防退化。

验证:typecheck 通过;38 单测全绿;全仓扫描零命中零误报。CI「缺席」仍是上轮在跑,本轮 push 触发新一轮 CI 以那轮为准。

dispatch:78d25b385e16a7a5

@MagicLizi MagicLizi removed the status:awaiting-bot-review 等外部审查机器人表态(review-pr 自动维护,仅展示) label Sep 2, 2026
@kirozeng

kirozeng commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

已核实本轮反馈,无需代码改动。逐条说明:

1. 「2 条 review conversation 未 resolve」——已过时:该提示发出于上一轮 push 之后,所指的两条 Codex thread(fs/promises.open.mts/.cts)在上轮收口时已回复并 resolve。当前实测 PR 上零条未解决 conversation,auto-review 的阻塞已解除。

2. Codex usage limits 通知——纯信息性:配额在 Codex 侧管理、会自动恢复,不是本 PR 的问题。配额恢复后的新 review 意见(如有)会另行跟进。

3. CI 红灯「缺席」——已转绿:扫描时 Windows unit tests 还在跑;现在 947e8e8a5 上 Windows 双分片、Linux 双分片与聚合 required context 全部 pass。CI 无遗留问题。

本轮 head 无变化(947e8e8a5),push 为空操作。

dispatch:97a2953f80603487

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:large-diff 改动量较大(review-pr 自动维护,仅展示) touches:new-dependency 新增第三方依赖(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示) touches:security 改动碰到安全边界(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants