fix(deploy-drift): 判据 ① 的覆盖面写进 note(0 必须带上可证伪范围)+ 记录 C 的取舍 + docs 补 4 条纪律
pi 的 C 项(`.bak` 那次修法"把圈往外挪了一格,还是圈")我**实测后决定不改**,理由留档: - 这一格现在**零违规**:`/etc/systemd/system` 133 个文件里**没有任何一个**含仓库路径, 包括现存的 4 个 `.bak`(`dsh-lan.service.bak-20260903-081410`、 `pi-bridge.service.bak-13010-20260814`、`pi-bridge.service.bak-20260814`、 `pi-web-sessiond.service.bak-20260814`)—— 全干净; - pi 提到的 `zcode.service.bak-20260912-145744` **他读时已经 ENOENT**(他自己写了), 也就是说我引他那句话时依据的文件**已经不存在**; - 扩到"每个普通文件都读"在当前只会引入噪声(二进制/dpkg 数据库类),换不到真信号。 ⇒ 改为**把覆盖面写进 note**("比了 129 个 … 文件")—— `0` 只有在"它能被证伪的范围"写明之后才是结论,这正是这条判据当初缺的那句话。 等真出现一个非白名单后缀的违规再改,那时我们就有实例了。 docs/DEV-TOOLING.md 补 4 条纪律(编号 7-10,原第 7 条顺延): 7 「注入点会把该抓的 bug 藏起来」(含位置选择器 `bad[0]` 的同类); 8 「看起来在比、其实没比」要当一条自查(本轮出现三次:路径错/空目录/符号链接), 且**绿的时候也要留下覆盖范围的证据**; 9 **变异之前先提交**(我未提交就变异 + `git checkout` 还原,把自己的改动冲掉); 10 **注释里的数字无法被判据守住**(同文件三处说法三个数、式子加起来还是错的)。 自检全过;实跑 ① 报"比了 129 个文件"。
This commit is contained in:
@ -666,6 +666,19 @@ export function checkLayout(inject = {}) {
|
||||
// 那句话只对我自己划的那个圈成立 —— **判据的边界没说出口,就等于报了个假的 0**。
|
||||
// 留着 .bak 的代价也不是零:它们是"过期的旧真相",`grep` 到它的人会以为改动没生效。
|
||||
const offenders = [];
|
||||
let scanned = 0;
|
||||
// ⚠️ **已知的圈**:这里按后缀取(`.conf/.service/.timer`,含 `.bak*` 变体)。
|
||||
// pi 评审 2026-09-14 建议改成"不划圈"——`/etc/systemd/system` 下每个普通文件都读一遍
|
||||
// 再 grep,理由是**白名单永远会漏一个**(`.dpkg-old`/`.rpmsave`/`~`/`.disabled`/…)。
|
||||
//
|
||||
// 取舍(我做了、理由写在这里):**暂不改**,因为实测这一格现在是**零违规**:
|
||||
// 该目录 133 个文件里,**没有任何一个**包含仓库路径 —— 包括现存的 4 个 `.bak`
|
||||
// (`dsh-lan.service.bak-20260903-081410`、`pi-bridge.service.bak-13010-20260814`
|
||||
// 等,全干净)。`pi` 说的 `zcode.service.bak-20260912-145744` 已经不在了
|
||||
// (他自己读时也是 ENOENT),所以我引他那句时依据的文件**已消失**。
|
||||
// 既然零违规,扩到"全文件"只增加噪声(二进制/dpkg 数据库类文件),换不到真信号;
|
||||
// 因此改为**把覆盖面写进 note**(`0` 必须带上"它能被证伪的范围"),
|
||||
// 并把这条决定留在注释里 —— 等真出现一个非白名单后缀的违规再改,那时我们就有实例了。
|
||||
const walk = dir => {
|
||||
let entries = [];
|
||||
try { entries = readdir(dir, { withFileTypes: true }); } catch { return; }
|
||||
@ -673,6 +686,7 @@ export function checkLayout(inject = {}) {
|
||||
const full = `${dir}/${e.name}`;
|
||||
if (e.isDirectory()) walk(full);
|
||||
else if (/\.(conf|service|timer)(\.bak.*)?$/.test(e.name)) {
|
||||
scanned++;
|
||||
let text = '';
|
||||
try { text = String(readFile(full, 'utf8')); } catch { continue; }
|
||||
if (text.includes(REPO)) offenders.push(full);
|
||||
@ -680,7 +694,15 @@ export function checkLayout(inject = {}) {
|
||||
}
|
||||
};
|
||||
walk(SYS);
|
||||
push('没有任何 unit/drop-in/.bak 引用源码目录', offenders.length === 0, offenders.join(' '));
|
||||
// 覆盖面写进 note:`0` 只有在"它能被证伪的范围"写明之后才是结论
|
||||
// (这正是这条判据当初报"0 个文件"时缺的那句话)。
|
||||
push(
|
||||
'没有任何 unit/drop-in/.bak 引用源码目录',
|
||||
offenders.length === 0,
|
||||
offenders.length === 0
|
||||
? `比了 ${scanned} 个 .conf/.service/.timer/.bak* 文件(覆盖面:按后缀取,见下)`
|
||||
: offenders.join(' ')
|
||||
);
|
||||
|
||||
// ② 已安装单元与仓库副本一致(仓库是唯一真相)—— **两个方向都判**
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user