<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:qiaomu="https://qiaomu.ai/ns/rss/1.0">
  <channel>
    <title>X News</title>
    <link>https://xnews.qiaomu.ai/</link>
    <description>海外创始人长文 · AI 视频 · 乔木中文改写</description>
    <language>zh-CN</language>
    <lastBuildDate>Fri, 06 Nov 2026 09:08:49 +0000</lastBuildDate>
    <atom:link href="https://xnews.qiaomu.ai/feed.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>CaptureFlow：边录屏边上传，支持 Docker 自托管</title>
      <link>https://xnews.qiaomu.ai/a/captureflow-screen-recorder</link>
      <guid isPermaLink="true">https://xnews.qiaomu.ai/a/captureflow-screen-recorder</guid>
      <pubDate>Fri, 06 Nov 2026 08:10:18 +0000</pubDate>
      <author>Sardor</author>
      <description><![CDATA[<p><em>Chrome 扩展已上架，macOS 签名版仍待发布；Docker 使用 SQLite 和本地磁盘，也可部署到 Cloudflare Workers、D1、R2。</em></p>
<h2>乔木改写</h2>
<p>Sardor 在 11 月 6 日介绍了自己做的开源录屏工具 CaptureFlow：人在 Chrome 里录屏，结束后把链接发给别人；AI Agent 也可以通过 MCP 录制演示。它支持 Docker 自托管。原帖所链接的仓库 README 进一步写明，录制过程中就会上传，停止录制时分享链接已经准备好了。</p>
<h2>能录什么，在哪里使用</h2>
<p>CaptureFlow 可以录制浏览器标签页、窗口或整个屏幕，并加入摄像头悬浮画面和麦克风声音。观看者可以在视频里发表情、留言，录制者能看到谁看过。截图也可以加箭头、文字和模糊遮挡，再用同样的链接方式分享。</p>
<p>团队使用工作区管理内容，可设为公开、仅工作区成员可见或私密。托管服务按整个团队的存储量收费，不按席位收费；付费方案提供 100 GB、500 GB 或 1 TB 存储空间。作者说明，全部功能都包含在开源构建中，也可以部署到自己的 Cloudflare 账户，并把登录范围限制在公司内。</p>
<p>Chrome 扩展已经在 <a href="https://chromewebstore.google.com/detail/lgpgeoelaokbigdljofhkgbfnfcnmcol" target="_blank" rel="noopener noreferrer">Chrome Web Store</a> 上架。macOS 应用目前可以从源码构建，签名发行版仍是即将推出的状态；网页管理台和观看页支持现代浏览器。托管版可以先<a href="https://captureflow.dev/login?mode=signup" target="_blank" rel="noopener noreferrer">注册免费账户</a>，再安装扩展，具体付费额度见<a href="https://captureflow.dev/pricing" target="_blank" rel="noopener noreferrer">价格页</a>。</p>
<p>在原帖评论里，@progerallworld 提出的用途是让 Agent 重现 Bug、录下步骤，再附上视频。Sardor 回复说，这正是他加入 MCP 时考虑的场景。随后他又补充，也可以让 Agent 为 GitHub Pull Request 录制演示，并附到 PR 描述里；安装扩展后，审阅者可以观看演示来理解改动。这是作者对用途的说明，本轮没有连接 MCP 或试录视频。</p>
<h2>用 Docker 部署</h2>
<p>README 给出的 Docker 启动方式很短：先执行 <code>cp .env.example .env</code>，设置 <code>APP_URL</code>，再执行 <code>docker compose up -d</code>。</p>
<p>数据都保存在 <code>./data</code>：SQLite 数据库、磁盘上的录屏文件，以及第一次启动时生成的密钥。这条部署路线不需要 Cloudflare 账户。生成转写可以使用兼容 OpenAI 接口的 Whisper 服务；Compose 也提供 <code>--profile whisper</code> 来运行一个这样的服务。完整说明在 <a href="https://docs.captureflow.dev/self-hosting/docker" target="_blank" rel="noopener noreferrer">Docker 部署文档</a>。</p>
<h2>部署到自己的 Cloudflare 账户</h2>
<p>另一条路线使用 Cloudflare Workers、D1 和 R2。仓库提供了<a href="https://deploy.workers.cloudflare.com/?url=https://github.com/sardorml/captureflow" target="_blank" rel="noopener noreferrer">一键部署入口</a>，也列出了手动步骤。</p>
<p>先运行 <code>pnpm --filter @captureflow/web exec wrangler d1 create captureflow</code> 创建数据库，再运行 <code>pnpm --filter @captureflow/web exec wrangler r2 bucket create captureflow-recordings</code> 创建存储桶。把数据库 ID 填入 <code>apps/web/wrangler.jsonc</code> 后，依次执行 <code>pnpm --filter @captureflow/web db:apply:remote</code> 和 <code>pnpm --filter @captureflow/web cf:deploy</code>。</p>
<p><a href="https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/DEPLOY.md" target="_blank" rel="noopener noreferrer">DEPLOY.md</a> 说明了密钥、登录服务、自定义域名，以及如何让扩展和桌面应用连接自己的实例。部署在自己的域名下会作为自托管实例运行；如果要做成公司内部工具，还需要按照<a href="https://docs.captureflow.dev/self-hosting/configuration" target="_blank" rel="noopener noreferrer">配置文档</a>设置 <code>ALLOWED_EMAIL_DOMAINS</code>。仓库也链接了<a href="https://captureflow.dev/blog/self-hosted-screen-recorder" target="_blank" rel="noopener noreferrer">逐步自托管教程</a>和<a href="https://captureflow.dev/self-host-setup" target="_blank" rel="noopener noreferrer">代配置服务</a>。</p>
<h2>本地开发和检查</h2>
<p>开发环境需要 Node.js 24.13 或更新版本，以及 pnpm 10；README 提示用 <code>corepack enable</code> 启用。取得仓库并进入目录后，先执行 <code>pnpm install</code>。</p>
<p>完整的取代码命令是 <code>git clone git@github.com:sardorml/captureflow.git</code>，接着执行 <code>cd captureflow</code>。<code>pnpm web</code> 启动网页管理台和官网，地址为 <code>http://localhost:3032</code>；<code>pnpm admin</code> 启动实例管理后台，地址为 <code>http://localhost:3034</code>。<code>pnpm extension</code> 会在一个新的 Chrome 配置环境中启动浏览器扩展；macOS 录屏应用的开发命令是 <code>pnpm --filter @captureflow/desktop dev</code>。</p>
<p>仓库列出的检查命令分别是 <code>pnpm typecheck</code>、<code>pnpm --filter @captureflow/web test</code>、<code>pnpm --filter @captureflow/extension test</code> 和 <code>pnpm format</code>。这里保留的是作者提供的命令，没有把文档中的检查项写成本站已经跑过的结果。</p>
<h2>仓库如何拆分</h2>
<p>应用放在 <code>apps/</code>，共享包放在 <code>packages/</code>。依赖方向有明确约束：应用可以依赖共享包，共享包不能反向依赖应用，应用之间也不能互相依赖。</p>
<ul>
<li><code>apps/web</code> 使用 Next.js 16，包含官网、博客、管理台、观看页和 API，通过 OpenNext 部署到 Cloudflare Workers。</li>
<li><code>apps/admin</code> 是运行在独立主机名下的实例管理 Worker，与主应用绑定同一组 D1 和 R2。</li>
<li><code>apps/mailer</code> 是产品邮件 Worker，通过 Resend 发送管理员编写的邮件活动，并处理退订。</li>
<li><code>apps/extension</code> 是基于 WXT、MV3 的浏览器录屏扩展，包含面板、离屏采集和页面内控制。</li>
<li><code>apps/desktop</code> 是基于 Electron 的 macOS 录屏应用；<code>apps/docs</code> 是 VitePress 文档站。</li>
<li><code>packages/engine</code> 是桌面端与扩展共用的采集引擎，包含 macOS 辅助程序、录制协议和封装处理，采用 MIT 许可。</li>
<li><code>packages/admin</code> 为管理后台提供认证与数据逻辑；<code>packages/mail</code> 负责邮件活动、渲染、退订令牌、Resend 投递和事务邮件。</li>
<li><code>packages/quota</code> 管理存储额度、限制与工作区；<code>packages/shared</code> 放各应用共享的类型和常量；<code>packages/ui</code> 放主题令牌，以及没有对应 HeroUI 组件的 React 组件。</li>
</ul>
<p>macOS 采集辅助程序以编译后的二进制文件形式存入仓库。修改 Swift 源码后，需要运行 <code>packages/engine/scripts/build-native.sh</code> 重新构建；加上 <code>--universal</code> 可以同时支持 arm64 和 x86_64。</p>
<h2>文档、贡献和许可</h2>
<p>项目的<a href="https://captureflow.dev" target="_blank" rel="noopener noreferrer">官网</a>、<a href="https://docs.captureflow.dev" target="_blank" rel="noopener noreferrer">文档</a>、<a href="https://docs.captureflow.dev/self-hosting/overview" target="_blank" rel="noopener noreferrer">自托管总览</a>、<a href="https://captureflow.dev/blog" target="_blank" rel="noopener noreferrer">博客</a>、<a href="https://captureflow.dev/faq" target="_blank" rel="noopener noreferrer">FAQ</a>、<a href="https://captureflow.dev/security" target="_blank" rel="noopener noreferrer">安全说明</a>、<a href="https://github.com/sardorml/captureflow/releases" target="_blank" rel="noopener noreferrer">发行记录</a>和 <a href="https://discord.gg/qzeBCaEeNq" target="_blank" rel="noopener noreferrer">Discord</a> 均由 README 提供入口。</p>
<p>作者欢迎 Bug 报告、想法和 Pull Request，可以到<a href="https://github.com/sardorml/captureflow/issues/new" target="_blank" rel="noopener noreferrer">仓库 Issues</a>或<a href="https://captureflow.dev/suggest-feature" target="_blank" rel="noopener noreferrer">功能建议页</a>提交。贡献前需要阅读 <a href="https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/CONVENTIONS.md" target="_blank" rel="noopener noreferrer">CONVENTIONS.md</a>。发现安全问题应按照安全页说明私下报告，不要发到公开 Issue。</p>
<p>项目采用 <a href="https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/LICENSE" target="_blank" rel="noopener noreferrer">AGPL-3.0-only</a>，例外是可复用的采集引擎 <code>packages/engine</code>，它采用 <a href="https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/packages/engine/LICENSE" target="_blank" rel="noopener noreferrer">MIT</a> 许可。桌面应用与浏览器扩展的组合构建，整体仍适用 AGPL-3.0-only。</p>
<p>本文完整改写上述作者帖文、已取得的作者回复及固定版本 README；README 最近修改于 11 月 4 日，不能把 11 月 6 日的介绍帖当成当天发布新版本。文档文字按上游 AGPL-3.0-only 许可使用，<a href="https://xnews.qiaomu.ai/source-licenses/captureflow-AGPL-3.0.txt" target="_blank" rel="noopener noreferrer">许可全文</a>随站点提供；本站中文不是官方文档。</p>
<section class="rewrite-source-media" aria-label="原文附带媒体"><h3 class="source-media-heading">原文附带媒体</h3><p class="completeness-note">来源附带的产品概览配图；未核验与中文具体段落的一一对应关系，集中保留于文末。</p><figure data-media-id="x_2118616401619603456"><img src="https://pbs.twimg.com/media/HWbWZHHaUAAm62F.jpg" alt="CaptureFlow 作者原帖配图"><figcaption><a href="https://pbs.twimg.com/media/HWbWZHHaUAAm62F.jpg">打开原始媒体 ↗</a></figcaption></figure>
<figure data-media-id="captureflow_readme_hero"><img src="https://raw.githubusercontent.com/sardorml/captureflow/c5792345e7d5e47084c5e829b3f11c98a432c859/.github/assets/readme-hero.png" alt="CaptureFlow: open-source screen recorder with shareable links, above the recordings dashboard"><figcaption><a href="https://raw.githubusercontent.com/sardorml/captureflow/c5792345e7d5e47084c5e829b3f11c98a432c859/.github/assets/readme-hero.png">打开原始媒体 ↗</a></figcaption></figure></section>
<h2>原文</h2>
<p><em>CaptureFlow — author announcement, replies and complete README</em></p>
<figure data-media-id="x_2118616401619603456"><img src="https://pbs.twimg.com/media/HWbWZHHaUAAm62F.jpg" alt="CaptureFlow 作者原帖配图"><figcaption><a href="https://pbs.twimg.com/media/HWbWZHHaUAAm62F.jpg">打开原始媒体 ↗</a></figcaption></figure>
<figure data-media-id="captureflow_readme_hero"><img src="https://raw.githubusercontent.com/sardorml/captureflow/c5792345e7d5e47084c5e829b3f11c98a432c859/.github/assets/readme-hero.png" alt="CaptureFlow: open-source screen recorder with shareable links, above the recordings dashboard"><figcaption><a href="https://raw.githubusercontent.com/sardorml/captureflow/c5792345e7d5e47084c5e829b3f11c98a432c859/.github/assets/readme-hero.png">打开原始媒体 ↗</a></figcaption></figure>
<h2>Author announcement — Sardor (@sardorml)</h2>
<p>Source: https://x.com/sardorml/status/2118616954085024133</p>
<p>I built CaptureFlow, an open-source screen recorder for you and your AI agents.</p>
<p>Record your screen in Chrome and get a link you can share with anyone. Or let your agent record the demo over #MCP.</p>
<p>Self-host it with Docker.</p>
<p>https://t.co/GwIkaJEH9C</p>
<p>#opensource #buildinpublic https://t.co/dlOESaA0wJ</p>
<h2>Public reply context — @progerallworld (not the author)</h2>
<p>Source: https://x.com/progerallworld/status/2118618493977313326</p>
<p>@sardorml This could be useful for bug reports too: agent reproduces the issue, records the steps, attaches the clip. Much easier to review than “I clicked around and it broke” 😅</p>
<h2>Author reply — Sardor (@sardorml)</h2>
<p>Source: https://x.com/sardorml/status/2118619339041755560</p>
<p>@progerallworld Yes, definitely. That&#x27;s the use case i had in mind when i added the MCP.</p>
<h2>Author reply — Sardor (@sardorml)</h2>
<p>Source: https://x.com/sardorml/status/2118621775856865775</p>
<p>@progerallworld You can also ask it record a demo for your github pull request and it will attach it to the pr description. With extension installed reviewers can watch the demo to get a better idea of the changes.</p>
<h2>Linked README — complete text, fixed source snapshot</h2>
<p>Source: https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/README.md</p>
<p>&lt;div align=&quot;center&quot;&gt;&lt;a name=&quot;readme-top&quot;&gt;&lt;/a&gt;</p>
<p>&lt;picture&gt; &lt;source media=&quot;(prefers-color-scheme: dark)&quot; srcset=&quot;apps/web/public/brand-mark-light.svg&quot; /&gt; &lt;img src=&quot;apps/web/public/brand-mark-dark.svg&quot; height=&quot;112&quot; alt=&quot;CaptureFlow&quot; /&gt; &lt;/picture&gt;</p>
<p>&lt;h1&gt;CaptureFlow&lt;/h1&gt;</p>
<p>Open-source screen recorder with instant share links, self-hostable on your own Cloudflare account.</p>
<p>[![CI status][ci-image]][ci-url] [![License: AGPL-3.0][license-image]][license-url] [![Chrome Web Store][chrome-image]][chrome-url] [![Stars][stars-image]][stars-url] [![Discord][discord-image]][discord-url]</p>
<p>[Website][website-url] · [Docs][docs-url] · [Blog][blog-url] · [Report Bug][issues-url] · [Request Feature][feature-url]</p>
<p>[ci-image]: https://github.com/sardorml/captureflow/actions/workflows/ci.yml/badge.svg [ci-url]: https://github.com/sardorml/captureflow/actions/workflows/ci.yml [license-image]: https://img.shields.io/badge/license-AGPL--3.0-2563EB.svg?style=flat-square [license-url]: ./LICENSE [chrome-image]: https://img.shields.io/chrome-web-store/v/lgpgeoelaokbigdljofhkgbfnfcnmcol?label=chrome%20web%20store&amp;color=2563EB&amp;style=flat-square [chrome-url]: https://chromewebstore.google.com/detail/lgpgeoelaokbigdljofhkgbfnfcnmcol [stars-image]: https://img.shields.io/github/stars/sardorml/captureflow?color=2563EB&amp;style=flat-square [stars-url]: https://github.com/sardorml/captureflow/stargazers [discord-image]: https://img.shields.io/badge/chat-discord-5865F2.svg?style=flat-square [discord-url]: https://discord.gg/qzeBCaEeNq [website-url]: https://captureflow.dev [docs-url]: https://docs.captureflow.dev [blog-url]: https://captureflow.dev/blog [issues-url]: https://github.com/sardorml/captureflow/issues/new [feature-url]: https://captureflow.dev/suggest-feature</p>
<p>&lt;/div&gt;</p>
<p>[![CaptureFlow: open-source screen recorder with shareable links, above the recordings dashboard](.github/assets/readme-hero.png)](https://captureflow.dev)</p>
<h2>✨ Features</h2>
<ul>
<li>🔗 The share link is ready the moment you stop: the upload runs while you record.</li>
<li>🎥 Record a tab, a window or your whole screen, with camera bubble and mic.</li>
<li>💬 Viewers react with emoji and comment right on the video, and you see who watched.</li>
<li>🖼 Annotated screenshots with arrows, text and blur, shared by the same kind of link.</li>
<li>👥 Workspaces for your team, with public, workspace-only or private visibility.</li>
<li>💸 Priced by storage for the whole team, never per seat.</li>
<li>☁️ Self-host on your own Cloudflare account, with sign-in limited to your company.</li>
<li>🔓 Every feature ships in the open-source build.</li>
</ul>
<h2>🖥 Where it runs</h2>
<p>| Surface                   | Status                                          | | ------------------------- | ----------------------------------------------- | | Chrome extension          | Available on the [Chrome Web Store][chrome-url] | | macOS app                 | Build from source; signed release coming soon   | | Web dashboard and viewers | Any modern browser                              |</p>
<h2>📦 Get started</h2>
<ul>
<li><strong>Hosted:</strong> <a href="https://captureflow.dev/login?mode=signup" target="_blank" rel="noopener noreferrer">create a free account</a> and install the [Chrome extension][chrome-url]. Paid plans add 100 GB, 500 GB or 1 TB for the whole team; see <a href="https://captureflow.dev/pricing" target="_blank" rel="noopener noreferrer">pricing</a>.</li>
<li><strong>Self-hosted:</strong> <code>docker compose up</code> on your own server, or run it on your own Cloudflare account (Workers, D1 and R2). Follow the <a href="https://captureflow.dev/blog/self-hosted-screen-recorder" target="_blank" rel="noopener noreferrer">step-by-step guide</a>, or <a href="https://captureflow.dev/self-host-setup" target="_blank" rel="noopener noreferrer">let us set it up for you</a>.</li>
</ul>
<h2>☁️ Self-hosting</h2>
<h3>Docker</h3>
<p>``<code>bash cp .env.example .env    # set APP_URL docker compose up -d </code>``</p>
<p>Everything lives in <code>./data</code>: a SQLite database, the recordings on disk, and secrets generated on first start. You don&#x27;t need a Cloudflare account. Transcripts can use any OpenAI-compatible Whisper server, including one compose runs for you with <code>--profile whisper</code>. See the <a href="https://docs.captureflow.dev/self-hosting/docker" target="_blank" rel="noopener noreferrer">Docker guide</a>.</p>
<h3>Cloudflare</h3>
<p><a href="https://deploy.workers.cloudflare.com/button" target="_blank" rel="noopener noreferrer">![Deploy to Cloudflare</a>](https://deploy.workers.cloudflare.com/?url=https://github.com/sardorml/captureflow)</p>
<p>Or manually:</p>
<p>```bash pnpm --filter @captureflow/web exec wrangler d1 create captureflow pnpm --filter @captureflow/web exec wrangler r2 bucket create captureflow-recordings</p>
<h1>paste the database id into apps/web/wrangler.jsonc, then:</h1>
<p>pnpm --filter @captureflow/web db:apply:remote pnpm --filter @captureflow/web cf:deploy ```</p>
<p>[<code>DEPLOY.md</code>](./DEPLOY.md) is the full runbook: secrets, sign-in providers, custom domains, and pointing the extension and desktop app at your own instance. A deployment on your own domain runs as a self-hosted instance; to make it a private company tool, set <code>ALLOWED_EMAIL_DOMAINS</code> as described in the <a href="https://docs.captureflow.dev/self-hosting/configuration" target="_blank" rel="noopener noreferrer">configuration docs</a>.</p>
<h2>⌨️ Development</h2>
<p>Requires Node.js 24.13 or newer and pnpm 10 (<code>corepack enable</code>).</p>
<p>``<code>bash git clone git@github.com:sardorml/captureflow.git cd captureflow pnpm install pnpm web                                  # dashboard and landing on http://localhost:3032 pnpm admin                                # instance admin on http://localhost:3034 pnpm extension                            # browser extension, in a fresh Chrome profile pnpm --filter @captureflow/desktop dev    # macOS recorder </code>``</p>
<p>Checks:</p>
<p>``<code>bash pnpm typecheck pnpm --filter @captureflow/web test pnpm --filter @captureflow/extension test pnpm format </code>``</p>
<p>&lt;details&gt; &lt;summary&gt;Monorepo layout&lt;/summary&gt;</p>
<p>``<code> apps/ web/         Next.js 16 landing, blog, dashboard, viewers and API → Cloudflare Workers (OpenNext) admin/       Instance-admin Worker on its own host, bound to the same D1 and R2 mailer/      Product-email Worker: sends admin-written campaigns via Resend, handles unsubscribe extension/   Browser recorder (WXT, MV3): panel, offscreen capture, in-page controls desktop/     Electron screen recorder (macOS) docs/        VitePress documentation site packages/ engine/      Capture engine shared by desktop and extension: macOS sidecars, record protocol, mux (MIT) admin/       Admin auth and data logic behind apps/admin mail/        Campaigns, email rendering, unsubscribe tokens, Resend delivery, transactional sends quota/       Storage quota, limits and workspace logic shared/      Types and constants shared across the apps ui/          Theme tokens and the React components with no HeroUI equivalent </code>``</p>
<p>Apps depend on packages, never the reverse, and never on each other.</p>
<p>The macOS capture sidecars are committed as built binaries. After editing the Swift sources, rebuild them with <code>packages/engine/scripts/build-native.sh</code> (add <code>--universal</code> for arm64 + x86_64).</p>
<p>&lt;/details&gt;</p>
<h2>🔗 Links</h2>
<ul>
<li><a href="https://captureflow.dev" target="_blank" rel="noopener noreferrer">Website</a></li>
<li><a href="https://docs.captureflow.dev" target="_blank" rel="noopener noreferrer">Documentation</a></li>
<li><a href="https://docs.captureflow.dev/self-hosting/overview" target="_blank" rel="noopener noreferrer">Self-hosting docs</a></li>
<li><a href="https://captureflow.dev/blog" target="_blank" rel="noopener noreferrer">Blog</a></li>
<li><a href="https://captureflow.dev/pricing" target="_blank" rel="noopener noreferrer">Pricing</a></li>
<li><a href="https://captureflow.dev/faq" target="_blank" rel="noopener noreferrer">FAQ</a></li>
<li><a href="https://captureflow.dev/security" target="_blank" rel="noopener noreferrer">Security</a></li>
<li><a href="https://github.com/sardorml/captureflow/releases" target="_blank" rel="noopener noreferrer">Releases</a></li>
<li>[Discord][discord-url]</li>
</ul>
<h2>🤝 Contributing <a href="https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square" target="_blank" rel="noopener noreferrer">![PRs Welcome</a>](https://github.com/sardorml/captureflow/pulls)</h2>
<p>Bug reports, ideas and pull requests are all welcome. Open an [issue][issues-url], [suggest a feature][feature-url], or send a pull request. Read [<code>CONVENTIONS.md</code>](./CONVENTIONS.md) first: it&#x27;s the standard every change follows.</p>
<p>Found a security issue? Please report it privately as described on the <a href="https://captureflow.dev/security" target="_blank" rel="noopener noreferrer">security page</a>, not in a public issue.</p>
<h2>📄 License</h2>
<p>[AGPL-3.0-only](./LICENSE), with one exception: the reusable capture engine in [<code>packages/engine</code>](./packages/engine) is [MIT-licensed](./packages/engine/LICENSE). Combined builds (the desktop app and the browser extension) are AGPL-3.0-only as a whole.</p>
<p>&lt;div align=&quot;right&quot;&gt;&lt;a href=&quot;#readme-top&quot;&gt;Back to top ↑&lt;/a&gt;&lt;/div&gt;</p>
<p><strong>原文链接：</strong><a href="https://x.com/sardorml/status/2118616954085024133">https://x.com/sardorml/status/2118616954085024133</a></p>
<p><strong>相关链接：</strong><a href="https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/README.md">https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/README.md</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Chrome 扩展已上架，macOS 签名版仍待发布；Docker 使用 SQLite 和本地磁盘，也可部署到 Cloudflare Workers、D1、R2。</em></p>
<h2>乔木改写</h2>
<p>Sardor 在 11 月 6 日介绍了自己做的开源录屏工具 CaptureFlow：人在 Chrome 里录屏，结束后把链接发给别人；AI Agent 也可以通过 MCP 录制演示。它支持 Docker 自托管。原帖所链接的仓库 README 进一步写明，录制过程中就会上传，停止录制时分享链接已经准备好了。</p>
<h2>能录什么，在哪里使用</h2>
<p>CaptureFlow 可以录制浏览器标签页、窗口或整个屏幕，并加入摄像头悬浮画面和麦克风声音。观看者可以在视频里发表情、留言，录制者能看到谁看过。截图也可以加箭头、文字和模糊遮挡，再用同样的链接方式分享。</p>
<p>团队使用工作区管理内容，可设为公开、仅工作区成员可见或私密。托管服务按整个团队的存储量收费，不按席位收费；付费方案提供 100 GB、500 GB 或 1 TB 存储空间。作者说明，全部功能都包含在开源构建中，也可以部署到自己的 Cloudflare 账户，并把登录范围限制在公司内。</p>
<p>Chrome 扩展已经在 <a href="https://chromewebstore.google.com/detail/lgpgeoelaokbigdljofhkgbfnfcnmcol" target="_blank" rel="noopener noreferrer">Chrome Web Store</a> 上架。macOS 应用目前可以从源码构建，签名发行版仍是即将推出的状态；网页管理台和观看页支持现代浏览器。托管版可以先<a href="https://captureflow.dev/login?mode=signup" target="_blank" rel="noopener noreferrer">注册免费账户</a>，再安装扩展，具体付费额度见<a href="https://captureflow.dev/pricing" target="_blank" rel="noopener noreferrer">价格页</a>。</p>
<p>在原帖评论里，@progerallworld 提出的用途是让 Agent 重现 Bug、录下步骤，再附上视频。Sardor 回复说，这正是他加入 MCP 时考虑的场景。随后他又补充，也可以让 Agent 为 GitHub Pull Request 录制演示，并附到 PR 描述里；安装扩展后，审阅者可以观看演示来理解改动。这是作者对用途的说明，本轮没有连接 MCP 或试录视频。</p>
<h2>用 Docker 部署</h2>
<p>README 给出的 Docker 启动方式很短：先执行 <code>cp .env.example .env</code>，设置 <code>APP_URL</code>，再执行 <code>docker compose up -d</code>。</p>
<p>数据都保存在 <code>./data</code>：SQLite 数据库、磁盘上的录屏文件，以及第一次启动时生成的密钥。这条部署路线不需要 Cloudflare 账户。生成转写可以使用兼容 OpenAI 接口的 Whisper 服务；Compose 也提供 <code>--profile whisper</code> 来运行一个这样的服务。完整说明在 <a href="https://docs.captureflow.dev/self-hosting/docker" target="_blank" rel="noopener noreferrer">Docker 部署文档</a>。</p>
<h2>部署到自己的 Cloudflare 账户</h2>
<p>另一条路线使用 Cloudflare Workers、D1 和 R2。仓库提供了<a href="https://deploy.workers.cloudflare.com/?url=https://github.com/sardorml/captureflow" target="_blank" rel="noopener noreferrer">一键部署入口</a>，也列出了手动步骤。</p>
<p>先运行 <code>pnpm --filter @captureflow/web exec wrangler d1 create captureflow</code> 创建数据库，再运行 <code>pnpm --filter @captureflow/web exec wrangler r2 bucket create captureflow-recordings</code> 创建存储桶。把数据库 ID 填入 <code>apps/web/wrangler.jsonc</code> 后，依次执行 <code>pnpm --filter @captureflow/web db:apply:remote</code> 和 <code>pnpm --filter @captureflow/web cf:deploy</code>。</p>
<p><a href="https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/DEPLOY.md" target="_blank" rel="noopener noreferrer">DEPLOY.md</a> 说明了密钥、登录服务、自定义域名，以及如何让扩展和桌面应用连接自己的实例。部署在自己的域名下会作为自托管实例运行；如果要做成公司内部工具，还需要按照<a href="https://docs.captureflow.dev/self-hosting/configuration" target="_blank" rel="noopener noreferrer">配置文档</a>设置 <code>ALLOWED_EMAIL_DOMAINS</code>。仓库也链接了<a href="https://captureflow.dev/blog/self-hosted-screen-recorder" target="_blank" rel="noopener noreferrer">逐步自托管教程</a>和<a href="https://captureflow.dev/self-host-setup" target="_blank" rel="noopener noreferrer">代配置服务</a>。</p>
<h2>本地开发和检查</h2>
<p>开发环境需要 Node.js 24.13 或更新版本，以及 pnpm 10；README 提示用 <code>corepack enable</code> 启用。取得仓库并进入目录后，先执行 <code>pnpm install</code>。</p>
<p>完整的取代码命令是 <code>git clone git@github.com:sardorml/captureflow.git</code>，接着执行 <code>cd captureflow</code>。<code>pnpm web</code> 启动网页管理台和官网，地址为 <code>http://localhost:3032</code>；<code>pnpm admin</code> 启动实例管理后台，地址为 <code>http://localhost:3034</code>。<code>pnpm extension</code> 会在一个新的 Chrome 配置环境中启动浏览器扩展；macOS 录屏应用的开发命令是 <code>pnpm --filter @captureflow/desktop dev</code>。</p>
<p>仓库列出的检查命令分别是 <code>pnpm typecheck</code>、<code>pnpm --filter @captureflow/web test</code>、<code>pnpm --filter @captureflow/extension test</code> 和 <code>pnpm format</code>。这里保留的是作者提供的命令，没有把文档中的检查项写成本站已经跑过的结果。</p>
<h2>仓库如何拆分</h2>
<p>应用放在 <code>apps/</code>，共享包放在 <code>packages/</code>。依赖方向有明确约束：应用可以依赖共享包，共享包不能反向依赖应用，应用之间也不能互相依赖。</p>
<ul>
<li><code>apps/web</code> 使用 Next.js 16，包含官网、博客、管理台、观看页和 API，通过 OpenNext 部署到 Cloudflare Workers。</li>
<li><code>apps/admin</code> 是运行在独立主机名下的实例管理 Worker，与主应用绑定同一组 D1 和 R2。</li>
<li><code>apps/mailer</code> 是产品邮件 Worker，通过 Resend 发送管理员编写的邮件活动，并处理退订。</li>
<li><code>apps/extension</code> 是基于 WXT、MV3 的浏览器录屏扩展，包含面板、离屏采集和页面内控制。</li>
<li><code>apps/desktop</code> 是基于 Electron 的 macOS 录屏应用；<code>apps/docs</code> 是 VitePress 文档站。</li>
<li><code>packages/engine</code> 是桌面端与扩展共用的采集引擎，包含 macOS 辅助程序、录制协议和封装处理，采用 MIT 许可。</li>
<li><code>packages/admin</code> 为管理后台提供认证与数据逻辑；<code>packages/mail</code> 负责邮件活动、渲染、退订令牌、Resend 投递和事务邮件。</li>
<li><code>packages/quota</code> 管理存储额度、限制与工作区；<code>packages/shared</code> 放各应用共享的类型和常量；<code>packages/ui</code> 放主题令牌，以及没有对应 HeroUI 组件的 React 组件。</li>
</ul>
<p>macOS 采集辅助程序以编译后的二进制文件形式存入仓库。修改 Swift 源码后，需要运行 <code>packages/engine/scripts/build-native.sh</code> 重新构建；加上 <code>--universal</code> 可以同时支持 arm64 和 x86_64。</p>
<h2>文档、贡献和许可</h2>
<p>项目的<a href="https://captureflow.dev" target="_blank" rel="noopener noreferrer">官网</a>、<a href="https://docs.captureflow.dev" target="_blank" rel="noopener noreferrer">文档</a>、<a href="https://docs.captureflow.dev/self-hosting/overview" target="_blank" rel="noopener noreferrer">自托管总览</a>、<a href="https://captureflow.dev/blog" target="_blank" rel="noopener noreferrer">博客</a>、<a href="https://captureflow.dev/faq" target="_blank" rel="noopener noreferrer">FAQ</a>、<a href="https://captureflow.dev/security" target="_blank" rel="noopener noreferrer">安全说明</a>、<a href="https://github.com/sardorml/captureflow/releases" target="_blank" rel="noopener noreferrer">发行记录</a>和 <a href="https://discord.gg/qzeBCaEeNq" target="_blank" rel="noopener noreferrer">Discord</a> 均由 README 提供入口。</p>
<p>作者欢迎 Bug 报告、想法和 Pull Request，可以到<a href="https://github.com/sardorml/captureflow/issues/new" target="_blank" rel="noopener noreferrer">仓库 Issues</a>或<a href="https://captureflow.dev/suggest-feature" target="_blank" rel="noopener noreferrer">功能建议页</a>提交。贡献前需要阅读 <a href="https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/CONVENTIONS.md" target="_blank" rel="noopener noreferrer">CONVENTIONS.md</a>。发现安全问题应按照安全页说明私下报告，不要发到公开 Issue。</p>
<p>项目采用 <a href="https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/LICENSE" target="_blank" rel="noopener noreferrer">AGPL-3.0-only</a>，例外是可复用的采集引擎 <code>packages/engine</code>，它采用 <a href="https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/packages/engine/LICENSE" target="_blank" rel="noopener noreferrer">MIT</a> 许可。桌面应用与浏览器扩展的组合构建，整体仍适用 AGPL-3.0-only。</p>
<p>本文完整改写上述作者帖文、已取得的作者回复及固定版本 README；README 最近修改于 11 月 4 日，不能把 11 月 6 日的介绍帖当成当天发布新版本。文档文字按上游 AGPL-3.0-only 许可使用，<a href="https://xnews.qiaomu.ai/source-licenses/captureflow-AGPL-3.0.txt" target="_blank" rel="noopener noreferrer">许可全文</a>随站点提供；本站中文不是官方文档。</p>
<section class="rewrite-source-media" aria-label="原文附带媒体"><h3 class="source-media-heading">原文附带媒体</h3><p class="completeness-note">来源附带的产品概览配图；未核验与中文具体段落的一一对应关系，集中保留于文末。</p><figure data-media-id="x_2118616401619603456"><img src="https://pbs.twimg.com/media/HWbWZHHaUAAm62F.jpg" alt="CaptureFlow 作者原帖配图"><figcaption><a href="https://pbs.twimg.com/media/HWbWZHHaUAAm62F.jpg">打开原始媒体 ↗</a></figcaption></figure>
<figure data-media-id="captureflow_readme_hero"><img src="https://raw.githubusercontent.com/sardorml/captureflow/c5792345e7d5e47084c5e829b3f11c98a432c859/.github/assets/readme-hero.png" alt="CaptureFlow: open-source screen recorder with shareable links, above the recordings dashboard"><figcaption><a href="https://raw.githubusercontent.com/sardorml/captureflow/c5792345e7d5e47084c5e829b3f11c98a432c859/.github/assets/readme-hero.png">打开原始媒体 ↗</a></figcaption></figure></section>
<h2>原文</h2>
<p><em>CaptureFlow — author announcement, replies and complete README</em></p>
<figure data-media-id="x_2118616401619603456"><img src="https://pbs.twimg.com/media/HWbWZHHaUAAm62F.jpg" alt="CaptureFlow 作者原帖配图"><figcaption><a href="https://pbs.twimg.com/media/HWbWZHHaUAAm62F.jpg">打开原始媒体 ↗</a></figcaption></figure>
<figure data-media-id="captureflow_readme_hero"><img src="https://raw.githubusercontent.com/sardorml/captureflow/c5792345e7d5e47084c5e829b3f11c98a432c859/.github/assets/readme-hero.png" alt="CaptureFlow: open-source screen recorder with shareable links, above the recordings dashboard"><figcaption><a href="https://raw.githubusercontent.com/sardorml/captureflow/c5792345e7d5e47084c5e829b3f11c98a432c859/.github/assets/readme-hero.png">打开原始媒体 ↗</a></figcaption></figure>
<h2>Author announcement — Sardor (@sardorml)</h2>
<p>Source: https://x.com/sardorml/status/2118616954085024133</p>
<p>I built CaptureFlow, an open-source screen recorder for you and your AI agents.</p>
<p>Record your screen in Chrome and get a link you can share with anyone. Or let your agent record the demo over #MCP.</p>
<p>Self-host it with Docker.</p>
<p>https://t.co/GwIkaJEH9C</p>
<p>#opensource #buildinpublic https://t.co/dlOESaA0wJ</p>
<h2>Public reply context — @progerallworld (not the author)</h2>
<p>Source: https://x.com/progerallworld/status/2118618493977313326</p>
<p>@sardorml This could be useful for bug reports too: agent reproduces the issue, records the steps, attaches the clip. Much easier to review than “I clicked around and it broke” 😅</p>
<h2>Author reply — Sardor (@sardorml)</h2>
<p>Source: https://x.com/sardorml/status/2118619339041755560</p>
<p>@progerallworld Yes, definitely. That&#x27;s the use case i had in mind when i added the MCP.</p>
<h2>Author reply — Sardor (@sardorml)</h2>
<p>Source: https://x.com/sardorml/status/2118621775856865775</p>
<p>@progerallworld You can also ask it record a demo for your github pull request and it will attach it to the pr description. With extension installed reviewers can watch the demo to get a better idea of the changes.</p>
<h2>Linked README — complete text, fixed source snapshot</h2>
<p>Source: https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/README.md</p>
<p>&lt;div align=&quot;center&quot;&gt;&lt;a name=&quot;readme-top&quot;&gt;&lt;/a&gt;</p>
<p>&lt;picture&gt; &lt;source media=&quot;(prefers-color-scheme: dark)&quot; srcset=&quot;apps/web/public/brand-mark-light.svg&quot; /&gt; &lt;img src=&quot;apps/web/public/brand-mark-dark.svg&quot; height=&quot;112&quot; alt=&quot;CaptureFlow&quot; /&gt; &lt;/picture&gt;</p>
<p>&lt;h1&gt;CaptureFlow&lt;/h1&gt;</p>
<p>Open-source screen recorder with instant share links, self-hostable on your own Cloudflare account.</p>
<p>[![CI status][ci-image]][ci-url] [![License: AGPL-3.0][license-image]][license-url] [![Chrome Web Store][chrome-image]][chrome-url] [![Stars][stars-image]][stars-url] [![Discord][discord-image]][discord-url]</p>
<p>[Website][website-url] · [Docs][docs-url] · [Blog][blog-url] · [Report Bug][issues-url] · [Request Feature][feature-url]</p>
<p>[ci-image]: https://github.com/sardorml/captureflow/actions/workflows/ci.yml/badge.svg [ci-url]: https://github.com/sardorml/captureflow/actions/workflows/ci.yml [license-image]: https://img.shields.io/badge/license-AGPL--3.0-2563EB.svg?style=flat-square [license-url]: ./LICENSE [chrome-image]: https://img.shields.io/chrome-web-store/v/lgpgeoelaokbigdljofhkgbfnfcnmcol?label=chrome%20web%20store&amp;color=2563EB&amp;style=flat-square [chrome-url]: https://chromewebstore.google.com/detail/lgpgeoelaokbigdljofhkgbfnfcnmcol [stars-image]: https://img.shields.io/github/stars/sardorml/captureflow?color=2563EB&amp;style=flat-square [stars-url]: https://github.com/sardorml/captureflow/stargazers [discord-image]: https://img.shields.io/badge/chat-discord-5865F2.svg?style=flat-square [discord-url]: https://discord.gg/qzeBCaEeNq [website-url]: https://captureflow.dev [docs-url]: https://docs.captureflow.dev [blog-url]: https://captureflow.dev/blog [issues-url]: https://github.com/sardorml/captureflow/issues/new [feature-url]: https://captureflow.dev/suggest-feature</p>
<p>&lt;/div&gt;</p>
<p>[![CaptureFlow: open-source screen recorder with shareable links, above the recordings dashboard](.github/assets/readme-hero.png)](https://captureflow.dev)</p>
<h2>✨ Features</h2>
<ul>
<li>🔗 The share link is ready the moment you stop: the upload runs while you record.</li>
<li>🎥 Record a tab, a window or your whole screen, with camera bubble and mic.</li>
<li>💬 Viewers react with emoji and comment right on the video, and you see who watched.</li>
<li>🖼 Annotated screenshots with arrows, text and blur, shared by the same kind of link.</li>
<li>👥 Workspaces for your team, with public, workspace-only or private visibility.</li>
<li>💸 Priced by storage for the whole team, never per seat.</li>
<li>☁️ Self-host on your own Cloudflare account, with sign-in limited to your company.</li>
<li>🔓 Every feature ships in the open-source build.</li>
</ul>
<h2>🖥 Where it runs</h2>
<p>| Surface                   | Status                                          | | ------------------------- | ----------------------------------------------- | | Chrome extension          | Available on the [Chrome Web Store][chrome-url] | | macOS app                 | Build from source; signed release coming soon   | | Web dashboard and viewers | Any modern browser                              |</p>
<h2>📦 Get started</h2>
<ul>
<li><strong>Hosted:</strong> <a href="https://captureflow.dev/login?mode=signup" target="_blank" rel="noopener noreferrer">create a free account</a> and install the [Chrome extension][chrome-url]. Paid plans add 100 GB, 500 GB or 1 TB for the whole team; see <a href="https://captureflow.dev/pricing" target="_blank" rel="noopener noreferrer">pricing</a>.</li>
<li><strong>Self-hosted:</strong> <code>docker compose up</code> on your own server, or run it on your own Cloudflare account (Workers, D1 and R2). Follow the <a href="https://captureflow.dev/blog/self-hosted-screen-recorder" target="_blank" rel="noopener noreferrer">step-by-step guide</a>, or <a href="https://captureflow.dev/self-host-setup" target="_blank" rel="noopener noreferrer">let us set it up for you</a>.</li>
</ul>
<h2>☁️ Self-hosting</h2>
<h3>Docker</h3>
<p>``<code>bash cp .env.example .env    # set APP_URL docker compose up -d </code>``</p>
<p>Everything lives in <code>./data</code>: a SQLite database, the recordings on disk, and secrets generated on first start. You don&#x27;t need a Cloudflare account. Transcripts can use any OpenAI-compatible Whisper server, including one compose runs for you with <code>--profile whisper</code>. See the <a href="https://docs.captureflow.dev/self-hosting/docker" target="_blank" rel="noopener noreferrer">Docker guide</a>.</p>
<h3>Cloudflare</h3>
<p><a href="https://deploy.workers.cloudflare.com/button" target="_blank" rel="noopener noreferrer">![Deploy to Cloudflare</a>](https://deploy.workers.cloudflare.com/?url=https://github.com/sardorml/captureflow)</p>
<p>Or manually:</p>
<p>```bash pnpm --filter @captureflow/web exec wrangler d1 create captureflow pnpm --filter @captureflow/web exec wrangler r2 bucket create captureflow-recordings</p>
<h1>paste the database id into apps/web/wrangler.jsonc, then:</h1>
<p>pnpm --filter @captureflow/web db:apply:remote pnpm --filter @captureflow/web cf:deploy ```</p>
<p>[<code>DEPLOY.md</code>](./DEPLOY.md) is the full runbook: secrets, sign-in providers, custom domains, and pointing the extension and desktop app at your own instance. A deployment on your own domain runs as a self-hosted instance; to make it a private company tool, set <code>ALLOWED_EMAIL_DOMAINS</code> as described in the <a href="https://docs.captureflow.dev/self-hosting/configuration" target="_blank" rel="noopener noreferrer">configuration docs</a>.</p>
<h2>⌨️ Development</h2>
<p>Requires Node.js 24.13 or newer and pnpm 10 (<code>corepack enable</code>).</p>
<p>``<code>bash git clone git@github.com:sardorml/captureflow.git cd captureflow pnpm install pnpm web                                  # dashboard and landing on http://localhost:3032 pnpm admin                                # instance admin on http://localhost:3034 pnpm extension                            # browser extension, in a fresh Chrome profile pnpm --filter @captureflow/desktop dev    # macOS recorder </code>``</p>
<p>Checks:</p>
<p>``<code>bash pnpm typecheck pnpm --filter @captureflow/web test pnpm --filter @captureflow/extension test pnpm format </code>``</p>
<p>&lt;details&gt; &lt;summary&gt;Monorepo layout&lt;/summary&gt;</p>
<p>``<code> apps/ web/         Next.js 16 landing, blog, dashboard, viewers and API → Cloudflare Workers (OpenNext) admin/       Instance-admin Worker on its own host, bound to the same D1 and R2 mailer/      Product-email Worker: sends admin-written campaigns via Resend, handles unsubscribe extension/   Browser recorder (WXT, MV3): panel, offscreen capture, in-page controls desktop/     Electron screen recorder (macOS) docs/        VitePress documentation site packages/ engine/      Capture engine shared by desktop and extension: macOS sidecars, record protocol, mux (MIT) admin/       Admin auth and data logic behind apps/admin mail/        Campaigns, email rendering, unsubscribe tokens, Resend delivery, transactional sends quota/       Storage quota, limits and workspace logic shared/      Types and constants shared across the apps ui/          Theme tokens and the React components with no HeroUI equivalent </code>``</p>
<p>Apps depend on packages, never the reverse, and never on each other.</p>
<p>The macOS capture sidecars are committed as built binaries. After editing the Swift sources, rebuild them with <code>packages/engine/scripts/build-native.sh</code> (add <code>--universal</code> for arm64 + x86_64).</p>
<p>&lt;/details&gt;</p>
<h2>🔗 Links</h2>
<ul>
<li><a href="https://captureflow.dev" target="_blank" rel="noopener noreferrer">Website</a></li>
<li><a href="https://docs.captureflow.dev" target="_blank" rel="noopener noreferrer">Documentation</a></li>
<li><a href="https://docs.captureflow.dev/self-hosting/overview" target="_blank" rel="noopener noreferrer">Self-hosting docs</a></li>
<li><a href="https://captureflow.dev/blog" target="_blank" rel="noopener noreferrer">Blog</a></li>
<li><a href="https://captureflow.dev/pricing" target="_blank" rel="noopener noreferrer">Pricing</a></li>
<li><a href="https://captureflow.dev/faq" target="_blank" rel="noopener noreferrer">FAQ</a></li>
<li><a href="https://captureflow.dev/security" target="_blank" rel="noopener noreferrer">Security</a></li>
<li><a href="https://github.com/sardorml/captureflow/releases" target="_blank" rel="noopener noreferrer">Releases</a></li>
<li>[Discord][discord-url]</li>
</ul>
<h2>🤝 Contributing <a href="https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square" target="_blank" rel="noopener noreferrer">![PRs Welcome</a>](https://github.com/sardorml/captureflow/pulls)</h2>
<p>Bug reports, ideas and pull requests are all welcome. Open an [issue][issues-url], [suggest a feature][feature-url], or send a pull request. Read [<code>CONVENTIONS.md</code>](./CONVENTIONS.md) first: it&#x27;s the standard every change follows.</p>
<p>Found a security issue? Please report it privately as described on the <a href="https://captureflow.dev/security" target="_blank" rel="noopener noreferrer">security page</a>, not in a public issue.</p>
<h2>📄 License</h2>
<p>[AGPL-3.0-only](./LICENSE), with one exception: the reusable capture engine in [<code>packages/engine</code>](./packages/engine) is [MIT-licensed](./packages/engine/LICENSE). Combined builds (the desktop app and the browser extension) are AGPL-3.0-only as a whole.</p>
<p>&lt;div align=&quot;right&quot;&gt;&lt;a href=&quot;#readme-top&quot;&gt;Back to top ↑&lt;/a&gt;&lt;/div&gt;</p>
<p><strong>原文链接：</strong><a href="https://x.com/sardorml/status/2118616954085024133">https://x.com/sardorml/status/2118616954085024133</a></p>
<p><strong>相关链接：</strong><a href="https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/README.md">https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/README.md</a></p>]]></content:encoded>
      <qiaomu:versions><![CDATA[{"version": 1, "original": {"title": "CaptureFlow — author announcement, replies and complete README", "url": "https://x.com/sardorml/status/2118616954085024133", "lang": "en", "html": "<h2>CaptureFlow — author announcement, replies and complete README</h2>\n<figure data-media-id=\"x_2118616401619603456\"><img src=\"https://pbs.twimg.com/media/HWbWZHHaUAAm62F.jpg\" alt=\"CaptureFlow 作者原帖配图\"><figcaption><a href=\"https://pbs.twimg.com/media/HWbWZHHaUAAm62F.jpg\">打开原始媒体 ↗</a></figcaption></figure>\n<figure data-media-id=\"captureflow_readme_hero\"><img src=\"https://raw.githubusercontent.com/sardorml/captureflow/c5792345e7d5e47084c5e829b3f11c98a432c859/.github/assets/readme-hero.png\" alt=\"CaptureFlow: open-source screen recorder with shareable links, above the recordings dashboard\"><figcaption><a href=\"https://raw.githubusercontent.com/sardorml/captureflow/c5792345e7d5e47084c5e829b3f11c98a432c859/.github/assets/readme-hero.png\">打开原始媒体 ↗</a></figcaption></figure>\n<h2>Author announcement — Sardor (@sardorml)</h2>\n<p>Source: https://x.com/sardorml/status/2118616954085024133</p>\n<p>I built CaptureFlow, an open-source screen recorder for you and your AI agents.</p>\n<p>Record your screen in Chrome and get a link you can share with anyone. Or let your agent record the demo over #MCP.</p>\n<p>Self-host it with Docker.</p>\n<p>https://t.co/GwIkaJEH9C</p>\n<p>#opensource #buildinpublic https://t.co/dlOESaA0wJ</p>\n<h2>Public reply context — @progerallworld (not the author)</h2>\n<p>Source: https://x.com/progerallworld/status/2118618493977313326</p>\n<p>@sardorml This could be useful for bug reports too: agent reproduces the issue, records the steps, attaches the clip. Much easier to review than “I clicked around and it broke” 😅</p>\n<h2>Author reply — Sardor (@sardorml)</h2>\n<p>Source: https://x.com/sardorml/status/2118619339041755560</p>\n<p>@progerallworld Yes, definitely. That&#x27;s the use case i had in mind when i added the MCP.</p>\n<h2>Author reply — Sardor (@sardorml)</h2>\n<p>Source: https://x.com/sardorml/status/2118621775856865775</p>\n<p>@progerallworld You can also ask it record a demo for your github pull request and it will attach it to the pr description. With extension installed reviewers can watch the demo to get a better idea of the changes.</p>\n<h2>Linked README — complete text, fixed source snapshot</h2>\n<p>Source: https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/README.md</p>\n<p>&lt;div align=&quot;center&quot;&gt;&lt;a name=&quot;readme-top&quot;&gt;&lt;/a&gt;</p>\n<p>&lt;picture&gt; &lt;source media=&quot;(prefers-color-scheme: dark)&quot; srcset=&quot;apps/web/public/brand-mark-light.svg&quot; /&gt; &lt;img src=&quot;apps/web/public/brand-mark-dark.svg&quot; height=&quot;112&quot; alt=&quot;CaptureFlow&quot; /&gt; &lt;/picture&gt;</p>\n<p>&lt;h1&gt;CaptureFlow&lt;/h1&gt;</p>\n<p>Open-source screen recorder with instant share links, self-hostable on your own Cloudflare account.</p>\n<p>[![CI status][ci-image]][ci-url] [![License: AGPL-3.0][license-image]][license-url] [![Chrome Web Store][chrome-image]][chrome-url] [![Stars][stars-image]][stars-url] [![Discord][discord-image]][discord-url]</p>\n<p>[Website][website-url] · [Docs][docs-url] · [Blog][blog-url] · [Report Bug][issues-url] · [Request Feature][feature-url]</p>\n<p>[ci-image]: https://github.com/sardorml/captureflow/actions/workflows/ci.yml/badge.svg [ci-url]: https://github.com/sardorml/captureflow/actions/workflows/ci.yml [license-image]: https://img.shields.io/badge/license-AGPL--3.0-2563EB.svg?style=flat-square [license-url]: ./LICENSE [chrome-image]: https://img.shields.io/chrome-web-store/v/lgpgeoelaokbigdljofhkgbfnfcnmcol?label=chrome%20web%20store&amp;color=2563EB&amp;style=flat-square [chrome-url]: https://chromewebstore.google.com/detail/lgpgeoelaokbigdljofhkgbfnfcnmcol [stars-image]: https://img.shields.io/github/stars/sardorml/captureflow?color=2563EB&amp;style=flat-square [stars-url]: https://github.com/sardorml/captureflow/stargazers [discord-image]: https://img.shields.io/badge/chat-discord-5865F2.svg?style=flat-square [discord-url]: https://discord.gg/qzeBCaEeNq [website-url]: https://captureflow.dev [docs-url]: https://docs.captureflow.dev [blog-url]: https://captureflow.dev/blog [issues-url]: https://github.com/sardorml/captureflow/issues/new [feature-url]: https://captureflow.dev/suggest-feature</p>\n<p>&lt;/div&gt;</p>\n<p>[![CaptureFlow: open-source screen recorder with shareable links, above the recordings dashboard](.github/assets/readme-hero.png)](https://captureflow.dev)</p>\n<h2>✨ Features</h2>\n<ul>\n<li>🔗 The share link is ready the moment you stop: the upload runs while you record.</li>\n<li>🎥 Record a tab, a window or your whole screen, with camera bubble and mic.</li>\n<li>💬 Viewers react with emoji and comment right on the video, and you see who watched.</li>\n<li>🖼 Annotated screenshots with arrows, text and blur, shared by the same kind of link.</li>\n<li>👥 Workspaces for your team, with public, workspace-only or private visibility.</li>\n<li>💸 Priced by storage for the whole team, never per seat.</li>\n<li>☁️ Self-host on your own Cloudflare account, with sign-in limited to your company.</li>\n<li>🔓 Every feature ships in the open-source build.</li>\n</ul>\n<h2>🖥 Where it runs</h2>\n<p>| Surface                   | Status                                          | | ------------------------- | ----------------------------------------------- | | Chrome extension          | Available on the [Chrome Web Store][chrome-url] | | macOS app                 | Build from source; signed release coming soon   | | Web dashboard and viewers | Any modern browser                              |</p>\n<h2>📦 Get started</h2>\n<ul>\n<li><strong>Hosted:</strong> <a href=\"https://captureflow.dev/login?mode=signup\" target=\"_blank\" rel=\"noopener noreferrer\">create a free account</a> and install the [Chrome extension][chrome-url]. Paid plans add 100 GB, 500 GB or 1 TB for the whole team; see <a href=\"https://captureflow.dev/pricing\" target=\"_blank\" rel=\"noopener noreferrer\">pricing</a>.</li>\n<li><strong>Self-hosted:</strong> <code>docker compose up</code> on your own server, or run it on your own Cloudflare account (Workers, D1 and R2). Follow the <a href=\"https://captureflow.dev/blog/self-hosted-screen-recorder\" target=\"_blank\" rel=\"noopener noreferrer\">step-by-step guide</a>, or <a href=\"https://captureflow.dev/self-host-setup\" target=\"_blank\" rel=\"noopener noreferrer\">let us set it up for you</a>.</li>\n</ul>\n<h2>☁️ Self-hosting</h2>\n<h3>Docker</h3>\n<p>``<code>bash cp .env.example .env    # set APP_URL docker compose up -d </code>``</p>\n<p>Everything lives in <code>./data</code>: a SQLite database, the recordings on disk, and secrets generated on first start. You don&#x27;t need a Cloudflare account. Transcripts can use any OpenAI-compatible Whisper server, including one compose runs for you with <code>--profile whisper</code>. See the <a href=\"https://docs.captureflow.dev/self-hosting/docker\" target=\"_blank\" rel=\"noopener noreferrer\">Docker guide</a>.</p>\n<h3>Cloudflare</h3>\n<p><a href=\"https://deploy.workers.cloudflare.com/button\" target=\"_blank\" rel=\"noopener noreferrer\">![Deploy to Cloudflare</a>](https://deploy.workers.cloudflare.com/?url=https://github.com/sardorml/captureflow)</p>\n<p>Or manually:</p>\n<p>```bash pnpm --filter @captureflow/web exec wrangler d1 create captureflow pnpm --filter @captureflow/web exec wrangler r2 bucket create captureflow-recordings</p>\n<h1>paste the database id into apps/web/wrangler.jsonc, then:</h1>\n<p>pnpm --filter @captureflow/web db:apply:remote pnpm --filter @captureflow/web cf:deploy ```</p>\n<p>[<code>DEPLOY.md</code>](./DEPLOY.md) is the full runbook: secrets, sign-in providers, custom domains, and pointing the extension and desktop app at your own instance. A deployment on your own domain runs as a self-hosted instance; to make it a private company tool, set <code>ALLOWED_EMAIL_DOMAINS</code> as described in the <a href=\"https://docs.captureflow.dev/self-hosting/configuration\" target=\"_blank\" rel=\"noopener noreferrer\">configuration docs</a>.</p>\n<h2>⌨️ Development</h2>\n<p>Requires Node.js 24.13 or newer and pnpm 10 (<code>corepack enable</code>).</p>\n<p>``<code>bash git clone git@github.com:sardorml/captureflow.git cd captureflow pnpm install pnpm web                                  # dashboard and landing on http://localhost:3032 pnpm admin                                # instance admin on http://localhost:3034 pnpm extension                            # browser extension, in a fresh Chrome profile pnpm --filter @captureflow/desktop dev    # macOS recorder </code>``</p>\n<p>Checks:</p>\n<p>``<code>bash pnpm typecheck pnpm --filter @captureflow/web test pnpm --filter @captureflow/extension test pnpm format </code>``</p>\n<p>&lt;details&gt; &lt;summary&gt;Monorepo layout&lt;/summary&gt;</p>\n<p>``<code> apps/ web/         Next.js 16 landing, blog, dashboard, viewers and API → Cloudflare Workers (OpenNext) admin/       Instance-admin Worker on its own host, bound to the same D1 and R2 mailer/      Product-email Worker: sends admin-written campaigns via Resend, handles unsubscribe extension/   Browser recorder (WXT, MV3): panel, offscreen capture, in-page controls desktop/     Electron screen recorder (macOS) docs/        VitePress documentation site packages/ engine/      Capture engine shared by desktop and extension: macOS sidecars, record protocol, mux (MIT) admin/       Admin auth and data logic behind apps/admin mail/        Campaigns, email rendering, unsubscribe tokens, Resend delivery, transactional sends quota/       Storage quota, limits and workspace logic shared/      Types and constants shared across the apps ui/          Theme tokens and the React components with no HeroUI equivalent </code>``</p>\n<p>Apps depend on packages, never the reverse, and never on each other.</p>\n<p>The macOS capture sidecars are committed as built binaries. After editing the Swift sources, rebuild them with <code>packages/engine/scripts/build-native.sh</code> (add <code>--universal</code> for arm64 + x86_64).</p>\n<p>&lt;/details&gt;</p>\n<h2>🔗 Links</h2>\n<ul>\n<li><a href=\"https://captureflow.dev\" target=\"_blank\" rel=\"noopener noreferrer\">Website</a></li>\n<li><a href=\"https://docs.captureflow.dev\" target=\"_blank\" rel=\"noopener noreferrer\">Documentation</a></li>\n<li><a href=\"https://docs.captureflow.dev/self-hosting/overview\" target=\"_blank\" rel=\"noopener noreferrer\">Self-hosting docs</a></li>\n<li><a href=\"https://captureflow.dev/blog\" target=\"_blank\" rel=\"noopener noreferrer\">Blog</a></li>\n<li><a href=\"https://captureflow.dev/pricing\" target=\"_blank\" rel=\"noopener noreferrer\">Pricing</a></li>\n<li><a href=\"https://captureflow.dev/faq\" target=\"_blank\" rel=\"noopener noreferrer\">FAQ</a></li>\n<li><a href=\"https://captureflow.dev/security\" target=\"_blank\" rel=\"noopener noreferrer\">Security</a></li>\n<li><a href=\"https://github.com/sardorml/captureflow/releases\" target=\"_blank\" rel=\"noopener noreferrer\">Releases</a></li>\n<li>[Discord][discord-url]</li>\n</ul>\n<h2>🤝 Contributing <a href=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square\" target=\"_blank\" rel=\"noopener noreferrer\">![PRs Welcome</a>](https://github.com/sardorml/captureflow/pulls)</h2>\n<p>Bug reports, ideas and pull requests are all welcome. Open an [issue][issues-url], [suggest a feature][feature-url], or send a pull request. Read [<code>CONVENTIONS.md</code>](./CONVENTIONS.md) first: it&#x27;s the standard every change follows.</p>\n<p>Found a security issue? Please report it privately as described on the <a href=\"https://captureflow.dev/security\" target=\"_blank\" rel=\"noopener noreferrer\">security page</a>, not in a public issue.</p>\n<h2>📄 License</h2>\n<p>[AGPL-3.0-only](./LICENSE), with one exception: the reusable capture engine in [<code>packages/engine</code>](./packages/engine) is [MIT-licensed](./packages/engine/LICENSE). Combined builds (the desktop app and the browser extension) are AGPL-3.0-only as a whole.</p>\n<p>&lt;div align=&quot;right&quot;&gt;&lt;a href=&quot;#readme-top&quot;&gt;Back to top ↑&lt;/a&gt;&lt;/div&gt;</p>\n<p>原文链接：<a href=\"https://x.com/sardorml/status/2118616954085024133\">https://x.com/sardorml/status/2118616954085024133</a></p>\n<p>相关链接：<a href=\"https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/README.md\">https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/README.md</a></p>"}, "rewrite": {"title": "CaptureFlow：边录屏边上传，支持 Docker 自托管", "markdown": "Sardor 在 11 月 6 日介绍了自己做的开源录屏工具 CaptureFlow：人在 Chrome 里录屏，结束后把链接发给别人；AI Agent 也可以通过 MCP 录制演示。它支持 Docker 自托管。原帖所链接的仓库 README 进一步写明，录制过程中就会上传，停止录制时分享链接已经准备好了。\n\n## 能录什么，在哪里使用\n\nCaptureFlow 可以录制浏览器标签页、窗口或整个屏幕，并加入摄像头悬浮画面和麦克风声音。观看者可以在视频里发表情、留言，录制者能看到谁看过。截图也可以加箭头、文字和模糊遮挡，再用同样的链接方式分享。\n\n团队使用工作区管理内容，可设为公开、仅工作区成员可见或私密。托管服务按整个团队的存储量收费，不按席位收费；付费方案提供 100 GB、500 GB 或 1 TB 存储空间。作者说明，全部功能都包含在开源构建中，也可以部署到自己的 Cloudflare 账户，并把登录范围限制在公司内。\n\nChrome 扩展已经在 [Chrome Web Store](https://chromewebstore.google.com/detail/lgpgeoelaokbigdljofhkgbfnfcnmcol) 上架。macOS 应用目前可以从源码构建，签名发行版仍是即将推出的状态；网页管理台和观看页支持现代浏览器。托管版可以先[注册免费账户](https://captureflow.dev/login?mode=signup)，再安装扩展，具体付费额度见[价格页](https://captureflow.dev/pricing)。\n\n在原帖评论里，@progerallworld 提出的用途是让 Agent 重现 Bug、录下步骤，再附上视频。Sardor 回复说，这正是他加入 MCP 时考虑的场景。随后他又补充，也可以让 Agent 为 GitHub Pull Request 录制演示，并附到 PR 描述里；安装扩展后，审阅者可以观看演示来理解改动。这是作者对用途的说明，本轮没有连接 MCP 或试录视频。\n\n## 用 Docker 部署\n\nREADME 给出的 Docker 启动方式很短：先执行 `cp .env.example .env`，设置 `APP_URL`，再执行 `docker compose up -d`。\n\n数据都保存在 `./data`：SQLite 数据库、磁盘上的录屏文件，以及第一次启动时生成的密钥。这条部署路线不需要 Cloudflare 账户。生成转写可以使用兼容 OpenAI 接口的 Whisper 服务；Compose 也提供 `--profile whisper` 来运行一个这样的服务。完整说明在 [Docker 部署文档](https://docs.captureflow.dev/self-hosting/docker)。\n\n## 部署到自己的 Cloudflare 账户\n\n另一条路线使用 Cloudflare Workers、D1 和 R2。仓库提供了[一键部署入口](https://deploy.workers.cloudflare.com/?url=https://github.com/sardorml/captureflow)，也列出了手动步骤。\n\n先运行 `pnpm --filter @captureflow/web exec wrangler d1 create captureflow` 创建数据库，再运行 `pnpm --filter @captureflow/web exec wrangler r2 bucket create captureflow-recordings` 创建存储桶。把数据库 ID 填入 `apps/web/wrangler.jsonc` 后，依次执行 `pnpm --filter @captureflow/web db:apply:remote` 和 `pnpm --filter @captureflow/web cf:deploy`。\n\n[DEPLOY.md](https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/DEPLOY.md) 说明了密钥、登录服务、自定义域名，以及如何让扩展和桌面应用连接自己的实例。部署在自己的域名下会作为自托管实例运行；如果要做成公司内部工具，还需要按照[配置文档](https://docs.captureflow.dev/self-hosting/configuration)设置 `ALLOWED_EMAIL_DOMAINS`。仓库也链接了[逐步自托管教程](https://captureflow.dev/blog/self-hosted-screen-recorder)和[代配置服务](https://captureflow.dev/self-host-setup)。\n\n## 本地开发和检查\n\n开发环境需要 Node.js 24.13 或更新版本，以及 pnpm 10；README 提示用 `corepack enable` 启用。取得仓库并进入目录后，先执行 `pnpm install`。\n\n完整的取代码命令是 `git clone git@github.com:sardorml/captureflow.git`，接着执行 `cd captureflow`。`pnpm web` 启动网页管理台和官网，地址为 `http://localhost:3032`；`pnpm admin` 启动实例管理后台，地址为 `http://localhost:3034`。`pnpm extension` 会在一个新的 Chrome 配置环境中启动浏览器扩展；macOS 录屏应用的开发命令是 `pnpm --filter @captureflow/desktop dev`。\n\n仓库列出的检查命令分别是 `pnpm typecheck`、`pnpm --filter @captureflow/web test`、`pnpm --filter @captureflow/extension test` 和 `pnpm format`。这里保留的是作者提供的命令，没有把文档中的检查项写成本站已经跑过的结果。\n\n## 仓库如何拆分\n\n应用放在 `apps/`，共享包放在 `packages/`。依赖方向有明确约束：应用可以依赖共享包，共享包不能反向依赖应用，应用之间也不能互相依赖。\n\n- `apps/web` 使用 Next.js 16，包含官网、博客、管理台、观看页和 API，通过 OpenNext 部署到 Cloudflare Workers。\n- `apps/admin` 是运行在独立主机名下的实例管理 Worker，与主应用绑定同一组 D1 和 R2。\n- `apps/mailer` 是产品邮件 Worker，通过 Resend 发送管理员编写的邮件活动，并处理退订。\n- `apps/extension` 是基于 WXT、MV3 的浏览器录屏扩展，包含面板、离屏采集和页面内控制。\n- `apps/desktop` 是基于 Electron 的 macOS 录屏应用；`apps/docs` 是 VitePress 文档站。\n- `packages/engine` 是桌面端与扩展共用的采集引擎，包含 macOS 辅助程序、录制协议和封装处理，采用 MIT 许可。\n- `packages/admin` 为管理后台提供认证与数据逻辑；`packages/mail` 负责邮件活动、渲染、退订令牌、Resend 投递和事务邮件。\n- `packages/quota` 管理存储额度、限制与工作区；`packages/shared` 放各应用共享的类型和常量；`packages/ui` 放主题令牌，以及没有对应 HeroUI 组件的 React 组件。\n\nmacOS 采集辅助程序以编译后的二进制文件形式存入仓库。修改 Swift 源码后，需要运行 `packages/engine/scripts/build-native.sh` 重新构建；加上 `--universal` 可以同时支持 arm64 和 x86_64。\n\n## 文档、贡献和许可\n\n项目的[官网](https://captureflow.dev)、[文档](https://docs.captureflow.dev)、[自托管总览](https://docs.captureflow.dev/self-hosting/overview)、[博客](https://captureflow.dev/blog)、[FAQ](https://captureflow.dev/faq)、[安全说明](https://captureflow.dev/security)、[发行记录](https://github.com/sardorml/captureflow/releases)和 [Discord](https://discord.gg/qzeBCaEeNq) 均由 README 提供入口。\n\n作者欢迎 Bug 报告、想法和 Pull Request，可以到[仓库 Issues](https://github.com/sardorml/captureflow/issues/new)或[功能建议页](https://captureflow.dev/suggest-feature)提交。贡献前需要阅读 [CONVENTIONS.md](https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/CONVENTIONS.md)。发现安全问题应按照安全页说明私下报告，不要发到公开 Issue。\n\n项目采用 [AGPL-3.0-only](https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/LICENSE)，例外是可复用的采集引擎 `packages/engine`，它采用 [MIT](https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/packages/engine/LICENSE) 许可。桌面应用与浏览器扩展的组合构建，整体仍适用 AGPL-3.0-only。\n\n本文完整改写上述作者帖文、已取得的作者回复及固定版本 README；README 最近修改于 11 月 4 日，不能把 11 月 6 日的介绍帖当成当天发布新版本。文档文字按上游 AGPL-3.0-only 许可使用，[许可全文](https://xnews.qiaomu.ai/source-licenses/captureflow-AGPL-3.0.txt)随站点提供；本站中文不是官方文档。\n\n### 原文附带媒体\n\n来源附带的产品概览配图；未核验与中文具体段落的一一对应关系，集中保留于文末。\n\n![CaptureFlow 作者原帖配图](<https://pbs.twimg.com/media/HWbWZHHaUAAm62F.jpg>)\n\n![CaptureFlow: open-source screen recorder with shareable links, above the recordings dashboard](<https://raw.githubusercontent.com/sardorml/captureflow/c5792345e7d5e47084c5e829b3f11c98a432c859/.github/assets/readme-hero.png>)", "html": "<p>Sardor 在 11 月 6 日介绍了自己做的开源录屏工具 CaptureFlow：人在 Chrome 里录屏，结束后把链接发给别人；AI Agent 也可以通过 MCP 录制演示。它支持 Docker 自托管。原帖所链接的仓库 README 进一步写明，录制过程中就会上传，停止录制时分享链接已经准备好了。</p>\n<h2>能录什么，在哪里使用</h2>\n<p>CaptureFlow 可以录制浏览器标签页、窗口或整个屏幕，并加入摄像头悬浮画面和麦克风声音。观看者可以在视频里发表情、留言，录制者能看到谁看过。截图也可以加箭头、文字和模糊遮挡，再用同样的链接方式分享。</p>\n<p>团队使用工作区管理内容，可设为公开、仅工作区成员可见或私密。托管服务按整个团队的存储量收费，不按席位收费；付费方案提供 100 GB、500 GB 或 1 TB 存储空间。作者说明，全部功能都包含在开源构建中，也可以部署到自己的 Cloudflare 账户，并把登录范围限制在公司内。</p>\n<p>Chrome 扩展已经在 <a href=\"https://chromewebstore.google.com/detail/lgpgeoelaokbigdljofhkgbfnfcnmcol\" target=\"_blank\" rel=\"noopener noreferrer\">Chrome Web Store</a> 上架。macOS 应用目前可以从源码构建，签名发行版仍是即将推出的状态；网页管理台和观看页支持现代浏览器。托管版可以先<a href=\"https://captureflow.dev/login?mode=signup\" target=\"_blank\" rel=\"noopener noreferrer\">注册免费账户</a>，再安装扩展，具体付费额度见<a href=\"https://captureflow.dev/pricing\" target=\"_blank\" rel=\"noopener noreferrer\">价格页</a>。</p>\n<p>在原帖评论里，@progerallworld 提出的用途是让 Agent 重现 Bug、录下步骤，再附上视频。Sardor 回复说，这正是他加入 MCP 时考虑的场景。随后他又补充，也可以让 Agent 为 GitHub Pull Request 录制演示，并附到 PR 描述里；安装扩展后，审阅者可以观看演示来理解改动。这是作者对用途的说明，本轮没有连接 MCP 或试录视频。</p>\n<h2>用 Docker 部署</h2>\n<p>README 给出的 Docker 启动方式很短：先执行 <code>cp .env.example .env</code>，设置 <code>APP_URL</code>，再执行 <code>docker compose up -d</code>。</p>\n<p>数据都保存在 <code>./data</code>：SQLite 数据库、磁盘上的录屏文件，以及第一次启动时生成的密钥。这条部署路线不需要 Cloudflare 账户。生成转写可以使用兼容 OpenAI 接口的 Whisper 服务；Compose 也提供 <code>--profile whisper</code> 来运行一个这样的服务。完整说明在 <a href=\"https://docs.captureflow.dev/self-hosting/docker\" target=\"_blank\" rel=\"noopener noreferrer\">Docker 部署文档</a>。</p>\n<h2>部署到自己的 Cloudflare 账户</h2>\n<p>另一条路线使用 Cloudflare Workers、D1 和 R2。仓库提供了<a href=\"https://deploy.workers.cloudflare.com/?url=https://github.com/sardorml/captureflow\" target=\"_blank\" rel=\"noopener noreferrer\">一键部署入口</a>，也列出了手动步骤。</p>\n<p>先运行 <code>pnpm --filter @captureflow/web exec wrangler d1 create captureflow</code> 创建数据库，再运行 <code>pnpm --filter @captureflow/web exec wrangler r2 bucket create captureflow-recordings</code> 创建存储桶。把数据库 ID 填入 <code>apps/web/wrangler.jsonc</code> 后，依次执行 <code>pnpm --filter @captureflow/web db:apply:remote</code> 和 <code>pnpm --filter @captureflow/web cf:deploy</code>。</p>\n<p><a href=\"https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/DEPLOY.md\" target=\"_blank\" rel=\"noopener noreferrer\">DEPLOY.md</a> 说明了密钥、登录服务、自定义域名，以及如何让扩展和桌面应用连接自己的实例。部署在自己的域名下会作为自托管实例运行；如果要做成公司内部工具，还需要按照<a href=\"https://docs.captureflow.dev/self-hosting/configuration\" target=\"_blank\" rel=\"noopener noreferrer\">配置文档</a>设置 <code>ALLOWED_EMAIL_DOMAINS</code>。仓库也链接了<a href=\"https://captureflow.dev/blog/self-hosted-screen-recorder\" target=\"_blank\" rel=\"noopener noreferrer\">逐步自托管教程</a>和<a href=\"https://captureflow.dev/self-host-setup\" target=\"_blank\" rel=\"noopener noreferrer\">代配置服务</a>。</p>\n<h2>本地开发和检查</h2>\n<p>开发环境需要 Node.js 24.13 或更新版本，以及 pnpm 10；README 提示用 <code>corepack enable</code> 启用。取得仓库并进入目录后，先执行 <code>pnpm install</code>。</p>\n<p>完整的取代码命令是 <code>git clone git@github.com:sardorml/captureflow.git</code>，接着执行 <code>cd captureflow</code>。<code>pnpm web</code> 启动网页管理台和官网，地址为 <code>http://localhost:3032</code>；<code>pnpm admin</code> 启动实例管理后台，地址为 <code>http://localhost:3034</code>。<code>pnpm extension</code> 会在一个新的 Chrome 配置环境中启动浏览器扩展；macOS 录屏应用的开发命令是 <code>pnpm --filter @captureflow/desktop dev</code>。</p>\n<p>仓库列出的检查命令分别是 <code>pnpm typecheck</code>、<code>pnpm --filter @captureflow/web test</code>、<code>pnpm --filter @captureflow/extension test</code> 和 <code>pnpm format</code>。这里保留的是作者提供的命令，没有把文档中的检查项写成本站已经跑过的结果。</p>\n<h2>仓库如何拆分</h2>\n<p>应用放在 <code>apps/</code>，共享包放在 <code>packages/</code>。依赖方向有明确约束：应用可以依赖共享包，共享包不能反向依赖应用，应用之间也不能互相依赖。</p>\n<ul>\n<li><code>apps/web</code> 使用 Next.js 16，包含官网、博客、管理台、观看页和 API，通过 OpenNext 部署到 Cloudflare Workers。</li>\n<li><code>apps/admin</code> 是运行在独立主机名下的实例管理 Worker，与主应用绑定同一组 D1 和 R2。</li>\n<li><code>apps/mailer</code> 是产品邮件 Worker，通过 Resend 发送管理员编写的邮件活动，并处理退订。</li>\n<li><code>apps/extension</code> 是基于 WXT、MV3 的浏览器录屏扩展，包含面板、离屏采集和页面内控制。</li>\n<li><code>apps/desktop</code> 是基于 Electron 的 macOS 录屏应用；<code>apps/docs</code> 是 VitePress 文档站。</li>\n<li><code>packages/engine</code> 是桌面端与扩展共用的采集引擎，包含 macOS 辅助程序、录制协议和封装处理，采用 MIT 许可。</li>\n<li><code>packages/admin</code> 为管理后台提供认证与数据逻辑；<code>packages/mail</code> 负责邮件活动、渲染、退订令牌、Resend 投递和事务邮件。</li>\n<li><code>packages/quota</code> 管理存储额度、限制与工作区；<code>packages/shared</code> 放各应用共享的类型和常量；<code>packages/ui</code> 放主题令牌，以及没有对应 HeroUI 组件的 React 组件。</li>\n</ul>\n<p>macOS 采集辅助程序以编译后的二进制文件形式存入仓库。修改 Swift 源码后，需要运行 <code>packages/engine/scripts/build-native.sh</code> 重新构建；加上 <code>--universal</code> 可以同时支持 arm64 和 x86_64。</p>\n<h2>文档、贡献和许可</h2>\n<p>项目的<a href=\"https://captureflow.dev\" target=\"_blank\" rel=\"noopener noreferrer\">官网</a>、<a href=\"https://docs.captureflow.dev\" target=\"_blank\" rel=\"noopener noreferrer\">文档</a>、<a href=\"https://docs.captureflow.dev/self-hosting/overview\" target=\"_blank\" rel=\"noopener noreferrer\">自托管总览</a>、<a href=\"https://captureflow.dev/blog\" target=\"_blank\" rel=\"noopener noreferrer\">博客</a>、<a href=\"https://captureflow.dev/faq\" target=\"_blank\" rel=\"noopener noreferrer\">FAQ</a>、<a href=\"https://captureflow.dev/security\" target=\"_blank\" rel=\"noopener noreferrer\">安全说明</a>、<a href=\"https://github.com/sardorml/captureflow/releases\" target=\"_blank\" rel=\"noopener noreferrer\">发行记录</a>和 <a href=\"https://discord.gg/qzeBCaEeNq\" target=\"_blank\" rel=\"noopener noreferrer\">Discord</a> 均由 README 提供入口。</p>\n<p>作者欢迎 Bug 报告、想法和 Pull Request，可以到<a href=\"https://github.com/sardorml/captureflow/issues/new\" target=\"_blank\" rel=\"noopener noreferrer\">仓库 Issues</a>或<a href=\"https://captureflow.dev/suggest-feature\" target=\"_blank\" rel=\"noopener noreferrer\">功能建议页</a>提交。贡献前需要阅读 <a href=\"https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/CONVENTIONS.md\" target=\"_blank\" rel=\"noopener noreferrer\">CONVENTIONS.md</a>。发现安全问题应按照安全页说明私下报告，不要发到公开 Issue。</p>\n<p>项目采用 <a href=\"https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/LICENSE\" target=\"_blank\" rel=\"noopener noreferrer\">AGPL-3.0-only</a>，例外是可复用的采集引擎 <code>packages/engine</code>，它采用 <a href=\"https://github.com/sardorml/captureflow/blob/c5792345e7d5e47084c5e829b3f11c98a432c859/packages/engine/LICENSE\" target=\"_blank\" rel=\"noopener noreferrer\">MIT</a> 许可。桌面应用与浏览器扩展的组合构建，整体仍适用 AGPL-3.0-only。</p>\n<p>本文完整改写上述作者帖文、已取得的作者回复及固定版本 README；README 最近修改于 11 月 4 日，不能把 11 月 6 日的介绍帖当成当天发布新版本。文档文字按上游 AGPL-3.0-only 许可使用，<a href=\"https://xnews.qiaomu.ai/source-licenses/captureflow-AGPL-3.0.txt\" target=\"_blank\" rel=\"noopener noreferrer\">许可全文</a>随站点提供；本站中文不是官方文档。</p>\n<section class=\"rewrite-source-media\" aria-label=\"原文附带媒体\"><h3 class=\"source-media-heading\">原文附带媒体</h3><p class=\"completeness-note\">来源附带的产品概览配图；未核验与中文具体段落的一一对应关系，集中保留于文末。</p><figure data-media-id=\"x_2118616401619603456\"><img src=\"https://pbs.twimg.com/media/HWbWZHHaUAAm62F.jpg\" alt=\"CaptureFlow 作者原帖配图\"><figcaption><a href=\"https://pbs.twimg.com/media/HWbWZHHaUAAm62F.jpg\">打开原始媒体 ↗</a></figcaption></figure>\n<figure data-media-id=\"captureflow_readme_hero\"><img src=\"https://raw.githubusercontent.com/sardorml/captureflow/c5792345e7d5e47084c5e829b3f11c98a432c859/.github/assets/readme-hero.png\" alt=\"CaptureFlow: open-source screen recorder with shareable links, above the recordings dashboard\"><figcaption><a href=\"https://raw.githubusercontent.com/sardorml/captureflow/c5792345e7d5e47084c5e829b3f11c98a432c859/.github/assets/readme-hero.png\">打开原始媒体 ↗</a></figcaption></figure></section>"}}]]></qiaomu:versions>
    </item>
    <item>
      <title>checkwash 用 Git diff 检查测试弱化，Alpha 版仍有漏检和误报</title>
      <link>https://xnews.qiaomu.ai/a/checkwash-test-weakening</link>
      <guid isPermaLink="true">https://xnews.qiaomu.ai/a/checkwash-test-weakening</guid>
      <pubDate>Fri, 06 Nov 2026 03:45:17 +0000</pubDate>
      <author>Nelson Chu</author>
      <description><![CDATA[<p><em>v0.11.0 支持 Claude Code 钩子和 CI 检查，默认只阻断 high；历史评测有明确的版本、样本与误报边界。</em></p>
<h2>乔木改写</h2>
<p>Nelson Chu 在 11 月 6 日介绍了自己做的 checkwash：一个在本地读取 Git diff、检查测试是否被改弱的开源工具。它不调用大模型，分析时不联网，也不会执行被检查的代码。测试通过并不一定意味着检查仍然有效，例如把 <code>assert total == 105.3</code> 改成 <code>assert total &gt; 0</code>，许多错误的金额也会被放行。checkwash 会标记这类改动，包括编程 Agent 写出的改动，交给人审阅。</p>
<p>下面的使用方式和限制来自作者仓库的完整 README。文档推荐的 CLI 和 Action 均为 v0.11.0，说明它是公开发行文件已经核验的版本；本轮阅读了文档，没有安装或执行 checkwash，也没有把文档自述当成本站的独立测试结果。</p>
<h2>接入 Claude Code：停止时检查，部分编辑前询问</h2>
<p>环境需要 Python 3.11 或更新版本、Git 和 Claude Code。在仓库根目录执行 <code>pipx install checkwash==0.11.0</code>，再执行 <code>checkwash hook install --agent claude-code --local</code>。安装器把钩子写入本机的 <code>.claude/settings.local.json</code>。</p>
<p>Stop 钩子在 Claude 准备停止时，将工作区与 HEAD 比较。如果发现达到阻断条件的问题，就阻止停止，并把发现交给 Claude。同一配置文件中的 SessionStart 钩子记录每个会话的起点，因此 Stop 钩子也会检查该会话已经提交的改动。</p>
<p>从 0.11.0 起，本地安装还加入 PreToolUse 询问。当通过 Edit、Write 或 MultiEdit 编辑 Python 测试文件，会使下列五种弱化规则中的某项仍处于 high 严重性时，它会在编辑前询问：<code>ASSERT_WEAKENED</code>、<code>ASSERT_REMOVED</code>、<code>TEST_DISABLED</code>、<code>TOLERANCE_LOOSENED</code>、<code>BROAD_EXCEPT_ADDED</code>。在 <code>claude -p</code> 模式下没有人可以回答，这类编辑会被拒绝。README 同时明确，交互式询问尚未在任何模式下验证。</p>
<p>0.11.0 默认采用本地安装；<code>--shared</code> 则写入 <code>.claude/settings.json</code>，不加入 PreToolUse 询问。这些都是作者一侧的检查：通过 Bash 做的编辑不会经过这道询问。Stop 钩子无法分析改动时，通常只报告情况、不阻止停止，工作区改动文件超出大小限制是下文说明的例外。它们都不能阻止别人合并 PR；真正的合并门禁需要 CI 中的必需状态检查。钩子的已知限制另见 <a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/KNOWN-ISSUES-v0.11.0.md" target="_blank" rel="noopener noreferrer">0.11.0 已知问题</a>。</p>
<h2>先在熟悉的改动上试用</h2>
<p>只使用 CLI，需要 Python 3.11 或更新版本和 Git。作者建议先下载单文件程序，运行离线示例。</p>
<p>Windows PowerShell，包括 5.1，下载命令是 <code>curl.exe -LO https://github.com/taipei49314/checkwash/releases/download/v0.11.0/checkwash.pyz</code>。随后执行 <code>python checkwash.pyz --version</code> 和 <code>python checkwash.pyz demo</code>。PowerShell 5.1 会把 <code>curl</code> 当成 <code>Invoke-WebRequest</code> 的别名，因此这里特意使用 <code>curl.exe</code>。</p>
<p>macOS、Linux 或 Git Bash 的下载命令是 <code>curl -LO https://github.com/taipei49314/checkwash/releases/download/v0.11.0/checkwash.pyz</code>，之后运行相同的版本与 demo 命令。也可以<a href="https://github.com/taipei49314/checkwash/releases/download/v0.11.0/checkwash.pyz" target="_blank" rel="noopener noreferrer">用浏览器下载该文件</a>。</p>
<p>进入至少有两次提交的仓库根目录，执行 <code>python checkwash.pyz check HEAD~1..HEAD</code>，检查最近一次提交。未提交的改动使用 <code>python checkwash.pyz check</code>。评审分支时，<code>python checkwash.pyz check BASE...HEAD</code> 从共同祖先开始比较，<code>BASE..HEAD</code> 则直接比较两个指定快照。</p>
<p>从 v0.8.0 起，在子目录运行 <code>check</code> 也会从 Git 根目录分析整个仓库，并在标准错误输出中说明。更早版本需要在仓库根目录运行。JSON、SARIF 输出和更多用法，见<a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/embedding.md" target="_blank" rel="noopener noreferrer">嵌入指南</a>与<a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/stability.md" target="_blank" rel="noopener noreferrer">稳定性契约</a>。</p>
<h2>CI 必须设成必需检查，才会阻止合并</h2>
<p>只安装工具或添加工作流，不会强制执行检查结论。需要把 <code>checkwash</code> 状态上下文设为仓库分支规则中的必需检查，并保持这个任务无条件运行。</p>
<p>README 给出的 <code>.github/workflows/checkwash.yml</code> 在 <code>pull_request</code> 时运行，权限仅为 <code>contents: read</code>，任务名为 <code>checkwash</code>，执行环境为 <code>ubuntu-latest</code>。它固定了三个 Action 的提交：</p>
<ul>
<li><code>actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1</code>，标注 v7.0.1，设置 <code>fetch-depth: 0</code> 和 <code>persist-credentials: false</code>。</li>
<li><code>actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97</code>，标注 v7.0.0，Python 版本为 <code>3.12</code>。</li>
<li><code>taipei49314/checkwash/action@257150319fca15235185fc629d8b9c21c17166ca</code>，标注 v0.11.0。</li>
</ul>
<p>工作流运行后，在 GitHub 的 Settings → Rules → Rulesets 中要求 <code>checkwash</code> 状态检查。完整 YAML 保留在本页原文中，也可以直接打开<a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/README.md" target="_blank" rel="noopener noreferrer">固定版本 README</a>。</p>
<p>如果是仓库管理员，且已取得项目提供的规则文件，还可以运行 <code>gh api repos/OWNER/REPO/rulesets --method POST --input action/required-ruleset.json</code> 添加规则集。这是新增规则，不会替换既有规则。<code>checkwash doctor</code> 可以检查本地工作流，但不能验证线上分支保护是否生效。</p>
<p>版本顺序也有要求。<code>doctor</code> 0.11.0 接受上面推荐的提交和 v0.10.0 的提交；0.10.0 的 <code>doctor</code> 只接受它内置的 v0.9.0 Action 提交，会把上面的 SHA 报成不支持，显示“workflow analysis incomplete”并以 1 退出。因此应先升级 CLI 和本地钩子，再升级 Action 固定提交。</p>
<h2>怎样理解一次阻断</h2>
<p>退出码 0 表示在当前配置下没有需要阻断的发现，正常测试和评审仍要继续；退出码 1 表示需要阅读发现与 diff，可能是验证被削弱，也可能是误报；退出码 2 表示输入或分析出错，必须先解决错误，才能依赖结果。默认阻断阈值是 high，所以报告中看得见的 warn 仍然可能通过。</p>
<p>每条发现会给出规则、严重性、文件和测试名。例如，前面的金额断言若是 <code>tests/test_billing.py</code> 中 <code>test_invoice_total</code> 的全部 diff，报告会显示 <code>ASSERT_WEAKENED</code>、<code>HIGH</code>，断言强度从 <code>EXACT_VALUE(90)</code> 变成 <code>BOUND(40)</code>，原因是 <code>NO_PROD_CHANGE_IN_DIFF</code>，且没有应用降级条件，并列出修改前后的断言。</p>
<p>这里的 90 是断言强度等级，不是测试期待的数值。<code>why high</code> 解释严重性为什么升高：这份 diff 没改生产文件，也就没有生产代码变化可以解释为什么要弱化测试。需要机器可读输出时，可用 <code>checkwash check --format json</code>。</p>
<p>如果测试被误改弱，应恢复测试；恢复后失败，就修代码。确有理由放宽测试时，报告会给出包含该发现指纹的 <code>checkwash allow</code> 命令，以及需要提交的豁免账本文件。命令格式为 <code>checkwash allow &quot;&lt;the fingerprint from the report&gt;&quot; --reason &quot;why the weaker test is correct&quot;</code>。</p>
<p>配置和豁免从 diff 的基础版本读取，因此一个改动不能给自己豁免。豁免条目要先经过评审、进入基础版本，才对下一份 diff 生效。自 v0.10.0 起，新生效的 <code>.checkwash</code> 配置或豁免还会与 BASE 侧原有的 <code>.greenwash</code> 对照，避免一次迁移同时批准自己的放宽。每项豁免必须给出理由，默认 90 天过期，最长 180 天；作者建议对 <code>.checkwash/</code> 和 <code>.greenwash/</code> 设置代码所有者。</p>
<p>从 0.11.0 起，Stop 钩子会告诉 Claude 不要自行添加豁免，而应向人说明是哪项发现阻断、为什么阻断；PreToolUse 询问也只应在弱化确有必要时批准。具体规则见<a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/enterprise.md" target="_blank" rel="noopener noreferrer">企业配置说明</a>。</p>
<p>遇到合理改动被阻断，作者要求先查<a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/benchmarks/FAILURES.md" target="_blank" rel="noopener noreferrer">失败账本</a>，再使用“checkwash blocked honest work”模板报告 Issue，附上 diff 和 <code>checkwash check --format json</code> 输出。报告会变成回归样例，账本会署名感谢报告者。</p>
<h2>Alpha 阶段仍会漏检，也会误报</h2>
<p>checkwash 仍是 Alpha。一次通过不能证明改动正确，也不能证明改动诚实。Python 是主要支持语言，JS/TS 只覆盖有限的测试模式。</p>
<p>一个没有实际效果的改动，例如在测试调用的函数里加 <code>+ 0</code>，或只改一行模板、<code>AUTHORS</code>，仍可能让被弱化的 Python 或 JS/TS 测试停留在 warn，从而通过默认阈值。#419 虽已关闭，处理方式是记录残留风险，并未修复。<code>REPAIR_EVIDENCE</code> 只表示同一 diff 内存在相关改动，不证明修复正确；无实效的编辑也可能获得这个标记。</p>
<p>要阻断这类改动，可以把 Action 的 <code>fail-on</code> 设为 <code>warn</code>。此时 <code>checkwash doctor</code> 会报告“workflow analysis incomplete”并以 1 退出，这是文档说明的预期行为，因为它只证明没有 <code>with:</code> 配置的 checkwash 步骤。另一种方式是自己添加 CLI 步骤，执行 <code>checkwash check --task</code>，配合基础版本中的 <code>oracle_freeze</code> 契约；Action 本身没有 task 输入。这两条路线都会额外阻断一些合理改动。</p>
<p>对于本地安装，0.11.0 的 PreToolUse 钩子在那五项弱化规则处于 high 时，会在 Python 测试文件的 Edit、Write、MultiEdit 前询问，不受工作区其他修复证据影响。它自身的边界仍应按已知问题文档理解。</p>
<p>JS/TS 的参数表支持也分版本。v0.8.0 不扫描 <code>test.each</code>、<code>it.each</code> 和 <code>test.for</code> 的表格，表内断言弱化或删除、修改一行数据、删除整张表，都可能通过。v0.9.0 开始把每张这样的表视为一个测试单元，并在能够计数时读取数据行：包括内联数组、标签模板，或同文件中只作为表使用的 <code>const</code>。<code>describe.each</code> 的数据行仍不读取，标题由计算产生的表也不会被视为测试单元，见 #428。</p>
<p>合理重构可能被误报。冻结的历史重构样本中，60 项有 22 项被阻断，占 36.7%。另一次独立的预发行源码回放中，60 项有 4 项被阻断；其中 57 项严格符合限定的案例里，有 2 项被阻断，仍有三个既有样例错误。这些都是经过挑选的样本，不能当成一般误报率。v0.10.0 账本在 D-185 处置后保留了 6/60 的静态源码阻断，其中包括另外两项已知的合理重构误报；这是后来对源码的重新核查，没有改写历史运行结果。</p>
<h2>文件过大时，哪些情况会停止分析</h2>
<p>变更文件超过 1,000,000 字节就不会被完整读取。图片、数据、锁文件、文档，以及非 Python 的生产源码超出该限制时，会在标准错误输出中报告，也不会获得修复证据。</p>
<p>从 v0.9.0 起，这类未读文件还会出现在 JSON 的 <code>unread</code> 中；SARIF 使用工具执行通知报告；终端报告增加 <code>!</code> 行，没有其他发现时以“analysis incomplete”开头。Stop 钩子的 JSON 和 <code>--emit-ir</code> 不会列出这些文件名。</p>
<p>如果超限的是检测器必须读取的文件，就以退出码 2 停止，并指出文件。这包括测试、conftest、CI、护栏、快照、JS 设置、运行脚本、测试命令文件，以及分析所需的其他上下文。超限的 <code>.py</code> 模块不论新增、删除、重命名或编辑，也会停止分析；任意层级的 pytest 配置同样如此，包括 <code>pytest.ini</code>、<code>.pytest.ini</code>、<code>pytest.toml</code>、<code>.pytest.toml</code>、<code>tox.ini</code>、<code>setup.cfg</code> 和 <code>pyproject.toml</code>，因为它们可能改变测试导入模块时解析到的对象。根目录 <code>scripts/</code> 中为分析 pytest 命令而读取的非生成文件，也受同样约束。</p>
<p>Shell shebang 会让文件被视为运行脚本，不受文件名影响；<code>.py</code> 模块和 JS/TS 测试文件则有自己的规则。v0.9.0 起，程序读取超限一侧的前 200 字节，只用于识别文件类型；Git 中的那一侧会以流式读取，并核对对象 ID。如果这些字节显示 shell shebang，就会指出具体哪一侧并停止。没有扩展名的文件——包括 <code>.envrc</code> 这样的点文件——若没有 shebang，例如 <code>README</code> 或 <code>LICENSE</code>，通常按文档搁置，除非被其他规则判定为必读文件。</p>
<p>v0.8.0 不读取超限文件的任何字节，所以那时所有超限、无扩展名文件都会停止分析。v0.9.0 不会流式读取 Git 中超过 64,000,000 字节的一侧；若无扩展名文件有这样大的一侧，仍会停止。带扩展名的文件如果 shebang 只存在于这一超大侧，则仍会被搁置。</p>
<p>超限文件导致停止时，v0.9.0 起 JSON 会在标准输出中给出 <code>{&quot;unread&quot;: [...]}</code>，只列拒绝读取的那一侧，而不是完整的 findings 文档；终端和 SARIF 输出仍为空。使用比较范围时，若被拒读的是符号链接指向的 pytest 配置目标，且没有检测器必须读取该目标，JSON 输出也仍为空。</p>
<p><code>build/</code>、<code>dist/</code>、<code>node_modules/</code> 等生成产物通常按生产源码搁置，但 Python 模块、pytest 配置、CI 文件、运行脚本，以及 shebang 未知的无扩展名文件仍是例外。基础版本根目录中超限的 <code>poetry.lock</code> 或 <code>uv.lock</code> 会被跳过，并在标准错误输出提示；这次跳过不进入 <code>unread</code>。如果 diff 本身也改了该锁文件，超限的变化侧仍按一般规则列出。</p>
<p>基础版本根目录的 <code>pyproject.toml</code> 或 <code>requirements*.txt</code> 如果超限，则每次运行都会停止，指出文件；终端、JSON、SARIF 都以 2 退出，只在标准错误输出中报文件名。Claude Code Stop 钩子使用 <code>--format hook-json</code>，一般把包括这种情况在内的引擎错误报告为不阻断的“not analysed”，在标准输出中引用错误，并以 0 退出。</p>
<p>还有一个较窄的例外：从 v0.9.0 起，如果停止原因是钩子 diff 改动的文件，并且该文件的工作区一侧超限，钩子就会阻止停止，要求缩小、拆分或还原文件。若只是基础版本一侧超限、基础版本根清单超限，或在停止前已经把填充后的文件提交，仍只给出消息。完整分类见<a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/subject-integrity.md" target="_blank" rel="noopener noreferrer">检查对象完整性说明</a>。作者因此建议，在设为必需检查之前，先拿自己的改动试用。</p>
<h2>Action 的信任边界和固定提交</h2>
<p>直到 v0.7.0，已发布的 Action 都在 PR 检出的目录中运行 <code>python -m pip</code>，随后运行 <code>checkwash</code>。这样，PR 中的模块，例如顶层 <code>pip</code> 包，可能替换安装器和检查器，使 PR 干预对自身的评判。按项目的威胁模型，这适用于它检查的每个 PR。v0.8.0 修复了这一问题，README 推荐固定 v0.11.0 Action。继续使用 v0.7.0 或更早版本时，只能把通过结果当成参考，合并前审阅 PR，并关闭 <code>comment-pr</code>。</p>
<p>开发分支源码可能比已发布 CLI 更新。<code>release/advertised.toml</code> 记录安装命令背后的版本、提交和下载字节。新改动需要自己的候选证据，在发布记录核验之前仍未发行；候选 CI 通过，不代表推荐的 Action 提交已经包含该改动。</p>
<p>固定提交的选法从 v0.11.0 起也有变化。此前推荐的是 tag 指向的提交，可用 <code>git rev-parse &#x27;vX.Y.Z^{commit}&#x27;</code> 查看；从 v0.11.0 的 D-194 起，推荐的是发行版的 Action 提交，即 tag 第二个父提交的父提交，可用 <code>git rev-parse &#x27;vX.Y.Z^2^1&#x27;</code> 查看，不能直接拿 tag 指向的提交代替。</p>
<p>发行 PR 的最后一笔提交只把 <code>doctor</code> 自身的 Action pin 改为那个 Action 提交，所以 tag 与 Action 提交只有这一行差异。Action 只运行 <code>checkwash check</code>，不会导入 <code>doctor</code>。从 v0.11.0 起，一个发行版的 <code>doctor</code> 接受两个 pin：上一版推荐的，以及本版自己的 Action 提交。</p>
<p>README 还说明，Dependabot、Renovate 按 <code># vX.Y.Z</code> 注释跟踪更新，会建议使用 tag 提交，而 <code>doctor</code> 会拒绝它；zizmor 的 <code>ref-version-mismatch</code> 审计也可能报告这条注释。这些判断是根据相关工具文档推导的，没有实际运行。Action 在两种提交上执行的检查相同，本身不受影响。推荐的 v0.11.0 Action 包含 2026 年 11 月 4 日发布的引擎；升级 CLI 不会自动升级已有 Action，仍应先升级 CLI 和本地钩子，再更新 Action pin。</p>
<h2>安装选项、测量记录和剩余边界</h2>
<p>除了固定 PyPI 版本，也可以从 tag 安装：<code>pipx install git+https://github.com/taipei49314/checkwash@v0.11.0</code>。随后用 <code>checkwash check HEAD~1..HEAD</code> 检查最近提交。<code>checkwash demo</code> 或 <code>python checkwash.pyz demo</code> 会离线回放八个真实篡改案例和一个正常修复案例，用来说明已知模式，不是覆盖能力保证。</p>
<p>历史六仓库扫描中，1800 项有 46 项被阻断，占 2.56%；其中 31 项是假阳性，占全部样本的 1.72%，15 项是合理的策略阻断，占 0.83%。这些归档产物使用 v0.3.0 引擎，是 2026 年 9 月 7 日对发行提交的扫描；检测器曾用这份语料调优，所以它不是留出的独立评测结果。</p>
<p>语料中有 24/1800，即 1.33%，记录了不透明的生产改动。这个标记不能证明每项判断都受到了影响，也不能证明每份 diff 都没有被分析。人工评审方式也不统一：三位评审者的一致性研究只覆盖更早的 35 份 diff，并非全部 46 项阻断。单独的 22/60 重构结果是带日期的 v0.3.1 快照，属于不同样本群；一般提交的比例不能预测重构结果。</p>
<p>原始材料入口包括<a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/benchmarks/README.md" target="_blank" rel="noopener noreferrer">测量说明与源数据</a>、<a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/benchmarks/RESULTS.md" target="_blank" rel="noopener noreferrer">生成结果</a>和失败账本。README 还链接了 <a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/releases/v0.11.0-publication-verification.md" target="_blank" rel="noopener noreferrer">v0.11.0 发布核验记录</a>、<a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/releases/v0.11.0-public-launch.md" target="_blank" rel="noopener noreferrer">发行指南</a>、<a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/releases/README.md" target="_blank" rel="noopener noreferrer">发行历史</a>、断言覆盖、发现格式、贡献、安全报告，以及尚未达到的 1.0 标准。这些是后续查证入口，不代表本轮已经逐份打开或复现实验。</p>
<p><code>checkwash-corpus</code> 和 <code>smallestlie</code> 保存相关评测工作。包里还带有针对覆盖率、Ruff 和 mypy 配置审查的有限质量预览；冻结的历史字节比较仍未通过，发布本身不能证明它已在自然案例中获验收，或真正形成有效门禁。</p>
<p>该项目采用 <a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/LICENSE" target="_blank" rel="noopener noreferrer">Apache-2.0</a>，零运行时依赖，文档列出 22 个检测器与 22461 项测试；后一个数字是测试收集数量，不是本轮执行通过数。</p>
<p>本文完整改写作者原帖及固定版本 README；README 最近修改于 11 月 5 日（中国标准时间），没有用公告时间替换发行日期。README 文字按上游 Apache-2.0 许可使用，<a href="https://xnews.qiaomu.ai/source-licenses/checkwash-Apache-2.0.txt" target="_blank" rel="noopener noreferrer">许可全文</a>随站点提供；本站中文不是官方文档。</p>

<h2>原文</h2>
<p><em>checkwash — author announcement and complete README</em></p>
<h2>Author announcement — Nelson Chu (@kartg123451)</h2>
<p>Source: https://x.com/kartg123451/status/2118550260104769565</p>
<p>I built checkwash because a green CI run can still hide a weaker test. It reads a Git diff locally — no LLM, no network — and flags when an edit weakens or removes an assertion, disables a test, or loosens a tolerance.</p>
<p>https://t.co/J7eBvvMKBK</p>
<h2>Linked README — complete text, fixed source snapshot</h2>
<p>Source: https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/README.md</p>
<h1>checkwash</h1>
<p><a href="https://github.com/taipei49314/checkwash/actions/workflows/ci.yml/badge.svg" target="_blank" rel="noopener noreferrer">![CI</a>](https://github.com/taipei49314/checkwash/actions/workflows/ci.yml) <a href="https://img.shields.io/pypi/v/checkwash.svg" target="_blank" rel="noopener noreferrer">![PyPI</a>](https://pypi.org/project/checkwash/) <a href="https://img.shields.io/badge/license-Apache--2.0-blue.svg" target="_blank" rel="noopener noreferrer">![License</a>](https://github.com/taipei49314/checkwash/blob/main/LICENSE)</p>
<p><strong>Check whether a code change weakens your tests.</strong></p>
<p>A test can pass after it stops checking something useful. checkwash reads your Git diff and flags known patterns such as deleted assertions, skipped tests, relaxed expectations, and CI checks that stop failing.</p>
<p>```diff</p>
<ul>
<li>assert total == 105.3</li>
<p>+ assert total &gt; 0 ```</p>
</ul>
<p>The new assertion accepts many incorrect totals. checkwash can flag changes like this for review, including changes written by coding agents.</p>
<p><strong>Runs locally. No LLM. No network during analysis. Never executes your code.</strong></p>
<p>The install commands and Action pin below name v0.11.0, the latest release whose public files are verified (<a href="https://github.com/taipei49314/checkwash/blob/main/docs/releases/README.md" target="_blank" rel="noopener noreferrer">release history</a>).</p>
<p>Start in one of three ways, each below: Claude Code hooks, the CLI on a repository, or the GitHub Action as a required check.</p>
<h2>Use it with Claude Code</h2>
<p>You need <strong>Python 3.11+, Git and Claude Code</strong>. Install the CLI, then run the hook installer from the root of your repository:</p>
<p>``<code>bash pipx install checkwash==0.11.0 checkwash hook install --agent claude-code --local </code>``</p>
<p>This writes checkwash&#x27;s hooks to <code>.claude/settings.local.json</code>, the machine-local Claude Code settings.</p>
<ul>
<li>The <strong>Stop hook</strong> checks the working tree against HEAD when Claude is about</li>
<p>to stop. On a blocking finding it blocks the stop and gives Claude the finding. A SessionStart hook in the same file records where each session starts, so the Stop hook also checks what the session commits.</p>
<li>From 0.11.0, a local install also adds a <strong>PreToolUse ask</strong>.</li>
<p>When an Edit, Write or MultiEdit of a Python test file would leave a finding of one of five weakening rules (<code>ASSERT_WEAKENED</code>, <code>ASSERT_REMOVED</code>, <code>TEST_DISABLED</code>, <code>TOLERANCE_LOOSENED</code> and <code>BROAD_EXCEPT_ADDED</code>) at high, the hook asks you before the edit is made. In a <code>claude -p</code> run nobody can answer, so such an edit is denied; the interactive prompt is not verified in any mode. From 0.11.0 a local install is the default, and <code>--shared</code> writes <code>.claude/settings.json</code> with no PreToolUse ask.</p>
</ul>
<p>Both hooks are author-side checks. An edit made through Bash never reaches the ask. When the Stop hook cannot analyse a change, it says so and does not block the stop, except for a changed file over the size limit (see &quot;Know the limits&quot;). Neither hook can stop someone else&#x27;s merge: the required check under &quot;Use it in CI&quot; is the gate. The 0.11.0 hooks&#x27; limits are in the <a href="https://github.com/taipei49314/checkwash/blob/main/docs/KNOWN-ISSUES-v0.11.0.md" target="_blank" rel="noopener noreferrer">0.11.0 known issues</a>.</p>
<h2>Try it on a repository</h2>
<p>You need <strong>Python 3.11+ and Git</strong>. Download and try the offline examples first.</p>
<p>Windows PowerShell (including 5.1):</p>
<p>``<code>powershell curl.exe -LO https://github.com/taipei49314/checkwash/releases/download/v0.11.0/checkwash.pyz python checkwash.pyz --version python checkwash.pyz demo </code>``</p>
<p>PowerShell 5.1 aliases <code>curl</code> to <code>Invoke-WebRequest</code>; use <code>curl.exe</code> as written. macOS/Linux or Git Bash:</p>
<p>``<code>bash curl -LO https://github.com/taipei49314/checkwash/releases/download/v0.11.0/checkwash.pyz python checkwash.pyz --version python checkwash.pyz demo </code>``</p>
<p>Then, from the root of a repository with at least two commits:</p>
<p>``<code>bash python checkwash.pyz check HEAD~1..HEAD </code>``</p>
<p>This checks your last commit. Start with a change you already understand. You can also <a href="https://github.com/taipei49314/checkwash/releases/download/v0.11.0/checkwash.pyz" target="_blank" rel="noopener noreferrer">download the file in your browser</a>. For uncommitted changes use <code>python checkwash.pyz check</code>. For a branch review, use <code>python checkwash.pyz check BASE...HEAD</code> to compare from the merge base; <code>BASE..HEAD</code> compares the two named snapshots directly.</p>
<p>From a subdirectory, <code>check</code> analyses the whole repository from its Git root and says so in one line on stderr (since v0.8.0, <a href="https://github.com/taipei49314/checkwash/issues/416" target="_blank" rel="noopener noreferrer">#416</a>). Before v0.8.0, run it from the repository root.</p>
<p>For JSON/SARIF output and more examples, see the <a href="https://github.com/taipei49314/checkwash/blob/main/docs/embedding.md" target="_blank" rel="noopener noreferrer">embedding guide</a> and the <a href="https://github.com/taipei49314/checkwash/blob/main/docs/stability.md" target="_blank" rel="noopener noreferrer">stability contracts</a>.</p>
<h2>Use it in CI</h2>
<p>To stop a merge, make the <strong><code>checkwash</code> status check required</strong> in your repository&#x27;s branch rules. Installing the tool or adding a workflow alone does not enforce its verdict.</p>
<p>&lt;a id=&quot;required-check--the-only-configuration-that-blocks-a-merge&quot;&gt;&lt;/a&gt;</p>
<p>Save this as <code>.github/workflows/checkwash.yml</code>:</p>
<p>```yaml</p>
<h1>.github/workflows/checkwash.yml</h1>
<p>on: [pull_request]</p>
<p>permissions: contents: read</p>
<p>jobs: checkwash: runs-on: ubuntu-latest steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 persist-credentials: false - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: &quot;3.12&quot; - uses: taipei49314/checkwash/action@257150319fca15235185fc629d8b9c21c17166ca # v0.11.0 ```</p>
<p>After the workflow runs, open <strong>Settings → Rules → Rulesets</strong> and require the <code>checkwash</code> status context. Keep the job unconditional.</p>
<p>If you administer the repository and have this project&#x27;s ruleset file, you can instead create the rule with:</p>
<p>``<code>bash gh api repos/OWNER/REPO/rulesets --method POST --input action/required-ruleset.json </code>``</p>
<p>This adds a ruleset; it does not replace existing ones. <code>checkwash doctor</code> can inspect the local workflow, but cannot verify live branch protection. <code>doctor</code> 0.11.0 accepts the pin above and v0.10.0&#x27;s. <code>doctor</code> 0.10.0 accepts only the Action pin built into it, v0.9.0&#x27;s, so it reports the pin above as an unsupported SHA (&quot;workflow analysis incomplete&quot;, exit 1): upgrade the CLI and its local hooks before the Action pin.</p>
<h2>When checkwash blocks</h2>
<p>| Result | What to do | |---|---| | <strong>Pass · exit 0</strong> | No finding requires blocking under your configuration. Keep running your normal tests and review. | | <strong>Block · exit 1</strong> | Read the finding and the diff. It may be weakened verification or a false positive. | | <strong>Error · exit 2</strong> | Resolve the input or analysis error before relying on the result. |</p>
<p>The default threshold is <strong>high</strong>: a visible <strong>warn</strong> can still pass.</p>
<p><strong>Read the finding.</strong> Each finding names its rule, its severity, and the file and test it is in. If the change at the top is the whole diff, made in <code>test_invoice_total</code> in <code>tests/test_billing.py</code>, the finding reads:</p>
<p>``<code>text ASSERT_WEAKENED   HIGH   tests/test_billing.py :: test_invoice_total test_invoice_total: assertion strength EXACT_VALUE(90) -&gt; BOUND(40) why high: NO_PROD_CHANGE_IN_DIFF no de-escalator applied before  assert total == 105.3 after   assert total &gt; 0 </code>``</p>
<p><code>EXACT_VALUE(90) -&gt; BOUND(40)</code> ranks the assertion&#x27;s strength before and after; 90 is not the value the test expected. <code>why high</code> names what raised the finding: here the diff changes no production file, so no production change explains the weaker test. <code>checkwash check --format json</code> gives the same findings as JSON.</p>
<p><strong>Fix the change, or record a reviewed exemption.</strong> If the test was weakened by mistake, restore it, and fix the code if the restored test fails. If the weaker test is intended, the report also prints a <code>checkwash allow</code> command with the finding&#x27;s fingerprint, and the ledger file to commit:</p>
<p>``<code>bash checkwash allow &quot;&lt;the fingerprint from the report&gt;&quot; --reason &quot;why the weaker test is correct&quot; </code>``</p>
<p>Configuration and exemptions are read from the base side of the diff, so a change cannot exempt itself: commit the entry through review, and it applies to the next diff once it is on the base. Since v0.10.0, a newly winning <code>.checkwash</code> config or allowance is compared with its BASE <code>.greenwash</code> predecessor, so a change cannot approve its own relaxation either. An entry needs a reason and expires after 90 days by default, 180 at most. Keep <code>.checkwash/</code> and <code>.greenwash/</code> behind <a href="https://github.com/taipei49314/checkwash/blob/main/docs/enterprise.md#4-codeowners" target="_blank" rel="noopener noreferrer">code owners</a>. From 0.11.0, the Stop hook tells Claude not to add an exemption itself but to tell you which finding blocks and why, and the PreToolUse ask asks you to approve only if the weaker test is intended. <a href="https://github.com/taipei49314/checkwash/blob/main/docs/enterprise.md#3-allowlist--reviewed-time-boxed-base-side" target="_blank" rel="noopener noreferrer">Exemption rules</a></p>
<p><strong>Report a false block.</strong> If the change is honest and checkwash blocks it, look for it in the <a href="https://github.com/taipei49314/checkwash/blob/main/benchmarks/FAILURES.md" target="_blank" rel="noopener noreferrer">failure ledger</a> first, then open an <a href="https://github.com/taipei49314/checkwash/issues" target="_blank" rel="noopener noreferrer">issue</a> with the <strong>checkwash blocked honest work</strong> template, giving the diff and the <code>checkwash check --format json</code> output. A report becomes a regression fixture, and the ledger credits the reporter.</p>
<h2>Know the limits</h2>
<p><strong>checkwash is alpha.</strong> A pass does not prove that a change is correct or honest. Python is the main language supported; JS/TS support covers a limited set of test patterns. Known gaps remain.</p>
<p>An edit that changes nothing, such as <code>+ 0</code> in a function a test calls or one line in a template or <code>AUTHORS</code>, can still hold a weakened Python or JS/TS test at warn, which passes at the default threshold. #419 is closed as a documented residual, not fixed (<a href="https://github.com/taipei49314/checkwash/blob/main/docs/enterprise.md#7-hardening-against-bought-repair-evidence-419" target="_blank" rel="noopener noreferrer">what still passes and how to block it</a>). Read the <a href="https://github.com/taipei49314/checkwash/blob/main/docs/KNOWN-ISSUES-v0.11.0.md" target="_blank" rel="noopener noreferrer">0.11.0 known issues</a> and the <a href="https://github.com/taipei49314/checkwash/blob/main/docs/KNOWN-ISSUES-v0.10.0.md" target="_blank" rel="noopener noreferrer">earlier limits they build on</a> before relying on a pass.</p>
<p><code>REPAIR_EVIDENCE</code> describes related changes in the same diff; it does not prove a repair is correct, and an edit that changes nothing can earn it (#419). To block such changes, set the Action&#x27;s <code>fail-on: warn</code> (<code>checkwash doctor</code> then reports &quot;workflow analysis incomplete&quot; and exits 1, which is expected: it proves only a checkwash step with no <code>with:</code>), or run <code>checkwash check --task</code> in a CLI step of your own with a base-side <code>oracle_freeze</code> contract (the Action has no task input); both block more honest changes too. From 0.11.0, on a local hook install, the Claude Code PreToolUse hook asks before an Edit, Write or MultiEdit of a Python test leaves a finding of its five weakening rules at high, whatever repair evidence the rest of the working tree holds; its limits are in the <a href="https://github.com/taipei49314/checkwash/blob/main/docs/KNOWN-ISSUES-v0.11.0.md" target="_blank" rel="noopener noreferrer">0.11.0 known issues</a>.</p>
<p>In v0.8.0, JS/TS <code>test.each</code>, <code>it.each</code> and <code>test.for</code> tables are not scanned: an assertion weakened or deleted in one, an edited row or a deleted table passes. In v0.9.0, each such table is a test unit, and its rows are read when they can be counted (an inline array or a tagged template, or a same-file <code>const</code> read only as a table). The rows of a <code>describe.each</code> table stay unread, and a table with a computed title is not a unit (<a href="https://github.com/taipei49314/checkwash/issues/428" target="_blank" rel="noopener noreferrer">#428</a>).</p>
<p>Legitimate refactors can be flagged. The frozen historical corpus records <strong>22 blocks out of 60 (36.7%)</strong>. A separate pre-release source replay records 4/60 blocks, including 2/57 strictly qualified cases; three existing fixture errors remain. These are selected examples, not a general false-positive rate. The v0.10.0 ledger retains 6/60 static source blocks after the <a href="https://github.com/taipei49314/checkwash/blob/main/docs/oracle-context-dispositions-0.10.0.md" target="_blank" rel="noopener noreferrer">D-185 dispositions</a>, including two additional known legitimate-refactor false blocks. This is a later source readback, not a rewrite of the historical runtime results.</p>
<p>A changed file over 1,000,000 bytes is not read. An image, data file, lockfile, document or non-Python production source that large is reported on stderr and earns no repair evidence.</p>
<p>&lt;details&gt; &lt;summary&gt;Which files over the limit stop the run, and how each output and the Stop hook report them&lt;/summary&gt;</p>
<p>Since v0.9.0 (<a href="https://github.com/taipei49314/checkwash/issues/454" target="_blank" rel="noopener noreferrer">#454</a>), <code>--format json</code> also lists it under <code>unread</code>, SARIF names it in a tool execution notification, and the term report adds a <code>!</code> line and, when there is no finding, opens with &quot;analysis incomplete&quot;; the Stop hook&#x27;s JSON and <code>--emit-ir</code> do not name it. A file a detector must read (test, conftest, CI, guardrail, snapshot, JS setup, runner script or test-command file) that large stops the run with exit 2, naming it. So do a <code>.py</code> module that large, whether added, deleted, renamed or edited, and a pytest configuration file (<code>pytest.ini</code>, <code>.pytest.ini</code>, <code>pytest.toml</code>, <code>.pytest.toml</code>, <code>tox.ini</code>, <code>setup.cfg</code>, <code>pyproject.toml</code>) at any depth: either can change the module a test&#x27;s import resolves to. So do any non-generated file under the root <code>scripts/</code> directory, read for the pytest commands it runs, and any other changed file that large the analysis needs as context. A shell shebang gives a file the shape of a runner script, whatever its name, except a <code>.py</code> module or a JS/TS test file. Since v0.9.0 (<a href="https://github.com/taipei49314/checkwash/issues/455" target="_blank" rel="noopener noreferrer">#455</a>), checkwash reads the first 200 bytes of a side over the limit to tell, and uses them for nothing else; a Git side is streamed and checked against its object id. Where those bytes are read, a file that large whose side starts with a shell shebang stops the run, naming that side, whatever its suffix (a <code>.py</code> module or a JS/TS test file that large stops the run anyway, by its own rule). A file with no extension (a dotfile such as <code>.envrc</code> counts) without one, such as a <code>README</code> or a <code>LICENSE</code>, is set aside like any document, unless another rule above makes it one a detector must read. v0.8.0 reads no byte of such a side, so every file with no extension that large stops the run there. In v0.9.0 a Git side over 64,000,000 bytes is not streamed, so its first bytes are not known: a file with no extension still stops the run when one of its Git sides is that large, and a suffixed file whose shebang is only on such a side is still set aside. When a file that large stops the run, since v0.9.0 <code>--format json</code> prints <code>{&quot;unread&quot;: [...]}</code> on stdout instead of nothing: one <code>unread</code> entry, for the side the run refused. It is not a findings document, and term and SARIF output stay empty. With a range, json output stays empty too when the refused file is a symlinked pytest configuration&#x27;s target that no detector must read. Generated output (<code>build/</code>, <code>dist/</code>, <code>node_modules/</code> and the like) is set aside like a production source unless it is a Python module, a pytest configuration, a CI file, a runner script or a file with no extension whose shebang is not known. A root <code>poetry.lock</code> or <code>uv.lock</code> that large at the base is skipped with a note on stderr, and the skip is not listed under <code>unread</code>; when the diff also changes that lockfile, the change&#x27;s sides over the limit are listed like any other. A root <code>pyproject.toml</code> or <code>requirements*.txt</code> that large at the base stops every run, naming it: term, json and SARIF output exit 2 and name it on stderr only. The Claude Code Stop hook (<code>--format hook-json</code>) reports an engine error, this one included, as a non-blocking &quot;not analysed&quot; message on stdout that quotes the error, and exits 0. Since v0.9.0, when the run stops on a file the hook&#x27;s diff changes and that file&#x27;s working-tree side is over the limit, the hook blocks the stop instead, naming the file and asking to shrink, split or revert it (<a href="https://github.com/taipei49314/checkwash/issues/456" target="_blank" rel="noopener noreferrer">#456</a>). A file whose base side alone is over the limit, a root manifest over it at the base, and a padded file committed before the stop keep the message; the full list is in <a href="https://github.com/taipei49314/checkwash/blob/main/docs/subject-integrity.md" target="_blank" rel="noopener noreferrer">subject integrity</a>.</p>
<p>&lt;/details&gt;</p>
<p>Try it on your own changes before making it required. <a href="https://github.com/taipei49314/checkwash/blob/main/docs/stability.md#coverage-and-adoption-cost" target="_blank" rel="noopener noreferrer">Coverage and limitations</a> · <a href="https://github.com/taipei49314/checkwash/blob/main/docs/adversarial-catalog-2026-09.md" target="_blank" rel="noopener noreferrer">Known gaps</a></p>
<h2>CI details: doctor and the pin</h2>
<p>The recommended Action and the CLI above are both <strong>v0.11.0</strong>. Record which version you use. <a href="https://github.com/taipei49314/checkwash/blob/main/docs/enterprise.md" target="_blank" rel="noopener noreferrer">Full setup and exemptions</a></p>
<p><strong>Development snapshots:</strong> the source in this checkout may be newer than the published CLI. <a href="https://github.com/taipei49314/checkwash/blob/main/release/advertised.toml" target="_blank" rel="noopener noreferrer">The advertised-release manifest</a> records the version, commit and download bytes behind the installation commands above. New changes require their own candidate evidence and remain unreleased until the publication record verifies them; candidate CI success does not mean that the recommended Action pin includes them.</p>
<p><strong>Advisory: Action trust boundary.</strong> Every published Action release up to and including v0.7.0 runs <code>python -m pip</code> and then <code>checkwash</code> with the pull request&#x27;s checkout as the working directory, so a module in that checkout (for example a top-level <code>pip</code> package) can replace the installer and then the checker, and the pull request can tamper with the result it is judged by. Under checkwash&#x27;s threat model that applies to every pull request it judges. v0.8.0 fixes it (<a href="https://github.com/taipei49314/checkwash/pull/372" target="_blank" rel="noopener noreferrer">#372</a>); pin the v0.11.0 Action above. If you stay on v0.7.0 or earlier, treat a pass as advisory, review the pull request before merging and keep <code>comment-pr</code> off. <a href="https://github.com/taipei49314/checkwash/blob/main/SECURITY.md#known-issue-action-trust-boundary" target="_blank" rel="noopener noreferrer">Known issue</a></p>
<p><strong>Which commit is the recommended pin?</strong> A release cannot embed its own commit SHA. Up to v0.10.0, the recommended pin is the commit the tag points to: <code>git rev-parse &#x27;vX.Y.Z^{commit}&#x27;</code>. From v0.11.0 (D-194), it is the release&#x27;s Action commit, the tag&#x27;s second parent&#x27;s parent: <code>git rev-parse &#x27;vX.Y.Z^2^1&#x27;</code>. It is not the commit the tag points to. The release pull request&#x27;s last commit changes one line, <code>doctor</code>&#x27;s own Action pin, to that Action commit, and the tag differs from the Action commit only in that line. The Action runs only <code>checkwash check</code>, which does not import <code>doctor</code>. From v0.11.0, a release&#x27;s <code>doctor</code> accepts two Action pins: the one recommended before the release and the release&#x27;s own Action commit.</p>
<p>Pin updaters such as Dependabot and Renovate follow the <code># vX.Y.Z</code> comment, so they will propose the tag&#x27;s commit, which <code>doctor</code> rejects (inferred from those tools&#x27; documentation, not run). For the same reason zizmor&#x27;s <code>ref-version-mismatch</code> audit can report the comment (inferred, not run). The Action itself is unaffected: it runs the same check at either commit. <code>doctor</code> 0.10.0 does not accept the 0.11.0 pin, so upgrade the CLI and its local hooks first, then the Action pin. The recommended v0.11.0 Action includes the engine published on 2026-11-04 Asia/Taipei. A CLI upgrade does not update an existing Action. <a href="https://github.com/taipei49314/checkwash/blob/main/action/README.md" target="_blank" rel="noopener noreferrer">Action reference</a></p>
<h2>More options and evidence</h2>
<p>&lt;a id=&quot;install&quot;&gt;&lt;/a&gt; &lt;details&gt; &lt;summary&gt;Install as a CLI or try the included examples&lt;/summary&gt;</p>
<p>If you already use pipx, install the fixed version:</p>
<p>```bash pipx install checkwash==0.11.0</p>
<h1>or from the release tag:</h1>
<p>pipx install git+https://github.com/taipei49314/checkwash@v0.11.0</p>
<p>checkwash check HEAD~1..HEAD checkwash demo                  # 8 real tampering cases, blocked, offline ```</p>
<p><code>checkwash demo</code> replays eight real tampering cases and one honest fix. It illustrates known patterns; it is not a coverage guarantee. You can run the same examples with <code>python checkwash.pyz demo</code>.</p>
<p>&lt;/details&gt;</p>
<p>&lt;a id=&quot;measured-not-asserted&quot;&gt;&lt;/a&gt; &lt;details&gt; &lt;summary&gt;Read the measurements and their limits&lt;/summary&gt;</p>
<p>The historical six-repo sweep recorded <strong>46 / 1800 = 2.56%</strong> blocks: <strong>31 false positives (1.72%)</strong>, 15 legitimate policy blocks (0.83%). The tracked artifacts record engine <strong>v0.3.0</strong> (the release commit, swept 2026-09-07) on a corpus used to tune the detectors, not a held-out result.</p>
<p><strong>1.33% of the corpus (24/1800) records opaque production changes</strong>. That flag does not establish that each verdict changed or each diff was unanalyzed.</p>
<p>Review methods vary: the three-rater agreement study covers an older 35-diff cohort, not all 46 blocks. The dedicated <strong>22/60 refactor</strong> result (<code>benchmarks/refactors/results-latest.json</code>, a dated v0.3.1 snapshot) is a separate population; the general-commit rate does not predict it.</p>
<p><a href="https://github.com/taipei49314/checkwash/blob/main/benchmarks/README.md" target="_blank" rel="noopener noreferrer">Measurements and source data</a> · <a href="https://github.com/taipei49314/checkwash/blob/main/benchmarks/RESULTS.md" target="_blank" rel="noopener noreferrer">Generated results</a> · <a href="https://github.com/taipei49314/checkwash/blob/main/benchmarks/FAILURES.md" target="_blank" rel="noopener noreferrer">Failure ledger</a></p>
<p>&lt;/details&gt;</p>
<p>| Looking for… | Start here | |---|---| | Installation checks, versions and first use | <a href="https://github.com/taipei49314/checkwash/blob/main/docs/releases/v0.11.0-publication-verification.md" target="_blank" rel="noopener noreferrer">v0.11.0 publication record</a> · <a href="https://github.com/taipei49314/checkwash/blob/main/docs/releases/v0.11.0-public-launch.md" target="_blank" rel="noopener noreferrer">v0.11.0 release guide</a> · <a href="https://github.com/taipei49314/checkwash/blob/main/docs/releases/README.md" target="_blank" rel="noopener noreferrer">Release history</a> | | JSON/SARIF contracts and upgrades | <a href="https://github.com/taipei49314/checkwash/blob/main/docs/stability.md" target="_blank" rel="noopener noreferrer">Stability</a> · <a href="https://github.com/taipei49314/checkwash/blob/main/docs/embedding.md" target="_blank" rel="noopener noreferrer">Embedding guide</a> · <a href="https://github.com/taipei49314/checkwash/blob/main/docs/findings.schema.json" target="_blank" rel="noopener noreferrer">Findings schema</a> | | Assertion support, coverage warnings and artifact checks | <a href="https://github.com/taipei49314/checkwash/blob/main/docs/assertion-coverage.md" target="_blank" rel="noopener noreferrer">Assertion coverage</a> | | Required checks and reviewed exemptions | <a href="https://github.com/taipei49314/checkwash/blob/main/docs/enterprise.md" target="_blank" rel="noopener noreferrer">Enterprise setup</a> | | Contributing or reporting a problem | <a href="https://github.com/taipei49314/checkwash/blob/main/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer">Contributing</a> · <a href="https://github.com/taipei49314/checkwash/issues" target="_blank" rel="noopener noreferrer">Issues</a> · <a href="https://github.com/taipei49314/checkwash/blob/main/SECURITY.md" target="_blank" rel="noopener noreferrer">Security reports</a> | | Readiness for 1.0 | <a href="https://github.com/taipei49314/checkwash/blob/main/docs/stability.md#what-must-change-before-10" target="_blank" rel="noopener noreferrer">Criteria — not met</a> |</p>
<p>Related projects: <a href="https://github.com/taipei49314/checkwash-corpus" target="_blank" rel="noopener noreferrer">checkwash-corpus</a> and <a href="https://github.com/taipei49314/smallestlie" target="_blank" rel="noopener noreferrer">smallestlie</a> hold evaluation work.</p>
<p>The package also includes a limited quality preview for coverage, Ruff and mypy configuration review. <a href="https://github.com/taipei49314/checkwash/blob/main/docs/quality-adoption.md" target="_blank" rel="noopener noreferrer">Setup and CI adoption guide</a>. Its frozen legacy-byte comparison remains red; publication does not establish natural-case acceptance or effective enforcement.</p>
<p>Alpha pre-release. 22 detectors, 22461 tests (collection denominator). Zero runtime dependencies. <a href="https://github.com/taipei49314/checkwash/blob/main/LICENSE" target="_blank" rel="noopener noreferrer">Apache-2.0</a>.</p>
<p><strong>原文链接：</strong><a href="https://x.com/kartg123451/status/2118550260104769565">https://x.com/kartg123451/status/2118550260104769565</a></p>
<p><strong>相关链接：</strong><a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/README.md">https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/README.md</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>v0.11.0 支持 Claude Code 钩子和 CI 检查，默认只阻断 high；历史评测有明确的版本、样本与误报边界。</em></p>
<h2>乔木改写</h2>
<p>Nelson Chu 在 11 月 6 日介绍了自己做的 checkwash：一个在本地读取 Git diff、检查测试是否被改弱的开源工具。它不调用大模型，分析时不联网，也不会执行被检查的代码。测试通过并不一定意味着检查仍然有效，例如把 <code>assert total == 105.3</code> 改成 <code>assert total &gt; 0</code>，许多错误的金额也会被放行。checkwash 会标记这类改动，包括编程 Agent 写出的改动，交给人审阅。</p>
<p>下面的使用方式和限制来自作者仓库的完整 README。文档推荐的 CLI 和 Action 均为 v0.11.0，说明它是公开发行文件已经核验的版本；本轮阅读了文档，没有安装或执行 checkwash，也没有把文档自述当成本站的独立测试结果。</p>
<h2>接入 Claude Code：停止时检查，部分编辑前询问</h2>
<p>环境需要 Python 3.11 或更新版本、Git 和 Claude Code。在仓库根目录执行 <code>pipx install checkwash==0.11.0</code>，再执行 <code>checkwash hook install --agent claude-code --local</code>。安装器把钩子写入本机的 <code>.claude/settings.local.json</code>。</p>
<p>Stop 钩子在 Claude 准备停止时，将工作区与 HEAD 比较。如果发现达到阻断条件的问题，就阻止停止，并把发现交给 Claude。同一配置文件中的 SessionStart 钩子记录每个会话的起点，因此 Stop 钩子也会检查该会话已经提交的改动。</p>
<p>从 0.11.0 起，本地安装还加入 PreToolUse 询问。当通过 Edit、Write 或 MultiEdit 编辑 Python 测试文件，会使下列五种弱化规则中的某项仍处于 high 严重性时，它会在编辑前询问：<code>ASSERT_WEAKENED</code>、<code>ASSERT_REMOVED</code>、<code>TEST_DISABLED</code>、<code>TOLERANCE_LOOSENED</code>、<code>BROAD_EXCEPT_ADDED</code>。在 <code>claude -p</code> 模式下没有人可以回答，这类编辑会被拒绝。README 同时明确，交互式询问尚未在任何模式下验证。</p>
<p>0.11.0 默认采用本地安装；<code>--shared</code> 则写入 <code>.claude/settings.json</code>，不加入 PreToolUse 询问。这些都是作者一侧的检查：通过 Bash 做的编辑不会经过这道询问。Stop 钩子无法分析改动时，通常只报告情况、不阻止停止，工作区改动文件超出大小限制是下文说明的例外。它们都不能阻止别人合并 PR；真正的合并门禁需要 CI 中的必需状态检查。钩子的已知限制另见 <a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/KNOWN-ISSUES-v0.11.0.md" target="_blank" rel="noopener noreferrer">0.11.0 已知问题</a>。</p>
<h2>先在熟悉的改动上试用</h2>
<p>只使用 CLI，需要 Python 3.11 或更新版本和 Git。作者建议先下载单文件程序，运行离线示例。</p>
<p>Windows PowerShell，包括 5.1，下载命令是 <code>curl.exe -LO https://github.com/taipei49314/checkwash/releases/download/v0.11.0/checkwash.pyz</code>。随后执行 <code>python checkwash.pyz --version</code> 和 <code>python checkwash.pyz demo</code>。PowerShell 5.1 会把 <code>curl</code> 当成 <code>Invoke-WebRequest</code> 的别名，因此这里特意使用 <code>curl.exe</code>。</p>
<p>macOS、Linux 或 Git Bash 的下载命令是 <code>curl -LO https://github.com/taipei49314/checkwash/releases/download/v0.11.0/checkwash.pyz</code>，之后运行相同的版本与 demo 命令。也可以<a href="https://github.com/taipei49314/checkwash/releases/download/v0.11.0/checkwash.pyz" target="_blank" rel="noopener noreferrer">用浏览器下载该文件</a>。</p>
<p>进入至少有两次提交的仓库根目录，执行 <code>python checkwash.pyz check HEAD~1..HEAD</code>，检查最近一次提交。未提交的改动使用 <code>python checkwash.pyz check</code>。评审分支时，<code>python checkwash.pyz check BASE...HEAD</code> 从共同祖先开始比较，<code>BASE..HEAD</code> 则直接比较两个指定快照。</p>
<p>从 v0.8.0 起，在子目录运行 <code>check</code> 也会从 Git 根目录分析整个仓库，并在标准错误输出中说明。更早版本需要在仓库根目录运行。JSON、SARIF 输出和更多用法，见<a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/embedding.md" target="_blank" rel="noopener noreferrer">嵌入指南</a>与<a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/stability.md" target="_blank" rel="noopener noreferrer">稳定性契约</a>。</p>
<h2>CI 必须设成必需检查，才会阻止合并</h2>
<p>只安装工具或添加工作流，不会强制执行检查结论。需要把 <code>checkwash</code> 状态上下文设为仓库分支规则中的必需检查，并保持这个任务无条件运行。</p>
<p>README 给出的 <code>.github/workflows/checkwash.yml</code> 在 <code>pull_request</code> 时运行，权限仅为 <code>contents: read</code>，任务名为 <code>checkwash</code>，执行环境为 <code>ubuntu-latest</code>。它固定了三个 Action 的提交：</p>
<ul>
<li><code>actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1</code>，标注 v7.0.1，设置 <code>fetch-depth: 0</code> 和 <code>persist-credentials: false</code>。</li>
<li><code>actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97</code>，标注 v7.0.0，Python 版本为 <code>3.12</code>。</li>
<li><code>taipei49314/checkwash/action@257150319fca15235185fc629d8b9c21c17166ca</code>，标注 v0.11.0。</li>
</ul>
<p>工作流运行后，在 GitHub 的 Settings → Rules → Rulesets 中要求 <code>checkwash</code> 状态检查。完整 YAML 保留在本页原文中，也可以直接打开<a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/README.md" target="_blank" rel="noopener noreferrer">固定版本 README</a>。</p>
<p>如果是仓库管理员，且已取得项目提供的规则文件，还可以运行 <code>gh api repos/OWNER/REPO/rulesets --method POST --input action/required-ruleset.json</code> 添加规则集。这是新增规则，不会替换既有规则。<code>checkwash doctor</code> 可以检查本地工作流，但不能验证线上分支保护是否生效。</p>
<p>版本顺序也有要求。<code>doctor</code> 0.11.0 接受上面推荐的提交和 v0.10.0 的提交；0.10.0 的 <code>doctor</code> 只接受它内置的 v0.9.0 Action 提交，会把上面的 SHA 报成不支持，显示“workflow analysis incomplete”并以 1 退出。因此应先升级 CLI 和本地钩子，再升级 Action 固定提交。</p>
<h2>怎样理解一次阻断</h2>
<p>退出码 0 表示在当前配置下没有需要阻断的发现，正常测试和评审仍要继续；退出码 1 表示需要阅读发现与 diff，可能是验证被削弱，也可能是误报；退出码 2 表示输入或分析出错，必须先解决错误，才能依赖结果。默认阻断阈值是 high，所以报告中看得见的 warn 仍然可能通过。</p>
<p>每条发现会给出规则、严重性、文件和测试名。例如，前面的金额断言若是 <code>tests/test_billing.py</code> 中 <code>test_invoice_total</code> 的全部 diff，报告会显示 <code>ASSERT_WEAKENED</code>、<code>HIGH</code>，断言强度从 <code>EXACT_VALUE(90)</code> 变成 <code>BOUND(40)</code>，原因是 <code>NO_PROD_CHANGE_IN_DIFF</code>，且没有应用降级条件，并列出修改前后的断言。</p>
<p>这里的 90 是断言强度等级，不是测试期待的数值。<code>why high</code> 解释严重性为什么升高：这份 diff 没改生产文件，也就没有生产代码变化可以解释为什么要弱化测试。需要机器可读输出时，可用 <code>checkwash check --format json</code>。</p>
<p>如果测试被误改弱，应恢复测试；恢复后失败，就修代码。确有理由放宽测试时，报告会给出包含该发现指纹的 <code>checkwash allow</code> 命令，以及需要提交的豁免账本文件。命令格式为 <code>checkwash allow &quot;&lt;the fingerprint from the report&gt;&quot; --reason &quot;why the weaker test is correct&quot;</code>。</p>
<p>配置和豁免从 diff 的基础版本读取，因此一个改动不能给自己豁免。豁免条目要先经过评审、进入基础版本，才对下一份 diff 生效。自 v0.10.0 起，新生效的 <code>.checkwash</code> 配置或豁免还会与 BASE 侧原有的 <code>.greenwash</code> 对照，避免一次迁移同时批准自己的放宽。每项豁免必须给出理由，默认 90 天过期，最长 180 天；作者建议对 <code>.checkwash/</code> 和 <code>.greenwash/</code> 设置代码所有者。</p>
<p>从 0.11.0 起，Stop 钩子会告诉 Claude 不要自行添加豁免，而应向人说明是哪项发现阻断、为什么阻断；PreToolUse 询问也只应在弱化确有必要时批准。具体规则见<a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/enterprise.md" target="_blank" rel="noopener noreferrer">企业配置说明</a>。</p>
<p>遇到合理改动被阻断，作者要求先查<a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/benchmarks/FAILURES.md" target="_blank" rel="noopener noreferrer">失败账本</a>，再使用“checkwash blocked honest work”模板报告 Issue，附上 diff 和 <code>checkwash check --format json</code> 输出。报告会变成回归样例，账本会署名感谢报告者。</p>
<h2>Alpha 阶段仍会漏检，也会误报</h2>
<p>checkwash 仍是 Alpha。一次通过不能证明改动正确，也不能证明改动诚实。Python 是主要支持语言，JS/TS 只覆盖有限的测试模式。</p>
<p>一个没有实际效果的改动，例如在测试调用的函数里加 <code>+ 0</code>，或只改一行模板、<code>AUTHORS</code>，仍可能让被弱化的 Python 或 JS/TS 测试停留在 warn，从而通过默认阈值。#419 虽已关闭，处理方式是记录残留风险，并未修复。<code>REPAIR_EVIDENCE</code> 只表示同一 diff 内存在相关改动，不证明修复正确；无实效的编辑也可能获得这个标记。</p>
<p>要阻断这类改动，可以把 Action 的 <code>fail-on</code> 设为 <code>warn</code>。此时 <code>checkwash doctor</code> 会报告“workflow analysis incomplete”并以 1 退出，这是文档说明的预期行为，因为它只证明没有 <code>with:</code> 配置的 checkwash 步骤。另一种方式是自己添加 CLI 步骤，执行 <code>checkwash check --task</code>，配合基础版本中的 <code>oracle_freeze</code> 契约；Action 本身没有 task 输入。这两条路线都会额外阻断一些合理改动。</p>
<p>对于本地安装，0.11.0 的 PreToolUse 钩子在那五项弱化规则处于 high 时，会在 Python 测试文件的 Edit、Write、MultiEdit 前询问，不受工作区其他修复证据影响。它自身的边界仍应按已知问题文档理解。</p>
<p>JS/TS 的参数表支持也分版本。v0.8.0 不扫描 <code>test.each</code>、<code>it.each</code> 和 <code>test.for</code> 的表格，表内断言弱化或删除、修改一行数据、删除整张表，都可能通过。v0.9.0 开始把每张这样的表视为一个测试单元，并在能够计数时读取数据行：包括内联数组、标签模板，或同文件中只作为表使用的 <code>const</code>。<code>describe.each</code> 的数据行仍不读取，标题由计算产生的表也不会被视为测试单元，见 #428。</p>
<p>合理重构可能被误报。冻结的历史重构样本中，60 项有 22 项被阻断，占 36.7%。另一次独立的预发行源码回放中，60 项有 4 项被阻断；其中 57 项严格符合限定的案例里，有 2 项被阻断，仍有三个既有样例错误。这些都是经过挑选的样本，不能当成一般误报率。v0.10.0 账本在 D-185 处置后保留了 6/60 的静态源码阻断，其中包括另外两项已知的合理重构误报；这是后来对源码的重新核查，没有改写历史运行结果。</p>
<h2>文件过大时，哪些情况会停止分析</h2>
<p>变更文件超过 1,000,000 字节就不会被完整读取。图片、数据、锁文件、文档，以及非 Python 的生产源码超出该限制时，会在标准错误输出中报告，也不会获得修复证据。</p>
<p>从 v0.9.0 起，这类未读文件还会出现在 JSON 的 <code>unread</code> 中；SARIF 使用工具执行通知报告；终端报告增加 <code>!</code> 行，没有其他发现时以“analysis incomplete”开头。Stop 钩子的 JSON 和 <code>--emit-ir</code> 不会列出这些文件名。</p>
<p>如果超限的是检测器必须读取的文件，就以退出码 2 停止，并指出文件。这包括测试、conftest、CI、护栏、快照、JS 设置、运行脚本、测试命令文件，以及分析所需的其他上下文。超限的 <code>.py</code> 模块不论新增、删除、重命名或编辑，也会停止分析；任意层级的 pytest 配置同样如此，包括 <code>pytest.ini</code>、<code>.pytest.ini</code>、<code>pytest.toml</code>、<code>.pytest.toml</code>、<code>tox.ini</code>、<code>setup.cfg</code> 和 <code>pyproject.toml</code>，因为它们可能改变测试导入模块时解析到的对象。根目录 <code>scripts/</code> 中为分析 pytest 命令而读取的非生成文件，也受同样约束。</p>
<p>Shell shebang 会让文件被视为运行脚本，不受文件名影响；<code>.py</code> 模块和 JS/TS 测试文件则有自己的规则。v0.9.0 起，程序读取超限一侧的前 200 字节，只用于识别文件类型；Git 中的那一侧会以流式读取，并核对对象 ID。如果这些字节显示 shell shebang，就会指出具体哪一侧并停止。没有扩展名的文件——包括 <code>.envrc</code> 这样的点文件——若没有 shebang，例如 <code>README</code> 或 <code>LICENSE</code>，通常按文档搁置，除非被其他规则判定为必读文件。</p>
<p>v0.8.0 不读取超限文件的任何字节，所以那时所有超限、无扩展名文件都会停止分析。v0.9.0 不会流式读取 Git 中超过 64,000,000 字节的一侧；若无扩展名文件有这样大的一侧，仍会停止。带扩展名的文件如果 shebang 只存在于这一超大侧，则仍会被搁置。</p>
<p>超限文件导致停止时，v0.9.0 起 JSON 会在标准输出中给出 <code>{&quot;unread&quot;: [...]}</code>，只列拒绝读取的那一侧，而不是完整的 findings 文档；终端和 SARIF 输出仍为空。使用比较范围时，若被拒读的是符号链接指向的 pytest 配置目标，且没有检测器必须读取该目标，JSON 输出也仍为空。</p>
<p><code>build/</code>、<code>dist/</code>、<code>node_modules/</code> 等生成产物通常按生产源码搁置，但 Python 模块、pytest 配置、CI 文件、运行脚本，以及 shebang 未知的无扩展名文件仍是例外。基础版本根目录中超限的 <code>poetry.lock</code> 或 <code>uv.lock</code> 会被跳过，并在标准错误输出提示；这次跳过不进入 <code>unread</code>。如果 diff 本身也改了该锁文件，超限的变化侧仍按一般规则列出。</p>
<p>基础版本根目录的 <code>pyproject.toml</code> 或 <code>requirements*.txt</code> 如果超限，则每次运行都会停止，指出文件；终端、JSON、SARIF 都以 2 退出，只在标准错误输出中报文件名。Claude Code Stop 钩子使用 <code>--format hook-json</code>，一般把包括这种情况在内的引擎错误报告为不阻断的“not analysed”，在标准输出中引用错误，并以 0 退出。</p>
<p>还有一个较窄的例外：从 v0.9.0 起，如果停止原因是钩子 diff 改动的文件，并且该文件的工作区一侧超限，钩子就会阻止停止，要求缩小、拆分或还原文件。若只是基础版本一侧超限、基础版本根清单超限，或在停止前已经把填充后的文件提交，仍只给出消息。完整分类见<a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/subject-integrity.md" target="_blank" rel="noopener noreferrer">检查对象完整性说明</a>。作者因此建议，在设为必需检查之前，先拿自己的改动试用。</p>
<h2>Action 的信任边界和固定提交</h2>
<p>直到 v0.7.0，已发布的 Action 都在 PR 检出的目录中运行 <code>python -m pip</code>，随后运行 <code>checkwash</code>。这样，PR 中的模块，例如顶层 <code>pip</code> 包，可能替换安装器和检查器，使 PR 干预对自身的评判。按项目的威胁模型，这适用于它检查的每个 PR。v0.8.0 修复了这一问题，README 推荐固定 v0.11.0 Action。继续使用 v0.7.0 或更早版本时，只能把通过结果当成参考，合并前审阅 PR，并关闭 <code>comment-pr</code>。</p>
<p>开发分支源码可能比已发布 CLI 更新。<code>release/advertised.toml</code> 记录安装命令背后的版本、提交和下载字节。新改动需要自己的候选证据，在发布记录核验之前仍未发行；候选 CI 通过，不代表推荐的 Action 提交已经包含该改动。</p>
<p>固定提交的选法从 v0.11.0 起也有变化。此前推荐的是 tag 指向的提交，可用 <code>git rev-parse &#x27;vX.Y.Z^{commit}&#x27;</code> 查看；从 v0.11.0 的 D-194 起，推荐的是发行版的 Action 提交，即 tag 第二个父提交的父提交，可用 <code>git rev-parse &#x27;vX.Y.Z^2^1&#x27;</code> 查看，不能直接拿 tag 指向的提交代替。</p>
<p>发行 PR 的最后一笔提交只把 <code>doctor</code> 自身的 Action pin 改为那个 Action 提交，所以 tag 与 Action 提交只有这一行差异。Action 只运行 <code>checkwash check</code>，不会导入 <code>doctor</code>。从 v0.11.0 起，一个发行版的 <code>doctor</code> 接受两个 pin：上一版推荐的，以及本版自己的 Action 提交。</p>
<p>README 还说明，Dependabot、Renovate 按 <code># vX.Y.Z</code> 注释跟踪更新，会建议使用 tag 提交，而 <code>doctor</code> 会拒绝它；zizmor 的 <code>ref-version-mismatch</code> 审计也可能报告这条注释。这些判断是根据相关工具文档推导的，没有实际运行。Action 在两种提交上执行的检查相同，本身不受影响。推荐的 v0.11.0 Action 包含 2026 年 11 月 4 日发布的引擎；升级 CLI 不会自动升级已有 Action，仍应先升级 CLI 和本地钩子，再更新 Action pin。</p>
<h2>安装选项、测量记录和剩余边界</h2>
<p>除了固定 PyPI 版本，也可以从 tag 安装：<code>pipx install git+https://github.com/taipei49314/checkwash@v0.11.0</code>。随后用 <code>checkwash check HEAD~1..HEAD</code> 检查最近提交。<code>checkwash demo</code> 或 <code>python checkwash.pyz demo</code> 会离线回放八个真实篡改案例和一个正常修复案例，用来说明已知模式，不是覆盖能力保证。</p>
<p>历史六仓库扫描中，1800 项有 46 项被阻断，占 2.56%；其中 31 项是假阳性，占全部样本的 1.72%，15 项是合理的策略阻断，占 0.83%。这些归档产物使用 v0.3.0 引擎，是 2026 年 9 月 7 日对发行提交的扫描；检测器曾用这份语料调优，所以它不是留出的独立评测结果。</p>
<p>语料中有 24/1800，即 1.33%，记录了不透明的生产改动。这个标记不能证明每项判断都受到了影响，也不能证明每份 diff 都没有被分析。人工评审方式也不统一：三位评审者的一致性研究只覆盖更早的 35 份 diff，并非全部 46 项阻断。单独的 22/60 重构结果是带日期的 v0.3.1 快照，属于不同样本群；一般提交的比例不能预测重构结果。</p>
<p>原始材料入口包括<a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/benchmarks/README.md" target="_blank" rel="noopener noreferrer">测量说明与源数据</a>、<a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/benchmarks/RESULTS.md" target="_blank" rel="noopener noreferrer">生成结果</a>和失败账本。README 还链接了 <a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/releases/v0.11.0-publication-verification.md" target="_blank" rel="noopener noreferrer">v0.11.0 发布核验记录</a>、<a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/releases/v0.11.0-public-launch.md" target="_blank" rel="noopener noreferrer">发行指南</a>、<a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/releases/README.md" target="_blank" rel="noopener noreferrer">发行历史</a>、断言覆盖、发现格式、贡献、安全报告，以及尚未达到的 1.0 标准。这些是后续查证入口，不代表本轮已经逐份打开或复现实验。</p>
<p><code>checkwash-corpus</code> 和 <code>smallestlie</code> 保存相关评测工作。包里还带有针对覆盖率、Ruff 和 mypy 配置审查的有限质量预览；冻结的历史字节比较仍未通过，发布本身不能证明它已在自然案例中获验收，或真正形成有效门禁。</p>
<p>该项目采用 <a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/LICENSE" target="_blank" rel="noopener noreferrer">Apache-2.0</a>，零运行时依赖，文档列出 22 个检测器与 22461 项测试；后一个数字是测试收集数量，不是本轮执行通过数。</p>
<p>本文完整改写作者原帖及固定版本 README；README 最近修改于 11 月 5 日（中国标准时间），没有用公告时间替换发行日期。README 文字按上游 Apache-2.0 许可使用，<a href="https://xnews.qiaomu.ai/source-licenses/checkwash-Apache-2.0.txt" target="_blank" rel="noopener noreferrer">许可全文</a>随站点提供；本站中文不是官方文档。</p>

<h2>原文</h2>
<p><em>checkwash — author announcement and complete README</em></p>
<h2>Author announcement — Nelson Chu (@kartg123451)</h2>
<p>Source: https://x.com/kartg123451/status/2118550260104769565</p>
<p>I built checkwash because a green CI run can still hide a weaker test. It reads a Git diff locally — no LLM, no network — and flags when an edit weakens or removes an assertion, disables a test, or loosens a tolerance.</p>
<p>https://t.co/J7eBvvMKBK</p>
<h2>Linked README — complete text, fixed source snapshot</h2>
<p>Source: https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/README.md</p>
<h1>checkwash</h1>
<p><a href="https://github.com/taipei49314/checkwash/actions/workflows/ci.yml/badge.svg" target="_blank" rel="noopener noreferrer">![CI</a>](https://github.com/taipei49314/checkwash/actions/workflows/ci.yml) <a href="https://img.shields.io/pypi/v/checkwash.svg" target="_blank" rel="noopener noreferrer">![PyPI</a>](https://pypi.org/project/checkwash/) <a href="https://img.shields.io/badge/license-Apache--2.0-blue.svg" target="_blank" rel="noopener noreferrer">![License</a>](https://github.com/taipei49314/checkwash/blob/main/LICENSE)</p>
<p><strong>Check whether a code change weakens your tests.</strong></p>
<p>A test can pass after it stops checking something useful. checkwash reads your Git diff and flags known patterns such as deleted assertions, skipped tests, relaxed expectations, and CI checks that stop failing.</p>
<p>```diff</p>
<ul>
<li>assert total == 105.3</li>
<p>+ assert total &gt; 0 ```</p>
</ul>
<p>The new assertion accepts many incorrect totals. checkwash can flag changes like this for review, including changes written by coding agents.</p>
<p><strong>Runs locally. No LLM. No network during analysis. Never executes your code.</strong></p>
<p>The install commands and Action pin below name v0.11.0, the latest release whose public files are verified (<a href="https://github.com/taipei49314/checkwash/blob/main/docs/releases/README.md" target="_blank" rel="noopener noreferrer">release history</a>).</p>
<p>Start in one of three ways, each below: Claude Code hooks, the CLI on a repository, or the GitHub Action as a required check.</p>
<h2>Use it with Claude Code</h2>
<p>You need <strong>Python 3.11+, Git and Claude Code</strong>. Install the CLI, then run the hook installer from the root of your repository:</p>
<p>``<code>bash pipx install checkwash==0.11.0 checkwash hook install --agent claude-code --local </code>``</p>
<p>This writes checkwash&#x27;s hooks to <code>.claude/settings.local.json</code>, the machine-local Claude Code settings.</p>
<ul>
<li>The <strong>Stop hook</strong> checks the working tree against HEAD when Claude is about</li>
<p>to stop. On a blocking finding it blocks the stop and gives Claude the finding. A SessionStart hook in the same file records where each session starts, so the Stop hook also checks what the session commits.</p>
<li>From 0.11.0, a local install also adds a <strong>PreToolUse ask</strong>.</li>
<p>When an Edit, Write or MultiEdit of a Python test file would leave a finding of one of five weakening rules (<code>ASSERT_WEAKENED</code>, <code>ASSERT_REMOVED</code>, <code>TEST_DISABLED</code>, <code>TOLERANCE_LOOSENED</code> and <code>BROAD_EXCEPT_ADDED</code>) at high, the hook asks you before the edit is made. In a <code>claude -p</code> run nobody can answer, so such an edit is denied; the interactive prompt is not verified in any mode. From 0.11.0 a local install is the default, and <code>--shared</code> writes <code>.claude/settings.json</code> with no PreToolUse ask.</p>
</ul>
<p>Both hooks are author-side checks. An edit made through Bash never reaches the ask. When the Stop hook cannot analyse a change, it says so and does not block the stop, except for a changed file over the size limit (see &quot;Know the limits&quot;). Neither hook can stop someone else&#x27;s merge: the required check under &quot;Use it in CI&quot; is the gate. The 0.11.0 hooks&#x27; limits are in the <a href="https://github.com/taipei49314/checkwash/blob/main/docs/KNOWN-ISSUES-v0.11.0.md" target="_blank" rel="noopener noreferrer">0.11.0 known issues</a>.</p>
<h2>Try it on a repository</h2>
<p>You need <strong>Python 3.11+ and Git</strong>. Download and try the offline examples first.</p>
<p>Windows PowerShell (including 5.1):</p>
<p>``<code>powershell curl.exe -LO https://github.com/taipei49314/checkwash/releases/download/v0.11.0/checkwash.pyz python checkwash.pyz --version python checkwash.pyz demo </code>``</p>
<p>PowerShell 5.1 aliases <code>curl</code> to <code>Invoke-WebRequest</code>; use <code>curl.exe</code> as written. macOS/Linux or Git Bash:</p>
<p>``<code>bash curl -LO https://github.com/taipei49314/checkwash/releases/download/v0.11.0/checkwash.pyz python checkwash.pyz --version python checkwash.pyz demo </code>``</p>
<p>Then, from the root of a repository with at least two commits:</p>
<p>``<code>bash python checkwash.pyz check HEAD~1..HEAD </code>``</p>
<p>This checks your last commit. Start with a change you already understand. You can also <a href="https://github.com/taipei49314/checkwash/releases/download/v0.11.0/checkwash.pyz" target="_blank" rel="noopener noreferrer">download the file in your browser</a>. For uncommitted changes use <code>python checkwash.pyz check</code>. For a branch review, use <code>python checkwash.pyz check BASE...HEAD</code> to compare from the merge base; <code>BASE..HEAD</code> compares the two named snapshots directly.</p>
<p>From a subdirectory, <code>check</code> analyses the whole repository from its Git root and says so in one line on stderr (since v0.8.0, <a href="https://github.com/taipei49314/checkwash/issues/416" target="_blank" rel="noopener noreferrer">#416</a>). Before v0.8.0, run it from the repository root.</p>
<p>For JSON/SARIF output and more examples, see the <a href="https://github.com/taipei49314/checkwash/blob/main/docs/embedding.md" target="_blank" rel="noopener noreferrer">embedding guide</a> and the <a href="https://github.com/taipei49314/checkwash/blob/main/docs/stability.md" target="_blank" rel="noopener noreferrer">stability contracts</a>.</p>
<h2>Use it in CI</h2>
<p>To stop a merge, make the <strong><code>checkwash</code> status check required</strong> in your repository&#x27;s branch rules. Installing the tool or adding a workflow alone does not enforce its verdict.</p>
<p>&lt;a id=&quot;required-check--the-only-configuration-that-blocks-a-merge&quot;&gt;&lt;/a&gt;</p>
<p>Save this as <code>.github/workflows/checkwash.yml</code>:</p>
<p>```yaml</p>
<h1>.github/workflows/checkwash.yml</h1>
<p>on: [pull_request]</p>
<p>permissions: contents: read</p>
<p>jobs: checkwash: runs-on: ubuntu-latest steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 persist-credentials: false - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: &quot;3.12&quot; - uses: taipei49314/checkwash/action@257150319fca15235185fc629d8b9c21c17166ca # v0.11.0 ```</p>
<p>After the workflow runs, open <strong>Settings → Rules → Rulesets</strong> and require the <code>checkwash</code> status context. Keep the job unconditional.</p>
<p>If you administer the repository and have this project&#x27;s ruleset file, you can instead create the rule with:</p>
<p>``<code>bash gh api repos/OWNER/REPO/rulesets --method POST --input action/required-ruleset.json </code>``</p>
<p>This adds a ruleset; it does not replace existing ones. <code>checkwash doctor</code> can inspect the local workflow, but cannot verify live branch protection. <code>doctor</code> 0.11.0 accepts the pin above and v0.10.0&#x27;s. <code>doctor</code> 0.10.0 accepts only the Action pin built into it, v0.9.0&#x27;s, so it reports the pin above as an unsupported SHA (&quot;workflow analysis incomplete&quot;, exit 1): upgrade the CLI and its local hooks before the Action pin.</p>
<h2>When checkwash blocks</h2>
<p>| Result | What to do | |---|---| | <strong>Pass · exit 0</strong> | No finding requires blocking under your configuration. Keep running your normal tests and review. | | <strong>Block · exit 1</strong> | Read the finding and the diff. It may be weakened verification or a false positive. | | <strong>Error · exit 2</strong> | Resolve the input or analysis error before relying on the result. |</p>
<p>The default threshold is <strong>high</strong>: a visible <strong>warn</strong> can still pass.</p>
<p><strong>Read the finding.</strong> Each finding names its rule, its severity, and the file and test it is in. If the change at the top is the whole diff, made in <code>test_invoice_total</code> in <code>tests/test_billing.py</code>, the finding reads:</p>
<p>``<code>text ASSERT_WEAKENED   HIGH   tests/test_billing.py :: test_invoice_total test_invoice_total: assertion strength EXACT_VALUE(90) -&gt; BOUND(40) why high: NO_PROD_CHANGE_IN_DIFF no de-escalator applied before  assert total == 105.3 after   assert total &gt; 0 </code>``</p>
<p><code>EXACT_VALUE(90) -&gt; BOUND(40)</code> ranks the assertion&#x27;s strength before and after; 90 is not the value the test expected. <code>why high</code> names what raised the finding: here the diff changes no production file, so no production change explains the weaker test. <code>checkwash check --format json</code> gives the same findings as JSON.</p>
<p><strong>Fix the change, or record a reviewed exemption.</strong> If the test was weakened by mistake, restore it, and fix the code if the restored test fails. If the weaker test is intended, the report also prints a <code>checkwash allow</code> command with the finding&#x27;s fingerprint, and the ledger file to commit:</p>
<p>``<code>bash checkwash allow &quot;&lt;the fingerprint from the report&gt;&quot; --reason &quot;why the weaker test is correct&quot; </code>``</p>
<p>Configuration and exemptions are read from the base side of the diff, so a change cannot exempt itself: commit the entry through review, and it applies to the next diff once it is on the base. Since v0.10.0, a newly winning <code>.checkwash</code> config or allowance is compared with its BASE <code>.greenwash</code> predecessor, so a change cannot approve its own relaxation either. An entry needs a reason and expires after 90 days by default, 180 at most. Keep <code>.checkwash/</code> and <code>.greenwash/</code> behind <a href="https://github.com/taipei49314/checkwash/blob/main/docs/enterprise.md#4-codeowners" target="_blank" rel="noopener noreferrer">code owners</a>. From 0.11.0, the Stop hook tells Claude not to add an exemption itself but to tell you which finding blocks and why, and the PreToolUse ask asks you to approve only if the weaker test is intended. <a href="https://github.com/taipei49314/checkwash/blob/main/docs/enterprise.md#3-allowlist--reviewed-time-boxed-base-side" target="_blank" rel="noopener noreferrer">Exemption rules</a></p>
<p><strong>Report a false block.</strong> If the change is honest and checkwash blocks it, look for it in the <a href="https://github.com/taipei49314/checkwash/blob/main/benchmarks/FAILURES.md" target="_blank" rel="noopener noreferrer">failure ledger</a> first, then open an <a href="https://github.com/taipei49314/checkwash/issues" target="_blank" rel="noopener noreferrer">issue</a> with the <strong>checkwash blocked honest work</strong> template, giving the diff and the <code>checkwash check --format json</code> output. A report becomes a regression fixture, and the ledger credits the reporter.</p>
<h2>Know the limits</h2>
<p><strong>checkwash is alpha.</strong> A pass does not prove that a change is correct or honest. Python is the main language supported; JS/TS support covers a limited set of test patterns. Known gaps remain.</p>
<p>An edit that changes nothing, such as <code>+ 0</code> in a function a test calls or one line in a template or <code>AUTHORS</code>, can still hold a weakened Python or JS/TS test at warn, which passes at the default threshold. #419 is closed as a documented residual, not fixed (<a href="https://github.com/taipei49314/checkwash/blob/main/docs/enterprise.md#7-hardening-against-bought-repair-evidence-419" target="_blank" rel="noopener noreferrer">what still passes and how to block it</a>). Read the <a href="https://github.com/taipei49314/checkwash/blob/main/docs/KNOWN-ISSUES-v0.11.0.md" target="_blank" rel="noopener noreferrer">0.11.0 known issues</a> and the <a href="https://github.com/taipei49314/checkwash/blob/main/docs/KNOWN-ISSUES-v0.10.0.md" target="_blank" rel="noopener noreferrer">earlier limits they build on</a> before relying on a pass.</p>
<p><code>REPAIR_EVIDENCE</code> describes related changes in the same diff; it does not prove a repair is correct, and an edit that changes nothing can earn it (#419). To block such changes, set the Action&#x27;s <code>fail-on: warn</code> (<code>checkwash doctor</code> then reports &quot;workflow analysis incomplete&quot; and exits 1, which is expected: it proves only a checkwash step with no <code>with:</code>), or run <code>checkwash check --task</code> in a CLI step of your own with a base-side <code>oracle_freeze</code> contract (the Action has no task input); both block more honest changes too. From 0.11.0, on a local hook install, the Claude Code PreToolUse hook asks before an Edit, Write or MultiEdit of a Python test leaves a finding of its five weakening rules at high, whatever repair evidence the rest of the working tree holds; its limits are in the <a href="https://github.com/taipei49314/checkwash/blob/main/docs/KNOWN-ISSUES-v0.11.0.md" target="_blank" rel="noopener noreferrer">0.11.0 known issues</a>.</p>
<p>In v0.8.0, JS/TS <code>test.each</code>, <code>it.each</code> and <code>test.for</code> tables are not scanned: an assertion weakened or deleted in one, an edited row or a deleted table passes. In v0.9.0, each such table is a test unit, and its rows are read when they can be counted (an inline array or a tagged template, or a same-file <code>const</code> read only as a table). The rows of a <code>describe.each</code> table stay unread, and a table with a computed title is not a unit (<a href="https://github.com/taipei49314/checkwash/issues/428" target="_blank" rel="noopener noreferrer">#428</a>).</p>
<p>Legitimate refactors can be flagged. The frozen historical corpus records <strong>22 blocks out of 60 (36.7%)</strong>. A separate pre-release source replay records 4/60 blocks, including 2/57 strictly qualified cases; three existing fixture errors remain. These are selected examples, not a general false-positive rate. The v0.10.0 ledger retains 6/60 static source blocks after the <a href="https://github.com/taipei49314/checkwash/blob/main/docs/oracle-context-dispositions-0.10.0.md" target="_blank" rel="noopener noreferrer">D-185 dispositions</a>, including two additional known legitimate-refactor false blocks. This is a later source readback, not a rewrite of the historical runtime results.</p>
<p>A changed file over 1,000,000 bytes is not read. An image, data file, lockfile, document or non-Python production source that large is reported on stderr and earns no repair evidence.</p>
<p>&lt;details&gt; &lt;summary&gt;Which files over the limit stop the run, and how each output and the Stop hook report them&lt;/summary&gt;</p>
<p>Since v0.9.0 (<a href="https://github.com/taipei49314/checkwash/issues/454" target="_blank" rel="noopener noreferrer">#454</a>), <code>--format json</code> also lists it under <code>unread</code>, SARIF names it in a tool execution notification, and the term report adds a <code>!</code> line and, when there is no finding, opens with &quot;analysis incomplete&quot;; the Stop hook&#x27;s JSON and <code>--emit-ir</code> do not name it. A file a detector must read (test, conftest, CI, guardrail, snapshot, JS setup, runner script or test-command file) that large stops the run with exit 2, naming it. So do a <code>.py</code> module that large, whether added, deleted, renamed or edited, and a pytest configuration file (<code>pytest.ini</code>, <code>.pytest.ini</code>, <code>pytest.toml</code>, <code>.pytest.toml</code>, <code>tox.ini</code>, <code>setup.cfg</code>, <code>pyproject.toml</code>) at any depth: either can change the module a test&#x27;s import resolves to. So do any non-generated file under the root <code>scripts/</code> directory, read for the pytest commands it runs, and any other changed file that large the analysis needs as context. A shell shebang gives a file the shape of a runner script, whatever its name, except a <code>.py</code> module or a JS/TS test file. Since v0.9.0 (<a href="https://github.com/taipei49314/checkwash/issues/455" target="_blank" rel="noopener noreferrer">#455</a>), checkwash reads the first 200 bytes of a side over the limit to tell, and uses them for nothing else; a Git side is streamed and checked against its object id. Where those bytes are read, a file that large whose side starts with a shell shebang stops the run, naming that side, whatever its suffix (a <code>.py</code> module or a JS/TS test file that large stops the run anyway, by its own rule). A file with no extension (a dotfile such as <code>.envrc</code> counts) without one, such as a <code>README</code> or a <code>LICENSE</code>, is set aside like any document, unless another rule above makes it one a detector must read. v0.8.0 reads no byte of such a side, so every file with no extension that large stops the run there. In v0.9.0 a Git side over 64,000,000 bytes is not streamed, so its first bytes are not known: a file with no extension still stops the run when one of its Git sides is that large, and a suffixed file whose shebang is only on such a side is still set aside. When a file that large stops the run, since v0.9.0 <code>--format json</code> prints <code>{&quot;unread&quot;: [...]}</code> on stdout instead of nothing: one <code>unread</code> entry, for the side the run refused. It is not a findings document, and term and SARIF output stay empty. With a range, json output stays empty too when the refused file is a symlinked pytest configuration&#x27;s target that no detector must read. Generated output (<code>build/</code>, <code>dist/</code>, <code>node_modules/</code> and the like) is set aside like a production source unless it is a Python module, a pytest configuration, a CI file, a runner script or a file with no extension whose shebang is not known. A root <code>poetry.lock</code> or <code>uv.lock</code> that large at the base is skipped with a note on stderr, and the skip is not listed under <code>unread</code>; when the diff also changes that lockfile, the change&#x27;s sides over the limit are listed like any other. A root <code>pyproject.toml</code> or <code>requirements*.txt</code> that large at the base stops every run, naming it: term, json and SARIF output exit 2 and name it on stderr only. The Claude Code Stop hook (<code>--format hook-json</code>) reports an engine error, this one included, as a non-blocking &quot;not analysed&quot; message on stdout that quotes the error, and exits 0. Since v0.9.0, when the run stops on a file the hook&#x27;s diff changes and that file&#x27;s working-tree side is over the limit, the hook blocks the stop instead, naming the file and asking to shrink, split or revert it (<a href="https://github.com/taipei49314/checkwash/issues/456" target="_blank" rel="noopener noreferrer">#456</a>). A file whose base side alone is over the limit, a root manifest over it at the base, and a padded file committed before the stop keep the message; the full list is in <a href="https://github.com/taipei49314/checkwash/blob/main/docs/subject-integrity.md" target="_blank" rel="noopener noreferrer">subject integrity</a>.</p>
<p>&lt;/details&gt;</p>
<p>Try it on your own changes before making it required. <a href="https://github.com/taipei49314/checkwash/blob/main/docs/stability.md#coverage-and-adoption-cost" target="_blank" rel="noopener noreferrer">Coverage and limitations</a> · <a href="https://github.com/taipei49314/checkwash/blob/main/docs/adversarial-catalog-2026-09.md" target="_blank" rel="noopener noreferrer">Known gaps</a></p>
<h2>CI details: doctor and the pin</h2>
<p>The recommended Action and the CLI above are both <strong>v0.11.0</strong>. Record which version you use. <a href="https://github.com/taipei49314/checkwash/blob/main/docs/enterprise.md" target="_blank" rel="noopener noreferrer">Full setup and exemptions</a></p>
<p><strong>Development snapshots:</strong> the source in this checkout may be newer than the published CLI. <a href="https://github.com/taipei49314/checkwash/blob/main/release/advertised.toml" target="_blank" rel="noopener noreferrer">The advertised-release manifest</a> records the version, commit and download bytes behind the installation commands above. New changes require their own candidate evidence and remain unreleased until the publication record verifies them; candidate CI success does not mean that the recommended Action pin includes them.</p>
<p><strong>Advisory: Action trust boundary.</strong> Every published Action release up to and including v0.7.0 runs <code>python -m pip</code> and then <code>checkwash</code> with the pull request&#x27;s checkout as the working directory, so a module in that checkout (for example a top-level <code>pip</code> package) can replace the installer and then the checker, and the pull request can tamper with the result it is judged by. Under checkwash&#x27;s threat model that applies to every pull request it judges. v0.8.0 fixes it (<a href="https://github.com/taipei49314/checkwash/pull/372" target="_blank" rel="noopener noreferrer">#372</a>); pin the v0.11.0 Action above. If you stay on v0.7.0 or earlier, treat a pass as advisory, review the pull request before merging and keep <code>comment-pr</code> off. <a href="https://github.com/taipei49314/checkwash/blob/main/SECURITY.md#known-issue-action-trust-boundary" target="_blank" rel="noopener noreferrer">Known issue</a></p>
<p><strong>Which commit is the recommended pin?</strong> A release cannot embed its own commit SHA. Up to v0.10.0, the recommended pin is the commit the tag points to: <code>git rev-parse &#x27;vX.Y.Z^{commit}&#x27;</code>. From v0.11.0 (D-194), it is the release&#x27;s Action commit, the tag&#x27;s second parent&#x27;s parent: <code>git rev-parse &#x27;vX.Y.Z^2^1&#x27;</code>. It is not the commit the tag points to. The release pull request&#x27;s last commit changes one line, <code>doctor</code>&#x27;s own Action pin, to that Action commit, and the tag differs from the Action commit only in that line. The Action runs only <code>checkwash check</code>, which does not import <code>doctor</code>. From v0.11.0, a release&#x27;s <code>doctor</code> accepts two Action pins: the one recommended before the release and the release&#x27;s own Action commit.</p>
<p>Pin updaters such as Dependabot and Renovate follow the <code># vX.Y.Z</code> comment, so they will propose the tag&#x27;s commit, which <code>doctor</code> rejects (inferred from those tools&#x27; documentation, not run). For the same reason zizmor&#x27;s <code>ref-version-mismatch</code> audit can report the comment (inferred, not run). The Action itself is unaffected: it runs the same check at either commit. <code>doctor</code> 0.10.0 does not accept the 0.11.0 pin, so upgrade the CLI and its local hooks first, then the Action pin. The recommended v0.11.0 Action includes the engine published on 2026-11-04 Asia/Taipei. A CLI upgrade does not update an existing Action. <a href="https://github.com/taipei49314/checkwash/blob/main/action/README.md" target="_blank" rel="noopener noreferrer">Action reference</a></p>
<h2>More options and evidence</h2>
<p>&lt;a id=&quot;install&quot;&gt;&lt;/a&gt; &lt;details&gt; &lt;summary&gt;Install as a CLI or try the included examples&lt;/summary&gt;</p>
<p>If you already use pipx, install the fixed version:</p>
<p>```bash pipx install checkwash==0.11.0</p>
<h1>or from the release tag:</h1>
<p>pipx install git+https://github.com/taipei49314/checkwash@v0.11.0</p>
<p>checkwash check HEAD~1..HEAD checkwash demo                  # 8 real tampering cases, blocked, offline ```</p>
<p><code>checkwash demo</code> replays eight real tampering cases and one honest fix. It illustrates known patterns; it is not a coverage guarantee. You can run the same examples with <code>python checkwash.pyz demo</code>.</p>
<p>&lt;/details&gt;</p>
<p>&lt;a id=&quot;measured-not-asserted&quot;&gt;&lt;/a&gt; &lt;details&gt; &lt;summary&gt;Read the measurements and their limits&lt;/summary&gt;</p>
<p>The historical six-repo sweep recorded <strong>46 / 1800 = 2.56%</strong> blocks: <strong>31 false positives (1.72%)</strong>, 15 legitimate policy blocks (0.83%). The tracked artifacts record engine <strong>v0.3.0</strong> (the release commit, swept 2026-09-07) on a corpus used to tune the detectors, not a held-out result.</p>
<p><strong>1.33% of the corpus (24/1800) records opaque production changes</strong>. That flag does not establish that each verdict changed or each diff was unanalyzed.</p>
<p>Review methods vary: the three-rater agreement study covers an older 35-diff cohort, not all 46 blocks. The dedicated <strong>22/60 refactor</strong> result (<code>benchmarks/refactors/results-latest.json</code>, a dated v0.3.1 snapshot) is a separate population; the general-commit rate does not predict it.</p>
<p><a href="https://github.com/taipei49314/checkwash/blob/main/benchmarks/README.md" target="_blank" rel="noopener noreferrer">Measurements and source data</a> · <a href="https://github.com/taipei49314/checkwash/blob/main/benchmarks/RESULTS.md" target="_blank" rel="noopener noreferrer">Generated results</a> · <a href="https://github.com/taipei49314/checkwash/blob/main/benchmarks/FAILURES.md" target="_blank" rel="noopener noreferrer">Failure ledger</a></p>
<p>&lt;/details&gt;</p>
<p>| Looking for… | Start here | |---|---| | Installation checks, versions and first use | <a href="https://github.com/taipei49314/checkwash/blob/main/docs/releases/v0.11.0-publication-verification.md" target="_blank" rel="noopener noreferrer">v0.11.0 publication record</a> · <a href="https://github.com/taipei49314/checkwash/blob/main/docs/releases/v0.11.0-public-launch.md" target="_blank" rel="noopener noreferrer">v0.11.0 release guide</a> · <a href="https://github.com/taipei49314/checkwash/blob/main/docs/releases/README.md" target="_blank" rel="noopener noreferrer">Release history</a> | | JSON/SARIF contracts and upgrades | <a href="https://github.com/taipei49314/checkwash/blob/main/docs/stability.md" target="_blank" rel="noopener noreferrer">Stability</a> · <a href="https://github.com/taipei49314/checkwash/blob/main/docs/embedding.md" target="_blank" rel="noopener noreferrer">Embedding guide</a> · <a href="https://github.com/taipei49314/checkwash/blob/main/docs/findings.schema.json" target="_blank" rel="noopener noreferrer">Findings schema</a> | | Assertion support, coverage warnings and artifact checks | <a href="https://github.com/taipei49314/checkwash/blob/main/docs/assertion-coverage.md" target="_blank" rel="noopener noreferrer">Assertion coverage</a> | | Required checks and reviewed exemptions | <a href="https://github.com/taipei49314/checkwash/blob/main/docs/enterprise.md" target="_blank" rel="noopener noreferrer">Enterprise setup</a> | | Contributing or reporting a problem | <a href="https://github.com/taipei49314/checkwash/blob/main/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer">Contributing</a> · <a href="https://github.com/taipei49314/checkwash/issues" target="_blank" rel="noopener noreferrer">Issues</a> · <a href="https://github.com/taipei49314/checkwash/blob/main/SECURITY.md" target="_blank" rel="noopener noreferrer">Security reports</a> | | Readiness for 1.0 | <a href="https://github.com/taipei49314/checkwash/blob/main/docs/stability.md#what-must-change-before-10" target="_blank" rel="noopener noreferrer">Criteria — not met</a> |</p>
<p>Related projects: <a href="https://github.com/taipei49314/checkwash-corpus" target="_blank" rel="noopener noreferrer">checkwash-corpus</a> and <a href="https://github.com/taipei49314/smallestlie" target="_blank" rel="noopener noreferrer">smallestlie</a> hold evaluation work.</p>
<p>The package also includes a limited quality preview for coverage, Ruff and mypy configuration review. <a href="https://github.com/taipei49314/checkwash/blob/main/docs/quality-adoption.md" target="_blank" rel="noopener noreferrer">Setup and CI adoption guide</a>. Its frozen legacy-byte comparison remains red; publication does not establish natural-case acceptance or effective enforcement.</p>
<p>Alpha pre-release. 22 detectors, 22461 tests (collection denominator). Zero runtime dependencies. <a href="https://github.com/taipei49314/checkwash/blob/main/LICENSE" target="_blank" rel="noopener noreferrer">Apache-2.0</a>.</p>
<p><strong>原文链接：</strong><a href="https://x.com/kartg123451/status/2118550260104769565">https://x.com/kartg123451/status/2118550260104769565</a></p>
<p><strong>相关链接：</strong><a href="https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/README.md">https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/README.md</a></p>]]></content:encoded>
      <qiaomu:versions><![CDATA[{"version": 1, "original": {"title": "checkwash — author announcement and complete README", "url": "https://x.com/kartg123451/status/2118550260104769565", "lang": "en", "html": "<h2>checkwash — author announcement and complete README</h2>\n\n<h2>Author announcement — Nelson Chu (@kartg123451)</h2>\n<p>Source: https://x.com/kartg123451/status/2118550260104769565</p>\n<p>I built checkwash because a green CI run can still hide a weaker test. It reads a Git diff locally — no LLM, no network — and flags when an edit weakens or removes an assertion, disables a test, or loosens a tolerance.</p>\n<p>https://t.co/J7eBvvMKBK</p>\n<h2>Linked README — complete text, fixed source snapshot</h2>\n<p>Source: https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/README.md</p>\n<h1>checkwash</h1>\n<p><a href=\"https://github.com/taipei49314/checkwash/actions/workflows/ci.yml/badge.svg\" target=\"_blank\" rel=\"noopener noreferrer\">![CI</a>](https://github.com/taipei49314/checkwash/actions/workflows/ci.yml) <a href=\"https://img.shields.io/pypi/v/checkwash.svg\" target=\"_blank\" rel=\"noopener noreferrer\">![PyPI</a>](https://pypi.org/project/checkwash/) <a href=\"https://img.shields.io/badge/license-Apache--2.0-blue.svg\" target=\"_blank\" rel=\"noopener noreferrer\">![License</a>](https://github.com/taipei49314/checkwash/blob/main/LICENSE)</p>\n<p><strong>Check whether a code change weakens your tests.</strong></p>\n<p>A test can pass after it stops checking something useful. checkwash reads your Git diff and flags known patterns such as deleted assertions, skipped tests, relaxed expectations, and CI checks that stop failing.</p>\n<p>```diff</p>\n<ul>\n<li>assert total == 105.3</li>\n<p>+ assert total &gt; 0 ```</p>\n</ul>\n<p>The new assertion accepts many incorrect totals. checkwash can flag changes like this for review, including changes written by coding agents.</p>\n<p><strong>Runs locally. No LLM. No network during analysis. Never executes your code.</strong></p>\n<p>The install commands and Action pin below name v0.11.0, the latest release whose public files are verified (<a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/releases/README.md\" target=\"_blank\" rel=\"noopener noreferrer\">release history</a>).</p>\n<p>Start in one of three ways, each below: Claude Code hooks, the CLI on a repository, or the GitHub Action as a required check.</p>\n<h2>Use it with Claude Code</h2>\n<p>You need <strong>Python 3.11+, Git and Claude Code</strong>. Install the CLI, then run the hook installer from the root of your repository:</p>\n<p>``<code>bash pipx install checkwash==0.11.0 checkwash hook install --agent claude-code --local </code>``</p>\n<p>This writes checkwash&#x27;s hooks to <code>.claude/settings.local.json</code>, the machine-local Claude Code settings.</p>\n<ul>\n<li>The <strong>Stop hook</strong> checks the working tree against HEAD when Claude is about</li>\n<p>to stop. On a blocking finding it blocks the stop and gives Claude the finding. A SessionStart hook in the same file records where each session starts, so the Stop hook also checks what the session commits.</p>\n<li>From 0.11.0, a local install also adds a <strong>PreToolUse ask</strong>.</li>\n<p>When an Edit, Write or MultiEdit of a Python test file would leave a finding of one of five weakening rules (<code>ASSERT_WEAKENED</code>, <code>ASSERT_REMOVED</code>, <code>TEST_DISABLED</code>, <code>TOLERANCE_LOOSENED</code> and <code>BROAD_EXCEPT_ADDED</code>) at high, the hook asks you before the edit is made. In a <code>claude -p</code> run nobody can answer, so such an edit is denied; the interactive prompt is not verified in any mode. From 0.11.0 a local install is the default, and <code>--shared</code> writes <code>.claude/settings.json</code> with no PreToolUse ask.</p>\n</ul>\n<p>Both hooks are author-side checks. An edit made through Bash never reaches the ask. When the Stop hook cannot analyse a change, it says so and does not block the stop, except for a changed file over the size limit (see &quot;Know the limits&quot;). Neither hook can stop someone else&#x27;s merge: the required check under &quot;Use it in CI&quot; is the gate. The 0.11.0 hooks&#x27; limits are in the <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/KNOWN-ISSUES-v0.11.0.md\" target=\"_blank\" rel=\"noopener noreferrer\">0.11.0 known issues</a>.</p>\n<h2>Try it on a repository</h2>\n<p>You need <strong>Python 3.11+ and Git</strong>. Download and try the offline examples first.</p>\n<p>Windows PowerShell (including 5.1):</p>\n<p>``<code>powershell curl.exe -LO https://github.com/taipei49314/checkwash/releases/download/v0.11.0/checkwash.pyz python checkwash.pyz --version python checkwash.pyz demo </code>``</p>\n<p>PowerShell 5.1 aliases <code>curl</code> to <code>Invoke-WebRequest</code>; use <code>curl.exe</code> as written. macOS/Linux or Git Bash:</p>\n<p>``<code>bash curl -LO https://github.com/taipei49314/checkwash/releases/download/v0.11.0/checkwash.pyz python checkwash.pyz --version python checkwash.pyz demo </code>``</p>\n<p>Then, from the root of a repository with at least two commits:</p>\n<p>``<code>bash python checkwash.pyz check HEAD~1..HEAD </code>``</p>\n<p>This checks your last commit. Start with a change you already understand. You can also <a href=\"https://github.com/taipei49314/checkwash/releases/download/v0.11.0/checkwash.pyz\" target=\"_blank\" rel=\"noopener noreferrer\">download the file in your browser</a>. For uncommitted changes use <code>python checkwash.pyz check</code>. For a branch review, use <code>python checkwash.pyz check BASE...HEAD</code> to compare from the merge base; <code>BASE..HEAD</code> compares the two named snapshots directly.</p>\n<p>From a subdirectory, <code>check</code> analyses the whole repository from its Git root and says so in one line on stderr (since v0.8.0, <a href=\"https://github.com/taipei49314/checkwash/issues/416\" target=\"_blank\" rel=\"noopener noreferrer\">#416</a>). Before v0.8.0, run it from the repository root.</p>\n<p>For JSON/SARIF output and more examples, see the <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/embedding.md\" target=\"_blank\" rel=\"noopener noreferrer\">embedding guide</a> and the <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/stability.md\" target=\"_blank\" rel=\"noopener noreferrer\">stability contracts</a>.</p>\n<h2>Use it in CI</h2>\n<p>To stop a merge, make the <strong><code>checkwash</code> status check required</strong> in your repository&#x27;s branch rules. Installing the tool or adding a workflow alone does not enforce its verdict.</p>\n<p>&lt;a id=&quot;required-check--the-only-configuration-that-blocks-a-merge&quot;&gt;&lt;/a&gt;</p>\n<p>Save this as <code>.github/workflows/checkwash.yml</code>:</p>\n<p>```yaml</p>\n<h1>.github/workflows/checkwash.yml</h1>\n<p>on: [pull_request]</p>\n<p>permissions: contents: read</p>\n<p>jobs: checkwash: runs-on: ubuntu-latest steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 persist-credentials: false - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: &quot;3.12&quot; - uses: taipei49314/checkwash/action@257150319fca15235185fc629d8b9c21c17166ca # v0.11.0 ```</p>\n<p>After the workflow runs, open <strong>Settings → Rules → Rulesets</strong> and require the <code>checkwash</code> status context. Keep the job unconditional.</p>\n<p>If you administer the repository and have this project&#x27;s ruleset file, you can instead create the rule with:</p>\n<p>``<code>bash gh api repos/OWNER/REPO/rulesets --method POST --input action/required-ruleset.json </code>``</p>\n<p>This adds a ruleset; it does not replace existing ones. <code>checkwash doctor</code> can inspect the local workflow, but cannot verify live branch protection. <code>doctor</code> 0.11.0 accepts the pin above and v0.10.0&#x27;s. <code>doctor</code> 0.10.0 accepts only the Action pin built into it, v0.9.0&#x27;s, so it reports the pin above as an unsupported SHA (&quot;workflow analysis incomplete&quot;, exit 1): upgrade the CLI and its local hooks before the Action pin.</p>\n<h2>When checkwash blocks</h2>\n<p>| Result | What to do | |---|---| | <strong>Pass · exit 0</strong> | No finding requires blocking under your configuration. Keep running your normal tests and review. | | <strong>Block · exit 1</strong> | Read the finding and the diff. It may be weakened verification or a false positive. | | <strong>Error · exit 2</strong> | Resolve the input or analysis error before relying on the result. |</p>\n<p>The default threshold is <strong>high</strong>: a visible <strong>warn</strong> can still pass.</p>\n<p><strong>Read the finding.</strong> Each finding names its rule, its severity, and the file and test it is in. If the change at the top is the whole diff, made in <code>test_invoice_total</code> in <code>tests/test_billing.py</code>, the finding reads:</p>\n<p>``<code>text ASSERT_WEAKENED   HIGH   tests/test_billing.py :: test_invoice_total test_invoice_total: assertion strength EXACT_VALUE(90) -&gt; BOUND(40) why high: NO_PROD_CHANGE_IN_DIFF no de-escalator applied before  assert total == 105.3 after   assert total &gt; 0 </code>``</p>\n<p><code>EXACT_VALUE(90) -&gt; BOUND(40)</code> ranks the assertion&#x27;s strength before and after; 90 is not the value the test expected. <code>why high</code> names what raised the finding: here the diff changes no production file, so no production change explains the weaker test. <code>checkwash check --format json</code> gives the same findings as JSON.</p>\n<p><strong>Fix the change, or record a reviewed exemption.</strong> If the test was weakened by mistake, restore it, and fix the code if the restored test fails. If the weaker test is intended, the report also prints a <code>checkwash allow</code> command with the finding&#x27;s fingerprint, and the ledger file to commit:</p>\n<p>``<code>bash checkwash allow &quot;&lt;the fingerprint from the report&gt;&quot; --reason &quot;why the weaker test is correct&quot; </code>``</p>\n<p>Configuration and exemptions are read from the base side of the diff, so a change cannot exempt itself: commit the entry through review, and it applies to the next diff once it is on the base. Since v0.10.0, a newly winning <code>.checkwash</code> config or allowance is compared with its BASE <code>.greenwash</code> predecessor, so a change cannot approve its own relaxation either. An entry needs a reason and expires after 90 days by default, 180 at most. Keep <code>.checkwash/</code> and <code>.greenwash/</code> behind <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/enterprise.md#4-codeowners\" target=\"_blank\" rel=\"noopener noreferrer\">code owners</a>. From 0.11.0, the Stop hook tells Claude not to add an exemption itself but to tell you which finding blocks and why, and the PreToolUse ask asks you to approve only if the weaker test is intended. <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/enterprise.md#3-allowlist--reviewed-time-boxed-base-side\" target=\"_blank\" rel=\"noopener noreferrer\">Exemption rules</a></p>\n<p><strong>Report a false block.</strong> If the change is honest and checkwash blocks it, look for it in the <a href=\"https://github.com/taipei49314/checkwash/blob/main/benchmarks/FAILURES.md\" target=\"_blank\" rel=\"noopener noreferrer\">failure ledger</a> first, then open an <a href=\"https://github.com/taipei49314/checkwash/issues\" target=\"_blank\" rel=\"noopener noreferrer\">issue</a> with the <strong>checkwash blocked honest work</strong> template, giving the diff and the <code>checkwash check --format json</code> output. A report becomes a regression fixture, and the ledger credits the reporter.</p>\n<h2>Know the limits</h2>\n<p><strong>checkwash is alpha.</strong> A pass does not prove that a change is correct or honest. Python is the main language supported; JS/TS support covers a limited set of test patterns. Known gaps remain.</p>\n<p>An edit that changes nothing, such as <code>+ 0</code> in a function a test calls or one line in a template or <code>AUTHORS</code>, can still hold a weakened Python or JS/TS test at warn, which passes at the default threshold. #419 is closed as a documented residual, not fixed (<a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/enterprise.md#7-hardening-against-bought-repair-evidence-419\" target=\"_blank\" rel=\"noopener noreferrer\">what still passes and how to block it</a>). Read the <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/KNOWN-ISSUES-v0.11.0.md\" target=\"_blank\" rel=\"noopener noreferrer\">0.11.0 known issues</a> and the <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/KNOWN-ISSUES-v0.10.0.md\" target=\"_blank\" rel=\"noopener noreferrer\">earlier limits they build on</a> before relying on a pass.</p>\n<p><code>REPAIR_EVIDENCE</code> describes related changes in the same diff; it does not prove a repair is correct, and an edit that changes nothing can earn it (#419). To block such changes, set the Action&#x27;s <code>fail-on: warn</code> (<code>checkwash doctor</code> then reports &quot;workflow analysis incomplete&quot; and exits 1, which is expected: it proves only a checkwash step with no <code>with:</code>), or run <code>checkwash check --task</code> in a CLI step of your own with a base-side <code>oracle_freeze</code> contract (the Action has no task input); both block more honest changes too. From 0.11.0, on a local hook install, the Claude Code PreToolUse hook asks before an Edit, Write or MultiEdit of a Python test leaves a finding of its five weakening rules at high, whatever repair evidence the rest of the working tree holds; its limits are in the <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/KNOWN-ISSUES-v0.11.0.md\" target=\"_blank\" rel=\"noopener noreferrer\">0.11.0 known issues</a>.</p>\n<p>In v0.8.0, JS/TS <code>test.each</code>, <code>it.each</code> and <code>test.for</code> tables are not scanned: an assertion weakened or deleted in one, an edited row or a deleted table passes. In v0.9.0, each such table is a test unit, and its rows are read when they can be counted (an inline array or a tagged template, or a same-file <code>const</code> read only as a table). The rows of a <code>describe.each</code> table stay unread, and a table with a computed title is not a unit (<a href=\"https://github.com/taipei49314/checkwash/issues/428\" target=\"_blank\" rel=\"noopener noreferrer\">#428</a>).</p>\n<p>Legitimate refactors can be flagged. The frozen historical corpus records <strong>22 blocks out of 60 (36.7%)</strong>. A separate pre-release source replay records 4/60 blocks, including 2/57 strictly qualified cases; three existing fixture errors remain. These are selected examples, not a general false-positive rate. The v0.10.0 ledger retains 6/60 static source blocks after the <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/oracle-context-dispositions-0.10.0.md\" target=\"_blank\" rel=\"noopener noreferrer\">D-185 dispositions</a>, including two additional known legitimate-refactor false blocks. This is a later source readback, not a rewrite of the historical runtime results.</p>\n<p>A changed file over 1,000,000 bytes is not read. An image, data file, lockfile, document or non-Python production source that large is reported on stderr and earns no repair evidence.</p>\n<p>&lt;details&gt; &lt;summary&gt;Which files over the limit stop the run, and how each output and the Stop hook report them&lt;/summary&gt;</p>\n<p>Since v0.9.0 (<a href=\"https://github.com/taipei49314/checkwash/issues/454\" target=\"_blank\" rel=\"noopener noreferrer\">#454</a>), <code>--format json</code> also lists it under <code>unread</code>, SARIF names it in a tool execution notification, and the term report adds a <code>!</code> line and, when there is no finding, opens with &quot;analysis incomplete&quot;; the Stop hook&#x27;s JSON and <code>--emit-ir</code> do not name it. A file a detector must read (test, conftest, CI, guardrail, snapshot, JS setup, runner script or test-command file) that large stops the run with exit 2, naming it. So do a <code>.py</code> module that large, whether added, deleted, renamed or edited, and a pytest configuration file (<code>pytest.ini</code>, <code>.pytest.ini</code>, <code>pytest.toml</code>, <code>.pytest.toml</code>, <code>tox.ini</code>, <code>setup.cfg</code>, <code>pyproject.toml</code>) at any depth: either can change the module a test&#x27;s import resolves to. So do any non-generated file under the root <code>scripts/</code> directory, read for the pytest commands it runs, and any other changed file that large the analysis needs as context. A shell shebang gives a file the shape of a runner script, whatever its name, except a <code>.py</code> module or a JS/TS test file. Since v0.9.0 (<a href=\"https://github.com/taipei49314/checkwash/issues/455\" target=\"_blank\" rel=\"noopener noreferrer\">#455</a>), checkwash reads the first 200 bytes of a side over the limit to tell, and uses them for nothing else; a Git side is streamed and checked against its object id. Where those bytes are read, a file that large whose side starts with a shell shebang stops the run, naming that side, whatever its suffix (a <code>.py</code> module or a JS/TS test file that large stops the run anyway, by its own rule). A file with no extension (a dotfile such as <code>.envrc</code> counts) without one, such as a <code>README</code> or a <code>LICENSE</code>, is set aside like any document, unless another rule above makes it one a detector must read. v0.8.0 reads no byte of such a side, so every file with no extension that large stops the run there. In v0.9.0 a Git side over 64,000,000 bytes is not streamed, so its first bytes are not known: a file with no extension still stops the run when one of its Git sides is that large, and a suffixed file whose shebang is only on such a side is still set aside. When a file that large stops the run, since v0.9.0 <code>--format json</code> prints <code>{&quot;unread&quot;: [...]}</code> on stdout instead of nothing: one <code>unread</code> entry, for the side the run refused. It is not a findings document, and term and SARIF output stay empty. With a range, json output stays empty too when the refused file is a symlinked pytest configuration&#x27;s target that no detector must read. Generated output (<code>build/</code>, <code>dist/</code>, <code>node_modules/</code> and the like) is set aside like a production source unless it is a Python module, a pytest configuration, a CI file, a runner script or a file with no extension whose shebang is not known. A root <code>poetry.lock</code> or <code>uv.lock</code> that large at the base is skipped with a note on stderr, and the skip is not listed under <code>unread</code>; when the diff also changes that lockfile, the change&#x27;s sides over the limit are listed like any other. A root <code>pyproject.toml</code> or <code>requirements*.txt</code> that large at the base stops every run, naming it: term, json and SARIF output exit 2 and name it on stderr only. The Claude Code Stop hook (<code>--format hook-json</code>) reports an engine error, this one included, as a non-blocking &quot;not analysed&quot; message on stdout that quotes the error, and exits 0. Since v0.9.0, when the run stops on a file the hook&#x27;s diff changes and that file&#x27;s working-tree side is over the limit, the hook blocks the stop instead, naming the file and asking to shrink, split or revert it (<a href=\"https://github.com/taipei49314/checkwash/issues/456\" target=\"_blank\" rel=\"noopener noreferrer\">#456</a>). A file whose base side alone is over the limit, a root manifest over it at the base, and a padded file committed before the stop keep the message; the full list is in <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/subject-integrity.md\" target=\"_blank\" rel=\"noopener noreferrer\">subject integrity</a>.</p>\n<p>&lt;/details&gt;</p>\n<p>Try it on your own changes before making it required. <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/stability.md#coverage-and-adoption-cost\" target=\"_blank\" rel=\"noopener noreferrer\">Coverage and limitations</a> · <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/adversarial-catalog-2026-09.md\" target=\"_blank\" rel=\"noopener noreferrer\">Known gaps</a></p>\n<h2>CI details: doctor and the pin</h2>\n<p>The recommended Action and the CLI above are both <strong>v0.11.0</strong>. Record which version you use. <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/enterprise.md\" target=\"_blank\" rel=\"noopener noreferrer\">Full setup and exemptions</a></p>\n<p><strong>Development snapshots:</strong> the source in this checkout may be newer than the published CLI. <a href=\"https://github.com/taipei49314/checkwash/blob/main/release/advertised.toml\" target=\"_blank\" rel=\"noopener noreferrer\">The advertised-release manifest</a> records the version, commit and download bytes behind the installation commands above. New changes require their own candidate evidence and remain unreleased until the publication record verifies them; candidate CI success does not mean that the recommended Action pin includes them.</p>\n<p><strong>Advisory: Action trust boundary.</strong> Every published Action release up to and including v0.7.0 runs <code>python -m pip</code> and then <code>checkwash</code> with the pull request&#x27;s checkout as the working directory, so a module in that checkout (for example a top-level <code>pip</code> package) can replace the installer and then the checker, and the pull request can tamper with the result it is judged by. Under checkwash&#x27;s threat model that applies to every pull request it judges. v0.8.0 fixes it (<a href=\"https://github.com/taipei49314/checkwash/pull/372\" target=\"_blank\" rel=\"noopener noreferrer\">#372</a>); pin the v0.11.0 Action above. If you stay on v0.7.0 or earlier, treat a pass as advisory, review the pull request before merging and keep <code>comment-pr</code> off. <a href=\"https://github.com/taipei49314/checkwash/blob/main/SECURITY.md#known-issue-action-trust-boundary\" target=\"_blank\" rel=\"noopener noreferrer\">Known issue</a></p>\n<p><strong>Which commit is the recommended pin?</strong> A release cannot embed its own commit SHA. Up to v0.10.0, the recommended pin is the commit the tag points to: <code>git rev-parse &#x27;vX.Y.Z^{commit}&#x27;</code>. From v0.11.0 (D-194), it is the release&#x27;s Action commit, the tag&#x27;s second parent&#x27;s parent: <code>git rev-parse &#x27;vX.Y.Z^2^1&#x27;</code>. It is not the commit the tag points to. The release pull request&#x27;s last commit changes one line, <code>doctor</code>&#x27;s own Action pin, to that Action commit, and the tag differs from the Action commit only in that line. The Action runs only <code>checkwash check</code>, which does not import <code>doctor</code>. From v0.11.0, a release&#x27;s <code>doctor</code> accepts two Action pins: the one recommended before the release and the release&#x27;s own Action commit.</p>\n<p>Pin updaters such as Dependabot and Renovate follow the <code># vX.Y.Z</code> comment, so they will propose the tag&#x27;s commit, which <code>doctor</code> rejects (inferred from those tools&#x27; documentation, not run). For the same reason zizmor&#x27;s <code>ref-version-mismatch</code> audit can report the comment (inferred, not run). The Action itself is unaffected: it runs the same check at either commit. <code>doctor</code> 0.10.0 does not accept the 0.11.0 pin, so upgrade the CLI and its local hooks first, then the Action pin. The recommended v0.11.0 Action includes the engine published on 2026-11-04 Asia/Taipei. A CLI upgrade does not update an existing Action. <a href=\"https://github.com/taipei49314/checkwash/blob/main/action/README.md\" target=\"_blank\" rel=\"noopener noreferrer\">Action reference</a></p>\n<h2>More options and evidence</h2>\n<p>&lt;a id=&quot;install&quot;&gt;&lt;/a&gt; &lt;details&gt; &lt;summary&gt;Install as a CLI or try the included examples&lt;/summary&gt;</p>\n<p>If you already use pipx, install the fixed version:</p>\n<p>```bash pipx install checkwash==0.11.0</p>\n<h1>or from the release tag:</h1>\n<p>pipx install git+https://github.com/taipei49314/checkwash@v0.11.0</p>\n<p>checkwash check HEAD~1..HEAD checkwash demo                  # 8 real tampering cases, blocked, offline ```</p>\n<p><code>checkwash demo</code> replays eight real tampering cases and one honest fix. It illustrates known patterns; it is not a coverage guarantee. You can run the same examples with <code>python checkwash.pyz demo</code>.</p>\n<p>&lt;/details&gt;</p>\n<p>&lt;a id=&quot;measured-not-asserted&quot;&gt;&lt;/a&gt; &lt;details&gt; &lt;summary&gt;Read the measurements and their limits&lt;/summary&gt;</p>\n<p>The historical six-repo sweep recorded <strong>46 / 1800 = 2.56%</strong> blocks: <strong>31 false positives (1.72%)</strong>, 15 legitimate policy blocks (0.83%). The tracked artifacts record engine <strong>v0.3.0</strong> (the release commit, swept 2026-09-07) on a corpus used to tune the detectors, not a held-out result.</p>\n<p><strong>1.33% of the corpus (24/1800) records opaque production changes</strong>. That flag does not establish that each verdict changed or each diff was unanalyzed.</p>\n<p>Review methods vary: the three-rater agreement study covers an older 35-diff cohort, not all 46 blocks. The dedicated <strong>22/60 refactor</strong> result (<code>benchmarks/refactors/results-latest.json</code>, a dated v0.3.1 snapshot) is a separate population; the general-commit rate does not predict it.</p>\n<p><a href=\"https://github.com/taipei49314/checkwash/blob/main/benchmarks/README.md\" target=\"_blank\" rel=\"noopener noreferrer\">Measurements and source data</a> · <a href=\"https://github.com/taipei49314/checkwash/blob/main/benchmarks/RESULTS.md\" target=\"_blank\" rel=\"noopener noreferrer\">Generated results</a> · <a href=\"https://github.com/taipei49314/checkwash/blob/main/benchmarks/FAILURES.md\" target=\"_blank\" rel=\"noopener noreferrer\">Failure ledger</a></p>\n<p>&lt;/details&gt;</p>\n<p>| Looking for… | Start here | |---|---| | Installation checks, versions and first use | <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/releases/v0.11.0-publication-verification.md\" target=\"_blank\" rel=\"noopener noreferrer\">v0.11.0 publication record</a> · <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/releases/v0.11.0-public-launch.md\" target=\"_blank\" rel=\"noopener noreferrer\">v0.11.0 release guide</a> · <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/releases/README.md\" target=\"_blank\" rel=\"noopener noreferrer\">Release history</a> | | JSON/SARIF contracts and upgrades | <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/stability.md\" target=\"_blank\" rel=\"noopener noreferrer\">Stability</a> · <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/embedding.md\" target=\"_blank\" rel=\"noopener noreferrer\">Embedding guide</a> · <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/findings.schema.json\" target=\"_blank\" rel=\"noopener noreferrer\">Findings schema</a> | | Assertion support, coverage warnings and artifact checks | <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/assertion-coverage.md\" target=\"_blank\" rel=\"noopener noreferrer\">Assertion coverage</a> | | Required checks and reviewed exemptions | <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/enterprise.md\" target=\"_blank\" rel=\"noopener noreferrer\">Enterprise setup</a> | | Contributing or reporting a problem | <a href=\"https://github.com/taipei49314/checkwash/blob/main/CONTRIBUTING.md\" target=\"_blank\" rel=\"noopener noreferrer\">Contributing</a> · <a href=\"https://github.com/taipei49314/checkwash/issues\" target=\"_blank\" rel=\"noopener noreferrer\">Issues</a> · <a href=\"https://github.com/taipei49314/checkwash/blob/main/SECURITY.md\" target=\"_blank\" rel=\"noopener noreferrer\">Security reports</a> | | Readiness for 1.0 | <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/stability.md#what-must-change-before-10\" target=\"_blank\" rel=\"noopener noreferrer\">Criteria — not met</a> |</p>\n<p>Related projects: <a href=\"https://github.com/taipei49314/checkwash-corpus\" target=\"_blank\" rel=\"noopener noreferrer\">checkwash-corpus</a> and <a href=\"https://github.com/taipei49314/smallestlie\" target=\"_blank\" rel=\"noopener noreferrer\">smallestlie</a> hold evaluation work.</p>\n<p>The package also includes a limited quality preview for coverage, Ruff and mypy configuration review. <a href=\"https://github.com/taipei49314/checkwash/blob/main/docs/quality-adoption.md\" target=\"_blank\" rel=\"noopener noreferrer\">Setup and CI adoption guide</a>. Its frozen legacy-byte comparison remains red; publication does not establish natural-case acceptance or effective enforcement.</p>\n<p>Alpha pre-release. 22 detectors, 22461 tests (collection denominator). Zero runtime dependencies. <a href=\"https://github.com/taipei49314/checkwash/blob/main/LICENSE\" target=\"_blank\" rel=\"noopener noreferrer\">Apache-2.0</a>.</p>\n<p>原文链接：<a href=\"https://x.com/kartg123451/status/2118550260104769565\">https://x.com/kartg123451/status/2118550260104769565</a></p>\n<p>相关链接：<a href=\"https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/README.md\">https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/README.md</a></p>"}, "rewrite": {"title": "checkwash 用 Git diff 检查测试弱化，Alpha 版仍有漏检和误报", "markdown": "Nelson Chu 在 11 月 6 日介绍了自己做的 checkwash：一个在本地读取 Git diff、检查测试是否被改弱的开源工具。它不调用大模型，分析时不联网，也不会执行被检查的代码。测试通过并不一定意味着检查仍然有效，例如把 `assert total == 105.3` 改成 `assert total > 0`，许多错误的金额也会被放行。checkwash 会标记这类改动，包括编程 Agent 写出的改动，交给人审阅。\n\n下面的使用方式和限制来自作者仓库的完整 README。文档推荐的 CLI 和 Action 均为 v0.11.0，说明它是公开发行文件已经核验的版本；本轮阅读了文档，没有安装或执行 checkwash，也没有把文档自述当成本站的独立测试结果。\n\n## 接入 Claude Code：停止时检查，部分编辑前询问\n\n环境需要 Python 3.11 或更新版本、Git 和 Claude Code。在仓库根目录执行 `pipx install checkwash==0.11.0`，再执行 `checkwash hook install --agent claude-code --local`。安装器把钩子写入本机的 `.claude/settings.local.json`。\n\nStop 钩子在 Claude 准备停止时，将工作区与 HEAD 比较。如果发现达到阻断条件的问题，就阻止停止，并把发现交给 Claude。同一配置文件中的 SessionStart 钩子记录每个会话的起点，因此 Stop 钩子也会检查该会话已经提交的改动。\n\n从 0.11.0 起，本地安装还加入 PreToolUse 询问。当通过 Edit、Write 或 MultiEdit 编辑 Python 测试文件，会使下列五种弱化规则中的某项仍处于 high 严重性时，它会在编辑前询问：`ASSERT_WEAKENED`、`ASSERT_REMOVED`、`TEST_DISABLED`、`TOLERANCE_LOOSENED`、`BROAD_EXCEPT_ADDED`。在 `claude -p` 模式下没有人可以回答，这类编辑会被拒绝。README 同时明确，交互式询问尚未在任何模式下验证。\n\n0.11.0 默认采用本地安装；`--shared` 则写入 `.claude/settings.json`，不加入 PreToolUse 询问。这些都是作者一侧的检查：通过 Bash 做的编辑不会经过这道询问。Stop 钩子无法分析改动时，通常只报告情况、不阻止停止，工作区改动文件超出大小限制是下文说明的例外。它们都不能阻止别人合并 PR；真正的合并门禁需要 CI 中的必需状态检查。钩子的已知限制另见 [0.11.0 已知问题](https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/KNOWN-ISSUES-v0.11.0.md)。\n\n## 先在熟悉的改动上试用\n\n只使用 CLI，需要 Python 3.11 或更新版本和 Git。作者建议先下载单文件程序，运行离线示例。\n\nWindows PowerShell，包括 5.1，下载命令是 `curl.exe -LO https://github.com/taipei49314/checkwash/releases/download/v0.11.0/checkwash.pyz`。随后执行 `python checkwash.pyz --version` 和 `python checkwash.pyz demo`。PowerShell 5.1 会把 `curl` 当成 `Invoke-WebRequest` 的别名，因此这里特意使用 `curl.exe`。\n\nmacOS、Linux 或 Git Bash 的下载命令是 `curl -LO https://github.com/taipei49314/checkwash/releases/download/v0.11.0/checkwash.pyz`，之后运行相同的版本与 demo 命令。也可以[用浏览器下载该文件](https://github.com/taipei49314/checkwash/releases/download/v0.11.0/checkwash.pyz)。\n\n进入至少有两次提交的仓库根目录，执行 `python checkwash.pyz check HEAD~1..HEAD`，检查最近一次提交。未提交的改动使用 `python checkwash.pyz check`。评审分支时，`python checkwash.pyz check BASE...HEAD` 从共同祖先开始比较，`BASE..HEAD` 则直接比较两个指定快照。\n\n从 v0.8.0 起，在子目录运行 `check` 也会从 Git 根目录分析整个仓库，并在标准错误输出中说明。更早版本需要在仓库根目录运行。JSON、SARIF 输出和更多用法，见[嵌入指南](https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/embedding.md)与[稳定性契约](https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/stability.md)。\n\n## CI 必须设成必需检查，才会阻止合并\n\n只安装工具或添加工作流，不会强制执行检查结论。需要把 `checkwash` 状态上下文设为仓库分支规则中的必需检查，并保持这个任务无条件运行。\n\nREADME 给出的 `.github/workflows/checkwash.yml` 在 `pull_request` 时运行，权限仅为 `contents: read`，任务名为 `checkwash`，执行环境为 `ubuntu-latest`。它固定了三个 Action 的提交：\n\n- `actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1`，标注 v7.0.1，设置 `fetch-depth: 0` 和 `persist-credentials: false`。\n- `actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97`，标注 v7.0.0，Python 版本为 `3.12`。\n- `taipei49314/checkwash/action@257150319fca15235185fc629d8b9c21c17166ca`，标注 v0.11.0。\n\n工作流运行后，在 GitHub 的 Settings → Rules → Rulesets 中要求 `checkwash` 状态检查。完整 YAML 保留在本页原文中，也可以直接打开[固定版本 README](https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/README.md)。\n\n如果是仓库管理员，且已取得项目提供的规则文件，还可以运行 `gh api repos/OWNER/REPO/rulesets --method POST --input action/required-ruleset.json` 添加规则集。这是新增规则，不会替换既有规则。`checkwash doctor` 可以检查本地工作流，但不能验证线上分支保护是否生效。\n\n版本顺序也有要求。`doctor` 0.11.0 接受上面推荐的提交和 v0.10.0 的提交；0.10.0 的 `doctor` 只接受它内置的 v0.9.0 Action 提交，会把上面的 SHA 报成不支持，显示“workflow analysis incomplete”并以 1 退出。因此应先升级 CLI 和本地钩子，再升级 Action 固定提交。\n\n## 怎样理解一次阻断\n\n退出码 0 表示在当前配置下没有需要阻断的发现，正常测试和评审仍要继续；退出码 1 表示需要阅读发现与 diff，可能是验证被削弱，也可能是误报；退出码 2 表示输入或分析出错，必须先解决错误，才能依赖结果。默认阻断阈值是 high，所以报告中看得见的 warn 仍然可能通过。\n\n每条发现会给出规则、严重性、文件和测试名。例如，前面的金额断言若是 `tests/test_billing.py` 中 `test_invoice_total` 的全部 diff，报告会显示 `ASSERT_WEAKENED`、`HIGH`，断言强度从 `EXACT_VALUE(90)` 变成 `BOUND(40)`，原因是 `NO_PROD_CHANGE_IN_DIFF`，且没有应用降级条件，并列出修改前后的断言。\n\n这里的 90 是断言强度等级，不是测试期待的数值。`why high` 解释严重性为什么升高：这份 diff 没改生产文件，也就没有生产代码变化可以解释为什么要弱化测试。需要机器可读输出时，可用 `checkwash check --format json`。\n\n如果测试被误改弱，应恢复测试；恢复后失败，就修代码。确有理由放宽测试时，报告会给出包含该发现指纹的 `checkwash allow` 命令，以及需要提交的豁免账本文件。命令格式为 `checkwash allow \"<the fingerprint from the report>\" --reason \"why the weaker test is correct\"`。\n\n配置和豁免从 diff 的基础版本读取，因此一个改动不能给自己豁免。豁免条目要先经过评审、进入基础版本，才对下一份 diff 生效。自 v0.10.0 起，新生效的 `.checkwash` 配置或豁免还会与 BASE 侧原有的 `.greenwash` 对照，避免一次迁移同时批准自己的放宽。每项豁免必须给出理由，默认 90 天过期，最长 180 天；作者建议对 `.checkwash/` 和 `.greenwash/` 设置代码所有者。\n\n从 0.11.0 起，Stop 钩子会告诉 Claude 不要自行添加豁免，而应向人说明是哪项发现阻断、为什么阻断；PreToolUse 询问也只应在弱化确有必要时批准。具体规则见[企业配置说明](https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/enterprise.md)。\n\n遇到合理改动被阻断，作者要求先查[失败账本](https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/benchmarks/FAILURES.md)，再使用“checkwash blocked honest work”模板报告 Issue，附上 diff 和 `checkwash check --format json` 输出。报告会变成回归样例，账本会署名感谢报告者。\n\n## Alpha 阶段仍会漏检，也会误报\n\ncheckwash 仍是 Alpha。一次通过不能证明改动正确，也不能证明改动诚实。Python 是主要支持语言，JS/TS 只覆盖有限的测试模式。\n\n一个没有实际效果的改动，例如在测试调用的函数里加 `+ 0`，或只改一行模板、`AUTHORS`，仍可能让被弱化的 Python 或 JS/TS 测试停留在 warn，从而通过默认阈值。#419 虽已关闭，处理方式是记录残留风险，并未修复。`REPAIR_EVIDENCE` 只表示同一 diff 内存在相关改动，不证明修复正确；无实效的编辑也可能获得这个标记。\n\n要阻断这类改动，可以把 Action 的 `fail-on` 设为 `warn`。此时 `checkwash doctor` 会报告“workflow analysis incomplete”并以 1 退出，这是文档说明的预期行为，因为它只证明没有 `with:` 配置的 checkwash 步骤。另一种方式是自己添加 CLI 步骤，执行 `checkwash check --task`，配合基础版本中的 `oracle_freeze` 契约；Action 本身没有 task 输入。这两条路线都会额外阻断一些合理改动。\n\n对于本地安装，0.11.0 的 PreToolUse 钩子在那五项弱化规则处于 high 时，会在 Python 测试文件的 Edit、Write、MultiEdit 前询问，不受工作区其他修复证据影响。它自身的边界仍应按已知问题文档理解。\n\nJS/TS 的参数表支持也分版本。v0.8.0 不扫描 `test.each`、`it.each` 和 `test.for` 的表格，表内断言弱化或删除、修改一行数据、删除整张表，都可能通过。v0.9.0 开始把每张这样的表视为一个测试单元，并在能够计数时读取数据行：包括内联数组、标签模板，或同文件中只作为表使用的 `const`。`describe.each` 的数据行仍不读取，标题由计算产生的表也不会被视为测试单元，见 #428。\n\n合理重构可能被误报。冻结的历史重构样本中，60 项有 22 项被阻断，占 36.7%。另一次独立的预发行源码回放中，60 项有 4 项被阻断；其中 57 项严格符合限定的案例里，有 2 项被阻断，仍有三个既有样例错误。这些都是经过挑选的样本，不能当成一般误报率。v0.10.0 账本在 D-185 处置后保留了 6/60 的静态源码阻断，其中包括另外两项已知的合理重构误报；这是后来对源码的重新核查，没有改写历史运行结果。\n\n## 文件过大时，哪些情况会停止分析\n\n变更文件超过 1,000,000 字节就不会被完整读取。图片、数据、锁文件、文档，以及非 Python 的生产源码超出该限制时，会在标准错误输出中报告，也不会获得修复证据。\n\n从 v0.9.0 起，这类未读文件还会出现在 JSON 的 `unread` 中；SARIF 使用工具执行通知报告；终端报告增加 `!` 行，没有其他发现时以“analysis incomplete”开头。Stop 钩子的 JSON 和 `--emit-ir` 不会列出这些文件名。\n\n如果超限的是检测器必须读取的文件，就以退出码 2 停止，并指出文件。这包括测试、conftest、CI、护栏、快照、JS 设置、运行脚本、测试命令文件，以及分析所需的其他上下文。超限的 `.py` 模块不论新增、删除、重命名或编辑，也会停止分析；任意层级的 pytest 配置同样如此，包括 `pytest.ini`、`.pytest.ini`、`pytest.toml`、`.pytest.toml`、`tox.ini`、`setup.cfg` 和 `pyproject.toml`，因为它们可能改变测试导入模块时解析到的对象。根目录 `scripts/` 中为分析 pytest 命令而读取的非生成文件，也受同样约束。\n\nShell shebang 会让文件被视为运行脚本，不受文件名影响；`.py` 模块和 JS/TS 测试文件则有自己的规则。v0.9.0 起，程序读取超限一侧的前 200 字节，只用于识别文件类型；Git 中的那一侧会以流式读取，并核对对象 ID。如果这些字节显示 shell shebang，就会指出具体哪一侧并停止。没有扩展名的文件——包括 `.envrc` 这样的点文件——若没有 shebang，例如 `README` 或 `LICENSE`，通常按文档搁置，除非被其他规则判定为必读文件。\n\nv0.8.0 不读取超限文件的任何字节，所以那时所有超限、无扩展名文件都会停止分析。v0.9.0 不会流式读取 Git 中超过 64,000,000 字节的一侧；若无扩展名文件有这样大的一侧，仍会停止。带扩展名的文件如果 shebang 只存在于这一超大侧，则仍会被搁置。\n\n超限文件导致停止时，v0.9.0 起 JSON 会在标准输出中给出 `{\"unread\": [...]}`，只列拒绝读取的那一侧，而不是完整的 findings 文档；终端和 SARIF 输出仍为空。使用比较范围时，若被拒读的是符号链接指向的 pytest 配置目标，且没有检测器必须读取该目标，JSON 输出也仍为空。\n\n`build/`、`dist/`、`node_modules/` 等生成产物通常按生产源码搁置，但 Python 模块、pytest 配置、CI 文件、运行脚本，以及 shebang 未知的无扩展名文件仍是例外。基础版本根目录中超限的 `poetry.lock` 或 `uv.lock` 会被跳过，并在标准错误输出提示；这次跳过不进入 `unread`。如果 diff 本身也改了该锁文件，超限的变化侧仍按一般规则列出。\n\n基础版本根目录的 `pyproject.toml` 或 `requirements*.txt` 如果超限，则每次运行都会停止，指出文件；终端、JSON、SARIF 都以 2 退出，只在标准错误输出中报文件名。Claude Code Stop 钩子使用 `--format hook-json`，一般把包括这种情况在内的引擎错误报告为不阻断的“not analysed”，在标准输出中引用错误，并以 0 退出。\n\n还有一个较窄的例外：从 v0.9.0 起，如果停止原因是钩子 diff 改动的文件，并且该文件的工作区一侧超限，钩子就会阻止停止，要求缩小、拆分或还原文件。若只是基础版本一侧超限、基础版本根清单超限，或在停止前已经把填充后的文件提交，仍只给出消息。完整分类见[检查对象完整性说明](https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/subject-integrity.md)。作者因此建议，在设为必需检查之前，先拿自己的改动试用。\n\n## Action 的信任边界和固定提交\n\n直到 v0.7.0，已发布的 Action 都在 PR 检出的目录中运行 `python -m pip`，随后运行 `checkwash`。这样，PR 中的模块，例如顶层 `pip` 包，可能替换安装器和检查器，使 PR 干预对自身的评判。按项目的威胁模型，这适用于它检查的每个 PR。v0.8.0 修复了这一问题，README 推荐固定 v0.11.0 Action。继续使用 v0.7.0 或更早版本时，只能把通过结果当成参考，合并前审阅 PR，并关闭 `comment-pr`。\n\n开发分支源码可能比已发布 CLI 更新。`release/advertised.toml` 记录安装命令背后的版本、提交和下载字节。新改动需要自己的候选证据，在发布记录核验之前仍未发行；候选 CI 通过，不代表推荐的 Action 提交已经包含该改动。\n\n固定提交的选法从 v0.11.0 起也有变化。此前推荐的是 tag 指向的提交，可用 `git rev-parse 'vX.Y.Z^{commit}'` 查看；从 v0.11.0 的 D-194 起，推荐的是发行版的 Action 提交，即 tag 第二个父提交的父提交，可用 `git rev-parse 'vX.Y.Z^2^1'` 查看，不能直接拿 tag 指向的提交代替。\n\n发行 PR 的最后一笔提交只把 `doctor` 自身的 Action pin 改为那个 Action 提交，所以 tag 与 Action 提交只有这一行差异。Action 只运行 `checkwash check`，不会导入 `doctor`。从 v0.11.0 起，一个发行版的 `doctor` 接受两个 pin：上一版推荐的，以及本版自己的 Action 提交。\n\nREADME 还说明，Dependabot、Renovate 按 `# vX.Y.Z` 注释跟踪更新，会建议使用 tag 提交，而 `doctor` 会拒绝它；zizmor 的 `ref-version-mismatch` 审计也可能报告这条注释。这些判断是根据相关工具文档推导的，没有实际运行。Action 在两种提交上执行的检查相同，本身不受影响。推荐的 v0.11.0 Action 包含 2026 年 11 月 4 日发布的引擎；升级 CLI 不会自动升级已有 Action，仍应先升级 CLI 和本地钩子，再更新 Action pin。\n\n## 安装选项、测量记录和剩余边界\n\n除了固定 PyPI 版本，也可以从 tag 安装：`pipx install git+https://github.com/taipei49314/checkwash@v0.11.0`。随后用 `checkwash check HEAD~1..HEAD` 检查最近提交。`checkwash demo` 或 `python checkwash.pyz demo` 会离线回放八个真实篡改案例和一个正常修复案例，用来说明已知模式，不是覆盖能力保证。\n\n历史六仓库扫描中，1800 项有 46 项被阻断，占 2.56%；其中 31 项是假阳性，占全部样本的 1.72%，15 项是合理的策略阻断，占 0.83%。这些归档产物使用 v0.3.0 引擎，是 2026 年 9 月 7 日对发行提交的扫描；检测器曾用这份语料调优，所以它不是留出的独立评测结果。\n\n语料中有 24/1800，即 1.33%，记录了不透明的生产改动。这个标记不能证明每项判断都受到了影响，也不能证明每份 diff 都没有被分析。人工评审方式也不统一：三位评审者的一致性研究只覆盖更早的 35 份 diff，并非全部 46 项阻断。单独的 22/60 重构结果是带日期的 v0.3.1 快照，属于不同样本群；一般提交的比例不能预测重构结果。\n\n原始材料入口包括[测量说明与源数据](https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/benchmarks/README.md)、[生成结果](https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/benchmarks/RESULTS.md)和失败账本。README 还链接了 [v0.11.0 发布核验记录](https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/releases/v0.11.0-publication-verification.md)、[发行指南](https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/releases/v0.11.0-public-launch.md)、[发行历史](https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/releases/README.md)、断言覆盖、发现格式、贡献、安全报告，以及尚未达到的 1.0 标准。这些是后续查证入口，不代表本轮已经逐份打开或复现实验。\n\n`checkwash-corpus` 和 `smallestlie` 保存相关评测工作。包里还带有针对覆盖率、Ruff 和 mypy 配置审查的有限质量预览；冻结的历史字节比较仍未通过，发布本身不能证明它已在自然案例中获验收，或真正形成有效门禁。\n\n该项目采用 [Apache-2.0](https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/LICENSE)，零运行时依赖，文档列出 22 个检测器与 22461 项测试；后一个数字是测试收集数量，不是本轮执行通过数。\n\n本文完整改写作者原帖及固定版本 README；README 最近修改于 11 月 5 日（中国标准时间），没有用公告时间替换发行日期。README 文字按上游 Apache-2.0 许可使用，[许可全文](https://xnews.qiaomu.ai/source-licenses/checkwash-Apache-2.0.txt)随站点提供；本站中文不是官方文档。", "html": "<p>Nelson Chu 在 11 月 6 日介绍了自己做的 checkwash：一个在本地读取 Git diff、检查测试是否被改弱的开源工具。它不调用大模型，分析时不联网，也不会执行被检查的代码。测试通过并不一定意味着检查仍然有效，例如把 <code>assert total == 105.3</code> 改成 <code>assert total &gt; 0</code>，许多错误的金额也会被放行。checkwash 会标记这类改动，包括编程 Agent 写出的改动，交给人审阅。</p>\n<p>下面的使用方式和限制来自作者仓库的完整 README。文档推荐的 CLI 和 Action 均为 v0.11.0，说明它是公开发行文件已经核验的版本；本轮阅读了文档，没有安装或执行 checkwash，也没有把文档自述当成本站的独立测试结果。</p>\n<h2>接入 Claude Code：停止时检查，部分编辑前询问</h2>\n<p>环境需要 Python 3.11 或更新版本、Git 和 Claude Code。在仓库根目录执行 <code>pipx install checkwash==0.11.0</code>，再执行 <code>checkwash hook install --agent claude-code --local</code>。安装器把钩子写入本机的 <code>.claude/settings.local.json</code>。</p>\n<p>Stop 钩子在 Claude 准备停止时，将工作区与 HEAD 比较。如果发现达到阻断条件的问题，就阻止停止，并把发现交给 Claude。同一配置文件中的 SessionStart 钩子记录每个会话的起点，因此 Stop 钩子也会检查该会话已经提交的改动。</p>\n<p>从 0.11.0 起，本地安装还加入 PreToolUse 询问。当通过 Edit、Write 或 MultiEdit 编辑 Python 测试文件，会使下列五种弱化规则中的某项仍处于 high 严重性时，它会在编辑前询问：<code>ASSERT_WEAKENED</code>、<code>ASSERT_REMOVED</code>、<code>TEST_DISABLED</code>、<code>TOLERANCE_LOOSENED</code>、<code>BROAD_EXCEPT_ADDED</code>。在 <code>claude -p</code> 模式下没有人可以回答，这类编辑会被拒绝。README 同时明确，交互式询问尚未在任何模式下验证。</p>\n<p>0.11.0 默认采用本地安装；<code>--shared</code> 则写入 <code>.claude/settings.json</code>，不加入 PreToolUse 询问。这些都是作者一侧的检查：通过 Bash 做的编辑不会经过这道询问。Stop 钩子无法分析改动时，通常只报告情况、不阻止停止，工作区改动文件超出大小限制是下文说明的例外。它们都不能阻止别人合并 PR；真正的合并门禁需要 CI 中的必需状态检查。钩子的已知限制另见 <a href=\"https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/KNOWN-ISSUES-v0.11.0.md\" target=\"_blank\" rel=\"noopener noreferrer\">0.11.0 已知问题</a>。</p>\n<h2>先在熟悉的改动上试用</h2>\n<p>只使用 CLI，需要 Python 3.11 或更新版本和 Git。作者建议先下载单文件程序，运行离线示例。</p>\n<p>Windows PowerShell，包括 5.1，下载命令是 <code>curl.exe -LO https://github.com/taipei49314/checkwash/releases/download/v0.11.0/checkwash.pyz</code>。随后执行 <code>python checkwash.pyz --version</code> 和 <code>python checkwash.pyz demo</code>。PowerShell 5.1 会把 <code>curl</code> 当成 <code>Invoke-WebRequest</code> 的别名，因此这里特意使用 <code>curl.exe</code>。</p>\n<p>macOS、Linux 或 Git Bash 的下载命令是 <code>curl -LO https://github.com/taipei49314/checkwash/releases/download/v0.11.0/checkwash.pyz</code>，之后运行相同的版本与 demo 命令。也可以<a href=\"https://github.com/taipei49314/checkwash/releases/download/v0.11.0/checkwash.pyz\" target=\"_blank\" rel=\"noopener noreferrer\">用浏览器下载该文件</a>。</p>\n<p>进入至少有两次提交的仓库根目录，执行 <code>python checkwash.pyz check HEAD~1..HEAD</code>，检查最近一次提交。未提交的改动使用 <code>python checkwash.pyz check</code>。评审分支时，<code>python checkwash.pyz check BASE...HEAD</code> 从共同祖先开始比较，<code>BASE..HEAD</code> 则直接比较两个指定快照。</p>\n<p>从 v0.8.0 起，在子目录运行 <code>check</code> 也会从 Git 根目录分析整个仓库，并在标准错误输出中说明。更早版本需要在仓库根目录运行。JSON、SARIF 输出和更多用法，见<a href=\"https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/embedding.md\" target=\"_blank\" rel=\"noopener noreferrer\">嵌入指南</a>与<a href=\"https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/stability.md\" target=\"_blank\" rel=\"noopener noreferrer\">稳定性契约</a>。</p>\n<h2>CI 必须设成必需检查，才会阻止合并</h2>\n<p>只安装工具或添加工作流，不会强制执行检查结论。需要把 <code>checkwash</code> 状态上下文设为仓库分支规则中的必需检查，并保持这个任务无条件运行。</p>\n<p>README 给出的 <code>.github/workflows/checkwash.yml</code> 在 <code>pull_request</code> 时运行，权限仅为 <code>contents: read</code>，任务名为 <code>checkwash</code>，执行环境为 <code>ubuntu-latest</code>。它固定了三个 Action 的提交：</p>\n<ul>\n<li><code>actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1</code>，标注 v7.0.1，设置 <code>fetch-depth: 0</code> 和 <code>persist-credentials: false</code>。</li>\n<li><code>actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97</code>，标注 v7.0.0，Python 版本为 <code>3.12</code>。</li>\n<li><code>taipei49314/checkwash/action@257150319fca15235185fc629d8b9c21c17166ca</code>，标注 v0.11.0。</li>\n</ul>\n<p>工作流运行后，在 GitHub 的 Settings → Rules → Rulesets 中要求 <code>checkwash</code> 状态检查。完整 YAML 保留在本页原文中，也可以直接打开<a href=\"https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/README.md\" target=\"_blank\" rel=\"noopener noreferrer\">固定版本 README</a>。</p>\n<p>如果是仓库管理员，且已取得项目提供的规则文件，还可以运行 <code>gh api repos/OWNER/REPO/rulesets --method POST --input action/required-ruleset.json</code> 添加规则集。这是新增规则，不会替换既有规则。<code>checkwash doctor</code> 可以检查本地工作流，但不能验证线上分支保护是否生效。</p>\n<p>版本顺序也有要求。<code>doctor</code> 0.11.0 接受上面推荐的提交和 v0.10.0 的提交；0.10.0 的 <code>doctor</code> 只接受它内置的 v0.9.0 Action 提交，会把上面的 SHA 报成不支持，显示“workflow analysis incomplete”并以 1 退出。因此应先升级 CLI 和本地钩子，再升级 Action 固定提交。</p>\n<h2>怎样理解一次阻断</h2>\n<p>退出码 0 表示在当前配置下没有需要阻断的发现，正常测试和评审仍要继续；退出码 1 表示需要阅读发现与 diff，可能是验证被削弱，也可能是误报；退出码 2 表示输入或分析出错，必须先解决错误，才能依赖结果。默认阻断阈值是 high，所以报告中看得见的 warn 仍然可能通过。</p>\n<p>每条发现会给出规则、严重性、文件和测试名。例如，前面的金额断言若是 <code>tests/test_billing.py</code> 中 <code>test_invoice_total</code> 的全部 diff，报告会显示 <code>ASSERT_WEAKENED</code>、<code>HIGH</code>，断言强度从 <code>EXACT_VALUE(90)</code> 变成 <code>BOUND(40)</code>，原因是 <code>NO_PROD_CHANGE_IN_DIFF</code>，且没有应用降级条件，并列出修改前后的断言。</p>\n<p>这里的 90 是断言强度等级，不是测试期待的数值。<code>why high</code> 解释严重性为什么升高：这份 diff 没改生产文件，也就没有生产代码变化可以解释为什么要弱化测试。需要机器可读输出时，可用 <code>checkwash check --format json</code>。</p>\n<p>如果测试被误改弱，应恢复测试；恢复后失败，就修代码。确有理由放宽测试时，报告会给出包含该发现指纹的 <code>checkwash allow</code> 命令，以及需要提交的豁免账本文件。命令格式为 <code>checkwash allow &quot;&lt;the fingerprint from the report&gt;&quot; --reason &quot;why the weaker test is correct&quot;</code>。</p>\n<p>配置和豁免从 diff 的基础版本读取，因此一个改动不能给自己豁免。豁免条目要先经过评审、进入基础版本，才对下一份 diff 生效。自 v0.10.0 起，新生效的 <code>.checkwash</code> 配置或豁免还会与 BASE 侧原有的 <code>.greenwash</code> 对照，避免一次迁移同时批准自己的放宽。每项豁免必须给出理由，默认 90 天过期，最长 180 天；作者建议对 <code>.checkwash/</code> 和 <code>.greenwash/</code> 设置代码所有者。</p>\n<p>从 0.11.0 起，Stop 钩子会告诉 Claude 不要自行添加豁免，而应向人说明是哪项发现阻断、为什么阻断；PreToolUse 询问也只应在弱化确有必要时批准。具体规则见<a href=\"https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/enterprise.md\" target=\"_blank\" rel=\"noopener noreferrer\">企业配置说明</a>。</p>\n<p>遇到合理改动被阻断，作者要求先查<a href=\"https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/benchmarks/FAILURES.md\" target=\"_blank\" rel=\"noopener noreferrer\">失败账本</a>，再使用“checkwash blocked honest work”模板报告 Issue，附上 diff 和 <code>checkwash check --format json</code> 输出。报告会变成回归样例，账本会署名感谢报告者。</p>\n<h2>Alpha 阶段仍会漏检，也会误报</h2>\n<p>checkwash 仍是 Alpha。一次通过不能证明改动正确，也不能证明改动诚实。Python 是主要支持语言，JS/TS 只覆盖有限的测试模式。</p>\n<p>一个没有实际效果的改动，例如在测试调用的函数里加 <code>+ 0</code>，或只改一行模板、<code>AUTHORS</code>，仍可能让被弱化的 Python 或 JS/TS 测试停留在 warn，从而通过默认阈值。#419 虽已关闭，处理方式是记录残留风险，并未修复。<code>REPAIR_EVIDENCE</code> 只表示同一 diff 内存在相关改动，不证明修复正确；无实效的编辑也可能获得这个标记。</p>\n<p>要阻断这类改动，可以把 Action 的 <code>fail-on</code> 设为 <code>warn</code>。此时 <code>checkwash doctor</code> 会报告“workflow analysis incomplete”并以 1 退出，这是文档说明的预期行为，因为它只证明没有 <code>with:</code> 配置的 checkwash 步骤。另一种方式是自己添加 CLI 步骤，执行 <code>checkwash check --task</code>，配合基础版本中的 <code>oracle_freeze</code> 契约；Action 本身没有 task 输入。这两条路线都会额外阻断一些合理改动。</p>\n<p>对于本地安装，0.11.0 的 PreToolUse 钩子在那五项弱化规则处于 high 时，会在 Python 测试文件的 Edit、Write、MultiEdit 前询问，不受工作区其他修复证据影响。它自身的边界仍应按已知问题文档理解。</p>\n<p>JS/TS 的参数表支持也分版本。v0.8.0 不扫描 <code>test.each</code>、<code>it.each</code> 和 <code>test.for</code> 的表格，表内断言弱化或删除、修改一行数据、删除整张表，都可能通过。v0.9.0 开始把每张这样的表视为一个测试单元，并在能够计数时读取数据行：包括内联数组、标签模板，或同文件中只作为表使用的 <code>const</code>。<code>describe.each</code> 的数据行仍不读取，标题由计算产生的表也不会被视为测试单元，见 #428。</p>\n<p>合理重构可能被误报。冻结的历史重构样本中，60 项有 22 项被阻断，占 36.7%。另一次独立的预发行源码回放中，60 项有 4 项被阻断；其中 57 项严格符合限定的案例里，有 2 项被阻断，仍有三个既有样例错误。这些都是经过挑选的样本，不能当成一般误报率。v0.10.0 账本在 D-185 处置后保留了 6/60 的静态源码阻断，其中包括另外两项已知的合理重构误报；这是后来对源码的重新核查，没有改写历史运行结果。</p>\n<h2>文件过大时，哪些情况会停止分析</h2>\n<p>变更文件超过 1,000,000 字节就不会被完整读取。图片、数据、锁文件、文档，以及非 Python 的生产源码超出该限制时，会在标准错误输出中报告，也不会获得修复证据。</p>\n<p>从 v0.9.0 起，这类未读文件还会出现在 JSON 的 <code>unread</code> 中；SARIF 使用工具执行通知报告；终端报告增加 <code>!</code> 行，没有其他发现时以“analysis incomplete”开头。Stop 钩子的 JSON 和 <code>--emit-ir</code> 不会列出这些文件名。</p>\n<p>如果超限的是检测器必须读取的文件，就以退出码 2 停止，并指出文件。这包括测试、conftest、CI、护栏、快照、JS 设置、运行脚本、测试命令文件，以及分析所需的其他上下文。超限的 <code>.py</code> 模块不论新增、删除、重命名或编辑，也会停止分析；任意层级的 pytest 配置同样如此，包括 <code>pytest.ini</code>、<code>.pytest.ini</code>、<code>pytest.toml</code>、<code>.pytest.toml</code>、<code>tox.ini</code>、<code>setup.cfg</code> 和 <code>pyproject.toml</code>，因为它们可能改变测试导入模块时解析到的对象。根目录 <code>scripts/</code> 中为分析 pytest 命令而读取的非生成文件，也受同样约束。</p>\n<p>Shell shebang 会让文件被视为运行脚本，不受文件名影响；<code>.py</code> 模块和 JS/TS 测试文件则有自己的规则。v0.9.0 起，程序读取超限一侧的前 200 字节，只用于识别文件类型；Git 中的那一侧会以流式读取，并核对对象 ID。如果这些字节显示 shell shebang，就会指出具体哪一侧并停止。没有扩展名的文件——包括 <code>.envrc</code> 这样的点文件——若没有 shebang，例如 <code>README</code> 或 <code>LICENSE</code>，通常按文档搁置，除非被其他规则判定为必读文件。</p>\n<p>v0.8.0 不读取超限文件的任何字节，所以那时所有超限、无扩展名文件都会停止分析。v0.9.0 不会流式读取 Git 中超过 64,000,000 字节的一侧；若无扩展名文件有这样大的一侧，仍会停止。带扩展名的文件如果 shebang 只存在于这一超大侧，则仍会被搁置。</p>\n<p>超限文件导致停止时，v0.9.0 起 JSON 会在标准输出中给出 <code>{&quot;unread&quot;: [...]}</code>，只列拒绝读取的那一侧，而不是完整的 findings 文档；终端和 SARIF 输出仍为空。使用比较范围时，若被拒读的是符号链接指向的 pytest 配置目标，且没有检测器必须读取该目标，JSON 输出也仍为空。</p>\n<p><code>build/</code>、<code>dist/</code>、<code>node_modules/</code> 等生成产物通常按生产源码搁置，但 Python 模块、pytest 配置、CI 文件、运行脚本，以及 shebang 未知的无扩展名文件仍是例外。基础版本根目录中超限的 <code>poetry.lock</code> 或 <code>uv.lock</code> 会被跳过，并在标准错误输出提示；这次跳过不进入 <code>unread</code>。如果 diff 本身也改了该锁文件，超限的变化侧仍按一般规则列出。</p>\n<p>基础版本根目录的 <code>pyproject.toml</code> 或 <code>requirements*.txt</code> 如果超限，则每次运行都会停止，指出文件；终端、JSON、SARIF 都以 2 退出，只在标准错误输出中报文件名。Claude Code Stop 钩子使用 <code>--format hook-json</code>，一般把包括这种情况在内的引擎错误报告为不阻断的“not analysed”，在标准输出中引用错误，并以 0 退出。</p>\n<p>还有一个较窄的例外：从 v0.9.0 起，如果停止原因是钩子 diff 改动的文件，并且该文件的工作区一侧超限，钩子就会阻止停止，要求缩小、拆分或还原文件。若只是基础版本一侧超限、基础版本根清单超限，或在停止前已经把填充后的文件提交，仍只给出消息。完整分类见<a href=\"https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/subject-integrity.md\" target=\"_blank\" rel=\"noopener noreferrer\">检查对象完整性说明</a>。作者因此建议，在设为必需检查之前，先拿自己的改动试用。</p>\n<h2>Action 的信任边界和固定提交</h2>\n<p>直到 v0.7.0，已发布的 Action 都在 PR 检出的目录中运行 <code>python -m pip</code>，随后运行 <code>checkwash</code>。这样，PR 中的模块，例如顶层 <code>pip</code> 包，可能替换安装器和检查器，使 PR 干预对自身的评判。按项目的威胁模型，这适用于它检查的每个 PR。v0.8.0 修复了这一问题，README 推荐固定 v0.11.0 Action。继续使用 v0.7.0 或更早版本时，只能把通过结果当成参考，合并前审阅 PR，并关闭 <code>comment-pr</code>。</p>\n<p>开发分支源码可能比已发布 CLI 更新。<code>release/advertised.toml</code> 记录安装命令背后的版本、提交和下载字节。新改动需要自己的候选证据，在发布记录核验之前仍未发行；候选 CI 通过，不代表推荐的 Action 提交已经包含该改动。</p>\n<p>固定提交的选法从 v0.11.0 起也有变化。此前推荐的是 tag 指向的提交，可用 <code>git rev-parse &#x27;vX.Y.Z^{commit}&#x27;</code> 查看；从 v0.11.0 的 D-194 起，推荐的是发行版的 Action 提交，即 tag 第二个父提交的父提交，可用 <code>git rev-parse &#x27;vX.Y.Z^2^1&#x27;</code> 查看，不能直接拿 tag 指向的提交代替。</p>\n<p>发行 PR 的最后一笔提交只把 <code>doctor</code> 自身的 Action pin 改为那个 Action 提交，所以 tag 与 Action 提交只有这一行差异。Action 只运行 <code>checkwash check</code>，不会导入 <code>doctor</code>。从 v0.11.0 起，一个发行版的 <code>doctor</code> 接受两个 pin：上一版推荐的，以及本版自己的 Action 提交。</p>\n<p>README 还说明，Dependabot、Renovate 按 <code># vX.Y.Z</code> 注释跟踪更新，会建议使用 tag 提交，而 <code>doctor</code> 会拒绝它；zizmor 的 <code>ref-version-mismatch</code> 审计也可能报告这条注释。这些判断是根据相关工具文档推导的，没有实际运行。Action 在两种提交上执行的检查相同，本身不受影响。推荐的 v0.11.0 Action 包含 2026 年 11 月 4 日发布的引擎；升级 CLI 不会自动升级已有 Action，仍应先升级 CLI 和本地钩子，再更新 Action pin。</p>\n<h2>安装选项、测量记录和剩余边界</h2>\n<p>除了固定 PyPI 版本，也可以从 tag 安装：<code>pipx install git+https://github.com/taipei49314/checkwash@v0.11.0</code>。随后用 <code>checkwash check HEAD~1..HEAD</code> 检查最近提交。<code>checkwash demo</code> 或 <code>python checkwash.pyz demo</code> 会离线回放八个真实篡改案例和一个正常修复案例，用来说明已知模式，不是覆盖能力保证。</p>\n<p>历史六仓库扫描中，1800 项有 46 项被阻断，占 2.56%；其中 31 项是假阳性，占全部样本的 1.72%，15 项是合理的策略阻断，占 0.83%。这些归档产物使用 v0.3.0 引擎，是 2026 年 9 月 7 日对发行提交的扫描；检测器曾用这份语料调优，所以它不是留出的独立评测结果。</p>\n<p>语料中有 24/1800，即 1.33%，记录了不透明的生产改动。这个标记不能证明每项判断都受到了影响，也不能证明每份 diff 都没有被分析。人工评审方式也不统一：三位评审者的一致性研究只覆盖更早的 35 份 diff，并非全部 46 项阻断。单独的 22/60 重构结果是带日期的 v0.3.1 快照，属于不同样本群；一般提交的比例不能预测重构结果。</p>\n<p>原始材料入口包括<a href=\"https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/benchmarks/README.md\" target=\"_blank\" rel=\"noopener noreferrer\">测量说明与源数据</a>、<a href=\"https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/benchmarks/RESULTS.md\" target=\"_blank\" rel=\"noopener noreferrer\">生成结果</a>和失败账本。README 还链接了 <a href=\"https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/releases/v0.11.0-publication-verification.md\" target=\"_blank\" rel=\"noopener noreferrer\">v0.11.0 发布核验记录</a>、<a href=\"https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/releases/v0.11.0-public-launch.md\" target=\"_blank\" rel=\"noopener noreferrer\">发行指南</a>、<a href=\"https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/docs/releases/README.md\" target=\"_blank\" rel=\"noopener noreferrer\">发行历史</a>、断言覆盖、发现格式、贡献、安全报告，以及尚未达到的 1.0 标准。这些是后续查证入口，不代表本轮已经逐份打开或复现实验。</p>\n<p><code>checkwash-corpus</code> 和 <code>smallestlie</code> 保存相关评测工作。包里还带有针对覆盖率、Ruff 和 mypy 配置审查的有限质量预览；冻结的历史字节比较仍未通过，发布本身不能证明它已在自然案例中获验收，或真正形成有效门禁。</p>\n<p>该项目采用 <a href=\"https://github.com/taipei49314/checkwash/blob/0ebd5ad890c252b4546dbd692ac0414fdbc201cc/LICENSE\" target=\"_blank\" rel=\"noopener noreferrer\">Apache-2.0</a>，零运行时依赖，文档列出 22 个检测器与 22461 项测试；后一个数字是测试收集数量，不是本轮执行通过数。</p>\n<p>本文完整改写作者原帖及固定版本 README；README 最近修改于 11 月 5 日（中国标准时间），没有用公告时间替换发行日期。README 文字按上游 Apache-2.0 许可使用，<a href=\"https://xnews.qiaomu.ai/source-licenses/checkwash-Apache-2.0.txt\" target=\"_blank\" rel=\"noopener noreferrer\">许可全文</a>随站点提供；本站中文不是官方文档。</p>\n"}}]]></qiaomu:versions>
    </item>
    <item>
      <title>Cursor：用 Agent 构建线上 App，并通过链接分享</title>
      <link>https://xnews.qiaomu.ai/a/cursor-live-apps</link>
      <guid isPermaLink="true">https://xnews.qiaomu.ai/a/cursor-live-apps</guid>
      <pubDate>Thu, 05 Nov 2026 21:41:10 +0000</pubDate>
      <author>Cursor</author>
      <description><![CDATA[<p><em>描述需要的工具后，Cursor 会构建应用、设置数据库、运行安全检查并部署。</em></p>
<h2>乔木改写</h2>
<p>Cursor 宣布，现在可以在 Cursor 中构建可运行的线上 App，并通过链接分享。</p>
<p>它在介绍中指出，Agent 已经让写代码更容易，但大多数应用仍停留在 localhost。用户描述自己需要的工具后，Cursor 会构建应用、设置数据库、运行确定性的安全检查和 Agent 安全检查，再完成部署。</p>
<section class="rewrite-source-media" aria-label="原文附带媒体"><h3 class="source-media-heading">原文附带媒体</h3><p class="completeness-note">原文附带媒体；未核验其与具体段落的对应关系。</p><figure data-media-id="m_b4c32a4814c74f4b"><video controls playsinline preload="none" src="https://video.twimg.com/amplify_video/2118458611320131584/vid/avc1/1280x720/96e72bPmXLUWS7C5.mp4?tag=16" poster="https://pbs.twimg.com/amplify_video_thumb/2118458611320131584/img/uUJSIBl8QaDBnoAA.jpg"></video><figcaption><a href="https://video.twimg.com/amplify_video/2118458611320131584/vid/avc1/1280x720/96e72bPmXLUWS7C5.mp4?tag=16">打开原始媒体 ↗</a></figcaption></figure></section>
<h2>原文</h2>
<p><em>You can now build live apps in Cursor and share them with a link</em></p>
<figure data-media-id="m_b4c32a4814c74f4b"><video controls playsinline preload="none" src="https://video.twimg.com/amplify_video/2118458611320131584/vid/avc1/1280x720/96e72bPmXLUWS7C5.mp4?tag=16" poster="https://pbs.twimg.com/amplify_video_thumb/2118458611320131584/img/uUJSIBl8QaDBnoAA.jpg"></video><figcaption><a href="https://video.twimg.com/amplify_video/2118458611320131584/vid/avc1/1280x720/96e72bPmXLUWS7C5.mp4?tag=16">打开原始媒体 ↗</a></figcaption></figure>
<p>You can now build live apps in Cursor and share them with a link.</p>
<p>Agents have made it easier to write code, but most apps never make it off localhost. Describe the tool you want - Cursor will build it, set up a database, run deterministic and agentic security checks, and deploy.</p>
<p><strong>原文链接：</strong><a href="https://x.com/cursor_ai/status/2118458629091426304">https://x.com/cursor_ai/status/2118458629091426304</a></p>
<p><strong>相关链接：</strong><a href="https://cursor.com/docs/cloud-agent/apps">https://cursor.com/docs/cloud-agent/apps</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>描述需要的工具后，Cursor 会构建应用、设置数据库、运行安全检查并部署。</em></p>
<h2>乔木改写</h2>
<p>Cursor 宣布，现在可以在 Cursor 中构建可运行的线上 App，并通过链接分享。</p>
<p>它在介绍中指出，Agent 已经让写代码更容易，但大多数应用仍停留在 localhost。用户描述自己需要的工具后，Cursor 会构建应用、设置数据库、运行确定性的安全检查和 Agent 安全检查，再完成部署。</p>
<section class="rewrite-source-media" aria-label="原文附带媒体"><h3 class="source-media-heading">原文附带媒体</h3><p class="completeness-note">原文附带媒体；未核验其与具体段落的对应关系。</p><figure data-media-id="m_b4c32a4814c74f4b"><video controls playsinline preload="none" src="https://video.twimg.com/amplify_video/2118458611320131584/vid/avc1/1280x720/96e72bPmXLUWS7C5.mp4?tag=16" poster="https://pbs.twimg.com/amplify_video_thumb/2118458611320131584/img/uUJSIBl8QaDBnoAA.jpg"></video><figcaption><a href="https://video.twimg.com/amplify_video/2118458611320131584/vid/avc1/1280x720/96e72bPmXLUWS7C5.mp4?tag=16">打开原始媒体 ↗</a></figcaption></figure></section>
<h2>原文</h2>
<p><em>You can now build live apps in Cursor and share them with a link</em></p>
<figure data-media-id="m_b4c32a4814c74f4b"><video controls playsinline preload="none" src="https://video.twimg.com/amplify_video/2118458611320131584/vid/avc1/1280x720/96e72bPmXLUWS7C5.mp4?tag=16" poster="https://pbs.twimg.com/amplify_video_thumb/2118458611320131584/img/uUJSIBl8QaDBnoAA.jpg"></video><figcaption><a href="https://video.twimg.com/amplify_video/2118458611320131584/vid/avc1/1280x720/96e72bPmXLUWS7C5.mp4?tag=16">打开原始媒体 ↗</a></figcaption></figure>
<p>You can now build live apps in Cursor and share them with a link.</p>
<p>Agents have made it easier to write code, but most apps never make it off localhost. Describe the tool you want - Cursor will build it, set up a database, run deterministic and agentic security checks, and deploy.</p>
<p><strong>原文链接：</strong><a href="https://x.com/cursor_ai/status/2118458629091426304">https://x.com/cursor_ai/status/2118458629091426304</a></p>
<p><strong>相关链接：</strong><a href="https://cursor.com/docs/cloud-agent/apps">https://cursor.com/docs/cloud-agent/apps</a></p>]]></content:encoded>
      <qiaomu:versions><![CDATA[{"version": 1, "original": {"title": "You can now build live apps in Cursor and share them with a link", "url": "https://x.com/cursor_ai/status/2118458629091426304", "lang": "en", "html": "<h2>You can now build live apps in Cursor and share them with a link</h2>\n<figure data-media-id=\"m_b4c32a4814c74f4b\"><video controls playsinline preload=\"none\" src=\"https://video.twimg.com/amplify_video/2118458611320131584/vid/avc1/1280x720/96e72bPmXLUWS7C5.mp4?tag=16\" poster=\"https://pbs.twimg.com/amplify_video_thumb/2118458611320131584/img/uUJSIBl8QaDBnoAA.jpg\"></video><figcaption><a href=\"https://video.twimg.com/amplify_video/2118458611320131584/vid/avc1/1280x720/96e72bPmXLUWS7C5.mp4?tag=16\">打开原始媒体 ↗</a></figcaption></figure>\n<p>You can now build live apps in Cursor and share them with a link.</p>\n<p>Agents have made it easier to write code, but most apps never make it off localhost. Describe the tool you want - Cursor will build it, set up a database, run deterministic and agentic security checks, and deploy.</p>\n<p>原文链接：<a href=\"https://x.com/cursor_ai/status/2118458629091426304\">https://x.com/cursor_ai/status/2118458629091426304</a></p>\n<p>相关链接：<a href=\"https://cursor.com/docs/cloud-agent/apps\">https://cursor.com/docs/cloud-agent/apps</a></p>"}, "rewrite": {"title": "Cursor：用 Agent 构建线上 App，并通过链接分享", "markdown": "Cursor 宣布，现在可以在 Cursor 中构建可运行的线上 App，并通过链接分享。\n\n它在介绍中指出，Agent 已经让写代码更容易，但大多数应用仍停留在 localhost。用户描述自己需要的工具后，Cursor 会构建应用、设置数据库、运行确定性的安全检查和 Agent 安全检查，再完成部署。\n\n\n### 原文附带媒体\n\n原文附带媒体；未核验其与具体段落的对应关系。\n\n[观看原视频](<https://video.twimg.com/amplify_video/2118458611320131584/vid/avc1/1280x720/96e72bPmXLUWS7C5.mp4?tag=16>)", "html": "<p>Cursor 宣布，现在可以在 Cursor 中构建可运行的线上 App，并通过链接分享。</p>\n<p>它在介绍中指出，Agent 已经让写代码更容易，但大多数应用仍停留在 localhost。用户描述自己需要的工具后，Cursor 会构建应用、设置数据库、运行确定性的安全检查和 Agent 安全检查，再完成部署。</p>\n<section class=\"rewrite-source-media\" aria-label=\"原文附带媒体\"><h3 class=\"source-media-heading\">原文附带媒体</h3><p class=\"completeness-note\">原文附带媒体；未核验其与具体段落的对应关系。</p><figure data-media-id=\"m_b4c32a4814c74f4b\"><video controls playsinline preload=\"none\" src=\"https://video.twimg.com/amplify_video/2118458611320131584/vid/avc1/1280x720/96e72bPmXLUWS7C5.mp4?tag=16\" poster=\"https://pbs.twimg.com/amplify_video_thumb/2118458611320131584/img/uUJSIBl8QaDBnoAA.jpg\"></video><figcaption><a href=\"https://video.twimg.com/amplify_video/2118458611320131584/vid/avc1/1280x720/96e72bPmXLUWS7C5.mp4?tag=16\">打开原始媒体 ↗</a></figcaption></figure></section>"}}]]></qiaomu:versions>
    </item>
    <item>
      <title>Rauch 谈 Agent 持续任务：Vercel Schedules 可在运行时定义</title>
      <link>https://xnews.qiaomu.ai/a/rauchg-agent-schedules</link>
      <guid isPermaLink="true">https://xnews.qiaomu.ai/a/rauchg-agent-schedules</guid>
      <pubDate>Thu, 05 Nov 2026 20:30:27 +0000</pubDate>
      <author>Guillermo Rauch</author>
      <description><![CDATA[<p><em>Muse 和 Instinct 会夜间整理记忆、早上提醒，并在一段时间没互动后主动发消息。</em></p>
<h2>乔木改写</h2>
<p>Guillermo Rauch 认为，持续替用户处理事情，是 Agent 的杀手级应用。</p>
<p>他举了 Muse 和 Instinct 的例子：它们会在夜间整理记忆，早上提醒用户，并在距离上一次互动过了 N 天后发来消息。</p>
<p>谈到配套基础设施，Rauch 将 Vercel Schedules 形容为加强版 Cron。按他的介绍，任务可以在运行时定义，能够无限扩展，而且调度系统位于 Sandbox 之外，因此可以按需调用计算资源，以更低的成本运行。</p>

<h2>原文</h2>
<p><em>Doing stuff for you over time is the killer app of agents</em></p>
<p>“Doing stuff for you over time” is the killer app of agents.</p>
<p>Muse and Instinct consolidate memories at night, remind you of stuff in the morning, message you after N days passed since your last interaction…</p>
<p>Vercel Schedules are like Cron on steroids. They can be defined at runtime, scale infinitely, and sit outside of the Sandbox, which means you can cost-efficiently invoke compute as needed.</p>
<p><strong>原文链接：</strong><a href="https://x.com/rauchg/status/2118440831355068671">https://x.com/rauchg/status/2118440831355068671</a></p>
<p><strong>相关链接：</strong><a href="https://vercel.com/blog/introducing-vercel-schedules">https://vercel.com/blog/introducing-vercel-schedules</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Muse 和 Instinct 会夜间整理记忆、早上提醒，并在一段时间没互动后主动发消息。</em></p>
<h2>乔木改写</h2>
<p>Guillermo Rauch 认为，持续替用户处理事情，是 Agent 的杀手级应用。</p>
<p>他举了 Muse 和 Instinct 的例子：它们会在夜间整理记忆，早上提醒用户，并在距离上一次互动过了 N 天后发来消息。</p>
<p>谈到配套基础设施，Rauch 将 Vercel Schedules 形容为加强版 Cron。按他的介绍，任务可以在运行时定义，能够无限扩展，而且调度系统位于 Sandbox 之外，因此可以按需调用计算资源，以更低的成本运行。</p>

<h2>原文</h2>
<p><em>Doing stuff for you over time is the killer app of agents</em></p>
<p>“Doing stuff for you over time” is the killer app of agents.</p>
<p>Muse and Instinct consolidate memories at night, remind you of stuff in the morning, message you after N days passed since your last interaction…</p>
<p>Vercel Schedules are like Cron on steroids. They can be defined at runtime, scale infinitely, and sit outside of the Sandbox, which means you can cost-efficiently invoke compute as needed.</p>
<p><strong>原文链接：</strong><a href="https://x.com/rauchg/status/2118440831355068671">https://x.com/rauchg/status/2118440831355068671</a></p>
<p><strong>相关链接：</strong><a href="https://vercel.com/blog/introducing-vercel-schedules">https://vercel.com/blog/introducing-vercel-schedules</a></p>]]></content:encoded>
      <qiaomu:versions><![CDATA[{"version": 1, "original": {"title": "Doing stuff for you over time is the killer app of agents", "url": "https://x.com/rauchg/status/2118440831355068671", "lang": "en", "html": "<h2>Doing stuff for you over time is the killer app of agents</h2>\n\n<p>“Doing stuff for you over time” is the killer app of agents.</p>\n<p>Muse and Instinct consolidate memories at night, remind you of stuff in the morning, message you after N days passed since your last interaction…</p>\n<p>Vercel Schedules are like Cron on steroids. They can be defined at runtime, scale infinitely, and sit outside of the Sandbox, which means you can cost-efficiently invoke compute as needed.</p>\n<p>原文链接：<a href=\"https://x.com/rauchg/status/2118440831355068671\">https://x.com/rauchg/status/2118440831355068671</a></p>\n<p>相关链接：<a href=\"https://vercel.com/blog/introducing-vercel-schedules\">https://vercel.com/blog/introducing-vercel-schedules</a></p>"}, "rewrite": {"title": "Rauch 谈 Agent 持续任务：Vercel Schedules 可在运行时定义", "markdown": "Guillermo Rauch 认为，持续替用户处理事情，是 Agent 的杀手级应用。\n\n他举了 Muse 和 Instinct 的例子：它们会在夜间整理记忆，早上提醒用户，并在距离上一次互动过了 N 天后发来消息。\n\n谈到配套基础设施，Rauch 将 Vercel Schedules 形容为加强版 Cron。按他的介绍，任务可以在运行时定义，能够无限扩展，而且调度系统位于 Sandbox 之外，因此可以按需调用计算资源，以更低的成本运行。\n", "html": "<p>Guillermo Rauch 认为，持续替用户处理事情，是 Agent 的杀手级应用。</p>\n<p>他举了 Muse 和 Instinct 的例子：它们会在夜间整理记忆，早上提醒用户，并在距离上一次互动过了 N 天后发来消息。</p>\n<p>谈到配套基础设施，Rauch 将 Vercel Schedules 形容为加强版 Cron。按他的介绍，任务可以在运行时定义，能够无限扩展，而且调度系统位于 Sandbox 之外，因此可以按需调用计算资源，以更低的成本运行。</p>\n"}}]]></qiaomu:versions>
    </item>
    <item>
      <title>OpenAI 发布 GPT-6 Cyber，先向部分 Daybreak Red 客户开放</title>
      <link>https://xnews.qiaomu.ai/a/openai-gpt6-cyber</link>
      <guid isPermaLink="true">https://xnews.qiaomu.ai/a/openai-gpt6-cyber</guid>
      <pubDate>Thu, 05 Nov 2026 17:09:13 +0000</pubDate>
      <author>OpenAI</author>
      <description><![CDATA[<p><em>OpenAI 称，Mozilla、Palo Alto Networks、Calif 和 Cisco 等公司的安全团队已在使用该模型。</em></p>
<h2>乔木改写</h2>
<p>OpenAI 发布 GPT-6 Cyber，称其在增强安全研究能力的同时，也改进了模型对齐。</p>
<p>按 OpenAI 的介绍，该模型用于其前一天公布的 Linux 内核研究。Mozilla、Palo Alto Networks、Calif、Cisco 等公司的安全团队，以及 OpenAI 自己的安全团队，已经在使用它。</p>
<p>目前，GPT-6 Cyber 向部分 Daybreak Red 客户开放，访问范围将逐步扩大。完整公告见 <a href="https://openai.com/index/introducing-gpt-6-cyber/" target="_blank" rel="noopener noreferrer">OpenAI 原文</a>。</p>
<section class="rewrite-source-media" aria-label="原文附带媒体"><h3 class="source-media-heading">原文附带媒体</h3><p class="completeness-note">原文附带媒体；未核验其与具体段落的对应关系。</p><figure data-media-id="m_70d1b131abc89dc7"><video controls playsinline preload="none" src="https://video.twimg.com/amplify_video/2118387217588465664/vid/avc1/1920x1080/ggeDE9iY9Trxb8kO.mp4" poster="https://pbs.twimg.com/amplify_video_thumb/2118387217588465664/img/N2grMUmP0O_EMvS2.jpg"></video><figcaption><a href="https://video.twimg.com/amplify_video/2118387217588465664/vid/avc1/1920x1080/ggeDE9iY9Trxb8kO.mp4">打开原始媒体 ↗</a></figcaption></figure></section>
<h2>原文</h2>
<p><em>Introducing GPT-6 Cyber</em></p>
<figure data-media-id="m_70d1b131abc89dc7"><video controls playsinline preload="none" src="https://video.twimg.com/amplify_video/2118387217588465664/vid/avc1/1920x1080/ggeDE9iY9Trxb8kO.mp4" poster="https://pbs.twimg.com/amplify_video_thumb/2118387217588465664/img/N2grMUmP0O_EMvS2.jpg"></video><figcaption><a href="https://video.twimg.com/amplify_video/2118387217588465664/vid/avc1/1920x1080/ggeDE9iY9Trxb8kO.mp4">打开原始媒体 ↗</a></figcaption></figure>
<p>Introducing GPT‑6 Cyber: a major advance in security research that pairs stronger capabilities with better model alignment.</p>
<p>The model powered the Linux kernel research we announced yesterday, and security teams at companies like Mozilla, Palo Alto Networks, Calif, and Cisco—alongside our own at OpenAI—are already putting it to work.</p>
<p>GPT-6 Cyber is available to select Daybreak Red customers and we are expanding access over time.</p>
<p>https://openai.com/index/introducing-gpt-6-cyber/</p>
<p><strong>原文链接：</strong><a href="https://x.com/OpenAI/status/2118390190246879554">https://x.com/OpenAI/status/2118390190246879554</a></p>
<p><strong>相关链接：</strong><a href="https://openai.com/index/introducing-gpt-6-cyber/">https://openai.com/index/introducing-gpt-6-cyber/</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>OpenAI 称，Mozilla、Palo Alto Networks、Calif 和 Cisco 等公司的安全团队已在使用该模型。</em></p>
<h2>乔木改写</h2>
<p>OpenAI 发布 GPT-6 Cyber，称其在增强安全研究能力的同时，也改进了模型对齐。</p>
<p>按 OpenAI 的介绍，该模型用于其前一天公布的 Linux 内核研究。Mozilla、Palo Alto Networks、Calif、Cisco 等公司的安全团队，以及 OpenAI 自己的安全团队，已经在使用它。</p>
<p>目前，GPT-6 Cyber 向部分 Daybreak Red 客户开放，访问范围将逐步扩大。完整公告见 <a href="https://openai.com/index/introducing-gpt-6-cyber/" target="_blank" rel="noopener noreferrer">OpenAI 原文</a>。</p>
<section class="rewrite-source-media" aria-label="原文附带媒体"><h3 class="source-media-heading">原文附带媒体</h3><p class="completeness-note">原文附带媒体；未核验其与具体段落的对应关系。</p><figure data-media-id="m_70d1b131abc89dc7"><video controls playsinline preload="none" src="https://video.twimg.com/amplify_video/2118387217588465664/vid/avc1/1920x1080/ggeDE9iY9Trxb8kO.mp4" poster="https://pbs.twimg.com/amplify_video_thumb/2118387217588465664/img/N2grMUmP0O_EMvS2.jpg"></video><figcaption><a href="https://video.twimg.com/amplify_video/2118387217588465664/vid/avc1/1920x1080/ggeDE9iY9Trxb8kO.mp4">打开原始媒体 ↗</a></figcaption></figure></section>
<h2>原文</h2>
<p><em>Introducing GPT-6 Cyber</em></p>
<figure data-media-id="m_70d1b131abc89dc7"><video controls playsinline preload="none" src="https://video.twimg.com/amplify_video/2118387217588465664/vid/avc1/1920x1080/ggeDE9iY9Trxb8kO.mp4" poster="https://pbs.twimg.com/amplify_video_thumb/2118387217588465664/img/N2grMUmP0O_EMvS2.jpg"></video><figcaption><a href="https://video.twimg.com/amplify_video/2118387217588465664/vid/avc1/1920x1080/ggeDE9iY9Trxb8kO.mp4">打开原始媒体 ↗</a></figcaption></figure>
<p>Introducing GPT‑6 Cyber: a major advance in security research that pairs stronger capabilities with better model alignment.</p>
<p>The model powered the Linux kernel research we announced yesterday, and security teams at companies like Mozilla, Palo Alto Networks, Calif, and Cisco—alongside our own at OpenAI—are already putting it to work.</p>
<p>GPT-6 Cyber is available to select Daybreak Red customers and we are expanding access over time.</p>
<p>https://openai.com/index/introducing-gpt-6-cyber/</p>
<p><strong>原文链接：</strong><a href="https://x.com/OpenAI/status/2118390190246879554">https://x.com/OpenAI/status/2118390190246879554</a></p>
<p><strong>相关链接：</strong><a href="https://openai.com/index/introducing-gpt-6-cyber/">https://openai.com/index/introducing-gpt-6-cyber/</a></p>]]></content:encoded>
      <qiaomu:versions><![CDATA[{"version": 1, "original": {"title": "Introducing GPT-6 Cyber", "url": "https://x.com/OpenAI/status/2118390190246879554", "lang": "en", "html": "<h2>Introducing GPT-6 Cyber</h2>\n<figure data-media-id=\"m_70d1b131abc89dc7\"><video controls playsinline preload=\"none\" src=\"https://video.twimg.com/amplify_video/2118387217588465664/vid/avc1/1920x1080/ggeDE9iY9Trxb8kO.mp4\" poster=\"https://pbs.twimg.com/amplify_video_thumb/2118387217588465664/img/N2grMUmP0O_EMvS2.jpg\"></video><figcaption><a href=\"https://video.twimg.com/amplify_video/2118387217588465664/vid/avc1/1920x1080/ggeDE9iY9Trxb8kO.mp4\">打开原始媒体 ↗</a></figcaption></figure>\n<p>Introducing GPT‑6 Cyber: a major advance in security research that pairs stronger capabilities with better model alignment.</p>\n<p>The model powered the Linux kernel research we announced yesterday, and security teams at companies like Mozilla, Palo Alto Networks, Calif, and Cisco—alongside our own at OpenAI—are already putting it to work.</p>\n<p>GPT-6 Cyber is available to select Daybreak Red customers and we are expanding access over time.</p>\n<p>https://openai.com/index/introducing-gpt-6-cyber/</p>\n<p>原文链接：<a href=\"https://x.com/OpenAI/status/2118390190246879554\">https://x.com/OpenAI/status/2118390190246879554</a></p>\n<p>相关链接：<a href=\"https://openai.com/index/introducing-gpt-6-cyber/\">https://openai.com/index/introducing-gpt-6-cyber/</a></p>"}, "rewrite": {"title": "OpenAI 发布 GPT-6 Cyber，先向部分 Daybreak Red 客户开放", "markdown": "OpenAI 发布 GPT-6 Cyber，称其在增强安全研究能力的同时，也改进了模型对齐。\n\n按 OpenAI 的介绍，该模型用于其前一天公布的 Linux 内核研究。Mozilla、Palo Alto Networks、Calif、Cisco 等公司的安全团队，以及 OpenAI 自己的安全团队，已经在使用它。\n\n目前，GPT-6 Cyber 向部分 Daybreak Red 客户开放，访问范围将逐步扩大。完整公告见 [OpenAI 原文](https://openai.com/index/introducing-gpt-6-cyber/)。\n\n\n### 原文附带媒体\n\n原文附带媒体；未核验其与具体段落的对应关系。\n\n[观看原视频](<https://video.twimg.com/amplify_video/2118387217588465664/vid/avc1/1920x1080/ggeDE9iY9Trxb8kO.mp4>)", "html": "<p>OpenAI 发布 GPT-6 Cyber，称其在增强安全研究能力的同时，也改进了模型对齐。</p>\n<p>按 OpenAI 的介绍，该模型用于其前一天公布的 Linux 内核研究。Mozilla、Palo Alto Networks、Calif、Cisco 等公司的安全团队，以及 OpenAI 自己的安全团队，已经在使用它。</p>\n<p>目前，GPT-6 Cyber 向部分 Daybreak Red 客户开放，访问范围将逐步扩大。完整公告见 <a href=\"https://openai.com/index/introducing-gpt-6-cyber/\" target=\"_blank\" rel=\"noopener noreferrer\">OpenAI 原文</a>。</p>\n<section class=\"rewrite-source-media\" aria-label=\"原文附带媒体\"><h3 class=\"source-media-heading\">原文附带媒体</h3><p class=\"completeness-note\">原文附带媒体；未核验其与具体段落的对应关系。</p><figure data-media-id=\"m_70d1b131abc89dc7\"><video controls playsinline preload=\"none\" src=\"https://video.twimg.com/amplify_video/2118387217588465664/vid/avc1/1920x1080/ggeDE9iY9Trxb8kO.mp4\" poster=\"https://pbs.twimg.com/amplify_video_thumb/2118387217588465664/img/N2grMUmP0O_EMvS2.jpg\"></video><figcaption><a href=\"https://video.twimg.com/amplify_video/2118387217588465664/vid/avc1/1920x1080/ggeDE9iY9Trxb8kO.mp4\">打开原始媒体 ↗</a></figcaption></figure></section>"}}]]></qiaomu:versions>
    </item>
    <item>
      <title>DeepSeek Super Agent：用插件组织 router 与 worker 的研究原型</title>
      <link>https://xnews.qiaomu.ai/a/deepseek-super-agent-harness</link>
      <guid isPermaLink="true">https://xnews.qiaomu.ai/a/deepseek-super-agent-harness</guid>
      <pubDate>Thu, 05 Nov 2026 12:00:00 +0000</pubDate>
      <author>AI news / DeepSeek Super Agent explainer</author>
      <description><![CDATA[<p><em>同一模型在九套 harness 中的通过率和成本不同；Super Agent 目前聚焦 GitHub、飞书，安全问题尚未完全解决。</em></p>
<h2>乔木改写</h2>
<p>以下依据本站保存的视频文字摘录整理，并非完整逐字稿。视频介绍了 DeepSeek 发布的 Super Agent。一些人将它称为对 Claude Code 的回应；视频作者更关注它的构建方式：整个系统由加入 DeepSeek Harness 的一组插件组成。</p>
<p>Super Agent 会监听团队已经使用的 GitHub 和飞书。当获得许可的成员在 Issue、PR 或相关对话中提出需求时，它建立工作项，开启独立会话完成任务，再返回结果，通常是一个 PR。它不要求用户先打开一段新的 Agent 对话。</p>
<p>项目随代码发布了一篇 X 文章，题为 Exploring Super Agent Design: Towards a More Autonomous Agent System。项目方明确说明，它是研究原型，并非 DeepSeek 的官方产品；不少设计想法和工程实现也由编码 Agent 编写。</p>
<h3>同一个模型，换九套 harness</h3>
<p>视频引用了 Frontier Harness Eval：固定使用 Kimi K3，比较九套编码 Agent harness。Codex 的通过率为 66.7%；DeepSeek Harness 的 creator 配置与 Claude Code 都为 63.3%。每完成一个成功任务，DeepSeek 约花费 $3.28，Claude Code 约为 $18.34。该测试中，最便宜与最贵的 harness 成本相差约 17.5 倍。</p>
<p>这些结果涉及通过率、成本、缓存和速度，即使模型不变，harness 也会影响这些表现。这些结果来自合成基准测试。</p>
<p>视频还提到，在 VentureBeat 的 Beyond the Pilot 播客中，Instacart 和 Box 的 CTO 都表达过当前 harness 比模型更重要的看法。</p>
<h3>DSH 的插件结构</h3>
<p>DeepSeek Harness（DSH）在八月发布，采用 MIT 许可，提供 Web UI，并不限定使用 DeepSeek 模型。它的设计原则是所有东西都可以成为插件：router、工具注册、会话日志，甚至 Agent loop 本身。</p>
<p>底层使用 Cordis 的时空可组合能力。时间维度上，卸载组件会撤销它做过的更改；空间维度上，组件依赖关系决定它们何时启用或停用。</p>
<p>DSH 有 standard、PTC、minimal、creator 等模式，对应不同的插件组合。creator 模式允许用户在聊天中描述一个插件，由 Agent 编写并安装。</p>
<h3>router 与 worker 如何配合</h3>
<p>Super Agent 通过 <code>cordis.patch</code> 接入，包含核心 Super Agent 插件、GitHub watcher 和飞书 watcher。上层是一段长期运行的 router 会话，下层是彼此隔离的 worker 会话。外部触发先经过白名单等确定性门禁，再交给模型处理；工作单会携带任务授权。</p>
<p>worker 使用精简的插件配置，不包含提问、规划、网页抓取或子 Agent，长时间运行的 shell 任务则转入后台。worker 还会直接订阅认领任务的对话，因此后续 PR 评论不必再经过 router。按材料中的测试，启用这一机制时，router 的决策次数比未启用时减少约 30%。</p>
<p>负载测试把触发量从每分钟 1 次提高到 40 次。通过批量处理，每次决策所需时间从 6.4 秒降至 1.6 秒。视频据此介绍了一种分工：router 可以使用更便宜、更快的模型，把更强的模型留给 worker。</p>
<p>这套设计希望尽量少占用人的注意力，同时提供尽可能多的价值。插件化也让开发者可以在不 fork 核心代码的情况下继续扩展 harness。</p>
<p>它仍有明确限制：只是研究原型，公开代码不等于内部使用的代码；接入范围主要是 GitHub 和飞书，评测是合成基准，提示注入、凭证等安全问题尚未完全解决。</p>
<section class="rewrite-source-media" aria-label="原文附带媒体"><h3 class="source-media-heading">原文附带媒体</h3><p class="completeness-note">原文附带媒体；未核验其与具体段落的对应关系。</p><figure data-media-id="m_a7870fb84bc71ab0"><iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/OrcsMi2-IcM" title="原视频（手动播放）" loading="lazy" allowfullscreen></iframe><figcaption><a href="https://www.youtube.com/watch?v=OrcsMi2-IcM">打开原始媒体 ↗</a></figcaption></figure></section>
<h2>原文</h2>
<p>视频原文摘录，非完整逐字稿；请以原视频为准。</p>
<p><em>DeepSeek Super Agent and why the harness matters</em></p>
<figure data-media-id="m_a7870fb84bc71ab0"><iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/OrcsMi2-IcM" title="原视频（手动播放）" loading="lazy" allowfullscreen></iframe><figcaption><a href="https://www.youtube.com/watch?v=OrcsMi2-IcM">打开原始媒体 ↗</a></figcaption></figure>
<p>DeepSeek Super Agent and why the harness matters</p>
<p>Source: YouTube https://www.youtube.com/watch?v=OrcsMi2-IcM</p>
<p>Okay, so this past weekend, DeepSeek released something that a lot of people out there are calling the answer to Claude Code. It&#x27;s an agent that sits on a GitHub repo. It watches the issues and pull requests, and when someone on your team asks it to do something, It then goes off into its own session, does the work, and comes back with a PR Now, while that&#x27;s cool in itself, that&#x27;s not really the part that I want to talk about here. The part that I find really interesting is how they built it. The whole thing is just a set of plugins dropped into their agent harness.</p>
<p>When the DeepSeek Harness came out back in August, the plugin architecture is really cool. The new thing DeepSeek launched is called Super Agent. Along with the repo, they&#x27;ve written an article on X called Exploring Super Agent Design: Towards a More Autonomous Agent System. They&#x27;re upfront that this is a research prototype, not an official DeepSeek product. Ideas and engineering were often written by coding agents themselves.</p>
<p>Basic idea: instead of you opening a session and talking to an agent, the agent listens to where your team already works — GitHub, and Feishu. When someone allowed asks it for something, it opens a work item, spins up its own session, does the work, replies back usually with a PR.</p>
<p>On the VentureBeat podcast Beyond the Pilot, CTOs of Instacart and Box both said the harness matters more than the model right now.</p>
<p>Frontier Harness Eval: same model (Kimi K3) through nine coding agent harnesses. Codex 66.7% pass rate; DeepSeek Harness creator config and Claude Code both 63.3%. DeepSeek ~$3.28 per successful task vs Claude Code ~$18.34. Gap cheapest to most expensive ~17.5x. Harness changes cost, caching, speed, and success rate even with model held constant.</p>
<p>DeepSeek Harness (DSH) MIT licensed, web UI, not locked to DeepSeek models. Tagline: everything is a plugin — router, tool registry, session log, even the agent loop. Built on Cordis (spatiotemporal composability): temporal (unload reverses everything) and spatial (dependencies activate/deactivate).</p>
<p>Modes: standard, PTC, minimal, creator — different plugin sets. Creator: describe a plugin in chat and agent writes/installs it.</p>
<p>Super Agent integrates via cordis.patch: core Super Agent plugin, GitHub watcher, Feishu watcher. Workers: stripped preset, no questions/plan/web fetch/sub-agents; long shell jobs backgrounded. Architecture: long-running router session + isolated worker sessions. Triggers go through a deterministic gate (allow-list) before the model. Tickets carry a mandate. Workers subscribe to conversation so PR comments skip the router (30% fewer router decisions when on).</p>
<p>Under load (1→40 triggers/min), batching made time per decision drop 6.4s→1.6s. Router can use a cheap/fast model; stronger models for workers.</p>
<p>Philosophy: take as little human attention as possible and give as much value as possible.</p>
<p>Caveats: prototype; published code ≠ internal; narrow (GitHub/Feishu); synthetic benchmarks; security (prompt injection, credentials) not fully solved.</p>
<p>Bigger point: harnesses evolving fast via composable plugins without forking the core.</p>
<p><strong>原文链接：</strong><a href="https://www.youtube.com/watch?v=OrcsMi2-IcM">https://www.youtube.com/watch?v=OrcsMi2-IcM</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>同一模型在九套 harness 中的通过率和成本不同；Super Agent 目前聚焦 GitHub、飞书，安全问题尚未完全解决。</em></p>
<h2>乔木改写</h2>
<p>以下依据本站保存的视频文字摘录整理，并非完整逐字稿。视频介绍了 DeepSeek 发布的 Super Agent。一些人将它称为对 Claude Code 的回应；视频作者更关注它的构建方式：整个系统由加入 DeepSeek Harness 的一组插件组成。</p>
<p>Super Agent 会监听团队已经使用的 GitHub 和飞书。当获得许可的成员在 Issue、PR 或相关对话中提出需求时，它建立工作项，开启独立会话完成任务，再返回结果，通常是一个 PR。它不要求用户先打开一段新的 Agent 对话。</p>
<p>项目随代码发布了一篇 X 文章，题为 Exploring Super Agent Design: Towards a More Autonomous Agent System。项目方明确说明，它是研究原型，并非 DeepSeek 的官方产品；不少设计想法和工程实现也由编码 Agent 编写。</p>
<h3>同一个模型，换九套 harness</h3>
<p>视频引用了 Frontier Harness Eval：固定使用 Kimi K3，比较九套编码 Agent harness。Codex 的通过率为 66.7%；DeepSeek Harness 的 creator 配置与 Claude Code 都为 63.3%。每完成一个成功任务，DeepSeek 约花费 $3.28，Claude Code 约为 $18.34。该测试中，最便宜与最贵的 harness 成本相差约 17.5 倍。</p>
<p>这些结果涉及通过率、成本、缓存和速度，即使模型不变，harness 也会影响这些表现。这些结果来自合成基准测试。</p>
<p>视频还提到，在 VentureBeat 的 Beyond the Pilot 播客中，Instacart 和 Box 的 CTO 都表达过当前 harness 比模型更重要的看法。</p>
<h3>DSH 的插件结构</h3>
<p>DeepSeek Harness（DSH）在八月发布，采用 MIT 许可，提供 Web UI，并不限定使用 DeepSeek 模型。它的设计原则是所有东西都可以成为插件：router、工具注册、会话日志，甚至 Agent loop 本身。</p>
<p>底层使用 Cordis 的时空可组合能力。时间维度上，卸载组件会撤销它做过的更改；空间维度上，组件依赖关系决定它们何时启用或停用。</p>
<p>DSH 有 standard、PTC、minimal、creator 等模式，对应不同的插件组合。creator 模式允许用户在聊天中描述一个插件，由 Agent 编写并安装。</p>
<h3>router 与 worker 如何配合</h3>
<p>Super Agent 通过 <code>cordis.patch</code> 接入，包含核心 Super Agent 插件、GitHub watcher 和飞书 watcher。上层是一段长期运行的 router 会话，下层是彼此隔离的 worker 会话。外部触发先经过白名单等确定性门禁，再交给模型处理；工作单会携带任务授权。</p>
<p>worker 使用精简的插件配置，不包含提问、规划、网页抓取或子 Agent，长时间运行的 shell 任务则转入后台。worker 还会直接订阅认领任务的对话，因此后续 PR 评论不必再经过 router。按材料中的测试，启用这一机制时，router 的决策次数比未启用时减少约 30%。</p>
<p>负载测试把触发量从每分钟 1 次提高到 40 次。通过批量处理，每次决策所需时间从 6.4 秒降至 1.6 秒。视频据此介绍了一种分工：router 可以使用更便宜、更快的模型，把更强的模型留给 worker。</p>
<p>这套设计希望尽量少占用人的注意力，同时提供尽可能多的价值。插件化也让开发者可以在不 fork 核心代码的情况下继续扩展 harness。</p>
<p>它仍有明确限制：只是研究原型，公开代码不等于内部使用的代码；接入范围主要是 GitHub 和飞书，评测是合成基准，提示注入、凭证等安全问题尚未完全解决。</p>
<section class="rewrite-source-media" aria-label="原文附带媒体"><h3 class="source-media-heading">原文附带媒体</h3><p class="completeness-note">原文附带媒体；未核验其与具体段落的对应关系。</p><figure data-media-id="m_a7870fb84bc71ab0"><iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/OrcsMi2-IcM" title="原视频（手动播放）" loading="lazy" allowfullscreen></iframe><figcaption><a href="https://www.youtube.com/watch?v=OrcsMi2-IcM">打开原始媒体 ↗</a></figcaption></figure></section>
<h2>原文</h2>
<p>视频原文摘录，非完整逐字稿；请以原视频为准。</p>
<p><em>DeepSeek Super Agent and why the harness matters</em></p>
<figure data-media-id="m_a7870fb84bc71ab0"><iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/OrcsMi2-IcM" title="原视频（手动播放）" loading="lazy" allowfullscreen></iframe><figcaption><a href="https://www.youtube.com/watch?v=OrcsMi2-IcM">打开原始媒体 ↗</a></figcaption></figure>
<p>DeepSeek Super Agent and why the harness matters</p>
<p>Source: YouTube https://www.youtube.com/watch?v=OrcsMi2-IcM</p>
<p>Okay, so this past weekend, DeepSeek released something that a lot of people out there are calling the answer to Claude Code. It&#x27;s an agent that sits on a GitHub repo. It watches the issues and pull requests, and when someone on your team asks it to do something, It then goes off into its own session, does the work, and comes back with a PR Now, while that&#x27;s cool in itself, that&#x27;s not really the part that I want to talk about here. The part that I find really interesting is how they built it. The whole thing is just a set of plugins dropped into their agent harness.</p>
<p>When the DeepSeek Harness came out back in August, the plugin architecture is really cool. The new thing DeepSeek launched is called Super Agent. Along with the repo, they&#x27;ve written an article on X called Exploring Super Agent Design: Towards a More Autonomous Agent System. They&#x27;re upfront that this is a research prototype, not an official DeepSeek product. Ideas and engineering were often written by coding agents themselves.</p>
<p>Basic idea: instead of you opening a session and talking to an agent, the agent listens to where your team already works — GitHub, and Feishu. When someone allowed asks it for something, it opens a work item, spins up its own session, does the work, replies back usually with a PR.</p>
<p>On the VentureBeat podcast Beyond the Pilot, CTOs of Instacart and Box both said the harness matters more than the model right now.</p>
<p>Frontier Harness Eval: same model (Kimi K3) through nine coding agent harnesses. Codex 66.7% pass rate; DeepSeek Harness creator config and Claude Code both 63.3%. DeepSeek ~$3.28 per successful task vs Claude Code ~$18.34. Gap cheapest to most expensive ~17.5x. Harness changes cost, caching, speed, and success rate even with model held constant.</p>
<p>DeepSeek Harness (DSH) MIT licensed, web UI, not locked to DeepSeek models. Tagline: everything is a plugin — router, tool registry, session log, even the agent loop. Built on Cordis (spatiotemporal composability): temporal (unload reverses everything) and spatial (dependencies activate/deactivate).</p>
<p>Modes: standard, PTC, minimal, creator — different plugin sets. Creator: describe a plugin in chat and agent writes/installs it.</p>
<p>Super Agent integrates via cordis.patch: core Super Agent plugin, GitHub watcher, Feishu watcher. Workers: stripped preset, no questions/plan/web fetch/sub-agents; long shell jobs backgrounded. Architecture: long-running router session + isolated worker sessions. Triggers go through a deterministic gate (allow-list) before the model. Tickets carry a mandate. Workers subscribe to conversation so PR comments skip the router (30% fewer router decisions when on).</p>
<p>Under load (1→40 triggers/min), batching made time per decision drop 6.4s→1.6s. Router can use a cheap/fast model; stronger models for workers.</p>
<p>Philosophy: take as little human attention as possible and give as much value as possible.</p>
<p>Caveats: prototype; published code ≠ internal; narrow (GitHub/Feishu); synthetic benchmarks; security (prompt injection, credentials) not fully solved.</p>
<p>Bigger point: harnesses evolving fast via composable plugins without forking the core.</p>
<p><strong>原文链接：</strong><a href="https://www.youtube.com/watch?v=OrcsMi2-IcM">https://www.youtube.com/watch?v=OrcsMi2-IcM</a></p>]]></content:encoded>
      <qiaomu:versions><![CDATA[{"version": 1, "original": {"title": "DeepSeek Super Agent and why the harness matters", "url": "https://www.youtube.com/watch?v=OrcsMi2-IcM", "lang": "en", "html": "<h2>DeepSeek Super Agent and why the harness matters</h2>\n<p>视频原文摘录，非完整逐字稿；请以原视频为准。</p>\n<figure data-media-id=\"m_a7870fb84bc71ab0\"><iframe width=\"560\" height=\"315\" src=\"https://www.youtube-nocookie.com/embed/OrcsMi2-IcM\" title=\"原视频（手动播放）\" loading=\"lazy\" allowfullscreen></iframe><figcaption><a href=\"https://www.youtube.com/watch?v=OrcsMi2-IcM\">打开原始媒体 ↗</a></figcaption></figure>\n<p>DeepSeek Super Agent and why the harness matters</p>\n<p>Source: YouTube https://www.youtube.com/watch?v=OrcsMi2-IcM</p>\n<p>Okay, so this past weekend, DeepSeek released something that a lot of people out there are calling the answer to Claude Code. It&#x27;s an agent that sits on a GitHub repo. It watches the issues and pull requests, and when someone on your team asks it to do something, It then goes off into its own session, does the work, and comes back with a PR Now, while that&#x27;s cool in itself, that&#x27;s not really the part that I want to talk about here. The part that I find really interesting is how they built it. The whole thing is just a set of plugins dropped into their agent harness.</p>\n<p>When the DeepSeek Harness came out back in August, the plugin architecture is really cool. The new thing DeepSeek launched is called Super Agent. Along with the repo, they&#x27;ve written an article on X called Exploring Super Agent Design: Towards a More Autonomous Agent System. They&#x27;re upfront that this is a research prototype, not an official DeepSeek product. Ideas and engineering were often written by coding agents themselves.</p>\n<p>Basic idea: instead of you opening a session and talking to an agent, the agent listens to where your team already works — GitHub, and Feishu. When someone allowed asks it for something, it opens a work item, spins up its own session, does the work, replies back usually with a PR.</p>\n<p>On the VentureBeat podcast Beyond the Pilot, CTOs of Instacart and Box both said the harness matters more than the model right now.</p>\n<p>Frontier Harness Eval: same model (Kimi K3) through nine coding agent harnesses. Codex 66.7% pass rate; DeepSeek Harness creator config and Claude Code both 63.3%. DeepSeek ~$3.28 per successful task vs Claude Code ~$18.34. Gap cheapest to most expensive ~17.5x. Harness changes cost, caching, speed, and success rate even with model held constant.</p>\n<p>DeepSeek Harness (DSH) MIT licensed, web UI, not locked to DeepSeek models. Tagline: everything is a plugin — router, tool registry, session log, even the agent loop. Built on Cordis (spatiotemporal composability): temporal (unload reverses everything) and spatial (dependencies activate/deactivate).</p>\n<p>Modes: standard, PTC, minimal, creator — different plugin sets. Creator: describe a plugin in chat and agent writes/installs it.</p>\n<p>Super Agent integrates via cordis.patch: core Super Agent plugin, GitHub watcher, Feishu watcher. Workers: stripped preset, no questions/plan/web fetch/sub-agents; long shell jobs backgrounded. Architecture: long-running router session + isolated worker sessions. Triggers go through a deterministic gate (allow-list) before the model. Tickets carry a mandate. Workers subscribe to conversation so PR comments skip the router (30% fewer router decisions when on).</p>\n<p>Under load (1→40 triggers/min), batching made time per decision drop 6.4s→1.6s. Router can use a cheap/fast model; stronger models for workers.</p>\n<p>Philosophy: take as little human attention as possible and give as much value as possible.</p>\n<p>Caveats: prototype; published code ≠ internal; narrow (GitHub/Feishu); synthetic benchmarks; security (prompt injection, credentials) not fully solved.</p>\n<p>Bigger point: harnesses evolving fast via composable plugins without forking the core.</p>\n<p>原文链接：<a href=\"https://www.youtube.com/watch?v=OrcsMi2-IcM\">https://www.youtube.com/watch?v=OrcsMi2-IcM</a></p>"}, "rewrite": {"title": "DeepSeek Super Agent：用插件组织 router 与 worker 的研究原型", "markdown": "以下依据本站保存的视频文字摘录整理，并非完整逐字稿。视频介绍了 DeepSeek 发布的 Super Agent。一些人将它称为对 Claude Code 的回应；视频作者更关注它的构建方式：整个系统由加入 DeepSeek Harness 的一组插件组成。\n\nSuper Agent 会监听团队已经使用的 GitHub 和飞书。当获得许可的成员在 Issue、PR 或相关对话中提出需求时，它建立工作项，开启独立会话完成任务，再返回结果，通常是一个 PR。它不要求用户先打开一段新的 Agent 对话。\n\n项目随代码发布了一篇 X 文章，题为 Exploring Super Agent Design: Towards a More Autonomous Agent System。项目方明确说明，它是研究原型，并非 DeepSeek 的官方产品；不少设计想法和工程实现也由编码 Agent 编写。\n\n### 同一个模型，换九套 harness\n\n视频引用了 Frontier Harness Eval：固定使用 Kimi K3，比较九套编码 Agent harness。Codex 的通过率为 66.7%；DeepSeek Harness 的 creator 配置与 Claude Code 都为 63.3%。每完成一个成功任务，DeepSeek 约花费 $3.28，Claude Code 约为 $18.34。该测试中，最便宜与最贵的 harness 成本相差约 17.5 倍。\n\n这些结果涉及通过率、成本、缓存和速度，即使模型不变，harness 也会影响这些表现。这些结果来自合成基准测试。\n\n视频还提到，在 VentureBeat 的 Beyond the Pilot 播客中，Instacart 和 Box 的 CTO 都表达过当前 harness 比模型更重要的看法。\n\n### DSH 的插件结构\n\nDeepSeek Harness（DSH）在八月发布，采用 MIT 许可，提供 Web UI，并不限定使用 DeepSeek 模型。它的设计原则是所有东西都可以成为插件：router、工具注册、会话日志，甚至 Agent loop 本身。\n\n底层使用 Cordis 的时空可组合能力。时间维度上，卸载组件会撤销它做过的更改；空间维度上，组件依赖关系决定它们何时启用或停用。\n\nDSH 有 standard、PTC、minimal、creator 等模式，对应不同的插件组合。creator 模式允许用户在聊天中描述一个插件，由 Agent 编写并安装。\n\n### router 与 worker 如何配合\n\nSuper Agent 通过 `cordis.patch` 接入，包含核心 Super Agent 插件、GitHub watcher 和飞书 watcher。上层是一段长期运行的 router 会话，下层是彼此隔离的 worker 会话。外部触发先经过白名单等确定性门禁，再交给模型处理；工作单会携带任务授权。\n\nworker 使用精简的插件配置，不包含提问、规划、网页抓取或子 Agent，长时间运行的 shell 任务则转入后台。worker 还会直接订阅认领任务的对话，因此后续 PR 评论不必再经过 router。按材料中的测试，启用这一机制时，router 的决策次数比未启用时减少约 30%。\n\n负载测试把触发量从每分钟 1 次提高到 40 次。通过批量处理，每次决策所需时间从 6.4 秒降至 1.6 秒。视频据此介绍了一种分工：router 可以使用更便宜、更快的模型，把更强的模型留给 worker。\n\n这套设计希望尽量少占用人的注意力，同时提供尽可能多的价值。插件化也让开发者可以在不 fork 核心代码的情况下继续扩展 harness。\n\n它仍有明确限制：只是研究原型，公开代码不等于内部使用的代码；接入范围主要是 GitHub 和飞书，评测是合成基准，提示注入、凭证等安全问题尚未完全解决。\n\n\n### 原文附带媒体\n\n原文附带媒体；未核验其与具体段落的对应关系。\n\n[观看原视频](<https://www.youtube.com/watch?v=OrcsMi2-IcM>)", "html": "<p>以下依据本站保存的视频文字摘录整理，并非完整逐字稿。视频介绍了 DeepSeek 发布的 Super Agent。一些人将它称为对 Claude Code 的回应；视频作者更关注它的构建方式：整个系统由加入 DeepSeek Harness 的一组插件组成。</p>\n<p>Super Agent 会监听团队已经使用的 GitHub 和飞书。当获得许可的成员在 Issue、PR 或相关对话中提出需求时，它建立工作项，开启独立会话完成任务，再返回结果，通常是一个 PR。它不要求用户先打开一段新的 Agent 对话。</p>\n<p>项目随代码发布了一篇 X 文章，题为 Exploring Super Agent Design: Towards a More Autonomous Agent System。项目方明确说明，它是研究原型，并非 DeepSeek 的官方产品；不少设计想法和工程实现也由编码 Agent 编写。</p>\n<h3>同一个模型，换九套 harness</h3>\n<p>视频引用了 Frontier Harness Eval：固定使用 Kimi K3，比较九套编码 Agent harness。Codex 的通过率为 66.7%；DeepSeek Harness 的 creator 配置与 Claude Code 都为 63.3%。每完成一个成功任务，DeepSeek 约花费 $3.28，Claude Code 约为 $18.34。该测试中，最便宜与最贵的 harness 成本相差约 17.5 倍。</p>\n<p>这些结果涉及通过率、成本、缓存和速度，即使模型不变，harness 也会影响这些表现。这些结果来自合成基准测试。</p>\n<p>视频还提到，在 VentureBeat 的 Beyond the Pilot 播客中，Instacart 和 Box 的 CTO 都表达过当前 harness 比模型更重要的看法。</p>\n<h3>DSH 的插件结构</h3>\n<p>DeepSeek Harness（DSH）在八月发布，采用 MIT 许可，提供 Web UI，并不限定使用 DeepSeek 模型。它的设计原则是所有东西都可以成为插件：router、工具注册、会话日志，甚至 Agent loop 本身。</p>\n<p>底层使用 Cordis 的时空可组合能力。时间维度上，卸载组件会撤销它做过的更改；空间维度上，组件依赖关系决定它们何时启用或停用。</p>\n<p>DSH 有 standard、PTC、minimal、creator 等模式，对应不同的插件组合。creator 模式允许用户在聊天中描述一个插件，由 Agent 编写并安装。</p>\n<h3>router 与 worker 如何配合</h3>\n<p>Super Agent 通过 <code>cordis.patch</code> 接入，包含核心 Super Agent 插件、GitHub watcher 和飞书 watcher。上层是一段长期运行的 router 会话，下层是彼此隔离的 worker 会话。外部触发先经过白名单等确定性门禁，再交给模型处理；工作单会携带任务授权。</p>\n<p>worker 使用精简的插件配置，不包含提问、规划、网页抓取或子 Agent，长时间运行的 shell 任务则转入后台。worker 还会直接订阅认领任务的对话，因此后续 PR 评论不必再经过 router。按材料中的测试，启用这一机制时，router 的决策次数比未启用时减少约 30%。</p>\n<p>负载测试把触发量从每分钟 1 次提高到 40 次。通过批量处理，每次决策所需时间从 6.4 秒降至 1.6 秒。视频据此介绍了一种分工：router 可以使用更便宜、更快的模型，把更强的模型留给 worker。</p>\n<p>这套设计希望尽量少占用人的注意力，同时提供尽可能多的价值。插件化也让开发者可以在不 fork 核心代码的情况下继续扩展 harness。</p>\n<p>它仍有明确限制：只是研究原型，公开代码不等于内部使用的代码；接入范围主要是 GitHub 和飞书，评测是合成基准，提示注入、凭证等安全问题尚未完全解决。</p>\n<section class=\"rewrite-source-media\" aria-label=\"原文附带媒体\"><h3 class=\"source-media-heading\">原文附带媒体</h3><p class=\"completeness-note\">原文附带媒体；未核验其与具体段落的对应关系。</p><figure data-media-id=\"m_a7870fb84bc71ab0\"><iframe width=\"560\" height=\"315\" src=\"https://www.youtube-nocookie.com/embed/OrcsMi2-IcM\" title=\"原视频（手动播放）\" loading=\"lazy\" allowfullscreen></iframe><figcaption><a href=\"https://www.youtube.com/watch?v=OrcsMi2-IcM\">打开原始媒体 ↗</a></figcaption></figure></section>"}}]]></qiaomu:versions>
    </item>
    <item>
      <title>Tibo：Dropbox 一段屏录，让候补名单从 5000 人增至 75000 人</title>
      <link>https://xnews.qiaomu.ai/a/tibo-dropbox-launch-video</link>
      <guid isPermaLink="true">https://xnews.qiaomu.ai/a/tibo-dropbox-launch-video</guid>
      <pubDate>Thu, 05 Nov 2026 10:30:35 +0000</pubDate>
      <author>Tibo</author>
      <description><![CDATA[<p><em>他回顾十八年前的发布视频，分析真实功能演示、目标受众与发布渠道如何配合。</em></p>
<h2>乔木改写</h2>
<p>Tibo 翻出十八年前 Dropbox 创始人录制的一段屏幕演示，称它是硅谷历史上最成功的发布视频。他说，这段视频让 Dropbox 的候补名单一夜间从 5000 人增长到 75000 人。</p>
<p>在他看来，视频有效有五个原因：</p>
<ol>
<li>它展示了真实产品完成承诺的那件事：把文件放进一个文件夹，文件就会出现在另一台电脑上。</li>
<li>视频中有许多目标受众才懂的内部笑话。</li>
<li>创始人把视频发在用户已经聚集的地方：更早的版本发在 Hacker News，这个版本则发在 Digg。</li>
<li>它解释了一个新概念，却没有使用术语。</li>
<li>它让人看到了尚未开放使用的产品。Dropbox 当时还没向公众开放，视频先证明它能工作，之后由候补名单承接需求。</li>
</ol>
<p>Tibo 的建议是，当大家都在用 Claude 制作精致的视频时，也可以只录一段简单的屏幕演示。在他看来，这样反而会显得真实十倍。</p>
<section class="rewrite-source-media" aria-label="原文附带媒体"><h3 class="source-media-heading">原文附带媒体</h3><p class="completeness-note">原文附带媒体；未核验其与具体段落的对应关系。</p><figure data-media-id="m_5a424bc471e1372e"><video controls playsinline preload="none" src="https://video.twimg.com/amplify_video/2118289796053270528/vid/avc1/480x360/NH7IwVLQVlkf9n0t.mp4?tag=16" poster="https://pbs.twimg.com/amplify_video_thumb/2118289796053270528/img/CPvuvMCkuJt0y4QM.jpg"></video><figcaption><a href="https://video.twimg.com/amplify_video/2118289796053270528/vid/avc1/480x360/NH7IwVLQVlkf9n0t.mp4?tag=16">打开原始媒体 ↗</a></figcaption></figure></section>
<h2>原文</h2>
<p><em>The most successful launch video in Silicon Valley history</em></p>
<figure data-media-id="m_5a424bc471e1372e"><video controls playsinline preload="none" src="https://video.twimg.com/amplify_video/2118289796053270528/vid/avc1/480x360/NH7IwVLQVlkf9n0t.mp4?tag=16" poster="https://pbs.twimg.com/amplify_video_thumb/2118289796053270528/img/CPvuvMCkuJt0y4QM.jpg"></video><figcaption><a href="https://video.twimg.com/amplify_video/2118289796053270528/vid/avc1/480x360/NH7IwVLQVlkf9n0t.mp4?tag=16">打开原始媒体 ↗</a></figcaption></figure>
<p>this is the most successful launch video in Silicon Valley history</p>
<p>18 years ago, the founder of Dropbox recorded his screen to make this demo</p>
<p>it took their waitlist from 5,000 to 75,000 overnight</p>
<p>imo, here&#x27;s what made it work:</p>
<ol>
<li>it showed the real product doing the one thing it promised. you drop a file into a folder and it shows up on your other computer</li>
</ol>
<ol>
<li>it was full of inside jokes for the exact audience he was trying to reach</li>
</ol>
<ol>
<li>he posted it where his users already were. an earlier version went on Hacker News, and this one went on Digg</li>
</ol>
<ol>
<li>it explained a new idea without any jargon</li>
</ol>
<ol>
<li>it let people see something they couldn&#x27;t use yet. Dropbox wasn&#x27;t open to the public, so the video showed it working and the waitlist did the rest</li>
</ol>
<p>while everyone is doing super fancy video with Claude, you can do a very simple screen recording</p>
<p>you will look x10 more authentic</p>
<p><strong>原文链接：</strong><a href="https://x.com/tibo_maker/status/2118289869428380138">https://x.com/tibo_maker/status/2118289869428380138</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>他回顾十八年前的发布视频，分析真实功能演示、目标受众与发布渠道如何配合。</em></p>
<h2>乔木改写</h2>
<p>Tibo 翻出十八年前 Dropbox 创始人录制的一段屏幕演示，称它是硅谷历史上最成功的发布视频。他说，这段视频让 Dropbox 的候补名单一夜间从 5000 人增长到 75000 人。</p>
<p>在他看来，视频有效有五个原因：</p>
<ol>
<li>它展示了真实产品完成承诺的那件事：把文件放进一个文件夹，文件就会出现在另一台电脑上。</li>
<li>视频中有许多目标受众才懂的内部笑话。</li>
<li>创始人把视频发在用户已经聚集的地方：更早的版本发在 Hacker News，这个版本则发在 Digg。</li>
<li>它解释了一个新概念，却没有使用术语。</li>
<li>它让人看到了尚未开放使用的产品。Dropbox 当时还没向公众开放，视频先证明它能工作，之后由候补名单承接需求。</li>
</ol>
<p>Tibo 的建议是，当大家都在用 Claude 制作精致的视频时，也可以只录一段简单的屏幕演示。在他看来，这样反而会显得真实十倍。</p>
<section class="rewrite-source-media" aria-label="原文附带媒体"><h3 class="source-media-heading">原文附带媒体</h3><p class="completeness-note">原文附带媒体；未核验其与具体段落的对应关系。</p><figure data-media-id="m_5a424bc471e1372e"><video controls playsinline preload="none" src="https://video.twimg.com/amplify_video/2118289796053270528/vid/avc1/480x360/NH7IwVLQVlkf9n0t.mp4?tag=16" poster="https://pbs.twimg.com/amplify_video_thumb/2118289796053270528/img/CPvuvMCkuJt0y4QM.jpg"></video><figcaption><a href="https://video.twimg.com/amplify_video/2118289796053270528/vid/avc1/480x360/NH7IwVLQVlkf9n0t.mp4?tag=16">打开原始媒体 ↗</a></figcaption></figure></section>
<h2>原文</h2>
<p><em>The most successful launch video in Silicon Valley history</em></p>
<figure data-media-id="m_5a424bc471e1372e"><video controls playsinline preload="none" src="https://video.twimg.com/amplify_video/2118289796053270528/vid/avc1/480x360/NH7IwVLQVlkf9n0t.mp4?tag=16" poster="https://pbs.twimg.com/amplify_video_thumb/2118289796053270528/img/CPvuvMCkuJt0y4QM.jpg"></video><figcaption><a href="https://video.twimg.com/amplify_video/2118289796053270528/vid/avc1/480x360/NH7IwVLQVlkf9n0t.mp4?tag=16">打开原始媒体 ↗</a></figcaption></figure>
<p>this is the most successful launch video in Silicon Valley history</p>
<p>18 years ago, the founder of Dropbox recorded his screen to make this demo</p>
<p>it took their waitlist from 5,000 to 75,000 overnight</p>
<p>imo, here&#x27;s what made it work:</p>
<ol>
<li>it showed the real product doing the one thing it promised. you drop a file into a folder and it shows up on your other computer</li>
</ol>
<ol>
<li>it was full of inside jokes for the exact audience he was trying to reach</li>
</ol>
<ol>
<li>he posted it where his users already were. an earlier version went on Hacker News, and this one went on Digg</li>
</ol>
<ol>
<li>it explained a new idea without any jargon</li>
</ol>
<ol>
<li>it let people see something they couldn&#x27;t use yet. Dropbox wasn&#x27;t open to the public, so the video showed it working and the waitlist did the rest</li>
</ol>
<p>while everyone is doing super fancy video with Claude, you can do a very simple screen recording</p>
<p>you will look x10 more authentic</p>
<p><strong>原文链接：</strong><a href="https://x.com/tibo_maker/status/2118289869428380138">https://x.com/tibo_maker/status/2118289869428380138</a></p>]]></content:encoded>
      <qiaomu:versions><![CDATA[{"version": 1, "original": {"title": "The most successful launch video in Silicon Valley history", "url": "https://x.com/tibo_maker/status/2118289869428380138", "lang": "en", "html": "<h2>The most successful launch video in Silicon Valley history</h2>\n<figure data-media-id=\"m_5a424bc471e1372e\"><video controls playsinline preload=\"none\" src=\"https://video.twimg.com/amplify_video/2118289796053270528/vid/avc1/480x360/NH7IwVLQVlkf9n0t.mp4?tag=16\" poster=\"https://pbs.twimg.com/amplify_video_thumb/2118289796053270528/img/CPvuvMCkuJt0y4QM.jpg\"></video><figcaption><a href=\"https://video.twimg.com/amplify_video/2118289796053270528/vid/avc1/480x360/NH7IwVLQVlkf9n0t.mp4?tag=16\">打开原始媒体 ↗</a></figcaption></figure>\n<p>this is the most successful launch video in Silicon Valley history</p>\n<p>18 years ago, the founder of Dropbox recorded his screen to make this demo</p>\n<p>it took their waitlist from 5,000 to 75,000 overnight</p>\n<p>imo, here&#x27;s what made it work:</p>\n<ol>\n<li>it showed the real product doing the one thing it promised. you drop a file into a folder and it shows up on your other computer</li>\n</ol>\n<ol>\n<li>it was full of inside jokes for the exact audience he was trying to reach</li>\n</ol>\n<ol>\n<li>he posted it where his users already were. an earlier version went on Hacker News, and this one went on Digg</li>\n</ol>\n<ol>\n<li>it explained a new idea without any jargon</li>\n</ol>\n<ol>\n<li>it let people see something they couldn&#x27;t use yet. Dropbox wasn&#x27;t open to the public, so the video showed it working and the waitlist did the rest</li>\n</ol>\n<p>while everyone is doing super fancy video with Claude, you can do a very simple screen recording</p>\n<p>you will look x10 more authentic</p>\n<p>原文链接：<a href=\"https://x.com/tibo_maker/status/2118289869428380138\">https://x.com/tibo_maker/status/2118289869428380138</a></p>"}, "rewrite": {"title": "Tibo：Dropbox 一段屏录，让候补名单从 5000 人增至 75000 人", "markdown": "Tibo 翻出十八年前 Dropbox 创始人录制的一段屏幕演示，称它是硅谷历史上最成功的发布视频。他说，这段视频让 Dropbox 的候补名单一夜间从 5000 人增长到 75000 人。\n\n在他看来，视频有效有五个原因：\n\n1. 它展示了真实产品完成承诺的那件事：把文件放进一个文件夹，文件就会出现在另一台电脑上。\n2. 视频中有许多目标受众才懂的内部笑话。\n3. 创始人把视频发在用户已经聚集的地方：更早的版本发在 Hacker News，这个版本则发在 Digg。\n4. 它解释了一个新概念，却没有使用术语。\n5. 它让人看到了尚未开放使用的产品。Dropbox 当时还没向公众开放，视频先证明它能工作，之后由候补名单承接需求。\n\nTibo 的建议是，当大家都在用 Claude 制作精致的视频时，也可以只录一段简单的屏幕演示。在他看来，这样反而会显得真实十倍。\n\n\n### 原文附带媒体\n\n原文附带媒体；未核验其与具体段落的对应关系。\n\n[观看原视频](<https://video.twimg.com/amplify_video/2118289796053270528/vid/avc1/480x360/NH7IwVLQVlkf9n0t.mp4?tag=16>)", "html": "<p>Tibo 翻出十八年前 Dropbox 创始人录制的一段屏幕演示，称它是硅谷历史上最成功的发布视频。他说，这段视频让 Dropbox 的候补名单一夜间从 5000 人增长到 75000 人。</p>\n<p>在他看来，视频有效有五个原因：</p>\n<ol>\n<li>它展示了真实产品完成承诺的那件事：把文件放进一个文件夹，文件就会出现在另一台电脑上。</li>\n<li>视频中有许多目标受众才懂的内部笑话。</li>\n<li>创始人把视频发在用户已经聚集的地方：更早的版本发在 Hacker News，这个版本则发在 Digg。</li>\n<li>它解释了一个新概念，却没有使用术语。</li>\n<li>它让人看到了尚未开放使用的产品。Dropbox 当时还没向公众开放，视频先证明它能工作，之后由候补名单承接需求。</li>\n</ol>\n<p>Tibo 的建议是，当大家都在用 Claude 制作精致的视频时，也可以只录一段简单的屏幕演示。在他看来，这样反而会显得真实十倍。</p>\n<section class=\"rewrite-source-media\" aria-label=\"原文附带媒体\"><h3 class=\"source-media-heading\">原文附带媒体</h3><p class=\"completeness-note\">原文附带媒体；未核验其与具体段落的对应关系。</p><figure data-media-id=\"m_5a424bc471e1372e\"><video controls playsinline preload=\"none\" src=\"https://video.twimg.com/amplify_video/2118289796053270528/vid/avc1/480x360/NH7IwVLQVlkf9n0t.mp4?tag=16\" poster=\"https://pbs.twimg.com/amplify_video_thumb/2118289796053270528/img/CPvuvMCkuJt0y4QM.jpg\"></video><figcaption><a href=\"https://video.twimg.com/amplify_video/2118289796053270528/vid/avc1/480x360/NH7IwVLQVlkf9n0t.mp4?tag=16\">打开原始媒体 ↗</a></figcaption></figure></section>"}}]]></qiaomu:versions>
    </item>
    <item>
      <title>Anthropic：用 Claude 解析细菌 vault 颗粒的首个三维结构</title>
      <link>https://xnews.qiaomu.ai/a/anthropic-vault-claude</link>
      <guid isPermaLink="true">https://xnews.qiaomu.ai/a/anthropic-vault-claude</guid>
      <pubDate>Wed, 04 Nov 2026 20:11:28 +0000</pubDate>
      <author>Anthropic</author>
      <description><![CDATA[<p><em>团队称，原本需要数周到数月的结构解析缩短到了几天；过程中也出现了需要纠正的错误。</em></p>
<h2>乔木改写</h2>
<p>Anthropic 介绍，其生物学研究团队与 Claude 合作，解析了来自细菌生命的 vault 颗粒的首个三维结构。</p>
<p>Vault 颗粒呈桶状，是人体细胞中最大的蛋白质结构之一。Leonard Rome 和 Nancy Kedersha 于 1986 年发现了它，但它的功能至今仍不清楚。</p>
<p>此前，人们只知道动物、植物等复杂生物的细胞中存在 vault。团队这次证明，细菌以及感染细菌的病毒中的类似蛋白，也能组装成 vault。在这些更简单的生命形式中找到相应结构，可能有助于研究它在人类细胞中的作用。</p>
<p>Anthropic 将这一项目同时视为 AI 加速科学研究的潜力与局限的展示。团队估计，这次如果靠人工确定颗粒结构，原本需要数周到数月的细致工作，借助 Claude 则只用了几天。但 Claude 也犯了一些简单错误，生物学团队与机器学习研究人员合作处理了这些问题。</p>
<p>本站保存的是这份研究介绍；详细过程可见 <a href="https://www.anthropic.com/research/investigating-vault-particles-with-claude" target="_blank" rel="noopener noreferrer">Anthropic 的完整文章</a>。</p>

<h2>原文</h2>
<p><em>Investigating vault particles with Claude</em></p>
<p>We’re sharing how our biology research team worked with Claude to map the first 3D structure of a vault particle from bacterial life.</p>
<p>Vault particles are a longstanding mystery. They are barrel-shaped objects, among the largest protein structures found in our cells. They were first discovered by Leonard Rome and Nancy Kedersha in 1986, but their function remains unknown.</p>
<p>With Claude, we’ve found results that might bring us closer to solving that mystery.</p>
<p>Until now, vaults were only known in the cells of complex things like animals and plants. We have shown that similar proteins from bacteria (and the viruses that infect them) can also assemble into vaults. Finding the structures in these simpler forms of life may make it easier to investigate their function in our own cells.</p>
<p>For our life sciences team, the project was also a demonstration of the potential (and the limitations) of using AI to accelerate science.</p>
<p>In our full piece, we discuss how Claude was able to dramatically speed up some stages—manually determining the vault particle’s structure would have taken weeks to months of painstaking work, but here it took days. We also discuss how Claude made some simple mistakes along the way, and how we collaborated with our machine learning researchers to address them.</p>
<p>Read more: https://www.anthropic.com/research/investigating-vault-particles-with-claude</p>
<p><strong>原文链接：</strong><a href="https://x.com/AnthropicAI/status/2118073665296228863">https://x.com/AnthropicAI/status/2118073665296228863</a></p>
<p><strong>相关链接：</strong><a href="https://www.anthropic.com/research/investigating-vault-particles-with-claude">https://www.anthropic.com/research/investigating-vault-particles-with-claude</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>团队称，原本需要数周到数月的结构解析缩短到了几天；过程中也出现了需要纠正的错误。</em></p>
<h2>乔木改写</h2>
<p>Anthropic 介绍，其生物学研究团队与 Claude 合作，解析了来自细菌生命的 vault 颗粒的首个三维结构。</p>
<p>Vault 颗粒呈桶状，是人体细胞中最大的蛋白质结构之一。Leonard Rome 和 Nancy Kedersha 于 1986 年发现了它，但它的功能至今仍不清楚。</p>
<p>此前，人们只知道动物、植物等复杂生物的细胞中存在 vault。团队这次证明，细菌以及感染细菌的病毒中的类似蛋白，也能组装成 vault。在这些更简单的生命形式中找到相应结构，可能有助于研究它在人类细胞中的作用。</p>
<p>Anthropic 将这一项目同时视为 AI 加速科学研究的潜力与局限的展示。团队估计，这次如果靠人工确定颗粒结构，原本需要数周到数月的细致工作，借助 Claude 则只用了几天。但 Claude 也犯了一些简单错误，生物学团队与机器学习研究人员合作处理了这些问题。</p>
<p>本站保存的是这份研究介绍；详细过程可见 <a href="https://www.anthropic.com/research/investigating-vault-particles-with-claude" target="_blank" rel="noopener noreferrer">Anthropic 的完整文章</a>。</p>

<h2>原文</h2>
<p><em>Investigating vault particles with Claude</em></p>
<p>We’re sharing how our biology research team worked with Claude to map the first 3D structure of a vault particle from bacterial life.</p>
<p>Vault particles are a longstanding mystery. They are barrel-shaped objects, among the largest protein structures found in our cells. They were first discovered by Leonard Rome and Nancy Kedersha in 1986, but their function remains unknown.</p>
<p>With Claude, we’ve found results that might bring us closer to solving that mystery.</p>
<p>Until now, vaults were only known in the cells of complex things like animals and plants. We have shown that similar proteins from bacteria (and the viruses that infect them) can also assemble into vaults. Finding the structures in these simpler forms of life may make it easier to investigate their function in our own cells.</p>
<p>For our life sciences team, the project was also a demonstration of the potential (and the limitations) of using AI to accelerate science.</p>
<p>In our full piece, we discuss how Claude was able to dramatically speed up some stages—manually determining the vault particle’s structure would have taken weeks to months of painstaking work, but here it took days. We also discuss how Claude made some simple mistakes along the way, and how we collaborated with our machine learning researchers to address them.</p>
<p>Read more: https://www.anthropic.com/research/investigating-vault-particles-with-claude</p>
<p><strong>原文链接：</strong><a href="https://x.com/AnthropicAI/status/2118073665296228863">https://x.com/AnthropicAI/status/2118073665296228863</a></p>
<p><strong>相关链接：</strong><a href="https://www.anthropic.com/research/investigating-vault-particles-with-claude">https://www.anthropic.com/research/investigating-vault-particles-with-claude</a></p>]]></content:encoded>
      <qiaomu:versions><![CDATA[{"version": 1, "original": {"title": "Investigating vault particles with Claude", "url": "https://x.com/AnthropicAI/status/2118073665296228863", "lang": "en", "html": "<h2>Investigating vault particles with Claude</h2>\n\n<p>We’re sharing how our biology research team worked with Claude to map the first 3D structure of a vault particle from bacterial life.</p>\n<p>Vault particles are a longstanding mystery. They are barrel-shaped objects, among the largest protein structures found in our cells. They were first discovered by Leonard Rome and Nancy Kedersha in 1986, but their function remains unknown.</p>\n<p>With Claude, we’ve found results that might bring us closer to solving that mystery.</p>\n<p>Until now, vaults were only known in the cells of complex things like animals and plants. We have shown that similar proteins from bacteria (and the viruses that infect them) can also assemble into vaults. Finding the structures in these simpler forms of life may make it easier to investigate their function in our own cells.</p>\n<p>For our life sciences team, the project was also a demonstration of the potential (and the limitations) of using AI to accelerate science.</p>\n<p>In our full piece, we discuss how Claude was able to dramatically speed up some stages—manually determining the vault particle’s structure would have taken weeks to months of painstaking work, but here it took days. We also discuss how Claude made some simple mistakes along the way, and how we collaborated with our machine learning researchers to address them.</p>\n<p>Read more: https://www.anthropic.com/research/investigating-vault-particles-with-claude</p>\n<p>原文链接：<a href=\"https://x.com/AnthropicAI/status/2118073665296228863\">https://x.com/AnthropicAI/status/2118073665296228863</a></p>\n<p>相关链接：<a href=\"https://www.anthropic.com/research/investigating-vault-particles-with-claude\">https://www.anthropic.com/research/investigating-vault-particles-with-claude</a></p>"}, "rewrite": {"title": "Anthropic：用 Claude 解析细菌 vault 颗粒的首个三维结构", "markdown": "Anthropic 介绍，其生物学研究团队与 Claude 合作，解析了来自细菌生命的 vault 颗粒的首个三维结构。\n\nVault 颗粒呈桶状，是人体细胞中最大的蛋白质结构之一。Leonard Rome 和 Nancy Kedersha 于 1986 年发现了它，但它的功能至今仍不清楚。\n\n此前，人们只知道动物、植物等复杂生物的细胞中存在 vault。团队这次证明，细菌以及感染细菌的病毒中的类似蛋白，也能组装成 vault。在这些更简单的生命形式中找到相应结构，可能有助于研究它在人类细胞中的作用。\n\nAnthropic 将这一项目同时视为 AI 加速科学研究的潜力与局限的展示。团队估计，这次如果靠人工确定颗粒结构，原本需要数周到数月的细致工作，借助 Claude 则只用了几天。但 Claude 也犯了一些简单错误，生物学团队与机器学习研究人员合作处理了这些问题。\n\n本站保存的是这份研究介绍；详细过程可见 [Anthropic 的完整文章](https://www.anthropic.com/research/investigating-vault-particles-with-claude)。\n", "html": "<p>Anthropic 介绍，其生物学研究团队与 Claude 合作，解析了来自细菌生命的 vault 颗粒的首个三维结构。</p>\n<p>Vault 颗粒呈桶状，是人体细胞中最大的蛋白质结构之一。Leonard Rome 和 Nancy Kedersha 于 1986 年发现了它，但它的功能至今仍不清楚。</p>\n<p>此前，人们只知道动物、植物等复杂生物的细胞中存在 vault。团队这次证明，细菌以及感染细菌的病毒中的类似蛋白，也能组装成 vault。在这些更简单的生命形式中找到相应结构，可能有助于研究它在人类细胞中的作用。</p>\n<p>Anthropic 将这一项目同时视为 AI 加速科学研究的潜力与局限的展示。团队估计，这次如果靠人工确定颗粒结构，原本需要数周到数月的细致工作，借助 Claude 则只用了几天。但 Claude 也犯了一些简单错误，生物学团队与机器学习研究人员合作处理了这些问题。</p>\n<p>本站保存的是这份研究介绍；详细过程可见 <a href=\"https://www.anthropic.com/research/investigating-vault-particles-with-claude\" target=\"_blank\" rel=\"noopener noreferrer\">Anthropic 的完整文章</a>。</p>\n"}}]]></qiaomu:versions>
    </item>
    <item>
      <title>Sarah Guo 改变了看法：非工程师也想做自己的软件</title>
      <link>https://xnews.qiaomu.ai/a/sarah-guo-personal-software</link>
      <guid isPermaLink="true">https://xnews.qiaomu.ai/a/sarah-guo-personal-software</guid>
      <pubDate>Wed, 04 Nov 2026 18:48:27 +0000</pubDate>
      <author>Sarah Guo</author>
      <description><![CDATA[<p><em>她列了几种动机：动手做软件带来的力量感、没人替自己实现的工作流，以及想花几周修好的恼人问题。</em></p>
<h2>乔木改写</h2>
<p>几年前，Sarah Guo 怀疑是否真有很多非工程师想自己制作或修改个人软件。现在，她改变了看法，觉得自己当时想错了。</p>
<p>她列了几种人们想做个人软件的理由：</p>
<ul>
<li>自己也能做软件，感觉很有力量。</li>
<li>没人会替自己做出需要的工作流或个性化设置。</li>
<li>想当几周产品经理，修好那个一直让自己烦躁的地方。</li>
</ul>
<p>她回头看觉得，这其实不难理解：只要工具容易上手、能力又够强，人们当然会愿意做自己的软件。</p>

<h2>原文</h2>
<p><em>Non-engineers do want to make personal software</em></p>
<p>a few years ago, I started out skeptical that many non-engineers really wanted to make/mod their own personal software -- but I&#x27;ve come around, think I was wrong. range of desires from:</p>
<ul>
<li>I feel so powerful</li>
<li>no one will make me the workflow/personalization I need</li>
<li>can I just PM the product for a few weeks and fix this thing that is driving me crazy</li>
</ul>
<p>obvious in retrospect, but if the ease:power ratio is good enough, of course people will make their own software</p>
<p><strong>原文链接：</strong><a href="https://x.com/saranormous/status/2118052772637704376">https://x.com/saranormous/status/2118052772637704376</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>她列了几种动机：动手做软件带来的力量感、没人替自己实现的工作流，以及想花几周修好的恼人问题。</em></p>
<h2>乔木改写</h2>
<p>几年前，Sarah Guo 怀疑是否真有很多非工程师想自己制作或修改个人软件。现在，她改变了看法，觉得自己当时想错了。</p>
<p>她列了几种人们想做个人软件的理由：</p>
<ul>
<li>自己也能做软件，感觉很有力量。</li>
<li>没人会替自己做出需要的工作流或个性化设置。</li>
<li>想当几周产品经理，修好那个一直让自己烦躁的地方。</li>
</ul>
<p>她回头看觉得，这其实不难理解：只要工具容易上手、能力又够强，人们当然会愿意做自己的软件。</p>

<h2>原文</h2>
<p><em>Non-engineers do want to make personal software</em></p>
<p>a few years ago, I started out skeptical that many non-engineers really wanted to make/mod their own personal software -- but I&#x27;ve come around, think I was wrong. range of desires from:</p>
<ul>
<li>I feel so powerful</li>
<li>no one will make me the workflow/personalization I need</li>
<li>can I just PM the product for a few weeks and fix this thing that is driving me crazy</li>
</ul>
<p>obvious in retrospect, but if the ease:power ratio is good enough, of course people will make their own software</p>
<p><strong>原文链接：</strong><a href="https://x.com/saranormous/status/2118052772637704376">https://x.com/saranormous/status/2118052772637704376</a></p>]]></content:encoded>
      <qiaomu:versions><![CDATA[{"version": 1, "original": {"title": "Non-engineers do want to make personal software", "url": "https://x.com/saranormous/status/2118052772637704376", "lang": "en", "html": "<h2>Non-engineers do want to make personal software</h2>\n\n<p>a few years ago, I started out skeptical that many non-engineers really wanted to make/mod their own personal software -- but I&#x27;ve come around, think I was wrong. range of desires from:</p>\n<ul>\n<li>I feel so powerful</li>\n<li>no one will make me the workflow/personalization I need</li>\n<li>can I just PM the product for a few weeks and fix this thing that is driving me crazy</li>\n</ul>\n<p>obvious in retrospect, but if the ease:power ratio is good enough, of course people will make their own software</p>\n<p>原文链接：<a href=\"https://x.com/saranormous/status/2118052772637704376\">https://x.com/saranormous/status/2118052772637704376</a></p>"}, "rewrite": {"title": "Sarah Guo 改变了看法：非工程师也想做自己的软件", "markdown": "几年前，Sarah Guo 怀疑是否真有很多非工程师想自己制作或修改个人软件。现在，她改变了看法，觉得自己当时想错了。\n\n她列了几种人们想做个人软件的理由：\n\n- 自己也能做软件，感觉很有力量。\n- 没人会替自己做出需要的工作流或个性化设置。\n- 想当几周产品经理，修好那个一直让自己烦躁的地方。\n\n她回头看觉得，这其实不难理解：只要工具容易上手、能力又够强，人们当然会愿意做自己的软件。\n", "html": "<p>几年前，Sarah Guo 怀疑是否真有很多非工程师想自己制作或修改个人软件。现在，她改变了看法，觉得自己当时想错了。</p>\n<p>她列了几种人们想做个人软件的理由：</p>\n<ul>\n<li>自己也能做软件，感觉很有力量。</li>\n<li>没人会替自己做出需要的工作流或个性化设置。</li>\n<li>想当几周产品经理，修好那个一直让自己烦躁的地方。</li>\n</ul>\n<p>她回头看觉得，这其实不难理解：只要工具容易上手、能力又够强，人们当然会愿意做自己的软件。</p>\n"}}]]></qiaomu:versions>
    </item>
    <item>
      <title>Rauch：Vercel 内部的安全审计 Agent 已对外开放</title>
      <link>https://xnews.qiaomu.ai/a/rauchg-vercel-security-review</link>
      <guid isPermaLink="true">https://xnews.qiaomu.ai/a/rauchg-vercel-security-review</guid>
      <pubDate>Tue, 03 Nov 2026 21:45:04 +0000</pubDate>
      <author>Guillermo Rauch</author>
      <description><![CDATA[<p><em>Rauch 称，仓库无论是否托管在 Vercel，都可以启用与内部安全 Agent 相同的能力。</em></p>
<h2>乔木改写</h2>
<p>Guillermo Rauch 说，他一直期待 Vercel 的这次发布。公司内部有一个昵称为 <code>@𝚑𝚊𝚌𝚔𝚎𝚛</code> 的安全 Agent，每一行代码都会自动接受审计；他认为这个工具的效果非常出色。</p>
<p>现在，外部用户也能在自己的所有仓库中启用相同能力，无论项目是否托管在 Vercel。Rauch 表示，它能发现其他 Agent 遗漏的问题，让使用者更安心。</p>
<p>他给出的理由很具体：不能只指望工程师已经安装某个安全技能，也不能只在提示词里写一句请把代码写安全，更不能寄希望于模型第一次生成的代码就足够可靠。</p>
<p>这套产品完全由 Vercel 的安全团队开发。Rauch 推测，不少公司正在急着扩充安全人员；在他看来，如果希望把安全团队变成可以直接获得的软件，这已经是目前很接近的一种形式。</p>

<h2>原文</h2>
<p><em>Vercel internal security agent @hacker now available</em></p>
<p>I&#x27;ve been looking forward to this day, because Vercel has an internal security agent that is <strong>astonishingly effective</strong> (lovingly called @𝚑𝚊𝚌𝚔𝚎𝚛). Every single line of code gets audited, automatically.</p>
<p>You can now get the same power. Just enable it on all your repos (this product works whether you host on Vercel or not) and your peace of mind will increase tremendously. You&#x27;ll see it catch things that every other agent misses.</p>
<p>Why: you cannot just bank on your engineers having a skill installed, prompting &quot;please make secure&quot;, or rolling the weights&#x27; dice that the code is good out of the gate.</p>
<p>The other cool thing about this is that this was entirely developed by our security team. A lot of companies out there are probably in a mad rush right now trying to staff up. If you wanted to &#x27;download a security team&#x27; as software, this is the closest you get today.</p>
<p><strong>原文链接：</strong><a href="https://x.com/rauchg/status/2117734833824948373">https://x.com/rauchg/status/2117734833824948373</a></p>
<p><strong>相关链接：</strong><a href="https://vercel.com/blog/vercel-security-review">https://vercel.com/blog/vercel-security-review</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Rauch 称，仓库无论是否托管在 Vercel，都可以启用与内部安全 Agent 相同的能力。</em></p>
<h2>乔木改写</h2>
<p>Guillermo Rauch 说，他一直期待 Vercel 的这次发布。公司内部有一个昵称为 <code>@𝚑𝚊𝚌𝚔𝚎𝚛</code> 的安全 Agent，每一行代码都会自动接受审计；他认为这个工具的效果非常出色。</p>
<p>现在，外部用户也能在自己的所有仓库中启用相同能力，无论项目是否托管在 Vercel。Rauch 表示，它能发现其他 Agent 遗漏的问题，让使用者更安心。</p>
<p>他给出的理由很具体：不能只指望工程师已经安装某个安全技能，也不能只在提示词里写一句请把代码写安全，更不能寄希望于模型第一次生成的代码就足够可靠。</p>
<p>这套产品完全由 Vercel 的安全团队开发。Rauch 推测，不少公司正在急着扩充安全人员；在他看来，如果希望把安全团队变成可以直接获得的软件，这已经是目前很接近的一种形式。</p>

<h2>原文</h2>
<p><em>Vercel internal security agent @hacker now available</em></p>
<p>I&#x27;ve been looking forward to this day, because Vercel has an internal security agent that is <strong>astonishingly effective</strong> (lovingly called @𝚑𝚊𝚌𝚔𝚎𝚛). Every single line of code gets audited, automatically.</p>
<p>You can now get the same power. Just enable it on all your repos (this product works whether you host on Vercel or not) and your peace of mind will increase tremendously. You&#x27;ll see it catch things that every other agent misses.</p>
<p>Why: you cannot just bank on your engineers having a skill installed, prompting &quot;please make secure&quot;, or rolling the weights&#x27; dice that the code is good out of the gate.</p>
<p>The other cool thing about this is that this was entirely developed by our security team. A lot of companies out there are probably in a mad rush right now trying to staff up. If you wanted to &#x27;download a security team&#x27; as software, this is the closest you get today.</p>
<p><strong>原文链接：</strong><a href="https://x.com/rauchg/status/2117734833824948373">https://x.com/rauchg/status/2117734833824948373</a></p>
<p><strong>相关链接：</strong><a href="https://vercel.com/blog/vercel-security-review">https://vercel.com/blog/vercel-security-review</a></p>]]></content:encoded>
      <qiaomu:versions><![CDATA[{"version": 1, "original": {"title": "Vercel internal security agent @hacker now available", "url": "https://x.com/rauchg/status/2117734833824948373", "lang": "en", "html": "<h2>Vercel internal security agent @hacker now available</h2>\n\n<p>I&#x27;ve been looking forward to this day, because Vercel has an internal security agent that is <strong>astonishingly effective</strong> (lovingly called @𝚑𝚊𝚌𝚔𝚎𝚛). Every single line of code gets audited, automatically.</p>\n<p>You can now get the same power. Just enable it on all your repos (this product works whether you host on Vercel or not) and your peace of mind will increase tremendously. You&#x27;ll see it catch things that every other agent misses.</p>\n<p>Why: you cannot just bank on your engineers having a skill installed, prompting &quot;please make secure&quot;, or rolling the weights&#x27; dice that the code is good out of the gate.</p>\n<p>The other cool thing about this is that this was entirely developed by our security team. A lot of companies out there are probably in a mad rush right now trying to staff up. If you wanted to &#x27;download a security team&#x27; as software, this is the closest you get today.</p>\n<p>原文链接：<a href=\"https://x.com/rauchg/status/2117734833824948373\">https://x.com/rauchg/status/2117734833824948373</a></p>\n<p>相关链接：<a href=\"https://vercel.com/blog/vercel-security-review\">https://vercel.com/blog/vercel-security-review</a></p>"}, "rewrite": {"title": "Rauch：Vercel 内部的安全审计 Agent 已对外开放", "markdown": "Guillermo Rauch 说，他一直期待 Vercel 的这次发布。公司内部有一个昵称为 `@𝚑𝚊𝚌𝚔𝚎𝚛` 的安全 Agent，每一行代码都会自动接受审计；他认为这个工具的效果非常出色。\n\n现在，外部用户也能在自己的所有仓库中启用相同能力，无论项目是否托管在 Vercel。Rauch 表示，它能发现其他 Agent 遗漏的问题，让使用者更安心。\n\n他给出的理由很具体：不能只指望工程师已经安装某个安全技能，也不能只在提示词里写一句请把代码写安全，更不能寄希望于模型第一次生成的代码就足够可靠。\n\n这套产品完全由 Vercel 的安全团队开发。Rauch 推测，不少公司正在急着扩充安全人员；在他看来，如果希望把安全团队变成可以直接获得的软件，这已经是目前很接近的一种形式。\n", "html": "<p>Guillermo Rauch 说，他一直期待 Vercel 的这次发布。公司内部有一个昵称为 <code>@𝚑𝚊𝚌𝚔𝚎𝚛</code> 的安全 Agent，每一行代码都会自动接受审计；他认为这个工具的效果非常出色。</p>\n<p>现在，外部用户也能在自己的所有仓库中启用相同能力，无论项目是否托管在 Vercel。Rauch 表示，它能发现其他 Agent 遗漏的问题，让使用者更安心。</p>\n<p>他给出的理由很具体：不能只指望工程师已经安装某个安全技能，也不能只在提示词里写一句请把代码写安全，更不能寄希望于模型第一次生成的代码就足够可靠。</p>\n<p>这套产品完全由 Vercel 的安全团队开发。Rauch 推测，不少公司正在急着扩充安全人员；在他看来，如果希望把安全团队变成可以直接获得的软件，这已经是目前很接近的一种形式。</p>\n"}}]]></qiaomu:versions>
    </item>
    <item>
      <title>Slash 年化总收入达 5 亿美元，Victor 详述 SuperSMB 生意</title>
      <link>https://xnews.qiaomu.ai/a/victor-slash-supersmb</link>
      <guid isPermaLink="true">https://xnews.qiaomu.ai/a/victor-slash-supersmb</guid>
      <pubDate>Tue, 03 Nov 2026 21:24:49 +0000</pubDate>
      <author>Victor Cardenas</author>
      <description><![CDATA[<p><em>Victor Cardenas 列出客户的年龄、支出与团队规模，解释 Slash 如何获客、设计产品和定价。</em></p>
<h2>乔木改写</h2>
<p>Victor Cardenas 说，Slash 上个月的年化总收入超过了 5 亿美元，去年约为 1.5 亿美元，再前一年约为 5000 万美元。公司规模在扩大，增长也在加快，团队却不到 100 人。他写这篇文章时 25 岁。</p>
<p>他将 Slash 称为有史以来增长最快的金融科技公司之一，并把增长几乎全部归因于：比竞争对手更擅长为真正的 AI 原生创业者开发和销售产品。他用 100 倍来形容这种优势。</p>
<p>文章围绕三件事展开：SuperSMB 的兴起，如何找到并卖给这些客户，以及如何为他们做产品。SuperSMB 指的是团队非常精简、收入却很高的企业。</p>
<h3>SuperSMB 是什么样的公司</h3>
<p>Victor 认为，AI 正带来创业者数量的快速增长。他列出了几组数据：美国新设企业申请数在 2025 年约为 560 万份，比 2019 年的 350 万份增加约 60%；每隔 26 秒，就有一家 Shopify 商店获得第一笔销售；2025 年的 Stripe Atlas 创业公司在成立后头六个月的收入中位数，比 2024 年对应公司高 39%。在他看来，从零快速增长到数千万美元的现象已经不限于科技公司，其他行业的企业也在加速成长。</p>
<p>Slash 客户每月支出数十亿美元，平台上存放的资产也达到数十亿美元。Victor 用自家平台的数据描述这批创业者：</p>
<ul>
<li>他们很年轻。平台超过 88% 的资产来自创始人未满 35 岁的企业，这类企业也贡献了 72% 的支出。</li>
<li>他们常常同时经营多家公司。Slash 上 40% 的公司，其所属创业者在平台上还拥有至少另一家公司。</li>
<li>业务增长很快。每月经 Slash 流转的数十亿美元支出中，65% 来自过去三年、也就是 ChatGPT 推出后成立的公司，25% 来自过去十二个月成立的公司。</li>
<li>雇员很少。Slash 客户的中位画像是每月有数十万美元的卡支出，但只有几名员工。</li>
<li>他们来自世界各地。AI 与互联网让全球企业主都能向美国消费者和企业销售，越来越多创业者以美元做生意，Slash 为他们提供服务。</li>
</ul>
<p>Victor 相信，这批企业将在未来十年变得非常重要。他预测，到 2035 年，美国银行持有的企业存款中，超过一半会来自 ChatGPT 推出后才注册成立的公司。他认为，包括银行在内，今天不少主流产品并非为 AI 原生创业者设计，也跟不上他们的需求，因此为这一快速成长群体开发专门产品存在机会。</p>
<h3>怎样找到他们并完成销售</h3>
<p>Victor 看重 SuperSMB 同时具备的两项特点：公司收入可观，交易金额可以很大；没有复杂官僚层级，销售又能很快完成。他认为，这改变了传统 B2B 销售周期与年度合同价值之间的取舍：企业客户通常成交慢但金额高，普通中小企业成交快却金额小，SuperSMB 有机会兼得两者。</p>
<p>但这些公司并不好找。Slash 不用 Clay 或 ZoomInfo，也不做陌生电话销售或冷邮件。Victor 提出了三项做法：</p>
<ol>
<li>赢得客户信任，让客户带来转介。只靠 LinkedIn，很难找出哪些两到十人的团队已做到数千万美元收入；客户需要成为最好的销售者。</li>
<li>深入行业。加入重要群聊，关注关键论坛，参加会议。有些行业的 SuperSMB 明显更多，如果不成为行业专家，就会被甩在后面。</li>
<li>从第一天就让客户获得真人服务。不能按客户的员工数设置高级支持门槛；这批创业者一开始就需要受到重视。</li>
</ol>
<p>他还说，一个销售人员在一年里带来超过 1 亿美元收入是可能的，并举团队中的 <code>@nickbruhman</code> 和其他同事为例。</p>
<h3>怎样为 SuperSMB 做产品</h3>
<p>Victor 说，Slash 的每一部分产品都围绕 SuperSMB 设计，主要包括以下方向。</p>
<p><strong>从一开始就面向全球。</strong> 全球创业者可以用 Cursor 开发软件，通过 Shopify、Amazon 向美国消费者卖实物，再用 Meta 投广告，他因此质疑他们为什么还难以便捷地使用美元。Slash 将其美国市场标准的产品向全球互联网创业者开放，活跃客户已覆盖 40 多个国家。他建议，从第一天就把全球市场纳入设计。</p>
<p><strong>让 Agent 也能使用。</strong> 用户在 Slash 仪表盘上能完成的每一个动作，都可以通过 API 或 MCP 完成。Victor 认为，SuperSMB 是 API 和 MCP 的重度用户，并不想为了操作而登录界面，产品应允许他们通过 Agent 调用。</p>
<p><strong>理解行业。</strong> 营销代理机构、医疗美容机构、数据标注公司和批发商的财务流程、营运资金需求并不相同。Slash 为已进入的细分行业开发互补的专用工具；Victor 认为，这比横向通用产品能节省更多时间和资金。他判断，如今开发软件已经容易，缺乏行业差异化的产品很难成功，SuperSMB 期待的是面向自身行业的价值。</p>
<p><strong>尽量在一个平台解决完整需求。</strong> 企业主想把时间用于改进产品和获得客户，不想花时间管理后台事务。Slash 因此提供四类会计产品：开票、账单支付、费用管理和会计自动化；同时把支付处理、银行服务、稳定币支付、外汇和发卡放在同一平台，并提供多实体管理体验。</p>
<p>Victor 说，过去二十四个月，Slash 作为客户主要银行业务合作方的比例，从不足 20% 升至超过 80%。在他看来，这批客户希望少用工具而非多用工具，又倾向于自己开发；外部产品必须能一次解决很多问题，才值得考虑。Slash 希望为他们解决的是完整的财务需求。</p>
<p><strong>积极定价，靠降低内部成本增加利润。</strong> SuperSMB 经常没有外部融资，很在意盈利能力。Victor 认为，不能傲慢地假设自己的价格可以高于竞争对手。Slash 自身团队也很精简，因此能够提供有竞争力的费率；他的建议是通过降低内部成本增加利润，而不是向最终客户涨价。</p>
<h3>Slash 接下来要做什么</h3>
<p>Victor 将公司的目标描述为成为全球最受欢迎的企业银行业务平台。他说，这个使命很直接，但极难实现；公司正在招聘有抱负、愿意努力工作的人，有意者可以按原文地址 <code>victor @ slash . com</code> 联系。</p>
<p>原文特别注明：Slash 是金融科技公司，不是银行；银行服务由 FDIC 成员 Column N.A. 提供。</p>

<h2>原文</h2>
<p><em>Slash hit 500m annual revenue with 88 people. We invented a new playbook:</em></p>
<p>Last month, we crossed $500m in annualized gross revenue, up from roughly $150m last year and $50m the year before. Our business is getting larger, and our growth is accelerating. Slash is one of the fastest growing fintech companies of all time, and we have a team of under 100 people.</p>
<p>Our growth can be almost entirely attributed to the fact that we are 100x better at building for and selling to truly AI native entrepreneurs than our competitors. In this article I’m going to talk about three things that helped me build a half a billion dollar revenue business by 25: The rise of the “SuperSMB”, very lean companies with tons of revenue. How to find and sell to the “SuperSMB”. How to build product for the “SuperSMB”. Bookmark this, my promise is that this will be the MOST valuable read of your week.</p>
<p>THE RISE OF THE SUPER-SMB AI is causing a Cambrian explosion of entrepreneurs. In the last three years: U.S. business applications reached roughly 5.6 million in 2025, up about 60% from 3.5 million in 2019. Every 26 seconds, a Shopify store makes its first sale. The median Stripe Atlas startup generated 39% more revenue in its first six months in 2025 than its 2024 counterpart. The “fastest from $0 -&gt; $XXm” isn’t a phenomenon that’s restricted to tech companies. Businesses are growing faster in every sector of the economy. These entrepreneurs are young. Slash customers spend billions of dollars every month, and hold billions of dollars on platform: Over 88% of the assets on the Slash platform belong to businesses with founders under the age of 35. 72% of the spend on Slash is done by businesses with founders under the age of 35. These entrepreneurs start many businesses. 40% of the companies on Slash are owned by an entrepreneur that has at least more than one more business on the platform. Their businesses grow incredibly fast. 65% of the billions of dollars in spend that flow through the Slash platform every month come from businesses that were started in the last 3 years (post ChatGPT!), and 25% come from businesses that were started in the last 12 months. They don’t employ that many people. The median Slash customer spends hundreds of thousands a month on their card, but only has a few employees. And they’re from all over the world. AI and the internet have made it possible for business owners all over the world to sell to the US consumer and business. Entrepreneurs worldwide are increasingly doing business in dollars, and Slash is powering all of them. We believe they are going to be running the world in 10 years I predict that by 2035, over half of all the business deposits held in US banks will come from businesses incorporated post the launch of ChatGPT. The most popular products of today – including banks – were not built for, and cannot keep up with the AI native entrepreneur. You have a massive opportunity to build a product tailored to this ultra fast growing sector of the economy.</p>
<p>HOW TO SELL TO SUPER-SMBs Selling to SuperSMBs is a cheat code if you want your business to grow quickly. They are businesses that can both make you a lot of money (because they are big) and are fast to close (because they are not bureaucratic at all). This is unprecedented in the history of business. Typically, B2B companies had to trade off between sales cycle and ACV: Enterprises = take long to close, but make you a lot of cash. SMBs = faster to close, but don’t make you that much money. You do not have to make that tradeoff if you sell to SuperSMBs.</p>
<p>However, it is not that easy to find them. Slash does not use Clay or Zoominfo. Slash does not do any cold calling or cold emailing. Without giving away all of our secret sauce, you have to at least do these three things: Earn your customers’ trust so you can unlock referrals. You are going to have a brutal time trying to find which 2-10 person teams are doing multiple 8 figures in revenue by checking LinkedIn. Your customers need to be your best sales people. You need to be on the ground. Join every big group chat, stay on top of every important forum, and go to every conference. There are some industries with many more SuperSMBs than others. If you are not an industry expert, you will be left behind. Put a human in front of your customers. You cannot gate premium support to businesses with a certain amount of employees. You must roll out the red carpet for these entrepreneurs on day 0. It is physically possible for one salesperson to bring in &gt; $100m in revenue in a year. @nickbruhman and others on our team are living, breathing examples of that:</p>
<p>HOW TO BUILD FOR SUPER-SMBs Every part of the Slash product was engineered with SuperSMBs in mind. Build a global product from day 0 Entrepreneurs globally can use Cursor to create amazing software, Shopify/Amazon to sell physical goods to the US consumer, and Meta to advertise to them. So why can’t they easily access the dollar? Slash makes its American-caliber product available to internet entrepreneurs all over the world, and has active customers in over 40 countries. SuperSMBs are everywhere. Be global from day 1. Be agent ready Every action a user can perform via the Slash dashboard they can perform via our API or MCP. Nobody wants to log into your UI. SuperSMBs are API and MCP power users. Make your product available to them agentically. Be industry aware Marketing agencies, med spas, data labeling companies, and wholesalers all have different financial workflows, and different working capital needs. Slash builds bespoke, complementary tooling for all the niches it has a presence in, saving our customers much more time and money than our horizontal competitors. Making software is trivial now. Products with no industry differentiation will never make it. SuperSMBs expect you to deliver differentiated value for their niche. Be an all-in-one Business owners want to spend all of their time making their products better and getting more customers. They do not want to spend any time thinking about their back office. Slash eliminates the need for that by offering: 4 accounting products (invoicing, bill pay, expense management, accounting automation) Processing, banking*, stablecoin payments, FX, and issuing via one platform A delightful multi-entity experience. As a result, we’ve gone from being the primary banking partner for less than 20% of our customers to over 80% of them in the last 24 months. SuperSMBs want to consume less tools not more. They have a bias towards building, and so won’t consider your solution unless it solves a lot of their problems. In our case, they solve all of finance for them. Price aggressively SuperSMBs are often bootstrapped and care about profitability. Don’t be arrogant and think you can charge more than your competitors. Slash has some of the best rates out there, and we&#x27;re able to price so aggressively because we are a very lean company ourselves. Grow your profit by cutting your internal costs, not jacking up prices for your end user.</p>
<p>WHAT’S NEXT FOR SLASH We have a straightforward, but extremely difficult mission of becoming the most popular business banking platform in the world. If you’re ambitious, incredibly hard working, and want to help us build the world’s next great financial services business, we’re hiring. Email me at victor @ slash . com if interested.</p>
<ul>
<li>Slash is a financial technology company, not a bank. Banking services provided by Column N.A., Member FDIC.</li>
</ul>
<p><strong>原文链接：</strong><a href="https://x.com/victorcardenas/status/2117729738160496778">https://x.com/victorcardenas/status/2117729738160496778</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Victor Cardenas 列出客户的年龄、支出与团队规模，解释 Slash 如何获客、设计产品和定价。</em></p>
<h2>乔木改写</h2>
<p>Victor Cardenas 说，Slash 上个月的年化总收入超过了 5 亿美元，去年约为 1.5 亿美元，再前一年约为 5000 万美元。公司规模在扩大，增长也在加快，团队却不到 100 人。他写这篇文章时 25 岁。</p>
<p>他将 Slash 称为有史以来增长最快的金融科技公司之一，并把增长几乎全部归因于：比竞争对手更擅长为真正的 AI 原生创业者开发和销售产品。他用 100 倍来形容这种优势。</p>
<p>文章围绕三件事展开：SuperSMB 的兴起，如何找到并卖给这些客户，以及如何为他们做产品。SuperSMB 指的是团队非常精简、收入却很高的企业。</p>
<h3>SuperSMB 是什么样的公司</h3>
<p>Victor 认为，AI 正带来创业者数量的快速增长。他列出了几组数据：美国新设企业申请数在 2025 年约为 560 万份，比 2019 年的 350 万份增加约 60%；每隔 26 秒，就有一家 Shopify 商店获得第一笔销售；2025 年的 Stripe Atlas 创业公司在成立后头六个月的收入中位数，比 2024 年对应公司高 39%。在他看来，从零快速增长到数千万美元的现象已经不限于科技公司，其他行业的企业也在加速成长。</p>
<p>Slash 客户每月支出数十亿美元，平台上存放的资产也达到数十亿美元。Victor 用自家平台的数据描述这批创业者：</p>
<ul>
<li>他们很年轻。平台超过 88% 的资产来自创始人未满 35 岁的企业，这类企业也贡献了 72% 的支出。</li>
<li>他们常常同时经营多家公司。Slash 上 40% 的公司，其所属创业者在平台上还拥有至少另一家公司。</li>
<li>业务增长很快。每月经 Slash 流转的数十亿美元支出中，65% 来自过去三年、也就是 ChatGPT 推出后成立的公司，25% 来自过去十二个月成立的公司。</li>
<li>雇员很少。Slash 客户的中位画像是每月有数十万美元的卡支出，但只有几名员工。</li>
<li>他们来自世界各地。AI 与互联网让全球企业主都能向美国消费者和企业销售，越来越多创业者以美元做生意，Slash 为他们提供服务。</li>
</ul>
<p>Victor 相信，这批企业将在未来十年变得非常重要。他预测，到 2035 年，美国银行持有的企业存款中，超过一半会来自 ChatGPT 推出后才注册成立的公司。他认为，包括银行在内，今天不少主流产品并非为 AI 原生创业者设计，也跟不上他们的需求，因此为这一快速成长群体开发专门产品存在机会。</p>
<h3>怎样找到他们并完成销售</h3>
<p>Victor 看重 SuperSMB 同时具备的两项特点：公司收入可观，交易金额可以很大；没有复杂官僚层级，销售又能很快完成。他认为，这改变了传统 B2B 销售周期与年度合同价值之间的取舍：企业客户通常成交慢但金额高，普通中小企业成交快却金额小，SuperSMB 有机会兼得两者。</p>
<p>但这些公司并不好找。Slash 不用 Clay 或 ZoomInfo，也不做陌生电话销售或冷邮件。Victor 提出了三项做法：</p>
<ol>
<li>赢得客户信任，让客户带来转介。只靠 LinkedIn，很难找出哪些两到十人的团队已做到数千万美元收入；客户需要成为最好的销售者。</li>
<li>深入行业。加入重要群聊，关注关键论坛，参加会议。有些行业的 SuperSMB 明显更多，如果不成为行业专家，就会被甩在后面。</li>
<li>从第一天就让客户获得真人服务。不能按客户的员工数设置高级支持门槛；这批创业者一开始就需要受到重视。</li>
</ol>
<p>他还说，一个销售人员在一年里带来超过 1 亿美元收入是可能的，并举团队中的 <code>@nickbruhman</code> 和其他同事为例。</p>
<h3>怎样为 SuperSMB 做产品</h3>
<p>Victor 说，Slash 的每一部分产品都围绕 SuperSMB 设计，主要包括以下方向。</p>
<p><strong>从一开始就面向全球。</strong> 全球创业者可以用 Cursor 开发软件，通过 Shopify、Amazon 向美国消费者卖实物，再用 Meta 投广告，他因此质疑他们为什么还难以便捷地使用美元。Slash 将其美国市场标准的产品向全球互联网创业者开放，活跃客户已覆盖 40 多个国家。他建议，从第一天就把全球市场纳入设计。</p>
<p><strong>让 Agent 也能使用。</strong> 用户在 Slash 仪表盘上能完成的每一个动作，都可以通过 API 或 MCP 完成。Victor 认为，SuperSMB 是 API 和 MCP 的重度用户，并不想为了操作而登录界面，产品应允许他们通过 Agent 调用。</p>
<p><strong>理解行业。</strong> 营销代理机构、医疗美容机构、数据标注公司和批发商的财务流程、营运资金需求并不相同。Slash 为已进入的细分行业开发互补的专用工具；Victor 认为，这比横向通用产品能节省更多时间和资金。他判断，如今开发软件已经容易，缺乏行业差异化的产品很难成功，SuperSMB 期待的是面向自身行业的价值。</p>
<p><strong>尽量在一个平台解决完整需求。</strong> 企业主想把时间用于改进产品和获得客户，不想花时间管理后台事务。Slash 因此提供四类会计产品：开票、账单支付、费用管理和会计自动化；同时把支付处理、银行服务、稳定币支付、外汇和发卡放在同一平台，并提供多实体管理体验。</p>
<p>Victor 说，过去二十四个月，Slash 作为客户主要银行业务合作方的比例，从不足 20% 升至超过 80%。在他看来，这批客户希望少用工具而非多用工具，又倾向于自己开发；外部产品必须能一次解决很多问题，才值得考虑。Slash 希望为他们解决的是完整的财务需求。</p>
<p><strong>积极定价，靠降低内部成本增加利润。</strong> SuperSMB 经常没有外部融资，很在意盈利能力。Victor 认为，不能傲慢地假设自己的价格可以高于竞争对手。Slash 自身团队也很精简，因此能够提供有竞争力的费率；他的建议是通过降低内部成本增加利润，而不是向最终客户涨价。</p>
<h3>Slash 接下来要做什么</h3>
<p>Victor 将公司的目标描述为成为全球最受欢迎的企业银行业务平台。他说，这个使命很直接，但极难实现；公司正在招聘有抱负、愿意努力工作的人，有意者可以按原文地址 <code>victor @ slash . com</code> 联系。</p>
<p>原文特别注明：Slash 是金融科技公司，不是银行；银行服务由 FDIC 成员 Column N.A. 提供。</p>

<h2>原文</h2>
<p><em>Slash hit 500m annual revenue with 88 people. We invented a new playbook:</em></p>
<p>Last month, we crossed $500m in annualized gross revenue, up from roughly $150m last year and $50m the year before. Our business is getting larger, and our growth is accelerating. Slash is one of the fastest growing fintech companies of all time, and we have a team of under 100 people.</p>
<p>Our growth can be almost entirely attributed to the fact that we are 100x better at building for and selling to truly AI native entrepreneurs than our competitors. In this article I’m going to talk about three things that helped me build a half a billion dollar revenue business by 25: The rise of the “SuperSMB”, very lean companies with tons of revenue. How to find and sell to the “SuperSMB”. How to build product for the “SuperSMB”. Bookmark this, my promise is that this will be the MOST valuable read of your week.</p>
<p>THE RISE OF THE SUPER-SMB AI is causing a Cambrian explosion of entrepreneurs. In the last three years: U.S. business applications reached roughly 5.6 million in 2025, up about 60% from 3.5 million in 2019. Every 26 seconds, a Shopify store makes its first sale. The median Stripe Atlas startup generated 39% more revenue in its first six months in 2025 than its 2024 counterpart. The “fastest from $0 -&gt; $XXm” isn’t a phenomenon that’s restricted to tech companies. Businesses are growing faster in every sector of the economy. These entrepreneurs are young. Slash customers spend billions of dollars every month, and hold billions of dollars on platform: Over 88% of the assets on the Slash platform belong to businesses with founders under the age of 35. 72% of the spend on Slash is done by businesses with founders under the age of 35. These entrepreneurs start many businesses. 40% of the companies on Slash are owned by an entrepreneur that has at least more than one more business on the platform. Their businesses grow incredibly fast. 65% of the billions of dollars in spend that flow through the Slash platform every month come from businesses that were started in the last 3 years (post ChatGPT!), and 25% come from businesses that were started in the last 12 months. They don’t employ that many people. The median Slash customer spends hundreds of thousands a month on their card, but only has a few employees. And they’re from all over the world. AI and the internet have made it possible for business owners all over the world to sell to the US consumer and business. Entrepreneurs worldwide are increasingly doing business in dollars, and Slash is powering all of them. We believe they are going to be running the world in 10 years I predict that by 2035, over half of all the business deposits held in US banks will come from businesses incorporated post the launch of ChatGPT. The most popular products of today – including banks – were not built for, and cannot keep up with the AI native entrepreneur. You have a massive opportunity to build a product tailored to this ultra fast growing sector of the economy.</p>
<p>HOW TO SELL TO SUPER-SMBs Selling to SuperSMBs is a cheat code if you want your business to grow quickly. They are businesses that can both make you a lot of money (because they are big) and are fast to close (because they are not bureaucratic at all). This is unprecedented in the history of business. Typically, B2B companies had to trade off between sales cycle and ACV: Enterprises = take long to close, but make you a lot of cash. SMBs = faster to close, but don’t make you that much money. You do not have to make that tradeoff if you sell to SuperSMBs.</p>
<p>However, it is not that easy to find them. Slash does not use Clay or Zoominfo. Slash does not do any cold calling or cold emailing. Without giving away all of our secret sauce, you have to at least do these three things: Earn your customers’ trust so you can unlock referrals. You are going to have a brutal time trying to find which 2-10 person teams are doing multiple 8 figures in revenue by checking LinkedIn. Your customers need to be your best sales people. You need to be on the ground. Join every big group chat, stay on top of every important forum, and go to every conference. There are some industries with many more SuperSMBs than others. If you are not an industry expert, you will be left behind. Put a human in front of your customers. You cannot gate premium support to businesses with a certain amount of employees. You must roll out the red carpet for these entrepreneurs on day 0. It is physically possible for one salesperson to bring in &gt; $100m in revenue in a year. @nickbruhman and others on our team are living, breathing examples of that:</p>
<p>HOW TO BUILD FOR SUPER-SMBs Every part of the Slash product was engineered with SuperSMBs in mind. Build a global product from day 0 Entrepreneurs globally can use Cursor to create amazing software, Shopify/Amazon to sell physical goods to the US consumer, and Meta to advertise to them. So why can’t they easily access the dollar? Slash makes its American-caliber product available to internet entrepreneurs all over the world, and has active customers in over 40 countries. SuperSMBs are everywhere. Be global from day 1. Be agent ready Every action a user can perform via the Slash dashboard they can perform via our API or MCP. Nobody wants to log into your UI. SuperSMBs are API and MCP power users. Make your product available to them agentically. Be industry aware Marketing agencies, med spas, data labeling companies, and wholesalers all have different financial workflows, and different working capital needs. Slash builds bespoke, complementary tooling for all the niches it has a presence in, saving our customers much more time and money than our horizontal competitors. Making software is trivial now. Products with no industry differentiation will never make it. SuperSMBs expect you to deliver differentiated value for their niche. Be an all-in-one Business owners want to spend all of their time making their products better and getting more customers. They do not want to spend any time thinking about their back office. Slash eliminates the need for that by offering: 4 accounting products (invoicing, bill pay, expense management, accounting automation) Processing, banking*, stablecoin payments, FX, and issuing via one platform A delightful multi-entity experience. As a result, we’ve gone from being the primary banking partner for less than 20% of our customers to over 80% of them in the last 24 months. SuperSMBs want to consume less tools not more. They have a bias towards building, and so won’t consider your solution unless it solves a lot of their problems. In our case, they solve all of finance for them. Price aggressively SuperSMBs are often bootstrapped and care about profitability. Don’t be arrogant and think you can charge more than your competitors. Slash has some of the best rates out there, and we&#x27;re able to price so aggressively because we are a very lean company ourselves. Grow your profit by cutting your internal costs, not jacking up prices for your end user.</p>
<p>WHAT’S NEXT FOR SLASH We have a straightforward, but extremely difficult mission of becoming the most popular business banking platform in the world. If you’re ambitious, incredibly hard working, and want to help us build the world’s next great financial services business, we’re hiring. Email me at victor @ slash . com if interested.</p>
<ul>
<li>Slash is a financial technology company, not a bank. Banking services provided by Column N.A., Member FDIC.</li>
</ul>
<p><strong>原文链接：</strong><a href="https://x.com/victorcardenas/status/2117729738160496778">https://x.com/victorcardenas/status/2117729738160496778</a></p>]]></content:encoded>
      <qiaomu:versions><![CDATA[{"version": 1, "original": {"title": "Slash hit 500m annual revenue with 88 people. We invented a new playbook:", "url": "https://x.com/victorcardenas/status/2117729738160496778", "lang": "en", "html": "<h2>Slash hit 500m annual revenue with 88 people. We invented a new playbook:</h2>\n\n<p>Last month, we crossed $500m in annualized gross revenue, up from roughly $150m last year and $50m the year before. Our business is getting larger, and our growth is accelerating. Slash is one of the fastest growing fintech companies of all time, and we have a team of under 100 people.</p>\n<p>Our growth can be almost entirely attributed to the fact that we are 100x better at building for and selling to truly AI native entrepreneurs than our competitors. In this article I’m going to talk about three things that helped me build a half a billion dollar revenue business by 25: The rise of the “SuperSMB”, very lean companies with tons of revenue. How to find and sell to the “SuperSMB”. How to build product for the “SuperSMB”. Bookmark this, my promise is that this will be the MOST valuable read of your week.</p>\n<p>THE RISE OF THE SUPER-SMB AI is causing a Cambrian explosion of entrepreneurs. In the last three years: U.S. business applications reached roughly 5.6 million in 2025, up about 60% from 3.5 million in 2019. Every 26 seconds, a Shopify store makes its first sale. The median Stripe Atlas startup generated 39% more revenue in its first six months in 2025 than its 2024 counterpart. The “fastest from $0 -&gt; $XXm” isn’t a phenomenon that’s restricted to tech companies. Businesses are growing faster in every sector of the economy. These entrepreneurs are young. Slash customers spend billions of dollars every month, and hold billions of dollars on platform: Over 88% of the assets on the Slash platform belong to businesses with founders under the age of 35. 72% of the spend on Slash is done by businesses with founders under the age of 35. These entrepreneurs start many businesses. 40% of the companies on Slash are owned by an entrepreneur that has at least more than one more business on the platform. Their businesses grow incredibly fast. 65% of the billions of dollars in spend that flow through the Slash platform every month come from businesses that were started in the last 3 years (post ChatGPT!), and 25% come from businesses that were started in the last 12 months. They don’t employ that many people. The median Slash customer spends hundreds of thousands a month on their card, but only has a few employees. And they’re from all over the world. AI and the internet have made it possible for business owners all over the world to sell to the US consumer and business. Entrepreneurs worldwide are increasingly doing business in dollars, and Slash is powering all of them. We believe they are going to be running the world in 10 years I predict that by 2035, over half of all the business deposits held in US banks will come from businesses incorporated post the launch of ChatGPT. The most popular products of today – including banks – were not built for, and cannot keep up with the AI native entrepreneur. You have a massive opportunity to build a product tailored to this ultra fast growing sector of the economy.</p>\n<p>HOW TO SELL TO SUPER-SMBs Selling to SuperSMBs is a cheat code if you want your business to grow quickly. They are businesses that can both make you a lot of money (because they are big) and are fast to close (because they are not bureaucratic at all). This is unprecedented in the history of business. Typically, B2B companies had to trade off between sales cycle and ACV: Enterprises = take long to close, but make you a lot of cash. SMBs = faster to close, but don’t make you that much money. You do not have to make that tradeoff if you sell to SuperSMBs.</p>\n<p>However, it is not that easy to find them. Slash does not use Clay or Zoominfo. Slash does not do any cold calling or cold emailing. Without giving away all of our secret sauce, you have to at least do these three things: Earn your customers’ trust so you can unlock referrals. You are going to have a brutal time trying to find which 2-10 person teams are doing multiple 8 figures in revenue by checking LinkedIn. Your customers need to be your best sales people. You need to be on the ground. Join every big group chat, stay on top of every important forum, and go to every conference. There are some industries with many more SuperSMBs than others. If you are not an industry expert, you will be left behind. Put a human in front of your customers. You cannot gate premium support to businesses with a certain amount of employees. You must roll out the red carpet for these entrepreneurs on day 0. It is physically possible for one salesperson to bring in &gt; $100m in revenue in a year. @nickbruhman and others on our team are living, breathing examples of that:</p>\n<p>HOW TO BUILD FOR SUPER-SMBs Every part of the Slash product was engineered with SuperSMBs in mind. Build a global product from day 0 Entrepreneurs globally can use Cursor to create amazing software, Shopify/Amazon to sell physical goods to the US consumer, and Meta to advertise to them. So why can’t they easily access the dollar? Slash makes its American-caliber product available to internet entrepreneurs all over the world, and has active customers in over 40 countries. SuperSMBs are everywhere. Be global from day 1. Be agent ready Every action a user can perform via the Slash dashboard they can perform via our API or MCP. Nobody wants to log into your UI. SuperSMBs are API and MCP power users. Make your product available to them agentically. Be industry aware Marketing agencies, med spas, data labeling companies, and wholesalers all have different financial workflows, and different working capital needs. Slash builds bespoke, complementary tooling for all the niches it has a presence in, saving our customers much more time and money than our horizontal competitors. Making software is trivial now. Products with no industry differentiation will never make it. SuperSMBs expect you to deliver differentiated value for their niche. Be an all-in-one Business owners want to spend all of their time making their products better and getting more customers. They do not want to spend any time thinking about their back office. Slash eliminates the need for that by offering: 4 accounting products (invoicing, bill pay, expense management, accounting automation) Processing, banking*, stablecoin payments, FX, and issuing via one platform A delightful multi-entity experience. As a result, we’ve gone from being the primary banking partner for less than 20% of our customers to over 80% of them in the last 24 months. SuperSMBs want to consume less tools not more. They have a bias towards building, and so won’t consider your solution unless it solves a lot of their problems. In our case, they solve all of finance for them. Price aggressively SuperSMBs are often bootstrapped and care about profitability. Don’t be arrogant and think you can charge more than your competitors. Slash has some of the best rates out there, and we&#x27;re able to price so aggressively because we are a very lean company ourselves. Grow your profit by cutting your internal costs, not jacking up prices for your end user.</p>\n<p>WHAT’S NEXT FOR SLASH We have a straightforward, but extremely difficult mission of becoming the most popular business banking platform in the world. If you’re ambitious, incredibly hard working, and want to help us build the world’s next great financial services business, we’re hiring. Email me at victor @ slash . com if interested.</p>\n<ul>\n<li>Slash is a financial technology company, not a bank. Banking services provided by Column N.A., Member FDIC.</li>\n</ul>\n<p>原文链接：<a href=\"https://x.com/victorcardenas/status/2117729738160496778\">https://x.com/victorcardenas/status/2117729738160496778</a></p>"}, "rewrite": {"title": "Slash 年化总收入达 5 亿美元，Victor 详述 SuperSMB 生意", "markdown": "Victor Cardenas 说，Slash 上个月的年化总收入超过了 5 亿美元，去年约为 1.5 亿美元，再前一年约为 5000 万美元。公司规模在扩大，增长也在加快，团队却不到 100 人。他写这篇文章时 25 岁。\n\n他将 Slash 称为有史以来增长最快的金融科技公司之一，并把增长几乎全部归因于：比竞争对手更擅长为真正的 AI 原生创业者开发和销售产品。他用 100 倍来形容这种优势。\n\n文章围绕三件事展开：SuperSMB 的兴起，如何找到并卖给这些客户，以及如何为他们做产品。SuperSMB 指的是团队非常精简、收入却很高的企业。\n\n### SuperSMB 是什么样的公司\n\nVictor 认为，AI 正带来创业者数量的快速增长。他列出了几组数据：美国新设企业申请数在 2025 年约为 560 万份，比 2019 年的 350 万份增加约 60%；每隔 26 秒，就有一家 Shopify 商店获得第一笔销售；2025 年的 Stripe Atlas 创业公司在成立后头六个月的收入中位数，比 2024 年对应公司高 39%。在他看来，从零快速增长到数千万美元的现象已经不限于科技公司，其他行业的企业也在加速成长。\n\nSlash 客户每月支出数十亿美元，平台上存放的资产也达到数十亿美元。Victor 用自家平台的数据描述这批创业者：\n\n- 他们很年轻。平台超过 88% 的资产来自创始人未满 35 岁的企业，这类企业也贡献了 72% 的支出。\n- 他们常常同时经营多家公司。Slash 上 40% 的公司，其所属创业者在平台上还拥有至少另一家公司。\n- 业务增长很快。每月经 Slash 流转的数十亿美元支出中，65% 来自过去三年、也就是 ChatGPT 推出后成立的公司，25% 来自过去十二个月成立的公司。\n- 雇员很少。Slash 客户的中位画像是每月有数十万美元的卡支出，但只有几名员工。\n- 他们来自世界各地。AI 与互联网让全球企业主都能向美国消费者和企业销售，越来越多创业者以美元做生意，Slash 为他们提供服务。\n\nVictor 相信，这批企业将在未来十年变得非常重要。他预测，到 2035 年，美国银行持有的企业存款中，超过一半会来自 ChatGPT 推出后才注册成立的公司。他认为，包括银行在内，今天不少主流产品并非为 AI 原生创业者设计，也跟不上他们的需求，因此为这一快速成长群体开发专门产品存在机会。\n\n### 怎样找到他们并完成销售\n\nVictor 看重 SuperSMB 同时具备的两项特点：公司收入可观，交易金额可以很大；没有复杂官僚层级，销售又能很快完成。他认为，这改变了传统 B2B 销售周期与年度合同价值之间的取舍：企业客户通常成交慢但金额高，普通中小企业成交快却金额小，SuperSMB 有机会兼得两者。\n\n但这些公司并不好找。Slash 不用 Clay 或 ZoomInfo，也不做陌生电话销售或冷邮件。Victor 提出了三项做法：\n\n1. 赢得客户信任，让客户带来转介。只靠 LinkedIn，很难找出哪些两到十人的团队已做到数千万美元收入；客户需要成为最好的销售者。\n2. 深入行业。加入重要群聊，关注关键论坛，参加会议。有些行业的 SuperSMB 明显更多，如果不成为行业专家，就会被甩在后面。\n3. 从第一天就让客户获得真人服务。不能按客户的员工数设置高级支持门槛；这批创业者一开始就需要受到重视。\n\n他还说，一个销售人员在一年里带来超过 1 亿美元收入是可能的，并举团队中的 `@nickbruhman` 和其他同事为例。\n\n### 怎样为 SuperSMB 做产品\n\nVictor 说，Slash 的每一部分产品都围绕 SuperSMB 设计，主要包括以下方向。\n\n**从一开始就面向全球。** 全球创业者可以用 Cursor 开发软件，通过 Shopify、Amazon 向美国消费者卖实物，再用 Meta 投广告，他因此质疑他们为什么还难以便捷地使用美元。Slash 将其美国市场标准的产品向全球互联网创业者开放，活跃客户已覆盖 40 多个国家。他建议，从第一天就把全球市场纳入设计。\n\n**让 Agent 也能使用。** 用户在 Slash 仪表盘上能完成的每一个动作，都可以通过 API 或 MCP 完成。Victor 认为，SuperSMB 是 API 和 MCP 的重度用户，并不想为了操作而登录界面，产品应允许他们通过 Agent 调用。\n\n**理解行业。** 营销代理机构、医疗美容机构、数据标注公司和批发商的财务流程、营运资金需求并不相同。Slash 为已进入的细分行业开发互补的专用工具；Victor 认为，这比横向通用产品能节省更多时间和资金。他判断，如今开发软件已经容易，缺乏行业差异化的产品很难成功，SuperSMB 期待的是面向自身行业的价值。\n\n**尽量在一个平台解决完整需求。** 企业主想把时间用于改进产品和获得客户，不想花时间管理后台事务。Slash 因此提供四类会计产品：开票、账单支付、费用管理和会计自动化；同时把支付处理、银行服务、稳定币支付、外汇和发卡放在同一平台，并提供多实体管理体验。\n\nVictor 说，过去二十四个月，Slash 作为客户主要银行业务合作方的比例，从不足 20% 升至超过 80%。在他看来，这批客户希望少用工具而非多用工具，又倾向于自己开发；外部产品必须能一次解决很多问题，才值得考虑。Slash 希望为他们解决的是完整的财务需求。\n\n**积极定价，靠降低内部成本增加利润。** SuperSMB 经常没有外部融资，很在意盈利能力。Victor 认为，不能傲慢地假设自己的价格可以高于竞争对手。Slash 自身团队也很精简，因此能够提供有竞争力的费率；他的建议是通过降低内部成本增加利润，而不是向最终客户涨价。\n\n### Slash 接下来要做什么\n\nVictor 将公司的目标描述为成为全球最受欢迎的企业银行业务平台。他说，这个使命很直接，但极难实现；公司正在招聘有抱负、愿意努力工作的人，有意者可以按原文地址 `victor @ slash . com` 联系。\n\n原文特别注明：Slash 是金融科技公司，不是银行；银行服务由 FDIC 成员 Column N.A. 提供。\n", "html": "<p>Victor Cardenas 说，Slash 上个月的年化总收入超过了 5 亿美元，去年约为 1.5 亿美元，再前一年约为 5000 万美元。公司规模在扩大，增长也在加快，团队却不到 100 人。他写这篇文章时 25 岁。</p>\n<p>他将 Slash 称为有史以来增长最快的金融科技公司之一，并把增长几乎全部归因于：比竞争对手更擅长为真正的 AI 原生创业者开发和销售产品。他用 100 倍来形容这种优势。</p>\n<p>文章围绕三件事展开：SuperSMB 的兴起，如何找到并卖给这些客户，以及如何为他们做产品。SuperSMB 指的是团队非常精简、收入却很高的企业。</p>\n<h3>SuperSMB 是什么样的公司</h3>\n<p>Victor 认为，AI 正带来创业者数量的快速增长。他列出了几组数据：美国新设企业申请数在 2025 年约为 560 万份，比 2019 年的 350 万份增加约 60%；每隔 26 秒，就有一家 Shopify 商店获得第一笔销售；2025 年的 Stripe Atlas 创业公司在成立后头六个月的收入中位数，比 2024 年对应公司高 39%。在他看来，从零快速增长到数千万美元的现象已经不限于科技公司，其他行业的企业也在加速成长。</p>\n<p>Slash 客户每月支出数十亿美元，平台上存放的资产也达到数十亿美元。Victor 用自家平台的数据描述这批创业者：</p>\n<ul>\n<li>他们很年轻。平台超过 88% 的资产来自创始人未满 35 岁的企业，这类企业也贡献了 72% 的支出。</li>\n<li>他们常常同时经营多家公司。Slash 上 40% 的公司，其所属创业者在平台上还拥有至少另一家公司。</li>\n<li>业务增长很快。每月经 Slash 流转的数十亿美元支出中，65% 来自过去三年、也就是 ChatGPT 推出后成立的公司，25% 来自过去十二个月成立的公司。</li>\n<li>雇员很少。Slash 客户的中位画像是每月有数十万美元的卡支出，但只有几名员工。</li>\n<li>他们来自世界各地。AI 与互联网让全球企业主都能向美国消费者和企业销售，越来越多创业者以美元做生意，Slash 为他们提供服务。</li>\n</ul>\n<p>Victor 相信，这批企业将在未来十年变得非常重要。他预测，到 2035 年，美国银行持有的企业存款中，超过一半会来自 ChatGPT 推出后才注册成立的公司。他认为，包括银行在内，今天不少主流产品并非为 AI 原生创业者设计，也跟不上他们的需求，因此为这一快速成长群体开发专门产品存在机会。</p>\n<h3>怎样找到他们并完成销售</h3>\n<p>Victor 看重 SuperSMB 同时具备的两项特点：公司收入可观，交易金额可以很大；没有复杂官僚层级，销售又能很快完成。他认为，这改变了传统 B2B 销售周期与年度合同价值之间的取舍：企业客户通常成交慢但金额高，普通中小企业成交快却金额小，SuperSMB 有机会兼得两者。</p>\n<p>但这些公司并不好找。Slash 不用 Clay 或 ZoomInfo，也不做陌生电话销售或冷邮件。Victor 提出了三项做法：</p>\n<ol>\n<li>赢得客户信任，让客户带来转介。只靠 LinkedIn，很难找出哪些两到十人的团队已做到数千万美元收入；客户需要成为最好的销售者。</li>\n<li>深入行业。加入重要群聊，关注关键论坛，参加会议。有些行业的 SuperSMB 明显更多，如果不成为行业专家，就会被甩在后面。</li>\n<li>从第一天就让客户获得真人服务。不能按客户的员工数设置高级支持门槛；这批创业者一开始就需要受到重视。</li>\n</ol>\n<p>他还说，一个销售人员在一年里带来超过 1 亿美元收入是可能的，并举团队中的 <code>@nickbruhman</code> 和其他同事为例。</p>\n<h3>怎样为 SuperSMB 做产品</h3>\n<p>Victor 说，Slash 的每一部分产品都围绕 SuperSMB 设计，主要包括以下方向。</p>\n<p><strong>从一开始就面向全球。</strong> 全球创业者可以用 Cursor 开发软件，通过 Shopify、Amazon 向美国消费者卖实物，再用 Meta 投广告，他因此质疑他们为什么还难以便捷地使用美元。Slash 将其美国市场标准的产品向全球互联网创业者开放，活跃客户已覆盖 40 多个国家。他建议，从第一天就把全球市场纳入设计。</p>\n<p><strong>让 Agent 也能使用。</strong> 用户在 Slash 仪表盘上能完成的每一个动作，都可以通过 API 或 MCP 完成。Victor 认为，SuperSMB 是 API 和 MCP 的重度用户，并不想为了操作而登录界面，产品应允许他们通过 Agent 调用。</p>\n<p><strong>理解行业。</strong> 营销代理机构、医疗美容机构、数据标注公司和批发商的财务流程、营运资金需求并不相同。Slash 为已进入的细分行业开发互补的专用工具；Victor 认为，这比横向通用产品能节省更多时间和资金。他判断，如今开发软件已经容易，缺乏行业差异化的产品很难成功，SuperSMB 期待的是面向自身行业的价值。</p>\n<p><strong>尽量在一个平台解决完整需求。</strong> 企业主想把时间用于改进产品和获得客户，不想花时间管理后台事务。Slash 因此提供四类会计产品：开票、账单支付、费用管理和会计自动化；同时把支付处理、银行服务、稳定币支付、外汇和发卡放在同一平台，并提供多实体管理体验。</p>\n<p>Victor 说，过去二十四个月，Slash 作为客户主要银行业务合作方的比例，从不足 20% 升至超过 80%。在他看来，这批客户希望少用工具而非多用工具，又倾向于自己开发；外部产品必须能一次解决很多问题，才值得考虑。Slash 希望为他们解决的是完整的财务需求。</p>\n<p><strong>积极定价，靠降低内部成本增加利润。</strong> SuperSMB 经常没有外部融资，很在意盈利能力。Victor 认为，不能傲慢地假设自己的价格可以高于竞争对手。Slash 自身团队也很精简，因此能够提供有竞争力的费率；他的建议是通过降低内部成本增加利润，而不是向最终客户涨价。</p>\n<h3>Slash 接下来要做什么</h3>\n<p>Victor 将公司的目标描述为成为全球最受欢迎的企业银行业务平台。他说，这个使命很直接，但极难实现；公司正在招聘有抱负、愿意努力工作的人，有意者可以按原文地址 <code>victor @ slash . com</code> 联系。</p>\n<p>原文特别注明：Slash 是金融科技公司，不是银行；银行服务由 FDIC 成员 Column N.A. 提供。</p>\n"}}]]></qiaomu:versions>
    </item>
    <item>
      <title>Levelsio：常规业务开销降到约 $300/月，不含 Photo AI</title>
      <link>https://xnews.qiaomu.ai/a/levelsio-300-month-expenses</link>
      <guid isPermaLink="true">https://xnews.qiaomu.ai/a/levelsio-300-month-expenses</guid>
      <pubDate>Tue, 03 Nov 2026 19:03:50 +0000</pubDate>
      <author>Pieter Levels</author>
      <description><![CDATA[<p><em>他称每月节省近 $34000；网站年度服务量为 2 万付费客户、2.52 亿访客、24 亿请求与 2.4 PB 带宽。</em></p>
<h2>乔木改写</h2>
<p>Pieter Levels 更新了自己的业务开销：常规部分已降到约 $300/月。这些网站和 App 每年服务约 20000 名付费客户、2.52 亿访客，处理 24 亿次请求，消耗 2.4 PB 带宽。</p>
<p>这个 $300/月的口径不包括 Photo AI。该项目的 GPU 费用约为 $7000/月，R2 存储约为 $800/月；把它算上，总开销约为 $8000/月。Levels 解释，Photo AI 单个项目的体量就远高于其他网站之和，因此在前面的数字中单独排除，但已经计入原帖图表。</p>
<p>他认为 Claude Code 很擅长自主寻找节省成本的办法。这次列出的节省合计接近 $34000/月，具体包括：</p>
<ul>
<li>GPU：约省 $29000/月。Photo AI 改用更好、更便宜的视频模型；原先的视频成本一直很高，因为他长期没有更新相关模型。部分图片任务转到有 Google Cloud Credits 可用的 Google Cloud，另一些任务转到按市场成本销售 AI 模型的 Sume。GPU 账单由 $36000/月降至 $7000/月。</li>
<li>服务器：约省 $3000/月。合并服务器，取消 DigitalOcean 和 Linode，将服务迁往 Hetzner。</li>
<li>Backblaze B2 备份：他将这项节省记为约 $1100/月，并给出了账单从 $1200/月降到 $26/月的变化，称便宜了约 50 倍。此前保留了无限版本，没有限制的生命周期策略让服务器文件版本积累了十多年；现在改为保留 30 天。</li>
<li>Cloudflare R2：约省 $400/月。为 Photo AI 的存储桶增加生命周期策略，让图片在 90 天后自动转入更便宜的 Infrequent Access。桶里已积累多年的照片，账单因此从 $1200/月降到 $800/月。</li>
<li>域名：约省 $118/月。Claude 检查了他在 Cloudflare 的域名注册，找出许多不再使用、没有必要继续付费的域名。Levels 还认为，其中一些项目在他所说的后 AGI 世界里已没有太多保留意义；他特别提到，<code>.io</code> 域名续费已达 $50/年，数量一多就会累积成明显支出。</li>
<li>Claude 订阅：约省 $100/月。Claude 分析了自己的订阅使用量，发现他用不到 Max 20x 套餐的上限，于是将套餐从 $200/月降到 $100/月。</li>
</ul>
<p>Levels 说，即便计入 Photo AI，他的总成本也比去年降低了约 90%，接近十年前刚开始做项目时的业务开销水平。</p>
<p>他也谈到对这些节省的看法：AI 很擅长发现可以削减的成本，短期内对经济未必有利，但长期可能去掉多余开支，为更好的投资腾出资金。在他看来，成本会随时间悄悄增加，人们往往没意识到钱花到了哪里；AI 能帮助逐项梳理，个人生活的开销也一样。</p>
<section class="rewrite-source-media" aria-label="原文附带媒体"><h3 class="source-media-heading">原文附带媒体</h3><p class="completeness-note">原文附带媒体；未核验其与具体段落的对应关系。</p><figure data-media-id="m_641fcc1e874a8380"><img src="https://pbs.twimg.com/media/HWOOvq5WoAAMsfw.jpg" alt=""><figcaption><a href="https://pbs.twimg.com/media/HWOOvq5WoAAMsfw.jpg">打开原始媒体 ↗</a></figcaption></figure></section>
<h2>原文</h2>
<p><em>Biz expenses down to ~$300/mo</em></p>
<figure data-media-id="m_641fcc1e874a8380"><img src="https://pbs.twimg.com/media/HWOOvq5WoAAMsfw.jpg" alt=""><figcaption><a href="https://pbs.twimg.com/media/HWOOvq5WoAAMsfw.jpg">打开原始媒体 ↗</a></figcaption></figure>
<p>💸 Update: My total biz expenses have now dropped to just ~$300/mo!</p>
<p>This is to run all my websites/apps serving per year:</p>
<ul>
<li>20,000 paying customers</li>
<li>252 million visitors</li>
<li>2.4 billion requests</li>
<li>2.4 petabyte (PB) in bandwidth</li>
</ul>
<p>(~$8,000/mo if you add the $7,000/mo GPU bill and $800/mo R2 storage I pay for Photo AI, I exclude it above because it&#x27;s one project that&#x27;s so much more expensive in size than all the other sites together, but included in the chart below)</p>
<p>Claude Code helped me to find smart ways to save more money, AI is just really really really good at finding cost savings by itself, which is not so great for the economy short-term, but long term it trims all the fat and opens up spending for better investments I think</p>
<p>Anyway here&#x27;s what it saved me in money, almost $34,000/mo:</p>
<ul>
<li>$29,000/mo - switched to better and cheaper video models on Photo AI, video was very expensive and since I didn&#x27;t update it ever it stayed expensive, also routed some image jobs to Google Cloud where I have some Google Cloud Credits, and also routed some jobs to Sume which sells AI models at market cost, very cool! This made my GPU bill go from $36,000/mo to $7,000/mo</li>
</ul>
<ul>
<li>$3,000/mo - consolidated my servers, cancelled Digital Ocean and Linode and moved everything to Hetzner saving about $3,000/mo</li>
</ul>
<ul>
<li>$1100/mo - analyzed my Backblaze B2 server backups, I had infinite versioning and lifecycle policies, that&#x27;s reduced now to 30 days, this literally pushed the bill from $1,200/mo to $26/mo, about 50x cheaper! I had essentially versions of files for all my servers for over a decade, crazy!</li>
</ul>
<ul>
<li>$400/mo - similarly added Lifecycle Policies to my Cloudflare R2 bucket for Photo AI, pics are automatically put in cheaper Infrequent Access after 90 days, there was years of photos in there so this reduced the R2 bill from $1,200/mo to $800/mo</li>
</ul>
<ul>
<li>$118/mo - Claude analyzed all my Cloudflare Domain registrations, lots of domains I didn&#x27;t use and didn&#x27;t make sense to keep paying for, lots of things that also don&#x27;t really make sense anymore in a post-AGI world, renewals for .io TLD are now $50/year which adds up fast!</li>
</ul>
<ul>
<li>$100/mo - Claude also analyzed my Claude subscription (yes!) and discovered I don&#x27;t even use the Max 20x plan limits, so I downgraded from $200/mo to $100/mo</li>
</ul>
<p>Even including Photo AI, I have now cut my costs by 90% from last year, getting me close to my biz expenses amount from a decade ago when I started building things</p>
<p>Costs slowly creep up over the years and you don&#x27;t realize all the things you&#x27;re spending on but AI is nice to help you figure all that out (also in your personal life!)</p>
<p><strong>原文链接：</strong><a href="https://x.com/levelsio/status/2117694259558293692">https://x.com/levelsio/status/2117694259558293692</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>他称每月节省近 $34000；网站年度服务量为 2 万付费客户、2.52 亿访客、24 亿请求与 2.4 PB 带宽。</em></p>
<h2>乔木改写</h2>
<p>Pieter Levels 更新了自己的业务开销：常规部分已降到约 $300/月。这些网站和 App 每年服务约 20000 名付费客户、2.52 亿访客，处理 24 亿次请求，消耗 2.4 PB 带宽。</p>
<p>这个 $300/月的口径不包括 Photo AI。该项目的 GPU 费用约为 $7000/月，R2 存储约为 $800/月；把它算上，总开销约为 $8000/月。Levels 解释，Photo AI 单个项目的体量就远高于其他网站之和，因此在前面的数字中单独排除，但已经计入原帖图表。</p>
<p>他认为 Claude Code 很擅长自主寻找节省成本的办法。这次列出的节省合计接近 $34000/月，具体包括：</p>
<ul>
<li>GPU：约省 $29000/月。Photo AI 改用更好、更便宜的视频模型；原先的视频成本一直很高，因为他长期没有更新相关模型。部分图片任务转到有 Google Cloud Credits 可用的 Google Cloud，另一些任务转到按市场成本销售 AI 模型的 Sume。GPU 账单由 $36000/月降至 $7000/月。</li>
<li>服务器：约省 $3000/月。合并服务器，取消 DigitalOcean 和 Linode，将服务迁往 Hetzner。</li>
<li>Backblaze B2 备份：他将这项节省记为约 $1100/月，并给出了账单从 $1200/月降到 $26/月的变化，称便宜了约 50 倍。此前保留了无限版本，没有限制的生命周期策略让服务器文件版本积累了十多年；现在改为保留 30 天。</li>
<li>Cloudflare R2：约省 $400/月。为 Photo AI 的存储桶增加生命周期策略，让图片在 90 天后自动转入更便宜的 Infrequent Access。桶里已积累多年的照片，账单因此从 $1200/月降到 $800/月。</li>
<li>域名：约省 $118/月。Claude 检查了他在 Cloudflare 的域名注册，找出许多不再使用、没有必要继续付费的域名。Levels 还认为，其中一些项目在他所说的后 AGI 世界里已没有太多保留意义；他特别提到，<code>.io</code> 域名续费已达 $50/年，数量一多就会累积成明显支出。</li>
<li>Claude 订阅：约省 $100/月。Claude 分析了自己的订阅使用量，发现他用不到 Max 20x 套餐的上限，于是将套餐从 $200/月降到 $100/月。</li>
</ul>
<p>Levels 说，即便计入 Photo AI，他的总成本也比去年降低了约 90%，接近十年前刚开始做项目时的业务开销水平。</p>
<p>他也谈到对这些节省的看法：AI 很擅长发现可以削减的成本，短期内对经济未必有利，但长期可能去掉多余开支，为更好的投资腾出资金。在他看来，成本会随时间悄悄增加，人们往往没意识到钱花到了哪里；AI 能帮助逐项梳理，个人生活的开销也一样。</p>
<section class="rewrite-source-media" aria-label="原文附带媒体"><h3 class="source-media-heading">原文附带媒体</h3><p class="completeness-note">原文附带媒体；未核验其与具体段落的对应关系。</p><figure data-media-id="m_641fcc1e874a8380"><img src="https://pbs.twimg.com/media/HWOOvq5WoAAMsfw.jpg" alt=""><figcaption><a href="https://pbs.twimg.com/media/HWOOvq5WoAAMsfw.jpg">打开原始媒体 ↗</a></figcaption></figure></section>
<h2>原文</h2>
<p><em>Biz expenses down to ~$300/mo</em></p>
<figure data-media-id="m_641fcc1e874a8380"><img src="https://pbs.twimg.com/media/HWOOvq5WoAAMsfw.jpg" alt=""><figcaption><a href="https://pbs.twimg.com/media/HWOOvq5WoAAMsfw.jpg">打开原始媒体 ↗</a></figcaption></figure>
<p>💸 Update: My total biz expenses have now dropped to just ~$300/mo!</p>
<p>This is to run all my websites/apps serving per year:</p>
<ul>
<li>20,000 paying customers</li>
<li>252 million visitors</li>
<li>2.4 billion requests</li>
<li>2.4 petabyte (PB) in bandwidth</li>
</ul>
<p>(~$8,000/mo if you add the $7,000/mo GPU bill and $800/mo R2 storage I pay for Photo AI, I exclude it above because it&#x27;s one project that&#x27;s so much more expensive in size than all the other sites together, but included in the chart below)</p>
<p>Claude Code helped me to find smart ways to save more money, AI is just really really really good at finding cost savings by itself, which is not so great for the economy short-term, but long term it trims all the fat and opens up spending for better investments I think</p>
<p>Anyway here&#x27;s what it saved me in money, almost $34,000/mo:</p>
<ul>
<li>$29,000/mo - switched to better and cheaper video models on Photo AI, video was very expensive and since I didn&#x27;t update it ever it stayed expensive, also routed some image jobs to Google Cloud where I have some Google Cloud Credits, and also routed some jobs to Sume which sells AI models at market cost, very cool! This made my GPU bill go from $36,000/mo to $7,000/mo</li>
</ul>
<ul>
<li>$3,000/mo - consolidated my servers, cancelled Digital Ocean and Linode and moved everything to Hetzner saving about $3,000/mo</li>
</ul>
<ul>
<li>$1100/mo - analyzed my Backblaze B2 server backups, I had infinite versioning and lifecycle policies, that&#x27;s reduced now to 30 days, this literally pushed the bill from $1,200/mo to $26/mo, about 50x cheaper! I had essentially versions of files for all my servers for over a decade, crazy!</li>
</ul>
<ul>
<li>$400/mo - similarly added Lifecycle Policies to my Cloudflare R2 bucket for Photo AI, pics are automatically put in cheaper Infrequent Access after 90 days, there was years of photos in there so this reduced the R2 bill from $1,200/mo to $800/mo</li>
</ul>
<ul>
<li>$118/mo - Claude analyzed all my Cloudflare Domain registrations, lots of domains I didn&#x27;t use and didn&#x27;t make sense to keep paying for, lots of things that also don&#x27;t really make sense anymore in a post-AGI world, renewals for .io TLD are now $50/year which adds up fast!</li>
</ul>
<ul>
<li>$100/mo - Claude also analyzed my Claude subscription (yes!) and discovered I don&#x27;t even use the Max 20x plan limits, so I downgraded from $200/mo to $100/mo</li>
</ul>
<p>Even including Photo AI, I have now cut my costs by 90% from last year, getting me close to my biz expenses amount from a decade ago when I started building things</p>
<p>Costs slowly creep up over the years and you don&#x27;t realize all the things you&#x27;re spending on but AI is nice to help you figure all that out (also in your personal life!)</p>
<p><strong>原文链接：</strong><a href="https://x.com/levelsio/status/2117694259558293692">https://x.com/levelsio/status/2117694259558293692</a></p>]]></content:encoded>
      <qiaomu:versions><![CDATA[{"version": 1, "original": {"title": "Biz expenses down to ~$300/mo", "url": "https://x.com/levelsio/status/2117694259558293692", "lang": "en", "html": "<h2>Biz expenses down to ~$300/mo</h2>\n<figure data-media-id=\"m_641fcc1e874a8380\"><img src=\"https://pbs.twimg.com/media/HWOOvq5WoAAMsfw.jpg\" alt=\"\"><figcaption><a href=\"https://pbs.twimg.com/media/HWOOvq5WoAAMsfw.jpg\">打开原始媒体 ↗</a></figcaption></figure>\n<p>💸 Update: My total biz expenses have now dropped to just ~$300/mo!</p>\n<p>This is to run all my websites/apps serving per year:</p>\n<ul>\n<li>20,000 paying customers</li>\n<li>252 million visitors</li>\n<li>2.4 billion requests</li>\n<li>2.4 petabyte (PB) in bandwidth</li>\n</ul>\n<p>(~$8,000/mo if you add the $7,000/mo GPU bill and $800/mo R2 storage I pay for Photo AI, I exclude it above because it&#x27;s one project that&#x27;s so much more expensive in size than all the other sites together, but included in the chart below)</p>\n<p>Claude Code helped me to find smart ways to save more money, AI is just really really really good at finding cost savings by itself, which is not so great for the economy short-term, but long term it trims all the fat and opens up spending for better investments I think</p>\n<p>Anyway here&#x27;s what it saved me in money, almost $34,000/mo:</p>\n<ul>\n<li>$29,000/mo - switched to better and cheaper video models on Photo AI, video was very expensive and since I didn&#x27;t update it ever it stayed expensive, also routed some image jobs to Google Cloud where I have some Google Cloud Credits, and also routed some jobs to Sume which sells AI models at market cost, very cool! This made my GPU bill go from $36,000/mo to $7,000/mo</li>\n</ul>\n<ul>\n<li>$3,000/mo - consolidated my servers, cancelled Digital Ocean and Linode and moved everything to Hetzner saving about $3,000/mo</li>\n</ul>\n<ul>\n<li>$1100/mo - analyzed my Backblaze B2 server backups, I had infinite versioning and lifecycle policies, that&#x27;s reduced now to 30 days, this literally pushed the bill from $1,200/mo to $26/mo, about 50x cheaper! I had essentially versions of files for all my servers for over a decade, crazy!</li>\n</ul>\n<ul>\n<li>$400/mo - similarly added Lifecycle Policies to my Cloudflare R2 bucket for Photo AI, pics are automatically put in cheaper Infrequent Access after 90 days, there was years of photos in there so this reduced the R2 bill from $1,200/mo to $800/mo</li>\n</ul>\n<ul>\n<li>$118/mo - Claude analyzed all my Cloudflare Domain registrations, lots of domains I didn&#x27;t use and didn&#x27;t make sense to keep paying for, lots of things that also don&#x27;t really make sense anymore in a post-AGI world, renewals for .io TLD are now $50/year which adds up fast!</li>\n</ul>\n<ul>\n<li>$100/mo - Claude also analyzed my Claude subscription (yes!) and discovered I don&#x27;t even use the Max 20x plan limits, so I downgraded from $200/mo to $100/mo</li>\n</ul>\n<p>Even including Photo AI, I have now cut my costs by 90% from last year, getting me close to my biz expenses amount from a decade ago when I started building things</p>\n<p>Costs slowly creep up over the years and you don&#x27;t realize all the things you&#x27;re spending on but AI is nice to help you figure all that out (also in your personal life!)</p>\n<p>原文链接：<a href=\"https://x.com/levelsio/status/2117694259558293692\">https://x.com/levelsio/status/2117694259558293692</a></p>"}, "rewrite": {"title": "Levelsio：常规业务开销降到约 $300/月，不含 Photo AI", "markdown": "Pieter Levels 更新了自己的业务开销：常规部分已降到约 $300/月。这些网站和 App 每年服务约 20000 名付费客户、2.52 亿访客，处理 24 亿次请求，消耗 2.4 PB 带宽。\n\n这个 $300/月的口径不包括 Photo AI。该项目的 GPU 费用约为 $7000/月，R2 存储约为 $800/月；把它算上，总开销约为 $8000/月。Levels 解释，Photo AI 单个项目的体量就远高于其他网站之和，因此在前面的数字中单独排除，但已经计入原帖图表。\n\n他认为 Claude Code 很擅长自主寻找节省成本的办法。这次列出的节省合计接近 $34000/月，具体包括：\n\n- GPU：约省 $29000/月。Photo AI 改用更好、更便宜的视频模型；原先的视频成本一直很高，因为他长期没有更新相关模型。部分图片任务转到有 Google Cloud Credits 可用的 Google Cloud，另一些任务转到按市场成本销售 AI 模型的 Sume。GPU 账单由 $36000/月降至 $7000/月。\n- 服务器：约省 $3000/月。合并服务器，取消 DigitalOcean 和 Linode，将服务迁往 Hetzner。\n- Backblaze B2 备份：他将这项节省记为约 $1100/月，并给出了账单从 $1200/月降到 $26/月的变化，称便宜了约 50 倍。此前保留了无限版本，没有限制的生命周期策略让服务器文件版本积累了十多年；现在改为保留 30 天。\n- Cloudflare R2：约省 $400/月。为 Photo AI 的存储桶增加生命周期策略，让图片在 90 天后自动转入更便宜的 Infrequent Access。桶里已积累多年的照片，账单因此从 $1200/月降到 $800/月。\n- 域名：约省 $118/月。Claude 检查了他在 Cloudflare 的域名注册，找出许多不再使用、没有必要继续付费的域名。Levels 还认为，其中一些项目在他所说的后 AGI 世界里已没有太多保留意义；他特别提到，`.io` 域名续费已达 $50/年，数量一多就会累积成明显支出。\n- Claude 订阅：约省 $100/月。Claude 分析了自己的订阅使用量，发现他用不到 Max 20x 套餐的上限，于是将套餐从 $200/月降到 $100/月。\n\nLevels 说，即便计入 Photo AI，他的总成本也比去年降低了约 90%，接近十年前刚开始做项目时的业务开销水平。\n\n他也谈到对这些节省的看法：AI 很擅长发现可以削减的成本，短期内对经济未必有利，但长期可能去掉多余开支，为更好的投资腾出资金。在他看来，成本会随时间悄悄增加，人们往往没意识到钱花到了哪里；AI 能帮助逐项梳理，个人生活的开销也一样。\n\n\n### 原文附带媒体\n\n原文附带媒体；未核验其与具体段落的对应关系。\n\n![原帖图片](<https://pbs.twimg.com/media/HWOOvq5WoAAMsfw.jpg>)", "html": "<p>Pieter Levels 更新了自己的业务开销：常规部分已降到约 $300/月。这些网站和 App 每年服务约 20000 名付费客户、2.52 亿访客，处理 24 亿次请求，消耗 2.4 PB 带宽。</p>\n<p>这个 $300/月的口径不包括 Photo AI。该项目的 GPU 费用约为 $7000/月，R2 存储约为 $800/月；把它算上，总开销约为 $8000/月。Levels 解释，Photo AI 单个项目的体量就远高于其他网站之和，因此在前面的数字中单独排除，但已经计入原帖图表。</p>\n<p>他认为 Claude Code 很擅长自主寻找节省成本的办法。这次列出的节省合计接近 $34000/月，具体包括：</p>\n<ul>\n<li>GPU：约省 $29000/月。Photo AI 改用更好、更便宜的视频模型；原先的视频成本一直很高，因为他长期没有更新相关模型。部分图片任务转到有 Google Cloud Credits 可用的 Google Cloud，另一些任务转到按市场成本销售 AI 模型的 Sume。GPU 账单由 $36000/月降至 $7000/月。</li>\n<li>服务器：约省 $3000/月。合并服务器，取消 DigitalOcean 和 Linode，将服务迁往 Hetzner。</li>\n<li>Backblaze B2 备份：他将这项节省记为约 $1100/月，并给出了账单从 $1200/月降到 $26/月的变化，称便宜了约 50 倍。此前保留了无限版本，没有限制的生命周期策略让服务器文件版本积累了十多年；现在改为保留 30 天。</li>\n<li>Cloudflare R2：约省 $400/月。为 Photo AI 的存储桶增加生命周期策略，让图片在 90 天后自动转入更便宜的 Infrequent Access。桶里已积累多年的照片，账单因此从 $1200/月降到 $800/月。</li>\n<li>域名：约省 $118/月。Claude 检查了他在 Cloudflare 的域名注册，找出许多不再使用、没有必要继续付费的域名。Levels 还认为，其中一些项目在他所说的后 AGI 世界里已没有太多保留意义；他特别提到，<code>.io</code> 域名续费已达 $50/年，数量一多就会累积成明显支出。</li>\n<li>Claude 订阅：约省 $100/月。Claude 分析了自己的订阅使用量，发现他用不到 Max 20x 套餐的上限，于是将套餐从 $200/月降到 $100/月。</li>\n</ul>\n<p>Levels 说，即便计入 Photo AI，他的总成本也比去年降低了约 90%，接近十年前刚开始做项目时的业务开销水平。</p>\n<p>他也谈到对这些节省的看法：AI 很擅长发现可以削减的成本，短期内对经济未必有利，但长期可能去掉多余开支，为更好的投资腾出资金。在他看来，成本会随时间悄悄增加，人们往往没意识到钱花到了哪里；AI 能帮助逐项梳理，个人生活的开销也一样。</p>\n<section class=\"rewrite-source-media\" aria-label=\"原文附带媒体\"><h3 class=\"source-media-heading\">原文附带媒体</h3><p class=\"completeness-note\">原文附带媒体；未核验其与具体段落的对应关系。</p><figure data-media-id=\"m_641fcc1e874a8380\"><img src=\"https://pbs.twimg.com/media/HWOOvq5WoAAMsfw.jpg\" alt=\"\"><figcaption><a href=\"https://pbs.twimg.com/media/HWOOvq5WoAAMsfw.jpg\">打开原始媒体 ↗</a></figcaption></figure></section>"}}]]></qiaomu:versions>
    </item>
    <item>
      <title>Amjad：让受管云环境成为 AI Agent 的默认运行方式</title>
      <link>https://xnews.qiaomu.ai/a/amasad-managed-cloud-agents</link>
      <guid isPermaLink="true">https://xnews.qiaomu.ai/a/amasad-managed-cloud-agents</guid>
      <pubDate>Tue, 03 Nov 2026 06:28:06 +0000</pubDate>
      <author>Amjad Masad</author>
      <description><![CDATA[<p><em>Replit 建议把凭证、权限、网络和生产变更置于 Agent 控制之外，同时强调云托管本身不等于安全。</em></p>
<h2>乔木改写</h2>
<p>Amjad Masad 发布了一份安全建议，认为运行在员工终端上的 AI Agent 正成为企业和政府的系统性安全风险。一些机构已经开始限制 Claude Code 等工具；原文提到，据报道高盛采取了这样的措施。Replit 提出的办法，是让 Agent 默认运行在专用、受组织控制的云环境中，只访问完成当前任务所需的资源。</p>
<p>建议书认为，供应链攻击原本就能侵入开发者电脑，并调用已安装的 AI 工具搜索企业敏感信息。Agent harness 往往拥有广泛权限，而人工监督正在减少，使其越来越值得攻击者关注。无人值守的自动化同样可能被 GitHub Issue 或邮件中隐藏的指令引向私有数据和未授权操作。</p>
<p>个人 Agent 会进一步放大这类风险：它们主要由个人控制，组织管理不足，防护措施不一致，又被鼓励主动行动。读取每封邮件和日历邀请，也意味着每次互动都可能接触提示注入。Replit 因此主张，继续采用 Agent 的同时，要为会读取不可信内容、运行代码、代表用户行动的软件提供专门的执行环境；凭证、权限、网络访问和生产变更的控制应放在 Agent 无法自行改变的位置。</p>
<h3>使用增长快于治理</h3>
<p>原文引用 Stack Overflow 调查：使用或计划使用 AI 工具的受访者比例，从 2023 年的 70% 升至 2024 年的 76%，再到 2025 年的 84% [1][2]。这些数据反映的是不同年度样本中 AI 工具的采用与使用意向，并不是自主 Agent 使用率。</p>
<p>Salt Labs 在其客户环境中检测到 MCP 相关基础设施的比例，从 2026 年 1 月的 16.7% 升至 8 月的 21.6%，增加 4.9 个百分点 [3]。原文提醒，这只是该供应商客户环境的观察，能否代表整个行业、前后客户样本是否一致，都还没有确定。</p>
<p>部署与控制之间的差距更值得注意。在 Salt Security 2026 年 10 月的调查中，86.4% 的受访者说组织内至少有一个 Agent 在运行，但只有 17.5% 能自动停止在生产中出现异常行为的 Agent，只有 12.5% 能持续追踪所有 Agent 的完整执行路径 [3]。</p>
<p>另一项 Cloud Security Alliance 研究中，47% 的受访者称过去一年发生过 Agent 相关安全事件，54% 称组织内有 1 到 100 个未经批准的 Agent，只有 31% 称组织正式采用了 Agent 治理政策 [4]。这项研究在 2025 年 9 月和 11 月调查了 445 名 IT 与安全专业人员，于 2026 年 4 月发布；Zenity 提供经费并参与设计问卷。原文认为，它支持治理存在缺口的判断，但不能把它与 Salt 的结果拼成一条事件率趋势。</p>
<h3>不同攻击中的边界失效</h3>
<p>建议书逐项列出了事故和研究案例，分别说明证据范围。</p>
<p><strong>个人 Agent 接入敏感系统。</strong> WIRED 报道，一名 Accenture 承包商将个人 Claude Code 账号接入美国国防部的敏感环境，凭证和系统信息似乎流向了第三方服务 [5]。Accenture 否认这些指控，称独立调查认为指控没有根据。WIRED 也表示，没有迹象说明攻击者访问了机密或绝密系统。原文用这一争议案例说明敏感基础设施与个人 Agent 工具之间出现失控连接的风险，而非将争议当成定论。</p>
<p><strong>开发者电脑上的恶意扩展。</strong> WIRED 报道，经 Cursor 市场分发的一个被篡改的 Claude Code 扩展，最多被 5000 名用户下载；它不是 Anthropic 发布的版本 [6]。Cursor 介绍，该扩展收集主机信息，并尝试安装持久化 SSH 后门 [7]。实现错误限制了后门在大部分受影响 macOS 和 Windows 主机上的效果，但仅卸载扩展不一定能移除持久化机制。原文提醒，不能依赖攻击者下次仍犯同样的错误。</p>
<p><strong>恶意软件包调用 AI 工具寻找密钥。</strong> 在 2025 年 8 月 Nx 的 s1ngularity 攻击中，恶意软件包利用电脑上已有的 Claude、Gemini 和 Q 命令行工具辅助侦察。Wiz 观察到数百起成功的 AI 辅助活动，以及超过 1000 个有效 GitHub token 泄露。后续攻击使用这些 token，将超过 5500 个私有仓库公开，影响了 400 多名用户或组织；开发者电脑和部分构建流水线都受到了影响 [8]。</p>
<p><strong>合法工具也可能成为数据外传通道。</strong> Invariant 演示了如何通过一个恶意公开 GitHub Issue，诱导使用 GitHub MCP 的 Agent 读取私有仓库资料，再将其写入公开 PR [9]。演示中的 MCP 服务器本身没有被攻破。这证明了一条可能的攻击路径，原始来源并未报告大规模泄露；获准使用的工具和目的服务，仍可能承载未经授权的数据转移。</p>
<p><strong>工具跑出了预期沙箱。</strong> CodeRabbit 确认，研究人员于 2025 年 1 月发现 RuboCop 在沙箱外运行 [10]。公司称，它在 12 小时内完成了全面修复，没有发现客户数据被访问或存在恶意活动的证据。原文据此强调，隔离范围必须覆盖每一个可执行工具和子进程，不能只覆盖主要 Agent 运行时。</p>
<p><strong>云端 Agent 暴露关联账号凭证。</strong> Salt Labs 演示了如何用恶意邮件内容，诱导 Manus 在云沙箱中执行代码；关联服务的 token 当时可被读取，安全警告却在载荷执行后才出现 [11]。Salt 称漏洞后来已修复。这也是云托管本身不等于安全的一个反例。</p>
<p><strong>合法签名权限被滥用。</strong> Elliptic 对 10 月 29 日 Binance 失窃事件的分析认为，攻击者可能诱使 Binance 自身系统签署未经授权的交易。Binance 最初提到 DevOps 笔记本可能失陷，后来又披露其他入侵点，完整路径仍未确定。在以太坊上，签署的 EIP-7702 授权将热钱包的行为委托给攻击者控制的合约，而且委托在最初那笔交易后仍然有效 [12]。原文明确说明，这不是 AI Agent 攻击的证据；它体现的是另一项控制要求：即便凭证没有被直接窃取，只要失陷的调用方能用它授权有害操作，保护凭证本身也不够。</p>
<p>原文将这些案例中的共同问题归为三类：不可信软件带着过大权限执行、不可信内容被当作指令，以及控制措施未能阻止最终操作。</p>
<h3>为什么主张受管云环境</h3>
<p>员工工作站可能同时拥有浏览器会话、SSH key、云凭证、私有仓库、内网访问和其他业务数据，远多于多数 Agent 任务所需的权限。</p>
<p>专用云环境可以把 Agent 执行与工作站分离。组织能够只配置必要工作区，集中实施访问控制，独立记录操作，并在需要时停止或重建环境，而不必重建员工电脑。要获得这些收益，执行、策略实施和可观测性都必须真正进入受控环境。</p>
<p>本地扩展即使把提示词发给云端模型，仍可能在本机执行代码。同样，把生产凭证复制到远端、给远端 Agent 不受限的网络访问，只是把风险挪了地方。目标是将失陷的 Agent 或依赖限制在一个权限有限的工作区内，组织政策对它的约束不应取决于员工本人拥有多大的权限。</p>
<p>原文图 2 的文字说明描绘了这种边界：Agent 与工具运行在组织控制、任务限定的专用沙箱内，与员工设备的广泛权限分离；独立系统代理凭证，约束权限及流向获准资源的数据。审计、审批和遏制措施必须在 Agent 控制之外执行，而且这些保护需要经过验证，不能仅靠云托管的名称。</p>
<h3>需要独立实施的控制</h3>
<p>建议书要求将 Agent 执行视作不可信，并列出以下控制项：</p>
<ul>
<li><strong>经过验证的执行隔离。</strong> Agent、安装脚本、工具和依赖都应运行在专用沙箱内，安全实施机制放在其控制之外；不继承员工主目录、浏览器会话或不受限的企业网络权限。</li>
<li><strong>经纪式凭证与独立身份。</strong> 外部服务凭证不应出现在 Agent 可读的内存、文件或环境变量中。请求通过代理授权，并绑定 Agent、发起人、组织和具体任务。</li>
<li><strong>逐步提权授权。</strong> 隔离凭证还不够，操作、目标资源、目的地和委托权限的变化，都需要独立检查。高影响操作必须明确批准；拥有合法身份或能访问签名服务，不等于已经获准执行某项操作。</li>
<li><strong>任务范围内的权限。</strong> 每次运行只获得需要的资源和操作权限，Agent 不得提升自身权限，也不得修改约束自己的政策。</li>
<li><strong>网络与数据流限制。</strong> 对 DNS、直接 IP 访问、云元数据访问和外部请求加以控制；即使在同一个获准服务内部，也要区分操作和数据目的地。允许访问 GitHub，不等于允许把私有数据发布到 GitHub 任意位置。</li>
<li><strong>独立的生产边界。</strong> Agent 可以提出改动，但不应长期持有生产写入权限。重要变更由可信的审批与部署系统实施，并向审批者展示真正将被授权的操作。</li>
<li><strong>受控的软件供应链。</strong> 核查来源、固定获准版本、审阅工具和 MCP 配置的变化；安装依赖时不带生产凭证。</li>
<li><strong>独立审计与遏制。</strong> 在 Agent 无法修改的位置记录操作及实施决策，不依赖 Agent 配合就能自动遏制或撤销权限。遏制还必须撤销已授予下游的委托与权限，而不只是停止最初进程或轮换凭证。</li>
</ul>
<h3>组织可以先做什么</h3>
<p>Replit 建议，把获准的受管云 Agent 环境作为自主开发的标准路径；盘点现有本地 Agent 和扩展，移除不必要的访问，并禁止个人 Agent 账号连接敏感生产系统。</p>
<p>供应商应实际证明这些边界：Agent 读不到服务凭证，不能绕过网络控制、扩大权限、修改审计记录或未经批准改动生产。遏制能力也应经过实测，包括紧急停止开关是否真的能停止 Agent 活动。</p>
<p>可能受影响的 Cursor 安装，应先按供应商事件响应指南处理。把未来工作移到云端，并不能修复一台已经失陷的终端 [7]。监管行业和政府业务则应只使用获准处理相关数据与系统的环境，并检查模型端点、日志、存储和外部工具是否满足数据驻留、保留、合同及认证要求。</p>
<p>建议书最后说明，它推荐的是有可验证安全控制支撑的云执行。所引资料并未建立本地 Agent 与云 Agent 之间可比的泄露率；它们说明的是隔离、有限权限、凭证分离和独立实施为何重要。每个 Agent 的访问都应按具体任务划定。</p>
<p>原文另推荐 Replit 提出的 Agent Habitat Architecture 及其基于证据的成熟度分级，作为评估独立权限、经纪式凭证、受控数据流和带外遏制的参考框架。每一款云 Agent 产品仍需单独核查实际实现了哪些控制。</p>
<h3>原文参考资料</h3>
<p>以下资料由原文列出，查阅日期均为 2026 年 11 月 1 日；本站未在本轮重新核验这些外部材料。</p>
<ol>
<li><a href="https://survey.stackoverflow.co/2024/ai" target="_blank" rel="noopener noreferrer">Stack Overflow：AI | 2024 Developer Survey</a>。</li>
<li><a href="https://survey.stackoverflow.co/2025/ai" target="_blank" rel="noopener noreferrer">Stack Overflow：AI | 2025 Developer Survey</a>。</li>
<li><a href="https://salt.security/press-releases/state-of-agentic-ai-and-api-security-2h-2026" target="_blank" rel="noopener noreferrer">Salt Security：Nearly half of enterprises report an AI agent took an unauthorized action last year</a>，2026 年 10 月 13 日。</li>
<li><a href="https://cloudsecurityalliance.org/press-releases/2026/04/16/more-than-half-of-organizations-experience-ai-agent-scope-violations-cloud-security-alliance-study-finds" target="_blank" rel="noopener noreferrer">Cloud Security Alliance：More than half of organizations experience AI agent scope violations</a>，2026 年 4 月 16 日。</li>
<li><a href="https://www.wired.com/story/a-defense-contractor-gave-their-personal-ai-agent-access-to-a-secure-pentagon-system/" target="_blank" rel="noopener noreferrer">V. Elliott：A defense contractor gave their personal AI agent access to a secure Pentagon system | WIRED</a>。</li>
<li><a href="https://www.wired.com/story/trojan-malware-targets-thousands-of-anthropic-claude-developer-systems/" target="_blank" rel="noopener noreferrer">L. H. Newman：A supply chain attack put malicious Anthropic Claude extensions on thousands of devices | WIRED</a>。</li>
<li><a href="https://cursor.com/blog/claude-code-extension-security-notice" target="_blank" rel="noopener noreferrer">Cursor：Claude Code extension security notice</a>，2026 年 10 月 30 日更新。</li>
<li><a href="https://www.wiz.io/blog/s1ngularity-supply-chain-attack" target="_blank" rel="noopener noreferrer">M. Bar、R. McCarthy：s1ngularity: Supply chain attack leaks secrets on GitHub | Wiz</a>，2025 年 8 月 27 日发布、8 月 29 日更新。</li>
<li><a href="https://invariantlabs.ai/blog/mcp-github-vulnerability" target="_blank" rel="noopener noreferrer">Invariant Labs：GitHub MCP vulnerability research</a>。</li>
<li><a href="https://www.coderabbit.ai/blog/our-response-to-the-january-2025-kudelski-security-vulnerability-disclosure-action-and-continuous-improvement" target="_blank" rel="noopener noreferrer">H. Gill：Our response to the January 2025 Kudelski Security vulnerability disclosure | CodeRabbit</a>，2025 年 8 月 19 日。</li>
<li><a href="https://salt.security/blog/how-we-hijacked-an-ai-agent-with-a-single-email" target="_blank" rel="noopener noreferrer">Salt Labs：How we hijacked an AI agent with a single email</a>，2026 年 10 月 1 日。</li>
<li><a href="https://www.elliptic.co/insights/binance-largest-hack-in-history/" target="_blank" rel="noopener noreferrer">T. Robinson：The largest theft in history: North Korea behind the $6.4 billion Binance hack | Elliptic</a>，2026 年 10 月 30 日发布、11 月 1 日更新。</li>
</ol>

<h2>原文</h2>
<p><em>Security advisory: Make managed cloud environments the default for AI agents</em></p>
<p>AI agents running on employee endpoints are becoming a systemic security risk for enterprises &amp; governments.</p>
<p>Some are responding by restricting tools like Claude Code, as Goldman Sachs reportedly has.</p>
<p>In this security advisory, we outline the risks and recommend a path forward.</p>
<hr>
<h1>Security advisory: Make managed cloud environments the default for AI agents</h1>
<p>AI agents should operate in dedicated, organization-controlled environments with limited access to the resources each task requires. Recent security incidents [5], [6] and research demonstrate why this is a growing necessity. Supply-chain attacks have always been able to compromise developer machines and recruit installed AI tools to search for sensitive corporate information and data. Agent harnesses are typically given broad privileges and have a shrinking amount of human oversight. Combined, these two effects are making agents an increasingly interesting target for attackers. Even unattended automations are being targeted: instructions hidden in a GitHub issue or email can redirect an agent toward private data and unauthorized actions. The rise of personal agents increases the risk even more, since they are insufficiently managed by organizations, mostly controlled by individuals, run with an inconsistent set of guardrails, and are incentivized to be proactive above all else: they read every email, every calendar invite; Every interaction is an opportunity to get prompt-injected. There is a better way forward: Organizations can continue adopting agents by giving them execution environments designed for software that reads untrusted content, runs code, and acts on a user’s behalf. In a world where agents are becoming more prevalent, @Replit believes that organizations must make managed, isolated cloud agents the default for autonomous development, with credentials, permissions, network access, and production changes controlled outside the agent’s reach. Adoption is growing faster than control AI development tools are becoming standard. Stack Overflow reports that the share of respondents using or planning to use AI tools rose from 70% in 2023 to 76% in 2024 [1] and 84% in 2025 [2]. This establishes the scale of AI-tool adoption and intent across annual respondent samples. Autonomous-agent usage falls outside the specific scope of this measure. Agent infrastructure is also expanding. Salt Labs [3] detected MCP-related infrastructure in 16.7% of its customer environments in January 2026 and 21.6% in August: a 4.9-percentage-point increase. These observations are limited to the vendor’s customer environments. Their applicability to the wider industry and the consistency of the customer cohort remain unestablished. The more consequential finding is the gap between deployment and control. In Salt Security’s October 2026 survey [3], 86.4% of respondents reported at least one agent operating in their organization, but only 17.5% could automatically stop an agent behaving unexpectedly in production. Only 12.5% could consistently trace complete agent paths across all agents.</p>
<p>A separate Cloud Security Alliance study reinforces the concern [4]: 47% of respondents reported an agent-related security incident in the preceding year, 54% reported between one and 100 unsanctioned agents, and only 31% reported formally adopted agent-governance policies. The study surveyed 445 IT and security professionals in September and November 2025 and was published in April 2026. Zenity financed the research and co-developed the questionnaire. These findings corroborate a governance problem; they should not be combined with Salt’s results into a single incident-rate trend. Different attacks, recurring boundary failures The evidence extends beyond any one model, vendor, or delivery mechanism. Sensitive-system access through a personal agent. WIRED reports that an Accenture contractor connected a personal Claude Code account to a sensitive Department of Defense environment and that credentials and system information appear to have reached a third-party service [5]. Accenture disputes the allegations, saying an independent investigation found them without merit. WIRED reports no indication that attackers accessed classified or top-secret systems. The risk illustrated is an uncontrolled connection between sensitive infrastructure and personal agent tooling. A malicious extension on developer machines. WIRED reports that a tampered Claude Code extension distributed through Cursor’s marketplace was downloaded by at most 5,000 users [6]. It was not an Anthropic-published release. Cursor describes host-information collection and attempts to install a persistent SSH backdoor [7]. Implementation errors limited the backdoor’s effectiveness on most affected macOS and Windows hosts, but uninstalling the extension alone may not remove its persistence mechanisms. We cannot rely on attacker mistakes in the future. Compromised packages recruiting AI tools to find secrets. In the August 2025 Nx “s1ngularity” campaign, malicious packages used previously-installed Claude, Gemini, and Q command-line tools to assist reconnaissance. Wiz [8] observed successful AI-assisted activity in hundreds of cases and more than 1,000 valid GitHub tokens exposed. A subsequent phase used leaked tokens to make over 5,500 private repositories public, affecting more than 400 users or organizations. Developer machines and some build pipelines were affected. Private data leaked through legitimate tools. Invariant [9] demonstrated that a malicious public GitHub issue could persuade an agent using GitHub MCP to retrieve private-repository information and publish it in a public pull request. The researchers demonstrated this attack using an uncompromised MCP server. The demonstration establishes a possible attack path; the source reports no mass breach. An approved tool and destination can still carry an unauthorized data transfer. A tool running outside its intended sandbox. CodeRabbit confirmed that researchers discovered RuboCop operating outside its sandbox in January 2025 [10]. The company says it deployed a comprehensive fix within 12 hours and found no evidence of customer-data access or malicious activity. The lesson is that isolation must extend from the primary agent runtime to every executable tool and subprocess. A cloud agent exposing connected-account credentials. Salt Labs demonstrated that malicious email content could induce code execution in Manus’s cloud sandbox, where connected-service tokens were accessible [11]. A security warning appeared after the payload was executed. Salt says the flaw has since been resolved. This research is an important counterexample to the idea that cloud hosting alone provides security. Compromised infrastructure misusing legitimate signing authority. Elliptic’s analysis of the October 29 Binance theft suggests attackers induced Binance’s own systems to sign unauthorized transactions. Binance initially reported a possible compromised DevOps laptop and later disclosed additional breach points; the full intrusion path remains unresolved. On Ethereum, signed EIP-7702 authorizations delegated a hot wallet’s behavior to an attacker-controlled contract, with delegation persisting beyond the initial transaction [12]. This is not evidence of an AI-agent attack. It illustrates a relevant control requirement: protecting credentials is insufficient if a compromised caller can use them to authorize harmful actions. Together, these cases illustrate three recurring problems: untrusted software executing with excessive access, untrusted content being treated as instructions, and controls that do not prevent the resulting action. Why managed cloud agents are the better default An employee workstation may contain browser sessions, SSH keys, cloud credentials, private repositories, internal-network access, and unrelated business data. That is far more access than most agent tasks require. A dedicated cloud environment makes it possible to separate agent execution from that workstation. The organization can provision only the necessary workspace, enforce access centrally, record actions independently, and stop or rebuild the environment without rebuilding the employee’s laptop. Realizing that benefit requires moving execution, policy enforcement, and observability into the controlled environment. A local extension that sends prompts to a cloud model still executes local code. Likewise, a remote agent with copied production credentials and unrestricted network access reproduces the same risks elsewhere. The objective is to contain a compromised agent or dependency within a limited workspace. Organizational policy must govern the agent’s access independently of the employee’s broader authority. 📷 Fig. 2. A conceptual security boundary for autonomous agents. The agent and its tools run in a dedicated, task-scoped sandbox within an organization-controlled environment, separate from the employee device’s broader authority. Independent controls broker credentials and govern permissions and data flows to approved resources. Audit records, approval gates, and containment are enforced outside the agent’s control. Cloud hosting requires verified controls to provide these protections. Required controls It is recommended to treat agent execution as untrusted and enforce boundaries independently of the agent’s cooperation. Organizations should require: Verified execution isolation. Keep agents, installation scripts, tools, and dependencies inside dedicated sandboxes. Place security enforcement outside their control. Do not inherit employee home directories, browser sessions, or unrestricted corporate-network access. Brokered credentials and distinct identities. Keep external-service credentials out of agent-readable memory, files, and environment variables. Authorize requests through a broker, bound to the agent, initiating principal, organization, and task. Step-up Authorization: Credential isolation must be paired with independent checks on the requested operation, target resource, destination, and any change in delegated authority. Require explicit approval for high-impact actions; possession of a valid identity or access to a signing service is not sufficient authorization. Task-scoped permissions. Give each run only the resources and operations it needs. Agents must not be able to raise their own permissions or alter the policy that governs them. Network and data-flow restrictions. Control DNS, direct-IP traffic, cloud-metadata access, and external requests. Distinguish permitted operations and data destinations within approved services; allowing GitHub must not imply allowing private data to be published anywhere on GitHub. A separate production boundary. Let agents propose changes without standing production-write authority. Apply consequential changes through trusted approval and deployment systems that display the actual action being authorized. Controlled software supply chains. Verify provenance, pin approved versions, and review tool and MCP configuration changes. Install dependencies without production credentials. Independent audit and containment. Record actions and enforcement decisions somewhere the agent cannot alter. Support automatic containment and revocation without depending on the agent’s cooperation. Containment must also revoke downstream delegations and permissions already granted, not just stop the initiating process or rotate its credentials. Recommended action Make approved, managed cloud-agent environments the standard path for autonomous development. Inventory existing local agents and extensions, remove unnecessary access, and prohibit personal agent accounts from connecting to sensitive production systems. Require vendors to demonstrate their boundaries: that an agent cannot read service credentials, bypass network controls, expand its permissions, modify audit records, or make unapproved production changes. Verify containment through practical tests, including whether the kill switch actually stops agent activity. For potentially affected Cursor installations, follow the vendor’s incident-response guidance now. Moving future work to the cloud does not remediate an already compromised endpoint [7]. For regulated and government workloads, use only environments authorized for the relevant data and systems. Assess model endpoints, logs, storage, and external tools against residency, retention, contractual, and accreditation requirements. The recommendation is cloud execution backed by verified security controls. The sources reviewed do not establish a comparative breach rate for local versus cloud agents. They establish why isolation, limited authority, credential separation, and independent enforcement matter. Agents’ access should be scoped to the requirements of each task. For a concrete framework to evaluate these controls, see Replit’s proposed Agent Habitat Architecture and its evidence-based maturity scale. It provides a reference architecture for independently enforced permissions, brokered credentials, controlled data flows, and out-of-band containment. Each cloud-agent product should be assessed separately to verify which controls it implements. References [1] Stack Overflow, “AI | 2024 Developer Survey”. Accessed: Nov. 1, 2026. [Online]. Available: https://survey.stackoverflow.co/2024/ai [2] Stack Overflow, “AI | 2025 Developer Survey”. Accessed: Nov. 1, 2026. [Online]. Available: https://survey.stackoverflow.co/2025/ai [3] Salt Security, “Nearly half of enterprises report an AI agent took an unauthorized action last year, Salt Security research finds,” Oct. 13, 2026. Accessed: Nov. 1, 2026. [Online]. Available: https://salt.security/press-releases/state-of-agentic-ai-and-api-security-2h-2026 [4] Cloud Security Alliance, “More than half of organizations experience AI agent scope violations, Cloud Security Alliance study finds,” Apr. 16, 2026. Accessed: Nov. 1, 2026. [Online]. Available: https://cloudsecurityalliance.org/press-releases/2026/04/16/more-than-half-of-organizations-experience-ai-agent-scope-violations-cloud-security-alliance-study-finds [5] V. Elliott, “A defense contractor gave their personal AI agent access to a secure Pentagon system | WIRED”. Accessed: Nov. 1, 2026. [Online]. Available: https://www.wired.com/story/a-defense-contractor-gave-their-personal-ai-agent-access-to-a-secure-pentagon-system/ [6] L. H. Newman, “A supply chain attack put malicious Anthropic Claude extensions on thousands of devices | WIRED”. Accessed: Nov. 1, 2026. [Online]. Available: https://www.wired.com/story/trojan-malware-targets-thousands-of-anthropic-claude-developer-systems/ [7] Cursor, “Claude Code extension security notice,” updated Oct. 30, 2026. Accessed: Nov. 1, 2026. [Online]. Available: https://cursor.com/blog/claude-code-extension-security-notice [8] M. Bar and R. McCarthy, “s1ngularity: Supply chain attack leaks secrets on GitHub: Everything you need to know | Wiz Blog,” Aug. 27, 2025, updated Aug. 29, 2025. Accessed: Nov. 1, 2026. [Online]. Available: https://www.wiz.io/blog/s1ngularity-supply-chain-attack [9] Invariant Labs, GitHub MCP vulnerability research. Accessed: Nov. 1, 2026. [Online]. Available: https://invariantlabs.ai/blog/mcp-github-vulnerability [10] H. Gill, “Our response to the January 2025 Kudelski Security vulnerability disclosure: Action and continuous improvement,” CodeRabbit, Aug. 19, 2025. Accessed: Nov. 1, 2026. [Online]. Available: https://www.coderabbit.ai/blog/our-response-to-the-january-2025-kudelski-security-vulnerability-disclosure-action-and-continuous-improvement [11] Salt Labs, “How we hijacked an AI agent with a single email,” Salt Security, Oct. 1, 2026. Accessed: Nov. 1, 2026. [Online]. Available: https://salt.security/blog/how-we-hijacked-an-ai-agent-with-a-single-email [12] T. Robinson, “The largest theft in history: North Korea behind the $6.4 billion Binance hack,” Elliptic, Oct. 30, 2026, updated Nov. 1, 2026. Accessed: Nov. 1, 2026. Available: https://www.elliptic.co/insights/binance-largest-hack-in-history/</p>
<p><strong>原文链接：</strong><a href="https://x.com/amasad/status/2117504072416890937">https://x.com/amasad/status/2117504072416890937</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Replit 建议把凭证、权限、网络和生产变更置于 Agent 控制之外，同时强调云托管本身不等于安全。</em></p>
<h2>乔木改写</h2>
<p>Amjad Masad 发布了一份安全建议，认为运行在员工终端上的 AI Agent 正成为企业和政府的系统性安全风险。一些机构已经开始限制 Claude Code 等工具；原文提到，据报道高盛采取了这样的措施。Replit 提出的办法，是让 Agent 默认运行在专用、受组织控制的云环境中，只访问完成当前任务所需的资源。</p>
<p>建议书认为，供应链攻击原本就能侵入开发者电脑，并调用已安装的 AI 工具搜索企业敏感信息。Agent harness 往往拥有广泛权限，而人工监督正在减少，使其越来越值得攻击者关注。无人值守的自动化同样可能被 GitHub Issue 或邮件中隐藏的指令引向私有数据和未授权操作。</p>
<p>个人 Agent 会进一步放大这类风险：它们主要由个人控制，组织管理不足，防护措施不一致，又被鼓励主动行动。读取每封邮件和日历邀请，也意味着每次互动都可能接触提示注入。Replit 因此主张，继续采用 Agent 的同时，要为会读取不可信内容、运行代码、代表用户行动的软件提供专门的执行环境；凭证、权限、网络访问和生产变更的控制应放在 Agent 无法自行改变的位置。</p>
<h3>使用增长快于治理</h3>
<p>原文引用 Stack Overflow 调查：使用或计划使用 AI 工具的受访者比例，从 2023 年的 70% 升至 2024 年的 76%，再到 2025 年的 84% [1][2]。这些数据反映的是不同年度样本中 AI 工具的采用与使用意向，并不是自主 Agent 使用率。</p>
<p>Salt Labs 在其客户环境中检测到 MCP 相关基础设施的比例，从 2026 年 1 月的 16.7% 升至 8 月的 21.6%，增加 4.9 个百分点 [3]。原文提醒，这只是该供应商客户环境的观察，能否代表整个行业、前后客户样本是否一致，都还没有确定。</p>
<p>部署与控制之间的差距更值得注意。在 Salt Security 2026 年 10 月的调查中，86.4% 的受访者说组织内至少有一个 Agent 在运行，但只有 17.5% 能自动停止在生产中出现异常行为的 Agent，只有 12.5% 能持续追踪所有 Agent 的完整执行路径 [3]。</p>
<p>另一项 Cloud Security Alliance 研究中，47% 的受访者称过去一年发生过 Agent 相关安全事件，54% 称组织内有 1 到 100 个未经批准的 Agent，只有 31% 称组织正式采用了 Agent 治理政策 [4]。这项研究在 2025 年 9 月和 11 月调查了 445 名 IT 与安全专业人员，于 2026 年 4 月发布；Zenity 提供经费并参与设计问卷。原文认为，它支持治理存在缺口的判断，但不能把它与 Salt 的结果拼成一条事件率趋势。</p>
<h3>不同攻击中的边界失效</h3>
<p>建议书逐项列出了事故和研究案例，分别说明证据范围。</p>
<p><strong>个人 Agent 接入敏感系统。</strong> WIRED 报道，一名 Accenture 承包商将个人 Claude Code 账号接入美国国防部的敏感环境，凭证和系统信息似乎流向了第三方服务 [5]。Accenture 否认这些指控，称独立调查认为指控没有根据。WIRED 也表示，没有迹象说明攻击者访问了机密或绝密系统。原文用这一争议案例说明敏感基础设施与个人 Agent 工具之间出现失控连接的风险，而非将争议当成定论。</p>
<p><strong>开发者电脑上的恶意扩展。</strong> WIRED 报道，经 Cursor 市场分发的一个被篡改的 Claude Code 扩展，最多被 5000 名用户下载；它不是 Anthropic 发布的版本 [6]。Cursor 介绍，该扩展收集主机信息，并尝试安装持久化 SSH 后门 [7]。实现错误限制了后门在大部分受影响 macOS 和 Windows 主机上的效果，但仅卸载扩展不一定能移除持久化机制。原文提醒，不能依赖攻击者下次仍犯同样的错误。</p>
<p><strong>恶意软件包调用 AI 工具寻找密钥。</strong> 在 2025 年 8 月 Nx 的 s1ngularity 攻击中，恶意软件包利用电脑上已有的 Claude、Gemini 和 Q 命令行工具辅助侦察。Wiz 观察到数百起成功的 AI 辅助活动，以及超过 1000 个有效 GitHub token 泄露。后续攻击使用这些 token，将超过 5500 个私有仓库公开，影响了 400 多名用户或组织；开发者电脑和部分构建流水线都受到了影响 [8]。</p>
<p><strong>合法工具也可能成为数据外传通道。</strong> Invariant 演示了如何通过一个恶意公开 GitHub Issue，诱导使用 GitHub MCP 的 Agent 读取私有仓库资料，再将其写入公开 PR [9]。演示中的 MCP 服务器本身没有被攻破。这证明了一条可能的攻击路径，原始来源并未报告大规模泄露；获准使用的工具和目的服务，仍可能承载未经授权的数据转移。</p>
<p><strong>工具跑出了预期沙箱。</strong> CodeRabbit 确认，研究人员于 2025 年 1 月发现 RuboCop 在沙箱外运行 [10]。公司称，它在 12 小时内完成了全面修复，没有发现客户数据被访问或存在恶意活动的证据。原文据此强调，隔离范围必须覆盖每一个可执行工具和子进程，不能只覆盖主要 Agent 运行时。</p>
<p><strong>云端 Agent 暴露关联账号凭证。</strong> Salt Labs 演示了如何用恶意邮件内容，诱导 Manus 在云沙箱中执行代码；关联服务的 token 当时可被读取，安全警告却在载荷执行后才出现 [11]。Salt 称漏洞后来已修复。这也是云托管本身不等于安全的一个反例。</p>
<p><strong>合法签名权限被滥用。</strong> Elliptic 对 10 月 29 日 Binance 失窃事件的分析认为，攻击者可能诱使 Binance 自身系统签署未经授权的交易。Binance 最初提到 DevOps 笔记本可能失陷，后来又披露其他入侵点，完整路径仍未确定。在以太坊上，签署的 EIP-7702 授权将热钱包的行为委托给攻击者控制的合约，而且委托在最初那笔交易后仍然有效 [12]。原文明确说明，这不是 AI Agent 攻击的证据；它体现的是另一项控制要求：即便凭证没有被直接窃取，只要失陷的调用方能用它授权有害操作，保护凭证本身也不够。</p>
<p>原文将这些案例中的共同问题归为三类：不可信软件带着过大权限执行、不可信内容被当作指令，以及控制措施未能阻止最终操作。</p>
<h3>为什么主张受管云环境</h3>
<p>员工工作站可能同时拥有浏览器会话、SSH key、云凭证、私有仓库、内网访问和其他业务数据，远多于多数 Agent 任务所需的权限。</p>
<p>专用云环境可以把 Agent 执行与工作站分离。组织能够只配置必要工作区，集中实施访问控制，独立记录操作，并在需要时停止或重建环境，而不必重建员工电脑。要获得这些收益，执行、策略实施和可观测性都必须真正进入受控环境。</p>
<p>本地扩展即使把提示词发给云端模型，仍可能在本机执行代码。同样，把生产凭证复制到远端、给远端 Agent 不受限的网络访问，只是把风险挪了地方。目标是将失陷的 Agent 或依赖限制在一个权限有限的工作区内，组织政策对它的约束不应取决于员工本人拥有多大的权限。</p>
<p>原文图 2 的文字说明描绘了这种边界：Agent 与工具运行在组织控制、任务限定的专用沙箱内，与员工设备的广泛权限分离；独立系统代理凭证，约束权限及流向获准资源的数据。审计、审批和遏制措施必须在 Agent 控制之外执行，而且这些保护需要经过验证，不能仅靠云托管的名称。</p>
<h3>需要独立实施的控制</h3>
<p>建议书要求将 Agent 执行视作不可信，并列出以下控制项：</p>
<ul>
<li><strong>经过验证的执行隔离。</strong> Agent、安装脚本、工具和依赖都应运行在专用沙箱内，安全实施机制放在其控制之外；不继承员工主目录、浏览器会话或不受限的企业网络权限。</li>
<li><strong>经纪式凭证与独立身份。</strong> 外部服务凭证不应出现在 Agent 可读的内存、文件或环境变量中。请求通过代理授权，并绑定 Agent、发起人、组织和具体任务。</li>
<li><strong>逐步提权授权。</strong> 隔离凭证还不够，操作、目标资源、目的地和委托权限的变化，都需要独立检查。高影响操作必须明确批准；拥有合法身份或能访问签名服务，不等于已经获准执行某项操作。</li>
<li><strong>任务范围内的权限。</strong> 每次运行只获得需要的资源和操作权限，Agent 不得提升自身权限，也不得修改约束自己的政策。</li>
<li><strong>网络与数据流限制。</strong> 对 DNS、直接 IP 访问、云元数据访问和外部请求加以控制；即使在同一个获准服务内部，也要区分操作和数据目的地。允许访问 GitHub，不等于允许把私有数据发布到 GitHub 任意位置。</li>
<li><strong>独立的生产边界。</strong> Agent 可以提出改动，但不应长期持有生产写入权限。重要变更由可信的审批与部署系统实施，并向审批者展示真正将被授权的操作。</li>
<li><strong>受控的软件供应链。</strong> 核查来源、固定获准版本、审阅工具和 MCP 配置的变化；安装依赖时不带生产凭证。</li>
<li><strong>独立审计与遏制。</strong> 在 Agent 无法修改的位置记录操作及实施决策，不依赖 Agent 配合就能自动遏制或撤销权限。遏制还必须撤销已授予下游的委托与权限，而不只是停止最初进程或轮换凭证。</li>
</ul>
<h3>组织可以先做什么</h3>
<p>Replit 建议，把获准的受管云 Agent 环境作为自主开发的标准路径；盘点现有本地 Agent 和扩展，移除不必要的访问，并禁止个人 Agent 账号连接敏感生产系统。</p>
<p>供应商应实际证明这些边界：Agent 读不到服务凭证，不能绕过网络控制、扩大权限、修改审计记录或未经批准改动生产。遏制能力也应经过实测，包括紧急停止开关是否真的能停止 Agent 活动。</p>
<p>可能受影响的 Cursor 安装，应先按供应商事件响应指南处理。把未来工作移到云端，并不能修复一台已经失陷的终端 [7]。监管行业和政府业务则应只使用获准处理相关数据与系统的环境，并检查模型端点、日志、存储和外部工具是否满足数据驻留、保留、合同及认证要求。</p>
<p>建议书最后说明，它推荐的是有可验证安全控制支撑的云执行。所引资料并未建立本地 Agent 与云 Agent 之间可比的泄露率；它们说明的是隔离、有限权限、凭证分离和独立实施为何重要。每个 Agent 的访问都应按具体任务划定。</p>
<p>原文另推荐 Replit 提出的 Agent Habitat Architecture 及其基于证据的成熟度分级，作为评估独立权限、经纪式凭证、受控数据流和带外遏制的参考框架。每一款云 Agent 产品仍需单独核查实际实现了哪些控制。</p>
<h3>原文参考资料</h3>
<p>以下资料由原文列出，查阅日期均为 2026 年 11 月 1 日；本站未在本轮重新核验这些外部材料。</p>
<ol>
<li><a href="https://survey.stackoverflow.co/2024/ai" target="_blank" rel="noopener noreferrer">Stack Overflow：AI | 2024 Developer Survey</a>。</li>
<li><a href="https://survey.stackoverflow.co/2025/ai" target="_blank" rel="noopener noreferrer">Stack Overflow：AI | 2025 Developer Survey</a>。</li>
<li><a href="https://salt.security/press-releases/state-of-agentic-ai-and-api-security-2h-2026" target="_blank" rel="noopener noreferrer">Salt Security：Nearly half of enterprises report an AI agent took an unauthorized action last year</a>，2026 年 10 月 13 日。</li>
<li><a href="https://cloudsecurityalliance.org/press-releases/2026/04/16/more-than-half-of-organizations-experience-ai-agent-scope-violations-cloud-security-alliance-study-finds" target="_blank" rel="noopener noreferrer">Cloud Security Alliance：More than half of organizations experience AI agent scope violations</a>，2026 年 4 月 16 日。</li>
<li><a href="https://www.wired.com/story/a-defense-contractor-gave-their-personal-ai-agent-access-to-a-secure-pentagon-system/" target="_blank" rel="noopener noreferrer">V. Elliott：A defense contractor gave their personal AI agent access to a secure Pentagon system | WIRED</a>。</li>
<li><a href="https://www.wired.com/story/trojan-malware-targets-thousands-of-anthropic-claude-developer-systems/" target="_blank" rel="noopener noreferrer">L. H. Newman：A supply chain attack put malicious Anthropic Claude extensions on thousands of devices | WIRED</a>。</li>
<li><a href="https://cursor.com/blog/claude-code-extension-security-notice" target="_blank" rel="noopener noreferrer">Cursor：Claude Code extension security notice</a>，2026 年 10 月 30 日更新。</li>
<li><a href="https://www.wiz.io/blog/s1ngularity-supply-chain-attack" target="_blank" rel="noopener noreferrer">M. Bar、R. McCarthy：s1ngularity: Supply chain attack leaks secrets on GitHub | Wiz</a>，2025 年 8 月 27 日发布、8 月 29 日更新。</li>
<li><a href="https://invariantlabs.ai/blog/mcp-github-vulnerability" target="_blank" rel="noopener noreferrer">Invariant Labs：GitHub MCP vulnerability research</a>。</li>
<li><a href="https://www.coderabbit.ai/blog/our-response-to-the-january-2025-kudelski-security-vulnerability-disclosure-action-and-continuous-improvement" target="_blank" rel="noopener noreferrer">H. Gill：Our response to the January 2025 Kudelski Security vulnerability disclosure | CodeRabbit</a>，2025 年 8 月 19 日。</li>
<li><a href="https://salt.security/blog/how-we-hijacked-an-ai-agent-with-a-single-email" target="_blank" rel="noopener noreferrer">Salt Labs：How we hijacked an AI agent with a single email</a>，2026 年 10 月 1 日。</li>
<li><a href="https://www.elliptic.co/insights/binance-largest-hack-in-history/" target="_blank" rel="noopener noreferrer">T. Robinson：The largest theft in history: North Korea behind the $6.4 billion Binance hack | Elliptic</a>，2026 年 10 月 30 日发布、11 月 1 日更新。</li>
</ol>

<h2>原文</h2>
<p><em>Security advisory: Make managed cloud environments the default for AI agents</em></p>
<p>AI agents running on employee endpoints are becoming a systemic security risk for enterprises &amp; governments.</p>
<p>Some are responding by restricting tools like Claude Code, as Goldman Sachs reportedly has.</p>
<p>In this security advisory, we outline the risks and recommend a path forward.</p>
<hr>
<h1>Security advisory: Make managed cloud environments the default for AI agents</h1>
<p>AI agents should operate in dedicated, organization-controlled environments with limited access to the resources each task requires. Recent security incidents [5], [6] and research demonstrate why this is a growing necessity. Supply-chain attacks have always been able to compromise developer machines and recruit installed AI tools to search for sensitive corporate information and data. Agent harnesses are typically given broad privileges and have a shrinking amount of human oversight. Combined, these two effects are making agents an increasingly interesting target for attackers. Even unattended automations are being targeted: instructions hidden in a GitHub issue or email can redirect an agent toward private data and unauthorized actions. The rise of personal agents increases the risk even more, since they are insufficiently managed by organizations, mostly controlled by individuals, run with an inconsistent set of guardrails, and are incentivized to be proactive above all else: they read every email, every calendar invite; Every interaction is an opportunity to get prompt-injected. There is a better way forward: Organizations can continue adopting agents by giving them execution environments designed for software that reads untrusted content, runs code, and acts on a user’s behalf. In a world where agents are becoming more prevalent, @Replit believes that organizations must make managed, isolated cloud agents the default for autonomous development, with credentials, permissions, network access, and production changes controlled outside the agent’s reach. Adoption is growing faster than control AI development tools are becoming standard. Stack Overflow reports that the share of respondents using or planning to use AI tools rose from 70% in 2023 to 76% in 2024 [1] and 84% in 2025 [2]. This establishes the scale of AI-tool adoption and intent across annual respondent samples. Autonomous-agent usage falls outside the specific scope of this measure. Agent infrastructure is also expanding. Salt Labs [3] detected MCP-related infrastructure in 16.7% of its customer environments in January 2026 and 21.6% in August: a 4.9-percentage-point increase. These observations are limited to the vendor’s customer environments. Their applicability to the wider industry and the consistency of the customer cohort remain unestablished. The more consequential finding is the gap between deployment and control. In Salt Security’s October 2026 survey [3], 86.4% of respondents reported at least one agent operating in their organization, but only 17.5% could automatically stop an agent behaving unexpectedly in production. Only 12.5% could consistently trace complete agent paths across all agents.</p>
<p>A separate Cloud Security Alliance study reinforces the concern [4]: 47% of respondents reported an agent-related security incident in the preceding year, 54% reported between one and 100 unsanctioned agents, and only 31% reported formally adopted agent-governance policies. The study surveyed 445 IT and security professionals in September and November 2025 and was published in April 2026. Zenity financed the research and co-developed the questionnaire. These findings corroborate a governance problem; they should not be combined with Salt’s results into a single incident-rate trend. Different attacks, recurring boundary failures The evidence extends beyond any one model, vendor, or delivery mechanism. Sensitive-system access through a personal agent. WIRED reports that an Accenture contractor connected a personal Claude Code account to a sensitive Department of Defense environment and that credentials and system information appear to have reached a third-party service [5]. Accenture disputes the allegations, saying an independent investigation found them without merit. WIRED reports no indication that attackers accessed classified or top-secret systems. The risk illustrated is an uncontrolled connection between sensitive infrastructure and personal agent tooling. A malicious extension on developer machines. WIRED reports that a tampered Claude Code extension distributed through Cursor’s marketplace was downloaded by at most 5,000 users [6]. It was not an Anthropic-published release. Cursor describes host-information collection and attempts to install a persistent SSH backdoor [7]. Implementation errors limited the backdoor’s effectiveness on most affected macOS and Windows hosts, but uninstalling the extension alone may not remove its persistence mechanisms. We cannot rely on attacker mistakes in the future. Compromised packages recruiting AI tools to find secrets. In the August 2025 Nx “s1ngularity” campaign, malicious packages used previously-installed Claude, Gemini, and Q command-line tools to assist reconnaissance. Wiz [8] observed successful AI-assisted activity in hundreds of cases and more than 1,000 valid GitHub tokens exposed. A subsequent phase used leaked tokens to make over 5,500 private repositories public, affecting more than 400 users or organizations. Developer machines and some build pipelines were affected. Private data leaked through legitimate tools. Invariant [9] demonstrated that a malicious public GitHub issue could persuade an agent using GitHub MCP to retrieve private-repository information and publish it in a public pull request. The researchers demonstrated this attack using an uncompromised MCP server. The demonstration establishes a possible attack path; the source reports no mass breach. An approved tool and destination can still carry an unauthorized data transfer. A tool running outside its intended sandbox. CodeRabbit confirmed that researchers discovered RuboCop operating outside its sandbox in January 2025 [10]. The company says it deployed a comprehensive fix within 12 hours and found no evidence of customer-data access or malicious activity. The lesson is that isolation must extend from the primary agent runtime to every executable tool and subprocess. A cloud agent exposing connected-account credentials. Salt Labs demonstrated that malicious email content could induce code execution in Manus’s cloud sandbox, where connected-service tokens were accessible [11]. A security warning appeared after the payload was executed. Salt says the flaw has since been resolved. This research is an important counterexample to the idea that cloud hosting alone provides security. Compromised infrastructure misusing legitimate signing authority. Elliptic’s analysis of the October 29 Binance theft suggests attackers induced Binance’s own systems to sign unauthorized transactions. Binance initially reported a possible compromised DevOps laptop and later disclosed additional breach points; the full intrusion path remains unresolved. On Ethereum, signed EIP-7702 authorizations delegated a hot wallet’s behavior to an attacker-controlled contract, with delegation persisting beyond the initial transaction [12]. This is not evidence of an AI-agent attack. It illustrates a relevant control requirement: protecting credentials is insufficient if a compromised caller can use them to authorize harmful actions. Together, these cases illustrate three recurring problems: untrusted software executing with excessive access, untrusted content being treated as instructions, and controls that do not prevent the resulting action. Why managed cloud agents are the better default An employee workstation may contain browser sessions, SSH keys, cloud credentials, private repositories, internal-network access, and unrelated business data. That is far more access than most agent tasks require. A dedicated cloud environment makes it possible to separate agent execution from that workstation. The organization can provision only the necessary workspace, enforce access centrally, record actions independently, and stop or rebuild the environment without rebuilding the employee’s laptop. Realizing that benefit requires moving execution, policy enforcement, and observability into the controlled environment. A local extension that sends prompts to a cloud model still executes local code. Likewise, a remote agent with copied production credentials and unrestricted network access reproduces the same risks elsewhere. The objective is to contain a compromised agent or dependency within a limited workspace. Organizational policy must govern the agent’s access independently of the employee’s broader authority. 📷 Fig. 2. A conceptual security boundary for autonomous agents. The agent and its tools run in a dedicated, task-scoped sandbox within an organization-controlled environment, separate from the employee device’s broader authority. Independent controls broker credentials and govern permissions and data flows to approved resources. Audit records, approval gates, and containment are enforced outside the agent’s control. Cloud hosting requires verified controls to provide these protections. Required controls It is recommended to treat agent execution as untrusted and enforce boundaries independently of the agent’s cooperation. Organizations should require: Verified execution isolation. Keep agents, installation scripts, tools, and dependencies inside dedicated sandboxes. Place security enforcement outside their control. Do not inherit employee home directories, browser sessions, or unrestricted corporate-network access. Brokered credentials and distinct identities. Keep external-service credentials out of agent-readable memory, files, and environment variables. Authorize requests through a broker, bound to the agent, initiating principal, organization, and task. Step-up Authorization: Credential isolation must be paired with independent checks on the requested operation, target resource, destination, and any change in delegated authority. Require explicit approval for high-impact actions; possession of a valid identity or access to a signing service is not sufficient authorization. Task-scoped permissions. Give each run only the resources and operations it needs. Agents must not be able to raise their own permissions or alter the policy that governs them. Network and data-flow restrictions. Control DNS, direct-IP traffic, cloud-metadata access, and external requests. Distinguish permitted operations and data destinations within approved services; allowing GitHub must not imply allowing private data to be published anywhere on GitHub. A separate production boundary. Let agents propose changes without standing production-write authority. Apply consequential changes through trusted approval and deployment systems that display the actual action being authorized. Controlled software supply chains. Verify provenance, pin approved versions, and review tool and MCP configuration changes. Install dependencies without production credentials. Independent audit and containment. Record actions and enforcement decisions somewhere the agent cannot alter. Support automatic containment and revocation without depending on the agent’s cooperation. Containment must also revoke downstream delegations and permissions already granted, not just stop the initiating process or rotate its credentials. Recommended action Make approved, managed cloud-agent environments the standard path for autonomous development. Inventory existing local agents and extensions, remove unnecessary access, and prohibit personal agent accounts from connecting to sensitive production systems. Require vendors to demonstrate their boundaries: that an agent cannot read service credentials, bypass network controls, expand its permissions, modify audit records, or make unapproved production changes. Verify containment through practical tests, including whether the kill switch actually stops agent activity. For potentially affected Cursor installations, follow the vendor’s incident-response guidance now. Moving future work to the cloud does not remediate an already compromised endpoint [7]. For regulated and government workloads, use only environments authorized for the relevant data and systems. Assess model endpoints, logs, storage, and external tools against residency, retention, contractual, and accreditation requirements. The recommendation is cloud execution backed by verified security controls. The sources reviewed do not establish a comparative breach rate for local versus cloud agents. They establish why isolation, limited authority, credential separation, and independent enforcement matter. Agents’ access should be scoped to the requirements of each task. For a concrete framework to evaluate these controls, see Replit’s proposed Agent Habitat Architecture and its evidence-based maturity scale. It provides a reference architecture for independently enforced permissions, brokered credentials, controlled data flows, and out-of-band containment. Each cloud-agent product should be assessed separately to verify which controls it implements. References [1] Stack Overflow, “AI | 2024 Developer Survey”. Accessed: Nov. 1, 2026. [Online]. Available: https://survey.stackoverflow.co/2024/ai [2] Stack Overflow, “AI | 2025 Developer Survey”. Accessed: Nov. 1, 2026. [Online]. Available: https://survey.stackoverflow.co/2025/ai [3] Salt Security, “Nearly half of enterprises report an AI agent took an unauthorized action last year, Salt Security research finds,” Oct. 13, 2026. Accessed: Nov. 1, 2026. [Online]. Available: https://salt.security/press-releases/state-of-agentic-ai-and-api-security-2h-2026 [4] Cloud Security Alliance, “More than half of organizations experience AI agent scope violations, Cloud Security Alliance study finds,” Apr. 16, 2026. Accessed: Nov. 1, 2026. [Online]. Available: https://cloudsecurityalliance.org/press-releases/2026/04/16/more-than-half-of-organizations-experience-ai-agent-scope-violations-cloud-security-alliance-study-finds [5] V. Elliott, “A defense contractor gave their personal AI agent access to a secure Pentagon system | WIRED”. Accessed: Nov. 1, 2026. [Online]. Available: https://www.wired.com/story/a-defense-contractor-gave-their-personal-ai-agent-access-to-a-secure-pentagon-system/ [6] L. H. Newman, “A supply chain attack put malicious Anthropic Claude extensions on thousands of devices | WIRED”. Accessed: Nov. 1, 2026. [Online]. Available: https://www.wired.com/story/trojan-malware-targets-thousands-of-anthropic-claude-developer-systems/ [7] Cursor, “Claude Code extension security notice,” updated Oct. 30, 2026. Accessed: Nov. 1, 2026. [Online]. Available: https://cursor.com/blog/claude-code-extension-security-notice [8] M. Bar and R. McCarthy, “s1ngularity: Supply chain attack leaks secrets on GitHub: Everything you need to know | Wiz Blog,” Aug. 27, 2025, updated Aug. 29, 2025. Accessed: Nov. 1, 2026. [Online]. Available: https://www.wiz.io/blog/s1ngularity-supply-chain-attack [9] Invariant Labs, GitHub MCP vulnerability research. Accessed: Nov. 1, 2026. [Online]. Available: https://invariantlabs.ai/blog/mcp-github-vulnerability [10] H. Gill, “Our response to the January 2025 Kudelski Security vulnerability disclosure: Action and continuous improvement,” CodeRabbit, Aug. 19, 2025. Accessed: Nov. 1, 2026. [Online]. Available: https://www.coderabbit.ai/blog/our-response-to-the-january-2025-kudelski-security-vulnerability-disclosure-action-and-continuous-improvement [11] Salt Labs, “How we hijacked an AI agent with a single email,” Salt Security, Oct. 1, 2026. Accessed: Nov. 1, 2026. [Online]. Available: https://salt.security/blog/how-we-hijacked-an-ai-agent-with-a-single-email [12] T. Robinson, “The largest theft in history: North Korea behind the $6.4 billion Binance hack,” Elliptic, Oct. 30, 2026, updated Nov. 1, 2026. Accessed: Nov. 1, 2026. Available: https://www.elliptic.co/insights/binance-largest-hack-in-history/</p>
<p><strong>原文链接：</strong><a href="https://x.com/amasad/status/2117504072416890937">https://x.com/amasad/status/2117504072416890937</a></p>]]></content:encoded>
      <qiaomu:versions><![CDATA[{"version": 1, "original": {"title": "Security advisory: Make managed cloud environments the default for AI agents", "url": "https://x.com/amasad/status/2117504072416890937", "lang": "en", "html": "<h2>Security advisory: Make managed cloud environments the default for AI agents</h2>\n\n<p>AI agents running on employee endpoints are becoming a systemic security risk for enterprises &amp; governments.</p>\n<p>Some are responding by restricting tools like Claude Code, as Goldman Sachs reportedly has.</p>\n<p>In this security advisory, we outline the risks and recommend a path forward.</p>\n<hr>\n<h1>Security advisory: Make managed cloud environments the default for AI agents</h1>\n<p>AI agents should operate in dedicated, organization-controlled environments with limited access to the resources each task requires. Recent security incidents [5], [6] and research demonstrate why this is a growing necessity. Supply-chain attacks have always been able to compromise developer machines and recruit installed AI tools to search for sensitive corporate information and data. Agent harnesses are typically given broad privileges and have a shrinking amount of human oversight. Combined, these two effects are making agents an increasingly interesting target for attackers. Even unattended automations are being targeted: instructions hidden in a GitHub issue or email can redirect an agent toward private data and unauthorized actions. The rise of personal agents increases the risk even more, since they are insufficiently managed by organizations, mostly controlled by individuals, run with an inconsistent set of guardrails, and are incentivized to be proactive above all else: they read every email, every calendar invite; Every interaction is an opportunity to get prompt-injected. There is a better way forward: Organizations can continue adopting agents by giving them execution environments designed for software that reads untrusted content, runs code, and acts on a user’s behalf. In a world where agents are becoming more prevalent, @Replit believes that organizations must make managed, isolated cloud agents the default for autonomous development, with credentials, permissions, network access, and production changes controlled outside the agent’s reach. Adoption is growing faster than control AI development tools are becoming standard. Stack Overflow reports that the share of respondents using or planning to use AI tools rose from 70% in 2023 to 76% in 2024 [1] and 84% in 2025 [2]. This establishes the scale of AI-tool adoption and intent across annual respondent samples. Autonomous-agent usage falls outside the specific scope of this measure. Agent infrastructure is also expanding. Salt Labs [3] detected MCP-related infrastructure in 16.7% of its customer environments in January 2026 and 21.6% in August: a 4.9-percentage-point increase. These observations are limited to the vendor’s customer environments. Their applicability to the wider industry and the consistency of the customer cohort remain unestablished. The more consequential finding is the gap between deployment and control. In Salt Security’s October 2026 survey [3], 86.4% of respondents reported at least one agent operating in their organization, but only 17.5% could automatically stop an agent behaving unexpectedly in production. Only 12.5% could consistently trace complete agent paths across all agents.</p>\n<p>A separate Cloud Security Alliance study reinforces the concern [4]: 47% of respondents reported an agent-related security incident in the preceding year, 54% reported between one and 100 unsanctioned agents, and only 31% reported formally adopted agent-governance policies. The study surveyed 445 IT and security professionals in September and November 2025 and was published in April 2026. Zenity financed the research and co-developed the questionnaire. These findings corroborate a governance problem; they should not be combined with Salt’s results into a single incident-rate trend. Different attacks, recurring boundary failures The evidence extends beyond any one model, vendor, or delivery mechanism. Sensitive-system access through a personal agent. WIRED reports that an Accenture contractor connected a personal Claude Code account to a sensitive Department of Defense environment and that credentials and system information appear to have reached a third-party service [5]. Accenture disputes the allegations, saying an independent investigation found them without merit. WIRED reports no indication that attackers accessed classified or top-secret systems. The risk illustrated is an uncontrolled connection between sensitive infrastructure and personal agent tooling. A malicious extension on developer machines. WIRED reports that a tampered Claude Code extension distributed through Cursor’s marketplace was downloaded by at most 5,000 users [6]. It was not an Anthropic-published release. Cursor describes host-information collection and attempts to install a persistent SSH backdoor [7]. Implementation errors limited the backdoor’s effectiveness on most affected macOS and Windows hosts, but uninstalling the extension alone may not remove its persistence mechanisms. We cannot rely on attacker mistakes in the future. Compromised packages recruiting AI tools to find secrets. In the August 2025 Nx “s1ngularity” campaign, malicious packages used previously-installed Claude, Gemini, and Q command-line tools to assist reconnaissance. Wiz [8] observed successful AI-assisted activity in hundreds of cases and more than 1,000 valid GitHub tokens exposed. A subsequent phase used leaked tokens to make over 5,500 private repositories public, affecting more than 400 users or organizations. Developer machines and some build pipelines were affected. Private data leaked through legitimate tools. Invariant [9] demonstrated that a malicious public GitHub issue could persuade an agent using GitHub MCP to retrieve private-repository information and publish it in a public pull request. The researchers demonstrated this attack using an uncompromised MCP server. The demonstration establishes a possible attack path; the source reports no mass breach. An approved tool and destination can still carry an unauthorized data transfer. A tool running outside its intended sandbox. CodeRabbit confirmed that researchers discovered RuboCop operating outside its sandbox in January 2025 [10]. The company says it deployed a comprehensive fix within 12 hours and found no evidence of customer-data access or malicious activity. The lesson is that isolation must extend from the primary agent runtime to every executable tool and subprocess. A cloud agent exposing connected-account credentials. Salt Labs demonstrated that malicious email content could induce code execution in Manus’s cloud sandbox, where connected-service tokens were accessible [11]. A security warning appeared after the payload was executed. Salt says the flaw has since been resolved. This research is an important counterexample to the idea that cloud hosting alone provides security. Compromised infrastructure misusing legitimate signing authority. Elliptic’s analysis of the October 29 Binance theft suggests attackers induced Binance’s own systems to sign unauthorized transactions. Binance initially reported a possible compromised DevOps laptop and later disclosed additional breach points; the full intrusion path remains unresolved. On Ethereum, signed EIP-7702 authorizations delegated a hot wallet’s behavior to an attacker-controlled contract, with delegation persisting beyond the initial transaction [12]. This is not evidence of an AI-agent attack. It illustrates a relevant control requirement: protecting credentials is insufficient if a compromised caller can use them to authorize harmful actions. Together, these cases illustrate three recurring problems: untrusted software executing with excessive access, untrusted content being treated as instructions, and controls that do not prevent the resulting action. Why managed cloud agents are the better default An employee workstation may contain browser sessions, SSH keys, cloud credentials, private repositories, internal-network access, and unrelated business data. That is far more access than most agent tasks require. A dedicated cloud environment makes it possible to separate agent execution from that workstation. The organization can provision only the necessary workspace, enforce access centrally, record actions independently, and stop or rebuild the environment without rebuilding the employee’s laptop. Realizing that benefit requires moving execution, policy enforcement, and observability into the controlled environment. A local extension that sends prompts to a cloud model still executes local code. Likewise, a remote agent with copied production credentials and unrestricted network access reproduces the same risks elsewhere. The objective is to contain a compromised agent or dependency within a limited workspace. Organizational policy must govern the agent’s access independently of the employee’s broader authority. 📷 Fig. 2. A conceptual security boundary for autonomous agents. The agent and its tools run in a dedicated, task-scoped sandbox within an organization-controlled environment, separate from the employee device’s broader authority. Independent controls broker credentials and govern permissions and data flows to approved resources. Audit records, approval gates, and containment are enforced outside the agent’s control. Cloud hosting requires verified controls to provide these protections. Required controls It is recommended to treat agent execution as untrusted and enforce boundaries independently of the agent’s cooperation. Organizations should require: Verified execution isolation. Keep agents, installation scripts, tools, and dependencies inside dedicated sandboxes. Place security enforcement outside their control. Do not inherit employee home directories, browser sessions, or unrestricted corporate-network access. Brokered credentials and distinct identities. Keep external-service credentials out of agent-readable memory, files, and environment variables. Authorize requests through a broker, bound to the agent, initiating principal, organization, and task. Step-up Authorization: Credential isolation must be paired with independent checks on the requested operation, target resource, destination, and any change in delegated authority. Require explicit approval for high-impact actions; possession of a valid identity or access to a signing service is not sufficient authorization. Task-scoped permissions. Give each run only the resources and operations it needs. Agents must not be able to raise their own permissions or alter the policy that governs them. Network and data-flow restrictions. Control DNS, direct-IP traffic, cloud-metadata access, and external requests. Distinguish permitted operations and data destinations within approved services; allowing GitHub must not imply allowing private data to be published anywhere on GitHub. A separate production boundary. Let agents propose changes without standing production-write authority. Apply consequential changes through trusted approval and deployment systems that display the actual action being authorized. Controlled software supply chains. Verify provenance, pin approved versions, and review tool and MCP configuration changes. Install dependencies without production credentials. Independent audit and containment. Record actions and enforcement decisions somewhere the agent cannot alter. Support automatic containment and revocation without depending on the agent’s cooperation. Containment must also revoke downstream delegations and permissions already granted, not just stop the initiating process or rotate its credentials. Recommended action Make approved, managed cloud-agent environments the standard path for autonomous development. Inventory existing local agents and extensions, remove unnecessary access, and prohibit personal agent accounts from connecting to sensitive production systems. Require vendors to demonstrate their boundaries: that an agent cannot read service credentials, bypass network controls, expand its permissions, modify audit records, or make unapproved production changes. Verify containment through practical tests, including whether the kill switch actually stops agent activity. For potentially affected Cursor installations, follow the vendor’s incident-response guidance now. Moving future work to the cloud does not remediate an already compromised endpoint [7]. For regulated and government workloads, use only environments authorized for the relevant data and systems. Assess model endpoints, logs, storage, and external tools against residency, retention, contractual, and accreditation requirements. The recommendation is cloud execution backed by verified security controls. The sources reviewed do not establish a comparative breach rate for local versus cloud agents. They establish why isolation, limited authority, credential separation, and independent enforcement matter. Agents’ access should be scoped to the requirements of each task. For a concrete framework to evaluate these controls, see Replit’s proposed Agent Habitat Architecture and its evidence-based maturity scale. It provides a reference architecture for independently enforced permissions, brokered credentials, controlled data flows, and out-of-band containment. Each cloud-agent product should be assessed separately to verify which controls it implements. References [1] Stack Overflow, “AI | 2024 Developer Survey”. Accessed: Nov. 1, 2026. [Online]. Available: https://survey.stackoverflow.co/2024/ai [2] Stack Overflow, “AI | 2025 Developer Survey”. Accessed: Nov. 1, 2026. [Online]. Available: https://survey.stackoverflow.co/2025/ai [3] Salt Security, “Nearly half of enterprises report an AI agent took an unauthorized action last year, Salt Security research finds,” Oct. 13, 2026. Accessed: Nov. 1, 2026. [Online]. Available: https://salt.security/press-releases/state-of-agentic-ai-and-api-security-2h-2026 [4] Cloud Security Alliance, “More than half of organizations experience AI agent scope violations, Cloud Security Alliance study finds,” Apr. 16, 2026. Accessed: Nov. 1, 2026. [Online]. Available: https://cloudsecurityalliance.org/press-releases/2026/04/16/more-than-half-of-organizations-experience-ai-agent-scope-violations-cloud-security-alliance-study-finds [5] V. Elliott, “A defense contractor gave their personal AI agent access to a secure Pentagon system | WIRED”. Accessed: Nov. 1, 2026. [Online]. Available: https://www.wired.com/story/a-defense-contractor-gave-their-personal-ai-agent-access-to-a-secure-pentagon-system/ [6] L. H. Newman, “A supply chain attack put malicious Anthropic Claude extensions on thousands of devices | WIRED”. Accessed: Nov. 1, 2026. [Online]. Available: https://www.wired.com/story/trojan-malware-targets-thousands-of-anthropic-claude-developer-systems/ [7] Cursor, “Claude Code extension security notice,” updated Oct. 30, 2026. Accessed: Nov. 1, 2026. [Online]. Available: https://cursor.com/blog/claude-code-extension-security-notice [8] M. Bar and R. McCarthy, “s1ngularity: Supply chain attack leaks secrets on GitHub: Everything you need to know | Wiz Blog,” Aug. 27, 2025, updated Aug. 29, 2025. Accessed: Nov. 1, 2026. [Online]. Available: https://www.wiz.io/blog/s1ngularity-supply-chain-attack [9] Invariant Labs, GitHub MCP vulnerability research. Accessed: Nov. 1, 2026. [Online]. Available: https://invariantlabs.ai/blog/mcp-github-vulnerability [10] H. Gill, “Our response to the January 2025 Kudelski Security vulnerability disclosure: Action and continuous improvement,” CodeRabbit, Aug. 19, 2025. Accessed: Nov. 1, 2026. [Online]. Available: https://www.coderabbit.ai/blog/our-response-to-the-january-2025-kudelski-security-vulnerability-disclosure-action-and-continuous-improvement [11] Salt Labs, “How we hijacked an AI agent with a single email,” Salt Security, Oct. 1, 2026. Accessed: Nov. 1, 2026. [Online]. Available: https://salt.security/blog/how-we-hijacked-an-ai-agent-with-a-single-email [12] T. Robinson, “The largest theft in history: North Korea behind the $6.4 billion Binance hack,” Elliptic, Oct. 30, 2026, updated Nov. 1, 2026. Accessed: Nov. 1, 2026. Available: https://www.elliptic.co/insights/binance-largest-hack-in-history/</p>\n<p>原文链接：<a href=\"https://x.com/amasad/status/2117504072416890937\">https://x.com/amasad/status/2117504072416890937</a></p>"}, "rewrite": {"title": "Amjad：让受管云环境成为 AI Agent 的默认运行方式", "markdown": "Amjad Masad 发布了一份安全建议，认为运行在员工终端上的 AI Agent 正成为企业和政府的系统性安全风险。一些机构已经开始限制 Claude Code 等工具；原文提到，据报道高盛采取了这样的措施。Replit 提出的办法，是让 Agent 默认运行在专用、受组织控制的云环境中，只访问完成当前任务所需的资源。\n\n建议书认为，供应链攻击原本就能侵入开发者电脑，并调用已安装的 AI 工具搜索企业敏感信息。Agent harness 往往拥有广泛权限，而人工监督正在减少，使其越来越值得攻击者关注。无人值守的自动化同样可能被 GitHub Issue 或邮件中隐藏的指令引向私有数据和未授权操作。\n\n个人 Agent 会进一步放大这类风险：它们主要由个人控制，组织管理不足，防护措施不一致，又被鼓励主动行动。读取每封邮件和日历邀请，也意味着每次互动都可能接触提示注入。Replit 因此主张，继续采用 Agent 的同时，要为会读取不可信内容、运行代码、代表用户行动的软件提供专门的执行环境；凭证、权限、网络访问和生产变更的控制应放在 Agent 无法自行改变的位置。\n\n### 使用增长快于治理\n\n原文引用 Stack Overflow 调查：使用或计划使用 AI 工具的受访者比例，从 2023 年的 70% 升至 2024 年的 76%，再到 2025 年的 84% [1][2]。这些数据反映的是不同年度样本中 AI 工具的采用与使用意向，并不是自主 Agent 使用率。\n\nSalt Labs 在其客户环境中检测到 MCP 相关基础设施的比例，从 2026 年 1 月的 16.7% 升至 8 月的 21.6%，增加 4.9 个百分点 [3]。原文提醒，这只是该供应商客户环境的观察，能否代表整个行业、前后客户样本是否一致，都还没有确定。\n\n部署与控制之间的差距更值得注意。在 Salt Security 2026 年 10 月的调查中，86.4% 的受访者说组织内至少有一个 Agent 在运行，但只有 17.5% 能自动停止在生产中出现异常行为的 Agent，只有 12.5% 能持续追踪所有 Agent 的完整执行路径 [3]。\n\n另一项 Cloud Security Alliance 研究中，47% 的受访者称过去一年发生过 Agent 相关安全事件，54% 称组织内有 1 到 100 个未经批准的 Agent，只有 31% 称组织正式采用了 Agent 治理政策 [4]。这项研究在 2025 年 9 月和 11 月调查了 445 名 IT 与安全专业人员，于 2026 年 4 月发布；Zenity 提供经费并参与设计问卷。原文认为，它支持治理存在缺口的判断，但不能把它与 Salt 的结果拼成一条事件率趋势。\n\n### 不同攻击中的边界失效\n\n建议书逐项列出了事故和研究案例，分别说明证据范围。\n\n**个人 Agent 接入敏感系统。** WIRED 报道，一名 Accenture 承包商将个人 Claude Code 账号接入美国国防部的敏感环境，凭证和系统信息似乎流向了第三方服务 [5]。Accenture 否认这些指控，称独立调查认为指控没有根据。WIRED 也表示，没有迹象说明攻击者访问了机密或绝密系统。原文用这一争议案例说明敏感基础设施与个人 Agent 工具之间出现失控连接的风险，而非将争议当成定论。\n\n**开发者电脑上的恶意扩展。** WIRED 报道，经 Cursor 市场分发的一个被篡改的 Claude Code 扩展，最多被 5000 名用户下载；它不是 Anthropic 发布的版本 [6]。Cursor 介绍，该扩展收集主机信息，并尝试安装持久化 SSH 后门 [7]。实现错误限制了后门在大部分受影响 macOS 和 Windows 主机上的效果，但仅卸载扩展不一定能移除持久化机制。原文提醒，不能依赖攻击者下次仍犯同样的错误。\n\n**恶意软件包调用 AI 工具寻找密钥。** 在 2025 年 8 月 Nx 的 s1ngularity 攻击中，恶意软件包利用电脑上已有的 Claude、Gemini 和 Q 命令行工具辅助侦察。Wiz 观察到数百起成功的 AI 辅助活动，以及超过 1000 个有效 GitHub token 泄露。后续攻击使用这些 token，将超过 5500 个私有仓库公开，影响了 400 多名用户或组织；开发者电脑和部分构建流水线都受到了影响 [8]。\n\n**合法工具也可能成为数据外传通道。** Invariant 演示了如何通过一个恶意公开 GitHub Issue，诱导使用 GitHub MCP 的 Agent 读取私有仓库资料，再将其写入公开 PR [9]。演示中的 MCP 服务器本身没有被攻破。这证明了一条可能的攻击路径，原始来源并未报告大规模泄露；获准使用的工具和目的服务，仍可能承载未经授权的数据转移。\n\n**工具跑出了预期沙箱。** CodeRabbit 确认，研究人员于 2025 年 1 月发现 RuboCop 在沙箱外运行 [10]。公司称，它在 12 小时内完成了全面修复，没有发现客户数据被访问或存在恶意活动的证据。原文据此强调，隔离范围必须覆盖每一个可执行工具和子进程，不能只覆盖主要 Agent 运行时。\n\n**云端 Agent 暴露关联账号凭证。** Salt Labs 演示了如何用恶意邮件内容，诱导 Manus 在云沙箱中执行代码；关联服务的 token 当时可被读取，安全警告却在载荷执行后才出现 [11]。Salt 称漏洞后来已修复。这也是云托管本身不等于安全的一个反例。\n\n**合法签名权限被滥用。** Elliptic 对 10 月 29 日 Binance 失窃事件的分析认为，攻击者可能诱使 Binance 自身系统签署未经授权的交易。Binance 最初提到 DevOps 笔记本可能失陷，后来又披露其他入侵点，完整路径仍未确定。在以太坊上，签署的 EIP-7702 授权将热钱包的行为委托给攻击者控制的合约，而且委托在最初那笔交易后仍然有效 [12]。原文明确说明，这不是 AI Agent 攻击的证据；它体现的是另一项控制要求：即便凭证没有被直接窃取，只要失陷的调用方能用它授权有害操作，保护凭证本身也不够。\n\n原文将这些案例中的共同问题归为三类：不可信软件带着过大权限执行、不可信内容被当作指令，以及控制措施未能阻止最终操作。\n\n### 为什么主张受管云环境\n\n员工工作站可能同时拥有浏览器会话、SSH key、云凭证、私有仓库、内网访问和其他业务数据，远多于多数 Agent 任务所需的权限。\n\n专用云环境可以把 Agent 执行与工作站分离。组织能够只配置必要工作区，集中实施访问控制，独立记录操作，并在需要时停止或重建环境，而不必重建员工电脑。要获得这些收益，执行、策略实施和可观测性都必须真正进入受控环境。\n\n本地扩展即使把提示词发给云端模型，仍可能在本机执行代码。同样，把生产凭证复制到远端、给远端 Agent 不受限的网络访问，只是把风险挪了地方。目标是将失陷的 Agent 或依赖限制在一个权限有限的工作区内，组织政策对它的约束不应取决于员工本人拥有多大的权限。\n\n原文图 2 的文字说明描绘了这种边界：Agent 与工具运行在组织控制、任务限定的专用沙箱内，与员工设备的广泛权限分离；独立系统代理凭证，约束权限及流向获准资源的数据。审计、审批和遏制措施必须在 Agent 控制之外执行，而且这些保护需要经过验证，不能仅靠云托管的名称。\n\n### 需要独立实施的控制\n\n建议书要求将 Agent 执行视作不可信，并列出以下控制项：\n\n- **经过验证的执行隔离。** Agent、安装脚本、工具和依赖都应运行在专用沙箱内，安全实施机制放在其控制之外；不继承员工主目录、浏览器会话或不受限的企业网络权限。\n- **经纪式凭证与独立身份。** 外部服务凭证不应出现在 Agent 可读的内存、文件或环境变量中。请求通过代理授权，并绑定 Agent、发起人、组织和具体任务。\n- **逐步提权授权。** 隔离凭证还不够，操作、目标资源、目的地和委托权限的变化，都需要独立检查。高影响操作必须明确批准；拥有合法身份或能访问签名服务，不等于已经获准执行某项操作。\n- **任务范围内的权限。** 每次运行只获得需要的资源和操作权限，Agent 不得提升自身权限，也不得修改约束自己的政策。\n- **网络与数据流限制。** 对 DNS、直接 IP 访问、云元数据访问和外部请求加以控制；即使在同一个获准服务内部，也要区分操作和数据目的地。允许访问 GitHub，不等于允许把私有数据发布到 GitHub 任意位置。\n- **独立的生产边界。** Agent 可以提出改动，但不应长期持有生产写入权限。重要变更由可信的审批与部署系统实施，并向审批者展示真正将被授权的操作。\n- **受控的软件供应链。** 核查来源、固定获准版本、审阅工具和 MCP 配置的变化；安装依赖时不带生产凭证。\n- **独立审计与遏制。** 在 Agent 无法修改的位置记录操作及实施决策，不依赖 Agent 配合就能自动遏制或撤销权限。遏制还必须撤销已授予下游的委托与权限，而不只是停止最初进程或轮换凭证。\n\n### 组织可以先做什么\n\nReplit 建议，把获准的受管云 Agent 环境作为自主开发的标准路径；盘点现有本地 Agent 和扩展，移除不必要的访问，并禁止个人 Agent 账号连接敏感生产系统。\n\n供应商应实际证明这些边界：Agent 读不到服务凭证，不能绕过网络控制、扩大权限、修改审计记录或未经批准改动生产。遏制能力也应经过实测，包括紧急停止开关是否真的能停止 Agent 活动。\n\n可能受影响的 Cursor 安装，应先按供应商事件响应指南处理。把未来工作移到云端，并不能修复一台已经失陷的终端 [7]。监管行业和政府业务则应只使用获准处理相关数据与系统的环境，并检查模型端点、日志、存储和外部工具是否满足数据驻留、保留、合同及认证要求。\n\n建议书最后说明，它推荐的是有可验证安全控制支撑的云执行。所引资料并未建立本地 Agent 与云 Agent 之间可比的泄露率；它们说明的是隔离、有限权限、凭证分离和独立实施为何重要。每个 Agent 的访问都应按具体任务划定。\n\n原文另推荐 Replit 提出的 Agent Habitat Architecture 及其基于证据的成熟度分级，作为评估独立权限、经纪式凭证、受控数据流和带外遏制的参考框架。每一款云 Agent 产品仍需单独核查实际实现了哪些控制。\n\n### 原文参考资料\n\n以下资料由原文列出，查阅日期均为 2026 年 11 月 1 日；本站未在本轮重新核验这些外部材料。\n\n1. [Stack Overflow：AI | 2024 Developer Survey](https://survey.stackoverflow.co/2024/ai)。\n2. [Stack Overflow：AI | 2025 Developer Survey](https://survey.stackoverflow.co/2025/ai)。\n3. [Salt Security：Nearly half of enterprises report an AI agent took an unauthorized action last year](https://salt.security/press-releases/state-of-agentic-ai-and-api-security-2h-2026)，2026 年 10 月 13 日。\n4. [Cloud Security Alliance：More than half of organizations experience AI agent scope violations](https://cloudsecurityalliance.org/press-releases/2026/04/16/more-than-half-of-organizations-experience-ai-agent-scope-violations-cloud-security-alliance-study-finds)，2026 年 4 月 16 日。\n5. [V. Elliott：A defense contractor gave their personal AI agent access to a secure Pentagon system | WIRED](https://www.wired.com/story/a-defense-contractor-gave-their-personal-ai-agent-access-to-a-secure-pentagon-system/)。\n6. [L. H. Newman：A supply chain attack put malicious Anthropic Claude extensions on thousands of devices | WIRED](https://www.wired.com/story/trojan-malware-targets-thousands-of-anthropic-claude-developer-systems/)。\n7. [Cursor：Claude Code extension security notice](https://cursor.com/blog/claude-code-extension-security-notice)，2026 年 10 月 30 日更新。\n8. [M. Bar、R. McCarthy：s1ngularity: Supply chain attack leaks secrets on GitHub | Wiz](https://www.wiz.io/blog/s1ngularity-supply-chain-attack)，2025 年 8 月 27 日发布、8 月 29 日更新。\n9. [Invariant Labs：GitHub MCP vulnerability research](https://invariantlabs.ai/blog/mcp-github-vulnerability)。\n10. [H. Gill：Our response to the January 2025 Kudelski Security vulnerability disclosure | CodeRabbit](https://www.coderabbit.ai/blog/our-response-to-the-january-2025-kudelski-security-vulnerability-disclosure-action-and-continuous-improvement)，2025 年 8 月 19 日。\n11. [Salt Labs：How we hijacked an AI agent with a single email](https://salt.security/blog/how-we-hijacked-an-ai-agent-with-a-single-email)，2026 年 10 月 1 日。\n12. [T. Robinson：The largest theft in history: North Korea behind the $6.4 billion Binance hack | Elliptic](https://www.elliptic.co/insights/binance-largest-hack-in-history/)，2026 年 10 月 30 日发布、11 月 1 日更新。\n", "html": "<p>Amjad Masad 发布了一份安全建议，认为运行在员工终端上的 AI Agent 正成为企业和政府的系统性安全风险。一些机构已经开始限制 Claude Code 等工具；原文提到，据报道高盛采取了这样的措施。Replit 提出的办法，是让 Agent 默认运行在专用、受组织控制的云环境中，只访问完成当前任务所需的资源。</p>\n<p>建议书认为，供应链攻击原本就能侵入开发者电脑，并调用已安装的 AI 工具搜索企业敏感信息。Agent harness 往往拥有广泛权限，而人工监督正在减少，使其越来越值得攻击者关注。无人值守的自动化同样可能被 GitHub Issue 或邮件中隐藏的指令引向私有数据和未授权操作。</p>\n<p>个人 Agent 会进一步放大这类风险：它们主要由个人控制，组织管理不足，防护措施不一致，又被鼓励主动行动。读取每封邮件和日历邀请，也意味着每次互动都可能接触提示注入。Replit 因此主张，继续采用 Agent 的同时，要为会读取不可信内容、运行代码、代表用户行动的软件提供专门的执行环境；凭证、权限、网络访问和生产变更的控制应放在 Agent 无法自行改变的位置。</p>\n<h3>使用增长快于治理</h3>\n<p>原文引用 Stack Overflow 调查：使用或计划使用 AI 工具的受访者比例，从 2023 年的 70% 升至 2024 年的 76%，再到 2025 年的 84% [1][2]。这些数据反映的是不同年度样本中 AI 工具的采用与使用意向，并不是自主 Agent 使用率。</p>\n<p>Salt Labs 在其客户环境中检测到 MCP 相关基础设施的比例，从 2026 年 1 月的 16.7% 升至 8 月的 21.6%，增加 4.9 个百分点 [3]。原文提醒，这只是该供应商客户环境的观察，能否代表整个行业、前后客户样本是否一致，都还没有确定。</p>\n<p>部署与控制之间的差距更值得注意。在 Salt Security 2026 年 10 月的调查中，86.4% 的受访者说组织内至少有一个 Agent 在运行，但只有 17.5% 能自动停止在生产中出现异常行为的 Agent，只有 12.5% 能持续追踪所有 Agent 的完整执行路径 [3]。</p>\n<p>另一项 Cloud Security Alliance 研究中，47% 的受访者称过去一年发生过 Agent 相关安全事件，54% 称组织内有 1 到 100 个未经批准的 Agent，只有 31% 称组织正式采用了 Agent 治理政策 [4]。这项研究在 2025 年 9 月和 11 月调查了 445 名 IT 与安全专业人员，于 2026 年 4 月发布；Zenity 提供经费并参与设计问卷。原文认为，它支持治理存在缺口的判断，但不能把它与 Salt 的结果拼成一条事件率趋势。</p>\n<h3>不同攻击中的边界失效</h3>\n<p>建议书逐项列出了事故和研究案例，分别说明证据范围。</p>\n<p><strong>个人 Agent 接入敏感系统。</strong> WIRED 报道，一名 Accenture 承包商将个人 Claude Code 账号接入美国国防部的敏感环境，凭证和系统信息似乎流向了第三方服务 [5]。Accenture 否认这些指控，称独立调查认为指控没有根据。WIRED 也表示，没有迹象说明攻击者访问了机密或绝密系统。原文用这一争议案例说明敏感基础设施与个人 Agent 工具之间出现失控连接的风险，而非将争议当成定论。</p>\n<p><strong>开发者电脑上的恶意扩展。</strong> WIRED 报道，经 Cursor 市场分发的一个被篡改的 Claude Code 扩展，最多被 5000 名用户下载；它不是 Anthropic 发布的版本 [6]。Cursor 介绍，该扩展收集主机信息，并尝试安装持久化 SSH 后门 [7]。实现错误限制了后门在大部分受影响 macOS 和 Windows 主机上的效果，但仅卸载扩展不一定能移除持久化机制。原文提醒，不能依赖攻击者下次仍犯同样的错误。</p>\n<p><strong>恶意软件包调用 AI 工具寻找密钥。</strong> 在 2025 年 8 月 Nx 的 s1ngularity 攻击中，恶意软件包利用电脑上已有的 Claude、Gemini 和 Q 命令行工具辅助侦察。Wiz 观察到数百起成功的 AI 辅助活动，以及超过 1000 个有效 GitHub token 泄露。后续攻击使用这些 token，将超过 5500 个私有仓库公开，影响了 400 多名用户或组织；开发者电脑和部分构建流水线都受到了影响 [8]。</p>\n<p><strong>合法工具也可能成为数据外传通道。</strong> Invariant 演示了如何通过一个恶意公开 GitHub Issue，诱导使用 GitHub MCP 的 Agent 读取私有仓库资料，再将其写入公开 PR [9]。演示中的 MCP 服务器本身没有被攻破。这证明了一条可能的攻击路径，原始来源并未报告大规模泄露；获准使用的工具和目的服务，仍可能承载未经授权的数据转移。</p>\n<p><strong>工具跑出了预期沙箱。</strong> CodeRabbit 确认，研究人员于 2025 年 1 月发现 RuboCop 在沙箱外运行 [10]。公司称，它在 12 小时内完成了全面修复，没有发现客户数据被访问或存在恶意活动的证据。原文据此强调，隔离范围必须覆盖每一个可执行工具和子进程，不能只覆盖主要 Agent 运行时。</p>\n<p><strong>云端 Agent 暴露关联账号凭证。</strong> Salt Labs 演示了如何用恶意邮件内容，诱导 Manus 在云沙箱中执行代码；关联服务的 token 当时可被读取，安全警告却在载荷执行后才出现 [11]。Salt 称漏洞后来已修复。这也是云托管本身不等于安全的一个反例。</p>\n<p><strong>合法签名权限被滥用。</strong> Elliptic 对 10 月 29 日 Binance 失窃事件的分析认为，攻击者可能诱使 Binance 自身系统签署未经授权的交易。Binance 最初提到 DevOps 笔记本可能失陷，后来又披露其他入侵点，完整路径仍未确定。在以太坊上，签署的 EIP-7702 授权将热钱包的行为委托给攻击者控制的合约，而且委托在最初那笔交易后仍然有效 [12]。原文明确说明，这不是 AI Agent 攻击的证据；它体现的是另一项控制要求：即便凭证没有被直接窃取，只要失陷的调用方能用它授权有害操作，保护凭证本身也不够。</p>\n<p>原文将这些案例中的共同问题归为三类：不可信软件带着过大权限执行、不可信内容被当作指令，以及控制措施未能阻止最终操作。</p>\n<h3>为什么主张受管云环境</h3>\n<p>员工工作站可能同时拥有浏览器会话、SSH key、云凭证、私有仓库、内网访问和其他业务数据，远多于多数 Agent 任务所需的权限。</p>\n<p>专用云环境可以把 Agent 执行与工作站分离。组织能够只配置必要工作区，集中实施访问控制，独立记录操作，并在需要时停止或重建环境，而不必重建员工电脑。要获得这些收益，执行、策略实施和可观测性都必须真正进入受控环境。</p>\n<p>本地扩展即使把提示词发给云端模型，仍可能在本机执行代码。同样，把生产凭证复制到远端、给远端 Agent 不受限的网络访问，只是把风险挪了地方。目标是将失陷的 Agent 或依赖限制在一个权限有限的工作区内，组织政策对它的约束不应取决于员工本人拥有多大的权限。</p>\n<p>原文图 2 的文字说明描绘了这种边界：Agent 与工具运行在组织控制、任务限定的专用沙箱内，与员工设备的广泛权限分离；独立系统代理凭证，约束权限及流向获准资源的数据。审计、审批和遏制措施必须在 Agent 控制之外执行，而且这些保护需要经过验证，不能仅靠云托管的名称。</p>\n<h3>需要独立实施的控制</h3>\n<p>建议书要求将 Agent 执行视作不可信，并列出以下控制项：</p>\n<ul>\n<li><strong>经过验证的执行隔离。</strong> Agent、安装脚本、工具和依赖都应运行在专用沙箱内，安全实施机制放在其控制之外；不继承员工主目录、浏览器会话或不受限的企业网络权限。</li>\n<li><strong>经纪式凭证与独立身份。</strong> 外部服务凭证不应出现在 Agent 可读的内存、文件或环境变量中。请求通过代理授权，并绑定 Agent、发起人、组织和具体任务。</li>\n<li><strong>逐步提权授权。</strong> 隔离凭证还不够，操作、目标资源、目的地和委托权限的变化，都需要独立检查。高影响操作必须明确批准；拥有合法身份或能访问签名服务，不等于已经获准执行某项操作。</li>\n<li><strong>任务范围内的权限。</strong> 每次运行只获得需要的资源和操作权限，Agent 不得提升自身权限，也不得修改约束自己的政策。</li>\n<li><strong>网络与数据流限制。</strong> 对 DNS、直接 IP 访问、云元数据访问和外部请求加以控制；即使在同一个获准服务内部，也要区分操作和数据目的地。允许访问 GitHub，不等于允许把私有数据发布到 GitHub 任意位置。</li>\n<li><strong>独立的生产边界。</strong> Agent 可以提出改动，但不应长期持有生产写入权限。重要变更由可信的审批与部署系统实施，并向审批者展示真正将被授权的操作。</li>\n<li><strong>受控的软件供应链。</strong> 核查来源、固定获准版本、审阅工具和 MCP 配置的变化；安装依赖时不带生产凭证。</li>\n<li><strong>独立审计与遏制。</strong> 在 Agent 无法修改的位置记录操作及实施决策，不依赖 Agent 配合就能自动遏制或撤销权限。遏制还必须撤销已授予下游的委托与权限，而不只是停止最初进程或轮换凭证。</li>\n</ul>\n<h3>组织可以先做什么</h3>\n<p>Replit 建议，把获准的受管云 Agent 环境作为自主开发的标准路径；盘点现有本地 Agent 和扩展，移除不必要的访问，并禁止个人 Agent 账号连接敏感生产系统。</p>\n<p>供应商应实际证明这些边界：Agent 读不到服务凭证，不能绕过网络控制、扩大权限、修改审计记录或未经批准改动生产。遏制能力也应经过实测，包括紧急停止开关是否真的能停止 Agent 活动。</p>\n<p>可能受影响的 Cursor 安装，应先按供应商事件响应指南处理。把未来工作移到云端，并不能修复一台已经失陷的终端 [7]。监管行业和政府业务则应只使用获准处理相关数据与系统的环境，并检查模型端点、日志、存储和外部工具是否满足数据驻留、保留、合同及认证要求。</p>\n<p>建议书最后说明，它推荐的是有可验证安全控制支撑的云执行。所引资料并未建立本地 Agent 与云 Agent 之间可比的泄露率；它们说明的是隔离、有限权限、凭证分离和独立实施为何重要。每个 Agent 的访问都应按具体任务划定。</p>\n<p>原文另推荐 Replit 提出的 Agent Habitat Architecture 及其基于证据的成熟度分级，作为评估独立权限、经纪式凭证、受控数据流和带外遏制的参考框架。每一款云 Agent 产品仍需单独核查实际实现了哪些控制。</p>\n<h3>原文参考资料</h3>\n<p>以下资料由原文列出，查阅日期均为 2026 年 11 月 1 日；本站未在本轮重新核验这些外部材料。</p>\n<ol>\n<li><a href=\"https://survey.stackoverflow.co/2024/ai\" target=\"_blank\" rel=\"noopener noreferrer\">Stack Overflow：AI | 2024 Developer Survey</a>。</li>\n<li><a href=\"https://survey.stackoverflow.co/2025/ai\" target=\"_blank\" rel=\"noopener noreferrer\">Stack Overflow：AI | 2025 Developer Survey</a>。</li>\n<li><a href=\"https://salt.security/press-releases/state-of-agentic-ai-and-api-security-2h-2026\" target=\"_blank\" rel=\"noopener noreferrer\">Salt Security：Nearly half of enterprises report an AI agent took an unauthorized action last year</a>，2026 年 10 月 13 日。</li>\n<li><a href=\"https://cloudsecurityalliance.org/press-releases/2026/04/16/more-than-half-of-organizations-experience-ai-agent-scope-violations-cloud-security-alliance-study-finds\" target=\"_blank\" rel=\"noopener noreferrer\">Cloud Security Alliance：More than half of organizations experience AI agent scope violations</a>，2026 年 4 月 16 日。</li>\n<li><a href=\"https://www.wired.com/story/a-defense-contractor-gave-their-personal-ai-agent-access-to-a-secure-pentagon-system/\" target=\"_blank\" rel=\"noopener noreferrer\">V. Elliott：A defense contractor gave their personal AI agent access to a secure Pentagon system | WIRED</a>。</li>\n<li><a href=\"https://www.wired.com/story/trojan-malware-targets-thousands-of-anthropic-claude-developer-systems/\" target=\"_blank\" rel=\"noopener noreferrer\">L. H. Newman：A supply chain attack put malicious Anthropic Claude extensions on thousands of devices | WIRED</a>。</li>\n<li><a href=\"https://cursor.com/blog/claude-code-extension-security-notice\" target=\"_blank\" rel=\"noopener noreferrer\">Cursor：Claude Code extension security notice</a>，2026 年 10 月 30 日更新。</li>\n<li><a href=\"https://www.wiz.io/blog/s1ngularity-supply-chain-attack\" target=\"_blank\" rel=\"noopener noreferrer\">M. Bar、R. McCarthy：s1ngularity: Supply chain attack leaks secrets on GitHub | Wiz</a>，2025 年 8 月 27 日发布、8 月 29 日更新。</li>\n<li><a href=\"https://invariantlabs.ai/blog/mcp-github-vulnerability\" target=\"_blank\" rel=\"noopener noreferrer\">Invariant Labs：GitHub MCP vulnerability research</a>。</li>\n<li><a href=\"https://www.coderabbit.ai/blog/our-response-to-the-january-2025-kudelski-security-vulnerability-disclosure-action-and-continuous-improvement\" target=\"_blank\" rel=\"noopener noreferrer\">H. Gill：Our response to the January 2025 Kudelski Security vulnerability disclosure | CodeRabbit</a>，2025 年 8 月 19 日。</li>\n<li><a href=\"https://salt.security/blog/how-we-hijacked-an-ai-agent-with-a-single-email\" target=\"_blank\" rel=\"noopener noreferrer\">Salt Labs：How we hijacked an AI agent with a single email</a>，2026 年 10 月 1 日。</li>\n<li><a href=\"https://www.elliptic.co/insights/binance-largest-hack-in-history/\" target=\"_blank\" rel=\"noopener noreferrer\">T. Robinson：The largest theft in history: North Korea behind the $6.4 billion Binance hack | Elliptic</a>，2026 年 10 月 30 日发布、11 月 1 日更新。</li>\n</ol>\n"}}]]></qiaomu:versions>
    </item>
    <item>
      <title>Levelsio 用 Claude Code 将《战地 1942》试玩版移植到浏览器</title>
      <link>https://xnews.qiaomu.ai/a/levelsio-bf1942-web</link>
      <guid isPermaLink="true">https://xnews.qiaomu.ai/a/levelsio-bf1942-web</guid>
      <pubDate>Mon, 02 Nov 2026 21:55:09 +0000</pubDate>
      <author>Pieter Levels</author>
      <description><![CDATA[<p><em>他介绍了从 x86 反汇编、翻译成 C，到编译为 WebAssembly 和接入多人服务器的过程。</em></p>
<h2>乔木改写</h2>
<p>Pieter Levels 说，他反编译了可能是自己最喜欢的游戏《Battlefield 1942》，把它放到网页上，并加入多人联机。可试玩的是免费 shareware demo，地址为 <a href="https://bf1942.pieter.com" target="_blank" rel="noopener noreferrer">bf1942.pieter.com</a>。</p>
<p>按他的介绍，这次比之前移植 Quake 和 DOOM 困难得多：后两者已有大量开源项目和前人的工作可用，而《Battlefield 1942》没有这样的基础。他说，之前没人做过这个移植，也没有可用的开源引擎；开发商不像 id Software 对 Quake 3 那样开放过引擎源码。</p>
<p>他在半年前试过一次，基本放弃了。这次使用 Opus 5.5，重新请它尝试把文件夹中的 BF1942 demo 移植到网页。Levels 坦言，虽然说是自己和 Claude Code 合作，大部分工作实际由 Claude Code 完成。</p>
<p>他列出的步骤包括：</p>
<ul>
<li>反汇编原始 x86 机器码，识别出约 57000 个 x86 函数。</li>
<li>把每个 x86 函数翻译成 C 函数，例如将 <code>mov eax, [esi+0x110]</code> 转为 <code>eax = READ32(esi + 0x110)</code>。他也承认自己并不理解这些代码的含义。</li>
<li>生成约 100000 行 C 代码。</li>
<li>用 Emscripten 编译为 WebAssembly。</li>
<li>将游戏使用的约 300 个 Windows 和 Direct3D 函数重写为 WebGL 2、OpenGL 对应实现，使其能在网页上运行。</li>
<li>自行构建网络栈，通过 WebSocket 连接多人服务器。</li>
</ul>
<p>Levels 说，他并不清楚 Claude 是怎么完成这些工作的，但结果似乎能运行。他邀请读者试玩，并到原帖反馈发现的问题。</p>
<section class="rewrite-source-media" aria-label="原文附带媒体"><h3 class="source-media-heading">原文附带媒体</h3><p class="completeness-note">原文附带媒体；未核验其与具体段落的对应关系。</p><figure data-media-id="m_7e6088547aeb5301"><video controls playsinline preload="none" src="https://video.twimg.com/amplify_video/2117374770253565952/vid/avc1/1080x1920/qdwjPQkAwvtgGImY.mp4" poster="https://pbs.twimg.com/amplify_video_thumb/2117374770253565952/img/6WkHxBF81dMfyKCf.jpg"></video><figcaption><a href="https://video.twimg.com/amplify_video/2117374770253565952/vid/avc1/1080x1920/qdwjPQkAwvtgGImY.mp4">打开原始媒体 ↗</a></figcaption></figure></section>
<h2>原文</h2>
<p><em>Battlefield 1942 decompiled to the browser</em></p>
<figure data-media-id="m_7e6088547aeb5301"><video controls playsinline preload="none" src="https://video.twimg.com/amplify_video/2117374770253565952/vid/avc1/1080x1920/qdwjPQkAwvtgGImY.mp4" poster="https://pbs.twimg.com/amplify_video_thumb/2117374770253565952/img/6WkHxBF81dMfyKCf.jpg"></video><figcaption><a href="https://video.twimg.com/amplify_video/2117374770253565952/vid/avc1/1080x1920/qdwjPQkAwvtgGImY.mp4">打开原始媒体 ↗</a></figcaption></figure>
<p>I decompiled probably my favorite game ever: Battlefield 1942 and I put it on the web with multiplayer for you to play here:</p>
<p>👉 https://t.co/6C8H8KtSaU 👈</p>
<p>(It&#x27;s the free shareware demo)</p>
<p>It was way harder than the other ports like Quake and DOOM I did because they already had lots of open source projects and work behind them</p>
<p>In case of Battlefield 1942 there was literally absolutely nothing to work on top of, nobody had ever ported it and there was no open source engine for it, nor did the makers ever open source it (like id Software did with Quake 3)</p>
<p>I tried it 6 months ago and essentiay gave up but I tried it today again with Opus 5.5 asking &quot;can you try port the BF1942 demo in this folder to web&quot;</p>
<p>So me and Claude Code (well let&#x27;s be honest mostly Claude Code) did crazy shit today:</p>
<ul>
<li>it disassembled the x86 raw machine code to find 57,000 x86 functions</li>
<li>it translated each x86 function into a C function (mov eax, [esi+0x110] becomes eax = READ32(esi + 0x110), I have no idea what any of this means btw)</li>
<li>it outputed 100,000 lines of C</li>
<li>it then compiled that to WebAsswmbly with Emscripten</li>
<li>there were 300x Windows and Direct3D functions used which we had to rewrite to WebGL 2 and OpenGL to work on the web</li>
<li>then we had to build our own network stack so it could connect to our multiplayer server via WebSockets</li>
</ul>
<p>I have no idea how it did any of this but it did it and it seems to work! 😊</p>
<p>Come play and report any bugs here!</p>
<p><strong>原文链接：</strong><a href="https://x.com/levelsio/status/2117374984192512391">https://x.com/levelsio/status/2117374984192512391</a></p>
<p><strong>相关链接：</strong><a href="https://bf1942.pieter.com">https://bf1942.pieter.com</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>他介绍了从 x86 反汇编、翻译成 C，到编译为 WebAssembly 和接入多人服务器的过程。</em></p>
<h2>乔木改写</h2>
<p>Pieter Levels 说，他反编译了可能是自己最喜欢的游戏《Battlefield 1942》，把它放到网页上，并加入多人联机。可试玩的是免费 shareware demo，地址为 <a href="https://bf1942.pieter.com" target="_blank" rel="noopener noreferrer">bf1942.pieter.com</a>。</p>
<p>按他的介绍，这次比之前移植 Quake 和 DOOM 困难得多：后两者已有大量开源项目和前人的工作可用，而《Battlefield 1942》没有这样的基础。他说，之前没人做过这个移植，也没有可用的开源引擎；开发商不像 id Software 对 Quake 3 那样开放过引擎源码。</p>
<p>他在半年前试过一次，基本放弃了。这次使用 Opus 5.5，重新请它尝试把文件夹中的 BF1942 demo 移植到网页。Levels 坦言，虽然说是自己和 Claude Code 合作，大部分工作实际由 Claude Code 完成。</p>
<p>他列出的步骤包括：</p>
<ul>
<li>反汇编原始 x86 机器码，识别出约 57000 个 x86 函数。</li>
<li>把每个 x86 函数翻译成 C 函数，例如将 <code>mov eax, [esi+0x110]</code> 转为 <code>eax = READ32(esi + 0x110)</code>。他也承认自己并不理解这些代码的含义。</li>
<li>生成约 100000 行 C 代码。</li>
<li>用 Emscripten 编译为 WebAssembly。</li>
<li>将游戏使用的约 300 个 Windows 和 Direct3D 函数重写为 WebGL 2、OpenGL 对应实现，使其能在网页上运行。</li>
<li>自行构建网络栈，通过 WebSocket 连接多人服务器。</li>
</ul>
<p>Levels 说，他并不清楚 Claude 是怎么完成这些工作的，但结果似乎能运行。他邀请读者试玩，并到原帖反馈发现的问题。</p>
<section class="rewrite-source-media" aria-label="原文附带媒体"><h3 class="source-media-heading">原文附带媒体</h3><p class="completeness-note">原文附带媒体；未核验其与具体段落的对应关系。</p><figure data-media-id="m_7e6088547aeb5301"><video controls playsinline preload="none" src="https://video.twimg.com/amplify_video/2117374770253565952/vid/avc1/1080x1920/qdwjPQkAwvtgGImY.mp4" poster="https://pbs.twimg.com/amplify_video_thumb/2117374770253565952/img/6WkHxBF81dMfyKCf.jpg"></video><figcaption><a href="https://video.twimg.com/amplify_video/2117374770253565952/vid/avc1/1080x1920/qdwjPQkAwvtgGImY.mp4">打开原始媒体 ↗</a></figcaption></figure></section>
<h2>原文</h2>
<p><em>Battlefield 1942 decompiled to the browser</em></p>
<figure data-media-id="m_7e6088547aeb5301"><video controls playsinline preload="none" src="https://video.twimg.com/amplify_video/2117374770253565952/vid/avc1/1080x1920/qdwjPQkAwvtgGImY.mp4" poster="https://pbs.twimg.com/amplify_video_thumb/2117374770253565952/img/6WkHxBF81dMfyKCf.jpg"></video><figcaption><a href="https://video.twimg.com/amplify_video/2117374770253565952/vid/avc1/1080x1920/qdwjPQkAwvtgGImY.mp4">打开原始媒体 ↗</a></figcaption></figure>
<p>I decompiled probably my favorite game ever: Battlefield 1942 and I put it on the web with multiplayer for you to play here:</p>
<p>👉 https://t.co/6C8H8KtSaU 👈</p>
<p>(It&#x27;s the free shareware demo)</p>
<p>It was way harder than the other ports like Quake and DOOM I did because they already had lots of open source projects and work behind them</p>
<p>In case of Battlefield 1942 there was literally absolutely nothing to work on top of, nobody had ever ported it and there was no open source engine for it, nor did the makers ever open source it (like id Software did with Quake 3)</p>
<p>I tried it 6 months ago and essentiay gave up but I tried it today again with Opus 5.5 asking &quot;can you try port the BF1942 demo in this folder to web&quot;</p>
<p>So me and Claude Code (well let&#x27;s be honest mostly Claude Code) did crazy shit today:</p>
<ul>
<li>it disassembled the x86 raw machine code to find 57,000 x86 functions</li>
<li>it translated each x86 function into a C function (mov eax, [esi+0x110] becomes eax = READ32(esi + 0x110), I have no idea what any of this means btw)</li>
<li>it outputed 100,000 lines of C</li>
<li>it then compiled that to WebAsswmbly with Emscripten</li>
<li>there were 300x Windows and Direct3D functions used which we had to rewrite to WebGL 2 and OpenGL to work on the web</li>
<li>then we had to build our own network stack so it could connect to our multiplayer server via WebSockets</li>
</ul>
<p>I have no idea how it did any of this but it did it and it seems to work! 😊</p>
<p>Come play and report any bugs here!</p>
<p><strong>原文链接：</strong><a href="https://x.com/levelsio/status/2117374984192512391">https://x.com/levelsio/status/2117374984192512391</a></p>
<p><strong>相关链接：</strong><a href="https://bf1942.pieter.com">https://bf1942.pieter.com</a></p>]]></content:encoded>
      <qiaomu:versions><![CDATA[{"version": 1, "original": {"title": "Battlefield 1942 decompiled to the browser", "url": "https://x.com/levelsio/status/2117374984192512391", "lang": "en", "html": "<h2>Battlefield 1942 decompiled to the browser</h2>\n<figure data-media-id=\"m_7e6088547aeb5301\"><video controls playsinline preload=\"none\" src=\"https://video.twimg.com/amplify_video/2117374770253565952/vid/avc1/1080x1920/qdwjPQkAwvtgGImY.mp4\" poster=\"https://pbs.twimg.com/amplify_video_thumb/2117374770253565952/img/6WkHxBF81dMfyKCf.jpg\"></video><figcaption><a href=\"https://video.twimg.com/amplify_video/2117374770253565952/vid/avc1/1080x1920/qdwjPQkAwvtgGImY.mp4\">打开原始媒体 ↗</a></figcaption></figure>\n<p>I decompiled probably my favorite game ever: Battlefield 1942 and I put it on the web with multiplayer for you to play here:</p>\n<p>👉 https://t.co/6C8H8KtSaU 👈</p>\n<p>(It&#x27;s the free shareware demo)</p>\n<p>It was way harder than the other ports like Quake and DOOM I did because they already had lots of open source projects and work behind them</p>\n<p>In case of Battlefield 1942 there was literally absolutely nothing to work on top of, nobody had ever ported it and there was no open source engine for it, nor did the makers ever open source it (like id Software did with Quake 3)</p>\n<p>I tried it 6 months ago and essentiay gave up but I tried it today again with Opus 5.5 asking &quot;can you try port the BF1942 demo in this folder to web&quot;</p>\n<p>So me and Claude Code (well let&#x27;s be honest mostly Claude Code) did crazy shit today:</p>\n<ul>\n<li>it disassembled the x86 raw machine code to find 57,000 x86 functions</li>\n<li>it translated each x86 function into a C function (mov eax, [esi+0x110] becomes eax = READ32(esi + 0x110), I have no idea what any of this means btw)</li>\n<li>it outputed 100,000 lines of C</li>\n<li>it then compiled that to WebAsswmbly with Emscripten</li>\n<li>there were 300x Windows and Direct3D functions used which we had to rewrite to WebGL 2 and OpenGL to work on the web</li>\n<li>then we had to build our own network stack so it could connect to our multiplayer server via WebSockets</li>\n</ul>\n<p>I have no idea how it did any of this but it did it and it seems to work! 😊</p>\n<p>Come play and report any bugs here!</p>\n<p>原文链接：<a href=\"https://x.com/levelsio/status/2117374984192512391\">https://x.com/levelsio/status/2117374984192512391</a></p>\n<p>相关链接：<a href=\"https://bf1942.pieter.com\">https://bf1942.pieter.com</a></p>"}, "rewrite": {"title": "Levelsio 用 Claude Code 将《战地 1942》试玩版移植到浏览器", "markdown": "Pieter Levels 说，他反编译了可能是自己最喜欢的游戏《Battlefield 1942》，把它放到网页上，并加入多人联机。可试玩的是免费 shareware demo，地址为 [bf1942.pieter.com](https://bf1942.pieter.com)。\n\n按他的介绍，这次比之前移植 Quake 和 DOOM 困难得多：后两者已有大量开源项目和前人的工作可用，而《Battlefield 1942》没有这样的基础。他说，之前没人做过这个移植，也没有可用的开源引擎；开发商不像 id Software 对 Quake 3 那样开放过引擎源码。\n\n他在半年前试过一次，基本放弃了。这次使用 Opus 5.5，重新请它尝试把文件夹中的 BF1942 demo 移植到网页。Levels 坦言，虽然说是自己和 Claude Code 合作，大部分工作实际由 Claude Code 完成。\n\n他列出的步骤包括：\n\n- 反汇编原始 x86 机器码，识别出约 57000 个 x86 函数。\n- 把每个 x86 函数翻译成 C 函数，例如将 `mov eax, [esi+0x110]` 转为 `eax = READ32(esi + 0x110)`。他也承认自己并不理解这些代码的含义。\n- 生成约 100000 行 C 代码。\n- 用 Emscripten 编译为 WebAssembly。\n- 将游戏使用的约 300 个 Windows 和 Direct3D 函数重写为 WebGL 2、OpenGL 对应实现，使其能在网页上运行。\n- 自行构建网络栈，通过 WebSocket 连接多人服务器。\n\nLevels 说，他并不清楚 Claude 是怎么完成这些工作的，但结果似乎能运行。他邀请读者试玩，并到原帖反馈发现的问题。\n\n\n### 原文附带媒体\n\n原文附带媒体；未核验其与具体段落的对应关系。\n\n[观看原视频](<https://video.twimg.com/amplify_video/2117374770253565952/vid/avc1/1080x1920/qdwjPQkAwvtgGImY.mp4>)", "html": "<p>Pieter Levels 说，他反编译了可能是自己最喜欢的游戏《Battlefield 1942》，把它放到网页上，并加入多人联机。可试玩的是免费 shareware demo，地址为 <a href=\"https://bf1942.pieter.com\" target=\"_blank\" rel=\"noopener noreferrer\">bf1942.pieter.com</a>。</p>\n<p>按他的介绍，这次比之前移植 Quake 和 DOOM 困难得多：后两者已有大量开源项目和前人的工作可用，而《Battlefield 1942》没有这样的基础。他说，之前没人做过这个移植，也没有可用的开源引擎；开发商不像 id Software 对 Quake 3 那样开放过引擎源码。</p>\n<p>他在半年前试过一次，基本放弃了。这次使用 Opus 5.5，重新请它尝试把文件夹中的 BF1942 demo 移植到网页。Levels 坦言，虽然说是自己和 Claude Code 合作，大部分工作实际由 Claude Code 完成。</p>\n<p>他列出的步骤包括：</p>\n<ul>\n<li>反汇编原始 x86 机器码，识别出约 57000 个 x86 函数。</li>\n<li>把每个 x86 函数翻译成 C 函数，例如将 <code>mov eax, [esi+0x110]</code> 转为 <code>eax = READ32(esi + 0x110)</code>。他也承认自己并不理解这些代码的含义。</li>\n<li>生成约 100000 行 C 代码。</li>\n<li>用 Emscripten 编译为 WebAssembly。</li>\n<li>将游戏使用的约 300 个 Windows 和 Direct3D 函数重写为 WebGL 2、OpenGL 对应实现，使其能在网页上运行。</li>\n<li>自行构建网络栈，通过 WebSocket 连接多人服务器。</li>\n</ul>\n<p>Levels 说，他并不清楚 Claude 是怎么完成这些工作的，但结果似乎能运行。他邀请读者试玩，并到原帖反馈发现的问题。</p>\n<section class=\"rewrite-source-media\" aria-label=\"原文附带媒体\"><h3 class=\"source-media-heading\">原文附带媒体</h3><p class=\"completeness-note\">原文附带媒体；未核验其与具体段落的对应关系。</p><figure data-media-id=\"m_7e6088547aeb5301\"><video controls playsinline preload=\"none\" src=\"https://video.twimg.com/amplify_video/2117374770253565952/vid/avc1/1080x1920/qdwjPQkAwvtgGImY.mp4\" poster=\"https://pbs.twimg.com/amplify_video_thumb/2117374770253565952/img/6WkHxBF81dMfyKCf.jpg\"></video><figcaption><a href=\"https://video.twimg.com/amplify_video/2117374770253565952/vid/avc1/1080x1920/qdwjPQkAwvtgGImY.mp4\">打开原始媒体 ↗</a></figcaption></figure></section>"}}]]></qiaomu:versions>
    </item>
    <item>
      <title>Karpathy 做了 HackerTube：从 4300 万条 HN 评论中找到 6454 个视频</title>
      <link>https://xnews.qiaomu.ai/a/karpathy-hackertube</link>
      <guid isPermaLink="true">https://xnews.qiaomu.ai/a/karpathy-hackertube</guid>
      <pubDate>Sun, 01 Nov 2026 18:14:46 +0000</pubDate>
      <author>Andrej Karpathy</author>
      <description><![CDATA[<p><em>他用 Opus 5.5 花了约两小时完成这个周末项目；推荐无需登录，底层数据也可下载。</em></p>
<h2>乔木改写</h2>
<p>Andrej Karpathy 不满 YouTube 的推荐，于是做了一个周末项目 HackerTube。他让 Claude 从 Hacker News 二十年来约 4300 万条评论中，筛出反复被推荐的 6454 个视频。按他的说法，整个项目用 Opus 5.5 花了约两小时，观看体验明显更好。</p>
<p>他列出了几个设计选择：</p>
<ul>
<li>不登录也能获得推荐，使用状态保存在本地浏览器会话中。</li>
<li>缩略图选取视频中段有代表性的一帧，而非上传者经过大量 A/B 测试优化的封面。</li>
<li>评论分析的底层数据打包为一个 zip 文件，其他人可以把它交给 Claude，要求制作自己的版本。</li>
<li>另有 HackerTube Longs。</li>
</ul>
<p>他也介绍了制作过程。默认工具是 Mac 版 Claude Code 桌面应用，模型为 Opus 5.5，使用 Medium effort。他只与 Claude 对话，让它完成工作；自己配合做的手动操作都在浏览器中：从 Google Cloud 界面创建查询 YouTube 视频元数据所需的 API key、启动用于提供服务的 VPS，以及购买域名。他提到，这种配合方式让他想起 MenuGen。</p>
<p>VPS 启动后，他把 IP 交给 Claude，让它更新系统、处理安全加固、部署并优化代码。他说，Claude 完成了这些工作。</p>
<p>Karpathy 感慨，一些过去需要数周甚至数月的项目，如今吃顿早饭的工夫，用少量提示就能做出来。他想知道，还有哪些项目是大家尚未想到的。原帖中的项目链接是 <a href="https://t.co/JIhXN7OSh1" target="_blank" rel="noopener noreferrer">HackerTube</a>。</p>
<section class="rewrite-source-media" aria-label="原文附带媒体"><h3 class="source-media-heading">原文附带媒体</h3><p class="completeness-note">原文附带媒体；未核验其与具体段落的对应关系。</p><figure data-media-id="m_1056aca2aea7617b"><img src="https://pbs.twimg.com/media/HWDnuuCaIAA__wa.jpg" alt=""><figcaption><a href="https://pbs.twimg.com/media/HWDnuuCaIAA__wa.jpg">打开原始媒体 ↗</a></figcaption></figure></section>
<h2>原文</h2>
<p><em>Weekend hack: HackerTube</em></p>
<figure data-media-id="m_1056aca2aea7617b"><img src="https://pbs.twimg.com/media/HWDnuuCaIAA__wa.jpg" alt=""><figcaption><a href="https://pbs.twimg.com/media/HWDnuuCaIAA__wa.jpg">打开原始媒体 ↗</a></figcaption></figure>
<p>Weekend hack: HackerTube. I was annoyed with YouTube&#x27;s recommendations so I had Claude filter down 43M comments over 20 years of HN to 6,454 videos that keep being recommended. <em>Significantly</em> better viewing experience, ~2 hours with Opus 5.5: https://t.co/JIhXN7OSh1</p>
<ul>
<li>Excellent recs without any logins (state is kept in local browser session)</li>
<li>Thumbnail is a representative frame from middle of the video instead of the super duper A/B test hyper-optimized user uploads</li>
<li>Underlying data from the comment analysis as one zip file, point your Claude at it and ask for your own version</li>
<li>HackerTube Longs ✊</li>
</ul>
<p>A bit more on the process: I use Claude Code (desktop app for Mac), Opus 5.5 on Medium effort as my default. I only talk to Claude and have it do everything, the only &quot;manual work&quot; I helped with in tandem was in the browser (reminiscent of MenuGen): 1) I had to create some kind of API key from Google Cloud UI to query YouTube for video metadata, 2) I booted up a VPS box for serving and 3) I bought the domain name. Once the box was up I gave Claude the IP and told it update, secure, harden, deploy and optimize the code, and it did the whole thing.</p>
<p>Many awesome projects that would have normally taken weeks/months even can now be few-shotted for breakfast. What else are we not thinking of.</p>
<p><strong>原文链接：</strong><a href="https://x.com/karpathy/status/2116957135661945283">https://x.com/karpathy/status/2116957135661945283</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>他用 Opus 5.5 花了约两小时完成这个周末项目；推荐无需登录，底层数据也可下载。</em></p>
<h2>乔木改写</h2>
<p>Andrej Karpathy 不满 YouTube 的推荐，于是做了一个周末项目 HackerTube。他让 Claude 从 Hacker News 二十年来约 4300 万条评论中，筛出反复被推荐的 6454 个视频。按他的说法，整个项目用 Opus 5.5 花了约两小时，观看体验明显更好。</p>
<p>他列出了几个设计选择：</p>
<ul>
<li>不登录也能获得推荐，使用状态保存在本地浏览器会话中。</li>
<li>缩略图选取视频中段有代表性的一帧，而非上传者经过大量 A/B 测试优化的封面。</li>
<li>评论分析的底层数据打包为一个 zip 文件，其他人可以把它交给 Claude，要求制作自己的版本。</li>
<li>另有 HackerTube Longs。</li>
</ul>
<p>他也介绍了制作过程。默认工具是 Mac 版 Claude Code 桌面应用，模型为 Opus 5.5，使用 Medium effort。他只与 Claude 对话，让它完成工作；自己配合做的手动操作都在浏览器中：从 Google Cloud 界面创建查询 YouTube 视频元数据所需的 API key、启动用于提供服务的 VPS，以及购买域名。他提到，这种配合方式让他想起 MenuGen。</p>
<p>VPS 启动后，他把 IP 交给 Claude，让它更新系统、处理安全加固、部署并优化代码。他说，Claude 完成了这些工作。</p>
<p>Karpathy 感慨，一些过去需要数周甚至数月的项目，如今吃顿早饭的工夫，用少量提示就能做出来。他想知道，还有哪些项目是大家尚未想到的。原帖中的项目链接是 <a href="https://t.co/JIhXN7OSh1" target="_blank" rel="noopener noreferrer">HackerTube</a>。</p>
<section class="rewrite-source-media" aria-label="原文附带媒体"><h3 class="source-media-heading">原文附带媒体</h3><p class="completeness-note">原文附带媒体；未核验其与具体段落的对应关系。</p><figure data-media-id="m_1056aca2aea7617b"><img src="https://pbs.twimg.com/media/HWDnuuCaIAA__wa.jpg" alt=""><figcaption><a href="https://pbs.twimg.com/media/HWDnuuCaIAA__wa.jpg">打开原始媒体 ↗</a></figcaption></figure></section>
<h2>原文</h2>
<p><em>Weekend hack: HackerTube</em></p>
<figure data-media-id="m_1056aca2aea7617b"><img src="https://pbs.twimg.com/media/HWDnuuCaIAA__wa.jpg" alt=""><figcaption><a href="https://pbs.twimg.com/media/HWDnuuCaIAA__wa.jpg">打开原始媒体 ↗</a></figcaption></figure>
<p>Weekend hack: HackerTube. I was annoyed with YouTube&#x27;s recommendations so I had Claude filter down 43M comments over 20 years of HN to 6,454 videos that keep being recommended. <em>Significantly</em> better viewing experience, ~2 hours with Opus 5.5: https://t.co/JIhXN7OSh1</p>
<ul>
<li>Excellent recs without any logins (state is kept in local browser session)</li>
<li>Thumbnail is a representative frame from middle of the video instead of the super duper A/B test hyper-optimized user uploads</li>
<li>Underlying data from the comment analysis as one zip file, point your Claude at it and ask for your own version</li>
<li>HackerTube Longs ✊</li>
</ul>
<p>A bit more on the process: I use Claude Code (desktop app for Mac), Opus 5.5 on Medium effort as my default. I only talk to Claude and have it do everything, the only &quot;manual work&quot; I helped with in tandem was in the browser (reminiscent of MenuGen): 1) I had to create some kind of API key from Google Cloud UI to query YouTube for video metadata, 2) I booted up a VPS box for serving and 3) I bought the domain name. Once the box was up I gave Claude the IP and told it update, secure, harden, deploy and optimize the code, and it did the whole thing.</p>
<p>Many awesome projects that would have normally taken weeks/months even can now be few-shotted for breakfast. What else are we not thinking of.</p>
<p><strong>原文链接：</strong><a href="https://x.com/karpathy/status/2116957135661945283">https://x.com/karpathy/status/2116957135661945283</a></p>]]></content:encoded>
      <qiaomu:versions><![CDATA[{"version": 1, "original": {"title": "Weekend hack: HackerTube", "url": "https://x.com/karpathy/status/2116957135661945283", "lang": "en", "html": "<h2>Weekend hack: HackerTube</h2>\n<figure data-media-id=\"m_1056aca2aea7617b\"><img src=\"https://pbs.twimg.com/media/HWDnuuCaIAA__wa.jpg\" alt=\"\"><figcaption><a href=\"https://pbs.twimg.com/media/HWDnuuCaIAA__wa.jpg\">打开原始媒体 ↗</a></figcaption></figure>\n<p>Weekend hack: HackerTube. I was annoyed with YouTube&#x27;s recommendations so I had Claude filter down 43M comments over 20 years of HN to 6,454 videos that keep being recommended. <em>Significantly</em> better viewing experience, ~2 hours with Opus 5.5: https://t.co/JIhXN7OSh1</p>\n<ul>\n<li>Excellent recs without any logins (state is kept in local browser session)</li>\n<li>Thumbnail is a representative frame from middle of the video instead of the super duper A/B test hyper-optimized user uploads</li>\n<li>Underlying data from the comment analysis as one zip file, point your Claude at it and ask for your own version</li>\n<li>HackerTube Longs ✊</li>\n</ul>\n<p>A bit more on the process: I use Claude Code (desktop app for Mac), Opus 5.5 on Medium effort as my default. I only talk to Claude and have it do everything, the only &quot;manual work&quot; I helped with in tandem was in the browser (reminiscent of MenuGen): 1) I had to create some kind of API key from Google Cloud UI to query YouTube for video metadata, 2) I booted up a VPS box for serving and 3) I bought the domain name. Once the box was up I gave Claude the IP and told it update, secure, harden, deploy and optimize the code, and it did the whole thing.</p>\n<p>Many awesome projects that would have normally taken weeks/months even can now be few-shotted for breakfast. What else are we not thinking of.</p>\n<p>原文链接：<a href=\"https://x.com/karpathy/status/2116957135661945283\">https://x.com/karpathy/status/2116957135661945283</a></p>"}, "rewrite": {"title": "Karpathy 做了 HackerTube：从 4300 万条 HN 评论中找到 6454 个视频", "markdown": "Andrej Karpathy 不满 YouTube 的推荐，于是做了一个周末项目 HackerTube。他让 Claude 从 Hacker News 二十年来约 4300 万条评论中，筛出反复被推荐的 6454 个视频。按他的说法，整个项目用 Opus 5.5 花了约两小时，观看体验明显更好。\n\n他列出了几个设计选择：\n\n- 不登录也能获得推荐，使用状态保存在本地浏览器会话中。\n- 缩略图选取视频中段有代表性的一帧，而非上传者经过大量 A/B 测试优化的封面。\n- 评论分析的底层数据打包为一个 zip 文件，其他人可以把它交给 Claude，要求制作自己的版本。\n- 另有 HackerTube Longs。\n\n他也介绍了制作过程。默认工具是 Mac 版 Claude Code 桌面应用，模型为 Opus 5.5，使用 Medium effort。他只与 Claude 对话，让它完成工作；自己配合做的手动操作都在浏览器中：从 Google Cloud 界面创建查询 YouTube 视频元数据所需的 API key、启动用于提供服务的 VPS，以及购买域名。他提到，这种配合方式让他想起 MenuGen。\n\nVPS 启动后，他把 IP 交给 Claude，让它更新系统、处理安全加固、部署并优化代码。他说，Claude 完成了这些工作。\n\nKarpathy 感慨，一些过去需要数周甚至数月的项目，如今吃顿早饭的工夫，用少量提示就能做出来。他想知道，还有哪些项目是大家尚未想到的。原帖中的项目链接是 [HackerTube](https://t.co/JIhXN7OSh1)。\n\n\n### 原文附带媒体\n\n原文附带媒体；未核验其与具体段落的对应关系。\n\n![原帖图片](<https://pbs.twimg.com/media/HWDnuuCaIAA__wa.jpg>)", "html": "<p>Andrej Karpathy 不满 YouTube 的推荐，于是做了一个周末项目 HackerTube。他让 Claude 从 Hacker News 二十年来约 4300 万条评论中，筛出反复被推荐的 6454 个视频。按他的说法，整个项目用 Opus 5.5 花了约两小时，观看体验明显更好。</p>\n<p>他列出了几个设计选择：</p>\n<ul>\n<li>不登录也能获得推荐，使用状态保存在本地浏览器会话中。</li>\n<li>缩略图选取视频中段有代表性的一帧，而非上传者经过大量 A/B 测试优化的封面。</li>\n<li>评论分析的底层数据打包为一个 zip 文件，其他人可以把它交给 Claude，要求制作自己的版本。</li>\n<li>另有 HackerTube Longs。</li>\n</ul>\n<p>他也介绍了制作过程。默认工具是 Mac 版 Claude Code 桌面应用，模型为 Opus 5.5，使用 Medium effort。他只与 Claude 对话，让它完成工作；自己配合做的手动操作都在浏览器中：从 Google Cloud 界面创建查询 YouTube 视频元数据所需的 API key、启动用于提供服务的 VPS，以及购买域名。他提到，这种配合方式让他想起 MenuGen。</p>\n<p>VPS 启动后，他把 IP 交给 Claude，让它更新系统、处理安全加固、部署并优化代码。他说，Claude 完成了这些工作。</p>\n<p>Karpathy 感慨，一些过去需要数周甚至数月的项目，如今吃顿早饭的工夫，用少量提示就能做出来。他想知道，还有哪些项目是大家尚未想到的。原帖中的项目链接是 <a href=\"https://t.co/JIhXN7OSh1\" target=\"_blank\" rel=\"noopener noreferrer\">HackerTube</a>。</p>\n<section class=\"rewrite-source-media\" aria-label=\"原文附带媒体\"><h3 class=\"source-media-heading\">原文附带媒体</h3><p class=\"completeness-note\">原文附带媒体；未核验其与具体段落的对应关系。</p><figure data-media-id=\"m_1056aca2aea7617b\"><img src=\"https://pbs.twimg.com/media/HWDnuuCaIAA__wa.jpg\" alt=\"\"><figcaption><a href=\"https://pbs.twimg.com/media/HWDnuuCaIAA__wa.jpg\">打开原始媒体 ↗</a></figcaption></figure></section>"}}]]></qiaomu:versions>
    </item>
  </channel>
</rss>
