> 来源:PR #34(Batch 5 · Cells)六维度 review · 包边界 + TS 维度 Cx3 finding,留待人工决策。 ## 现状 `CellManifest` / `CellEntry` / `CellSlice` 类型在两处**手工维护双份**: - `tools/cell-manifest/src/types.ts`(工具本地,自包含) - `packages/devboard/src/manifest/types.ts`(包内 canonical) 漂移守卫依赖生成物 `cells.generated.ts` 上的 `: CellManifest`(import 自 devboard `./types`)注解,在 `@gocell/devboard typecheck` 时触发。 ## 问题:守卫实为 Medium 而非注释所称 Hard 注解只能守住「生成物结构满足 devboard 类型」**单向**约束。若开发者只在 devboard `types.ts` 加一个**可选**字段、未同步 tool 的 `types.ts`,生成物会少该字段但 typecheck 仍通过(`CellManifest` 非 exact type)→ **静默漂移**。按 `ai-robust.md`,手工双份 + 单向 typecheck 属 Medium,不是「违反不可表达」的 Hard。 ## 约束 工具须自包含(`ai-robust.md`/工具注释:node 脚本不可 reach 进 package 的 `src/`),故无法直接 import devboard 类型 —— 双份是该约束的必然结果。 ## 三级方案 - **最小**:保留双份,修正 tool `types.ts` 文件头注释,将守卫如实标注为 Medium(不再声称 Hard)。 - **彻底**:以 codegen 单源派生 tool 的 `types.ts`(从 devboard canonical 类型生成)+ CI `git diff --exit-code` 守门 → 升级为 Hard(违反不可表达),与 `tools/codegen` + contracts 守门同构。 - **重构**:把 `CellManifest` 类型抽到一个无运行时依赖的纯类型入口(如 `@gocell/contracts` 风格的只读类型包),tool 与 devboard 共同消费单源。 ## 关联 `.claude/rules/gocellweb/ai-robust.md`(三档分级 / 载体决策 / Soft 严禁立项)。
Activity