Skip to content

📄 修正 AGENTS.md 与 develop.md 中的过期事实与措辞歧义#1611

Open
cyfung1031 wants to merge 7 commits into
scriptscat:mainfrom
cyfung1031:claude/agents-md-fact-audit
Open

📄 修正 AGENTS.md 与 develop.md 中的过期事实与措辞歧义#1611
cyfung1031 wants to merge 7 commits into
scriptscat:mainfrom
cyfung1031:claude/agents-md-fact-audit

Conversation

@cyfung1031

@cyfung1031 cyfung1031 commented Jul 18, 2026

Copy link
Copy Markdown
Collaborator

Checklist / 检查清单

  • Fixes mentioned issues / 已修复或实现
  • reviewed by human / 通过人工检查
  • Changes tested / 已完成测试

背景

#1610 修复 AGENTS.md 中 PR 描述规范提示的可见度问题后,收到提示"检查 AGENTS.md 其余内容是否有类似问题"。逐条核对 AGENTS.md 全文后发现若干过期事实与措辞歧义(第一轮改动),随后收到六轮对改动本身的审阅意见,指出前一轮改动引入或未完全解决的问题(第二至七轮改动)。全部条目均已按 docs/DOC-MAINTENANCE.md 的规则重新对照代码库验证,不直接采信未经验证的外部结论。

本次改动

第一轮:过期事实与触发/所有权歧义

  • AGENTS.md:"Key Packages" 中 filesystem/ 被描述为 "(WebDAV + local)",但 packages/filesystem/factory.ts 中实际的 FileSystemType 并无 "local" 选项(实为 zip | webdav | baidu-netdsik | onedrive | googledrive | dropbox | s3)——改为准确描述并链接到 docs/cloud-sync.md
  • AGENTS.md:"All four syntax-based harness rules are covered by eslint-rules/harness.test.mjs" 具有误导性:该文件实际只覆盖 no-i18n-default-valueno-raw-color-classnameno-restricted-importsradix-ui 模式、no-restricted-syntax 四项,require-last-error-check(列表中排最前、最易被误认为已覆盖)与 no-restricted-importssonner 模式均未被覆盖——已用 grep 确认该文件全文无相关字样,改为明确列出实际覆盖与未覆盖的项目,并补上 require-last-error-check 缺失的 chrome-error/ 插件命名空间前缀。
  • docs/develop.md:"8 locales" 但 src/locales/ 下实际有 9 个语言目录(遗漏 pt-BR)。
  • AGENTS.mddocs/design.md 的阅读触发条件写作"建任意 page 前",但 docs/design.md/docs/develop.md 自身都写"page, dialog, or block"——三处范围不一致,已统一。
  • AGENTS.md:"single source of truth"/"put all guidance here" 的表述容易与 docs/DOC-MAINTENANCE.md 的所有权模型混淆——已明确该句是相对 CLAUDE.md 而言。
  • AGENTS.md:"If a test fails, fix the code, not the test" 的绝对化表述与 docs/references/develop-testing.md 允许清理无价值测试的既有规则存在潜在冲突——补充窄化例外。
  • AGENTS.md:"apply to every change" 改为 "every code change",并补充 docs/verification.md/Confirm before you fix 的连接、DEVELOP.md/DESIGN.md 大小写不一致修正。

第二轮:对第一轮改动本身的修正

  • docs/develop.md:Coding Style 与 i18n 两处仍写 "react/jsx-no-literals: warn",但 eslint.config.mjs 实际为 "error"——这是第一轮"已核对 eslint.config.mjs"这一说法本身的反例,已修正两处措辞。
  • docs/develop.md:不再硬编码 locale 数量/列表,直接指向 docs/translation.md,从根源上避免再次漂移。
  • AGENTS.md:"apply to every code change" 对 TDD 而言范围过宽、对 Scope discipline 而言范围过窄——改为不再用统一限定词覆盖整节,TDD 条目自带精确范围说明。
  • AGENTS.mddocs/design.md 触发提示提升为独立顶部引用块,删除 UI stack 段落中重复的触发语句。
  • AGENTS.md:"Confirm before you fix" 补充区分:纯逻辑/解析/工具函数类 bug 用单元测试复现,依赖真实扩展/浏览器 API/跨上下文行为时才需要 docs/verification.md 的 scratch-script 工作流。
  • AGENTS.md:"fix the code, not the test" 例外拆分为两类:契约有误(应修正测试)与从一开始就不该存在(应主动清理,与是否失败无关)。

