札记

真理体系

元真理

去掉到不能再去掉为止。

这是所有判断的根。当层与层之间冲突时,离这条线更近的决策赢。


结构

真理体系不是一个"系统",是一个判断函数:

f(任意决策) → {correct: bool, direction: vector}

每个维度是这个函数在不同输入域的实例。


代码维度

判断标准: 认知负载 = 嵌套深度 + 抽象层数 + 文件数

操作

判断问题

新增函数

它被调用几次?1次则内联

新增组件

它在几处复用?1处则合并

新增抽象

去掉它语义损失了吗?没有则删

新增注释

逻辑本身能说清吗?能则不写

新增测试

断言把输出锁成一个点了吗?没有则它招供「这部分行为我没定义」

信号(机器可读):

  • TypeScript 类型错误 = 0

  • ESLint 违规 = 0

  • 单次调用的独立函数 = 0

  • 组件嵌套深度 ≤ 3

  • 松断言(toContain/范围/真值/expect.any)= 0(teact 严格性闸,eslint.config.mjs glob **/*.test.ts(x);本质锁不成点的随机/时序/路径带注释 inline-disable 豁免)

测试不是独立维度——「跑得过」是机器判定(AI 已闭环),「断言够紧」是机器规则(上 lint)。两者都落在代码维度的信号里,和「ESLint 违规=0」同列。详见 packages/teact/DESIGN-verifier-role.md


UI 维度

判断标准: 视觉权重 = 语义权重。装饰 = 噪音。

操作

判断问题

新增视觉元素

它承载语义吗?不承载则删

两元素视觉权重相同

语义也相同吗?不同则其中一个错

新增颜色

它有唯一的语义角色吗?没有则用已有颜色

新增间距

在 8px 网格上吗?不在则调整

信号:

  • 视觉回归 diff < 0.1%

  • 对比度 ≥ 4.5:1

  • 间距在 8px 网格上

  • 每个颜色只有一个语义角色


产品维度

判断标准: 用户的认知负载。功能是负债,不是资产。

加功能前:

  1. 用户现在因为没有它而失败?(没有则不加)

  2. 加了之后用户需要学习新概念吗?(需要则重新设计)

  3. 和已有功能语义重叠吗?(重叠则合并或砍一个)

删功能前:

  1. 有用户因为它而成功完成任务?(有则保留)

冲突仲裁优先级: 简洁 > 功能完整 > 灵活性


架构维度

判断标准: 依赖 = 耦合 = 认知负载。

信号:

  • 循环依赖 = 0

  • 模块边界违规 = 0

  • 依赖深度 ≤ 5

工具:madgedependency-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

中期:

  • 视觉回归测试接入

  • 产品埋点建立(任务完成率、放弃点)

  • 干预日志定期回顾,更新规则

长期:

  • 干预日志足够多后,反推各层权重

  • 元层从硬编码规则变成从数据里涌现的判断模式