---
title: "Vibe-Code 生产就绪清单"
canonical: https://wavect.io/zh/blog/vibe-code-production-readiness-checklist/
language: zh
description: "一份面向 AI 生成与 vibe-coded 应用的独立、可快速浏览的生产就绪清单。十项检查按咬人频率排序，分为阻断、高危和清理。"
image: "https://wavect.io/img/blog/headers/header_vibe-code-production-readiness-checklist.png"
---

[**返回**](/zh/blog/overview/)

[![Christof Jori](/img/team/christof.webp)](/zh/team/christof-jori/)

[Christof Jori](/zh/team/christof-jori/) https://linkedin.com/company/wavect

7 min 阅读 · 16 Jun 2026

[**下一篇**](/zh/blog/vibe-coded-software-audit-cost/)

# Vibe-Code 生产就绪清单

要点速览

一份独立、可快速浏览的清单，在真实用户接触之前检查任何 AI 生成应用，只有一条规则：一个勾只有在服务端强制执行时才算数， 屏幕上的不算。十项按咬人频率排序的检查：服务端授权、租户与行隔离、客户端无密钥、输入校验、失败路径覆盖、可扩展的查询、 并发与幂等、有经过恢复测试备份的自有数据层、经审查的依赖与许可证，以及回归套件。把失败项分进阻断、高危和清理； 顶部的几项正是会变成事故的。

相关服务: [Vibe Coding Rescue](/zh/services/vibe-coding-rescue/)

如果你用 Lovable、Cursor、Claude Code、Bolt、v0 或 Replit 做了点东西，而真实用户马上要用上它，先把这个跑一遍。它是一份独立清单，按每一项咬人的频率排序，你可以在叫任何人之前自己走一遍。一条规则：一个勾只有在服务端强制执行时才算数，屏幕上的不算。

这不是在贬低 [vibe-coding](/zh/glossary/vibe-coding/) 。我们也是这么起步的。它是一张关于不会自动发生的工作的地图，好让你在事故之前先找出 [AI 生成代码](/zh/glossary/ai-generated-code/) 里的缺口。

## 我怎么知道我的 vibe-coded 应用是否生产就绪？

按顺序走完下面十项检查。每一项都是一个带通过条件的问题。如果你不能拿出证据回答"是"，它就没完成。前三项是会变成事故的，所以别跳过。

## 清单

1. **服务端授权。** 对每个端点、每次读数据，服务端是否确认谁在请求以及他是否被允许？前端校验不算。通过：在请求里改一个用户 ID，确认你拿到的是拒绝，而不是别人的数据。
2. **租户与行隔离。** 如果应用是多租户的，一个账户能否在物理上触及另一个账户的记录？通过：隔离在数据库或查询层强制执行，而不是在你每个端点都得记得加的应用逻辑里。
3. **客户端没有密钥。** API 密钥、数据库 URL 或令牌是否在客户端打包或仓库历史里？通过：扫描打包和 git 历史是干净的，任何曾经暴露过的都已轮换。
4. **每个入口都有输入校验。** 每个表单和端点是否都干净地拒绝畸形、超大和恶意输入？通过：往里扔垃圾返回一个干净的错误，而不是崩溃或被悄悄吞掉。
5. **失败路径已覆盖。** 当一个外部调用超时、失败或返回空时，应用是否优雅降级？通过：强制每个外部调用失败，确认屏幕不会因未处理的异常而变白。
6. **能扩展的查询。** 是否有数据库调用被放进了渲染循环里，或者为了数行数而拉整张表？通过：在真实数据量下做过性能剖析，N+1 查询和无界读取已清除。
7. **并发与幂等。** 两次点击会不会创建两个订单，或两个并行请求都通过余额检查？通过：任何写入资金或状态的东西都是幂等的，并能处理重复和并行请求。
8. **自有数据层并有备份。** 数据是否在你掌控的托管数据库里，迁移在版本控制下，并有自动备份？通过：你至少恢复过一次备份。一个你从未恢复过的备份只是一个愿望。
9. **依赖和许可证已审查。** 是否有某个包带着已知漏洞，或带着禁止你商用的许可证？通过：依赖与许可证扫描是干净的，或被有意识地豁免。
10. **存在回归套件。** 是否有测试，让下一次改动（无论 AI 写的还是人写的）都不能悄悄破坏已经能用的东西？通过：每次改动都跑一次套件。参见 [测试驱动开发](/zh/glossary/tdd/) ，了解为什么当模型在写代码时，它更重要而不是更不重要。