第三轮:对第二轮新增表述本身的修正

  • AGENTS.md:TDD 例外从"config/dependency changes"整类豁免,改为以"是否改变可观察行为"为判断标准(标题改为 "for changes that alter observable behavior"),避免解析器升级、bundler 配置变更等实际改变行为的改动被错误跳过测试。
  • AGENTS.md:ESLint 规则清单引导句移除"lint/tests 强制执行所以不会像文档一样漂移"的说法——第二轮修正的正是这段描述自己的过期内容,这本身反驳了"不会漂移"

第四轮:TDD 遗漏"自动化覆盖不可行"例外、design.md 触发范围仍限于"新建"

  • AGENTS.md:补充 TDD 第二类例外——纯视觉/动画调整、仅特定浏览器版本或生命周期阶段才能复现的问题、文案/翻译改动、无法可靠自动化的平台行为,改用人工验证并记录证据,明确不得为满足本条而提交低价值测试。
  • AGENTS.mddocs/develop.mddocs/design.md:design.md 触发范围从"新建"统一改为"新建或修改",与该文档 Core Constraints 一节"every UI change"的实际范围对齐。

第五轮:token 效率、TDD 三文档冲突、验证工作流适配范围(基于新一轮审阅意见,逐条核实后采纳)

  • token 效率(元问题):审阅指出本 PR 已向 AGENTS.md(每次会话都会加载的文件)持续新增大量文本,多数应下放到其他专属文档而不损失 harness 效果。已将占用最多篇幅的 ESLint 自定义规则清单(规则名、范围、harness.test.mjs 覆盖情况,约 9 行密集内容)整体迁移到 docs/develop.md 新增的 "ESLint custom rules" 小节——该文档本就是 AGENTS.md 自称"concrete how"的权威归属。AGENTS.md 对应位置改为 4 行指针,AGENTS.md 总行数相比上一轮净减少。同时不再需要"这是有意为之的窄范围例外"这类说明性文字,因为详细内容已不在 AGENTS.md 里。
  • 阻断级:TDD 失败测试是否强制,三份文档给出不同答案——AGENTS.md 已定义"自动化覆盖不可行时可用验证证据替代失败测试"的例外,但 docs/verification.md 仍无条件断言"scratch reproduction 必须晋升为已提交的失败测试",docs/references/develop-testing.md 仍无条件写"write failing tests before implementation",AGENTS.md 自身"确定 bug 存在 → 写测试 → 修复"的中文摘要也未反映新例外——按读到哪份文档,代理会得出不同结论,这正是本 PR 意在减少的跨文档漂移。已让 verification.md/develop-testing.md 不再各自重复并可能过期地断言该策略的具体内容,改为指向 AGENTS.md 作为唯一权威;AGENTS.md 中文摘要补上"或记录验证证据"分支。
  • AGENTS.md "keeps only" 与 ESLint 详细清单的矛盾:随上一条 ESLint 清单迁出 AGENTS.md 一并解决——"This file keeps only the non-negotiable engineering principles and the architecture map" 现在是准确陈述,无需额外的例外措辞,也与 docs/DOC-MAINTENANCE.md 所有权表中 AGENTS.md 一行的描述重新保持一致(此前"已知限制"记录的这一条已随之消失)。
  • TDD 第二类例外一律指向 docs/verification.md 的扩展级 scratch-script 工作流,对文案/翻译改动等简单场景过重:已改为按是否需要真实扩展/浏览器 API 区分——需要时用该工作流,否则用更轻量的记录说明即可,不再一律套用面向浏览器扩展集成场景设计的完整流程。

第六轮:Engineering Principles 仍偏重,例外细节下放到专属文档(基于新一轮审阅意见,逐条核实后采纳)

  • 审阅指出 Engineering Principles 一节仍偏重,应在不损失 harness 的前提下下放。核对后确认 Fix root causesConfirm before you fixTDD/BDD first 三条经五轮修正累积了大量例外场景与反例说明,是该节最重的部分。已将例外细节按各自所有权迁移:
    • Fix root causes 的测试例外(契约本身有误 / 从未有价值)迁移到 docs/references/develop-testing.md 的 "Writing meaningful tests" 小节开头。
    • Confirm before you fix 的复现方式选择(单元测试 vs 扩展级 scratch-script)迁移到 docs/verification.md(该文档本就以复现 bug 为职责范围)。
    • TDD/BDD first 的两类例外整段迁移到 docs/references/develop-testing.md 新增的 "When TDD doesn't apply" 小节。
    • AGENTS.md 三条对应位置收窄为"原则本身 + 一处指针",文件字节数相比上一轮再减少约 12%(10347 → 9132 字节),例外内容未删减,只是搬到了各自的所有权文档。

