diff --git a/client/electron/test/CRITERIA.md b/client/electron/test/CRITERIA.md index 66a6a79..92e8455 100644 --- a/client/electron/test/CRITERIA.md +++ b/client/electron/test/CRITERIA.md @@ -406,6 +406,49 @@ pi 报的层 10:上一版那条"对照"(未改坏必须 rc=0)能被一个* 到期那 6 条判据(`harmony-appearance`、`harmony-logic`、`cross-client-theme`、 `appearance-defaults`、`harmony-admin`、`harmony-imageprep`)的升级。 +### 6.1.6 ★★ **"孩子管不着的东西"在因果判据里不存在**(dsh 2026-09-18,比"边际递减"更硬的停止理由) + +pi 在复核层 10 时提出:层 10 的修法(要求 `RED ` 行)**推翻了层 7 的原则** +("锚点不能落在被守对象的自述上")—— 把锚点从"行为"搬回了"自述"。 +**这条我核对成立**(`:2674` 的原则与 `:2774` 的修法同住一个文件)。停止理由因此从 +"成本 > 收益"升级为**"层 11 的修法必须推翻层 7 或层 10,两者互斥"**。 + +★ 但我把 pi 的**建议修法①也测了**,得到一个**比原则互斥更强**的结论: + +**pi 的 ① 不是逃逸口。** 它主张"改坏**孩子读的外部依赖**(而非孩子自己的源码) +⇒ 通道没有可检的信号"。实测(`exitcode-selftest` + 假体 + 通道): + +``` +通道只盯外部 summary.py ⇒ 干净树 rc=0 ✓,改坏外部 ⇒ rc=1 ⇒ ① 有效 +通道**同时**盯外部 summary.py + 自己源码 ⇒ 干净树 rc=0 ✓,改坏外部 ⇒ rc=1 + ⇒ **① 被绕过**(同刻对照:red 与基线一致、diff 0 行) +``` + +★★ 根因(这是这一整串的**真正的底**): + +> 因果判据的要求是:**改坏 X ⇒ 孩子的判词必须变**。 +> ⇒ 这要求 X **因果上游**于孩子的判词 ⇒ **孩子必须读 X**。 +> ⇒ 孩子读得到 X ⇒ **孩子能观察 X 被改坏**(同 uid、可读,`summary.py` 是 `-rw-r--r--`)。 +> ⇒ **"孩子管不着的东西"被因果判据自身的定义排除掉了。** + +⇒ 所以层 7 那句"锚点必须落在**它管不着**的东西上"在这个接口里**没有可满足的解**: +· 要"因果有效",X 就必须被孩子读到; +· 要"孩子管不着",X 就不能被孩子读到; +· **二者不可同时成立** ⇒ 不是"还没爬到",是**接口本身没有解**。 +★ 唯一出路是**换接口**(父进程自己算、或进程外观测)—— 那不是"再修一条判据"。 + 实测本仓**进程外观测通道 grep 0 处**(`strace`/`inotify`/`atime` 差分全无), + 且孩子的输出只有 stdout + 退出码,**两者都由孩子自己产生**。 + +⇒ ★ 这与 pi 的"原则互斥"是同一结论的**两个证明**:pi 证明的是**两条原则不能共存**, + 我证明的是**这个接口里不存在满足"管不着"又要"因果有效"的对象**。 + **两者都指向"停",而后者不依赖"哪条原则优先"的判断。** + +⚠️ 顺带记一条**我自己的量错**(与 pi §四 同族,我这一串第 N 次): +我用 `python3 heredoc` 拼通道时,**引号嵌套写出了 SyntaxError** ⇒ 通道**在干净树上就崩**, +`rc=1`。我差点把它读成"通道生效"。**是 stderr 里的 `SyntaxError` 救了我** —— +⇒ **"量到 ≠ 量对了"**:任何构造出的攻击,**第一句读数必须是"它在干净树上无症状吗", +且必须看 stderr 而不是只看 rc。** + ★ 层级表(**每层都是一根轴**):写法(4) → 存在性(5,"它还在吗") → 行为(6,"它做了吗") → **自述(7,"它说的话可信吗")**。