![Christof Jori](/img/team/christof.webp)

"模型写出你要的代码，以及你忘了要的一切之外的、什么都不写。这份清单就是你忘了要的一切，按它通常造成疼痛的顺序排列。"

## 哪些项会阻断上线？

这十项并不等同。把你的失败项分进三个桶，好先修对的，而不是被整张清单卡住。

- **阻断项。** 任何暴露客户数据、损失资金或破坏状态的：第 1、2、3、7 项。它们不等。上线等它们。
- **高危项。** 尚未咬人的真实风险：第 4、5、6 项，以及第 9 项下的已知 CVE。在你长到它之前修掉。
- **清理项。** 真实但可承受：低风险输入上的薄弱校验、稳定代码上缺失的测试、第 8 和第 10 项的其余部分。值得做，可安全排期。

这样分桶的意义在于对紧迫性诚实。别把清理项打扮成阻断项，也别让一个真正的阻断项藏在长清单里。

## 我不能直接让 AI 自己修吗？

部分可以。一旦你指出位置，模型会乐意加一个校验或把一个调用包进错误处理。它做不到的是决定该往哪看。它没有你 [技术债](/zh/glossary/technical-debt/) 的模型，也没有对真实用户第二天就会撞上的边界情况的直觉。找出缺口是人的工作。补上它们越来越是共担的工作。我们的 [定制软件开发](/zh/services/software-development/) 正是这样做的。

## 清完整张清单要花多少钱？

这取决于哪些项失败，以及产品涉及多少资金或敏感数据。我们在 [把一个 vibe-coded 应用做到生产可用要花多少钱](/zh/blog/vibe-coded-software-audit-cost/) 里拆解了典型工作量区间和时间的去向。简短版本：跑这份清单的审计是便宜的部分，它在你投入之前就告诉你加固的规模。这是我们 [软件质量保证服务](/zh/services/software-quality-assurance/) 的入口。

## 最终思考

在把真实用户放上一个 AI 构建的产品之前跑这个，而不是之后。这份清单刻意做得便于快速浏览，好让你今晚就能做第一遍：走完十项，标出你不能拿证据回答'是'的，把失败项分进阻断、高危和清理。

如果授权、隔离和密钥这几项让你紧张，那份紧张就是信号。在上线前找来第二双眼睛。这张清单顶部的几项正是会变成事故的，而一次事故总是比那次本能抓住它的通读更贵。

## 你可能也喜欢..

[**把一个 vibe-coded 应用做到生产可用要花多少钱** 工作量区间、时间的去向，以及审计通常会发现什么，以钱和时间线来呈现。](/zh/blog/vibe-coded-software-audit-cost/) [**AI 生成代码的 QA** 为什么 AI 生成代码会在生产中崩溃，以及我们在 vibe-coded 构建中最常见的故障模式。](/zh/blog/qa-for-ai-generated-code/)

QA 与生产就绪

## 继续浏览此集群

可靠生产软件所需的测试、审计、维护与加固。

[从核心文章开始**AI 生成代码的 QA**](/zh/blog/qa-for-ai-generated-code/)

- [智能体测试与测试自动化：2026 试点指南](/zh/blog/agentic-testing-vs-test-automation-2026/)
- [外部 QA 基准：软件产品前 30 天通常会发现什么](/zh/blog/external-qa-benchmark-first-30-days/)
- [软件上线后维护要花多少钱：DACH SaaS 基准](/zh/blog/software-maintenance-cost-benchmark-dach-saas/)
- [敏捷去工程化](/zh/blog/agile-de-engineering/)
- [Lovable、Bolt 和 Replit 应用尽职调查](/zh/blog/lovable-bolt-replit-app-due-diligence/)

只收重要内容

## 关注与你相关的内容

每当我们发布新文章，你会收到一封简短邮件。你可以关注整个博客，也可以只选感兴趣的主题。