第七轮:verification.md 中 scratch 证据与例外的措辞歧义(非阻断,基于新一轮审阅意见,逐条核实后采纳)

  • docs/verification.md:"a scratch reproduction... is not itself the required test or evidence" 无条件表述,但在 AGENTS.md 的自动化覆盖不可行例外场景下,scratch 复现(report.md、截图、观察记录)本身就是要求的证据——docs/references/develop-testing.md 的 "When TDD doesn't apply" 小节也支持这一解读。已补充"一般情况下"限定,并明确例外场景下 scratch 复现即为所需证据,无需再补一个已提交的测试。
  • docs/verification.md:"该策略(含其例外)归属 AGENTS.md" 在第六轮例外细节迁出 AGENTS.md 后已不准确——已改为分别说明:AGENTS.md 拥有原则本身,docs/references/develop-testing.md 拥有例外判定标准。

已知限制

  • 未处理审阅意见中偏结构性/主观的建议(例如为 docs/architecture.md 新增多个触发回调块)——改动范围更大、收益不确定,留待后续按需评估。

建议审查重点

  • 本 PR 经历了多轮"改动本身被审阅发现新问题"的过程,包括三文档 TDD 策略冲突、"Engineering Principles 仍偏重"、以及本轮的 scratch 证据措辞歧义——这提示"我已完成事实核查/token 已经足够精简"类声明本身也需要留有余地。
  • docs/verification.md 新增的"一般情况 vs 例外情况证据要求不同"表述,是否与 docs/references/develop-testing.md 的例外判定标准完全对齐,不会出现"符合哪条例外"本身产生新的跨文档分歧。
  • AGENTS.md 三条原则收窄为"原则 + 指针"后,是否仍能在不点开链接的情况下让代理理解约束的边界,还是必须打开 docs/references/develop-testing.md/docs/verification.md 才能正确执行。
  • docs/references/develop-testing.md 新增的 "When TDD doesn't apply" 小节与 "Writing meaningful tests" 开头新增的契约区分说明,措辞是否与 AGENTS.md 迁移前的原文一致,没有在搬运过程中引入新的表述漂移。
  • ESLint 规则清单迁移到 docs/develop.md 后,AGENTS.md 的 4 行指针是否仍能让代理在需要时快速找到细节,而不必先读完整个 develop.md
  • docs/verification.md/docs/references/develop-testing.md 改为指向 AGENTS.md 作为 TDD 策略唯一权威后,是否遗漏了这两份文档原本承担的、AGENTS.md 不适合覆盖的机制性说明(例如 scratch-script 具体怎么写、测试文件放在哪)。
  • TDD 例外及其"按是否需要真实扩展区分验证方式"的补充,是否足够具体、不会被泛化滥用为"这个行为变更懒得写测试"的通用借口。

关联

  • #1610 — 处理同一类问题(AGENTS.md 中 PR 描述规范提示的可见度与措辞),本 PR 是对 AGENTS.md 其余内容的后续审计。两个 PR 都改动 AGENTS.md,但改动的段落不重叠。

