Actual 反 AI Slop 治理指南开源财务应用如何识别并处置机器生成的无效贡献【免费下载链接】actualA local-first personal finance app项目地址: https://gitcode.com/GitHub_Trending/ac/actual2025 年 11 月本地优先local-first个人财务应用 Actual 的维护者在官方博客发布了《Fighting AI Slop》见 packages/docs/blog/2025-11-15-fighting-ai-slop.md正式确立了一套针对纯 AI 自动生成、无任何人工把关的 Pull Request 与 Issue 的处置政策。本文以该公告为骨架结合仓库内的 AI 使用政策、贡献指南、AGENTS.md、PR 与提交规则 及 agent 钩子脚本 等一手材料系统解读这则政策出台的背景、具体条款、配套落地机制以及贡献者如何合规地用 AI 辅助参与开源。背景Actual 项目与AI Slop问题的由来ActualActual Budget是一个 100% 免费开源的本地优先个人财务应用核心代码以 TypeScript React 编写采用 Yarn 4 workspaces 的 monorepo 结构核心业务逻辑位于 packages/loot-core桌面与 Web 界面位于 packages/desktop-client文档站则是 monorepo 中的 packages/docsDocusaurus 构建。该项目长期依赖社区贡献来维护账户、预算、报表、同步等核心模块。在 2025-11-15 的公告中维护者 MatissJanis 描述了这样一个现象Actual 开始收到大量完全由自动化系统生成、没有任何人类参与的Pull Request 和 Issue即所谓AI slop。这类贡献与真实贡献一样需要投入等量的分诊triage与评审时间却不带来任何价值——花在处理机器垃圾上的每一分钟都是本应用于改进 Actual 本身的时间。需要强调的是这则公告的立场并非反对 AI。公告开篇即明确AI 是有用的工具维护团队自己也在用 AI 起草代码、修 Bug、构建功能甚至连这篇文章本身都是在 AI 辅助下写成的。关键区别在于——人类始终处于主导地位他们会对 AI 产出的内容进行评审、测试并为最终合入的结果负责。而 AI slop 恰恰相反它是未经审查的 AI 输出被盲目地推向上游以 PR 或 Issue 的形式打开。用公告的原话来说那不是贡献那是污染pollution。官方政策关闭 100% AI 生成且无人监督的 PR 与 Issue公告的核心政策只有一条直截了当从此刻起任何看起来 100% 由 AI 生成、且没有任何人类监督迹象的 PR 或 Issue都会被直接关闭。这并非苛责而是为了保护维护者有限的评审时间。该政策随后在 AI 使用政策 中得到了更细化的落地代码层面完全开放使用 GitHub Copilot、Cursor、Claude、ChatGPT 等工具生成代码、起草测试、修复 Bug、帮助理解代码库都是被允许甚至欢迎的。是否由 AI 编写并不重要重要的是产出必须达到项目标准通过yarn typecheck与yarn lint:fix、相关测试通过见 Testing Guide、遵循代码风格规范、面向用户的字符串必须完成翻译。与维护者的交流必须是真人PR 描述、评审回复、Issue 评论、讨论串中项目方期望与真人对话而不是与 AI 生成的回复对话。政策明确禁止三类行为把评审者的评论丢回 AI 后原样粘贴回复用 AI 整段生成 Issue/PR 描述而不自行阅读编辑用 AI 代替自己与维护者争论。理由是维护者带宽有限而评审过程中围绕变更的对话才是评审价值所在——当对话变成AI 对真人时它就失去了意义。必须披露 AI 使用情况如果 AI 参与了 Issue、PR 或其代码的相当一部分生成工作请在提交中说明。PR 描述里一句简短说明即可例如初始实现由 Claude 起草我随后进行了评审和编辑。对于看起来由 AI 生成但未披露的 Issue/PR可能不做评审直接关闭反复提交未披露 AI 内容或无视政策的贡献者可能被屏蔽blocked。质量优先于数量政策特别提醒现代 AI 工具可以极快地批量产出变更请克制一次打开大量 PR 的冲动——指向代码库让 AI 产什么就提交什么是典型的危险信号。一沓同时提交的相似 PR 的评审成本远高于单个经过充分测试的变更而且往往是作者本人没读过也没测过的信号。项目更希望收到一个你理解并验证过的变更而不是十个你从未验证过的变更。推荐的节奏是开一个 PR配合维护者完成评审与合入再开下一个。低质量、未测试或未披露的 AI 输出可能被不加详细评审地关闭反复提交者可能被屏蔽。为什么这很重要维护者带宽的有限性公告用一小节专门解释了这则政策背后的成本逻辑每一个 AI slop PR 或 Issue 都需要与真实贡献等量的分诊和评审时间而维护者的带宽是有限的这直接影响到真实 Issue 与功能请求的响应速度评审正当贡献可用的时间项目的整体推进速度project velocity。我们希望把时间花在改进 Actual 上而不是过滤自动化噪音。这一逻辑与贡献指南中的原则一脉相承——贡献指南 中明确写道维护者的心理健康优先于一切、一个开放的 PR 并不自动值得完整的评审与接受PR 作者有责任说服维护者这个变更是好的、值得评审。AI 政策的严格执行正是为了守护这种有质量的评审文化。如何用 AI 正确贡献公告给出的五项清单公告明确表示用 AI 辅助贡献完全没有问题但贡献者必须做到以下五点这也是后续 AI 使用政策You are responsible for what you submit一节的雏形完整评审Review everything提交前通读 AI 产出的全部内容理解每处改动是什么、为什么需要。对应政策中的读懂代码——能解释每个变更的作用与必要性。测试你的改动Test your changes不要假定 AI 生成的代码一定正确。政策进一步要求在本地运行它、运行测试、确认你声称的行为确实成立。项目可用的验证命令包括根目录下的yarn typecheck、yarn lint:fix、yarn test基于 lage 跨 workspace 并行执行配置见 lage.config.js。响应反馈Respond to feedback准备好讨论、迭代和改进你的贡献而不是把评审意见丢回 AI。承担责任Take responsibility提交者是你本人请确保提交的内容是你愿意为之背书的东西。政策中有一句掷地有声的话You are the author of the contribution. The AI is not.你是贡献的作者AI 不是。标记 ai generatedTag them项目方坦言这无法真正强制执行但它是一种善意的姿态能让评审流程中的所有参与者知道 AI 在何时参与了工作。此外政策还要求打磨 AI 生成的行文——AI 生成的描述往往冗长、重复或不准确请精简它们并确保与代码实际行为一致这是很多 AI 辅助贡献者容易忽略的一步。仓库中的配套治理机制政策如何落到代码与流程这则公告并非孤立的一纸声明仓库中已经有了一套环环相扣的落地机制可以从源码与配置中得到印证AI 使用政策文档packages/docs/docs/contributing/ai-usage-policy.md 将公告中的立场固化为正式贡献者文档并在 贡献指南 的 Additional Resources 中置顶引用。面向 AI Agent 的强制规则AGENTS.md 明确规定所有 PR 标题必须以[AI]开头且必须由 Agent 自行添加.github/agents/pr-and-commit-rules.md 进一步细化了规则PR 标题加[AI]前缀、不得代填 PR 模板模板正文保持原样由测试过改动的真人填写 Description、Related issues、Testing 与 Checklist、禁止 AI 创建 GitHub Issue提交 Issue 是人类决策、所有发布到 GitHub 的评论/评审/Issue 内容需以 前缀标记。机器钩子强制校验scripts/agent-hooks/git-guard.sh 是一个尽力而为的守护脚本挂在 Claude/Codex/Cursor 等 Agent 的 PreToolUse 钩子上会拦截在子 workspace 中运行 yarn、gh issue create、--no-verify跳过钩子、git config修改、强推/推送到 main、以及提交信息不以[AI]开头的 git commit。脚本注释明确说明它不追求对抗恶意绕过——真正把关的是 CI 与分支保护。PR 模板中的披露位.github/PULL_REQUEST_TEMPLATE.md 在 Description 区预留了明确的披露提示If AI tools wrote a significant part of this change, please disclose it here and name the tool you used.与必须披露 AI 使用情况的政策一一对应。分诊流程配合packages/docs/docs/contributing/leadership/triaging-issues.md 描述了 Issue 分诊标准打上上下文标签与行动标签、信息不足打needs info标签并在 7 天内无回复自动关闭、技术求助类 Issue 直接关闭并引导至 Discord。这套机制客观上也为过滤 AI 生成的无效 Issue 提供了兜底。意外的收获WIP 工作流成为一道隐形验证码公告末尾分享了一个耐人寻味的细节项目的WIPWork-In-Progress工作流——PR 标题需手动移除 WIP 前缀后才可进入评审——意外地成了过滤 AI 机器人的有效手段。贡献指南 中的提交 PR 流程也印证了这一点Once your PR is ready for maintainers to review, remove the[WIP]label from the PR title.。维护者将这道人类必须主动完成、机器却常常卡住的简单步骤称为我们无意中构建的一道验证码unintentional captcha许多自动化机器人无法完成这一步它们的 PR 因此搁置go stale并最终被自动关闭仓库中存在 stale 相关的自动化工作流 .github/workflows/stale.yml 与之呼应。不过维护者也清醒地指出即便如此最好还是根本不要收到 AI slop。结语保持人性AI 辅助但人主导公告以一句朴素的话收尾也构成了整个治理框架的精神内核Actual 是由人构建、为人构建的。请保持这一点。Actual is built by humans, for humans. Keep it that way.总结这套治理方案的要点项目不拒绝 AI 辅助——欢迎用它写代码、起草测试、修 Bug但拒绝无人监督的 AI 输出——拒绝 100% 自动生成的 PR/Issue拒绝用 AI 代替真人对话拒绝不披露的 AI 内容拒绝缺乏测试与理解的批量提交。对于想用 AI 帮助贡献的开发者官方给出的最佳实践可以浓缩为一句话AI 可以帮你写代码但理解、测试、沟通与责任永远是人类的。项目对一切真实贡献无论是否 AI 辅助都心怀感激关键在于人类是否有监督与理解。这条边界既保护了维护者有限的带宽也保护了开源协作中最珍贵的部分——人与人之间围绕代码展开的对话。【免费下载链接】actualA local-first personal finance app项目地址: https://gitcode.com/GitHub_Trending/ac/actual创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
