观察类发现,在 PR #3656(#3587 / #3648,纯注释改动)的验证环节撞到。今天没有任何用户或 CI 会碰到它;不在那两单的完成范围内,按围栏未顺手改。
事实
prettier@^3.9.6 在根 package.json 的 devDependencies 里,但它没有接到任何地方:
- 无配置:仓根没有
.prettierrc / .prettierrc.* / prettier.config.*,package.json 里也没有 prettier 键;
- 无忽略表:没有
.prettierignore;
- 无 lint 集成:
eslint.config.js 一次都没提 prettier(没有 eslint-config-prettier / eslint-plugin-prettier);
- 无工作流:
grep -rln prettier .github/workflows/ 零命中;
- 无文档提及:
grep -rn prettier --include='*.md' --include='*.mdx' 零命中(AGENTS.md / CONTRIBUTING.md 都没让人跑它);
- 全仓(排除
node_modules)提到 prettier 的文件只有两个:package.json 与 pnpm-lock.yaml。
也没有 .editorconfig。
后果:一个会骗人的假红
因为没有配置,pnpm exec prettier --check 用的是 prettier 的默认值(双引号、printWidth: 80),而本仓代码是单引号、行宽更宽。结果是几乎每个文件都被报成 unformatted。在未经修改的 origin/main 内容上实测(把 git show origin/main:FILE 喂给 prettier --stdin-filepath FILE,再 diff):
| 文件 |
与 prettier 默认格式的差异行数 |
scripts/check-doc-links.mjs |
389 |
scripts/__tests__/check-doc-links.test.ts |
1646 |
差异内容就是 'node:fs' → "node:fs" 这一类,与任何人的改动无关。
危险的地方在于这是个看起来像自己闯的祸的假红:一个 agent 改完两行注释,顺手跑 prettier --check 做收尾验证,看到自己刚碰的两个文件报 warn,最自然的下一步是 prettier --write —— 那会把几千行无关代码重排成本仓并不使用的风格,混进一个注释级 PR 里。PR #3656 里我就在这上面停了一拍,靠回测 origin/main 的原始内容才确认不是自己引入的。
影响
零用户可见影响,零 CI 影响(没有工作流跑它)。归为 observation-class。它的成本是给后来的 agent 埋了一个"看起来是你干的"的假信号,以及一条永远装不上用场的依赖。
处置方向(分诊定,我不预设)
大致是 enforce-or-remove 的老三选:
- 接线:补一份与现有风格一致的 prettier 配置(单引号等)+
.prettierignore,并挂进 lint。代价是首次落地要么全仓重排一次,要么靠 ignore 表圈定范围;
- 移除:从
devDependencies 删掉这条没人用的依赖,格式一律交给 eslint;
- 只加护栏:保留依赖,但补一份配置或在 AGENTS.md 写明"本仓不用 prettier 做格式门禁,别跑它" —— 成本最低,但依赖仍然是死的。
倾向 2 或 1,视仓主是否真想要一个格式门禁而定;3 只是止血。
Generated by Claude Code
观察类发现,在 PR #3656(#3587 / #3648,纯注释改动)的验证环节撞到。今天没有任何用户或 CI 会碰到它;不在那两单的完成范围内,按围栏未顺手改。
事实
prettier@^3.9.6在根package.json的devDependencies里,但它没有接到任何地方:.prettierrc/.prettierrc.*/prettier.config.*,package.json里也没有prettier键;.prettierignore;eslint.config.js一次都没提 prettier(没有eslint-config-prettier/eslint-plugin-prettier);grep -rln prettier .github/workflows/零命中;grep -rn prettier --include='*.md' --include='*.mdx'零命中(AGENTS.md / CONTRIBUTING.md 都没让人跑它);node_modules)提到 prettier 的文件只有两个:package.json与pnpm-lock.yaml。也没有
.editorconfig。后果:一个会骗人的假红
因为没有配置,
pnpm exec prettier --check用的是 prettier 的默认值(双引号、printWidth: 80),而本仓代码是单引号、行宽更宽。结果是几乎每个文件都被报成 unformatted。在未经修改的origin/main内容上实测(把git show origin/main:FILE喂给prettier --stdin-filepath FILE,再 diff):scripts/check-doc-links.mjsscripts/__tests__/check-doc-links.test.ts差异内容就是
'node:fs'→"node:fs"这一类,与任何人的改动无关。危险的地方在于这是个看起来像自己闯的祸的假红:一个 agent 改完两行注释,顺手跑
prettier --check做收尾验证,看到自己刚碰的两个文件报 warn,最自然的下一步是prettier --write—— 那会把几千行无关代码重排成本仓并不使用的风格,混进一个注释级 PR 里。PR #3656 里我就在这上面停了一拍,靠回测origin/main的原始内容才确认不是自己引入的。影响
零用户可见影响,零 CI 影响(没有工作流跑它)。归为 observation-class。它的成本是给后来的 agent 埋了一个"看起来是你干的"的假信号,以及一条永远装不上用场的依赖。
处置方向(分诊定,我不预设)
大致是 enforce-or-remove 的老三选:
.prettierignore,并挂进lint。代价是首次落地要么全仓重排一次,要么靠 ignore 表圈定范围;devDependencies删掉这条没人用的依赖,格式一律交给 eslint;倾向 2 或 1,视仓主是否真想要一个格式门禁而定;3 只是止血。
Generated by Claude Code