项目长期维护的硬约束。任何代码改动违反这里任一条都应该被打回重做。
项目长什么样、节点叫什么、谁先谁后、怎么分组、谁连谁——都由 AI 写进 features.json,不要写死在前端。
判断标准:如果这个决策"换个项目就要重新做一次",它属于语义层,必须放 JSON 里。
渲染、布局算法、拖动、缩放、动效、容错、视觉系统——前端独占。
判断标准:如果这个能力"任何 features.json 都需要",它属于通用能力,写在前端。
前端不做启发式推断。AI 知道答案就让它写出来。
例如:
- 不要在前端"按某种规则推断 Epic 之间的主线"——让 AI 写
epic_flow - 不要在前端"按目录路径猜业务名"——让 AI 写
epic.name - 不要在前端"按代码复杂度估算 confidence"——让 AI 自己评估
| 类型 | 归属 | 例子 |
| ----------------- | ------------- | ----------------------------------------------- |
| 项目 / 业务相关 | features.json | 节点顺序、命名、分组、关系、注释、置信度 |
| UI 通用能力 | 前端 | 拖动、缩放、选中、详情面板、视图切换、搜索 |
| 视觉系统 | 前端 | 颜色、字体、间距、动效、暖白主题 |
| 兜底 / 容错 | 前端 | 未知 enum 不崩、ErrorBoundary、自适应布局 |
| 布局算法实现 | 前端 | ELK / dagre / 网格 / 测量后布局——但顺序由 JSON 决定 |
| 看起来"很聪明"的做法 | 违反原则 | 正确做法 |
| ------------------------------------------------- | -------- | ------------------------------------- |
| 前端启发式生成 epic_flow(看 cross_feature 推断) | 原则 3 | 让 AI 写 epic_flow |
| 前端按目录前缀自动分组 | 原则 1 | 让 AI 写 epicId |
| 前端按节点边数算 confidence | 原则 3 | 让 AI 评估 confidence |
| 节点固定宽度 280px 写死 | 原则 2 | 自适应宽度 + 测量后布局 |
| 前端按依赖路径自动推断 step 顺序 | 原则 1 | 让 AI 写 flow 边 |
| features.json 里写视觉相关字段(如颜色) | 原则 2 | 视觉由前端按 role/kind 映射 |
每次想在前端写 if (xxx) ... 或启发式逻辑前,问自己:
- 这个决策换个项目会变吗?
- 会变 → 应该让 AI 写进 features.json
- 不会变 → 前端写
- 这是"渲染怎么做"还是"渲染什么内容"?
- 怎么做 → 前端
- 什么内容 → JSON
- AI 知道答案吗?
- 知道 → 让它写出来,前端按字段渲染
- 不知道(如视觉细节) → 前端硬编码
任一条命中"应该让 AI 写",就别在前端写。
- 力导向作为概览主布局:违反原则 3——力导向是探索算法,给不出"主线"。改为让 AI 写
epic.order,前端按 order 排。 - 节点固定宽度:违反原则 2——视觉决策被语义文件影响(features.json 长度可能让节点超出固定宽度)。改为自适应 + 测量后布局。
- 静态分析(早期 ts-adapter):违反原则 1——结构层是代码事实,但语义层 AI 才知道。整套 ts-adapter 退役,改为 AI 直接产出 features.json。