# REPORT-GAPFILL —— 军火库两处真空白的可执行规则(起草) > 起草会话:branch worker。**未修改仓库任何文件**,只起草。 > 口径时点:见各节「统计时点」。所有数字标明口径与计数命令。 ## 0. 前置阅读记录 - `/tmp/vi-agents/PITFALLS.md`:`wc -l` = **1510**;**已逐行读到第 1510 行**(末条为第 95 条)。 - `/tmp/vi-agents/REPORT-SELFUSE.md`:`wc -l` = **586**。 - 本报告对应「①站内链接:相对式 vs 绝对 URL」「②骨架图重复内容的单一事实源」两处空白。 ## 1. 两条规则正文(见 DRAFT 两份) - 规则 A:`/tmp/vi-agents/DRAFT-GAPFILL-链接写法.md` - 规则 B:`/tmp/vi-agents/DRAFT-GAPFILL-单一事实源.md` ## 2. 现状统计 (待填) ## 3. 验证方法 (待填) ## 4. 违规面盘点 (待填) ## 5. 反向检索记录 (待填) ## 6. 本报告自己的洞 (待填) --- # 1. 现状统计 **统一口径与时点**(全部实测,非转述): - 统计时点:**2026-10-14 20:0x**,`git HEAD = 71e82e8b6eff`(`git log -1`)。 - 仓库根:`/Users/lisonghao/code/world-map`。 - 语料:全库 `.md`,**排除 `.git` / `node_modules` / `.tmp` / `cache` / `out` / `dist`**,= **899 个文件**。 - 交叉口径独立复算(Python `os.walk` vs `find -iname '*.md'`):**899 = 899**(PITFALLS 81 口径)。 - 含 `.tmp/` 则为 **927**(`.tmp/` 下 28 个 md)。前序 REPORT-SELFUSE 用的 927 是含 `.tmp` 的口径; **本报告一律用 899**,跨报告比较时必须先对齐这一项。 - 计数工具:`/tmp/vi-agents/gapfill_census.py`、`gapfill_probe2.py`、`gapfill_detail.py`、`gapfill_layerb.py` (均为文件脚本 + `__main__` 保护,PITFALLS 64)。原始结果另存 `gapfill_census.json`。 ## 1.1 站内链接分布(空白①的现状) | 写法 | 条数 | 占非外部链接比 | 口径 | |---|---:|---:|---| | root-absolute `/...` | **3,905** | 94.8% | href 以 `/` 开头 | | dot-relative `./` `../` | **215** | 5.2% | href 以 `./` 或 `../` 开头 | | 裸相对式(含 `.md`) | **1** | — | `meta/cicd.md:92`,href 字面为 `href`,是表格里的示例文本,非真链接 | | 纯锚点 `#...` | **181** | 不计入 | 其中**裸 `#` 59 条**(无锚点名,跳回页首);真锚点 122 条,集中在 3 个文件 | | 外部 `http(s)://` | **739** | 不计入 | 指向站外,不受本规则约束 | | **合计 `[text](href)` 语法** | **5,041** | — | 含图片 `![]()` 88 条 | **派生口径(同样是实测)**: | 派生项 | 数 | 说明 | |---|---:|---| | 含 root-absolute 链接的文件 | **358 / 899** | 分母=899 | | root-absolute 且以 `.md` 结尾 | **811**,涉及 **143** 个文件 | 例 `/design/01-overview/translation.md` | | root-absolute 且以 `.html` 结尾 | **0** | 既有规则的 `.html` 禁令**零违规** | | 跨页锚点 `/path/#anchor` | **316**,涉及 23 个文件 | 路径部分被检查器查,**锚点部分从未被查过** | | 指向代码托管站(github/gitee/gitlab)的外链 | **2** | `meta/aesthetics-research/vi-intake.md:83`(notofonts)、`meta/cicd.md:272`(Gitee 帮助页) | | 本仓库声明过的公共站点 URL | **0** | 全库搜 `http(s)://<含 world-map/worldmap/gitee.com/sebslee 的域名>` → 零命中 | **⚠️ 计数口径冲突已定位(不选边,两值并列)**: - 原始 `grep -ro '](/'`(同 899 口径)= **4,047**;我的正则 `[text](href)` 统计 root-absolute = **3,905**。**差 142**。 - 差因已查明:**链接文字含嵌套方括号**,形如 `- [[V3 涌现作为] · 抽象](/worldview/wonder-02-emergence-action.md)`。 命中 **142 条**,去重后只有 **3 个目标**,分布在 **79 个文件**。 **实测 142 条全部存活(0 条死链)。** - 但这条有连带后果:**项目自己的 `scripts/check-deadlinks.mjs:107` 用的是同一条正则** `/\[([^\]]+)\]\(([^)]+)\)/g`,**所以这 142 条对死链检查器同样不可见**。 → 这是 PITFALLS 84/95 同一形状:**「检查通过」与「它检查的东西存在」是两件事**,此处且方向是「漏检」。 ## 1.2 手写还是生成 **实测结论:全部手写,仓库内没有 Markdown 链接生成器。** - `scripts/` 共 8 个脚本,逐一查其写操作目标扩展名: `grep -nE "writeFileSync|writeFile\(|write_text" scripts/*.mjs scripts/*.py` → 全部写入 `.json`(`vi-intake.assets/manifest.json`、`brand-*.json`、`index.json`), **无一处写 `.md`**。 - 有 lint/检查器,无强制生成:`check-deadlinks.mjs`(检查)、`check-frontmatter.mjs`(检查)。 - 前序报告的「全部手写、没有任何生成器」这一条**复核通过**。 ## 1.3 两个检查器的真实覆盖(PITFALLS 95 口径) | 检查器 | 自报 | 实测分母 | 覆盖率 | 退出码 | |---|---|---:|---:|---| | `node scripts/check-deadlinks.mjs` | 扫描 **486** 个 md/含链接 **343**/总链接 **3,962**/**零死链** | 899 | **54.1%** | 0 | | `node scripts/check-frontmatter.mjs` | 校验 **446** 个 md/**全部通过** | 899 | **49.6%** | 0 | - 排除范围是**脚本自己声明的**(`check-deadlinks.mjs:11-17` 列 `drafts/`、`notes/`、`meta/source/`、`v1-classic/`; `check-frontmatter.mjs:199-213` 另排除 `book/`、`reports/`)。 - **因此「零死链」「全部通过」的真实含义是「486 份里零死链」「446 份里全部通过」,不是 899 份里的。** - 另:`scripts/check-deadlinks.mjs` 能解析相对路径(`:155-164`),**所以相对式链接是被检查的**—— 不能用「相对式没人查」当理由保留它们。 - ⚠️ 检查器还**结构上抓不到**两样东西:①嵌套方括号链接(142 条,同上)②ASCII 树里的裸路径(README 路由图)。 按 PITFALLS 95 的判据,**这两类不是「没跑」,是「正则覆盖不到」**。 ## 1.4 5 层骨架的重复度(空白②的现状) **层名出现次数 / 出现文件数**(899 个 md,分母同上): | 层名 | 次数 | 文件数 | |---|---:|---:| | `L1 建模层` | **24** | 17 | | `L2 设计层` | **40** | 30 | | `L3 实现层` | **33** | 25 | | `L4 运营层` | **38** | 27 | | `L5 演化层` | **28** | 17 | - 出现 **≥2** 个层名的文件:**24** 个;**5 个层名全出现**的文件:**5** 个 —— `README.md`、`themes/cross-source-index.md`、`themes/index.md`、 `meta/source/cybernetics/index.md`、`meta/writing-style/l-layer-concept-promotion/index.md`。 - 机器可读的那一份:**frontmatter `layer:`**,排除代码块内示例后 **550 处 / 550 个文件**, 取值分布 `meta 220 / meta-source 90 / aesthetics 46 / L3 41 / L1 38 / L2 35 / L5 28 / L4 28 / cross-layer 17 / worldview 6 / thought 1`。 → **frontmatter 里只有 `L1`–`L5`,没有中文层名,也没有「L1=建模=modeling/」这层映射。** ## 1.5 README 内部:同一份骨架有 **5 种形态**(逐项对照,非印象) `README.md` 内含层名的行共 **15 行**,归为 5 种形态: | # | 形态 | 行号 | 携带的信息 | |---|---|---|---| | 1 | ASCII 链 | **L23** | 5 个层名 + 层间单向箭头 | | 1b | ASCII 闭环 | **L24–25** | **反馈闭环 L5→L1**(表格与路由图都没有) | | 2 | Markdown 表格 | **L32–36** | 5 个层名 +「关注的问题」+「关键方法」两列 | | 3 | 路由图 ASCII | **L43–44** | 5 个层名 + 导航顺序(含「业务主题」「写作范式」) | | 4 | 目录树注释 | **L52/61/70/79/87** | **裸层名 + 英文目录名 + 括注语义**(`/modeling/ # 建模层(被控对象的数学模型)`) | | 5 | 正文散文 | **L171** | `入门:从首页 hero 按钮 → L1 建模层` | ### ASCII 图(L23–25)与表格(L32–36)逐项对照 | 项 | ASCII 图 | 表格 | 是否一致 | |---|---|---|---| | L1 建模层 | 有 | 有(L32) | ✅ 一致 | | L2 设计层 | 有 | 有(L33) | ✅ 一致 | | L3 实现层 | 有 | 有(L34) | ✅ 一致 | | L4 运营层 | 有 | 有(L35) | ✅ 一致 | | L5 演化层 | 有 | 有(L36) | ✅ 一致 | | 层间单向箭头 L1→L5 | 有(L23) | **无** | ❌ 表格缺 | | **反馈闭环 L5→L1** | 有(L24–25) | **无** | ❌ 表格缺 | | 每层「关注的问题」 | **无** | 有(5 项) | ❌ ASCII 缺 | | 每层「关键方法」 | **无** | 有(5 项) | ❌ ASCII 缺 | | 「5 层不是并列章节,是同一个认识过程的 5 个阶段」 | 有(**L28**,图与表之间的散文) | 无 | ❌ 表格缺 | **结论:两份不是「同一份内容的两种写法」,而是两份互补内容被并排放着。** 前序报告把它记为「两处重复」,**本轮实测是 5 处**(同一文件内),且跨文件还有 4 个文件也复述了全 5 层。 ## 1.6 有没有单一事实源 **没有。实测三条:** 1. **层名↔目录名的映射只存在于 README 散文里**:唯一把 `L1` / `建模层` / `/modeling/` / `被控对象的数学模型` 四者写在一起的地方是 `README.md:52` 的目录树注释。**没有任何机器可读文件记录这层映射。** 2. **每个 L 层目录另有一份语义描述**:`modeling/index.md`、`design/index.md`、`implementation/index.md`、 `operation/index.md`、`evolution/index.md` 各自带 `## 这一层在做什么` + `## 关键产出物`, **措辞与 README 表格不同**(例:`operation/index.md` 的描述与 README 的「如何闭环/反馈、监控、告警、自寻最优」不是同一句)。 → 这是第 3 类重复:**同一事实、不同措辞**,因此连「两处是否同步」都无法机械比对。 3. **现状已经不同步**:README 路由图里的 5 个 `l*-` 前缀目录 **实测全部不存在** (`l1-modeling` / `l2-design` / `l3-implementation` / `l4-operation` / `l5-evolution` 五次 `test -d` 全部失败), 真实目录名是 `modeling/` `design/` `implementation/` `operation/` `evolution/`。 **这说明同步已经失败过一次,而且失败没有被任何检查器发现**(死链检查器不解析 ASCII 树)。 ## 1.7 `meta/writing-style/` 现有范式清单(落库体例来源) | 文件 | 行数 | 体例特征 | |---|---:|---| | `index.md` | 97 | `## 它是什么 / 关键属性 / 详细规范 / 阅读路径 / 关键洞察 / 常见误区 / 相关链接` | | `visual-rules/index.md` | 163 | `## 必须遵守`(含 `### 链接风格`)/`## 禁用项`/`## 怎么用`(checklist)/`## 常见误区`/`## 关键洞察` | | `type-a-overview` / `type-b-concept` / `type-c-case` / `type-d-stub` | 97–131 | 同上骨架,按 Type 分 | | `frontmatter-schema/index.md` | 128 | 字段表 + 必填/选填 | | `l-layer-concept-promotion/index.md` | 361 | L 层概念页 6 段结构 + 升格 checklist | **关键结论(决定是「加强」还是「新建」)**: > **`meta/writing-style/visual-rules/index.md:46-50` 已有 `### 链接风格` 一节**: > 「内部链接用绝对路径 `/modeling/02-strategic/`」+「不用相对路径」+「不用 .html 后缀」。 > **空白① 因此不是「没有规则」,是「规则只有结论、没有触发条件、且有三个未定义的口子」。** > → 规则 A 是**加强既有小节**,不是新建。 > **`meta/writing-style/` 8 个文件里没有任何一条讲「同一事实写多处时以哪处为准」。** > 已核对:`meta/writing-style/` 全目录搜 `单一事实源|SSOT|以.*为准|同步` → 仅命中零散措辞,无规则条目。 > → 规则 B 是**新建**,但必须复用 `visual-rules` 的体例,并挂进 `index.md:66-68` 的「通用规范」清单。 --- # 2. 两条规则正文(另存两份可落库草稿) | 规则 | 草稿文件 | 落库位置 | 是新建还是加强 | |---|---|---|---| | **A · 链接写法** | `/tmp/vi-agents/DRAFT-GAPFILL-链接写法.md` | 替换 `meta/writing-style/visual-rules/index.md:46-50` 的 `### 链接风格` | **加强**(既有小节只有结论、没有触发条件) | | **B · 单一事实源** | `/tmp/vi-agents/DRAFT-GAPFILL-单一事实源.md` | 新建 `meta/writing-style/single-source-of-truth/index.md`,并在 `writing-style/index.md:66-68` 通用规范清单加 1 行 | **新建**(全目录核对后确认无同类条目) | **两条规则的共同形态**(按任务书五条要求逐条对应): | 要求 | 规则 A | 规则 B | |---|---|---| | ① 给判断式不给教条 | 6 行判断表,第 1 列是**读者位置**不是「链接类型」 | 3 问判定+「断言/投影」二分 | | ② 写清代价 | 6 条代价,每条含实测证据或明示不可执行 | 3 条代价,含「引入生成器=改流程」的隐性成本 | | ③ 规则接受检验 | `scripts/check-link-forms.mjs`(**可自动化**,见 §3) | `scripts/check-ssot.mjs` 的一半可自动化、一半不可(见 §3) | | ④ 不引用不存在的条目 | 只引【模式三十九】(已核 `situation-entries.md:4792`+三行原文逐字核对) | 只引【模式五十二】(`:5693`)、【模式五十五】(`:5861`)、【B-3】(`aesthetics/brand-vi-appreciating-method.md:927`) | | ⑤ 每个数字可复核 | 每个数附口径+复算命令,见 §1 | 同左;另含 ASCII 图与表格的逐项对照表(§1.5) | --- # 3. 每条规则的验证方法 ## 3.1 规则 A · 链接写法 **可自动化。建议新建 `scripts/check-link-forms.mjs`(本轮未创建——本会话只起草)。** 它要做的六件事,每件都能机械判定: | # | 检查 | 判定 | 当前实测值(跑之前应当**报出基线**,不是报「通过」) | |---|---|---|---| | A1 | 站内页面链接是否用根绝对式 | `href.startsWith('/')` | 违规 **128** 条(25 个文件) | | A2 | 是否出现 `.html` 后缀 | `href.endsWith('.html')` | 违规 **0** 条 | | A3 | 是否出现 `.md` 后缀 | `href.endsWith('.md')` | 违规 **811** 条(143 个文件)——见 §4,建议改规则而非改代码 | | A4 | 根级文档(`README.md`)里是否出现根绝对式 | 路径深度 == 0 且含 `](/` | 违规 **1** 条 | | A5 | 是否存在裸 `#` | `href === '#'` | **59** 条 | | A6 | **检查器自身的分母** | 打印 `扫描 N / 全库 M` | **486 / 899** | **必须写进脚本的三条纪律**(否则它会变成第二个假绿信号): 1. **报分母**:`扫描 486 / 全库 899(54.1%)`,**不报分母就退出即视为失败**(PITFALLS 95)。 2. **不得沿用现有正则**:现有 `/\[([^\]]+)\]\(([^)]+)\)/g` **实测漏掉 142 条嵌套方括号链接**。 新脚本至少要能匹配 `[[…] · …](…)` 这类,或**明确声明它覆盖不到并把缺口打印出来**。 3. **报「读进去了多少」**:每条检查都要打印命中数;**全 0 必须先怀疑脚本**(PITFALLS 23/55)。 本轮已按此执行:第一次跑统计脚本时因漏 import 崩溃 → 修好后重跑,未把崩溃当成「零命中」。 **不可自动化的部分**:跨页锚点(316 条)的**锚点名**是否正确——只能靠人在浏览器里点。 **理由**:锚点由 VitePress 的 markdown-it slugify 规则生成,本地无对应实现,只能对着渲染后的 DOM 核。 → 处置:把「跨页锚点点过一遍」放进 checklist(本轮已写进 Draft A 的 `## 怎么用`), **但明确标注它是人工项,不许被脚本的绿色覆盖说成已验证**。 ## 3.2 规则 B · 单一事实源 **一半可自动化,一半不可。必须分开说,否则会重演「CI 全绿」。** **可自动化(`scripts/check-ssot.mjs`)**: | # | 检查 | 判定方式 | 当前实测 | |---|---|---|---| | B1 | README 的 5 个层名与**事实源文件**逐字一致 | 事实源确定后 diff | **事实源不存在** → 本检查**当前无法运行**,这是它的第一步产出 | | B2 | ASCII 树/路由图里的裸路径是否真实存在 | 正则抽出 `/[a-z0-9-]+/` 形态 + `existsSync` | **5 个 `l*-` 目录全部不存在**(`README.md` 路由图内) | | B3 | 同一文件内同一段落是否出现两次 | 行级多重集差集(PITFALLS 93 的位置无关口径) | README 层名 15 行、5 形态 | | B4 | 两个既有检查器的分母 | 直接读它们的 stdout | 486/899、446/899 | **不可自动化**: - **「这段文字是断言还是投影」的判定**——这是本规则的核心判据,**没有机器口径**。 本轮给出的三分(能用「X 等于 Y」说清 → 断言)**只是一个提问的起点**, 按 PITFALLS 53(判别式恒真时它就不是判据),**它未经留出检验,只能标「可执行、待检验」**。 - **「两份手写是否互不复述」的语义判断**——本轮对 README 图/表做的逐项对照是**人工单次核对**, n=1。**不能声称它已验证。** **建议的检验方式**:本规则**至少触发一次真实改名**(改一个层名或改一个目录名), 看 README 的 5 处、frontmatter 的 550 处、以及那 4 个复述文件是否被工具指出来。 **触发次数为 0 就不得标 `mature`**(PITFALLS 61)。 --- # 4. 违规面盘点:按新规则,本仓库现存多少处会变成违规 **没有这一步的规则不敢启用。** 逐条给处置建议:**改 / 豁免 / 改规则**。 ## 4.1 规则 A 的违规面 | # | 违规形态 | 条数 | 涉及文件 | 处置 | 理由 | |---|---|---:|---:|---|---| | A1 | 站内**页面**用相对式(`./` `../`) | **128** | **25** | **改**(分两批) | 这是既有规则 `visual-rules:49`「不用相对路径」**本来就禁止**的,本次只是把它写清楚触发条件。集中在 `aesthetics/00-structures/`(8 个文件占 83 条)+ `meta/aesthetics-research/`。`meta/ai-collaboration/drafts/` 里的 13 条**在 `srcExclude` 内、不入 build、不被检查器扫** → 建议**豁免**(它们不是 wiki 页面) | | A2 | 站内**图片**用相对式 | **87** | **37** | **豁免**(即:改规则) | 隔离测试证明相对式与根绝对式**构建产物逐字节相同**。改 87 条换不到任何用户可见收益,**这是规则错而不是仓库错**。建议把 Draft A 的第 6 行写成「站内图片统一用相对式」,与现状一致 | | A3 | 根绝对式带 `.md` 后缀 | **811** | **143** | **改规则**(承认等价) | 隔离测试证明 `/sub/page.md` 与 `/sub/page` 构建后**指向同一个 `.html`**。为 811 条做机械改写是纯成本、零收益。**建议把 `.md` 写成合法形式,或在规则里注明「本库现存 `.md` 形式为历史遗留,不必批量改」** | | A4 | 根级 `README.md` 里的根绝对式链接 | **1** | 1 | **改**(或先做待定项) | `README.md:235` 的 `/meta/cicd.md` 在 Gitee 上会解析成 `https://gitee.com/meta/cicd.md`。改成 `./meta/cicd.md` 即可。**但前提是:README 里的 ASCII 路由图不是链接语法,它整体在 Gitee 上已经是「纯文本路径」,不构成可点击死链**——所以这 1 条是真实但轻微 | | A5 | 裸 `#` 链接 | **59** | 多文件 | **豁免** | 跳回页首,行为正确、无 404 风险。改成 `[↑](#)` 是纯美学收益 | | A6 | 指向当前目录的 `](./)` | **10** | **10** | **改**(小) | 10 个文件各 1 条。语义不清(VitePress 无目录页),改成 `[↑](#)` 或指向具体页面即可 | | A7 | **链接文字含嵌套方括号** | **142** | **79** | **改**(不是违规,是**检查盲区**) | 142 条全部存活,但**现有死链检查器看不见它们**。建议改文字(去掉内层方括号)或给检查器换正则。**这条必须单独记一笔:它是本轮新发现的检查器盲区,与规则 A 无关但由规则 A 暴露** | **规则 A 若按上述处置落地,真正需要改代码的只有 A1(115 条 + 13 条豁免)、A4(1 条)、A6(10 条),合计约 126 条。** **A2/A3/A5 共 957 条建议走「改规则」而不是「改仓库」。** ## 4.2 规则 B 的违规面 | # | 违规形态 | 计数 | 处置 | |---|---|---:|---| | B1 | README 内同一骨架的 **5 种表述** | **15 行 / 5 形态** | **改**:抽出「5 个层名」这个共享断言(图 L23 与表 L32-36 互不复述层名),其余保留各自信息(反馈闭环 vs 关注的问题/关键方法)。**不建议删图或删表** | | B2 | README 目录树注释(L52/61/70/79/87)承载「层名↔目录名↔语义」映射 | **5 行** | **改**:这份映射应成为机器可读的事实源,图只画指针 | | B3 | 路由图里的 **5 个 `l*-` 死目录** | **5** | **立即改**(改成 `modeling/` `design/` `implementation/` `operation/` `evolution/`)。**这是独立于 SSOT 的既有缺陷,可先修,不必等规则落库** | | B4 | 其他文件复述全部 5 个层名 | **4 个文件**(`themes/index.md`、`themes/cross-source-index.md`、`meta/source/cybernetics/index.md`、`meta/writing-style/l-layer-concept-promotion/index.md`) | **逐个判**:是「指针」就保留,是「复述」就砍。**本轮未逐个打开核对**(见 §6 洞 2)→ **建议落库前先看这 4 个文件** | | B5 | 每个 L 层目录自带的「这一层在做什么/关键产出物」 | **5 个文件** | **豁免**:措辞与 README 表格**刻意不同**(各层页面写自己的内容),且它们不是同一条断言的副本。**把这类内容纳入 SSOT 是过度治理** | | B6 | frontmatter `layer:` 已有 `L1`–`L5` | **550 文件 / 170 处 L 值** | **不违规**,但**它只是 SSOT 的一半**:缺中文层名与目录映射。建议**扩展它**而不是新建数据文件 | **规则 B 若落地,真正必须改的是 B1(README 内部重构)+ B2(抽出事实源)+ B3(5 个死目录)。** **B5 共 5 个文件若被纳入,会立刻制造「改了骨架要改 10 处」的维护成本——这正是本规则反对的事。** --- # 5. 反向检索记录(两处空白各跑了什么) **口径:两处都在 `meta/brand-vi-research/`(军火库)内检索 `situation-entries.md` + `situation-index.md`, 统计口径为 `grep -c` 命中行数相加。** 时点同上。 ## 5.1 空白①「站内链接:什么时候写相对式、什么时候写绝对 URL」 | 检索式 | 命中 | 命中的是什么 | 判定 | |---|---:|---|---| | `绝对路径` | **0** | — | 无 | | `相对路径` | **0** | — | 无 | | `链接规范` | **0** | — | 无 | | `站内链接` | **0** | — | 无 | | `路径写法` | **0** | — | 无 | | `相对式` | **9** | 全部是**字体/尺寸的相对式**:`situation-entries.md:5581`「只有把字体写成相对式的才可核」、`:5583` 的「相对式写法」表、`:2262`「基准决定相对式能不能被还原成绝对值」 | **同形词,非本空白** | | `URL` | **10** | 其中 `:6061`(属【模式五十八】)是**字体规格的 12 份正面样本**:「给 URL 的、给相对式的、给图示单位的、给计算器的」 | **同形词,非本空白** | **最近邻条目(不是零邻近,如实登记)**:【模式五十八】`situation-entries.md:6057`。 它实测出「**没有共用写法**」并给出替代判据(同页三要素)。 **它为什么仍不构成规则 A**:它的处境是「已诊断 56 个「哪里不对」,要回答「对的长什么样」」, 对象是 **VI 规范条文**;规则 A 的对象是 **Markdown 文档里的链接路径形式**。 **形态不同,不硬套**——但它的「不设写法偏好、只设结构判据」这一条被规则 A 采纳为形式依据。 **结论**:空白①成立。**库内 0 条讲 Markdown 链接写法;9 条 `相对式` 与 10 条 `URL` 全部是字体排版语境。** ## 5.2 空白②「同一份内容多处重复时,单一事实源在哪」 | 检索式 | 命中 | 命中的是什么 | 判定 | |---|---:|---|---| | `单一事实源` | **0** | — | 无 | | `SSOT` | **0** | — | 无 | | `重复` | **34** | 全是 **PDF 文件级重复**(MD5 去重、8 组重复文件、`:1427` 小米 4 份同 md5)、**VI 应用重复**(`:911` tagline 在每个媒介重复)、`:914`「重复不等于治理」 | **同形词,非本空白** | | `副本` | **6** | 文件副本语境 | 非本空白 | | `同步` | **4** | 非文档同步语境 | 非本空白 | **最近邻条目(无编号,如实登记)**:处境「**多语种固定串是最便宜的治理**」`situation-entries.md:909`。 原文:「把 tagline、法务行、客服号固化成不可改字符串,让它在每个媒介重复」, 反例:「重复不等于治理」。**它自己就反对「重复=治理」,且其对象是 VI 应用媒介的一致性,不是文档结构。** **另需排除的一类干扰**:全库 `SSOT` 命中集中在 `design/04-patterns/cqrs-es.md` 等**业务正文** (讲事件流),与前序报告一致,**本轮在军火库目录内复算 `SSOT` = 0 命中,两边口径不同但结论一致**。 **结论**:空白②成立。**库内 0 条讲文档的多处副本与事实源。** ## 5.3 落盘纪律自检 | 检查项 | 结果 | |---|---| | 读完 PITFALLS 后、读任何其他文件**之前**先写骨架 | ✅ 骨架 35 行先落盘(`wc -l` 核对),之后才读 `REPORT-SELFUSE.md`/仓库 | | 只用 `>>`(`cat >>`)写正文 | ✅ 全部追加,未用 `write` 写报告本体(两份 DRAFT 是新建文件,用 `write`) | | 每节写完 `wc -l` 核对递增 | ✅ 35 → 192 → 211 → 268 → 303 → (本节) | | PITFALLS 读到的行数 | **`wc -l` = 1510,逐行读到第 1510 行**(末条为第 95 条;第 66–95 条这一批最新产物全部读到) | | REPORT-SELFUSE 读法 | **按行号读**(第 40 行起为真身,第 12–35 行为骨架占位段),已核到第 586 行 | | 是否修改仓库任何文件 | ✅ **没有**。产物仅 `/tmp/vi-agents/` 下 3 个 md + 4 个统计脚本 | | 是否渲染 PDF / 用 OCR | ✅ **没有**(本任务不碰 1,561 份手册) | --- # 6. 本报告自己的洞(至少三条,如实登记) ## 洞 1 · 我自己的统计也踩了同型坑,而且差点没发现 第一次跑 `gapfill_why.py` 时报 `NameError: defaultdict not defined`——**脚本崩了**。 如果我只看到「没有输出」就当成「零命中」,这会是一次标准的 PITFALLS 23(零命中=工具故障)。 本轮的处理是立刻补 import 重跑,**但要如实说:崩溃与「零命中」在终端上的表现是一样的**, 我这次靠的是「报错信息还在屏幕上」而不是任何设计上的防护。 **另一处同型风险**:`grep -ro '](/'` 得 4,047、我的正则得 3,905,差 142。 **我如果按 PITFALLS 79 的惯性去查「是不是工具漏了文件」,就会得出错误结论**—— 实际原因是我自己的正则不认嵌套方括号。**这次的差是我制造的,不是数据里的。** ## 洞 2 · 规则 B 的核心判据(「断言 vs 投影」)没有独立检验,n=1 我对 README 图/表做的逐项对照是**人工单次核对**,且**是我自己既是作者又是审计者**。 按 PITFALLS 22(子 agent 的「实测值」也会错)与 PITFALLS 47(自我纠正只是判断不是事实), **「ASCII 图与表格内容不一致」这个前提,本身应标为「待复核断言」**。 更要紧的是:**「断言/投影」这个二分我无法证伪**—— 我可以说 README 的层名是断言,也可以说「5 层骨架」整段都是投影、层名只是装饰。 **它目前是一个能提问的框架,不是一条已验证的判据**(PITFALLS 53)。 ## 洞 3 · 我没有逐个打开那 4 个复述全部 5 层的文件 `themes/index.md`、`themes/cross-source-index.md`、`meta/source/cybernetics/index.md`、 `meta/writing-style/l-layer-concept-promotion/index.md`——我只统计了它们出现多少次层名, **没有逐处打开判断「那是复述还是指针」**。 因此 §4.2 的 B4 行给不出处置结论,只给了「建议落库前先看」。 **这一条是本报告最实的一个未完成项。** ## 洞 4 · 两个检查器的「零」我都只信了自报,没独立复算 `check-deadlinks` 报「486 个 md、零死链」、`check-frontmatter` 报「446 个、全部通过」, **这两个分母我是从它们的 stdout 读的,没有用第二条路径独立复算 486 与 446**。 (文件总数 899 我用 `os.walk` 与 `find -iname` 两条路径对过,一致。) **按 PITFALLS 95,覆盖率数字的分母必须可复算——本轮只复算了 899,没复算 486/446。** ## 洞 5 · 图片写法「等价」的结论只测了 1 种情形 隔离测试用的是**同一个 20KB PNG、同一个目录、单页文档**。 **没有测**:跨 `srcExclude` 边界、被 `.assets/` 目录改名影响、以及 VitePress 未来版本的 inline 阈值变化。 **「两种写法等价」是一个 n=1 的结论**,若规则 A 被采纳,建议把它降级为「本轮实测等价」而不是「等价」。 ## 洞 6 · 我引用了前序报告的两个数字,其中一个已被我推翻,但报告本身未更新 前序 `REPORT-SELFUSE.md:69-70` 记「`L1 建模层` 出现 3 次(源典表 L16、ASCII L23、表格 L32)」、 「`L5 演化层` 出现 2 次(L18、L23、L36)」。 **实测:README 内「L# 层名」形式共 10 行(L23、L32-36、L43-44),另有 5 行裸层名(L52/61/70/79/87),合计 15 行 5 形态。** 前序给的行号(L16、L18)指的是 `L1-L3`、`L2-L5` 这类**不同字符串**,且「2 次」后面列了 3 个行号。 **我推翻了它,但前序报告我不会去改**(不是我的文件),**父会话若同时引用两份报告,请以本报告 §1.5 为准。** --- # 7. 落库提示(给父会话) ## 7.1 本文件也有 PITFALLS 91 的同名段问题 第 6–35 行是**先写的骨架**(`## 0.`–`## 6.`,其中 §2–§6 仍是「(待填)」占位), 真身在第 **39** 行起(`# 1.` 起)。**`grep '^# '` 会看到两组编号。** → **按行号读本报告:正文从第 39 行开始。** 不要按标题定位。 (这是落盘纪律「骨架先行」的必然产物,与 `REPORT-SELFUSE.md` 同一形状。) ## 7.2 三份产物的关系 | 文件 | 用途 | |---|---| | `/tmp/vi-agents/REPORT-GAPFILL.md`(本文件,414+ 行) | 证据与推导过程。**不建议整篇落库** | | `/tmp/vi-agents/DRAFT-GAPFILL-链接写法.md`(84 行) | **可直接落库**:替换 `meta/writing-style/visual-rules/index.md:46-50` | | `/tmp/vi-agents/DRAFT-GAPFILL-单一事实源.md`(182 行) | **可直接落库**:新建 `meta/writing-style/single-source-of-truth/index.md` + 在 `writing-style/index.md` 加 1 行 | ## 7.3 落库前建议先做的三件事(按性价比排序) 1. **先修 5 个 `l*-` 死目录**(`README.md` 路由图内)——独立缺陷,5 处,1 分钟,不需要等任何规则。 2. **打开 §4.2 B4 点名的 4 个文件**(`themes/index.md`、`themes/cross-source-index.md`、 `meta/source/cybernetics/index.md`、`meta/writing-style/l-layer-concept-promotion/index.md`), 逐处判断是「复述」还是「指针」——这是本报告唯一的未完成项(§6 洞 3)。 3. **决定 811 条 `.md` 后缀链接走「改规则」还是「批量改」**——本报告建议改规则(§4.1 A3), 但这是父会话的取舍,不是我的。 ## 7.4 落库状态 - **仓库未被本会话修改**(`git status --porcelain meta/writing-style/` 输出为空)。 - **未渲染 PDF、未用 OCR、未接触 1,561 份手册。**