# 审查指南 > 这份文档面向**独立审查者**。目标不是"确认代码存在",而是**尝试证伪它**。 > 如果你没有推翻任何一条,请说明你是怎么试的 —— "没找到问题"必须伴随"我试过什么"。 --- ## 一、先复现,再读代码 **顺序很重要**:先把东西跑起来、亲手装一个 mod、亲眼看它渲染出来,**再**去读实现。 只读代码会被"看起来对"骗过去。 ### 1.1 环境 - Windows + Node ≥ 22 - `playwright-core`(自检脚本要用):`/node_modules/playwright-core` - 跑自检: ```bash cd dsh-motion-background # clone 出来的目录名 node verify.mjs ``` 期望:全部通过,退出码 0。 ### 1.2 装进真实的 DSH(**这一步不能省**) 自检是离线的,**真机能暴露模拟环境覆盖不到的问题** —— 但别把这句话读成"离线自检只要绿就没问题": 2026-09-25 的独立审核表明,最严重的几类问题(关键分支没覆盖仍全绿、源码字符串当行为证据、 报告器不是 fail-closed)**在离线就能发现**,前提是自检本身也要被审计(见 §C/§C2)。 ```bash # 1) 在 DSH profile 里挂上这个包(link 到仓库目录) # 改 /profiles/web/package.json: # dependencies: 加 "dsh-motion-background": "link:<仓库绝对路径>" # dsh.profile.bundles: 末尾加 "dsh-motion-background" # 2) 在 profiles/web/node_modules/ 下建 junction 指向仓库目录 # 3) 重启宿主(改了 dsh.client.inject ⇒ 必须重启,刷新页面不够) ``` **拿到真实页面**:宿主启动时 stdout 会打印带令牌的 URL(`dsh web: http://127.0.0.1:3080/?token=...`), 用它可以在 headless 里打开真实页面;只刷新浏览器拿不到。 ### 1.3 亲手装一个 mod ```bash mkdir -p mods/my-test cp mods/meteor/fragment.glsl mods/my-test/ # 写一个 mod.json,id 改成 my-test ``` 刷新页面 ⇒ 设置里应多出「my-test」。**删掉文件夹** ⇒ 应消失。**这两个方向都要试。** --- ## 二、必查清单(逐项,附"怎么证伪") ### A. 红线:内核里有没有第三方着色器代码 - 用**第三方着色器库的函数名清单**去全文搜索。⚠️ 本文档**故意不列出**这些串,也**不写出 取自哪个库** —— 列了的话,你搜自己就会命中这份文档,反而制造噪声;写出名字则是在给这个 仓库与那个库之间制造不必要的关联。 做法:自己挑一个公开的着色器库,取其工具模块里导出的函数名,拿那批名字来 grep。 内核里**一个都不该有**。 - **这条检查的效力边界**(独立审核要求写清):它是对**某一批已知特征**的**高价值探测器**, **不是**"不存在任何第三方着色器代码"的证明 —— 换来源、把函数改名、或改写到无法按名字识别, 都不在它的射程内。请**务必带阳性对照**(拿同一套探测器去搜一个已知含第三方着色器代码的样本, 确认它能命中),否则"0 命中"既可能是干净、也可能是探测器失灵。 - 另外搜三个结构性特征: 1. **复杂的顶点着色器** —— 带 sizing / 旋转 / offset / UV 分空间那一整套的,多见于成套着色器库; 本内核的应当只是"位置 → UV"的极简全屏 quad。出现前者即可疑。 2. **内联的 base64 图片**(成套着色器库常拿它当噪声贴图)—— 内核里不该有任何图片数据。 3. **`mods/` 之外的文件里出现 GLSL** —— GLSL 只允许出现在 `mods/*/fragment.glsl` 与 `mods/*/vertex.glsl`。 ### B. mod 机制真的可插拔吗 | 试 | 期望 | |---|---| | 放一个合法 mod 进去 | 刷新后出现在效果下拉里 | | 删掉它 | 刷新后消失 | | 放一个**缺 `mod.json`** 的文件夹 | 进 `errors`,**其他 mod 照常可用** | | 放一个 `fragment.glsl` 是**非法 GLSL** 的 mod | 同上;且**页面不崩、设置面板照常打开** | | 两个文件夹声明**同一个 `id`** | 只有一个生效,另一个报重复 —— **不应出现两个同值选项** | | `mod.json` 的 `id` 写成 `../evil` 或含空格/大写 | 被拒 | | `colors` 写成一个非法值 | 被拒(**不应静默当成默认值**,否则作者拿到"颜色不对但看起来能跑"的效果) | | 删掉整个 `mods/` 目录 | 不崩;面板提示"当前没有可用效果" | **关键**:以上每条都要确认 **HTTP 200 且返回结构完整**(打开 `/motion-background/mods` 直接看 JSON)。 ### C. 自检有没有"假绿" 这是本项目最怕的失败模式。**不要靠"读代码觉得对"**:本仓库把它做成可复跑的**反证驱动器**: ```bash node mutations.mjs # 基线必须绿,20 条变异必须让对应断言变红;写出 FALSIFICATION-.md ``` > ⚠️ 跑之前先读 `README.md` 的「坑」一节:连跑整套会创建/清理大量夹具目录, > 若**调用方 Agent 运行时**注入了带回合配额的删除垫片,整套可能被中途打断。 下表只列**最重要的一批**;权威清单是 `mutations.mjs` 里的 `CASES`(1 基线 + 20 变异), 每条都自带 `expect` 判据(变红的断言必须命中该模式)与可选的 `mustIntroduce`(见下)。 | 变异 | 期望变红的断言 | |---|---| | `--mutate=bg-only`(mod 只输出底色) | C 组「画面真的画出来了 / 不是一片纯底色」 | | `--mutate=no-isolation`(宿主半见坏 mod 就中断整轮扫描) | B 组隔离性 | | `--mutate=no-draw`(删掉 `gl.drawArrays`) | 像素断言 + E4「拖动真的触发重画」 | | `--mutate=no-fallback`(候选循环只试第一个) | E5「首选失败 ⇒ 真的回落并出画」 | | `--mutate=direct-register`(绕开 `slots.inject`) | 设置注册相关 | | `--mutate=no-scan-sort`(删掉宿主半扫描前的排序) | 「源码级兜底」断言(行为层在按名枚举的文件系统上分不出来) | | `--mutate=media-traversal` / `media-segments` | 媒体路由「22 种非法路径全部 404」 | | `--mutate=media-keep-el` / `media-loud` / `media-noplay` | 「切走后不留 `