Commit d91d352f9da253577d662c303194c6b2f3139189

Authored by yibo
1 parent 7764f081

docs(28): 守卫清单补第四条 runs-root-single-holder

27-P3C 批 1 沉淀的不变式测试,与前三条守的是同一件事:同一个事实
只能有一处持有者。断言的是「凡是把 process.env.GRAPH_RUNS_DIR 绑到
标识符上的模块,那个标识符必须在代码里真正被用到」。

来历一并记下:goal-contract.js 里曾有一行 RUNS_ROOT,注释写着
「与 graph-engine.RUNS_ROOT 是同一个变量(测试隔离在用)」,全文件
却零引用。声明了意图、代码不兑现的常量比没有更容易骗人 —— 读的人
会据此认为该模块认这个覆盖,然后写侧写进临时目录、读侧去仓库里找,
两个方向都静默错位。

四条共有的「样本非空」前置断言仍是重点:扫不到文件时这类测试会以
「零违例」的形式全绿,那正是它自己变成零调用方的方式。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
docs/todo/system-design/28-followups.md
... ... @@ -95,7 +95,7 @@
95 95  
96 96 ## 五、已经立起来的守卫(别重复造,也别删)
97 97  
98   -这三条是本轮沉淀的不变式测试。它们守的都是「同一个事实只能有一处持有者」,
  98 +这几条是沉淀下来的不变式测试(前三条出自 agent 目录重构那一轮,第四条出自 27-P3C 批 1)。它们守的都是「同一个事实只能有一处持有者」,
99 99 而且都带**「样本非空」前置断言** —— 少了那一条,扫描路径一写错就会以「零违例」的形式全绿,
100 100 一条永远通过的不变式测试和没有这条测试是一回事。
101 101  
... ... @@ -104,6 +104,12 @@
104 104 | `agents-root-single-holder.test.js` | 本体根路径只能由 `locator.AGENTS_ROOT` 持有 | 精确点名到文件行号 |
105 105 | `no-stale-templates-path.test.js` | 活定义里不许出现已死的 `system/templates`(判据:git 跟踪的才是定义,未跟踪的是运行态产物) | 同上 |
106 106 | `repo-hygiene.test.js` | tracked 与 ignored 不重叠 | 列出越界文件 |
  107 +| `runs-root-single-holder.test.js` | 凡是把 `process.env.GRAPH_RUNS_DIR` 绑到标识符上的模块,那个标识符必须在**代码里**(不是注释里)真正被用到 | 精确点名到文件行号 |
  108 +
  109 +> 第四条的来历值得记:`goal-contract.js` 里曾有一行 `const RUNS_ROOT = process.env.GRAPH_RUNS_DIR || null`,
  110 +> 注释白纸黑字写着「与 graph-engine.RUNS_ROOT 是同一个变量(测试隔离在用)」,**全文件却零引用**。
  111 +> 一个声明了意图、代码却不兑现的常量,比没有这个常量更容易骗人 —— 读的人会据此认为该模块认这个覆盖。
  112 +> 它同时也是「实现在、零调用方」这个惯犯模式的又一例(本仓库有人数到第五次,有人写「十几次」)。
107 113  
108 114 **改动它们之前先想清楚**:这三条的价值全在于「红了才有用」。
109 115 放宽判据、加例外、或者把断言改成永远成立的形式,等于把守卫拆掉 ——
... ...