Show HN:Assay —— 一个无需 LLM、无需编写测试就能发现 bug 的 QA CLI

2026-09-29 · 工具资源
产品配图
项目快照复刻难度★★★☆☆
技术栈
Python + Playwright + Chromium
当前状态
开源 MIT,98 Star,无收入
核心获客
GitHub topics + agent skill 寄生 + PyPI + Show HN
信源GitHub

【这是什么】

assay 是一个 Python 写的 QA CLI,定位一句话说清:把你指向任何一个含网页的文件夹,它在 Chromium 里用真实浏览器跑一遍页面,自动找出"页面自相矛盾"的地方,不需要你写测试,也不调用 LLM。

工作机制是从页面上找到所有控件(按钮、输入框、下拉、链接等)并逐个驱动,然后检查行为是否自洽。README 里给的判据很具体:它不知道对错,也不知道这页面是干什么的,但一个页面自相矛盾几乎总是 bug。作者举的例子:绘图应用里画两笔、点两次撤销,预期是按顺序各撤销一笔,结果第一次点击没生效、第二次才撤销第一笔——assay 驱动这个操作并抓到了它。

输出侧有两个设计值得抄:一是用白话解释失败原因,比如"从同一个起点按两次,第一次什么都没变、第二次变了,说明它延迟一次按键才反应";二是去重分组,同一个 bug 触发多条检查时,后续条目只写 same finding as C003,不刷屏。

安装 pip install assay-ui,Python 3.10+,MIT 许可,也支持 uv tool install / pipx install。命令行形态有 assay ./my-app(默认查 index.html)、assay ./my-app/todo.html、assay ./my-app -e app.html、--report out.html(带截图 HTML 报告)、--json。首次运行会自动下载 Chromium,唯一运行时依赖是 Playwright 和 Chromium。

【背景 / 谁做的】

作者 GitHub 是 awss1i,X 账号 @awss1i,典型独立开发者单人项目。仓库数据:98 Star、6 Fork,创建于 2026-09-17,主语言标记为 HTML——结合 README 里大量内嵌 SVG 演示和 HTML 报告,说明仓库里相当一部分是示例页面与报告产物,真正的分发包在 PyPI(官网指向 pypi.org/project/assay-ui)。

这个项目的问题意识很清晰,是从现有两条 QA 路线的缝里切出来的:

  1. Playwright / Cypress 路线:需要你自己写测试,检出能力上限等于你写测试的水平;
  2. LLM 找 bug 路线:非确定性,而且有时成本高昂。

assay 的赌注是存在第三条路——确定性、零 API key、零增量成本、可重复的机械检查。这条反 LLM 的定位在当下的 agent 工具潮里是刻意选择的差异点,也是它能在 Show HN 上被点开的原因。

【怎么获客】

这个项目的获客动作相当密集,且成本几乎为零:

GitHub 主题标签铺关键词。 仓库打了 agentic-ai、ai-agents、claude-code、browser-automation、cli、developer-tools、end-to-end-testing、llm、playwright、python、qa、test-automation、testing、ui-testing。这是靠 GitHub 搜索和 agent 工具合集被反复捞出来的标准打法,等于把自己挂进了所有相关词条的检索池。

寄生在 agent 工作流里做分发。 这是最强的路径,也是最值得学的一条:一个 skill 把"检查你写的每个页面"的指令接入 15 个 agent 编程 harness;Claude Code 和 DeepSeek harness 另有专属插件,通过 stop hook 在 LLM 每次动过网页之后自动运行。也就是说工具不是等用户想起来去装,而是跟着 agent 的每一次代码改动自动出现在终端里——用户第一次看到 assay 的输出时,它已经装好了。

PyPI 作为零摩擦入口。 官网字段直接填 pypi.org/project/assay-ui,pip install assay-ui 一行完成,不需要注册、不需要 key、不需要信用卡。首屏还放了终端录屏 SVG,直接展示一个带 bug 的标签过滤页结果:18 checks planned、10 passed、8 failed,第一条失败说标签外观恢复了但列表还在过滤状态,其余七条都标为同一发现。这个演示在 3 秒内就把价值说完了。

Show HN 标题前置差异点。 标题直接把"No tests to write, no LLM"写进去,反 LLM 是钩子也是过滤器,能筛出对现有 agent QA 路线不满的那批人。

X 账号 @awss1i 持续露出,README 顶部的 badge 直接导流。

【验证情况 / MRR】

没有 MRR。 项目 MIT 开源,走 PyPI 免费分发,没有定价页、没有付费层、仓库里也没有任何收入数据。这是一个纯开源工具,目前的商业模式是空的。

可验证的是技术层面的数据,作者给了两组基准,都在仓库里可复现:

  • 基准一:225 个生成的网页,先经人工检查,共 20 个 bug,assay 用正确推理捕获 15 个,0 误报。
  • 基准二(更难): 由 LLM 在 10 个原创且本来可正常运行的网页中植入 5 个 bug,assay 命中 50 个中的 12 个,0 误报。作者自己承认这个命中率"看起来可能偏低",但把便宜和快作为补偿:中位运行时间 14 秒。
  • 链接检查子基准:51/51 全部判断正确,0 个错误链接。

