Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

反对纯 Vibe Coding

本文档说明本项目对代码贡献的最低要求,以及对 asco/core 等核心模块的额外要求。

本项目不反对 AI 辅助开发,但反对一种不可接受的提交方式:作者本人没有充分检查、没有真正理解、也没有能力在出现问题后独立修复,却仅因为“代码看起来能跑”就将其提交。

这种行为在本文中称为“纯 Vibe Coding”。它不是指使用了 AI,而是指作者把生成结果当作完成标准,而不是把自己对代码、文档和行为语义的理解当作完成标准。

目标

本规则的目标只有两个:

  • 保证提交者真正理解自己贡献的内容。
  • 保证提交者在改动出现问题后有能力继续维护和修复。

任何贡献,无论是否使用 AI,最终责任都在提交者本人。

适用范围

本文适用于所有向本项目提交的代码与文档改动。

为避免流程失衡,本项目按改动影响分为三类:

  • 微小改动:错别字、死链接修复、纯格式调整、不会改变语义的注释修订。
  • 普通改动:一般功能、测试、文档、示例、非核心模块实现。
  • 核心改动:涉及 asco/core,或影响调度、取消、生命周期、并发语义、资源释放路径等基础行为的改动。

微小改动可以不适用本文中的完整材料要求;普通改动与核心改动均适用,其中核心改动适用更严格的额外要求。

本项目反对的不是 AI,而是不可维护的提交

以下行为可以接受:

  • 使用 AI 辅助整理思路、润色文档或生成样板代码。
  • 使用 AI 辅助起草测试、重构建议或命名建议。
  • 使用 AI 提供实现草案,但提交者随后亲自逐段核对并自行修正。

以下行为不可接受:

  • 作者无法解释自己提交的关键逻辑为何成立。
  • 作者无法说明边界条件、失败路径或资源释放路径。
  • 作者将“AI 给出的总结”当作自己对代码的理解。
  • 作者在 review 中无法独立修正自己提交中的明显问题。

在本项目中,“代码能跑”不是完成标准;“作者真正理解并能独立维护”才是完成标准。

普通改动的最低证明义务

每个非微小 PR 原则上都应附带一份作者自证说明。该说明不是变更摘要,而是作者对自己已经亲自检查并理解本次改动的责任声明。

作者自证说明只需要覆盖与本次改动真正相关、真正必要的部分,不需要为了过模板而逐项补满。通常可以围绕以下内容按需说明:

  • 这次改动要解决什么问题。
  • 关键行为发生了什么变化。
  • 自己亲自检查了哪些文件、哪些路径、哪些风险点。
  • 最可能出错的边界条件是什么。
  • 当前测试覆盖了什么,尚未覆盖什么。
  • 如果这里出现 bug,自己会先从哪里开始排查。
  • 本次改动哪些部分使用了 AI,AI 分别参与了哪些环节。
  • 对于 AI 参与生成的内容,自己做了哪些核对与修正。

如果提交者拒绝提供与本次改动直接相关的必要说明,或材料明显只是对改动的表面复述,则该 PR 不会被 review 和合并。

asco/core 的额外要求

asco/core 及其他核心路径承担运行时稳定性与长期维护责任,因此要求高于普通改动,提交的代码必须大部分手写。

对于核心改动,作者在提交 PR 前,还应先发 issue 说明自己要提交的改动。该说明同样只需要覆盖必要部分,不需要机械回答所有问题。通常应优先围绕以下问题按需说明:

  • 本次改动维护的语义、不变量或契约是什么。
  • 改动涉及哪些并发、取消、调度、生命周期或资源管理风险。
  • 为什么选择当前方案。
  • 当前方案的已知代价、限制与后续维护负担是什么。

对于核心改动,本项目不接受“我理解大意”式提交。作者必须能够脱离 AI 提供的摘要,独立说明:

  • 关键执行路径如何推进。
  • 状态如何变化。
  • 失败路径如何收束。
  • 资源在何处释放。
  • 并发或取消条件下有哪些风险点。

如果作者只能复述表面目标,而不能清楚说明上述内容,则不视为满足核心模块贡献要求。

“大部分手写”

对于核心模块开发者,本项目要求关键逻辑必须主要由作者本人真正掌握。

这里的“大部分手写”不是对字符数、行数或提交量的机械统计,也不是要求维护者去猜测某段代码“像不像 AI 写的”。本项目采用更严格、也更可执行的标准:

  • 关键逻辑必须处于作者本人可独立维护的控制之下。
  • 维护者有权要求作者脱离 AI 总结,独立解释关键代码的运行方式。
  • 维护者有权要求作者对关键路径做小幅修改、补测试或修边界条件。
  • 任何作者无法清楚解释、无法独立修改、无法独立修复的关键代码,都不应视为满足贡献要求。

因此,“大部分手写”的真正含义不是形式上的输入来源,而是关键逻辑没有脱离作者本人的理解和维护能力。

AI 使用披露

本项目要求贡献者主动披露 AI 的参与情况。披露的目的不是羞辱或惩罚,而是帮助维护者正确判断这次提交的风险边界和 review 深度。

AI 使用披露也只需要说明对本次改动有实际意义的部分,不需要把所有类别都逐项解释。通常可以说明 AI 是否参与了以下类型的工作:

  • 文档润色。
  • 测试样例草拟。
  • 非核心样板代码生成。
  • 核心逻辑草案或实现建议。
  • 重构建议、命名建议或 review 辅助。
  • 风险分析、边界条件整理或说明文字撰写。

如果 AI 参与了关键逻辑,作者还应补充说明:

  • 自己如何逐段核对生成结果。
  • 自己修改了哪些关键点。
  • 自己如何验证语义、边界条件与失败路径。

“我使用了 AI,但我已经亲自核对并对 AI 生成的代码负责”可以接受;“这部分是 AI 写的,但我没有逐段检查”不可以接受。

维护者的验证方式

维护者可以通过以下方式验证提交者是否满足要求:

  • 检查作者自证说明和相关说明是否覆盖了这次改动真正必要的部分,并且与代码一致。
  • 在 PR 讨论中随机抽取两到三个具体问题,要求作者解释实现、边界条件或失败路径。
  • 要求作者补充一个测试、修正一个边界条件、调整一段核心逻辑,观察其是否能独立完成。
  • 对核心改动要求作者说明对象生命周期、状态迁移、取消语义、并发约束或资源释放顺序。

维护者不需要证明作者“使用了多少 AI”,只需要判断作者是否已经充分理解并能够独立维护该改动。

不达标的处理方式

出现以下任一情况时,维护者可以拒绝合并,或要求作者补充材料后重新进入评审:

  • 拒绝提供与本次改动直接相关的必要自证说明。
  • 核心改动未发 issue 说明,或 issue 未覆盖本次改动真正关键的问题。
  • AI 使用披露明显缺失,或回避与本次改动直接相关的关键问题。
  • 作者无法解释关键逻辑或边界行为。
  • 作者无法独立修正自己提交中的明显问题。
  • 维护者合理判断该改动一旦出问题,提交者本人并不具备后续维护能力。

对于核心模块,上述任一问题都足以构成拒绝合并的理由。

结语

本项目不要求每个贡献者都完全不用 AI,也不把“纯手写”视为形式目标。本项目要求的是更直接、也更严肃的一点:

  • 你提交的代码和文档,你必须亲自看过。
  • 你提交的代码的行为语义,你必须真正清楚。
  • 你提交的关键逻辑一旦出问题,你必须有能力自己继续修。

如果做不到这些,那么无论代码是谁生成的,这份提交都还没有准备好进入本项目。