验证

  • docs/DOC-MAINTENANCE.md 自带的链接完整性检查脚本每轮改动后均本地执行,全部链接可解析,无 BROKEN 输出(第五轮改动含 docs/verification.md 中一处链接文本调整,已确认解析正常)。
  • 每条"过期事实"类改动均用 git-aware 命令对照当前分支已提交代码逐条核实:git grep/git ls-tree 确认 filesystem/ 实际 provider 列表、harness.test.mjs 实际覆盖的规则、chrome-error//scriptcat/ 插件命名空间前缀、src/locales/ 实际的 9 个语言目录、eslint.config.mjsreact/jsx-no-literals 的实际级别。
  • 第五轮 "TDD 三文档冲突" 一条用 grep -n "does not replace\|committed failing test\|scratch reproduction" docs/verification.mdgrep -n "write failing tests\|failing test" docs/references/develop-testing.md 确认两处此前均为无条件表述,与 AGENTS.md 当前例外确实矛盾。
  • wc -l AGENTS.md 确认第五轮改动后 AGENTS.md 总行数相比上一轮净减少(ESLint 清单迁出的行数多于本轮新增行数)。
  • 第六轮用 wc -c AGENTS.md(改动前后对比 git show <上一轮commit>:AGENTS.md | wc -c)确认字节数从 10347 降至 9132;docs/DOC-MAINTENANCE.md 链接完整性检查脚本改动后本地执行,全部链接可解析,无 BROKEN 输出。
  • 第七轮改动前先用 sed -n '1,35p' docs/verification.md 重读改动前原文,确认"is not itself the required test or evidence"确无限定词、且与例外场景矛盾,改动后再次执行链接完整性检查脚本,无 BROKEN 输出。
  • git commit 触发的预提交钩子(lint-staged)因每轮改动仅涉及 .md 文件而跳过 JS/TS 相关检查。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@cyfung1031
cyfung1031 marked this pull request as draft July 18, 2026 01:29
cyfung1031 and others added 6 commits July 18, 2026 10:31
- docs/develop.md:两处 "react/jsx-no-literals: warn" 均为过期表述,
  eslint.config.mjs 实际配置为 "error";一并改为不重复硬编码 locale
  数量/列表,改为指向 docs/translation.md 这一权威来源,避免该计数
  再次漂移(此前已从 8 漂移到 9)。

- AGENTS.md:
  - 将 "apply to every code change" 的整体范围限定去掉,改为按条目
    各自标注适用范围——原有的"every code change"表述本身仍会把 TDD
    要求错误地套用到行为保持型重构、类型清理、配置/依赖变更、死代码
    删除、机械改名等不需要先写失败测试的改动上;同时又可能让"Scope
    discipline"这类本应通用于文档/翻译/配置改动的原则被误读为仅限
    代码改动。现改为 TDD 条目自带范围说明,其余条目不再受统一限定词
    约束。
  - "If a test fails, fix the code, not the test" 的例外表述中
  "tautological"归类有误——重言式测试通常恒为真,不会"失败",因此
  不适合作为"测试失败时可能是测试本身错了"的例子;已改为区分两类
  不同情况:测试失败因其自身断言的契约有误(应修正测试)、与测试
  从一开始就不该存在因而应主动清理(不依赖是否失败)。
  - "Confirm before you fix" 补充:并非所有复现都需要走
  docs/verification.md 的浏览器端 scratch-script 流程——纯逻辑/解析
  /工具函数类 bug 用最小的失败单元测试复现即可,只有依赖真实扩展、
  浏览器 API 或跨上下文行为的 bug 才需要该工作流。
  - 新增的"详细指南不放在 AGENTS.md、避免重复"表述与文件末尾仍保留
  的 ESLint 规则详细清单(含插件命名空间、精确文件范围、harness 覆盖
  情况)直接冲突——已在该清单前补充一句说明:这是有意为之的窄范围
  例外,因为这些规则由 lint/测试机制强制执行,不会像纯文字文档那样
  悄悄漂移。
  - docs/design.md 的阅读触发条件从嵌在 "UI stack" 段落中的被动陈述,
  提升为与其他四条文档提示同级的顶部 "Before X, read Y" 引用块(并把
  UI stack 段落中原本重复的触发语句删除,避免两处各说一次)。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
TDD 例外原按"config/dependency changes"整类豁免失败测试要求,但此类
改动本身可能改变可观察行为(解析器升级修复缺陷、打包配置影响产物、
manifest/permission 变更);改为以"是否改变可观察行为"作为判断标准,
并给出反例防止被当作豁免借口。

ESLint 规则清单此前声称"lint/tests 强制执行,不会像文档一样悄悄漂移",
但该清单本身是人工维护的 prose(哪条规则覆盖什么范围、哪些测试验证
它),lint 只强制规则本身的行为,不强制这段描述的准确性——本 PR 上一轮
就是在修正这段描述的过期内容,这本身就反驳了"不会漂移"的说法。改为
明确该清单仍是需要用 grep 复核的陈述,而非既定事实。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
TDD/Confirm-before-you-fix 此前对"改变可观察行为"的改动一律要求先写
失败测试,未考虑纯视觉/动画调整、仅特定浏览器版本或扩展生命周期阶段
才能复现的问题、文案/翻译改动、无法可靠自动化的平台行为等场景——这类
改动缺乏可行的自动化覆盖手段,硬性要求容易诱导写空跑/不稳定的低价值
测试,与 develop-testing.md 反对无价值测试的既有规则冲突。补充第二类
例外:改用 docs/verification.md 的人工验证并记录证据。

