Skip to content

docs(skills): guide 里反引号包裹的仓内路径无任何门禁校验 —— #3713/#3730 两轮 13+ 处死路径都是靠人肉发现的 #3735

Description

@yinlianghui

越界发现,记录于 #3730(订正 skills/objectui/guides/console-development.md 三处表/节的 13 个符号路径)期间。按纪律只报不改,单独立单,未认领

finding:这是一条缺失的门禁,不是今天有人踩到的缺陷。用户面零影响,严重度留给分诊裁。

事实

skills/objectui/guides/*.md 是本仓 agent 写代码时的直接输入,正文里大量以反引号给出仓内路径当坐标(packages/app-shell/src/layout/UnifiedSidebar.tsx 这类)。没有任何门禁校验这些路径在磁盘上存在。

  • scripts/check-doc-links.mjsSCAN_ROOTS(该文件第 392 行起)为
    content/docs / examples / README.md / CONTRIBUTING.md / ROADMAP.md / docs / packages/*/README.md
    —— 不含 skills/。且它校验的是 markdown 链接([x](y)),本来也不看反引号里的裸路径。
  • 全仓搜 skills/ 的其他消费者:只有 scripts/__tests__/check-control-bytes.test.ts 命中,且那是它自己的 fixture 路径(.claude/skills/demo/SKILL.md),与本仓 skills/ 无关。
  • 结论:skills/** 正文里的仓内路径当前完全无人校验

代价已经付了两轮,两轮都是靠人在阅读时肉眼发现:

这类错误的成本形态很特殊:符号都真实存在,只是坐标错了,所以 agent 照着去 Read/Edit 得到「文件不存在」,浪费一整圈定位,而不是立刻拿到一个编译错误。它也天然会复发 —— 代码搬家(c1e105793 / 28ffe4033 / b279d80d6 / cccdf84d7 这批 app-shell 抽取)不会有任何东西提醒 guide 跟着改。

一个可行的最小形状(仅供分诊参考,不预设结论)

抽出 skills/**/*.md 正文里所有反引号 token,取形如 ^(apps|packages|examples|scripts|content)/ 且不含空格的,逐个 existsSync。PR #3734 里我用一个 8 行 node 脚本跑过全文,34 条候选命中 33 条存在,唯一「不存在」的是一句故意的否定句(「apps/console/src/context/ 这个目录并不存在」)—— 说明:

  • 信噪比够高,可直接当门禁;
  • 必须有豁免机制,因为「指出某路径不存在」是 guide 的合法写法(packages/spec/src/ 下带占位段的路径同理)。豁免可以是 baseline JSON(仿 scripts/i18n-call-site-key-baseline.json)或行内注释标记,哪种更合仓内习惯由维护者定。

要不要连 content/docs/** 一起纳入(那里同样有反引号裸路径,且已在 SCAN_ROOTS 里但只查链接)也是分诊可以一并裁的范围问题。

关联

已就关键词(skills guides pathconsole-development.mdcheck-doc-links SCAN_ROOTSdocs path gate)搜过本仓开放 issue,无同源单。


Generated by Claude Code

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions