docs(agents): fold recurring cross-agent lessons into AGENTS.md

Adds rules previously kept only in Claude's local memory so Codex/Cursor
follow them too: path-scoped docs commits (ERR-112), PostgREST compat
layer needs real queries (BUG-990), grep source-text contract tests
before moving code (BUG-933/934/939/992/1014), privacy marker test for
docs with measurements, quick gate for any scripts/tests change, Node
`# cancelled` check (BUG-995), and history-open check on Skill bumps
(BUG-621).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199rbQDTsUbCVw84wc8BTFe
This commit is contained in:
Jesse_Chen
2026-09-27 10:54:56 +08:00
co-authored by Claude Opus 5.5
parent 6c407ea762
commit 828aca0a41
+8 -1
View File
@@ -66,6 +66,7 @@
- 或 `git diff > /tmp/x.patch` 后手工恢复。
已经误弹了:立刻 `git fsck --unreachable | grep commit` 找回对方的 stash commit,用 `git stash store <sha> -m "RECOVERED …"` 原样放回栈上并告知对方 sha,不要自行替对方 apply。
6. 两个同时改 `frontend/src/app/(app)/page.tsx` 或同一组件的轮次必须串行,任务书里写明先后。
7. 文档提交只 `git add <具体路径>`,提交前看 `git diff --cached --stat` 确认只有文档;不得用 `git commit -a` / `-am`。起因 ERR-112:`-am` 把工作树里早已存在的删除一起推上 staging,打红门禁,还碰了只有产品负责人能动的 `.gitea/`。
## 4. 记录文件放哪
@@ -112,8 +113,9 @@
3. 测试总数不得低于开工时 `origin/staging` 的实测;改任何既有断言必须写"原值 / 新值 / 原因"三栏说明,不得静默弱化。
4. 合同测试的 fixture 必须来自真实引擎响应(golden),不得手造形状。
5. 改 UI 的提交同时更新 `frontend/DESIGN.md`;新文案对照 `frontend/docs/VOICE.md`。
6. 不改数据库结构的轮次不得顺带动迁移;动表的轮次必须真跑 `npm run test:db`。staging 迁移在部署之前自动应用,因此必须对当前已部署的那一版代码向后兼容:加列、加表、加索引、加触发器、加函数可以同轮;删列、删表、重命名、收紧 `NOT NULL` / `CHECK`、改类型必须拆成两轮——先加新的并部署代码,再删旧的。
6. 不改数据库结构的轮次不得顺带动迁移;动表的轮次必须真跑 `npm run test:db`。staging 迁移在部署之前自动应用,因此必须对当前已部署的那一版代码向后兼容:加列、加表、加索引、加触发器、加函数可以同轮;删列、删表、重命名、收紧 `NOT NULL` / `CHECK`、改类型必须拆成两轮——先加新的并部署代码,再删旧的。自托管 PostgreSQL 兼容层的 stub 测不到真实查询语法,新用到的查询写法必须 `test:db` 真查或部署后 smoke(BUG-990:未实现的 `not(col,"is",null)` 让归档列表 500 了两周)。
7. 不得顺手升级依赖、不得顺手修不在任务书里的 warning;发现了写进 `BLOCKED.md` 或进度记录。
8. 移动、删除或改写组件与语句前,先在 `frontend/tests/` 和 `tests/` 里 grep 该文件路径、要删的类名与语句,找出按源码文本断言的合同测试,同一轮跟着改(按第 3 条写三栏)。漏改会让门禁红而业务代码是对的,已发生多次:BUG-933 / 934 / 939 / 992 / 1014。
## 8. 隐私与安全
@@ -121,6 +123,7 @@
2. 不得读取、猜测或借用他人的凭据与账号做验收;没有受控账号就把该项写进 `BLOCKED.md`。
3. 供应商地址必须经服务端 SSRF 防护;不得把任何 key 放进前端。
4. 不得放宽置信度或验证边界,除非有外部 benchmark 证据。
5. 写了实测数字的文档(任务书、进度、研究记录)推送前先跑 `.venv/bin/python -m pytest tests/test_repo_privacy_markers.py -q`;实测段落只写"真实个人资料",不写具体出生信息。
## 9. 开工预检(引擎 / 基础设施 / 发布类任务)
@@ -151,6 +154,10 @@
| 数据库 | `npm run test:db --prefix frontend`(需 Docker) | 动表 |
| 发布前 | `run_quality_gate.py --profile release` | 提升 `main` 前 |
- 定向测试通过不能代替快速门:改动只要含 `scripts/**` 或 `tests/**`(包括 `scripts/research/` 下的调研脚本),验收就跑快速门全量。`tests/test_api_server_growth_contract.py` 按文本计数,注释里出现 `JyotishAPIHandler.__new__` 也算一个伪造点。
- 读 Node 测试结果要同时看 `# cancelled` 和退出码,不能只看 `# fail`;测试接管 stdout 时 `fail=0` 也可能是漏报(BUG-995)。
- 升级生时校正 Skill 版本的轮次,必须验证升级前创建的历史 Case 仍能从列表打开(BUG-621)。
已知环境缺口,遇到时如实写进 `BLOCKED.md` 而不是宣称通过:无 Docker(DB/部署套件阻塞,用与基线逐条一致的失败清单代替);无登录态与 Chrome(浏览器级验收留给 `docs/testing/` 清单);无模型凭据(真实模型输出留待部署后复核)。
---