读这组数字要注意两件事。第一,15/20 和 12/50 说的是"在已经知道有 bug 的前提下找回多少",不是"在真实项目里能找到多少 bug",后者才是用户真正在意的,而这组基准没有回答。第二,0 误报 是这类工具唯一真正硬的卖点——QA 工具只要误报一多,开发者就会开始无视输出,工具等于归零。作者显然知道自己押的是什么。

社区验证券:98 Star、6 Fork、一个 Show HN 帖。这个量级说明有真实兴趣,但还没到形成社区或口碑自传播的程度。

【对一人公司的可复制性】

技术栈极简:Python + Playwright + Chromium,没有模型调用、没有向量库、没有云服务,运行时零边际成本,不需要管 API 账单,不需要运维。一个人维护完全成立,这是这个项目最值得抄的部分。

可复制的四个动作:

  1. 把"无法判对错"的问题改写成"可以判自相矛盾"的问题。 这是产品设计的核心技巧。QA 之所以难自动化,是因为定义"正确"太贵;assay 绕开了它,只检查一组机械可判的不变量——撤销是否按序生效、同一个操作两次是否表现一致、状态回退了但依赖它的视图有没有跟着回退。任何领域都有一批这样的自洽不变量,把它列出来就是产品。
  2. 以 skill / plugin + stop hook 的形式挂进 agent,而不是做一个独立网站等人来访问。 使用动作被自动触发,获客成本压到接近零。
  3. 分发靠 PyPI + GitHub topics。 两个零成本渠道,覆盖"搜工具的人"和"用 agent 的人"。
  4. 输出设计优先降低阅读成本。 白话解释 + 同一 bug 分组去重,直接决定用户会不会看第二次。

真正的壁垒在 0 误报 上。基准集、不变量库、对脏页面的容错,都需要在大量真实页面上反复调,这不是几天能复刻的;但反过来,如果误报率高,别人也一样做不出来——这是个双向的护城河。

【风险与机会】

风险:

  • 覆盖面天然窄。 矛盾类 bug 只是一个子集。逻辑本身写错、业务规则错、视觉错位、性能退化、文案错误,全都在它视野之外。用户跑完发现"没报错"不等于"没问题",容易高估覆盖度。
  • 0 误报难维持。 真实网页比基准脏得多:动态内容、第三方组件、随机渲染、登录态、时间相关逻辑,都会推高误报。一旦开发者开始忽略输出,产品价值归零。基准里的 0 误报是必要不充分条件。
  • 浏览器依赖的硬限制。 重页面、需要登录态、依赖后端状态或外部服务的页面,驱动会卡住或给不出有效结论。
  • 上游和平台挤压。 Playwright 官方、Chrome DevTools、以及各家 agent 平台都可能把轻量自检内置。同时它深度绑 Claude Code 等 harness 的 hook 机制,harness 改一次接口就得跟着改。
  • 无商业模式。 MIT + PyPI 免费,目前没有任何收钱的口子。

机会:

  • 抢"agent 的验证层"这个位置。 agent 写代码越来越快,验证正在成为整条链路的瓶颈。谁把"验证"做成 agent 改完代码后的默认动作,谁就拿到了一个高频、自动、不可绕过的位置。15 个 harness 的 skill 布局就是在抢这个位。
  • 在开源 CLI 之上叠付费层。 可落地的方向:CI 集成(每次 PR 对预览环境自动出报告)、团队共享的历史报告、私有部署。这些是企业愿意付费而个人开发者不愿意付费的形态,正好不破坏免费分发带来的装机量。
  • 从不变量库长成规范执行工具。 目前不变量是内置的、对谁都一样。如果开放成可配置的规则集,团队可以声明"我的页面必须满足这些约束",产品就从 QA 工具升级为规范执行工具,客单价和粘性都会变。
  • 基准体系本身是资产。 225 个网页 + LLM 植入 bug 的 10 个页面,是这个小品类里少见的可复现评测集。推动它成为"确定性 UI 检查"的对照基准,就等于把自己写进了这个品类的定义里。
  • 链接检查 51/51 的准确率可以单拎出来变现。 死链巡检是内容站、电商、SEO 团队的直接刚需,付费意愿明确,而且技术上是这个项目现成的能力。

信息来源:Hacker News、GitHub、PyPI

🛠️ 一人公司抄作业指南
  1. 第一步:用 Python + Playwright 起 CLI,输入文件夹或单个 HTML,默认查 index.html
  2. 第二步:用 Playwright 在 Chromium 里枚举控件(按钮/输入框/下拉/链接)并逐个驱动
  3. 第三步:只写机械可判的自洽不变量(撤销按序生效、同操作两次结果一致、状态回退视图跟随),不做对错判断
  4. 第四步:输出用白话解释失败原因,同一 bug 触发多条时标 same finding as C00X,并支持 --report out.html 带截图报告
⚠️ 劝退 / 避坑指南
  • 0 误报难维持:动态内容、第三方组件、登录态、随机渲染都会推高误报,误报一多用户就无视输出
  • 覆盖面窄:逻辑错、业务规则错、视觉错位、性能退化、文案错全在视野外,用户易高估覆盖度
  • 浏览器硬限制:重页面、需登录态、依赖后端状态或外部服务的页面会卡住或给不出结论
  • 生态依赖风险:深度绑 Claude Code 等 harness 的 hook 机制,上游接口一改就得跟改;Playwright/Chrome DevTools 可能内置同类自检
这篇拆解对你有用吗?