[**返回**](/zh/blog/overview/)

[![Christof Jori](/img/team/christof.webp)](/zh/team/christof-jori/)

[Christof Jori](/zh/team/christof-jori/) https://linkedin.com/company/wavect

7 min 阅读 · 16 Jun 2026

[**下一篇**](/zh/blog/vibe-coded-software-audit-cost/)

邮件订阅新文章 ×

×

通过邮件获取新文章

我们发布时给你一封简短邮件。免费，不做跟踪。

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ],
      "employee": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "founder": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "legalRepresentative": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "name": "Wavect GmbH",
      "subjectOf": {
        "@id": "https://wavect.io/verified-claims.json#dataset",
        "@type": "Dataset",
        "creator": {
          "@id": "https://wavect.io/#organization",
          "@type": [
            "Organization",
            "ProfessionalService",
            "LocalBusiness"
          ]
        },
        "description": "A machine-readable registry of quantitative and qualitative claims published by Wavect, with review dates, localized page appearances and public third-party citations where available.",
        "inLanguage": "en",
        "isAccessibleForFree": true,
        "license": "https://creativecommons.org/licenses/by/4.0/",
        "name": "Wavect verified publication claims",
        "url": "https://wavect.io/verified-claims.json"
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/team/kevin-riedl/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Kevin Riedl",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796365",
        "https://www.linkedin.com/in/wsdt",
        "https://github.com/wsdt"
      ],
      "url": "https://wavect.io/team/kevin-riedl/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/team/christof-jori/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Christof Jori",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796367",
        "https://www.linkedin.com/in/jocr77/",
        "https://github.com/jo-chris"
      ],
      "url": "https://wavect.io/team/christof-jori/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/#website",
      "@type": "WebSite",
      "inLanguage": [
        "en",
        "de",
        "es",
        "zh"
      ],
      "name": "Wavect",
      "potentialAction": {
        "@type": "SearchAction",
        "query-input": "required name=search_term_string",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://wavect.io/search/?q={search_term_string}"
        }
      },
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/zh/blog/vibe-code-production-readiness-checklist/#webpage",
      "@type": "WebPage",
      "dateModified": "2026-07-07",
      "inLanguage": "zh",
      "isPartOf": {
        "@id": "https://wavect.io/#website",
        "@type": "WebSite"
      },
      "lastReviewed": "2026-07-07",
      "url": "https://wavect.io/zh/blog/vibe-code-production-readiness-checklist/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "abstract": "一份独立、可快速浏览的清单，在真实用户接触之前检查任何 AI 生成应用，只有一条规则：一个勾只有在服务端强制执行时才算数， 屏幕上的不算。十项按咬人频率排序的检查：服务端授权、租户与行隔离、客户端无密钥、输入校验、失败路径覆盖、可扩展的查询、 并发与幂等、有经过恢复测试备份的自有数据层、经审查的依赖与许可证，以及回归套件。把失败项分进阻断、高危和清理； 顶部的几项正是会变成事故的。",
  "articleBody": " 博客概览/交付与 QA/QA 与生产就绪 Vibe-Code 生产就绪清单 要点速览 一份独立、可快速浏览的清单，在真实用户接触之前检查任何 AI 生成应用，只有一条规则：一个勾只有在服务端强制执行时才算数， 屏幕上的不算。十项按咬人频率排序的检查：服务端授权、租户与行隔离、客户端无密钥、输入校验、失败路径覆盖、可扩展的查询、 并发与幂等、有经过恢复测试备份的自有数据层、经审查的依赖与许可证，以及回归套件。把失败项分进阻断、高危和清理； 顶部的几项正是会变成事故的。 相关服务: Vibe Coding Rescue 如果你用 Lovable、Cursor、Claude Code、Bolt、v0 或 Replit 做了点东西，而真实用户马上要用上它，先把这个跑一遍。它是一份独立清单，按每一项咬人的频率排序，你可以在叫任何人之前自己走一遍。一条规则：一个勾只有在服务端强制执行时才算数，屏幕上的不算。 这不是在贬低 vibe-coding。我们也是这么起步的。它是一张关于不会自动发生的工作的地图，好让你在事故之前先找出AI 生成代码里的缺口。 我怎么知道我的 vibe-coded 应用是否生产就绪？ 按顺序走完下面十项检查。每一项都是一个带通过条件的问题。如果你不能拿出证据回答\"是\"，它就没完成。前三项是会变成事故的，所以别跳过。 清单 服务端授权。对每个端点、每次读数据，服务端是否确认谁在请求以及他是否被允许？前端校验不算。通过：在请求里改一个用户 ID，确认你拿到的是拒绝，而不是别人的数据。 租户与行隔离。如果应用是多租户的，一个账户能否在物理上触及另一个账户的记录？通过：隔离在数据库或查询层强制执行，而不是在你每个端点都得记得加的应用逻辑里。 客户端没有密钥。API 密钥、数据库 URL 或令牌是否在客户端打包或仓库历史里？通过：扫描打包和 git 历史是干净的，任何曾经暴露过的都已轮换。 每个入口都有输入校验。每个表单和端点是否都干净地拒绝畸形、超大和恶意输入？通过：往里扔垃圾返回一个干净的错误，而不是崩溃或被悄悄吞掉。 失败路径已覆盖。当一个外部调用超时、失败或返回空时，应用是否优雅降级？通过：强制每个外部调用失败，确认屏幕不会因未处理的异常而变白。 能扩展的查询。是否有数据库调用被放进了渲染循环里，或者为了数行数而拉整张表？通过：在真实数据量下做过性能剖析，N+1 查询和无界读取已清除。 并发与幂等。两次点击会不会创建两个订单，或两个并行请求都通过余额检查？通过：任何写入资金或状态的东西都是幂等的，并能处理重复和并行请求。 自有数据层并有备份。数据是否在你掌控的托管数据库里，迁移在版本控制下，并有自动备份？通过：你至少恢复过一次备份。一个你从未恢复过的备份只是一个愿望。 依赖和许可证已审查。是否有某个包带着已知漏洞，或带着禁止你商用的许可证？通过：依赖与许可证扫描是干净的，或被有意识地豁免。 存在回归套件。是否有测试，让下一次改动（无论 AI 写的还是人写的）都不能悄悄破坏已经能用的东西？通过：每次改动都跑一次套件。参见测试驱动开发，了解为什么当模型在写代码时，它更重要而不是更不重要。 \"模型写出你要的代码，以及你忘了要的一切之外的、什么都不写。这份清单就是你忘了要的一切，按它通常造成疼痛的顺序排列。\" 哪些项会阻断上线？ 这十项并不等同。把你的失败项分进三个桶，好先修对的，而不是被整张清单卡住。 阻断项。任何暴露客户数据、损失资金或破坏状态的：第 1、2、3、7 项。它们不等。上线等它们。 高危项。尚未咬人的真实风险：第 4、5、6 项，以及第 9 项下的已知 CVE。在你长到它之前修掉。 清理项。真实但可承受：低风险输入上的薄弱校验、稳定代码上缺失的测试、第 8 和第 10 项的其余部分。值得做，可安全排期。 这样分桶的意义在于对紧迫性诚实。别把清理项打扮成阻断项，也别让一个真正的阻断项藏在长清单里。 我不能直接让 AI 自己修吗？ 部分可以。一旦你指出位置，模型会乐意加一个校验或把一个调用包进错误处理。它做不到的是决定该往哪看。它没有你技术债的模型，也没有对真实用户第二天就会撞上的边界情况的直觉。找出缺口是人的工作。补上它们越来越是共担的工作。我们的定制软件开发正是这样做的。 清完整张清单要花多少钱？ 这取决于哪些项失败，以及产品涉及多少资金或敏感数据。我们在把一个 vibe-coded 应用做到生产可用要花多少钱里拆解了典型工作量区间和时间的去向。简短版本：跑这份清单的审计是便宜的部分，它在你投入之前就告诉你加固的规模。这是我们软件质量保证服务的入口。 最终思考 在把真实用户放上一个 AI 构建的产品之前跑这个，而不是之后。这份清单刻意做得便于快速浏览，好让你今晚就能做第一遍：走完十项，标出你不能拿证据回答'是'的，把失败项分进阻断、高危和清理。 如果授权、隔离和密钥这几项让你紧张，那份紧张就是信号。在上线前找来第二双眼睛。这张清单顶部的几项正是会变成事故的，而一次事故总是比那次本能抓住它的通读更贵。 你可能也喜欢.. 把一个 vibe-coded 应用做到生产可用要花多少钱 工作量区间、时间的去向，以及审计通常会发现什么，以钱和时间线来呈现。 AI 生成代码的 QA 为什么 AI 生成代码会在生产中崩溃，以及我们在 vibe-coded 构建中最常见的故障模式。 QA 与生产就绪 继续浏览此集群 可靠生产软件所需的测试、审计、维护与加固。 从核心文章开始AI 生成代码的 QA 智能体测试与测试自动化：2026 试点指南 外部 QA 基准：软件产品前 30 天通常会发现什么 软件上线后维护要花多少钱：DACH SaaS 基准 敏捷去工程化 Lovable、Bolt 和 Replit 应用尽职调查 集群中的上一篇Lovable、Bolt 和 Replit 应用尽职调查集群中的下一篇把一个 vibe-coded 应用做到生产可用要花多少钱？ 最合适的下一步： Vibe Coding 救援 看看生产环境中的应用: Polity 先做决定: 如何把 vibe coding 出来的原型推向生产环境 只收重要内容 关注与你相关的内容 每当我们发布新文章，你会收到一封简短邮件。你可以关注整个博客，也可以只选感兴趣的主题。 Company 电子邮箱 你希望接收哪些内容？ 完整的 Wavect 博客接收六个主题下的每一篇新文章。 仅接收所选主题请在下方选择一个或多个分类。 选择主题 AI 与智能体 产品与 MVP 交付与 QA 领导力与团队 商业与监管 Web3 与隐私 我希望接收所选的 Wavect 博客邮件，并已阅读 隐私信息。我可以随时退订。 发送确认邮件→ 免费、双重确认、不使用跟踪像素。 ",
  "articleSection": "Engineering",
  "author": {
    "@id": "https://wavect.io/team/christof-jori/#person",
    "@type": "Person",
    "name": "Christof Jori",
    "sameAs": [
      "https://www.wikidata.org/wiki/Q139796367",
      "https://www.linkedin.com/in/jocr77/",
      "https://github.com/jo-chris"
    ],
    "url": "https://wavect.io/team/christof-jori/"
  },
  "dateModified": "2026-07-07",
  "datePublished": "2026-06-16",
  "description": "一份独立、可快速浏览的清单，在真实用户接触之前检查任何 AI 生成应用，只有一条规则：一个勾只有在服务端强制执行时才算数， 屏幕上的不算。十项按咬人频率排序的检查：服务端授权、租户与行隔离、客户端无密钥、输入校验、失败路径覆盖、可扩展的查询、 并发与幂等、有经过恢复测试备份的自有数据层、经审查的依赖与许可证，以及回归套件。把失败项分进阻断、高危和清理； 顶部的几项正是会变成事故的。",
  "headline": "Vibe-Code 生产就绪清单",
  "image": "https://wavect.io/img/blog/headers/header_vibe-code-production-readiness-checklist.svg",
  "inLanguage": "zh",
  "mainEntityOfPage": {
    "@id": "https://wavect.io/zh/blog/vibe-code-production-readiness-checklist/",
    "@type": "WebPage"
  },
  "publisher": {
    "@id": "https://wavect.io/#organization",
    "@type": [
      "Organization",
      "ProfessionalService",
      "LocalBusiness"
    ]
  },
  "url": "https://wavect.io/zh/blog/vibe-code-production-readiness-checklist/",
  "wordCount": 161
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/",
      "name": "首页",
      "position": 1
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/overview/",
      "name": "博客概览",
      "position": 2
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/topics/delivery-qa/",
      "name": "交付与 QA",
      "position": 3
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/clusters/qa-production/",
      "name": "QA 与生产就绪",
      "position": 4
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/vibe-code-production-readiness-checklist/",
      "name": "Vibe-Code 生产就绪清单 | ",
      "position": 5
    }
  ]
}
```
