真理体系
元真理
去掉到不能再去掉为止。
这是所有判断的根。当层与层之间冲突时,离这条线更近的决策赢。
结构
真理体系不是一个"系统",是一个判断函数:
f(任意决策) → {correct: bool, direction: vector}每个维度是这个函数在不同输入域的实例。
代码维度
判断标准: 认知负载 = 嵌套深度 + 抽象层数 + 文件数
操作 | 判断问题 |
|---|---|
新增函数 | 它被调用几次?1次则内联 |
新增组件 | 它在几处复用?1处则合并 |
新增抽象 | 去掉它语义损失了吗?没有则删 |
新增注释 | 逻辑本身能说清吗?能则不写 |
新增测试 | 断言把输出锁成一个点了吗?没有则它招供「这部分行为我没定义」 |
信号(机器可读):
TypeScript 类型错误 = 0
ESLint 违规 = 0
单次调用的独立函数 = 0
组件嵌套深度 ≤ 3
松断言(toContain/范围/真值/expect.any)= 0(teact 严格性闸,
eslint.config.mjsglob**/*.test.ts(x);本质锁不成点的随机/时序/路径带注释 inline-disable 豁免)
测试不是独立维度——「跑得过」是机器判定(AI 已闭环),「断言够紧」是机器规则(上 lint)。两者都落在代码维度的信号里,和「ESLint 违规=0」同列。详见
packages/teact/DESIGN-verifier-role.md。
UI 维度
判断标准: 视觉权重 = 语义权重。装饰 = 噪音。
操作 | 判断问题 |
|---|---|
新增视觉元素 | 它承载语义吗?不承载则删 |
两元素视觉权重相同 | 语义也相同吗?不同则其中一个错 |
新增颜色 | 它有唯一的语义角色吗?没有则用已有颜色 |
新增间距 | 在 8px 网格上吗?不在则调整 |
信号:
视觉回归 diff < 0.1%
对比度 ≥ 4.5:1
间距在 8px 网格上
每个颜色只有一个语义角色
产品维度
判断标准: 用户的认知负载。功能是负债,不是资产。
加功能前:
用户现在因为没有它而失败?(没有则不加)
加了之后用户需要学习新概念吗?(需要则重新设计)
和已有功能语义重叠吗?(重叠则合并或砍一个)
删功能前:
有用户因为它而成功完成任务?(有则保留)
冲突仲裁优先级: 简洁 > 功能完整 > 灵活性
架构维度
判断标准: 依赖 = 耦合 = 认知负载。
信号:
循环依赖 = 0
模块边界违规 = 0
依赖深度 ≤ 5
工具:madge 或 dependency-cruiser 接入 CI。
元层:人工干预日志
这是体系中最值钱的部分。
每次修改 AI 的输出,记一条:
## YYYY-MM-DD
AI 做了什么:
我改了什么:
为什么:
规则更新:积累的干预日志 = 元层权重的训练数据 = 判断力变得可运行。
文件位置:docs/truth-log.md
反馈循环
AI 执行
→ 各维度信号采集
→ 偏差报告注入 AI 上下文
→ AI 修正
→ 人工干预时记录日志
→ 日志更新规则
→ 规则注入下一轮人从循环中逐步退出,只在边界被触及时介入——补充新的判断维度,处理 AI 还发现不了自己缺失的未知。
实施顺序
现在立刻:
CLAUDE.md写入元真理和各维度判断规则(已完成)创建
docs/truth-log.md,开始记录干预
短期:
ESLint 补充单次调用检测规则
Design tokens 文件建立(
src/styles/tokens.ts)CI 输出结构化为 AI 可读的 JSON
中期:
视觉回归测试接入
产品埋点建立(任务完成率、放弃点)
干预日志定期回顾,更新规则
长期:
干预日志足够多后,反推各层权重
元层从硬编码规则变成从数据里涌现的判断模式