design.md 触发提示(AGENTS.md、docs/develop.md、docs/design.md 自身
开头)此前均写"建任意新 page/dialog/block 前读",但 design.md 的
Core Constraints 一节明确"every UI change must satisfy all of these"
——范围比"新建"更广,修改已有 UI 同样适用。三处触发文字统一改为
"building or modifying",消除范围不一致。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
AGENTS.md 此前新增的失败测试例外未同步到 docs/verification.md 与
docs/references/develop-testing.md:verification.md 仍无条件要求
"scratch reproduction 必须晋升为已提交的失败测试",develop-testing.md
仍无条件写"write failing tests before implementation",AGENTS.md 自身
"确定 bug 存在 → 写测试 → 修复"的中文摘要也未反映新例外——三处对"失败
测试是否强制"给出不同答案。已让 verification.md/develop-testing.md
改为指向 AGENTS.md 作为该策略的唯一权威(不再各自重复并可能过期的
断言),中文摘要补上"或记录验证证据"分支。

ESLint 自定义规则清单(规则名、范围、harness 覆盖情况)此前直接嵌在
AGENTS.md 里,与文件开头"keeps only the non-negotiable engineering
principles and the architecture map"的范围声明矛盾,且是本 PR 反复
被指出"新增文本过多、应下放到其他文档"的主要来源。已整体迁移到
docs/develop.md 新增的 "ESLint custom rules" 小节(该文档本就是
"concrete how"的权威归属),AGENTS.md 改为四行指针,不再需要额外的
"例外"措辞。

TDD 第二类例外(自动化覆盖不可行)此前一律指向 docs/verification.md
的浏览器扩展 scratch-script 工作流,但该工作流是为依赖真实扩展/浏览器
API 的场景设计的,对纯文案/翻译改动而言过重——已改为按是否需要真实
扩展区分:需要时用该工作流,否则用更轻量的记录说明即可。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Engineering Principles 一节里 "Fix root causes"、"Confirm before you
fix"、"TDD/BDD first" 三条经过五轮修正,逐条累积了大量例外场景与反例
说明,成为 AGENTS.md(每次会话都会加载)里最重的部分。这些例外/反例
本质上是"如何执行"的机制细节,而非不可协商的原则本身,按 AGENTS.md
自己的所有权声明应归属专属文档:

- "Fix root causes" 的测试例外(契约本身有误 / 从未有价值)细节迁移
  到 docs/references/develop-testing.md 的 "Writing meaningful tests"
  小节开头,AGENTS.md 保留原则本身 + 一处指针。
- "Confirm before you fix" 的复现方式选择(单元测试 vs 扩展级
  scratch-script)迁移到 docs/verification.md,该文档本就以复现 bug
  为职责范围。
- "TDD/BDD first" 的两类例外(行为保持型改动;自动化覆盖不可行)整段
  迁移到 docs/references/develop-testing.md 新增的 "When TDD doesn't
  apply" 小节。

AGENTS.md 该节三条从长段落收窄为原则 + 指针,文件总字节数减少约
12%(10347 → 9132 字节),例外内容本身未删减,只是搬到了各自的所有权
文档,不损失约束力(harness)。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
"a scratch reproduction... is not itself the required test or
evidence" 此前无条件表述,但 AGENTS.md 的自动化覆盖不可行例外场景下
scratch 复现(report.md、截图、观察记录)本身就是要求的证据——两处
表述冲突。已补充"一般情况下"限定,并明确例外场景下 scratch 复现即为
所需证据,无需再补一个已提交的测试。

同时修正所有权表述:"该策略(含其例外)归属 AGENTS.md" 已不准确——
例外细节在上一轮迁移到了 docs/references/develop-testing.md,AGENTS.md
只保留原则本身。改为分别说明两份文档各自的所有权范围。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@cyfung1031

Copy link
Copy Markdown
Collaborator Author

@CodFrm

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P0 🚑 需要紧急处理的内容

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant