← 返回日记目录

chapter · AI diary

10. 上线前检查:为什么本地通过不等于可以发布

从这里开始 —— 2026 年 5 月初 某个深夜 。一个不懂代码的"追风少年" 看着屏幕上的 一长串绿色 PASS —— "lint PASS / typecheck PASS / self audit PASS / visual smoke PASS / release gate PASS"。

从这里开始 ——

2026 年 5 月初 · 某个深夜。一个不懂代码的"追风少年" · 看着屏幕上的 一长串绿色 PASS ——

"lint PASS / typecheck PASS / self-audit PASS / visual smoke PASS / release gate PASS"。

他的手已经放在发布键上 · 但他停住了他问自己一个问题 —— "这些 PASS 加在一起 · 等于'可以发布'吗"

答案是不等于

本篇一句话

这一篇写的是 —— 上线前检查最贵的一课 · 不是"让 AI 跑更多检查" · 是学会区分"本地通过 / CI 通过 / 改动提议 合并 / 线上可访问 / 用户真的使用"这 5 件完全不同的事"跑通了"不是一个结论 · 必须问是哪一层跑通了==。

结构图 · 从"代码改完"到"产品成立"的 5 层验证

diagram · CH10

5 层验证

01

本地通过

02

CI 通过

03

线上 smoke

04

人工确认

05

发布后观察

这张图说明 —— 每一层都有自己的完成信号 · 也有自己的"不能证明"AI 最擅长把第 1 层的 PASS · 写成"已上线"上线前检查的真正工作 · 不是跑更多检查 · 是给每个检查写清边界


1. "跑通了" 是最危险的一句话

做网站的时候 · AI 很喜欢说跑通了

我以前听到这句话 · 也会觉得事情结束了后来我才知道 · "跑通了" 这个词非常危险

因为它太模糊

一句"跑通了"可以指 ——

  • 本地页面能打开。
  • build 通过。
  • CI 通过。
  • 改动提议 合并。
  • 线上能打开。
  • 用户真的用过。
  • 有人愿意付钱。

这些都可以被说成"跑通了" · 但它们完全不是一回事

如果不拆开 · AI 就很容易把低一层的成功 · 包装成高一层的完成

这是 CH05 顺滑的失败 在发布 surface 上最贵的姿势

所以我后来要求 AI 回报时必须分层 —— 不是简单一句"完成" · 而是 ——

已执行
已记录
已进入程序
已通过验证
仍未授权
仍未完成

这几个词分开以后 · 很多混乱就少了一半

2. 验证的 5 层 · 每层只能说自己能证明的事

后来我把"完成"拆成 5 层 —— 本地 / CI / 改动提议 & main / 线上 smoke / 用户。每一层只允许声明自己能证明的事 · 不允许跨层签字

完成信号不能证明
1 本地lint / typecheck / validator PASS上线能用 / 用户喜欢
2 CI协作平台门禁通过产品逻辑正确
3 改动提议 & main某批代码进入 main系统整体可用
4 线上 smoke首页 200 / 关键路由 200 / 样式无丢 / 无登录墙误挡网站"长得好不好"
5 用户真的用过 · 复访 · 反馈 · 付费长期可持续

这 5 层不是 OR · 是 AND前 4 层全 PASS · 第 5 层失败 · 项目依然失败

而且 · 没有任何一层能"包装"另一层本地 PASS 不能写成"已发布" · CI 通过不能写成"用户验证"

3. 本地 PASS 只是入场券

本地通过很重要没有本地通过 · 后面的事都不稳

但本地通过也有边界 —— 它通常证明的是 ——

Markdown 文件真实存在。
中文交付比例合格。
脚本语法没错。
JSON 能解析。
页面在本地环境不报错。
某些视觉 smoke 能跑通。

这些是必要条件 · 不是充分条件

我以前会看到 AI 报一长串 PASS ——

lint PASS
typecheck PASS
self-audit PASS
visual smoke PASS
release gate PASS

这些当然好但它们仍然不能自动等于 ——

  • 可以发布。
  • 用户会喜欢。
  • SEO 没问题。
  • 付款可以开。
  • 法律边界完整。
  • 旧索引已经清理。
  • 所有 AI 接口已经生产可用。

检查越多 · 越要知道每个检查没有覆盖什么这是 CH05 的"AI 三档使用法"在发布前的延伸 —— 自动挡跑 PASS · 方向盘决定发不发 · 刹车守"没覆盖到的事"

4. CI / 改动提议 / 线上 smoke · 别把"生命体征"当"好身体"

有一次网站进入了一个比较关键的节点

本地做了很多修复 · 后来形成 改动提议 · CI 跑过 · 主分支也有检查 · 线上站点也做了 smoke。

这时候最容易出现两个误解

误解 1 · 改动提议 合并了 · 网站项目就完成了

不对

改动提议 合并只是某一批代码进入 main。它不代表 ——

  • 决策助手完整生产可用。
  • 内容入口完整生产可用。
  • 支付系统已经激活。
  • SEO 旧索引迁移结束。
  • 所有 ranking 数据都已补齐。

误解 2 · 线上 smoke 通过 · 就没有问题

也不对线上 smoke 更像一个最小生命体征检查 ——

  • 首页能不能打开?
  • 关键路由是不是 200?
  • 样式有没有丢?
  • 是不是被登录墙挡住?

它告诉你的是 —— 这个网站"活着"

它没告诉你的是 —— 这个网站"长得好不好" / "用户用不用" / "内容够不够" / "能不能赚钱"

生命体征 ≠ 好身体有呼吸 ≠ 健康smoke 通过 · 只是有呼吸====。

5. "没有做什么" · 与"已做什么"同等重要

我后来给自己定了一条很反直觉的规则 ——

AI 每次报告 · 不能只写"做了什么"

还必须写"没有做什么"

为什么?因为 AI 很擅长把报告写得很完整、很顺利、很像结束如果它只写做了哪些检查 · 很容易让人误以为"所有事情都处理完了"

所以每次报告必须明确写("没有做什么" 段最小字段)——

没有激活付款。
没有读取或打印密钥。
没有操作生产 DB / env。
没有调用 live paid API。
没有披露专利。
某些外部数据接口授权 · 仍需 老A 单独授权。
某些 SEO / canonical 策略 · 仍未完成。
决策助手 / 内容入口 · 仍不是完整生产 AI 接口。

这些"没有做"不是消极 · 是在保护边界也是在保护我这个人的判断力

如果没有这部分 · AI 的汇报就会变成一种很危险的"顺利感" —— 这种顺利感 · 是 CH06 漂亮的 Markdown 的另一种姿势

6. 上线前 5% 的冲动 · 最容易毁掉 95% 的工作

很多人以为检查清单是给机器看的其实不是

检查清单首先是给人看的它的作用是让人在紧张、兴奋、疲劳的时候 · 不靠感觉做决定

上线前 · 人很容易冲动

因为你已经做了很多天 · 修了很多 bug · 看了很多页面 · 跑了很多测试

这个时候最容易想 ——

差不多了 · 发吧

网站不是写给自己看的

一个网站上线以后 · 会被用户、搜索引擎、支付平台、法律边界、旧链接、手机浏览器一起检查

检查清单不是拖慢速度

检查清单是防止最后 5% 的冲动毁掉前面 95% 的工作==。

这是 李笑来讲"耐心"和"积累"对我的现实意义。

长期主义不是慢

长期主义是 —— 关键节点不靠冲动====。

默认 A(CH07)有 8 条硬边界 —— 发布是其中第一条。"差不多了发吧" · 必须永远撞上这条硬边界

7. 给普通人的最小 8 项 release checklist

如果你也是普通人 · 用 AI 做了一个网站 · 我建议你至少做一个最小检查不要一上来追求大公司的流程

先做这 8 件事 ——

#检查层最小问题
1本地能不能 build?有没有明显报错?
2内容页面有没有占位符、错别字、隐私信息、夸大承诺?
3移动端手机上按钮、文字、表格有没有挤在一起?
4路由关键页面是不是 200?有没有死链接?
5合规隐私、条款、退款、AI 边界有没有基本说明?
6支付如果未开通真实付款 · 页面有没有避免误导?
7回滚出问题以后怎么退回来?
8未完成哪些东西还不能说完成?

最关键的是第 8 条==。

未完成事项必须写出来

因为很多项目失败 · 不是因为没做事而是因为做了很多事以后 · 大家忘了哪些事还没完成

忘了未完成 · 就是把负债当成资产这是 跳步骤就是负债的开始 在发布前最常见的姿势

8. 这一章给一个普通人的"按下发布键"观

如果你正在准备按下一个发布键 · 我会建议你 ——

  1. 先把"跑通了"拆成 5 层 —— 本地 / CI / 改动提议 & main / 线上 smoke / 用户没拆开 · 你就不知道你在按哪一层的"发布"
  2. 接受"==本地 PASS 只是入场券==" —— 入场券能让你进体育馆 · 但不能让你赢比赛。
  3. 每次报告同时看"做了什么 + 没有做什么" —— 缺一半 · 报告就是漂亮的 Markdown
  4. ==发布键永远走 single human-confirm==" —— 永远不让 AI 替你按。这是 默认 A 8 条硬边界的第一条
  5. 把检查清单当"==给冲动的自己看==" —— 不是给系统看。系统不会冲动。会冲动的是你 · 我 · 任何熬到深夜的人。
  6. 接受"上线 ≠ 完成" —— 这是下一章 CH11 要展开的事。上线 · 只是把问题交给真实世界
  7. 如果今天就想发 —— 先睡一觉 —— 24 小时内冲动的 80% · 第二天醒来都不再迫切剩下的 20% · 通常仍然能等

这一切 · 本质上是一句话 ——

检查越多 · 越要知道每个检查没有覆盖什么

"已做"和"未做"必须一起写

发布键永远在人手里 · 不在系统手里

按下发布键的那一刻 · 是这本书里最高级的"判断"动作 —— 它不能委托


本篇方法卡

方法 10 · 上线前 5 层验证 + 8 项最小 checklist + "没有做什么" 强制段

任何一次准备发布前 · 走完以下流程 ——

A · 5 层验证拆分 ——

1. 本地 → 只能说"本地没明显错"。

2. CI → 只能说"门禁没拦住"。

3. 改动提议 & main → 只能说"代码进入 main"。

4. 线上 smoke → 只能说"网站活着"。

5. 用户 → 才接近"产品成立"。

每一层不许跨层签字

B · 8 项最小 checklist(本地 / 内容 / 移动端 / 路由 / 合规 / 支付 / 回滚 / 未完成)

第 8 项最关键 —— 未完成必须写出来

C · "没有做什么" 强制段 ——

```

没有:付款 / 密钥 / 生产 DB/env / paid API / 专利披露 /

外部接口未授权部分 / SEO 未完成部分 / AI 接口未生产部分。

```

缺这段 · 报告作废。

D · 发布键 = single human-confirm

永远不让 AI 按发布键永远

本篇金句

参考与延伸

核心思想锚 ——

  • 李笑来《把时间当作朋友》—— 长期主义在关键节点的真正含义
  • 李笑来《自学是门手艺》—— 把"完成"拆成可观察的层
  • Atul Gawande《清单革命》—— 检查清单是给人看的 · 不是给机器看的
  • Daniel Kahneman《思考·快与慢》—— 疲劳时关掉慢系统 · 必须靠外部清单兜底
  • 老A 本书 CH05《AI 三档使用法》—— 发布键属于刹车 · 永远不交给自动挡
  • 老A 本书 CH06《漂亮的 Markdown / 假完成》—— 报告"顺利感"的解药
  • 老A 本书 CH07《默认 A 的硬边界》—— 发布是第一条硬边界


reader q&a

读者留言

留言会先进入人工审核。请不要写电话、住址、证件号、合同全文或他人隐私;本站回复只做信息整理, 不构成法律、税务、投资、医疗或房地产交易建议。

还没有公开留言。你可以提出一个具体问题,审核后会显示在这里。

为了减少广告、辱骂和隐私泄露,留言需要先登录。公开显示前仍会人工审核。