用于提交信息的 Claude Code:将 diff 转成清晰的提交说明和发布说明,说明对用户的影响、风险以及任何迁移步骤。

text\nYou are writing release notes for [product/app]. Audience: [end users/admins/developers].\nInput: the following diffs/commit summaries.\n\nWrite release notes with these sections:\n1) User-visible changes (what’s new or different)\n2) Fixes (symptoms users had, now resolved)\n3) Breaking changes (if none, say “None”)\n4) Migration steps (numbered, short, actionable)\n5) Deprecations (what, when it will be removed, replacement)\n6) Risk and rollout notes (what could go wrong, how to verify)\n\nRules: do not list internal refactors unless they affect behavior. Use plain language.\n\n\n这会把用户影响与内部清理分开,让重命名不会淹没真正的行为变化。\n\n### 模式:明确指出迁移和破坏性变更\n\n即便谨慎的模型也会漏掉迁移,除非你提出明确问题:\n\n- 是否改变了任何 API 返回、配置键、环境变量或数据库模式?\n- 升级后现有用户会发生什么故障,如何察觉?\n- 修复的确切步骤是什么,按顺序写明?\n- QA 应该验证哪些点以确认发布安全?\n\n习惯上总是要求“它为何重要”和“下一步该做什么”,而不是只问“改了什么”。\n\n## 逐步操作:把 diff 变成最终信息\n\n像审查者那样阅读 diff,而不是像写它的人。你的工作是把代码改动变成以后可以信赖的记录:改了什么、为什么改、意味着什么。\n\n1. 先写一句话总结。 用明确的动词并指明影响面。“修复 iOS 上保存草稿时的崩溃”要优于“更新保存逻辑”。\n2. 把变更按稳定结构排序。 一个简单顺序适用于大多数提交:什么、为什么、影响、风险、迁移。如果某项为空就写 “None”,让读者知道不是遗漏。\n3. 补充验证步骤。 包含简短的“如何验证”,确保别人能按步骤复现,而不是看内部实现。\n4. 有风险时写发布及回滚说明。 指出 feature flag、分阶段发布、监控和回滚触发器。如有已知边缘情况,明确说明。\n5. 根据受众润色。 提交信息可包含一些内部上下文;发布说明应为通俗语言。\n\n如果使用 Claude Code,粘贴 diff 加上 2–3 句意图(谁受影响、出了什么问题、你测试了什么),并要求按该结构输出。然后像编辑人类写的文本那样修订它。\n\n快速措辞优化建议:\n\n- 用“用户可以…”或“管理员必须…”代替“我们重构了…”\n- 把模糊的“改进”换成具体结果\n- 若有迁移,明确地说出在何时(部署前或后)以及要做什么\n\n一条稳妥的信息会回答:改了什么?为什么现在改?可能坏什么?如何判断是否生效?如何安全采用?\n\n## 一个现实示例:从 diff 到提交与发布说明\n\n想象一个看似无害但会破坏客户端的小 diff。\n\ndiff\n- type UserResponse struct {\n- FullName string `json:\"fullName\"`\n- }\n+ type UserResponse struct {\n+ Name string `json:\"name\"`\n+ }\n\n+ if req.Name == \"\" {\n+ return errors.New(\"name is required\")\n+ }\n\n\n发生了两件事:响应字段被重命名(fullName -> name),并添加了校验(name 为必填)。在询问影响、风险和下一步时效果最好。\n\n下面是一条包含 diff 无法提供关键上下文的示例提交信息草稿:\n\ntext\nRename user response field to `name` and require `name` on create\n\nWhy:\n- Align API with updated domain naming\n\nImpact:\n- Breaking change: clients reading `fullName` must switch to `name`\n- Requests without `name` now fail validation\n\nTests:\n- Updated API tests for response payload\n- Added validation test for missing name\n\n\n以及为用户撰写的发布说明条目:\n\ntext\nBreaking: User API field rename and stricter validation\n\n- Response field `fullName` is now `name`\n- Create/update requests now require `name`\n\nMigration:\n- Update JSON parsing to read `name`\n- If you send `fullName`, map it to `name` before calling the API\n\n\n把措辞收紧,去掉推测。比如“Align API with updated domain naming” 很模糊;如果你不知道原因,就写你所知道的,例如“标准化端点命名”。同样避免宣称你没跑过的测试,把“Updated API tests”换成测试套件名,或诚实写成“手动检查:通过 API 创建用户并验证响应负载”。\n\n## 常见错误与陷阱\n\n让 AI 写的提交失去信任的最快方式是让消息承诺超出 diff 本身。Claude Code 能把原始改动写得清楚,但也可能把内部重构推断为面向用户的功能,除非你让输出保持有据可查。\n\n常见错误包括夸大影响:重命名、添加帮助函数或在文件间移动逻辑很容易被写成“新特性”。当发布说明声称“提升性能”而没有测量或用户症状时,人们会注意到。\n\n另一常见问题是忽略破坏性变更和迁移。diff 常把它们藏在小处:默认配置变了、环境变量被重命名、数据库列变为 NOT NULL,或返回字段被移除。如果提交信息和变更日志没有说明升级后需要做什么,干净的发布就会变成支持工单。\n\n模糊措辞也很危险。“小幅改进”和“若干修复”会隐藏风险而非传达它。\n\n粘贴 diff 到提示时要注意的陷阱:\n\n- 把内部重构写成面向用户的声明\n- 忽略破坏性变更和迁移步骤\n- 用通用语言掩盖风险\n- 发明不在 diff 或上下文里的原因\n\n修正方法是强制“证据”思维。如果 diff 改了 API 字段名,发布说明必须写清客户端应如何重命名,以及旧客户端是否会中断。\n\n在接受模型输出前,再做一次请求:让它\n\n- 区分用户影响和内部改动\n- 把破坏性变更列出并给出具体迁移操作\n- 用通俗语言指出风险(以及不确定性)\n- 符合你仓库的提交风格规则\n\n## 合并或发布前的快速核对清单\n\n合并前,把提交信息当作外行人来读。如果它不能用通俗的话解释改动,就不会在紧急修复时帮你。如果用了 Claude Code,再快速核对是否与实际改动一致。\n\n### 提交信息快速检查\n\n- 改了什么、在哪里:指明功能/区域,不要只写“重构”。\n- 为什么改:一句话概括原因。\n- 影响:谁或什么会受影响。\n- 证据:说明你运行了哪些测试(或写明“未测试”及原因)。\n- 范围:信息是否与 diff 的大小和行为变更相符?\n\n若消息包含不在 diff 或工单里的细节,请删掉。一个简洁的“为什么”胜过冗长的故事。\n\n### 发布说明快速检查\n\n发布说明是给没看 PR 的读者的。\n\n- 面向用户:描述结果,不谈实现细节。\n- 风险明确:可能出什么问题,如何发现。\n- 包含迁移:配置变更、新的环境变量、数据回填或一次性操作。\n- 回滚说明:如果回退会发生什么,以及是否需要清理。\n\n### 禁止项清单\n\n发布前删除或重写:\n\n- 秘密或私有数据(令牌、密钥、客户信息)\n- 无测量支持的推测(“应该提升性能”)\n- 带有指责意味的语言(“ops 弄错了”、“前端搞砸了”)\n\n如果无法在不猜测的情况下解释改动,就暂停并补充上下文。\n\n## 下一步:在工作流程中养成习惯\n\n一致性胜过完美。选一个轻量格式,全队都在每次变更中遵守,即便在忙碌时也不例外。大家都按同一结构写,审查会更快,发布说明也不会像破案。\n\n一个经得起考验的轻量格式:\n\n- 改动(用户影响):一句话,通俗说明\n- 为什么:原因或要修复的问题\n- 风险:可能坏什么,以及如何降低风险\n- 迁移:所需步骤(如有)\n\n用 Claude Code 起草,然后人工快速校对事实与上下文。它在你给出 diff 加上 2–3 句意图(目标受众、改进目标、刻意不改的内容)时最有用。\n\n要在不增加会议的情况下扩展这个流程,把它内置到你常用的位置:在 commit 或 PR 模板中加入这些字段、勾选迁移与风险复选框,以及把审查重点从措辞转到缺失的影响上。\n\n如果你在 Koder.ai (koder.ai) 中构建,使用同样的结构也很自然:先写意图(影响、风险、迁移),然后按计划实现,这样“为什么”就不会随着代码变化而丢失。写一条包含三部分的信息:\n\n- 什么被改变(一句话)\n- 为什么(要修复的问题或目标)\n- 影响(谁会注意到,行为有哪些变化)\n\n仅在必要时或不确定时再补充 风险、迁移 和 测试。
因为 diff 只显示改动本身,不会说明意图。它通常无法告诉你:\n\n- 你修复的用户症状是什么\n- 谁会受影响(用户、管理员、API 客户端)\n- 是否可以安全回溯(backport)\n\n- 可能会坏掉什么以及如何回滚\n- 需要哪些迁移步骤\n\n一条好的提交信息会把 diff 转化为后来可被信赖的决策记录。
给出 diff,并补充 diff 无法显示的一小段上下文:\n\n- 意图(bug/目标)\n- 变更前后的期望行为\n- 谁会受影响\n- 发布计划(feature flag、分阶段发布)\n- 迁移/配置变更\n- 你做了哪些验证\n\n如果只贴 diff,生成的摘要经常会错过真实风险或夸大影响。
要求结构化输出以便快速核查:\n\n- Summary\n- Motivation\n- Impact\n- Risk\n- Migration\n- Tests\n\n并允许诚实的空白,例如写上 “Tests: not shown”,这样模型不会凭空表示置信度。
请求 2–3 个变体,例如:\n\n- 保守型(最小化,仅基于 diff 可证明的内容)\n- 面向用户(突出可见的行为变化)\n- 面向工程(指出重构、性能、后续工作)\n\n然后选择最符合你仓库风格、且没有无法证实声明的版本。
两者读者不同:\n\n- 提交信息 帮助审查者、未来维护者和值班工程师。可以包含一些技术细节、已运行的测试和风险说明。\n- 发布说明 帮助用户/管理员决定是否升级以及需要做什么。关注结果、破坏性变更和迁移步骤。\n\n如果某一句话对用户无关紧要,就不该出现在发布说明里。
明确标出并提供可执行操作:\n\n- 什么会中断(例如 API 字段被移除/重命名、配置键改变、约束变紧等)\n- 哪些用户会受影响(具体的客户端或用户群)\n- 需要做什么修改(确切的重命名或步骤)\n- 何时生效\n- 回滚 的注意事项(如果回滚会产生后果)\n\n避免模糊的表述,例如“微小改动”当升级可能导致失败时。
只列出实际需要执行的步骤,按顺序写明:\n\n1. 要修改的内容(配置、环境变量、客户端代码)\n2. 何时执行(部署前/后)\n3. 如何验证已生效\n4. 出问题时如何回滚/恢复\n\n如果无迁移,写上 “Migration: None”,避免读者疑惑。
把模型的输出当作待验证的声明:\n\n- 删除不在 diff 或工单里的原因。\n- 在没有测量时不要宣称性能/安全改进。\n- 不要列出未运行的测试——说明你运行了什么,或写明“未测试”。\n- 将用户影响与内部清理分开描述。\n\n任何听起来像猜测的内容,就改写为不确定或直接删除。
不要贴你不希望被复制的任何内容。移除或总结:\n\n- API 密钥、令牌、凭据\n- 客户名和个人数据\n- 内部主机名、事故细节、私有日志\n\n如果完整上下文敏感,请用安全的摘要代替,例如“验证变严格;旧客户端在更新前可能收到 400”。