---
url: /docs/agentbuff-stack/iteration-progress.md
---
# 持续迭代记录

范围以[开发迭代计划](./development-plan)的 I0— I16 为准。只记录实际实现与验证，不把已配置的资源当成产品功能，不把本地测试当成云端验收。

## 2026-10-09：I0 运行基础

**状态：进行中。** 本地资源与认证运行基础已实现；API 的清理事件与任务消费者分别随 I2、I4 接入实际业务，两个新生成站的完整文件闭环仍待验收。

这轮将本地 API 从 Bun HTTP 替换为 workerd：Wrangler 只做本地 dry-run 打包，Miniflare 启动与生产相同的 Worker bundle；开发监听与完整预览复用入口。保留 Hono 安全头、请求标识、错误处理、新鲜数据库读写及认证初始化，资源类型集中在 `lib/bindings.ts`。

本地邮件通过专用绑定捕获，捕获失败不外发，服务日志不打印验证码。数据库只允许 loopback PostgreSQL，本地连接由 `DATABASE_URL` 统一派生。R2 与队列状态使用项目独立的 `.local/workerd/`；生成器会改写 bucket 和 queue 名，排除本地数据。已发布迁移保留，贡献说明改为增量历史。

| 证据 | 验证口径 |
| --- | --- |
| `api/local/runtime.test.ts` | 实际 workerd 读写 R2、发送后触发测试消费者、手动触发测试定时事件；重启恢复 R2；不同持久化目录隔离；无资源绑定仍可启动 |
| `api/lib/email.test.ts` | 捕获内容、失败不回退、云端拒绝本地绑定 |
| `scripts/lib/create-site.test.ts` | 连续两次生成会改写 Worker、bucket、queue；排除凭据与本地数据 |
| 真实 API + 本地 PostgreSQL | OTP 捕获 → 登录 → 读取会话 → 退出 → 会话清除，均返回成功；未调用真实 Resend |
| 开发自动重载 | 修改 API 源文件后重新打包并重载 workerd，健康接口仍返回 200；正式预览六个服务恢复正常 |

全量 Vitest 为 21 个文件、138 项测试通过；TypeScript、Oxlint、Oxfmt 和文档构建通过。开发自动重载另做实际运行验证。新增运行基础没有变更数据库结构或执行云端操作。

运行验证使用测试入口的消费者与定时处理器，生产代码未增加公开探针。尚未实现任务执行或文件清理，不宣称这些业务已经完成。Cloudflare 本地队列并发存在限制，线上并发、配额与故障仍待云端验收。

后续由 I1 交付私有文件元数据与 API，I2 交付工作台、配额、清理及两个生成站验收。I3— I16 保持原范围；支付、模型、云端部署和两个真实产品的验收证据仍需后续补齐。

实际投入约 20 分钟。运行适配期间发现当前 Miniflare 5 alpha 与旧版持久化选项不同，验收曾捕获重启丢失；已改用当前版本的持久化字段并实测恢复。依赖固定版本，避免未经验证的升级改变运行行为。

## 2026-10-09：I1 私有文件 API

**状态：I1 本地 API 验收通过；完整文件模块仍待 I2。** 本次数据与服务提交接续 `03d31a4c` 的运行基础。没有工作台界面，不更新官网为已交付文件能力。

新增 Hono 原始二进制上传与会话授权下载，tRPC 列表、详情及删除。四种允许类型为 PNG、JPEG、UTF-8 文本和 JSON；字节检查、文件名处理、5 MiB 默认大小、SHA-256、私有下载头和个人所有权均由服务端执行。组织切换不改变所有权，匿名会话被拒绝。

新增迁移 `0002_private_files.sql` 与三个数据表，保留既有历史。上传在同一事务中原子预留数量、字节及文件记录，然后写 R2；失败补偿确认删除后才释放配额。补偿或删除失败保留占用与故障记录。重复释放使用条件更新防止重复扣减。操作频率按数据库原子窗口限制，包含失败请求。

| 证据 | 验证口径 |
| --- | --- |
| `bun run test -- --run` | 23 个文件、155 项测试通过；包含实际迁移、并发数量 / 字节配额、失败补偿、删除重试、缺失对象、分页和限流 |
| `bun files:validate` | 实际 Worker bundle + 临时 PostgreSQL + 独立 R2；两个账号，四种格式，原始下载字节、摘要、响应头、越权拒绝、过期拒绝及删除通过；测试资源成功销毁 |
| `bun typecheck` / `bun lint` / `bun format:check` | 通过 |
| `bun db:check` / `bun api:build` / `bun docs:build` | 通过；Workers bundle 另由真实验收命令打包并运行 |
| `bun config:check` | 通过，明确报告仍需实际绑定与迁移，不把离线检查当资源验收 |

真实验收仅迁移自动创建的临时本地数据库，未迁移正常预览或共享数据库；未调用真实支付、OAuth、邮件或云端部署。当前主预览仍使用先前构建，文件 API 的新代码不等于该预览已经更新。

中文[私有文件教程](./files-storage)与配置、环境、模块状态已同步。PNG / JPEG 做必要结构检查，未声称完整解码或内容扫描。自动过期物理清理、超时上传恢复与孤立对象处理留在 I2；当前过期文件不能下载，但未自动删除。

下一轮继续 I2：接入定时清理与故障记录、文件工作台、导航和边缘路由、生成器资源重置，再验收两个干净生成站及 320 / 390 像素浅深主题。I0 的实际任务消费者待 I4，I3— I16 范围继续保留。

## 2026-10-09：I2 清理与生成资源基础

**状态：I2 进行中。** 数据与服务部分通过本地验收；文件工作台、导航 / 路由和两个干净生成站的完整浏览器流程仍待做。本次接续 I1 的 `48c75bcf`，保持可构建提交。

Worker 实际入口组合 `fetch` 与 `scheduled`，定时处理直接调用文件业务服务，不伪造登录请求。新增迁移 `0003_file_cleanup.sql`，保存扫描游标、两分钟租约与 30 天批次记录。每次至多处理 20 条文件和扫描 100 个对象，失败记录保留占用并可重试；孤立扫描按本站前缀与一小时宽限处理迟到写入 / 账号删除的遗留。

旧执行器不能覆盖新租约的游标，已清理的超时上传不能迟到标记成功。扫描持久化翻页，不只反复检查第一批对象；删除失败保留该扫描页，配额释放复用同一条件更新。批次错误有稳定代码、计数和日志 ID；尚未提供管理员界面。

工厂改用 JSONC 结构编辑重置所有当前支持的环境资源，保留未删除字段的配置注释。R2 / 预览桶、队列 / 死信队列按绑定生成新名字，Hyperdrive 与已设置的 Cloudflare 账号 ID 替换为占位，远程本地绑定被关闭。已配置的未知资源类型会在创建目标目录前明确拒绝。移除生成的旧 Hyperdrive 连接覆盖变量，统一来源为 loopback `DATABASE_URL`。

| 证据 | 验证口径 |
| --- | --- |
| `bun run test -- --run` | 25 个文件、164 项测试通过 |
| `cleanup.test.ts` | 实际迁移与 R2：20 条批次、失败恢复、迟到上传、跨页扫描、宽限、租约接管、账号删除遗留；时间宽限只在测试返回值中调整 |
| `bun files:validate` | 真正 Worker 定时入口两次调用，文件实际删除、配额零占用、两条已完成批次记录；没有重复释放；临时资源已销毁 |
| `site-resources.test.ts` / `create-site.test.ts` | 非品牌前缀的资源和真实来源 ID 被重置；生产 / 开发 / staging 分开；两次连续生成的队列消费引用与品牌对应；无源站凭据 / 状态 |
| TypeScript、Oxlint、Oxfmt、迁移检查、文档构建 | 均通过；Worker bundle 已由真实本地验收构建运行 |

普通预览六项服务仍运行，但 API 是先前 bundle，未迁移其数据库。当前本地运行器不会自动按 Cron 时间触发清理，真实验收显式调用定时入口；线上 Cron 和资源需 I15 独立验收，不把配置中的频率当成已部署调度。

下一项关键验证是文件工作台上传 → 查看 → 下载 → 删除，再核实直接路由、登录回跳、320 / 390 像素与浅深主题。之后生成两个干净站完成安装、构建、文件与资源隔离验收。I0 的任务消费者仍由 I4 完成，I3— I16 的外部与产品验收范围保持不变。

## 2026-10-10：I2 文件工作台与本地网关

**状态：I2 进行中。** 本轮接续 `11fd161a`，完成文件工作台、导航、边缘路由与搜索索引排除。主预览已更新，增量迁移仅应用于本任务创建的 loopback `127.0.0.1:54329/launchkit` 本地数据库，未迁移远程或共享环境。

界面复用语义设计变量、既有按钮和 Radix 对话框；传输、文件条目、预览和工作台控制分开，未新增通用插件框架。上传发送进度与存储成功确认分开显示，网络结果不确定时提醒先刷新，避免自动重传。查询按账号分隔，文本预览限制 64 KiB，原件下载保留完整字节；删除失败保留确认框与错误。

浏览器验收发现本地网关的 Bun fetch 默认解压响应，但转发仍保留 gzip 头，导致登录请求双重解码失败。改为转发原始压缩体，回归测试启动实际 Bun 上游与网关，验证压缩字节、浏览器式解码和 Cookie 转发。

| 证据 | 验证口径 |
| --- | --- |
| 主预览浏览器 `/files` | 文本、JSON 与 PNG 实际上传、预览；文本 / JSON 原件下载 SHA-256 与输入完全一致；PNG 实际解码尺寸正确；切换团队保留个人文件 |
| 异常与交互 | 伪 PNG 被服务端拒绝且不占用配额；超 5 MiB 被选择校验阻止；长 JSON 明示 64 KiB 预览限制；删除确认与 Escape 取消 |
| 浅深主题 | 实际桌面页面检查；手机尺寸接口未改变渲染宽度，320 / 390 像素仍待验收 |
| `files.test.ts` | 四项：100% 传输不等于存储成功、401 认证错误、超时不自动重传、非 ready 响应拒绝 |
| `local-gateway.test.ts` | 实际 gzip 上游与网关响应、原始字节 / 解码 / Cookie |
| 全量 Vitest | 27 个文件、169 项测试通过；TypeScript、Oxlint、Oxfmt、前端及文档构建通过 |

普通预览的本地邮件捕获、Workers 与文件数据库现已使用当前代码。生产部署、远程迁移、真实邮件与支付未执行。实际永久删除、越权与清理由既有真实 Worker 验收命令覆盖，本轮浏览器仅验证删除确认和取消，不宣称确认按钮后的浏览器流程已通过。

下一项继续生成两个干净新站，验证独立安装、构建、完整文件操作与数据库 / R2 隔离，并补实际手机尺寸与到期状态。完成 I2 的验收门槛后再推进 I3；I0 的业务队列消费者仍归 I4，I3— I16 保持原计划范围。

## 2026-10-10：I2 两个干净生成站与删除恢复

**状态：I2 进行中。** 文件工作台提交 `7a2f00b1` 已推送；两个生成站均记录该完整 revision 和 `sourceHadUncommittedChanges: false`，未沿用旧复制站作为新证据。Alpha 入口为 6710，Beta 为 7710；两站分别安装锁定依赖、离线检查、迁移新建临时数据库、构建和启动。没有复制源站凭据、依赖目录或本地 R2。

浏览器分别验证无会话直接 `/files` 回跳登录，登录后恢复原路径，空配额开始，实际上传、预览和下载。Alpha 使用 PNG，实际解码为 240 × 160；Beta 使用 UTF-8 文本；两份浏览器下载 SHA-256 与输入一致。Alpha 上传后 Beta 仍为零配额，主预览始终保留自己的三份验收文件。

两个新站各使用两个测试账号：第二账号无列表 / 配额，不能读取或删除第一账号文件；交叉站点文件 ID 在两个方向均返回 404。数据库对象 key 具有各自站点前缀，资源名字与持久化目录分别属于生成站。Beta 由真实 API 删除测试文件，配额归零，重复请求被拒绝；浏览器刷新后列表为空。Alpha 仅调整它自己的测试文件有效期，界面显示到期并禁用查看 / 下载，真实读取返回 410。

停止各站所属预览后，以各站的同一持久化目录启动真正 Worker bundle，分别两次调用实际 scheduled 入口。Alpha 的 R2 对象从 1 变为 0，文件删除与配额归零，总删除计数只有 1；Beta 的 R2 在清理前后均为 0。两站各产生两条无故障的已完成清理批次，再恢复预览。该流程同时验证重启保留与跨项目 R2 隔离；本地调度仍为显式触发，不宣称自动 Cron。

新增工作台组件回归测试覆盖取消不调用删除、等待期间禁止再次提交 / 取消、删除失败保留文件与占用、错误提示、用户主动重试成功后才清空列表和释放界面配额。接口由测试夹具控制，React / TanStack Query / Radix 使用实际组件；这是组件验证，不标成完整浏览器删除流程。

仍待补齐：320 / 390 像素真实渲染、永久删除确认按钮的完整浏览器流程。手机视口工具没有生效，实际仍为 1280 像素，相关截图仅作为桌面证据。I3 可按其 I0 依赖继续准备执行保护，I2 保留待验收状态；云端服务与 I4— I16 的范围均未缩减。

本轮最终检查为 28 个文件、170 项测试通过，TypeScript、Oxlint、Oxfmt 与中文文档构建通过。期间的返工来自网关压缩响应缺陷、视口接口未生效，以及组件测试需识别 Radix 弹窗期间隐藏底层页面的语义。核心验收日志覆盖本地时间约 00:08—00:28；源码改造另见上一节。

为最后的浏览器永久删除验收，已在 Alpha / Beta 各重新上传一份 79 字节、自建的 `agentbuff-file-acceptance.txt` 并停在确认框；源码文件保留于主仓库 `.local/evidence/files/`。该确认项已向用户单独请求，原因是浏览器工具对永久删除要求当次确认。未获答复前不点击最终按钮；其余检查继续。临时站和测试数据库保留供该项验收，主预览数据没有被删除。

## 2026-10-10：I3 文件执行保护与可选 Turnstile

**状态：I3 进行中。** 本轮接续 `d2994cd0`，文件入口已有真实调用，先在这里交付可选验证；任务 / 收费和用户 API 密钥入口尚未实现，不把它们标成已受保护。I2 的手机尺寸与最终浏览器删除仍保留待验收，删除确认未获答复。

操作限制脱离文件错误类型，使用共享 `ExecutionError` 与稳定错误码，HTTP / tRPC 分别保留 429 和重试提示。新增默认关闭的 `security.turnstile.enabled` 与成对的 API 环境字段；开关开启但无完整配置拒绝初始化，已知官方测试键在非 development 环境被拒绝。公开配置仅包含 site key 和动作，不包含 secret。

上传入口先检查当前会话、本站来源、操作次数，再核对 Siteverify 成功、动作和域名，之后才读取文件、预留配额与写 R2。网络 / 服务故障、非法响应和范围不匹配均拒绝操作；服务调用超时为 10 秒，不自动重试，不记录 token、密钥、provider 响应或输入。

前端仅在 API 明确要求验证时加载 SDK，采用显式 widget、英文提示、浅深主题和紧凑尺寸。过期 / 失败 / 卸载清空 token，迟到回调失效；脚本失败可主动重试。每次上传结束重建验证，原始文件仍为 XHR 请求体，token 单独放在请求头。任务执行保护将在 I4 接入，资金预留 / 退款由 I5 实现。

| 证据 | 验证口径 |
| --- | --- |
| 全量 Vitest | 30 个文件、187 项测试通过 |
| Siteverify 边界测试 | 成功、缺配置、超长 / 缺失 token、动作 / 域名不匹配、重复 / 过期、服务异常 / 非法结构、网络失败与固定 endpoint；provider 响应受控 |
| 真实 Hono / Better Auth / 迁移 PGlite / 本地 R2 | 缺 token、服务故障、错误域名不会创建文件或占配额；有效响应只存一份；公开列表不泄露 secret |
| 实际 tRPC 批量请求 | 三项读取、窗口上限二：两项成功，一项拒绝并带稳定错误 / 重试提示；数据库计数为二 |
| 实际 React / SDK 回调夹具 | 加载失败重试、过期清空、widget 卸载 / 重新验证和旧回调失效；未执行第三方脚本 / 真实验证码 |
| 上传与关闭状态 | token 仅传头部、文件字节不变；验证关闭时不插入 SDK 脚本 |

上述验证不等于真实 Cloudflare widget、生产调度、线上负载或成本验收。实际凭据、允许域名与真实验证需要后续环境接入；保持默认关闭，不替用户创建 widget 或部署资源。中文[执行限制与验证](./execution-security)写明策略、开启方式和缺口。当前实现没有迁移数据结构。

实际 `bun files:validate` 已对更新后的 Worker bundle 完成完整文件与定时清理回归，临时数据库 / R2 成功销毁。主预览六项服务已重建并恢复；浏览器确认三份原验收文件仍在，验证关闭时 SDK 脚本数为零。TypeScript、Oxlint、Oxfmt、离线配置检查、产品构建与中文文档构建通过。返工包括 SDK 加载失败后 Promise 需清除，及测试环境需阻止第三方脚本执行；未放宽服务端校验来让夹具通过。下一步继续 I4 的可靠任务生命周期，同时保留 I2 与 I3 的实际验收缺口。

## 2026-10-10：I4 任务记录、租约与输入保留

**状态：I4 进行中，第一批数据与服务。** 本轮接续 `ad638206`；尚未开放任务 API、界面、实际业务消费者、成功结果发布或死信处理。没有新模块开关，没有更新模板版本 / 官网为已交付，也没有执行模型、收费、云端部署。

迁移 `0004_task_lifecycle.sql` 增加任务、执行记录与输入引用。请求所有者与 UUID 请求键唯一，同键同参数返回原任务，换参数报冲突；账号行锁保护五个活跃名额，使用 `FOR NO KEY UPDATE` 避免阻碍同账号的外键插入。创建与输入保留同一事务，历史任务保存输入快照，原文件删除后不会丢掉历史。

投递、执行与用户请求按实际职责分开。30 秒投递租约、失败补投、两分钟未领取重投均以数据库状态驱动；发送方迟到确认不能覆盖已领取或终态。消费者领取原子增加次数 / 版本并插入唯一尝试；旧版本和过期租约无法失败写回。已分类的存储失败有限等待重试，单任务三次总预算；手动重试不重置次数，重新核对名额、输入摘要 / 有效期。

任务提交、用户删除与过期清理共享输入文件行锁，检查锁后的引用。活跃输入不能删除，清理跳过它；等待阶段取消立即释放，运行阶段先记录取消请求，执行器结算或租约恢复后释放。未知处理器失联进入 `reconciling` 且停止自动投递，不把它当成已实现供应商对账。

| 证据 | 实际验证口径 |
| --- | --- |
| 全量 Vitest | 31 个文件、203 项测试通过；任务新增 16 项，实际迁移 PGlite + R2；包含幂等冲突、个人隔离、活跃上限、并发投递 / 领取、保留、重试、旧版本、取消和未知处理器 |
| `bun tasks:validate-store` | 临时实际 PostgreSQL，确认八个独立服务端会话；并发相同请求只留一个任务、名额只准五个、领取只产生一次执行；20 轮提交 / 删除竞争全部由删除先赢且提交拒绝 |
| 强制锁竞争 | 实际 `pg_stat_activity` 确认提交和删除均等待文件行锁；安排提交先领取后，删除检查已提交的引用并拒绝。不是靠定时猜测并发 |
| 旧版本与迟到发送端 | 实际 PostgreSQL 过期 / 接管后旧版本失败写回被拒绝；消费先到失败终态，发送端随后返回仍保留终态 |
| `bun files:validate` | 真正 Worker bundle + 临时 PostgreSQL + R2；HTTP 删除活跃引用文件返回 409 / `FILE_IN_USE`，内部取消后删除 200；文件、原字节与定时清理回归通过 |
| 运行限制 | 新增保护检查触发真实第十次窗口上限，下一次返回 429 / `RATE_LIMITED` / 重试 60 秒；仅推进临时用户计数时间继续验收，未提高限制 |

任务发送方法在本批验收中由受控夹具提供，不是实际 Cloudflare Queue；任务服务运行在测试 / 本地 Bun，实际 workerd 只验证已经接入的文件入口。输入竞争脚本使用实际 R2，但它的测试 Worker 不包含业务任务消费者。两类临时数据库 / R2 均成功清理，正常预览与生成站数据库没有执行本轮迁移；新代码启用前需迁移。

TypeScript、Oxlint、Oxfmt、迁移检查与中文教程构建通过。返工包括手动重试不应把自己重复计入活跃名额、发送失败后的旧 token 需在主动重试时失效，以及新增 HTTP 检查超过已有写入窗口需要明确验收 429。没有以绕过限流或放宽数据约束使夹具通过。

下一项是接入真正 Worker 消费者与维护入口：确定性文本输入 → 执行 → 私有结果对象 → 同事务发布文件 / 成功状态，补重复消费和过期执行器结果丢弃、失败补偿、死信与重启恢复。之后接 `tasks.submit/list/get/cancel/retry`、执行保护与可操作工作台，并补浏览器 / 生成站验收。I2 手机尺寸 / 最终浏览器删除和 I3 真实验证码待验收项继续保留，I5— I16 原范围不变。

## 2026-10-10：I4 实际队列消费者与私有结果

**状态：I4 进行中，第二批执行与结果。** 本轮接续 `1f99e84e`。生产 Worker 入口接入业务 Queue 消费与定时任务维护，确定性 UTF-8 文本规范化能够产生实际私有结果；用户任务接口、工作台、死信消费者 / 人工恢复仍待实现。官网与模板版本没有标记异步任务为已交付；本轮没有部署云端、远程迁移、调用真实模型或收费。

结果复用文件模块的配额预留与下载协议，没有另一套存储账本。当前执行版本先在事务中预留未发布文件并记录尝试引用，R2 写入后，在同一事务将文件置为可下载并将任务置为成功；重复 / 旧版本不能发布。取消会结算取消并清理自己的输出，失败补偿不删除已发布结果。允许空白文本产生零字节结果，但上传入口仍拒绝空文件。增量迁移 `0005_task_results.sql` 保留既有历史。

读取输入对象、读取字节与写入结果各有 15 秒等待上限；超时后迟到对象不能发布，但可能暂留为孤立对象，沿用一小时宽限清理。删除失败保留配额，后续定时维护重试。空间不足进入明确失败，用户腾出空间后可在原三次总预算内手动重试。未知基础设施故障交由消息重投，提交成功却丢失数据库响应时也不会误删已发布结果。

| 证据 | 实际验证口径 |
| --- | --- |
| 结果生命周期测试 | 13 项，实际迁移 PGlite + 本地 R2：并发 / 重复只发布一次、字节与摘要、零结果、私有列表与下载隔离、旧版本拒绝、运行中取消、失败补偿 / 配额、输入篡改、到期保留、空间不足重试、消息结算、提交响应丢失 |
| 超时夹具 | 只缩短第三次存储操作的等待计时，不替换真实 R2；挂起写入进入等待重试，补偿后迟到对象仍不产生可下载结果。没有实等 15 秒或声称已实测云端超时 |
| `bun tasks:validate` | 真正生产 Worker bundle + 临时 PostgreSQL + 实际本地 Queue / R2；定时 outbox 补投、消费者执行与私有 HTTP 下载通过，核对精确字节 / SHA-256 / 响应头 / 越权 404 |
| 重复与取消消息 | 经实际 Queue 投递，同一任务只保留一次尝试，已取消任务没有尝试；同批后续新任务成功确认消费者运行 |
| 失联与重启 | 定时维护恢复过期任务并清理旧尝试结果；旧版本无法发布。停止该验收 Worker 后复用持久目录重启，原 Cookie / 结果下载仍有效，新任务继续执行 |
| 并发与文件回归 | `tasks:validate-store` 八个实际 PostgreSQL 会话、输入 / 删除竞争和迟到发送端通过；`files:validate` 当前 Worker 文件 / 私有权限 / 配额 / 429 / 定时维护通过 |
| 全量检查 | 32 个测试文件、216 项测试；TypeScript、Oxlint、Oxfmt、迁移检查与中文文档构建通过 |

业务受理仍由验收脚本调用内部服务，不能称为公开任务接口验收；PGlite 也不能代替真实多连接锁竞争。上述三个脚本都成功销毁自己的临时数据库和资源，正常预览与两个生成站的数据库没有迁移。新代码启用前需要 `0004` 和 `0005`，本轮没有重启正常预览 API。GitHub 部署开关查询仍为空，不触发真实部署。

开发队列已配置基础设施重投上限与死信目标，尚未接死信消费与人工恢复，不宣称完成死信闭环。下一批接个人任务 API、稳定错误与分页，复用执行保护，再接可操作任务工作台；继续补死信恢复、浏览器和两个生成站任务闭环。I2 / I3 待验收项与 I5— I16 原计划范围继续保留。

## 2026-10-10：I4 个人任务接口与实际工作台

**状态：I4 进行中，第三批接口与页面。** 本轮接续 `8f5c2a3c`，交付 `tasks.submit/list/get/cancel/retry`、个人任务列表 / 详情、真实状态轮询、断线恢复和输入 / 结果预览与下载。仍未完成死信消费 / 人工恢复、重试耗尽的实际队列验收及两个干净生成站的任务闭环；官网没有标记整个 I4 为已交付。

任务使用个人账号、新鲜数据库和逐次所有权检查，活动组织字段不扩大权限；变更请求要求本站来源。列表按时间 / ID 双键分页，每页二十条，相同时间不会漏页。统一返回稳定任务 / 文件 / 执行错误，内部版本、输入摘要、投递 token 与请求指纹不会出现在用户响应。

配置新增 `tasks.enabled/maxActive/maxAttempts/writesPerMinute/readsPerMinute`，离线检查核对范围与文件依赖。关闭新增任务仍保留历史 / 取消，缺 R2 / Queue 时新执行明确失败。任务次数在创建时保存，配置变更不重置旧任务；写入 / 查询使用已有数据库原子计数，真实 tRPC 批量过程逐项受限。可选 Turnstile 复用服务与组件，提交 / 重试分别匹配 `task_submit` / `task_retry`，token 不存入任务。取消不要求验证码；真实 widget 默认关闭且仍待验收。

页面沿用哑光黑白、StyleX 与公共变量。提交响应丢失时保留同一请求键，手动重试沿用；变更输入 / 参数才换键。成功后导航到详情，输出仅在成功状态展示；运行中取消记录请求，显示等待结算，不伪造已停止。活跃列表五秒、详情三秒检查；查询错误暂停轮询并禁止按旧状态操作，恢复联网 / 页面焦点重新核对。复用原文件预览与私有下载，没有新增一套前端文件处理器。

| 证据 | 实际验证口径 |
| --- | --- |
| 任务 API 测试 | 十项，实际迁移 PGlite / R2：匿名 / 来源拒绝、个人隔离、幂等与投递失败保留、公开字段、禁用 / 缺绑定、同时间二十三条分页、并发操作限制、验证码动作 |
| 真正 HTTP 批量过程 | tRPC fetch adapter + 实际数据库，三项读取、上限二：两项成功，一项稳定 `RATE_LIMITED` / 重试六十秒；数据库计数二 |
| 页面组件测试 | 三项：丢失响应沿用键 / 改参数换键、断线禁止旧状态操作 / 重连显示结果、运行中取消保持等待；接口为受控夹具，不冒充实际 Worker |
| `bun tasks:validate` | 当前生产 Worker bundle + 临时 PostgreSQL + 实际本地 Queue / R2；真实登录 HTTP 提交 / 同键重试 / 查询 / 列表 / 取消 / 重试 / 越权和私有下载通过；定时补投 / 恢复、重复消息、重启保持结果通过 |
| 主预览浏览器 | 实际选择原 79 字节文本，提交后 Queued → Completed、一次尝试；结果预览 / 浏览器下载成功，下载字节数与 SHA-256 匹配数据库；直接详情刷新保持任务 |
| 真实手机宽度 | 浏览器实际 `innerWidth` 为 320 / 390；任务与文件布局检查无横向溢出；文件页 main 的 client / scroll 宽度分别 305 / 305、375 / 375；390 像素长文本对话框 client / scroll 为 356 / 356，64 KiB 提示保留 |
| 全量检查 | 34 个测试文件、229 项测试；TypeScript、Oxlint、Oxfmt、迁移检查、离线配置、产品预览构建和中文教程构建通过 |

更新主预览时仅迁移已授权的任务自有 loopback PostgreSQL（`launchkit` / 54329），原三份文件在迁移前后数量相同；新任务另新增一份结果，现四份文件。六项主预览服务已恢复，两个旧生成站与所有远程数据库未迁移，真实模型 / 邮件 / 收费 / 部署未执行。自动验收脚本继续只创建 / 销毁独立临时数据库。

浏览器检查发现 StyleX 没有输出 `border` 简写，明确拆成宽度 / 样式 / 颜色，连同文件工作台同类边框修复；实际详情计算样式确认一像素边框。另修正查询错误类型推断、服务器异常响应同时遮蔽消息与调试堆栈，以及提交成功后的请求键不应提前轮换，避免导航异常被当作新提交而重复创建。没有以扩大配额、绕过限流 / 验证或修改已有迁移来通过验收。

主预览手机布局的旧缺口现有实际证据，两个生成站删除按钮的最终浏览器操作仍待验收；真实验证码手机体验亦未验证。下一批接死信查看 / 恢复与执行耗尽，再用两份干净新站验收任务复制能力，随后进入 I5 原子收费事务。完整 I0— I16 目标继续保留。

## 2026-10-10：I4 第四批死信恢复与生成站验收

**I4 本地任务闭环已验收，下一阶段为 I5 原子预扣与结算。** 本轮补齐独立死信消费者、投递版本保护、持久收据、本人查看故障时间和受限恢复。任务状态仍为原八种，没有另建队列 / 文件 / 配额体系；保留已发布迁移，新增 `0006_task_dead_letters.sql`。

每次补投、结束旧租约和手动恢复推进投递版本，消费及死信处理均核对当前版本。旧投递不能领取新尝试，旧死信不能终止新任务。死信事务以队列 / 消息标识唯一保存记录，成功提交才确认；提交响应丢失重投仍只有一份记录。等待任务明确失败并停止补投；运行任务保留租约，允许真实成功，失败或失联后再停止自动恢复，未知处理器继续核查。本人重试沿用所有权、来源、频率、名额、原文件 / 到期 / 摘要、验证码及保存的次数限制，不清零预算。

| 验收 | 实际证据 |
| --- | --- |
| 原生死信 | 当前生产 Worker bundle、临时 PostgreSQL、实际 Queue / R2；数据库拒绝领取夹具触发首次投递及三次十秒重投，死信消费者保存一份 `applied` 收据；自动维护不再补投；移除故障后真实 HTTP 重试成功并下载 |
| 处理预算耗尽 | 数据库仅在临时验收环境拒绝结果预留，让实际消费者领取后失联；显式推进租约时间、执行实际维护 / 队列三轮，三次尝试后失败、释放输入并拒绝重试（409）；没有清零次数或改变实际队列配置 |
| 新站复制 | 两份干净目录分别独立安装、迁移至 0006、离线配置检查及产品构建；8410 / 9410 使用不同数据库、认证命名空间、R2 和业务 / 死信队列，目标、消费者及路由变量匹配 |
| 新站接口隔离 | 网关实际登录 / 上传 / 提交 / 同键重复 / 查询 / 私有下载；各一次结果；直接详情刷新返回应用；混合 Cookie 选择本站会话；外站任务查询 / 取消 / 结果下载为 404，只有外站 Cookie 为 401 |
| 新站真实页面 | 两站登录、选择原文本、开始任务，Queued → Completed；本人预览 / 浏览器下载及直接刷新通过。A 下载 17 字节，B 下载 16 字节，内容分别为本站标记；与数据库字节数和 SHA-256 一致 |
| 新站死信恢复页面 | A 的受控数据库领取故障产生原生死信，详情显示 Failed、故障时间、0 / 3 和 Retry task；移除故障后点击恢复，完成 1 / 3，保留历史故障时间及唯一收据；生产代码没有故障开关 |
| 新站实际重启 | 停止 / 重启两站自身四项服务；A 的三个、B 的两个任务和所有结果可下载、摘要匹配、每项一次尝试；原认证会话与 A 的故障历史保持；浏览器详情再次刷新保持完成 |
| 主预览回归 | 仅迁移已授权的任务自有 `launchkit` / 54329；前后均四份文件，一个原任务及结果保留；六项服务恢复，原会话、活动组织与任务详情仍可用 |
| 全量检查 | 34 个测试文件、238 项测试；TypeScript、Oxlint、Oxfmt、迁移一致性、离线配置、产品预览与中文教程构建通过；实际任务 / 文件 / 八会话验收也通过 |

第一次复制配置检查发现新增死信变量未列入环境示例；修正模板后重新生成两份干净目录并重新安装 / 配置 / 构建，旧的本轮无用户数据夹具数据库和目录已清理。旧 6710 / 7710 文件站未改动。两份最新站生成时源仓库包含本轮未提交改动，`template.json` 保留 `sourceHadUncommittedChanges: true`，不能声称其来源为已发布的新版本。

本轮只新增结构化、稳定错误与历史时间；用户响应不含队列名称、消息编号、内部版本、原始输入或供应商诊断。死信消费者自身为十次有限重投，持续数据库故障时不能承诺平台无限保存消息；云端资源、告警与保留 / 容量策略归 I15。真实验证码、真实模型 / 邮件 / 收费及部署没有执行；两个旧生成站永久删除按钮仍待对应确认，不阻塞独立的 I5 事务工作。完整 I0— I16 目标继续保留。

## 2026-10-10：I5 报价、事务预扣与结算

**I5 本地闭环已验收，下一阶段为 I6 积分包与支付事件。** 接续 `85525f63`，复用个人积分账户、账本、任务 / 文件与队列体系，新增 `0007_task_charges.sql`，不修改已发布迁移。文本队列任务仍默认 0 积分，浏览器工具继续免费。可配置正数价格只在独立本地夹具启用；没有真实 Stripe 收费或模型调用。

服务端报价返回整数积分、版本和本人可用余额；收费提交必须确认当前报价，价格或版本不符明确拒绝。任务插入、输入保留、欢迎初始化、预扣和待投递在一个事务提交。可用余额行锁与既有增减服务共用，外部队列在提交之后执行。每个任务保存固定价格，成功发布与结算同事务；取消、不可重试失败或预算耗尽与一次性返还同事务。重复请求 / 重放不能再扣或再退。

可手动重试失败且还有预算时保留预扣，原价重试；本人可以放弃并返还，输入失效后定时维护返还。自动等待重试继续保留输入 / 积分，已受理输入到期不直接终止正在执行的任务。外部结果不确定时继续核查且保留预扣，不因取消请求提前返还。已退款任务不可领取或重试。预扣记录异常或事务失败全部回滚，不显示虚假的完成 / 退款。

页面新增价格、余额、明确确认、失败后的返还操作和收费状态。丢失响应保存完整原请求 / 原报价，余额减少或当前报价变化仍可重放；收到明确报价 / 余额拒绝后重新查看并确认，不能静默换价。个人账本可直接打开关联任务。英文产品界面、中文教程和现有哑光主题保持。

| 验收 | 实际证据 |
| --- | --- |
| 收费生命周期 | 14 项，实际迁移 PGlite / 本地 R2：免费兼容、并发幂等、余额不足、错误报价、整事务回滚、结果结算、原价重试、放弃失败、预算耗尽、运行中取消、未知结果保留、失败输入失效维护、账本异常回滚、死信预扣与放弃返还 |
| 报价 API 与页面 | API 核对匿名拒绝、个人余额、旧报价 / 余额不足无任务、一次预扣 / 返还；七项页面测试包含确认、余额不足、响应丢失原报价重放、明确改价后重新确认、断线与退款展示。页面接口是受控夹具 |
| 八连接 PostgreSQL | `tasks:validate-charges` 确认八个独立服务端会话；八个不同请求余额只够一个时七个拒绝；同键只扣一次；并发成功 / 失败 / 取消只能发布或返还，不能两者兼得；其他积分消费者共用余额锁 |
| 真正收费 Worker | 独立生成站配置每任务 3 积分；`tasks:validate-paid` 使用生产 Worker bundle、临时 PostgreSQL、实际 Queue / R2，HTTP 报价 / 旧报价拒绝、重复提交、成功结算、取消一次返还、重试不多扣、scheduled 输入失效返还及重启余额 / 下载通过 |
| 真实浏览器 | 10410 独立收费夹具：选择原文本，未确认禁用按钮；确认后 Queued → Completed，3 积分 Settled，余额 20 → 17。实际下载字节与数据库 SHA-256 相符；另由内部夹具建立 `STORAGE_FULL` 失败，在页面放弃后显示 Returned，账本一笔 +3，余额回到 17 |
| 手机报价界面 | 实际 390 / 320 像素：文档宽度分别 390 / 320；确认标签 client / scroll 宽度分别 293 / 293、223 / 223，无横向溢出；检查后恢复默认尺寸 |
| 免费与文件回归 | 当前生产 Worker 的 `tasks:validate` 继续通过原生死信、预算耗尽、私有下载与重启；`files:validate` 上传 / 配额 / 引用保护 / 权限 / 清理回归通过，全部临时资源清理 |
| 主预览升级 | 仅任务自有 loopback `launchkit` / 54329 应用 0007；前后四份文件、一个原任务；六项服务恢复，原会话 / 组织 / 结果保留。浏览器原任务显示免费，一次尝试，79 字节下载摘要保持 |
| 全量检查 | 35 个文件、257 项测试；TypeScript、Oxlint、Oxfmt、迁移一致性、离线配置、主产品 / 官网预览与中文教程构建通过 |

收费复制站使用独立数据库、认证命名空间、R2 / Queue 和 10410 / 10414 / 10510 / 10610 端口，生成来源如实记录未提交修改；不能称其源自已发布版本。8410 / 9410 两个旧任务生成站仍运行 I4，没有自动迁移或声称已升级收费。临时自动验收数据库 / 资源已清理，供查看的独立收费站保留。

初次生成站 Worker 验收未先构建邮件包，明确失败后补构建；另一个到期夹具误用了自动等待重试状态，改为真实可手动重试失败 `STORAGE_FULL` 后才验证维护返还，未扩大退款条件或放宽业务规则。浏览器发现账本文案仍写付费处理未启用，修正并加关联任务入口；取消后的页面不再提示继续重试。

I6 继续实现积分包、验签事件、原子发放、重复 / 乱序 / 退款与争议流程；真实 Stripe 沙箱需对应测试商品与凭据，未提供前不得把本地事件测试当实际支付。真实验证码、模型 / 邮件、云部署及两个旧站永久删除按钮待验收项保留。完整 I0—I16 目标继续，不因 I5 完成缩减范围。

## 2026-10-10：I6 第一批购买与验签

**状态：I6 进行中。** 已接入个人积分包目录、购买记录与详情、Checkout、签名事件和原子发放；默认售卖关闭。自动退款扣回、争议恢复、真实 PostgreSQL 支付并发与 Stripe 沙箱 / 订阅完整生命周期仍待验收，不能把本批描述为 I6 完成。

新增迁移 `0008_credit_purchases.sql`，保留 0000—0007。购买保存不可变商品 / 金额 / 版本、原请求键、模式和操作租约；事件记录不保存原始支付内容。每笔购买的稳定发放事件、购买终态、账本和余额同事务提交。使用当前已安装 Stripe SDK 22.6.2 与 Better Auth Stripe 1.7.4，积分 endpoint 和 secret 与订阅分开，订阅职责保持在 Better Auth。

服务端 Checkout 核对实际 Price，未知结果重试使用原购买与 provider 幂等键。签名回调读取当前 Checkout / PaymentIntent / Charge 后核对归属、商品、数量、金额、币种及模式；延迟未成功不发积分，不按旧事件载荷把已发放购买降级。退款、争议或信息不符进入保守核查，阻止新的积分包购买、收费任务和收费手动重试；免费任务、取消返还仍可用。**目前不自动扣回或解除核查，包括退款失败 / 争议关闭也仍保留核查。**

页面显示公开目录、本人分页历史和购买详情，回跳只查询服务端结果；网络故障不提供过时支付链接。购买与积分保持个人所有权，不随组织切换。新站复制清空积分包目录，不能带走源站 Stripe 商品；使用 Babel 解析配置并按语法节点替换，避免执行配置或用正则截断嵌套对象。首次尝试误用了 TypeScript 7 已移除的旧入口，生成测试明确失败后改用固定 Babel parser 8.0.7 并通过，未降级编译器。

| 证据 | 验证口径 |
| --- | --- |
| 支付服务测试 | 17 项：真实 SDK + 受控 HTTP 响应 + 实际 PGlite 迁移；报价变化、响应丢失、重复 / 乱序 / 延迟事件、事务回滚再投递、信息不符、退款与争议核查、归属 / 来源限制；未向 Stripe 发请求 |
| 购买页面测试 | 3 项：响应丢失保留原请求、回跳等待服务端确认、核查时禁止新购买；接口是受控夹具 |
| 原生验签 | `payments:validate`：生产 workerd bundle + 一次性 PostgreSQL，真实 SDK / SubtleCrypto 错误及过期签名、错误模式、超大原始请求拒绝；合法订阅发票被忽略，不调用 provider，不验收 Checkout 发放；资源已清理 |
| 全量检查 | 37 个文件、278 项测试通过；TypeScript、Oxlint、Oxfmt、迁移一致性、配置诊断通过 |
| 构建 | API bundle、主产品 / 官网预览、中文教程构建通过 |
| 主预览升级 | 仅任务自有 loopback 54329 / launchkit 应用 0008；六项服务恢复，四份文件和一个任务保留；浏览器会话 / Preview Studio 保留，余额 20、购买关闭，原免费任务完成一次；实际重新下载 79 字节与数据库 SHA-256 相符 |

`tasks:validate` 免费任务生产 Worker 回归已通过实际 Queue / R2、原生死信、预算耗尽、私有下载、维护与重启持久性，临时资源已清理。10410 收费夹具仍运行 I5，8410 / 9410 仍运行 I4，未声称它们已升级本批购买能力。未迁移云数据库、部署云资源或调用真实支付 / 邮件 / 模型。

下一批实现累计退款扣回、已消费差额、争议恢复与可审计解除，并以八个真实 PostgreSQL 连接验证购买 / 发放 / 核查并发。真实 Stripe 测试商品与凭据仍是外部验收门槛。完整 I0—I16 目标继续保持。

## 2026-10-10：I6 第二批退款、争议与差额

**状态：I6 本地财务闭环继续完善，外部验收仍未完成。** 新增成功退款的累计按比例扣回、争议扣回 / 恢复、非负余额下的差额、可审计服务端核查和详情页记录。没有调用实际 Stripe API 或完成真实支付；订阅完整生命周期与真实沙箱继续保留。

迁移 `0009_credit_purchase_settlement.sql` 增加退款 / 争议金额、应扣回 / 已扣回 / 差额、调整版本和核查时间；支付事件保存该次财务快照、余额变化、原因及来源。保留 0000—0008。外部查询仍在事务外，购买租约限制并发；购买状态、调整账本、余额和事件同事务提交。账户余额锁串行处理本人不同购买，解除标记前检查全部购买，避免另一笔争议被并发解除。

当前规则使用成功退款累计额与尚未恢复争议额，合计最多按原购买金额计算，统一累计后向下取整。余额不足只扣可用额并记录差额；争议恢复只返实际扣过的积分，不将差额当成已消费的可返积分。待退款 / 开放争议继续暂停收费；失败退款、胜诉 / 询问关闭 / 被阻止等终态从当前 provider 状态核对。付款元信息不匹配保持人工核查，普通重查不能解除。分页完整性、最多 1,000 条记录、未知状态和不一致快照均有保守核查边界，见[教程](./billing-tasks)。

新增 `purchases.reconcile`，仅允许本人、同站来源和原有业务限流，客户端只能传购买 ID；关闭新售卖后仍可处理既有购买。`purchases.events` 只返回本人最近 20 条精简快照。详情展示差额、实际扣回和恢复记录；另一笔购买造成账户暂停时不提供本站 Checkout 链接或重试入口。历史已在外部打开的 Stripe 页面不会因此失效，仍需事件核对。

| 证据 | 验证口径 |
| --- | --- |
| 支付服务测试 | 28 项：真实 SDK + 受控 HTTP + 实际 PGlite 迁移；累计取整、先退款后确认、余额不足、待 / 失败退款、胜 / 败诉、退款与争议重叠、超过一页的历史、截断拒绝、回滚再投递、跨人 / 来源拒绝、关闭售卖后可信核查 |
| 页面测试 | 5 项，接口为受控夹具；原请求保留、支付确认、账户暂停、差额展示及只恢复实际扣回额、另一笔核查时隐藏已有 Checkout |
| 实际八连接 PostgreSQL | `payments:validate-settlement`：确认八个独立 backend pid；并发创建只建一笔 Checkout，八个不同签名事件发一次积分，退款与收费任务竞争保持资金恒等式，八笔同账户争议交错恢复不会清掉其他核查，实际事务回滚后再投递成功；SDK HTTP 是受控响应，不是实际支付 |
| 生产 workerd 验签 | `payments:validate` 使用新 bundle / 迁移，错误 / 过期签名、大小及模式边界通过；合法订阅发票被忽略，无 provider 调用，不支持推断实际 Checkout 发放已验 |
| 独立生成站浏览器 | 11410 / 11414 / 11510 / 11610、独立认证与数据库；真实 API 读界面，财务状态由真实业务函数 + SDK 受控响应建立。初始应扣 100、实扣 10、差额 90、余额 0；受控胜诉后差额 0，账本 +10、余额 10。没有实际支付或点击 provider 核查入口，后者由接口 / 页面受控测试验证 |
| 响应式 | 390 浅色和 320 深色，文档宽度与 viewport 均分别 390 / 320，无横向溢出；随后恢复浅色与默认 1280×720 |
| 全量检查 | 37 个文件、291 项测试通过；TypeScript、Oxlint、Oxfmt、迁移与离线配置通过，API / 主产品 / 官网 / 中文教程构建通过 |
| 主预览升级 | 仅任务自有 loopback 54329 / launchkit 应用 0009；六项服务运行，原会话 / Preview Studio / 20 积分、四文件和一免费任务保留；既有 79 字节实际下载与数据库摘要仍一致 |

全量测试两次在文件清理多页案例超过原 5 秒时限；单项真实 R2 案例通过，保留 105 对象、跨页与隔离断言，仅给该超过 200 次 Worker 代理操作的案例 15 秒，再跑全量通过。没有改文件清理业务来绕过检查。初次更新独立夹具时复制命令工作目录错误，确认失败后使用源目录绝对路径复制并重建；最终浏览器显示新版本的确认文案。

支付对账临时数据库已销毁；供查看的独立 UI 夹具保留，来源如实记录未提交修改，并对最终两份 UI 文案作同步，不能声称来自已发布版本。10410 收费夹具与 8410 / 9410 旧任务站未升级；没有迁移云数据库、部署或发出真实付款 / 邮件 / 模型请求。

后续继续 I6 的订阅集成验证与故障行为；真实 Stripe 沙箱、生产绑定、管理员人工核查和永久财务保留仍按原计划与 I9 验收。完整 I0—I16 目标继续保持，未因本地财务闭环缩减。

## 2026-10-10：I6 第三批订阅状态与更新故障

**状态：I6 继续进行，尚未完成真实沙箱或订阅乱序 / 并发完整验收。** 接续 `d1e0066a`，保留 Better Auth 的订阅状态写入职责；本批完善账单读模型、页面恢复入口、模式拒绝和更新 / 删除保存校验，没有另写订阅状态处理器或发放组织订阅积分。

当前有效方案与账单方案分开：active 必须有仍有效的确认周期，trialing 必须有仍有效的确认试用截止；周期、提前取消 / 结束的最早截止限制访问，缺失或过期不延长，当前没有宽限期。续费失败、未付、暂停、未确认首付保留原账单状态和可用门户，不显示新的 Checkout。仅没有订阅、取消或首付过期允许有管理权的人新购。个人 / 组织客户严格按活动 reference 判断，多个 active / trialing 不任意选一笔。成员上限读值不代表邀请入口自动执行，实施仍按 I8。

账单 UI 提取为独立组件，页面接收服务端可用动作，查询失败隐藏旧动作；刷新、返回窗口和每 30 秒检查状态，缓存增加 userId / organizationId，避免个人账单跨账号复用。产品文案英文，维护教程中文。

实际已安装 Better Auth Stripe 1.7.4 的 updated / deleted 处理器会捕获部分数据库错误并继续返回成功。SDK 客户端先真实验签，在插件写入前拒绝模式混用；`onEvent` 再通过新鲜数据库校验状态、方案、周期与取消时间，未保存就返回非 2xx 供重投，已配置价格对应的缺失记录也不静默确认。另发现该库测试环境默认跳过来源检查；明确 `disableOriginCheck: false` 使集成测试执行和生产一样的回跳 / CSRF 检查，没有降低生产保护。

| 证据 | 验证口径 |
| --- | --- |
| 订阅插件集成 | 六项：真实 Better Auth 路由、实际迁移 PGlite、真实 Stripe SDK + 受控 Fetch；Checkout 创建 / 回跳、试用 / 续费失败 / 恢复 / 取消、门户个人 / 组织权限与不可信回跳、错误模式、实际数据库触发器拒绝 / 修复、缺失管理记录与其他 Stripe 产品隔离；没有访问 Stripe |
| 账单接口 / 缓存 / 页面 | 27 项接口测试含周期 / 试用到期、提前取消、无周期、多笔 active、逾期客户隔离；七项查询键测试包括不同用户；五项页面测试覆盖付款异常、确认刷新、取消新购、成员操作隐藏、查询 / 门户失败。页面接口为受控夹具 |
| 原生 workerd | `payments:validate` 扩展：实际 PostgreSQL 和生产 Worker 内的 Better Auth 更新 trialing → active → past\_due → unpaid → paused → active、预约取消及删除；错误模式不写入。真实触发器拒绝导致非 2xx，修复后同一个事件 ID / 载荷成功；没有积分发放；临时资源已删除。原积分签名 / 模式 / 大小边界仍通过 |
| 浏览器 | 11410 独立测试站沿用既有用户 / 数据库；虚构测试密钥只供本地签名，不是真实 Stripe 凭据。由真实本地 webhook 更新状态，浏览器只查询 / 刷新：逾期显示原 Pro / 付款异常和门户、不显示升级；试用显示截止；预约取消保留到期前访问；确认周期过期显示暂停。没有打开门户、完成支付或调用 provider |
| 响应式 | 320 像素下文档宽度 320，关闭侧栏后正文 client / scroll 宽度均 305；随后恢复默认 1280×720 和浅色 |
| 全量检查 | 39 个文件、311 项测试通过；TypeScript、Oxlint、Oxfmt 通过；API / 主产品 / 官网及中文教程构建通过 |
| 主预览 | 六项服务更新，浏览器原会话 / Preview Studio 仍在，主站账单未启用；未应用新迁移。四文件和一份成功免费任务仍保留，既有 79 字节下载摘要与数据库相符 |

首次集成测试因邮件基础配置缺失与 Bun Fetch 类型额外要求而失败，补齐本地配置与准确函数签名后修复。门户拒绝的插件实际状态为 401，先核对权限中间件再修正断言；不可信回跳最初在测试环境被自动绕过，明确来源检查后才验证 403。编译发现数组下标推断与实际空结果不符，使用 `at(0)` 保留空结果类型；没有用断言伪装成始终存在订阅。全量检查随后通过。

**仍需推进：** 锁定插件对 updated 的载荷写入仍有旧事件覆盖新状态的风险；本批保存校验不是事件排序器，创建 / Checkout 吞错、回跳归属、未知 Checkout 结果恢复、插件直接 API 的重复新购门禁、并发、年付及真实沙箱仍按原 I6 验收。正常流程通过不能证明这些门槛已完成。无真实支付 / 邮件 / 模型调用、云部署或共享数据库迁移；旧 I4 / I5 生成站没有升级。完整 I0—I16 目标继续保持。

## 2026-10-10：I6 第四批结账请求、并发门禁与回跳归属

**状态：I6 继续进行，订阅事件乱序和真实沙箱仍未完成。** 接续 `6f6772d9`，本批把设置页动作限制落实到服务端 HTTP 入口，保持 Better Auth 插件对订阅状态的所有权。新增 `subscription_operation` 保存当前结账请求和两分钟操作租约；插件单行创建 / 更新在短事务内校验令牌与当前组织角色，外部 HTTP 不进入事务，没有另建一套订阅状态。

同一主体只允许一个操作，新购先核对本地未结束订阅。Checkout 和客户创建使用当前请求的稳定 SDK 幂等键，固定一小时 Checkout 期限；请求指纹、实际 SDK 参数摘要和插件行 ID 先保存再发送。响应未知允许原请求重试，改方案 / 数量 / 元信息 / 回跳或价格配置拒绝。创建及恢复已有 Checkout 会分页核对当前 provider 全部订阅（最多 1,000）；欠费不能藏在取消历史后。已知 expired 会话经当前 provider 确认后允许新请求、复用插件 incomplete 行；过期未知结果保持核查，自动恢复和管理员解除还未实现。

升级 / 门户等写操作要求同站来源和新鲜管理权限，个人客户不能指定组织 reference；结账回跳先核对登录、主体、provider 客户 / 会话 / 元信息与模式，插件再次读取时也检查归属。每人每分钟写操作 10 次、回跳 30 次。订阅回调保留原始字节并限制 256 KiB，忙返回 503；旧操作不能覆盖新令牌或释放新租约。未分配 scope 的内部插件写入被拒绝。新的状态查询优先未结束记录，多笔未解决记录进入错误；仅当前有管理权的人能读取原请求并显示“Resume original checkout”。

| 证据 | 验证口径 |
| --- | --- |
| 插件集成 | 24 项真实 Better Auth handler + 实际迁移 PGlite + 真实 SDK / 受控 Fetch；包含原请求复用、Checkout / 客户响应丢失后相同键及参数、改请求 / 改价格、六种未结束状态门禁、分页欠费、已知 / 未知到期、跨用户回跳、组织客户模式、大小与独立限流，保留之前生命周期 / 故障案例；没有访问 Stripe |
| 账单接口 / 页面 | 29 项接口、七项查询键、六项页面测试；旧取消历史不遮待支付、跨用户原请求隔离，页面重试原方案 / 年付及回跳地址，接口为受控夹具 |
| 八连接 PostgreSQL | `subscriptions:validate` 确认八个不同 backend pid；一笔 SDK 请求暂停时其余七个 upgrade 为 409，接受后响应丢失的第二次请求保留相同 SDK key / 参数，只有一个插件行；旧持有者更新和释放被拒绝、不同主体独立、组织撤权后事务拒绝。实际 Better Auth HTTP handler 在 Bun 执行，SDK HTTP 为受控响应，不等于 Worker Checkout 或真实付款 |
| 生产 workerd | `payments:validate` 使用新 bundle / 0010，在实际临时 PostgreSQL 核对原订阅生命周期、模式、触发器故障后相同事件再投递，新增订阅 raw 大小 413；原积分验签边界保留。没有 provider API、Checkout / 门户调用或积分发放；临时资源删除 |
| 独立浏览器 | 11410 / 11414 / 11510 / 11610 独立生成测试站升级本批文件、应用 0010；待支付行和原请求是明确插入的本地 UI 夹具，浏览器实际读取 API 显示继续原请求、隐藏新购，刷新后保持；没有点击恢复 / 门户或访问 provider。截图后删除新建夹具行并恢复旧订阅，由签名测试事件再次确认 past\_due；原账户及积分保留 |
| 响应式 | 320 像素下文档宽度 320、main client / scroll 均 305，恢复入口可见；恢复默认 1280×720、浅色，保留桌面 / 手机截图 |
| 全量检查 | 39 个文件、332 项测试通过；TypeScript、Oxlint、Oxfmt、迁移一致性、离线配置检查通过；API、主预览 / 官网及中文教程构建通过 |
| 主预览 | 仅任务自有 loopback 54329 / launchkit 应用 0010，六项服务运行，原登录 / Preview Studio 保留，主账单仍关闭；四文件和一个成功免费任务保留，既有 79 字节下载与数据库摘要一致（没有称为本批重新下载） |

新增的 0010 在尚未应用时随字段完善重新生成，之前 0000—0009 没有修改。实现过程中类型检查发现适配器的泛型结果推断丢失，明确传递 SDK 适配器声明的泛型参数修复，没有通过 `any` 或不安全类型断言隐藏问题。主体管理权限拒绝现在由入口返回 403，区别于之前插件返回 401，断言与教程按最终行为更新。

**仍需推进：** 本批租约不解决旧事件快照覆盖；当前 updated / deleted 保存校验未覆盖创建 / Checkout 全部吞错，过期未知 Checkout 自动查找、永久审计和管理员流程仍待验；年付首购界面、真实沙箱与生产绑定继续保留。下一批先完善签名事件的当前 provider 状态核对及这些故障路径，再进入原计划后续模块。没有云部署、共享数据库迁移、真实付款 / 邮件 / 模型调用；旧 I4 / I5 站未升级。完整 I0—I16 目标继续保持。

## 2026-10-10：I6 第五批当前订阅状态与失败确认

**状态：I6 继续进行，当前状态同步与创建 / Checkout 保存故障已本地验，外部门槛仍保留。** 接续 `cf724f07`，保持订阅表由 Better Auth 插件写入。没有新增迁移，保留 0000—0010。历史条目中的“乱序快照尚未处理”是当时状态；本批通过当前 SDK 资源核对处理这些旧通知，完整 I0—I16 范围保持。

真实原始请求验签并取得主体租约后，先读取当前 Stripe 订阅；Checkout 通知同时读取当前完成会话。当前对象的主体、客户、订阅 ID、模式、配置商品、周期与试用范围校验通过后，按已有行更新或已知唯一客户创建交给插件；不直接写一份平行订阅状态。旧 created / updated / deleted 与旧 Checkout 不再直接恢复旧快照。插件写入事务内检查实际保存的状态、方案、周期、席位、试用、取消 / 结束与日程，不一致回滚，提交后继续核对，内部吞错不能确认成功；当前读取失败 / 列表不完整或租约忙返回 503。锁定插件创建遗漏的取消 / 结束 / 日程字段，在同一次插件创建中补齐。实际触发器静默改变创建或更新状态时整次写入回滚，防止失败时暴露部分新权限，修复后同事件可以重投。

发现 Stripe SDK 将同一静态回调对象分配给不同客户端，原包装方式会累积验签闭包，导致请求串用模式 / 租约检查。现在先复制客户端回调对象再包装，真实 SDK 的测试 / 正式与普通客户端隔离测试通过。未修改 SDK 的签名算法。

| 证据 | 实际口径 |
| --- | --- |
| 订阅插件集成 | 40 项真实 Better Auth 路由 + 实际迁移 PGlite + 真实 SDK / 受控 Fetch；新增旧通知 / Checkout、读取失败重投、创建与 Checkout 触发器保存故障、年付当前状态、归属 / 模式不符、截断列表、首次取消字段 / 创建及更新静默异常回滚与客户端隔离；所有 SDK HTTP 受控 |
| 八连接 PostgreSQL | `subscriptions:validate` 的八个独立连接；结账请求重试保持原键 / 参数、七个并发新购被拒绝；一条签名通知读取暂停时其余七条返回 503，随后均保存当前 active 而非原 past\_due；旧令牌与撤权保护继续通过，临时数据库删除 |
| 生产 workerd | `payments:validate` 在新 bundle 和一次性 PostgreSQL 验证真实 SDK / SubtleCrypto、大载荷 / 模式 / 签名、正常生命周期、旧 created / deleted、当前读取失败 503 与实际触发器故障后相同事件成功；当前订阅 GET 经 Miniflare 出站拦截提供受控对象，其他外部目标拒绝；无原生 Checkout / 门户 HTTP 或积分发放，临时资源删除 |
| 全量检查 | 39 个文件、348 项测试通过；TypeScript、Oxlint、Oxfmt、迁移一致性与离线配置通过；API、主预览 / 官网和中文教程构建通过 |

主预览六个服务重启后均返回 200，新中文教程已实际读取。已有账户仍为 20 积分，文件数仍为四个；既有成功任务保持一次执行，其 79 字节浏览器下载文件与数据库结果 SHA-256 一致。本批没有重新下载文件，不将该比对称为新浏览器下载验收。

本轮没有浏览器样式或页面变更。保留的 11410 独立 UI 夹具仍在前一批版本，不将其截图算作本批新事件处理验收；主站计费仍关闭，不向实际 Stripe 发请求。年付当前资源同步已经验证，年付首次购买和真实 Stripe Sandbox 尚未验证。

内部插件事件类型用于当前状态创建 / 更新，不保证原通知的完成 / 删除钩子触发。尚未新增这些钩子对应的邮件或积分，持久副作用去重和通知发件箱按 I12 实施。读取后供应商的新变化仍需后续通知收敛，不能称为跨系统原子快照。

**下一步：** 完善 GET 回跳完整保存校验与未知过期 Checkout 查找，保留管理员处理 / 永久财务留存、真实沙箱、年付首购和生产绑定验收。后续继续原计划账号、运营与增长模块，不因本批状态同步通过将 I6 或完整目标标记完成。没有云资源变更、共享数据库迁移或真实付款 / 邮件 / 模型调用。

## 2026-10-10：I6 第六批结账回跳的当前状态与补丁交付

**状态：I6 继续进行，GET 回跳完整保存校验已本地验，未知过期结账恢复与外部门槛保留。** 接续 `c998cdc2`，不增加数据库迁移，保留 0000—0010。复用原始通知与登录回跳共同的当前资源核对、主体租约和插件写入事务；完整 I0—I16 目标没有缩减。

回跳只接受本人 / 有管理权组织的已完成、已付款或无须付款的 Checkout，核对当前客户、模式与绑定订阅，再读取当前订阅。插件在本次请求中复用已核实的 SDK 响应，仍承担订阅表写入；事务内检查并回滚异常，提交后检查保存结果。读取失败 503，未完成会话 409，保存失败非 2xx；失败不会返回成功跳转，也不会提前将原请求记为已解决。重新访问同一回跳即可重试，不重新创建付款或发放个人积分。已取消 / 欠费的当前状态可以同步后返回设置页，跳转本身不证明付费有效。

核对安装包发现原 Better Auth Stripe 1.7.4 在本地 active / trialing 时提前跳过更新，且回跳更新遗漏 endedAt 和 stripeScheduleId。本批通过 Bun 版本补丁删除提前返回并补齐两字段；API 精确锁定版本，补丁声明和锁文件一同维护，保留第三方 MIT 许可证。生成器复制 patches 目录，二次生成也保留。没有复制整个插件源码或新增另一套状态写入器，回跳不伪造已签名支付事件。

| 证据 | 实际口径 |
| --- | --- |
| 订阅集成 / 生成器 | 49 项真实路由 / SDK / 迁移 PGlite 订阅测试，三项生成器测试；新增已 active 后取消及日程更新、单次 SDK 读取、回跳读取失败 / 保存异常 / 静默状态改动回滚与原请求重试、open / expired / unpaid 及错误会话 ID 拒绝、无需付款的年付试用状态；所有 SDK HTTP 受控，年付首次购买界面仍未验 |
| 原生 Worker | `payments:validate` 用生产 bundle、一次性 PostgreSQL 与实际注册会话验证 GET 更新、原 active 到欠费 / 取消、读取失败 503、实际触发器保存失败无跳转和修复重试；客户创建、Checkout / 订阅读取由本地出站拦截返回，其他外部目标拒绝；原签名 / 模式 / 大小 / 乱序故障回归通过，临时资源删除 |
| 八连接回归 | `subscriptions:validate` 保持七条并发升级拒绝、同键重试、七条并发通知 503 后原事件重投、旧令牌与撤权保护；实际 PostgreSQL + Bun 中 Better Auth handler，SDK HTTP 受控；不是原生 Checkout 创建 / 门户 HTTP 验收 |
| 新站安装 | 实际生成新产品，在空目录离线安装 / frozen lockfile 成功，核对真实安装包的回跳补丁已应用；没有启动该站运行时或数据库，临时安装目录删除；源代码生成与二次生成另由行为测试核对补丁文件 |
| 全量回归 | 39 个文件、357 项测试通过；TypeScript、Oxlint、Oxfmt、迁移一致性和离线配置检查通过；API、主预览 / 官网、中文教程构建通过 |

主预览六个服务刷新后均返回 200，实际读取到新的中文回跳教程。原账户仍为 20 积分，四个文件与既有成功任务保留；此前 79 字节下载文件与结果记录 SHA-256 一致。本批只比对既有文件，不宣称完成新浏览器下载。

本轮未改页面样式，不复用旧 UI 截图作为新回跳证据。主预览保持计费关闭；11410 独立 UI 夹具仍在旧版，未加载新 SDK 读取或补丁。没有实际 Stripe、Resend、模型调用、云部署或共享数据库迁移。

**下一步：** 继续过期未知 Checkout 的安全查找与恢复，保留管理员处理和永久财务留存；真实 Stripe Sandbox、年付首购界面、生产绑定与副作用持久去重仍需按原计划验收，后续继续账号、运营与增长模块。I6 与整体目标仍进行中。

## 2026-10-10：I6 第七批原结账请求查找与页面恢复

**状态：I6 继续进行，带请求标记的未知会话恢复已本地验，未标记旧未知请求与外部门槛保留。** 接续 `b06d26b4`，保留增量迁移 0000—0010，没有新增表。恢复复用已有主体租约、当前资源核对、插件回跳与写入保存校验，不增加第二套订阅状态写入器；完整 I0—I16 范围保持。

新 Checkout 在实际 SDK 参数中增加 `subscriptionAttemptId`。旧请求的 SDK 摘要若对应升级前未标记参数，重试仍使用相同正文 / 幂等键，不能追加元信息触发 Stripe 参数冲突。恢复入口只能核查服务端原请求：未知会话按原客户和固定一小时窗口分页查找，最多 1,000 条，要求唯一标记匹配，再读取当前会话核对主体、客户、模式、本地行和原期限。已知 ID 的旧会话可核查；未知且没有标记的旧请求仍留给后续人工流程，查不到不等于可以另付一次。

open 保存原会话但不自动跳转；complete / paid 或无需付款通过当前资源及实际插件回跳同步，保存成功后才解决原请求；expired 无关联订阅、客户无未结束订阅且本地行仍 incomplete 时释放原请求，供应商提前过期也适用。找不到、多个匹配、分页未完成 / 超限、未付款、信息不符和供应商失败均保留核查，恢复本身不创建付款。旧租约失效或组织撤权不能写回；POST 要求同站来源、当前会话和账单管理权，与回跳共用每人每分钟 30 次独立额度。

设置页增加“Check previous checkout”，与继续原请求、门户共同管理忙碌和错误状态。结果只刷新请求原本的用户 / 组织查询，界面核对当前主体后显示反馈；确认过期后允许新购，刷新仍保持。主账单配置不因此启用。

| 证据 | 实际口径 |
| --- | --- |
| 插件 / 数据库测试 | 66 项真实 Better Auth handler、SDK 与迁移 PGlite；本批包含未知 open / complete / 提前 expired、后续分页、缺失 / 歧义 / 未标记旧请求、绑定不符、保存失败修复、欠费门禁、跨站 / 跨主体、SDK 旧参数兼容、列表失败 / 截断 / 超限、处理中租约替换和未付完成；SDK HTTP 全部受控 |
| 账单 / 页面 | 30 项账单接口、八项页面测试；原请求确认过期且没有供应商订阅才开放新购，核查失败不触发升级；组件接口是受控夹具 |
| 八连接 PostgreSQL | 原结账 / 签名通知并发、旧令牌和撤权回归；一笔已接受但响应丢失的 SDK 请求，首个恢复查询暂停时其余七个为 409，放行后全部核查同一会话，没有第二个创建请求。真实 PostgreSQL 与 Bun 插件 handler，SDK HTTP 受控；临时数据库删除 |
| 生产 workerd | 新 bundle、一次性 PostgreSQL、真实注册 Cookie 和 SDK Checkout POST；本地出站服务先接受会话再返回故障，核查找回 open、提前 expired 后新请求，再将完成会话通过插件同步。全部 SDK HTTP 拦截，其他目的地拒绝；旧签名 / 模式 / 大小 / 乱序与保存失败回归保留，没有真实 provider API / 门户 / 付款；临时资源删除 |
| 实际浏览器 | 12410 一次性独立数据库 / 受控 Worker 与新页面构建；原请求由真实本地 HTTP 升级创建并丢失响应，浏览器登录后点击核查先收到受控 503，修复后核查确认提前 expired，隐藏原请求并显示新购，刷新仍保持；没有点击新购 / 门户。全部操作只有一份受控创建；保留失败、成功与手机截图，临时数据库 / Worker 删除 |
| 响应式 | 320 像素文档宽度 320，关闭侧栏后 main client / scroll 均 305；恢复默认视口，关闭临时验收页 |
| 全量检查 | 39 个文件、377 项测试通过；TypeScript、Oxlint、Oxfmt、迁移一致性与离线配置通过；API、主预览 / 官网和中文教程构建通过 |

新增接口测试最初把已解决请求插成缺少原请求字段的记录，实际数据库约束正确拒绝；改为完整合法原请求夹具后通过。浏览器临时代理初次保留了已解压响应的压缩头，先修正本地透传并清理该次临时资源，再完成上述页面验收。该代理只属于忽略的验收脚本，不进入产品代码。

主预览六项服务刷新后均返回 200，实际读取到新的恢复教程；主账单仍关闭，没有应用新迁移。原账户保持 20 积分、四文件和一份成功免费任务；此前 79 字节下载与结果摘要一致，本批没有重新下载。12410 使用源站 bundle 的同名 localhost Cookie 替换了浏览器主会话，验收后已通过本地捕获验证码重新登录原 Local Preview / Preview Studio，未修改原账号凭据或数据；后续同源 bundle 夹具应使用不同回环主机名隔离 Cookie。

**后续仍需推进：** 未标记旧未知会话的人工核查、管理员处理及永久财务留存按 I9；真实 Stripe Sandbox、年付首购界面、生产绑定与持久副作用去重仍按 I6 / I12 验收。无实际 Stripe / Resend / 模型请求、云部署或共享数据库迁移；旧 11410 独立 UI 与 I4 / I5 生成站未升级。I6 和整体目标保持进行中。

## 2026-10-10：I6 第八批年付首购与收费商品核对

**状态：I6 继续进行，年付首购与原请求恢复已本地验，真实沙箱仍待验收。** 接续 `cdf1b27a`，保留 0000—0010，没有新增迁移或依赖。继续由 Better Auth 写订阅状态，完整 I0—I16 范围保持；第七批中的年付首购待验为当时状态，本批完成本地页面流程，真实年费支付并未验收。

账单查询返回服务器配置的年付可用性及保存的周期。仅完整计费启用、独立年度 Price 配置且可新购的管理员看到 Pro 年付入口；Starter 和默认 Pro 仍是月付，已有订阅改周期走门户。新请求明确发送方案与周期；原请求继续保留原周期和回跳。个人请求显式绑定原用户，失败后也只刷新请求起始时的用户 / 组织查询，切换工作空间不会将结果归到新主体。页面显示原请求周期和当前服务器周期；发起下一项操作清除旧错误，忙碌期间禁用刷新，核查成功不再显示已解决的升级失败提示。

核对安装包发现插件价格读取会吞错，并回退配置 ID。实际 Checkout 创建前因此另读取收费项：必须是当前选中方案 / 周期的配置 Price ID，恰好一个收费项、正整数数量、同模式、已启用的 recurring / per\_unit / licensed 商品，周期为单月或单年、金额为正整数。供应商读取失败、归属 / 类型 / 模式 / 周期不符或商品停用不发送 Checkout POST。该路径比插件多一次当前 Price 读取，外部调用仍在事务之外，不新增供应商抽象或订阅状态表。三个配置 Price ID 必须不同，诊断不输出实际值。

设置页不从月度展示价计算年度金额或折扣，最终收费在 Checkout 确认。`StripeAnnual` 离线诊断和环境示例补齐启用说明；中文网站配置与支付教程说明支持类型、价格核对、原请求恢复及外部门槛。

| 证据 | 实际口径 |
| --- | --- |
| SDK / 插件 | 82 项真实 Better Auth 路由、SDK、迁移 PGlite；年付首购使用配置年度 Price、响应丢失后原键 / 正文重试、改月付拒绝、缺配置 / Starter 年付拒绝；月价冒充年价、错误模式、停用、计量 / 阶梯 / 多年 / 一次性 / 零值 / 小数 / 错误 ID、读取失败与插件读取后价格停用均不发 Checkout POST；SDK HTTP 全部受控 |
| 账单 / 界面 / 配置 | 31 项账单、13 项页面、11 项环境测试；年度可用性来自服务器，保存周期可核对；原年付请求恢复、已解决错误清除、未配置不显示、普通成员无购买动作、切换工作空间后只刷新原查询；组件接口为受控夹具 |
| 八连接 PostgreSQL | 结账门禁 / 原键重试、当前通知重投、旧持有者与撤权、原请求查找竞争均回归通过；插件 HTTP 在 Bun，SDK 受控，临时数据库删除 |
| 原生 workerd | 当前生产 bundle、一次性 PostgreSQL 与真实注册 Cookie；先核查已失去响应的月付原请求 / 提前过期，再首次发送年付请求；实际 SDK POST 收费项明确为配置年度 Price，完成后通过原插件保存 yearly / trialing，核查不再次创建。原签名、模式、大小、旧通知、保存故障与回跳回归保留；SDK HTTP 受控，临时资源删除 |
| 浏览器 | 最新 bundle 在独立 `127.0.0.1:13410` 和一次性数据库；浏览器从零 Checkout 选择年付，受控供应商接受后模拟响应丢失，页面自动查询并显示原 Pro 年付；点击核查同步 yearly / trialing、清除旧错误，刷新仍保持。一次验收只有一个 SDK Checkout POST，无替代请求、外部跳转或实际付款；当前构建重验后临时资源删除 |
| 响应式 | 320 像素年付选项可见，关闭侧栏后文档 320、main client / scroll 均 305；恢复默认视口，保留手机选项、原请求和确认状态截图；主预览 Cookie 由不同回环主机名隔离 |
| 全量检查 | 39 个文件、401 项测试通过；TypeScript、Oxlint、Oxfmt、迁移一致性和离线配置通过；API / 主产品 / 官网及中文教程构建通过 |

测试过程中补齐真实 Price 夹具字段，并让旧 SDK 正文兼容测试显式提供服务器商品映射，旧请求正文及幂等键仍保持。测试工具与浏览器工具的角色查找参数不同，类型检查拒绝后使用正确接口，未通过类型断言绕过。没有修改已应用迁移或插件版本补丁。

主预览六项服务更新后均返回 200，实际读取到新中文教程；Stripe / StripeAnnual 在离线配置中均关闭，不向实际供应商发请求。浏览器原 Local Preview 会话及 Preview Studio 保留，原账户仍为 20 积分、四文件和一份成功免费任务；此前 79 字节下载与数据库结果摘要一致，本批没有重新下载或迁移主数据库。

**仍需推进：** 真实 Stripe Sandbox 下的月付 / 年付收费与门户、未标记旧未知会话的人工核查、管理员处理 / 永久财务留存、生产绑定及持久副作用去重；外部 AI 处理器与后续账号、运营、增长模块继续按完整计划迭代。没有实际 Stripe / Resend / 模型请求、云部署或共享数据库迁移，旧 I4 / I5 生成站与 11410 UI 未升级；I6 和整体目标保持进行中。

## 2026-10-10：I8 第一阶段 · 团队邀请闭环

**状态：I8 进行中。** 本批接续 `5bd9b9a3`。完成团队邀请的本地接口、邮件和工作台流程；角色管理界面、套餐人数写入限制、退出 / 所有者转移及会话 / Passkey 仍待开发，不把整个账号模块标记为完成。

`Members` 中已验证邮箱的 owner / admin 可邀请 member / admin，查看每页 20 条历史、重新发送 pending 邀请或取消。接收页 `/invitations` 支持保留邮件中的邀请 ID，经登录后仅展示当前已验证邮箱的有效邀请；接受会由 Better Auth 建立成员关系并更新会话中的工作区，拒绝不会创建成员。个人文件、任务、结果、积分的归属保持既有规则。

新增增量迁移 `0011_simple_inhumans.sql`，以 `(organization_id, lower(email)) WHERE status = 'pending'` 索引替换终身唯一约束。终态历史可与新邀请共存；过期 pending 在重新邀请的锁内退役为 canceled，旧 ID 继续失效。0000—0010 及已发布历史未改写，额外 `acceptedAt` / `rejectedAt` 仍未自动填充。

所有邀请决定与成员移除、降级、退出、组织删除在组织行锁内执行认证插件的实际写入，错误响应会使事务回滚。没有另建成员写入接口。未显式指定团队时，在请求入口选定团队并绑定给插件，防止等待锁期间切换工作区改变操作目标。创建 / 重发还会在锁内读取最新的发起者邮箱验证状态。邀请发送复用现有 HTML + text 邮件入口，并在数据库提交后执行；发送失败返回可恢复的 503，保留 pending 并刷新界面供 Resend。持久化邮件任务仍属 I12，进程在提交后发送前终止时需要重新发送。

| 证据 | 实际口径 |
| --- | --- |
| 迁移 / 插件测试 | 真实 PGlite 迁移、实际 Better Auth HTTP 路由：错误 / 未验证邮箱、已接受、已取消、过期、拒绝后再邀、pending 重发、重复请求、邮件失败恢复与发起者验证；索引允许终态历史、拒绝大小写变体的第二条 pending |
| 读取隔离 | 历史仅 owner / admin 可读；降级或移除后的旧会话立即失去历史权限；接收页仅返回该已验证邮箱的 live pending ID 和团队名 |
| `bun organizations:validate` | 临时本地 PostgreSQL 的 8 个独立连接：重复邀请只有一条、接受 / 拒绝 / 取消只成功一个、两位 owner 同时自降级始终剩一位、降级者不能邀请、最后 owner 不能退出；真实锁等待期间切换团队，未指定 org 的邀请仍写入原团队 |
| 原生 Worker | 同一 Worker bundle 完成注册、捕获含接收页 URL 的邮件、验证邮箱夹具接受、接受后的旧取消拒绝；外部请求全部拒绝，最终销毁临时数据库及 Worker 资源 |
| 浏览器 | 一次性数据库与 `127.0.0.1:14310`：发送 / 重发、接收者实际邮箱 OTP 登录、打开邮件链接、接受并切换到团队、普通成员无邀请表单、取消后状态更新；与主预览 Cookie 隔离 |
| 响应式 | 320 浅色、390 深色下完成邀请 / 取消；文档 scrollWidth 等于视口宽，无横向溢出；保存浅色邀请、接受及手机截图，临时视口恢复 |
| 全量检查 | 40 个文件、412 项测试通过；TypeScript、Oxlint、Oxfmt、迁移一致性、离线配置、API / 主预览 / 中文教程构建全部通过 |

认证边界的改动另回归 `subscriptions:validate` 与 `payments:validate`：八连接原 Checkout 竞争 / 恢复、实际 Worker 的订阅状态、签名与保存故障 / 原请求恢复均通过，供应商 HTTP 全部受控。

仅任务所属主预览 `127.0.0.1:54329/launchkit` 应用 0011；迁移前后确认原免费任务 succeeded、1 次尝试、20 积分及四文件完全一致。六项预览服务更新后均返回 200，主浏览器原 Local Preview / Preview Studio 会话保留，新邀请卡片可见。此前 79 字节下载仍与结果摘要一致，本批没有重新下载。离线诊断 Stripe / StripeAnnual 均关闭，邮件只本地捕获。

**下一阶段：** 先将套餐人数上限落实到成员新增的数据库写入门禁，并验证并发接受不同邀请不能超额；再交付角色编辑、移除、退出和独立的所有者转移流程。接续会话 / Passkey 管理、恢复路径与真实外部环境验收。I6 的真实 Stripe、I7 的实际 AI 处理器、I9— I16 保持原计划范围。主预览仍不启用支付；本批未请求真实邮件、支付或模型服务，也未部署云端或迁移共享数据库。

## 2026-10-10：I8 第二阶段 · 套餐人数与成员管理

**状态：I8 继续进行。** 接续 `66aa4c1c`，新增成员名额检查、角色编辑、成员移除与退出。没有新增依赖或迁移；保留 0000—0011。所有者转移、会话与 Passkey 管理、真实邮件及 OAuth 环境仍待推进，整体 I0—I16 目标保持。

人数使用同一配置中的 Free 1 / Starter 5 / Pro 50，所有者计入。账单和成员写入共享当前订阅访问判断：团队只使用自己的有效订阅，个人 Pro 不提升团队；支付关闭或试用 / 周期到期回到 Free，原成员保留。邀请不预留席位，接受满额邀请返回 403 且 pending 保留。组件的预检查提供提示；真正的门禁在插件 adapter 新增 member 前锁组织行并读取当前人数，认证插件继续负责写入。

检查实际认证组件代码发现，其默认 adapter 事务回调会传入未装饰的底层实例。因此让回调保留带有成员 / 订阅门禁的 adapter；组织 HTTP 边界仍拥有整体事务，可信 `addMember` 自身的新增检查使用短事务。明确拒绝开启另一个 Drizzle adapter 独立事务配置，避免绕过外层边界。本批同时回归已有订阅 / 支付写入门禁，没有另建成员写入服务或订阅状态表。

成员行可保存 admin / member 角色，admin 不能管理 owner；移除与退出使用二次确认。最后 owner 禁止退出、移除与降级。修改完成或失败都重新读取会话并刷新原团队数据，操作期间切换工作区不会改变目标；退出后实际会话返回个人范围。界面不提供 owner 提升，独立的所有者转移留待下一阶段。

| 证据 | 实际口径 |
| --- | --- |
| 真实组件 / 数据库测试 | PGlite 全迁移、实际 Better Auth 邀请 / 角色 / 移除 / 退出 HTTP 与可信 `addMember`；Free、Starter 最后名额、释放名额、个人订阅隔离、到期保留成员、adapter 事务回调不能绕过；前端验证拒绝后刷新、原团队绑定和退出期间保持等待 |
| 八连接 PostgreSQL | 8 个已验证用户接受不同邀请争抢 Starter 最后名额，1 成功、7 个 403、成员为 5 且 7 个 pending 保留；另用 8 个独立连接直接调用可信插件 `addMember`，不经过 HTTP 组织锁，仍只有 1 个新增成功；原邀请 / 终态 / owner 竞争和切换工作区回归通过 |
| 原生 workerd | 临时数据库、真实注册 Cookie、捕获邮件与接受；角色升降、移除后的原 Cookie 被团队及账单读取拒绝，用户记录保留；退出后实际会话 activeOrganizationId 为 null。付费资格是数据库夹具，客户 SDK HTTP 由本地白名单拦截并校验客户 ID 已持久化，其他出站拒绝；不是实际 Stripe / Resend 验收 |
| 浏览器 | 当前 app + Worker bundle、一次性数据库、独立 127.0.0.1:14310；owner 修改角色、刷新仍保留、降级、二次确认移除后人数减少；普通成员看不到管理操作，确认退出后转个人，刷新仍保持。最后 owner 退出按钮禁用；满额页面显示 5 / 5 与邀请不占名额说明；保留截图，临时服务 / 数据库销毁 |
| 手机布局 | 320 像素深 / 浅主题及移除确认：document scrollWidth 305、main client / scroll 均 290，视口 320，无横向溢出；恢复默认视口 |
| 支付回归 | `subscriptions:validate` 的八连接竞争 / 恢复与 `payments:validate` 的真实 Worker 通知 / 保存故障 / 年付原请求恢复全部通过，所有供应商 HTTP 受控；临时资源删除 |
| 全量检查 | 41 个文件、424 项测试通过；TypeScript、Oxlint、Oxfmt、迁移一致性和离线配置通过；API / 主预览 / 官网与中文教程构建通过 |

主预览六项服务已更新，原 Local Preview / Preview Studio 会话保留；主支付关闭，按 Free 显示 1 / 1，最后 owner 不能退出。原账户保持 20 积分、四文件、成功免费任务和一次尝试；此前 79 字节下载仍匹配数据库结果摘要，本批没有重新下载或迁移主数据库。

**下一阶段：** 独立的所有者转移、会话列表 / 撤销及 Passkey 管理。真实邮件、OAuth / Passkey 与 I6 Stripe 沙箱、I7 实际 AI 处理器仍按各自验收推进，后续运营 / 增长模块保持完整计划范围。本批未访问实际支付、邮件或模型供应商，未云部署或迁移共享数据库。

## 2026-10-10：I8 第三阶段 · 原子所有者转移

**状态：I8 继续进行。** 接续 `0ffd6442`。完成独立的所有者转移流程；会话与 Passkey 管理、真实邮件 / OAuth 环境以及后续 I9—I16 仍保持原计划范围。没有新依赖、迁移或成员写入器。

组织边界增加显式 `organizationId` / `memberId` 的同源认证操作，在已有组织行锁内调用 `ownership-transfer.ts`。验证当前发起者为已验证非匿名 owner，目标是同一团队的另一位已验证非匿名成员；调用同一个事务绑定的完整 Better Auth handler，先提升目标为 owner，再降级发起者为 admin。任一步错误响应或数据库异常使整体回滚。已有 owner 可接收，其他 owner 保持不变；它不是把所有 owner 替换为一个人。转移不会新增成员，也不受降级后已有成员超额的影响。

普通角色编辑仍只提供 admin / member，公开普通角色接口也拒绝 string / array / 逗号组合中的 owner 提升。只有 owner 能看到转移入口，成员搜索 / 分页返回服务器判断的候选资格；自选、未验证、匿名、已移除和跨团队成员拒绝。页面确认说明权限变化；转移通过认证客户端发起单个操作，不在浏览器拆成两次角色请求、不自动重试。成功或失败后读取真实会话和原团队列表，响应丢失也能核对当前角色。转移不更改个人资产或支付账户；进一步近期登录策略、审计与安全通知仍按账号 / I9 / I12 推进。

| 证据 | 实际口径 |
| --- | --- |
| 实际组件 / PGlite | 8 项迁移数据库与完整 Better Auth 路由测试：两步角色变化、旧 owner 失权 / 可退出、新 owner 不能直接退出、成员 / admin 发起拒绝、双方邮箱 / 匿名状态读取、自选 / 外团队 / 移除 / 无效请求拒绝、真实 SQL 触发器拒绝第二步时提升回滚、已有 owner 接收 |
| 查询与前端 | owner 候选跨搜索页、未验证 / 匿名目标排除、admin 不返回可转移资格；前端单个 auth `$fetch` 操作，失败 / 响应丢失后仍刷新原团队角色，不调用两次客户端角色变更 |
| 八连接 PostgreSQL | 同一 owner 同时向不同成员提交 8 项转移：1 个成功、7 个 403，原 owner 为 admin，仍有一个 owner。原邀请 / 名额 / 终态 / owner 竞争及工作区切换回归通过 |
| 原生 Worker | 真实数据库触发器拒绝实际第二步降级，API 返回 500 且目标提升回滚；解除故障后重试 200，实际两步角色均保存，原 owner 的旧 Cookie 再转移 403。客户 SDK HTTP 全部受控、邮件仅捕获；临时数据库 / Worker 删除 |
| 浏览器 | 最新 bundle、一次性数据库与独立 127.0.0.1:14310；确认转移后目标成为 owner、发起者成为 admin，刷新仍保留且转移入口消失；发起者随后成功确认退出并回到个人工作区。保留确认、成功和退出截图，临时资源销毁 |
| 响应式 | 320 浅 / 深主题确认说明及按钮可用，document scrollWidth 305、main client / scroll 均 290，视口 320，无横向溢出；恢复默认视口 |
| 全量检查 | 42 个文件、434 项测试通过；TypeScript、Oxlint、Oxfmt、迁移一致性、离线配置及 API / 主预览 / 官网 / 中文教程构建通过 |

主预览六项服务更新后均返回 200，新中文所有者转移教程可读。Local Preview / Preview Studio 保留，主团队只有一位成员，不显示转移目标；未修改主团队角色。原账户仍为 20 积分、四文件、成功免费任务和一次尝试；此前 79 字节下载与结果摘要一致，本批没有重新下载或迁移主数据库。支付继续关闭，没有实际 Stripe / Resend / 模型请求、云部署或共享数据库迁移。

**接续：** 会话列表 / 撤销、Passkey 添加 / 命名 / 列表 / 撤销及恢复路径。I6 实际支付沙箱、I7 实际 AI 处理器和后续完整运营 / 增长模块继续按计划，I8 和整体目标不标记完成。

## 2026-10-10：I8 第四阶段 · 登录设备与会话撤销

**状态：I8 继续进行。** 接续 `39014964`，设置页新增登录设备列表、当前标记、单个会话撤销、其他设备批量撤销和近期登录恢复入口。没有新依赖、迁移、会话写入器或服务端认证策略替换；保留 0000—0011。Passkey、真实邮件 / OAuth、I6 真实支付、I7 实际模型与 I9—I16 继续按完整计划推进。

读取和撤销直接使用现有 Better Auth 客户端。查询按用户 ID 隔离，不随工作空间转移；列表只展示有效会话，当前会话排首位，其他按创建时间排序。日期为浏览器本地时区，User-Agent 只作设备辨认提示，IP 缺失不编造地点。撤销 token 只在内存中按 SDK 契约使用，不进入 DOM、链接或持久存储；变更缓存只保存目标 ID，不包含 token。

单个 / 批量都要求确认，当前会话没有远端撤销按钮，继续使用原侧栏退出。写入失败也重新读取真实列表，因为认证组件批量删除可能部分完成；不自动重试、不把报错标成成功。设备列表保留 SDK 默认近期登录门槛，过期或会话已失效时可重新登录；只有实际 sign-out 成功才清理本地会话并跳转安全的 settings 回跳，失败仍保留当前登录。没有关闭服务端 freshness 或 Cookie / CSRF 检查。

| 证据 | 实际口径 |
| --- | --- |
| 真实组件 / PGlite | 6 项完整 Better Auth 与迁移数据库测试：有效会话列表 / UA / 用户隔离、单个撤销与旧 Cookie 失效、外用户及猜测 token 不影响外用户、批量保留当前 / 外用户、25 小时会话拒绝列表而新登录恢复、无 Cookie / 撤销者 / 错误 Origin 被拒绝 |
| 页面 / 缓存 | 5 项页面测试：当前标记、只有远端操作、DOM 不含 token、确认后才发撤销与刷新、部分批量失败不报成功并读取真实余下会话、重登录 sign-out 失败保留缓存 / 成功后携带安全回跳；测试夹具等待列表完成加载，非活跃 auth 查询保留到测试结束 |
| 原生 Worker | 真实注册 / 多次密码登录、实际 Cookie、一次性 PostgreSQL；单个撤销后的原 Cookie 的私有 tRPC 立即 401；8 个并发批量撤销全部 200，只余当前设备，外用户仍有效。25 小时会话 list 403 / get-session 仍有效，实际退出和登录后恢复列表。外部请求全部拒绝，临时资源删除 |
| 实际浏览器 | 最新 app / Worker、独立 127.0.0.1:15310 与一次性数据库；单个确认撤销后消失，手机批量确认后只余 This device，刷新保留；夹具将会话改为 25 小时，刷新显示 Sign in again，实际退出、密码登录自动回 settings 并恢复当前设备列表。不同设备提示由受控 UA 登录夹具创建，并非真实物理远端设备；保留截图，临时资源销毁 |
| 响应式 | 320 浅 / 深主题确认按钮与设备日期可用，document scrollWidth 320、main client / scroll 均 305，无横向溢出；恢复默认视口 |
| 全量检查 | 44 个文件、445 项测试通过；TypeScript、Oxlint、Oxfmt、迁移一致性、离线配置及 API / 主预览 / 官网 / 中文教程构建通过 |

主预览六项服务更新，新中文会话教程已读取。Local Preview / Preview Studio 会话及原账号保持，设置页显示实际当前设备；主支付仍关闭，没有撤销主账号其他会话或迁移主数据库。原账户为 20 积分、四文件、成功免费任务和一次尝试；此前 79 字节下载仍与结果摘要一致，本批没有重新下载。未访问真实 Stripe / Resend / 模型、云部署或迁移共享数据库。

**下一阶段：** Passkey 添加、命名、列表 / 删除与最后可用登录方式的恢复检查，再接续管理员与审计等完整计划模块。会话撤销阻止后续认证请求，不承诺取消已经排队的任务或推送清空其他设备当前页面；I8 与整体目标继续进行。

## 2026-10-10：I8 第五阶段 · 通行密钥与恢复底线

**状态：I8 继续进行。** 接续 `a23a994e`。设置页提供通行密钥添加入口、列表、改名、删除确认及近期登录回跳；服务端保护最后登录方式与密码凭据解绑。没有新依赖、迁移或凭据写入器，保留 0000—0011。真实设备 / OAuth / 邮件、I6 真实支付、I7 实际模型和 I9—I16 保持原范围。

客户端使用实际 Better Auth Passkey API，按用户隔离缓存；名称 1—80 字符，取消 / 失败不显示成功，不自动重试设备注册。变更结束重新读列表，处理响应丢失后的真实状态。名称及创建时间可见，公钥与 credential ID 不进入页面；不使用尚未写入的 `lastUsedAt` 或设备字段冒充真实记录。添加检查安全上下文和 WebAuthn 支持，管理入口关闭跟随通用配置。

列表、注册 / 验证、改名、删除复用组件原生近期登录 middleware，匿名账号拒绝。删除与公开解绑账号使用同一账号行锁，完整插件在同一数据库事务执行实际变更；若最后通行密钥或启用中的密码被移除后，不再有已验证邮箱的验证码 / 真实密码登录路径，则回滚。另一个通行密钥可继续保留登录，单有外部账号绑定不认作可靠的邮箱恢复底线。前端二次确认说明删的是站点凭据、既有登录会话与设备上的副本保留。不是用按钮禁用代替服务端保护。

| 证据 | 实际口径 |
| --- | --- |
| 真实认证组件 / PGlite | 12 项迁移数据库与完整 handler 测试：真实 ES256 注册 / 签名登录、持久改名、删除后拒绝登录、最后凭据回滚 / 仍可登录、另一个通行密钥保留、验证状态与配置 / 密码为空检查、用户 / Origin 隔离、近期窗口、挑战重放 / 错误 origin / 伪造签名拒绝、匿名 / 撤销会话拒绝、端点替代写法不绕过、密码解绑回滚及验证码恢复路径 |
| 页面 / 缓存 | 6 项测试：添加调用官方设备客户端 / 刷新，改名保存，确认后才删除、服务器拒绝时保留凭据和错误，注册取消不重复调用或假成功，近期登录恢复，浏览器不支持时解释限制；DOM 不含公钥 / credential ID。设备注册调用在页面测试中为受控模拟，不称为真实系统弹窗 |
| 原生 Worker / PostgreSQL | 软件认证器生成真实注册和签名消息，实际生产 Worker 验证身份、重放、改名、跨用户和 Origin；8 个并发删除只成功一个，余下凭据仍可登录，删除者不能登录。25 小时会话管理拒绝，新密码登录恢复；验证邮箱后可删除最后凭据，密码登录仍有效。另实际解绑密码，捕获验证码并通过组件验证码登录同一账号；OAuth 行只是受控数据库夹具，未实际授权，未外发邮件 |
| 浏览器 | 独立 `passkeys.localhost:16310`、最新 app / Worker 和一次性数据库；两个通过协议注册的凭据列出，改名 / 删除成功、刷新保留；最后一个未验证邮箱时拒绝并仍在列表；25 小时会话后实际退出 / 密码登录自动回设置；夹具邮箱验证条件满足后删除，刷新为空。结束后脚本用两份实际签名确认页面删除的凭据均不能登录、密码仍可登录；临时资源销毁 |
| 响应式 | 删除确认在 320 像素浅 / 深主题可用；修复确认按钮超宽，document scrollWidth 320、main client / scroll 均 305。恢复默认视口；保存改名、删除确认、最后凭据保护、重登录和删除结果截图 |
| 全量检查 | 46 个文件、463 项测试通过；TypeScript、Oxlint、Oxfmt、迁移一致性、离线配置和 API / 主预览 / 官网 / 中文教程构建通过。新增中文通行密钥教程读取 200 |

主预览六项服务返回 200，Local Preview / Preview Studio 会话保留，设置页显示实际当前设备与通行密钥管理。没有为主账号添加、移除或解绑凭据，主支付关闭。原账号保持 20 积分、四文件、成功免费任务与一次尝试；此前 79 字节下载与结果摘要一致，本批没有重新下载、迁移主数据库或云部署。没有真实 Stripe / Resend / 模型请求。

**外部验收边界：** 软件认证器验证服务端签名协议；系统屏幕锁、手机、Windows Hello 和实体安全密钥的真实注册 / 登录弹窗仍需人工设备验收，不把添加按钮或模拟 API 调用算成完成。真实验证码邮件送达和外部账号恢复仍按独立环境验收。下一阶段接续 I9 管理员与审计；I8 和整个目标不标记完成。

## 2026-10-10：I9 第一阶段 · 站点授权、封禁与审计

**状态：I9 进行中。** 接续 `45d8f267`。实现站点角色、明确账号初始化、`/admin`、用户搜索 / 分页、角色变更、永久封禁 / 解封、任务元数据和审计查看；积分账本管理、支付排查、带原因积分调整、任务恢复 / 对账、生产初始化与 I10—I16 继续按完整计划。新增[中文教程](./admin-audit)，不把第一阶段标成完整运营后台。

接入已安装 Better Auth Admin，不增加第二套身份或会话写入器。新增增量迁移 0012、用户角色 / 封禁字段、兼容会话字段与 `admin_audit`。普通注册保持 `user`；组织 owner / admin 不提供全站权限；注册 / 资料更新不能注入角色。每次读取 / 变更都检查新鲜用户状态，授权不使用缓存连接。审计保留历史 ID，无账号级联外键；同步数据库规范说明，不删改旧迁移。

受控本地命令要求现有、已验证、非匿名、未封禁的明确 `usr_` ID 和原因，拒绝远程数据库 / 自动选首个账号；真实组件用户写入与审计同一事务。重复初始化不恢复已撤销角色，其他候选拒绝。生产初始化 / 灾难恢复仍待实现。

公开管理写入只有三种同源 POST。原因、16 KiB 请求上限、严格字段及 UUID；先锁管理变更 / 目标，再调用完整组件并保存前后状态。封禁实际删除会话，审计故障使两者一起回滚。全局事务级咨询锁保护跨账号并发；至少留一位有效管理员，禁止自封禁或提升未验证 / 封禁账号。未审计的插件模拟登录、用户创建 / 删除、密码设置等接口拒绝，替代路径不绕过钩子。

执行者与请求 ID 唯一约束去重；重复 ID 的变更请求必须保持动作、对象、角色和原因一致。解封后重放旧封禁不再次封禁。页面明确确认，失败保持原请求 ID 供手动重试；不自动重试，成功 / 失败都重新读状态及审计。权限检查失败或失权时隐藏缓存的管理数据；近期会话过期提供实际退出 / 登录回跳。任务只读页不返回原始输入、名称、参数、摘要或私有下载。

封禁拒绝后续登录及新任务请求；已接受任务继续原扣费、退款和执行规则，不额外退款 / 取消，不承诺中断所有在途请求。用户 API Key 尚未实现，其新鲜封禁检查随 I10 完成。

| 证据 | 实际口径 |
| --- | --- |
| 完整认证组件 / PGlite | 8 项：明确初始化 / 非自动授权 / 字段注入拒绝、团队分权、真实封禁 / 会话删除 / 登录拒绝 / 解封、SQL 触发器让审计失败后的全事务回滚、重放与冲突、最后管理员及旧会话失权、Origin / 原因 / freshness / 未审计接口、账号删除后审计保留 |
| 管理读取 / PGlite | 3 项：故意空的独立缓存库不影响权限、旧上下文失权 / 封禁、26 用户分页与字面通配符搜索、任务 / 审计筛选和私有字段缺席 |
| 页面 / 缓存 | 5 项：确认前不写入与取消、响应丢失后同一 ID 手动重试 / 刷新、失权与权限检查故障隐藏旧私有数据、近期登录恢复入口 |
| 原生 Worker / PostgreSQL | 明确 CLI 初始化；实际 Cookie、团队 API 403；八个并发相同请求全 200 / 一条审计；真实封禁旧 Cookie 失效、登录 403、新任务 401；审计 SQL 故障回滚封禁和会话；解封后重放无变化；八个跨账号并发降权只发生一次有效角色下降且保留一位管理员，旧 Cookie 管理 API 403；未审计模拟登录 403 |
| 浏览器 | 独立 `admin.localhost:17310`、最新 app / Worker 与一次性数据库。搜索、取消确认、封禁 / 解封、状态和对应原因审计、刷新保留；脚本核实两条浏览器变更审计实际落库。正式权限变更只发生在一次性夹具；没有修改主预览角色 |
| 响应式 | 320 浅 / 深主题发现并修复确认按钮宽度；document scrollWidth 320，main client / scroll 均 305。390 下 document 390，main 均 375；恢复默认视口、关闭测试标签，保留桌面与手机截图 |
| 全量检查 | 49 个文件、479 项测试通过；TypeScript、Oxlint、Oxfmt、迁移一致性、离线配置、官网 / 主预览 / 中文教程构建通过；生产 Worker bundle 由原生验收实际构建运行 |

一次性数据库、Worker、资源目录销毁，实际查询没有遗留 `admin_acceptance_%` 数据库；禁止的外部请求为零。主预览六项服务 200、新中文教程可读；只重启本任务文档服务，主 API 保留此前 0011 bundle。实际设置页仍显示 Local Preview / Preview Studio、当前设备、无通行密钥与支付关闭。主账号邮箱已验证、20 积分、四文件、成功免费任务及一次尝试保留；本批不重新下载、修改主权限、迁移主数据库、部署云端或请求实际支付 / 邮件 / 模型。

主数据库尚未应用 0012，不能直接启动新 API。下一阶段先在独立验收环境补积分 / 支付只读排查与同一账本中的管理调整，再补恢复、生产初始化和 API Key。主预览升级需明确确认本地增量迁移范围；全计划目标保持进行中。

## 2026-10-10：I9 第二阶段 · 财务排查与审计积分调整

**状态：I9 继续进行。** 接续 `3e6dd9df`，交付已有账本、购买 / 支付事件、个人 / 团队订阅查看，以及带原因、先复核再确认的积分调整。任务恢复、主动支付对账、生产初始化和 I10—I16 保持完整计划范围。没有新依赖或 SQL 迁移；JSON 审计类型和 text 动作扩展兼容 0012，生成检查确认无需迁移，既有 SQL / 快照 / journal 未改写。

财务查看按站点权限、账号 / 购买 / 账单归属筛选，每页 20 条并使用稳定时间 / ID 排序。读取不初始化钱包；实际零余额与未初始化区分，事件零快照与未记录区分。全站视图包含团队订阅，选择用户只显示其个人订阅。仅展示数据库已有记录与排查 ID，不访问供应商、不返回 Checkout URL、内部租约 / 请求键或原始负载，也不把保存的订阅状态代替实时权益规则。

调整只接受本站 Origin、正式非匿名目标、非零整数 ±1,000,000 和 5—500 字符原因。执行者权限及实际会话在事务锁内复核，与 Better Auth 共用 24 小时近期登录窗口；撤销会话拒绝，过期页面提供退出 / 登录回跳。封禁目标可修正账目，但不解除封禁、购买差额或支付审核限制。调用同一余额锁 / 账本服务，独立 `adjustment` 不带任务 / 购买关联；必要欢迎初始化与调整、审计同事务，审计 SQL 故障全部回滚。

审计保存实际前后余额 / 审核状态、调整量、账本 ID、执行者、目标、原因和时间。管理请求共用执行者 / UUID 命名空间，相同请求只处理一次，改变内容重用拒绝；消费后重放不恢复历史余额；孤立账本事件缺少审计时拒绝继续。页面取消不写入，响应不确定保留同一 ID 手动重试，不自动重试；结束后重读余额 / 账本 / 审计，权限或读取错误隐藏缓存数据。用户账本只展示通用调整说明，维护原因留在管理审计。

本轮原生并发测试发现人工调整持有用户 `UPDATE` 锁、另一个任务 / 支付写入持有钱包锁后检查用户外键时形成死锁。修复为用户 `NO KEY UPDATE`，允许账本 `KEY SHARE` 外键检查，并按执行者用户 → 会话 → 目标 → 钱包顺序锁定。重新运行独立连接的真实任务预扣、支付冲正和人工调整，所有操作完成；后续实际退款后余额与全账本合计一致，不通过跳过断言或自动吞掉数据库错误解决。

| 证据 | 实际口径 |
| --- | --- |
| 积分 / PGlite | 8 项：余额增减、审核 / 封禁保留、独立类型与关联限制、重放后消费保留、跨动作 UUID 冲突、已有 / 首次钱包审计故障回滚、负余额 / 溢出 / 非法字段、孤立账本拒绝、降权 / 封禁 / 25 小时 / 撤销会话拒绝 |
| 管理读取 / PGlite | 累计 6 项：故意空的缓存库不用于权限；普通 / 团队 owner 与旧上下文不能读取财务；23 条账本 / 购买 / 事件 / 个人订阅分页无重复，团队归属独立；只读不发欢迎积分；私有 Checkout / 租约缺席；事件 null / 0 保留；错误 / 缺失 Origin 不能写，正确同源可写 |
| 页面 / 缓存 | 新增 6 项：取消不写，失败同 ID 手动重试 / 读实际余额与账本，typed 近期登录错误调用恢复，未初始化只读 / 非整数与零禁用，购买事件 / 订阅筛选，读取失败隐藏旧账本；原账号管理 5 项保留 |
| 原生 Worker / PostgreSQL | 8 个相同调整请求一笔账本 / 审计；8 个唯一扣减只有余额允许的 3 个成功 / 5 个 412，重放不改消费；账号动作与调整 UUID 冲突；SQL 审计故障回滚新欢迎 / 钱包及既有余额；真实 25 小时 Cookie 收到 typed 403、新密码登录恢复；独立连接同时人工调整 / 实际任务预扣 / 支付冲正，后续实际任务退款、全账本合计一致；审核标志未清除；原账号封禁 / 最后管理员验收仍通过 |
| 浏览器 | 一次性 `admin.localhost:17310`、最新 app / 生产 Worker：筛选账号、复核 / 取消、确认 +7 和 -4，余额实际 102 → 109 → 105；对应账本和原因审计刷新保存；购买 / 事件显示缺失快照与 0，个人 / 全站订阅显示正确归属。购买 / 订阅是明确合成的数据库夹具，没有真实 Stripe 交易 |
| 响应式 | 320 浅 / 深主题的调整确认及财务记录 document scrollWidth 320、main client / scroll 均 305；390 的全站订阅 document 390、main 均 375，无横向溢出。恢复视口、关闭测试标签，保存桌面和手机截图；主账号登录页 / 主题未被测试账号影响 |
| 回归与构建 | 51 个文件、496 项测试通过；类型、Oxlint、Oxfmt、迁移一致性、离线配置及主预览 / 中文教程构建通过。`tasks:validate-charges` 的 8 独立连接原扣费 / 退款规则通过；`payments:validate` 实际 SDK / Worker 的订阅生命周期、签名 / 当前状态、故障回滚与原 Checkout 恢复通过，供应商 HTTP 由受控夹具响应 |

用户明确选择升级本地预览后，只对本任务 `127.0.0.1:54329/launchkit` 应用已验收 0012，确认原 12 条迁移历史及全部 13 条 SQL 摘要匹配；现有账号仍为未封禁普通用户，没有初始化主管理员。新版 API 和六项预览服务已重启并返回 200。实际浏览器原 Local Preview / Preview Studio 会话保留，当前设备、无通行密钥和支付关闭显示正常；原账号保持已验证邮箱、20 积分、四文件、成功免费任务与一次尝试。本批没有重新下载原 79 字节结果。

一次性数据库、Worker 和资源目录实际销毁，查询没有遗留 `admin_acceptance_%`。没有实际 Stripe / Resend / 模型请求、云部署或共享数据库迁移。**下一阶段：** 带原因的任务恢复与主动对账流程，保留原扣费 / 退款 / 支付校验和可核对审计，再接续生产初始化及 API Key。I9 与整体目标继续进行。

## 2026-10-10：I9 第三阶段 · 带原因任务恢复

**状态：I9 继续进行。** 接续 `014175e0`，在已有管理页增加按选中账号分页、带原因复核 / 确认的重试与取消，任务操作和审计原子提交。主动支付对账、生产初始化、真实外部环境及 I10—I16 仍保留完整范围。没有新依赖或 SQL 迁移；生成检查确认 text 动作与 JSON 审计类型扩展不改变数据库结构，保留全部 0000—0012 SQL / 快照 / journal。

将原任务服务拆出事务内入口，普通用户仍使用原事务包装；管理员与任务执行共用尝试预算、输入可用性、容量、处理器版本、收费快照和扣费 / 退款规则。管理员不能追加尝试、重新预扣、复活已退款任务或绕过审核 / 封禁。未运行取消结束并按原账本返还一次；运行 / 核对中的任务仅记录请求，执行器持有实际租约后结束并结算。前端区别取消请求与执行完成，已取消记录不再提示可能仍在运行。

实际角色、近期 24 小时登录及未撤销会话在事务锁等待后重查；同源严格输入，每管理员任务写入每分钟最多 10 请求，重放计入。共享管理咨询锁、账号 `NO KEY UPDATE` 和任务锁保留已有并发顺序。审计失败时任务状态、输入保留与退款全部回滚。审计仅存任务 ID 和必要运行状态，没有文件名、摘要、输入、参数、私有下载或会话 token。

请求 UUID 与账号 / 积分操作共用执行者命名空间；同 UUID 的同内容重放不派发、不复活后来完成 / 取消 / 退款的任务，改变动作 / 任务 / 原因会拒绝。页面取消确认不写入，响应丢失沿用冻结 ID 手动重试；没有自动重试。每次结束重新读任务、账本与审计，读取出错隐藏旧任务数据。任务恢复区单独组件，账号 / 财务 / 任务操作共享忙碌状态，避免请求中切换对象。

任务与审计提交后才调用 Queue；派发失败 / 进程中断由原数据库待派发记录及维护流程继续，原执行版本与租约防止重复发布。审计证明管理请求已提交，不冒充实际处理完成或退款完成。

| 证据 | 实际口径 |
| --- | --- |
| 事务 / PGlite | 新增 8 项：原尝试 / 收费 / 输入保留及有限审计、后续取消后旧重试不复活 / 跨动作 UUID 冲突、两种审计故障回滚、尝试耗尽 / 版本 / 已退款 / 故障 / 输入 / 容量 / 审核门禁、运行取消延后结算、实际角色 / 25 小时 / 撤销会话、封禁不能重试但可取消清账 |
| HTTP / PGlite | 新增 3 项，累计管理路由 9 项：普通账号拒绝、同一取消请求前 10 次成功 / 第 11 次 429 且一次审计 / 退款、未配置执行资源 / 缺 Origin / 实际近期会话拒绝、最小任务元数据与可操作提示 |
| 页面 / 缓存 | 新增 5 项：复核 / 取消不写入与账号筛选、丢响应同 ID 手动重试并读取实际退款状态、运行取消不声称已完成 / 退款、typed 登录恢复、读失败隐藏缓存任务；最后取消提示修订后单独重跑 5 项通过 |
| 原生 PostgreSQL / Worker | `admin:validate-tasks` 新建一次性数据库并运行生产 Worker。8 相同请求只有一审计及一次实际 Queue 消费，保留 3 积分并结算，原尝试元数据 1 → 实际尝试 2；真实 R2 结果经会话下载匹配文本。8 个不同重试 / 取消请求竞争，结果结算与退款互斥；实际审计触发器分别阻断重试 / 取消，任务 / 输入保留 / 账本回滚；25 小时 Cookie、封禁与 10 次速率门禁通过。不同场景仅重置一次性夹具限流计数，生产不绕过 |
| 浏览器 | 隔离 `admintasks.localhost:18310`：原确认取消后任务仍失败 / 保留，重新确认实际重试并刷新为 succeeded / settled；原因审计持久。受控长运行租约取消后仍 running / reserved 并明确请求中；结束浏览器验收后实际原执行器 `failTask` 转 canceled / refunded，脚本核实两条原因审计各一次、账本余额一致。既有失败尝试与长租约为明确控制的夹具，没有实际远程处理器 |
| 响应式 | 320 浅 / 深主题的取消确认及任务审计 document scrollWidth 320、main 305；1280 桌面 document 1280。保存任务、实际审计截图，恢复临时视口 |
| 回归 | 53 个文件、512 项测试通过；类型、Oxlint、Oxfmt、迁移一致性与离线配置通过。`tasks:validate-charges` 的八独立连接扣费 / 退款互斥及实际 R2 通过；原 `admin:validate` 账号 / 财务审计、并发账本、最近登录 / 降权 / 最后管理员再次通过；没有改支付结算实现 |

一次性数据库、Worker 和资源目录均实际销毁，外部供应商请求为零。新版主预览与中文教程重建 / 重启；原账号仍已验证、未封禁普通用户，20 积分、四文件、成功免费任务与一次尝试保留，六项服务返回 200。本轮没有新增迁移、提升主账号、真实支付 / 邮件 / 模型请求或云部署。

**下一阶段：** 主动支付对账，复用真实供应商校验和原账本结算，并为请求及结果保留可核对审计；接续生产初始化与 API Key。I9 及整个目标保持进行中。

## 2026-10-10：I9 第四阶段 · 主动支付对账与完成审计

**状态：I9 继续进行。** 接续 `7d1425f3`，购买事件区新增带原因复核 / 确认的当前支付检查；复用原 Stripe SDK 读取与结算服务，增加请求和完成审计。生产初始化、真实外部验收和 I10—I16 仍保留完整范围。没有新依赖或 SQL 迁移；审计 text 动作与 JSON 类型扩展兼容 0012，生成检查确认无结构变化。

请求只接受购买 ID、UUID 和 5—500 字符原因。管理员实际角色、同源、近期 24 小时会话及对应测试 / 正式模式检查；每分钟最多 10 次，重放计入。服务器列表提示当前模式 / 引用是否可检查，读取不访问供应商；可以清理已有购买，不能在检查中创建 Stripe 收费、退款或订阅变更。新销售开关无需为历史对账开启。

先提交 `purchase.reconcile_requested`，随后原 SDK 读取当前 Checkout / PaymentIntent / Charge / 退款 / 争议。网络期间不持有管理与账本事务锁；原购买租约限制并发。结算前再次锁定并检查实际角色和会话；期间撤销会话不能提交财务写入。原校验决定金额 / 模式 / 归属 / Price 一致性及实际到账，不能注入“已支付”或手动清除审核。

复用原结算规则发积分、冲正 / 恢复、计算短缺与保留其他购买的审核限制。完成审计、购买、钱包 / 欢迎积分、账本和支付事件同事务提交，完成审计失败全部财务写入回滚；先前请求记录保留。审计只保存购买 / 对账事件 ID、已应用 / 需审核结果及实际前后状态、发放标志、退款 / 争议、扣回 / 差额，不含 Checkout URL、供应商原始负载、会话 token 或密钥。

稳定事件 ID 和执行者 / UUID 复用原幂等协议；同内容恢复缺失完成时可以继续，已完成重放不查询供应商、不恢复历史余额。不同内容或跨账号 / 积分 / 任务动作 UUID 冲突。购买已有事件却缺少完成审计时拒绝伪造完成。历史请求审计显示“请求已记录”，不误标为当前仍在等待；需结合完成审计和当前购买判断。新的后续退款检查需重新复核并生成新 UUID。

前端不自动重试；失败保留冻结确认供手动恢复，结束后重读购买、事件、余额、账本和审计。复核取消不提交；成功提示要求查看真实记录，`review` 不冒充支付正常。对账确认独立组件，与账号 / 积分 / 任务共享忙碌状态；请求中不能切换对象。读取失败隐藏旧购买及操作入口。

| 证据 | 实际口径 |
| --- | --- |
| 服务 / PGlite | 新增 7 项，使用实际 Stripe SDK 与受控 HTTP：请求先落库 / 完成与结算原子、消费后重放无供应商读取 / 不恢复余额、供应商失败保留请求并同 ID 恢复、完成审计 SQL 故障回滚欢迎 / 钱包 / 发放 / 事件、真实会话在查询期间撤销、金额不符保留审核、实际部分 / 全额退款和余额短缺；另含模式、引用、注入字段、跨动作 UUID 与近期登录门禁 |
| 路由 / PGlite | 新增 2 项，累计 11：角色 / Origin / 严格输入 / 不存在购买拒绝，不创建账目；未配置模式列表不可操作、前十个请求 503 / 第十一个 429，没有伪造请求审计 / 事件 |
| 页面 | 新增 4 项：原因 / 复核 / 取消不写入，响应不确定同 ID 手动恢复且无自动重试，未配置清晰不可操作，typed 最近登录恢复；原账号 / 财务 11 项保留，最后审计呈现修改后 15 项再次通过 |
| 原生 PostgreSQL / Worker | `admin:validate-payments` 一次性数据库与生产 Worker，实际 SDK HTTP 只由受控响应处理；8 并发相同请求一请求 / 一完成 / 一支付事件 / 一发放，竞争租约返回忙碌，完成重放不查询；真实供应商模拟 500、真实完成审计触发器故障、同 ID 修复恢复；查询中实际删除会话 401、25 小时 Cookie typed 403、金额不符未发放、部分 / 全额退款与 shortfall、每分钟 10 次门禁通过。仅独立场景重置一次性限流计数 |
| 浏览器 | 隔离 `adminpayments.localhost:19310`，取消复核后重新确认一次。原 pending 购买变 paid，当前受控供应商退款 450 美分、实际扣回 50 积分，事件与账本真实刷新；两条原因审计保存，完成审计显示 grant 未记录 → 已记录、扣回 0 → 50。浏览器结束后脚本核实实际两条审计、退款 / 扣回快照及钱包 / 全账本合计；没有真实 Stripe 交易 |
| 响应式 | 320 浅 / 深主题确认与结果 document scrollWidth 320、main 305；1280 桌面审计可读。保存截图并恢复临时视口 |
| 回归 | 55 个文件、525 项测试通过，类型 / Oxlint / Oxfmt / 迁移一致性 / 离线配置与预览 / API / 中文教程构建通过。`payments:validate-settlement` 八独立真实连接验事件发放去重、退款 / 任务消费守恒、审核 / 恢复及回滚；`payments:validate` 生产 Worker 验签 / 当前订阅 / Checkout 恢复与真实 SQL 故障重发；`admin:validate` 原账号 / 财务 / 近期登录 / 最后管理员回归通过，供应商均受控 |

一次性数据库、Worker、资源目录实际销毁；没有真实供应商请求、云部署、共享迁移或主管理员提权。主预览与中文教程重建 / 重启，六项服务 200；原账号验证、未封禁普通角色、20 积分、四文件、成功免费任务与一次尝试保留。I6 真实 Stripe 沙箱验收、I7 实际模型、I8 真实邮件 / OAuth / 通行密钥设备仍未标记完成。

**下一阶段：** 正式环境的受控首个管理员初始化与恢复边界，再接续可选 API Key 及完整计划。I9 和整体目标继续进行。

## 2026-10-10：I9 第五阶段 · 维护计划、明确初始化与灾难恢复

**状态：I9 继续进行。** 接续 `f57f8232`，新增数据库维护者的 `admin:operator plan / apply`：先只读生成可复核计划，再匹配摘要执行角色授权。支持 development / staging / production 显式环境，本次只在自有一次性本地 PostgreSQL 中以 production 模式验收，没有实际远程初始化、邮箱送达、云部署或主账号提权。I0—I16 及全部外部门槛保持，不因维护命令完成而标记完整模板交付。

命令只读取指定私有配置文件，不继承 shell 的 DATABASE\_URL、环境或服务凭据；显式环境和站点必须与文件完全一致。development 只接受 loopback；远程连接要求 TLS、非 pooler origin。检查数据库 owner 权限及 checkout 的全部增量 SQL 摘要 / 时间 / 条数，不执行迁移；配置、权限、历史或输入不符即拒绝。计划文件以 0600 创建，拒绝覆盖 / 符号链接；打印可复核数据库身份、环境、站点、精确账号、操作者、原因、UUID、状态 / 数据库指纹及 30 分钟有效期，不输出连接 URL、密码或服务密钥。

初始化只接受既有已验证、非匿名、未封禁且角色已知的账号；不会选注册第一人、创建人员、补验证、解封、改密码或提升团队所有者。站点已有任何管理员角色或初始化 / 恢复历史时 initialize 拒绝，即使账号后来删除。恢复要求有历史管理，但当前没有任何已验证、非匿名、未封禁的 admin；仍有有效管理员的“忘记密码”应走已有登录恢复或角色管理。恢复明确指定另一账号，不清理旧角色、封禁、会话或审计。

计划与执行使用站内授权的全局事务锁；实际目标与管理员行采用 NO KEY UPDATE，与已有账本外键锁兼容。执行在锁等待后复查摘要、环境 / 站点 / 数据库、有效期和实际授权状态指纹；发生变化必须重新复核，不允许 apply 替换指令。通过 Better Auth 实际适配器写角色并原子保存 user.initialize\_admin / user.recover\_admin；审计失败全部回滚。外部执行者记作 operator:<维护者标识>，保存环境、站点、数据库指纹与真实前后角色，页面展示维护者 / 环境 / 站点；不冒充站内会话身份。维护者名称是其自报标识，实际人员身份仍需凭据管理和外部维护记录核查；审批 SHA256 也不是签名或抗数据库 owner 篡改保证。

UUID 按维护者命名空间去重；同内容重放只返回已处理，不恢复后来的降权、封禁或删除。不同动作 / 目标 / 原因 / 环境复用拒绝。响应丢失可在有效期内沿用原计划手动重试；过期可用同原始指令和 UUID 重新生成计划核对，新的恢复使用新 UUID。旧开发 bootstrap 不能绕过新的维护历史。没有公开 HTTP / 自动启动 / 默认管理员入口，也没有新增环境白名单、依赖或 SQL 迁移；已有 0012 保持不改写。

| 证据 | 实际口径 |
| --- | --- |
| 服务 / PGlite | 新增 6 项：计划不写入、明确选择与实际适配器 / 外部审计、降权 / 删除后旧重放不恢复；已初始化 / 删除历史与有效管理员恢复门禁；不存在 / 未验证 / 匿名 / 封禁 / 未知角色 / 注入字段拒绝；摘要 / 环境 / 站点 / 数据库 / 有效期 / 状态变化拒绝；真实审计触发器回滚角色并同计划恢复；跨指令 UUID 冲突及旧 bootstrap 历史边界 |
| 配置 | 新增 2 项：显式文件缺数据库不能继承 shell、指纹不含凭据且轮换密码不改变身份、不同数据库改变指纹；环境 / 站点、remote development、pooler / 缺 TLS 在连接前拒绝。配置测试没有实际远程连接 |
| 实际命令 / PostgreSQL | `admin:validate-operator` 在一次性数据库调用真正 CLI，传入错误 shell 数据库仍使用显式 production 文件；只读计划 / 0600、审批 / 环境 / 数据库 / 迁移记录 / 非 owner 门禁通过。8 并发原计划均成功但一次实际授权 / 审计；删除原管理员后两个恢复候选竞争只提交一个。真实审计 SQL 故障回滚角色，修复后原计划继续；实际适配器读到新角色、后续降权旧重放保持 user |
| 实际 Worker / 浏览器 | 独立 adminoperator.localhost:20310，实际注册和 fixture 邮箱验证后，普通会话的 access.allowed=false / 审计 403；实际 CLI recovery 提权后同 Cookie allowed=true / 审计 200。浏览器正常密码登录进入真实管理页，看到 user.recover\_admin、外部维护者、production / 指定站点与历史初始化审计。fixture 中的生产站点字符串不代表该域名部署或远程执行；隔离代理保持原 gzip 响应避免重复解压 |
| 页面 / 响应式 | 新增 1 项外部维护审计呈现，原页面流程保留；1280 桌面实际审计截图，320 浅 / 深主题 document 320、main 305，无横向溢出；保存截图并恢复视口 |
| 回归 | 57 个文件、534 项测试通过；最后配置 / 命令调整后针对服务 / 配置 / 管理页面的 14 项再次通过。类型、Oxlint、Oxfmt、迁移一致性、离线配置与预览 / API / 中文教程构建通过；db:generate 确认没有结构变化。原 admin:validate 再验账号 / 财务审计、真实并发账本、最近登录 / 降权 / 最后管理员，无外部供应商请求 |

所有一次性数据库、临时数据库角色、Worker、私有配置 / 计划目录实际销毁。主预览重建 / 重启，六项服务 200；原账号仍已验证、未封禁普通用户，20 积分、四文件、成功免费任务与一次尝试保留。中文维护教程覆盖精确配置、首次初始化、真实有效管理员判断、恢复、失败重试与证据边界。

**下一阶段：** 可选用户 API Key 的插件契约、一次性展示 / 命名 / 有效期 / 撤销、文件 / 任务实际作用域与封禁 / 限流门禁。正式数据库维护、真实支付 / 模型 / 邮件 / OAuth / 通行密钥及 I10—I16 继续按完整计划推进。

## 2026-10-10：I10 · 个人用户密钥、版本接口与原账本

**状态：I10 本地验收通过，默认关闭。** 接续 `44d17d8f`，接入匹配 Better Auth 1.7.4 的独立 API Key 插件、个人设置卡片与 `/api/v1`。完整 I0—I16 目标继续，真实云端 / 第三方调用、既有支付 / AI / 邮件 / OAuth / 通行密钥等外部门槛仍未完成。新增[中文教程](./api-keys)，官网与产品的配置 / 内容仍分开。

签发、验证、改名与撤销使用真实插件及原数据库适配器，没有另造可恢复密钥存储。明文仅创建成功时返回，在组件内存中一次性展示；不进入 QueryClient 查询 / 变更缓存、本地存储、管理列表或邮件。完整密钥哈希保存在 `apikey`；Worker 请求日志额外遮蔽误放在 URL 中的 `abk_` 明文，私有插件关闭错误日志，外层仅打印错误类别。不能据此宣称浏览器开发工具或已复制凭据被擦除。

密钥管理只接受实际已验证、非匿名、未封禁账号；变更需同源且实际存在、未过期、创建不足 24 小时的会话。每账号每分钟 30 次管理请求；关闭时返回 404。只开放列表、创建、改名和软撤销，插件其他 HTTP 管理路径关闭；没有权限增补、续期、重新启用或 API Key 模拟会话。创建复核冻结请求 UUID，服务端按所有者先锁账号，实际插件写入与签发记录同事务；失败全部回滚。同 UUID / 参数只签发一次，重放返回 ID 与空明文；改参数重用拒绝。插件清理过期密钥后，独立签发记录继续阻止旧请求重新签发。

外部接口只使用 Bearer，开放个人 files:read / write 和 tasks:read / write；身份来自 Key，不接受客户端所有者或团队选项。每次从新鲜连接检查所有者、封禁 / 验证 / 匿名、过期 / 撤销及真实插件权限；先锁所有者再锁密钥，与签发 / 撤销 / 删除顺序一致。密钥插件限制叠加原每账号文件 / 任务额度、配额和余额；多把 Key 不能扩大业务限额。原有 Turnstile 开启后上传 / 提交 / 重试仍需实际验证。

文件返回原所有权检查后的元数据与真实私有 R2 字节，上传继续检查二进制、类型 / 大小 / 配额，删除保留原任务输入保护。上传尚无请求 UUID 去重，响应丢失先查询列表，不能宣称所有写请求均自动幂等。任务提交使用原 requestKey、输入摘要、报价确认、单笔事务预扣、执行 / 结果 / 取消返还；API 与浏览器同账号重放共用任务 / 账本。单条任务返回 revision，外部重试必须带 If-Match，在原任务锁内比较派发版本；响应丢失后旧重试不能在下一次失败时再授权一次尝试。重试保留原尝试预算和扣费，派发在提交后进行；不把 201 或取消请求当作执行 / 退款完成。

新增迁移 `0013_big_thunderbolts.sql` 只创建密钥与签发记录表、索引和账号外键，全部 0000—0012 SQL / 快照保留。主数据库未应用 0013；主预览保持默认关闭，原有账号与功能不读取新表。当前 checkout 的维护命令仍要求目标数据库完整迁移历史，不能绕过缺失 0013 初始化管理员。没有新增服务凭据、共享迁移、云资源或真实外发。

| 证据 | 实际口径 |
| --- | --- |
| 服务 / PGlite | 新增 6 项：真实插件哈希 / 一次签发、权限 / 过期 / 撤销 / 封禁 / 验证 / 匿名、关闭 / 未开放端点 / 非会话、严格输入 / UUID 冲突 / 容量 / 实际近期登录、SQL 签发触发器故障原子回滚和过期清理后 UUID 保留、真实插件限流 / 所有权 / Origin |
| 路由 / PGlite | 新增 6 项：缺少 Bearer、跨账号文件 / 任务拒绝、实际上传与多个密钥共享账户限额、三积分报价 / API 与浏览器重放一任务 / 一预扣 / 取消返还一次、管理及身份接口不获授权、Turnstile 缺配置不上传 / 扣费、封禁 / 撤销 / 关闭、原任务版本重试及旧请求不重复执行。自己的文件内容下载使用原生 Worker 证据，避免把 Miniflare 与 Bun 跨运行时流当作生产故障 |
| 页面 | 新增 5 项：先复核、明文一次性展示并未缓存、响应不确定同 UUID 手动恢复且无自动重试、确认撤销并刷新实际元数据、近期登录退出失败保留会话、关闭时无卡片 / 请求 |
| 原生 Worker / PostgreSQL | 真实生产入口、独立完整迁移、真实 Queue / R2：8 并发创建只有一个 ID / 一把明文 / 一条签发记录；文件原字节下载、实际消费者的标准化结果、三积分报价 / 一预扣 / API 与浏览器重放、取消返还一次、版本重试 / 旧请求 409、四并发密钥限额恰好二个成功 / 二个 429、错误作用域 / 过期 / 封禁 / 撤销；URL 误带密钥实际日志已遮蔽，日志扫描无完整明文。按独立限流场景仅重置一次性密钥计数 |
| 浏览器 | 隔离 `apikey.localhost:21310` 登录实际测试账号，取消复核不写入，创建后关闭明文，确认撤销，列表实际显示 Revoked；脚本核对该 Browser acceptance 密钥已持久化为关闭。主账号 / 权限不改动 |
| 响应式 | 320 浅 / 深主题 document scrollWidth 320、main 305；关闭手机侧栏后列表可读，保存浅 / 深截图与 1280 桌面撤销结果，临时视口已恢复 |
| 回归 | 全量 60 个文件、551 项测试通过；最后语义标签 / 过期呈现修改后对应 17 项再次通过，类型 / lint / 格式 / 迁移一致性 / 无新增结构 / 离线配置检查通过。真实管理员维护命令在完整 0013 数据库回归；八独立 PostgreSQL 会话的收费竞争、退款去重和账本守恒回归通过 |

验收数据库、Worker、前端构建及独立资源实际销毁。浏览器暂停首次结束时发现未发送邮件就没有收件箱文件，修复验收夹具的空收件箱初始化后，原生全链路重新通过并完成清理；没有把测试收件箱当作真实发信证据。主预览与中文文档已重建 / 重启，六项服务返回 200；原账号已验证、未封禁且角色仍为普通用户，20 积分、4 文件、成功免费任务和一次尝试保持。浏览器刷新主设置页仍为 Local Preview，密钥卡片保持关闭。

**下一阶段：** I11 真实事件、候补名单与主动营销订阅，区分账号、同意、确认和退订；继续保留全部 I0—I16 与既有外部验收要求。整体目标保持进行中。

## 2026-10-10：I11 第一阶段 · 明确同意、邮件确认与退订

邮件订阅和候补名单新增独立公开入口，默认关闭。两个用途共用本站状态服务，但同一邮箱分别记录同意文案 / 版本 / 时间 / 来源。匿名申请不要求登录，不创建账号，也不把已有注册当作营销同意。公开成功响应仅表示申请已收到，已有地址、已确认地址和发信失败使用相同响应。

确认 / 退订链接绑定站点、名单、操作、代次和有效期，签名不含邮箱并放在 URL 片段。页面只读取状态，必须主动按按钮才修改；确认和退订幂等，退订后旧确认不可恢复。待确认或退订后重新申请需经过冷却并重新确认。旧的有效退订链接仍可撤回重发后的该名单。偏好页面禁止索引和来源传递，不加载统计脚本，不把链接写入持久化浏览器缓存；操作成功后清除当前地址栏片段，不宣称清除全部浏览器历史。

发送通过已有 React Email / Resend 单一入口。数据库原子领取租约，在事务外发信，按原代次和租约回写；失败保留通用错误码和同一个供应商幂等 key，15 分钟后由现有定时入口尝试，总计最多三次，且限于确认有效期。发送接口接受请求不代表真正送达，也不代表订阅已确认。关闭名单停止新申请 / 确认 / 发信，历史退订保留；营销维护故障不会阻断文件清理和任务恢复。共享 Turnstile 组件从工作台抽到设计包，两个真实用途共用生命周期，工作台仍由自己的主题状态提供外观。

| 证据 | 实际口径 |
| --- | --- |
| 服务 / 数据库 | 新增 14 项：明确同意和严格输入；记录与账号隔离；重复 / 已确认 / 失败统一响应；名单隔离；只读打开与主动操作；错误目的 / 签名 / 站点 / 过期 / 代次；退订后的新同意；关闭与历史退订；并发发送领取；有限重试 / 过期；传输中退订后的回写；摘要限流、窗口与清理；无效链接在新增表查询前拒绝；请求体与跨源门禁 |
| 页面 | 新增 6 项：未勾选不提交、明确发送；失败不假报订阅成功且不自动重试；打开仅检查、按钮确认后清除片段；退订失败可手动再试；无链接不请求 / 已撤回不能确认；同标签页新链接重置已完成状态 |
| 现有邮件 SDK | 新增 2 项：通过当前安装的 Resend SDK 向受控 HTTP 响应传递幂等 header 和纯文本 / HTML；供应商拒绝不假报接受。没有真正联系 Resend |
| 实际 Worker / PostgreSQL | 独立数据库完整迁移，8 并发申请一条记录 / 一封捕获邮件，8 并发确认幂等；确认与再次申请竞争不降级；两名单隔离、退订后旧确认拒绝；失败发信及两次定时调用只补一次已接受记录；发生人为营销维护故障的定时调用仍先完成文件清理与任务恢复；URL 中误放的能力链接被日志脱敏 |
| 浏览器 | 最终构建在 1280 × 920 和 320 × 860 下检查；黑白主题、未勾选禁用、实际申请 / 确认 / 退订、同标签页链接切换、跳过导航不覆盖片段通过。手机实际内容宽度 305，与滚动宽度相同，没有横向溢出 |
| 完整回归 | 62 文件、573 项测试通过；类型与 lint 通过。受控供应商测试、本地邮件捕获不替代真实投递验收 |
| 中断恢复 | 上一轮中断留下的独立数据库经实际只读核查，浏览器记录已退订、账号 / 账本均为空，再清理其资源；最终验证器正常完成并自行清理。本任务主数据库不参与此类验证 |

0014 只创建营销状态和短期摘要限流表，既有迁移不重写。主库仍为 0012，0013、0014 尚未应用；邮件订阅 / 候补入口与用户密钥保持关闭，主账号没有被授权为管理员。

此阶段提供确认邮件和本站状态，**尚未实现 Resend 联系人 / 主题同步、供应商退订回调、营销广播和工具 / 收入转化事件**。也没有真实外发、云部署或远程迁移。I11 与完整 I0—I16 目标继续推进，维护说明见[邮件订阅与候补名单](./marketing-subscriptions)。

## 2026-10-10：I11 第二阶段 · 联系人同步与签名退订回调

代码 revision：`b4395ad3`，基线 `e094a6b2`。第一阶段确认 / 退订流程继续保留；本阶段增加可独立关闭的 `marketing.contactsSync`，复用 Resend 邮件密钥，新增独立营销回调 secret 与两个不同主题 UUID。默认关闭，启用时配置组必须完整；远端两个主题默认值必须为 `opt_out`。产品不新增假报供应商成功的提示。

确认、撤回和待同步版本在同一事务提交，两个名单按同一邮箱串行。联系人 HTTP 在事务外运行，60 秒租约保护同步回写，每轮最多三个联系人。失败有有限频率的后台重试，成功后每日复核；原有文件 / 任务维护先执行，可选营销故障分别隔离。创建联系人时先默认退订两个主题，再应用明确确认的用途；未知创建响应先查询现有联系人，不直接重复创建。

全局退订与联系人删除保留持续阻止状态，本站的新确认和供应商加入通知不能自动解除；确认邮件领取也遵守该阻止。单主题退订只影响对应名单。回调先用实际 Resend SDK 在原始正文上验签，再访问营销表；事件 ID 去重，既不保存原始负载 / 签名，也不以供应商加入通知替代本站同意。初始化退订回声通过供应商当前主题状态复核，首次同步未完成时可重投；迟到通知不能覆盖较新的明确确认。

0015 新增同步记录与回调去重表。0016 新增每个用途已成功同步的确认代次，并只为已完成版本回填；避免以两次本地时间的大小判断新同意，另一个名单变化也不覆盖原名单的供应商退订。0014 和既有迁移不重写，两项新迁移仅应用独立测试数据库。

| 证据 | 实际口径 |
| --- | --- |
| 新增行为测试 | 17 项联系人 / 回调流程：未确认不创建、两个主题隔离、8 并发领取、未知创建响应恢复、旧同步回写保护、配置错误、签名 / 大小 / 关闭门禁、全局阻止、真实主题退订与初始化回声、加入通知不激活 / 不循环、每日复核、旧通知、开发环境阻断外部请求、旧记录接续与关闭申请页后的退订、首次回调重投、租约过期、时钟差异 / 双名单交互和实际增量回填 SQL |
| 供应商契约 | 2 项受控 HTTP 测试与已安装 Resend SDK 对比 Contacts / Topics 的方法、路径、负载及授权；请求有中止信号，错误不泄露响应正文；没有真实网络请求 |
| 配置 | 新增 1 项：完整变量组、不同主题、启用时缺字段拒绝；默认关闭仍可启动 |
| 实际 Worker / PostgreSQL | `validate-marketing.ts --contacts` 通过：8 个并发定时入口只创建一个联系人；两个主题加入 / 退出；写入失败保留待同步并由后续定时恢复；实际 SDK 原始验签、主题退订、重放去重、全局阻止；没有账号创建或真实外发 |
| 原有流程回归 | 同一验证器保留 8 并发匿名申请、确认 / 再申请竞争、名单隔离、确认邮件恢复、营销故障隔离与日志能力链接脱敏；独立资源正常清理 |
| 完整回归 | 64 文件、593 项测试通过；最终迁移读取路径调整后 17 项联系人测试再次通过；类型、lint、格式、配置诊断、数据库元数据检查与生成一致性通过 |
| 本地预览 | 六项服务重建 / 重启并返回 200；主库仍为 0012，账号正常、20 积分、4 个文件和原成功任务保留；无遗留测试数据库 |

本轮没有真实 Resend 账户资源、实际邮箱投递、云部署或远程迁移。联系人处于受控本地验收状态，不能宣称供应商实际广播已经停止。生成站升级和真实外部环境仍按原计划验收，完整 I0—I16 目标保持进行中。下一阶段继续工具开始 / 成功、下载发起与购买确认事件的真实语义、隐私和去重，I11 尚未完成。

## 2026-10-10：I11 第三阶段 · 公开工具的浏览器使用事件

**状态：I11 继续进行。** 接续 `d238e6c0`，代码提交 `74145b06`。交付默认关闭、需独立明确选择的公开工具使用报告，包含实际处理尝试、返回成功和下载发起。来源始终为浏览器上报，不混入服务端任务、购买、独立用户或收入指标；浏览器点击下载也不宣称文件已经保存。

只在公开 `ToolWorkbench` 的处理器调用和下载操作后发出累计状态；页面浏览、示例、编辑、复制、保存账号及恢复输入不造事件。每次处理有内存中的随机 UUID，重复成功 / 下载和八个并发重放只收敛成一行，晚到请求不降级，不改写第一次状态接收时间。合法累计下载可补齐第一次报告丢失的状态；不同工具 / 同意版本复用同一 UUID、已有记录超过 24 小时更新均拒绝。

`analytics.toolEvents` 独立于原 Cloudflare 公共页 beacon、营销名单和账号，提供启用、同意版本及 1—90 天保留配置。同意初始未勾选，浏览器只保存版本化 yes / no；撤回中止在途请求并丢弃排队请求，跨标签页撤回同步，重新同意不回填旧结果。请求省略账号 Cookie 与来源页面 URL；只接受固定工具与小于等于 1 KiB 的严格字段，拒绝输入、结果、文件名、邮箱、任意 URL 和购买金额。每日轮换的 keyed IP 摘要仅用于独立每分钟限流，不与观测关联，也不称为完全没有元数据。

队列最多四个请求，每个最多等待四秒，无自动重试或待发数据持久化。报告失败、队列满或 UUID 生成不可用不阻塞工具，并显示简短提示。新增 `0017_striped_korath.sql` 仅创建观测 / 限流表，全部旧迁移保留。定时清理每批各最多 500 行；统计表故障在文件 / 任务维护之后隔离，默认关闭不读取新表。关闭模块也会停止自动清理，已收到的匿名事件无法按账号删除，教程如实说明保留、漏报、接收时间和去重窗口。

| 验收 | 结果 |
| --- | --- |
| 新增定向测试 | API / 真实迁移数据库 8 项 + 产品交互 10 项通过；覆盖关闭且表缺失、来源 / 同意 / 私有字段、并发与累计状态、限流、清理、旧同意、恢复输入、跨标签页撤回、队列上限及故障不阻塞 |
| 全套测试 | 66 个文件、611 项通过；未调用真实供应商 |
| 类型 / 静态检查 | 类型检查、lint、格式、离线配置诊断通过；再次生成数据库结构无新变化 |
| 原生本地环境 | 实际 workerd / PostgreSQL 接收八个并发重试只计一次；累计成功 / 下载、过期清理和统计表故障隔离通过；既有营销确认 / 退订 / 捕获邮件 / 失败恢复仍通过 |
| 浏览器 | 未同意的实际处理不落库；同意后处理成功 / 下载发起落在同一次观测；重复下载和撤回不增加处理次数；最终版本有说明链接，截图保存于本地验收证据目录 |
| 构建与预览 | 邮件 / 产品公开页 / 工作台 / 官方站预览构建、API 与中文教程构建通过；六项服务重启后 200，新增中文教程可访问 |
| 主数据保护 | 主库仍为 0012，两张观测表不存在；默认报告端点返回 404，工具正常可用；普通账号、20 积分、4 文件与原成功任务保留；一次性数据库及 Worker 已清理 |

本轮没有收入归因、统计管理面板、真实邮件投递、共享远程迁移或云部署。完整 I0—I16 目标保持进行中。下一阶段接服务端任务开始 / 成功 / 下载，以及购买确认与前端确认页的统一去重；购买只依据已有服务端结算事实，不能由浏览器自报。配置、口径和操作见[工具使用事件](./tool-usage-events)。

## 2026-10-10：I11 第四阶段 · 工作台真实事件与积分包确认

**状态：I11 继续进行。** 接续 `88268034`，代码提交 `ba8a0e5d`。新增默认关闭的 `analytics.serverEvents`，个人账号在 Settings 独立勾选并保存后才记录当前同意起点之后的事实；公开工具选择、注册与营销订阅不会授权此模块。选择带版本和 revision，旧标签页不能覆盖刚撤回的选择，重复相同选择不延长起点。失败提示未确认，重新读取可恢复实际状态，不自动重试写入。

实际首次任务租约提交后记录开始，当前结果发布提交后记录成功；入队、取消、失败和重试不增加同一任务的开始 / 成功数量。文件读取成功且进入显式下载路径才记录，普通预览不计，外部 API 附件响应计入；每个文件在保留记录期间只计一次，不证明完整传输或用户已保存。

积分包确认要求原购买已验证发放且匹配原积分账本。付款回调、后台补查与本人购买详情页共用资源 / 事件唯一键，未付款的结账页不能造收入。金额为原始最小货币单位，保留币种和测试 / 真实状态；退款后的净收入、订阅账单支付和归因不在此阶段。前端不提供自报购买金额的接口。

内部记录包含账号 / 资源 ID、固定类型、同意版本与时间，任务含处理器 ID，购买含金额 / 币种 / 测试状态；这是可关联账号的第一方记录，不称匿名，不发送至分析供应商，也不保存输入、结果、文件名、邮箱、URL 或支付原始负载。账号删除级联清理选择和事件，资源删除保留其历史事件至保留清理。

记录在业务提交后尝试，统计表故障不撤销真实任务、结算或附件响应。定时入口在已有维护之后每类最多补查 100 个缺失任务 / 购买事实，只处理当前有效同意区间和保留期内的已有业务记录。撤回、版本变更或重新同意前未落库的旧区间可能漏报，下载没有持久化基础事实不能补造。清理每轮最多 500 条，关闭模块也停止清理，期限不是准时删除保证。

0018 只新增最新选择与事件表、索引和账号外键，旧迁移保留。新表只应用 PGlite 和验证器自己创建的独立 PostgreSQL；主库继续保留 0012。验证器通过本地运行时的配置别名启用独立环境，不修改主配置；供应商 HTTP 受控、其他外部请求拒绝、邮件捕获。

| 验收 | 结果 |
| --- | --- |
| 服务端新增行为 | 8 项：关闭且表缺失仍完成任务；不回填同意前事实；实际领取 / 发布与重试去重；撤回 / 版本变化；并发选择版本保护和账号 / Origin 边界；文件所有权与八并发去重；统计故障不撤销任务、定时补齐；过期基础事实不反复创建与账号级联删除 |
| 支付行为 | 现有支付测试新增 1 项：已安装 SDK 签名回调，统计故障仍发放，恢复后一条确认；重复 / 同源另一事件与详情页读取仍为一条记录 / 一次积分发放，待付状态不记录 |
| 工作台页面 | 新增 3 项：勾选不自动提交、显式保存 / 撤回、失败不假报确认且重新加载可恢复未保存状态、默认关闭不请求；最终恢复交互调整后这 3 项再次通过 |
| 全套回归 | 68 个文件、623 项通过；类型、lint、格式与离线配置诊断通过；迁移元数据检查通过，再次生成没有结构变化 |
| 原生 Worker / PostgreSQL | 真实 Queue / R2 执行与结果发布、普通预览不造下载、八并发实际附件请求一条事件；人为观测表故障后任务仍成功，恢复后真实定时入口补齐；实际 SDK 签名付款回调、详情刷新和撤回通过。两个任务四条事件、一个文件下载事件、一个积分包确认，共六条；原钱包只发放一次 |
| 浏览器 | 独立测试账号实际登录，在 Settings 保存同意再保存撤回；验证器复核最终 allowed=false、revision=4，页面浏览没有新增事件。保存桌面与手机证据，320 像素下 document scrollWidth=320、main=305，临时视口已恢复 |
| 构建与主预览 | 邮件 / 产品公开页 / 工作台 / 官方站预览构建、API 与中文教程构建通过；六项服务重启后 200，中文新教程实际可访问；浏览器原任务仍 Completed、20 积分，主设置无新增统计卡片 |
| 主数据与清理 | 主库 13 条迁移、普通已验证账号、20 积分、4 文件、原成功任务与一次尝试保留；两张服务端新表和浏览器观测表均不存在；独立数据库 / Worker / Queue / R2 / 前端资源已销毁，无遗留验证数据库 |

本阶段没有真实供应商交易、真实邮件投递、远程迁移或云部署。配置、隐私、故障口径和验证方法见[工作台使用与购买事件](./server-activity-events)。下一阶段继续订阅账单真实支付事件与 I11 外部验收；完整 I0—I16 目标保持进行中。

## 2026-10-11：I11 第五阶段 · 个人订阅账单付款与漏回调恢复

**状态：I11 与完整 I0—I16 目标继续进行。** 接续 `81566d08`，代码提交 `e2f7f7eb`。已有订阅状态管理保持由原插件维护；本轮在同一原始正文验签边界增加 `invoice.paid` 的可选观测。签名成功只提供核查线索，不直接信任回调中的金额，也不把订阅激活 / 试用当作购买。

服务端复查当前已付账单、正数金额、币种、模式、余额与付款时间，再分页核查完整已付分配记录、实际成功 PaymentIntent 或已捕获 Charge。账号、订阅和客户必须相符，记录仍需当前有效个人同意。同一付款来源的分配合计不能超过其收款，分配总额须等于账单实际付款额；零元、余额抵扣和线下 PaymentRecord 不造新收款。团队账单不归到某个成员个人账号，团队付款观测仍保留为后续范围。

唯一键为供应商账单 ID 加固定类型 `subscription_payment_confirmed`，同一订阅的另一张续费账单可新增一条。回调与后台恢复共用唯一键；前端确认 / 状态页只读原订阅状态，不扫描供应商历史、不发送购买上报，刷新不增加事件。记录只含账号 / 账单 ID、类型、同意版本、实际付款时间、最小货币单位金额、币种和测试 / 真实状态；不保留发票正文、邮箱、描述、付款密钥或原回调。这是原始付款确认，不代表退款后的净收入、MRR 或留存。

漏回调恢复复用现有定时入口，每轮最多三个个人账号、每账号两次尝试至少相隔 15 分钟、每次最多读取 1,000 张已付账单和每张最多 100 个付款分配。按实际 paid\_at 与当前同意起点 / 保留期筛选，创建很早但近期付款的账单仍可恢复。失败也会让出后续账号的检查位置；分页重复、超限和部分数据不假报完整恢复。已有部分真实记录保留并去重。

恢复检查原子领取统计自己的检查时间，不占用用户的账单操作租约，也没有完成后回写旧检查时间的路径。供应商历史请求暂停时，真实账单管理仍可领取自己的操作租约；普通工作台读取不等待统计供应商。过程中撤回或版本变化，写入再次检查最新选择。有效签名在可选观测故障时仍应答成功，后续定时恢复补查，不撤销已付款或订阅权益。

新增用途同步更新工作台文案与隐私草稿，默认同意版本升级为 `2026-10-10.2`，旧同意不会自动涵盖个人订阅付款。0019 只给活动选择新增 `invoice_checked_at` 和索引，已应用的旧迁移不改写；当前启用前需完整升级至 0019 并重建 API / 工作台。主库仍为 0012，默认统计关闭。

| 验收 | 结果 |
| --- | --- |
| 新增行为测试 | 11 项真实迁移数据库 / SDK 路由测试：八并发与重复事件；关闭 / 缺表、原始验签；零元 / 待付 / 抵扣 / 线下记录；当前资源所有权、币种 / 模式 / 实际收款；重复分配与不完整分页；旧式 Charge 与续费；传输中撤回 / 同意前事实 / 团队隔离；很早创建的迟付恢复；统计故障与间隔；失败账号轮换；暂停扫描不占用用户账单操作租约 |
| 读取边界 | 1 项工作台账单路由测试：已开启统计、已有同意及订阅时，普通状态读取不访问供应商，也不生成付款记录 |
| 回归 | 最终 69 文件、635 项通过；类型、lint、格式、离线配置诊断通过；迁移检查和重新生成无结构差异 |
| 原生 Worker / PostgreSQL | 扩展已有验证器 `--invoices`，实际 SDK 签名、零元排除、八并发回调、真实前端所用状态读取、两页付款分配、观测表故障后成功应答及真实定时续费恢复通过；最后版本再次完整运行并清理。两个任务四条、文件下载一条、积分包一条、两张已付订阅账单两条，共八条；订阅仍 trialing、钱包 120，没有借统计改写权益或加积分 |
| 浏览器 | 独立真实账号登录，在更新后的卡片保存同意再保存撤回，验证器核对 allowed=false / revision=4，事件仍八条。保存桌面 / 手机截图，320 像素文档宽度 320、main 305；临时视口恢复、验收页关闭 |
| 构建与主预览 | 邮件 / 产品 / 工作台 / 官网预览、API 和中文教程构建通过；六项服务重启后 200，中文服务端事件教程可访问。浏览器主任务仍 Completed / 一次尝试、20 积分 |
| 主数据与清理 | 主库仍 13 条迁移至 0012、已验证普通账号、20 积分、4 文件与原任务保留；新增观测表不存在；本轮独立 PostgreSQL、Worker、Queue、R2 与前端资源实际销毁 |

本轮没有真实 Stripe 交易、真实邮件投递、共享 / 远程迁移或云部署。维护教程见[工作台使用与购买事件](./server-activity-events)。I11 的团队付款观测与外部验收继续保留；下一阶段按完整计划推进 I12 用户任务通知与站主运营通知，不把这些本地证据当作完整模板已交付。

## 2026-10-11：I12 任务完成与失败邮件

**状态：I12 进行中，第一阶段任务邮件已本地验收。** 接续 `3bca663a`，功能提交 `3e380133`。新增默认关闭的任务邮件配置、已验证账号选择、任务终态投递表、定时补偿与本人投递列表。站主运营 Webhook、支付事件通知及真实外部发信仍按完整计划推进，不将本阶段标为整个 I12 完成。

复用原任务队列、终态、每 15 分钟维护及 `sendEmail` SDK 边界，不创建第二个通知任务引擎。最多扫描 20 个未记录终态，任务 ID / 执行租约版本 / 结果的数据库唯一约束去重；取消、中间重试、选择前结果和过期结果不入队。发送前重新检查最新选择、已验证邮箱、封禁、执行版本和配置。邮箱与接收配置以认证密钥派生摘要绑定，客户端不能提供接收人、所有者或外发 URL。

选择带版本与 revision，旧标签页不能覆盖较新的撤回。重复有效选择不延长起点；更换邮箱需要新选择，旧通知不改投，再次启用不补发旧结果。已经开始外发的请求不能因撤回而收回。状态与失败代码可在本人设置页查看，不存供应商原始错误、邮箱或邮件正文；查询和变更限额返回明确限频响应。

发送最多三次，每次两分钟租约，十秒请求超时，固定幂等键及相同 HTML / 纯文本内容。仅在首次尝试后 23 小时内重试，超过范围或次数保留接收未确认状态；迟到响应不能覆盖新租约。有效供应商回执才记为接收成功，不把捕获回执或供应商接收视为收件箱送达。邮件只给出任务 ID、状态和本站登录后的任务详情 / 设置链接，不能绕过原文件所有权或延长结果保留期。

新增增量迁移 0020，两张表已在 PGlite 和独立 loopback PostgreSQL 验收；应用后的旧迁移未修改。投递按事件时间进入清理资格，每轮最多删 100 条，列表隐藏超过保留期的记录，旧结果不能在清理后重新入队。账号删除级联清除选择与投递，任务删除清除其投递；财务和管理审计的既有规则保持独立。

| 证据 | 实际范围 |
| --- | --- |
| 新增行为测试 | 37 项：关闭且缺表、验证邮箱、版本 / revision 冲突、重放 / 并发、终态与时间范围、撤回 / 重开、邮箱 / 封禁 / 密钥 / 配置变化、任务重试替换、有限重试与相同内容、23 小时边界、过期租约、迟到回执、所有权 / Origin / 接收人拒绝、扫描公平性、保留 / 级联、实际处理器结果、SDK 超时信号 / 幂等请求、无有效回执、限频，以及前端保存 / 恢复 / 账号切换 |
| 全量测试 | 71 个文件、672 项通过 |
| 原生本地验收 | 实际 Worker / Queue / R2 产出成功与失败任务；定时处理捕获两个最小邮件，三轮重放不增加；真实捕获文件故障不撤回任务成功，恢复后同键第二次尝试接收；撤回 / 再开不补发第四个结果，原结果仍可私有下载；临时数据库与全部资源成功清理 |
| 浏览器 | 独立专用工作台已显示成功 / 失败及重试后的投递记录，实际撤回保存至 revision 4；桌面与 320 像素浅 / 深主题检查，本地截图 `task-notifications-light.jpg` / `task-notifications-dark.jpg` / `task-notifications-mobile-light.jpg` / `task-notifications-mobile-dark.jpg`；浏览器操作未新增邮件 |
| 检查与构建 | 类型、lint、格式、配置诊断、迁移一致性、完整预览构建、API / 邮件 / 中文文档构建通过；公共页与官网 Astro 检查均零错误 / 警告 / 提示 |
| 正常预览 | 六个本地服务重启后均 200；主库仍 0012 / 13 条迁移，两张通知表不存在，任务邮件、统计及其他可选模块保持关闭；普通账号仍 20 积分、4 个文件、原任务成功且一次执行，没有残留通知验收数据库 |

本轮只捕获合成邮件和受控 SDK HTTP，没有真实供应商发信、支付、模型调用、远程迁移或云部署。[中文任务通知教程](./task-notifications)、配置、环境、隐私草稿和模块状态已同步。主库新增迁移与可选功能启用仍需相应授权，不将临时库证据当作正常预览已经开通邮件。

下一阶段继续 I12 站主运营渠道、任务 / 支付事实的独立通知及失败查看，接收目标仅由服务端配置；I11 团队付款观测与外部验收、I13—I16 的既有范围继续保留。

## 2026-10-11：I12 站主运营频道与付款通知

**状态：I12 第二阶段已本地验收，完整 I0—I16 目标继续进行。** 接续 `ff8f0ff5`，功能提交 `a10794b6`。新增默认关闭的 Discord 站主渠道、明确事件起点、任务 / 积分包 / 订阅账单投递、有限尝试和管理员只读列表。真实频道、真实邮箱、云端绑定与维护仍保留外部验收，不将捕获回执当成真实送达。

站主消息与个人任务邮件分别配置，不借用营销、任务邮件或活动统计的个人选择。目标仅来自服务端秘密变量，限定标准 Discord 地址，禁用自动提及，不跟随跳转。消息仅含固定类型、资源编号、付款最小货币单位 / 币种 / 模式和管理员入口；没有姓名、邮箱、团队名、输入、输出、文件名、附件、秘密地址或供应商原始错误。目标、起点、环境、认证密钥与 Origin 绑定为摘要，配置变化后旧请求跳过，不改投新频道。

任务从真实已提交终态扫描；积分包必须同时存在原已付购买和对应实际发放流水。订阅账单从原始正文 SDK 验签入口重新核查当前账单、本站客户 / 订阅、实际成功收款及完整分配，个人与团队都可形成运营消息；团队付款不归到成员个人统计。将已有付款核对提取为共享逻辑，统计与运营分别保留授权、启用和时间边界，没有新建一份订阅状态或发放路径。

定时恢复复用原维护入口：每轮最多 20 个任务、20 个积分购买，投递最多 10 条。订阅客户另有原子检查时间，每轮最多三个有效客户，至少间隔 15 分钟，失败仍参与轮换；最多 1,000 张历史账单 / 每张 100 个付款分配，按实际付款时间筛选，早创建晚付款仍可恢复。检查不占用账单操作租约或个人统计检查时间。回调遇到可选通知存储故障仍确认支付，后续恢复使用同一事件键。

发送租约两分钟、请求十秒超时、最多三次。只有明确限频才自动重试，等待至少 15 分钟并尊重供应商更长要求；超过一天的要求停止，不提前截短重试。没有请求幂等键时，断网、超时、服务错误、无有效消息编号和过期租约保存接收未确认并停止，迟到回执不能覆盖；页面没有强制重发入口。管理员列表每页 20 条并检查最新角色 / 验证 / 封禁，撤权后的旧会话被拒绝，读取限频返回明确响应。

0021 新增最小事件投递与客户轮换检查表；未改写 0000—0020 SQL 或快照。投递按事件时间、检查记录按最后检查时间分别清理，每轮最多 100 条，列表隐藏范围外事件；关闭与积压可能延迟物理删除。这些运营记录不存个人账号编号，按自身保留期清理，不替代财务或管理员审计。主库没有应用 0020 / 0021，两个通知模块默认关闭。

| 证据 | 实际范围 |
| --- | --- |
| 新增行为测试 | 34 项实际迁移数据库 / SDK 受控请求：关闭且缺表、明确起点 / 目标、任务与已发放购买、时间 / 终态范围、重复 / 并发、地址与配置变化、执行版本替换、限频等待 / 停止、断网 / 服务错误 / 无回执 / 跳转、租约过期与迟到回写、并发发送、开发捕获及非开发绑定边界、管理员撤权 / 限频 / 严格输入、清理、个人 / 团队账单、零元排除、晚付恢复、模式不符、扫描故障与过期检查清理 |
| 工作台测试 | 新增 5 项：默认关闭不请求、金额单位 / 测试模式及不确定状态、失败读取刷新恢复、翻页与管理员切换不留旧数据、回执与限频状态；既有实际运行器测试扩展站主捕获、超时信号与无重定向 |
| 全套回归 | 73 个文件、711 项通过；类型、lint、格式、离线配置诊断、迁移元数据检查通过，重新生成没有结构变化 |
| 原生站主验收 | 独立 PostgreSQL、实际 Worker / Queue / R2；两个终态、已提交积分包、两张付款账单共五条捕获，重放与八并发签名账单不增加；零元排除，两页真实 SDK 付款分配受控核查；通知表故障仍应答支付，定时恢复早创建晚付款续费；第六条捕获故障保留未确认一次且不重发，原成功文件仍私有下载；撤回临时管理员后旧 Cookie 读取为 403 |
| 付款统计原生回归 | 原有 `validate-server-activity.ts --invoices` 再次通过实际任务 / 下载 / 积分包 / 账单签名、分页、观测故障和定时恢复；仍八条统计，订阅 trialing、钱包 120，独立临时资源删除 |
| 浏览器 | 独立合成管理员登录、刷新与直接页面重载，状态和最小货币单位可见，读页面未增加消息；桌面与 320 像素浅 / 深主题，文档和主内容宽度均 320，无横向溢出；保存 `operator-notifications-light.jpg` / `operator-notifications-dark.jpg` / 手机两主题截图，临时视口恢复、验收页关闭 |
| 原生兼容修复 | 实际 workerd 拒绝 `redirect:error`，改为手动响应检查，继续禁止跟随跳转；原生运行器测试覆盖该路径，最终独立 Worker 验收通过 |
| 构建 | 邮件 / 产品公开页 / 工作台 / 官网预览、API 与中文教程构建通过；两个 Astro 检查均零错误 / 警告 / 提示。构建保留既有空案例集合与体积提示，未把空集合称为已上线独立案例 |
| 正常预览与清理 | 六项服务均运行且 200；主库仍 0012 / 13 条迁移、已验证普通账号、20 积分、4 文件与原成功任务 / 一次执行；新增个人和站主通知表均不存在，所有本轮临时数据库 / Worker / Queue / R2 / 专用工作台已删除。浏览器原任务仍显示完成和结果文件 |

[中文站主运营教程](./operator-notifications)、网站配置、环境变量、模块总览、路线和条件隐私草稿已同步。只使用受控 SDK HTTP 与本地捕获，没有真实 Discord / 邮件 / 支付 / 模型请求、远程迁移或云部署。I11 的团队活动统计与外部门槛保持；后续按完整计划继续 I13 多语言与品牌素材，并保留 I14—I16 和所有外部验收范围。

## 2026-10-11：I13 品牌素材与复制隔离

**状态：I13 第一阶段已本地验收，完整 I0—I16 目标继续进行。** 接续 `83850ab1`，功能提交 `fba4bd97`。本阶段统一产品品牌配置及实际消费者，尚未交付第二语言译文、语言路由和多语言 SEO；不把修改 HTML `lang` 算作多语言支持。

新增 `brand` 的短标记、浅深主题图片、浏览器图标、触屏图标和邮件图片。网页页头 / 页脚、工作台导航、登录表单、安装清单与六种实际邮件使用同一配置。公开页 OG 图片也纳入素材预检；所有素材限定在两个产品 public 目录的 `/brand/`，检查路径、文件存在和格式签名。安装清单由配置生成，保留现有主题切换、焦点和默认配色；官网继续读取独立品牌配置。

工厂按源码节点的实际范围更新身份配置，清空新复制目录的保留品牌目录，生成新站自己的 SVG 首字母图标，重置图片、OG、联系邮箱和社交链接；源站不修改。积分包目录仍清空，资源和 Cookie 隔离规则保持。实际新站验收暴露配置检查提前加载未构建邮件的问题，已把通知策略抽出到真实运行与离线检查共同使用的模块，让 `bun install` 后能先检查配置再构建。

邮件移除上游内联图标和不存在的通用退订地址。营销确认与任务通知保留各自的撤回 / 设置入口；可选邮件图片由当前产品 origin 生成绝对地址，默认使用文字品牌。任务邮件内容版本改为 `task-mail-v2`，品牌或邮件图片改变会使未投递记录以 `CONFIG_CHANGED` 停止；已有接受记录不会重发。本阶段没有新增迁移。

| 验证 | 结果与口径 |
| --- | --- |
| 全仓 Vitest | 74 文件、725 项通过；新覆盖非法素材路径、实际文件格式、派生清单、两次生成、六种邮件品牌及未发任务邮件内容变更 |
| 类型、静态诊断、格式 | TypeScript、Oxlint、Oxfmt、产品 Astro 与独立官网诊断、离线配置检查通过；产品 / 官网 / 邮件构建通过 |
| 实际任务邮件 Worker | `bun --cwd apps/api validate:notifications` 通过；真实本地 Worker、队列、R2、临时 PostgreSQL 和邮件捕获，退出与重新同意不回放旧结果，保留结果可私下下载 |
| 两个实际生成站 | Paper Studio 与 Quiet Workshop 分别安装依赖、检查配置、构建并启动独立 Worker / 网页 / App / 入口；使用各自一次性本地数据库和认证 secret；本轮工作区含未提交改动，未当作发布产品 |
| 品牌素材与邮件 | 第一站实际配置浅深 SVG、触屏 PNG、OG PNG 和邮件 PNG；两个清单一致、实际图标可读取、公开分享 origin 正确；两个站注册后分别发 OTP 并核对捕获 HTML / text 的当前品牌，未真实发信 |
| 浏览器 | 桌面 1366、手机 390 / 320 像素的公共页及登录页；浅深图片加载与切换正确，未横向溢出；登录链接键盘焦点可见、直接刷新可用；第二站没有旧站联系方式、社交链接或图片 |

截图保存在本任务 `.local/evidence/i13-brand-*` 与 `i13-generated-second-*`；生成、构建、配置与捕获断言日志在 `.local/i13-*`。全仓一次复跑曾出现 Miniflare 同步 R2 代理断言失败；单独复查相关文件与生成器共 21 项通过，停止临时站点后的完整复跑 725 项通过。没有据此修改产品清理逻辑，也未确认该异常的根因。

两个生成站的四个服务均已停止，一次性数据库、复制源码及私密本地配置已移除，仅保留本任务验收日志和截图。主预览恢复六个服务后核对：普通预览账号仍为普通角色、20 积分、4 个文件，原成功任务仍为一次尝试；主数据库仍为 0012 / 13 条迁移，可选营销 / 观测 / 邮件 / 运营模块保持关闭，没有将验收用 0021 结构应用到主数据库。

[中文品牌素材教程](./brand-assets)、网站配置、模块状态、能力清单与复制新站说明已同步。真实邮箱客户端显示、生产素材缓存与分享抓取仍需外部验收；素材预检不是完整图片解码或 SVG 安全审计。下一阶段继续共享语言配置、真实第二语言内容、Astro / 工作台路径、认证回跳、邮件语言、canonical / hreflang / sitemap；I11 团队观测、I14—I16 与全部外部门槛保持原范围。

## 2026-10-11：I13 公开页语言与静态发布

**状态：I13 第二阶段已本地验收，完整 I0—I16 目标继续进行。** 接续品牌记录 `77a95948`，功能提交 `a602bf31`。当前新增英文 / 西班牙语的首页、功能页和价格页三组公开页面；工具交互、博客全文、账号 / 工作台、认证回跳、任务及邮件语言仍待后续阶段，未标记整个 I13 完成。

语言列表及产品首页元数据、计划说明集中在 `websiteConfig.i18n`，默认仍为 `["en"]`。英文无前缀，西班牙语固定 `/es`；开启后需完整实际文案，配置诊断与 Astro 构建共用校验，重复语言、默认语言变化、空字段或错误列表均拒绝。正文和界面字典独立维护，两种语言共用三份页面组件；品牌、价格、团队人数、实际功能与工具目的地继续读取原配置。译文由 Codex 根据原英文内容生成，尚未经过母语编辑或产品负责人人工审校。

仅登记已交付的三类页面：静态西班牙语入口由该登记生成，语言菜单返回当前页的其他实际版本。未翻译目标保留真实英文路径，卡片与页脚标注英文，顶部使用提示及辅助标签；西班牙语页说明账号、工具和博客当前使用英文，文章摘录明确 `lang="en"`。没有 `/es/login`、`/es/tools`、空文章或 `/es/api` 回退，也没有改动会话 / 团队 / 授权规则。工作台与 API 路由继续保持原门禁。

已启用的成对页面具有各自 canonical、双向 `en` / `es` 与英文 `x-default`，sitemap 使用相同语言版本集合和实际 public origin。实际构建曾发现 Astro 的尾斜杠 canonical 与语言链接不一致，已统一正常公开路径；英文首页 `/` 与西班牙语首页 `/es/` 保留首页形式。缺译文、未发布和私有路径不生成语言替代链接，未创建四国重复页面或浏览器自动语言跳转。

| 验证 | 结果与口径 |
| --- | --- |
| 全仓 Vitest | 最终 76 个文件、737 项通过；新增 12 项覆盖启用 / 缺内容、配置与路由错误、发布版本集合、英文回退及实际功能 / 工具摘要；最终窄范围语言 / 生成器 / 边缘路由共 20 项通过 |
| 配置及静态检查 | TypeScript、Oxlint、Oxfmt、产品 Astro 检查通过；独立官网 Astro 检查通过；正常离线诊断通过，错误语言列表实际运行诊断仍返回字段错误，不中断错误报告 |
| 实际生成站 | Idioma Studio 从当前源码生成，安装依赖后先离线诊断，再分别构建英文单语言和英 / 西双语言；独立本地数据库、认证 secret、实际 Worker / 网页 / App / 入口，未当作已发布案例 |
| 构建与链接 | 英文构建无西班牙语页 / 语言链接 / 菜单；双语言三组 HTML 与 sitemap 的 canonical / 全地址语言版本一致，23 个实际内部目标为 200；未译 `/es/tools` / `/es/blog` / `/es/login` / `/es/api/auth/get-session` 为 404，原根路径会话 API 为 200 |
| 浏览器 | 西班牙语功能页桌面浅深主题、同页双向切换、刷新、键盘打开 / Escape 关闭及焦点；390 / 320 像素功能页、320 像素首页 / 价格页、手机菜单切换均无横向溢出；英文账号回退进入根 `/login`，页面 `lang=en`，刷新正常 |
| 构建产物 | 邮件 / 产品公开页 / 工作台 / 独立官网预览及中文教程构建通过；保留既有空案例集合和构建体积提示，没有将演示站标为已上线案例 |

验收截图位于本任务 `.local/evidence/i13-language-*`；单 / 双语言构建、HTML、sitemap、内部请求断言与诊断日志位于 `.local/i13-language-*` / `i13-languages-*`。独立生成站服务已停止，一次性数据库、复制源码与私密配置已删除，保留验收证据。

主预览六个服务更新后均运行且为 200；公开页默认英文、canonical 指向当前入口，未发布西班牙语页或显示关闭的语言菜单，新中文教程可访问。主库仍为 0012 / 13 条迁移，可选新增表不存在，普通账号保持已验证、20 积分、4 文件，原成功任务仍一次执行；浏览器直接刷新原任务后显示 Completed、1 / 3 和原私有结果文件。

[中文产品语言教程](./languages)、网站配置、能力清单、模块总览与复制新站说明已同步。接下来补完整账号 / 工作台与邮件语言路径；人工审校、外部抓取、I11 团队观测、I14—I16 和全部外部验收要求保持。当前阶段没有数据库迁移、供应商请求、真实发信或云部署。

## 2026-10-11：I13 账号入口与任务语言路径

**状态：I13 第三阶段已本地验收，完整 I0—I16 目标继续进行。** 接续公开页记录 `04eb64ba`，功能提交 `db5b27fd`。新增登录、注册、找回 / 重置密码、工作台首页和任务列表 / 详情的英文与西班牙语界面；其余工作台、工具 / 博客和实际邮件正文仍待后续阶段，不标记整个 I13 完成。

工作台保留一份生成路由树和业务组件，用 TanStack Router 双向 URL 改写处理实际已翻译路径。公开页面登记移入共享核心，工作台翻译路径由边缘 Worker、本地网关、公开账号入口和工作台共同消费；已关闭语言及未知前缀不发布。API、私有文件内容、静态资产继续使用根路径，不改变会话、活动团队、所有权和授权规则，也不增加迁移、语言 Cookie 或偏好表。

真实字典覆盖认证、工作台外壳、首页、任务状态 / 费用确认、错误恢复和文件预览。通用认证布局、Turnstile 和对话框只接收文案参数，不依赖产品配置；既有主题同步组件同时更新文档语言。错误根据稳定代码翻译，文件内容请求保留 REST 错误代码，未知错误用当前语言提示；用户 / 团队 / 文件名、输入结果、任务 ID、报价与请求标识保持业务原值。

直接访问西班牙语任务会进入同语言登录，登录或已登录回跳保留安全的原任务路径。验证、社交登录回调和重置入口保留语言，切换语言保留查询参数 / 片段并同步 `returnTo`。未翻译的文件库、历史、积分、成员、设置等明确标记英文并重新加载英文文档；其页面不显示指向同一英文 URL 的虚假西班牙语选择器。实际账号邮件仍是英文，西班牙语认证页明确告知；私有页维持 `noindex`，不进入公开 sitemap / hreflang 集合。

| 验证 | 结果与口径 |
| --- | --- |
| 全仓 Vitest | 79 文件、747 项通过；新增 10 项覆盖真实生成路由树的未登录 / 已登录回跳、实际 Hono Worker 分流、未知 / 关闭路径、错误代码、任务费用确认与丢失响应的同请求重试；最后窄范围 4 文件、17 项通过 |
| 类型、静态诊断、格式 | TypeScript、Oxlint、Oxfmt、产品 Astro 81 文件、官网 Astro 49 文件均通过；离线配置检查通过，产品 / 官网 / 邮件及中文教程构建通过 |
| 实际新站 | Idioma Workspace 从当前工作区生成，安装后分别构建 / 启动英文单语言及英 / 西双语言；独立认证 secret、一次性 loopback PostgreSQL、实际 Worker / R2 / Queue；未当作已发布独立案例 |
| 实际入口与资源 | 单语言的西班牙语公开 / 账号 / 工作台入口均 404；双语言六组工作台入口及根 `/_app/` 资产可读取，公开页实际链接到 `/es/login` 与 `/es/dashboard`；`/es/api`、`/es/_app`、未翻译文件库 / 设置和非完整路径段均未冒充可用版本 |
| 原生业务 | 三个合成账号，注册 / 验证码 / 验证与重置邮件捕获 / 实际重置 / 密码登录；回调保留西班牙语。原生提交同请求两次返回同任务，实际只执行一次，私有结果为正确字节；其他账号 404、匿名 401，读取和切换语言不改变会话及活动团队 |
| 浏览器 | 保护任务 → 西班牙语验证码登录 → 同任务；英 / 西双向切换、直接刷新、活动团队、私有预览、工作台和英文回退通过；另外通过西班牙语表单提交第二个免费任务，完成且只执行一次。已验证账号密码登录、退出、缺重置令牌恢复、键盘焦点、桌面浅深主题及 390 / 320 像素无横向溢出通过 |

首次浏览器密码登录使用了经验证码确认的未验证邮箱账号，认证库既有 `revokeUnprovenAccountAccess` 行为已撤销其未证明的原密码凭据；核对后使用验证码验收原任务，另以已经邮件验证并完成原生重置的合成账号验收密码登录，没有改变认证安全规则。真实外部 OAuth、Turnstile、邮件投递与人工译文审校仍待原外部验收，不把受控本地捕获称为真实发送。

截图位于本任务 `.local/evidence/i13-app-language-*`；单 / 双语言构建、实际 Worker、邮件、浏览器、清理和主预览检查证据位于 `.local/i13-app-language-*`。两个成功任务分别来自原生请求和浏览器操作，一次性站点四个服务、数据库、复制源码及私密配置均已移除，保留本任务验收证据。

主预览继续默认英文和已授权的 0012 / 13 条迁移；可选新模块不启用。原普通账号、20 积分、4 文件与原成功任务 / 一次尝试保持；新西班牙语路径默认不开放。[中文产品语言教程](./languages)、网站配置、模块、能力清单与开发计划已同步。后续继续文件库 / 历史 / 积分 / 团队 / 设置 / 管理后台、工具 / 博客及邮件正文的语言路径；I11 团队观测、I14—I16 和全部外部验收范围保持。

## 2026-10-11：I13 文件、历史与个人购买语言

**状态：I13 第四阶段已本地验收，完整 I0—I16 目标继续进行。** 接续账号与任务记录 `ccf81a0e`，功能提交 `5a4f5640`。新增文件库、保存历史、积分账本、购买列表与详情的英文 / 西班牙语界面；成员 / 邀请、设置 / 管理后台、公开工具 / 博客、实际邮件正文和托管支付回站语言仍在后续范围，未标记整个 I13 完成。

继续使用同一份业务页面、生成路由树和类型对齐的字典，扩展共享已翻译路径表。文件、历史及积分的站内链接不再绕回英文文档；直接加载、刷新和双向语言切换保留文件 / 购买 ID、账号与活动团队。API、私有文件内容和静态资源使用根路径，未知、关闭或未翻译的西班牙语路径仍为 404。

文件库覆盖实际上传、进度、存储确认、配额、状态、预览 / 下载、删除确认与异常。响应丢失增加稳定的客户端错误代码，提示先刷新核对；传输进度不等于服务端保存，删除失败保留确认框和占用。历史预览与导出保留原始结果。积分账本按稳定业务类型显示译文，原始备注可展开查看；文件名、工具 / 积分包配置名称、输入、内容、金额、币种、数量、报价版本及请求标识不翻译，日期和显示金额按当前语言格式化。

购买的待确认、退款 / 争议、余额缺口、原请求重试及稳定错误代码均已有实际译文；页面返回或刷新不发放积分，仍由服务端决定状态和暂停。购买金额格式化移到实际 UI 消费层，查询模块保持数据职责。托管支付供应商及返回地址仍使用既有英文路径，本轮未接通真实支付、未调用供应商。

| 验证 | 结果与口径 |
| --- | --- |
| 全仓 Vitest | 79 文件、750 项通过；新增 3 项验证西班牙语删除失败、丢失购买响应后的原报价 / 原请求重试及待确认到退款审查状态。最后窄范围 7 文件、25 项通过 |
| 实际边缘路由 | 旧测试依赖导入语句写法，首次全仓失败 2 项；将测试移到实际 Worker 所属工作区并改为调用 Hono Worker，验证全部生成路由、完整路径段和公开页面分流。类型与最终全仓复验通过，没有改变生产分流行为 |
| 静态检查与构建 | TypeScript、Oxlint、Oxfmt、离线配置检查通过；产品 Astro 82 文件、独立官网 49 文件均零错误 / 警告 / 提示；产品公开页、工作台、邮件、官网和中文教程构建通过。保留既有空案例集合及产物体积提示 |
| 实际生成站 | Library Workspace 从当前工作区生成，安装依赖后分别检查 / 构建 / 启动英文单语言及英 / 西双语言；独立认证 secret、一次性 loopback PostgreSQL、实际 Worker / R2 / Queue。单语言西班牙语入口 404，双语言新增私有页面可直接加载且保持 noindex |
| 原生业务 | 两个合成账号，真实邮件验证捕获与密码登录、活动团队；真实 UTF-8 / JSON 上传和逐字节下载，错误图片不占配额；他人 404 / 匿名 401；保存历史同请求返回同一条记录。积分仍 20，语言读取不改变会话和活动团队 |
| 购买详情边界 | 仅在独立数据库构造一条待确认测试记录，实际所有者可读取、他人 / 匿名拒绝；没有 checkout URL、发放时间或积分增量，目录支付关闭。此项是私有状态展示证据，不是实际下单或支付证据 |
| 浏览器 | 西班牙语保护入口 → 密码登录 → 文件库；上传 / 确认、预览、原件下载、永久删除提示取消、历史结果导出、积分与原始备注、待确认购买语言切换 / 刷新通过。桌面与手机 390 / 320 像素浅深主题、键盘焦点及四类页面无页面横向溢出 |

浏览器额外上传本任务合成文本，下载核对原字节；随后仅通过原生 API 删除该合成文件，验收站恢复两份原生文件、单条历史、20 积分和原团队。永久删除的实际浏览器操作只验收取消，失败保持由受控组件测试覆盖，未将取消称为删除成功。

证据位于本任务 `.local/i13-library-*` 和 `.local/evidence/i13-library-*`。一次性站点四项服务已停止，专用数据库、复制源码及私密配置已删除，仅保留本任务验收日志与截图。主预览默认英文，双语验收站未当作已发布独立案例。

六项主预览更新后核对原普通账号、已验证邮箱、20 积分、4 文件与原成功任务 / 一次尝试；主库继续 0012 / 13 条迁移，可选营销、观测、个人 / 站主通知及 API 密钥保持关闭、新表不存在。中文语言教程及迭代记录同步可访问。没有新增主库迁移、远程操作、真实发信、付款或云部署。

[中文产品语言教程](./languages)已同步实际交付路径与剩余范围。后续继续成员 / 邀请、设置 / 管理后台、工具 / 博客和邮件语言；人工译文审校、真实 OAuth / Turnstile / 供应商 / 云环境验证、I11 团队观测及 I14—I16 保持原计划范围。

## 2026-10-11：I13 成员、邀请与设置语言

**状态：I13 第五阶段已本地验收，完整 I0—I16 目标继续进行。** 接续记录 `1493dd03`，功能提交 `b694a974`。成员、收到的邀请及设置页新增英文 / 西班牙语；设置覆盖个人资料、会话、通行密钥、API 密钥、账户活动、任务邮件与团队账单七张卡片。管理后台、公开工具 / 博客、实际邮件正文和托管支付回站语言仍在后续范围，未标记整个 I13 完成。

继续使用同一份业务页面、路由树、类型对齐字典和共享已翻译路径表，新增 `/es/members`、`/es/invitations`、`/es/settings`。直接加载、刷新、语言切换与邀请登录回跳保留邀请 ID、活动团队和原角色。团队名、账号名、邮箱、角色值、权限范围 ID、一次性密钥、同意版本 / 修订号与原 checkout URL 保持业务原值；日期和可见标签按界面语言显示。

认证与组织查询保留原错误对象及稳定代码，消费页面选择译文。最后所有者限制、新鲜会话要求、最后登录方式保护、密钥丢失响应的原请求重放、同意冲突刷新与支付权限不改变。实际账号邮件仍是英文，邀请与通知界面明确说明；没有调用真实邮件、支付或其他外部供应商。

| 验证 | 结果与口径 |
| --- | --- |
| 全仓 Vitest | 80 文件、758 项通过；新增实际成员页角色值回归、移除取消 / 权限拒绝、最后所有者、会话重认证失败、通行密钥最后登录方式拒绝、密钥丢失响应重放、同意冲突及账单原年付请求的西班牙语验证 |
| 静态检查与构建 | TypeScript、Oxlint、Oxfmt、离线配置检查通过；产品 Astro 82 文件、独立官网 49 文件均零错误 / 警告 / 提示；产品、工作台、邮件、官网与中文教程构建通过。保留既有空案例集合及产物体积提示 |
| 实际生成站 | Account Workspace 从当前工作区生成，安装后分别检查 / 构建 / 启动英文单语言及英 / 西双语言；独立认证 secret、一次性 loopback 数据库和实际 Worker。仅验收站启用密钥 / 账户活动 / 任务邮件读取，并将免费计划设为三席位；主源码免费计划仍一席、可选模块关闭。该站不是已发布独立案例 |
| 原生业务 | 两个成功流程账号真实注册 / 邮件验证捕获 / 密码登录、团队创建、邀请捕获与接受；服务端设置活动团队。错误账号收到的邀请为空，加入前成员读取 403、匿名 401，普通成员管理邀请 403。搜索使用原邮箱；密钥与通行密钥列表为空、同意关闭、账单关闭、积分 20 |
| 实际成员页回归 | 浏览器发现角色译文误传给角色控件，导致可见选择与服务端角色不一致；恢复传递原 `member` 值，并通过实际成员页面测试验证标签为“Miembro”、控件值为 `member`、提交值为 `admin`。原生及最终数据库核对角色未改变 |
| 浏览器 | 成员搜索 / 清除、所有权转移确认取消、最后所有者禁用、普通成员无管理控件、英 / 西切换与刷新通过。未登录邀请 → 西班牙语密码登录 → 同邀请；语言切换保留 ID、原团队和待接受状态。邀请接受仅由原生 API 验收，浏览器没有转移权限、接受邀请或移除成员 |
| 设置与手机 | 实际个人资料保存后恢复原名；会话关闭与密钥签发只检查确认取消，没有新凭据。键盘焦点、浅深主题、成员 / 设置 / 邀请的 390 / 320 像素布局通过；修复设置卡片最小宽度及长按钮、邀请长邮箱标题溢出与操作挤压，并重新构建浏览器复验 |

首次原生邀请捕获断言依赖正文大小写，捕获模板将标题转为大写，流程停在接受前；改为核对原主题与邀请链接后成功。独立数据库总计四个已验证合成账号，最终核对成功流程的原团队仍两名成员、owner / member 角色不变、原邀请已接受、另外两份邀请待接受、无密钥 / 通行密钥、同意仍关闭、积分仍 20。没有以失败断言推断真实邮件发送问题。

检查预览脚本参数时曾误停六项主预览，已立即恢复并通过原账号、积分、文件、成功任务和六项入口检查；没有执行主库迁移。最终更新后再次核对主预览，主库保持已授权的 0012 / 13 条迁移，原普通账号、20 积分、4 文件与原成功任务 / 一次尝试保持，可选新结构与模块仍关闭。

本任务 `.local/i13-account-*` 与 `.local/evidence/i13-account-*` 保存构建、原生业务、浏览器和清理证据。验收站四项服务、专用数据库、复制源码及私密配置已移除，保留日志与截图。中文语言教程、网站配置、模块、能力清单和计划已同步；默认英文主预览不发布西班牙语路径。

后续继续管理后台、工具 / 博客、实际邮件正文和托管支付回站语言；人工语言审校、真实 OAuth / Turnstile / 邮件 / 支付 / 云环境验证、I11 团队观测和 I14—I16 保持原范围。

## 2026-10-11：I13 管理后台语言

**状态：I13 第六阶段已本地验收，完整 I0—I16 目标继续进行。** 接续记录 `9aff7d03`，功能提交 `e015f370`。站点管理后台新增英文 / 西班牙语，覆盖账号权限、积分与账本、购买 / 订阅记录、支付核查、任务恢复、站主通知和审计分页。公开工具 / 博客、实际邮件正文与托管支付回站语言继续推进，未标记整个 I13 完成。

继续使用同一组业务组件、路由树、类型对齐字典与共享路径表，新增 `/es/admin`。站点权限与团队角色分别校验，语言开启不授予管理员身份。原始账号 / 任务 / 请求 ID、角色值、审计状态代码、维护环境、原因、账本原备注、金额及币种保持原值；可见标签和日期按所选语言显示。西班牙语账本可展开原备注，未知业务代码继续展示原值。

写操作保持原权限、新鲜会话、原因、明确确认和当前页面内的原请求手动重试，不自动重试。语言切换会重新加载页面，未提交表单与确认状态不保留；刷新后先核对服务端记录与审计，再决定后续操作。管理员任务列表不显示他人原输入、文件名或下载入口，站点角色仍不能下载他人私有文件。

| 验证 | 结果与口径 |
| --- | --- |
| 全仓 Vitest | 80 文件、764 项通过；新增实际后台西班牙语权限值、积分丢失响应原请求重放 / 支付限制保持、任务恢复、支付核查不自动重试、无记录与实际零值区分、站主通知不确定状态，以及实际边缘路由正反例 |
| 静态检查与构建 | TypeScript、Oxlint、Oxfmt、离线配置检查通过；产品 Astro 82 文件、独立官网 49 文件均零错误 / 警告 / 提示；邮件、产品公开页、工作台、官网及中文教程构建通过。保留既有空案例集合与产物体积提示 |
| 实际生成站 | Admin Workspace 从当前源码生成，安装后分别检查 / 构建 / 启动英文单语言及英 / 西双语言；独立认证 secret、一次性 loopback 数据库和实际 Worker。仅验收站开启站主通知读取，主源码仍关闭；单语言 `/es/admin` 为 404，双语入口保持 noindex，API / 资源不增加语言前缀，`/es/admin-extra` 为 404 |
| 原生业务与权限 | 两个实际验证邮箱的合成账号、密码登录、原团队；原生审计初始化验收站管理员。普通团队所有者管理 API 为 403，匿名为 401；临时停用 / 恢复与积分增减的原请求重放通过。管理员自我停用被拒绝；实际 24 小时新鲜会话门槛拒绝 25 小时旧会话。实际文本处理成功一次，管理员元数据不泄露私有文件，下载他人结果为 404 |
| 支付 / 通知边界 | 仅在一次性数据库构造一条待确认购买、一条不确定通知与支付复核限制。无 checkout URL、积分发放或供应商查询资格；界面不提供核查 / 强制重发动作。不将这些状态展示称为实际付款、外部渠道送达或供应商验收 |
| 浏览器 | 账号搜索、权限与积分确认取消、购买事件、原备注展开、英 / 西切换与刷新、键盘焦点通过。退出后保护入口回西班牙语登录，普通团队所有者登录后与直接访问后台均回工作台，原团队保持且无后台导航。320 / 390 像素浅深主题无页面横向溢出；修复购买金额 / 积分标签间空格并重建复验 |

原生验收最初将自我停用预期状态写为 403，实际正确拒绝为 400；修正断言后续验。会话验收曾错误使用两小时旧时间，服务端按现有 24 小时规则接受测试 +1；通过原生审计调整 -1 恢复原余额，并改为 25 小时旧会话核实拒绝。保留两次调整的原始审计原因，未修改生产会话策略，也未将错误验收时间描述为产品权限漏洞。

最终一次性数据库核对两个账号分别保持 admin / user、已验证且未停用；原团队 owner 角色、20 积分、支付复核限制、单任务 / 一次尝试、7 条审计与 5 条账本保持。浏览器只确认取消，没有额外权限、积分或支付写入。专用四项服务已停止，数据库、复制源码及私密配置已移除，日志和截图保存在本任务 `.local/i13-admin-*` 与 `.local/evidence/i13-admin-*`；验收站未发布为独立案例。

六项主预览更新后核对原普通账号、已验证邮箱、20 积分、4 文件及原成功任务 / 一次尝试。主库继续已授权的 0012 / 13 条迁移，可选密钥、营销、观测、个人 / 站主通知保持关闭，新结构不存在。中文语言教程同步实际路径与页面重载限制；默认主预览仍英文单语言，没有新增主库迁移、远程操作、真实发信、付款或云部署。

后续继续公开工具 / 博客、实际邮件正文与托管支付回站语言；人工译文审校、真实供应商 / 云环境验证、I11 团队观测和 I14—I16 保持原计划范围。

## 2026-10-11：I13 公开工具语言

**状态：I13 第七阶段已本地验收，完整 I0—I16 目标继续进行。** 接续记录 `48f530d1`，功能提交 `5ea9ef50`。工具目录、JSON 格式化与文本清理完整说明 / 常见问题 / 操作界面新增英文与西班牙语；工具保存登录回跳、工作台卡片和历史标题同步。博客、实际邮件正文与托管支付回站语言仍在后续范围，未标记整个 I13 完成。

完整工具译文集中在 `packages/core/tool-locales.ts`，Astro 公开页和 React 工作台共用；两种语言继续使用同一工具处理器和交互组件。语言配置默认仍只有英文，公开翻译路径只登记实际工具 ID。新增 `/es/tools`、`/es/tools/json-formatter` 与 `/es/tools/text-cleaner`，共六组实际公开页面；canonical、双向语言链接、sitemap 和工具结构化数据对应当前语言与本站域名。未知工具、博客及 API / 资源的虚假语言入口不发布。

工具名称、说明、标签、错误、保存 / 导出和可选使用报告选择按界面语言显示；工具 ID、示例数据、输入 / 结果、MIME、扩展名与下载文件名保持原值。处理器增加稳定错误代码，同时保留原英文消息与处理上限，服务端保存行为不变。普通预览 / 文件导入在浏览器完成；保存才发送当前输入到根路径 API，历史仍只属于账号且不扣积分。

未登录保存时，当前标签页暂存输入，经同一语言登录回同一个工具后恢复预览；存储不可用则留在原页，提示在另一标签页登录。响应丢失不自动重试，同一页面的手动保存继续原 UUID。语言切换会重新加载，未保存的编辑输入不自动保留，界面和中文教程明确提醒先复制；恢复预览不会冒充新的处理成功或自动保存。

| 验证 | 结果与口径 |
| --- | --- |
| 全仓 Vitest | 81 文件、772 项通过。新增实际西班牙语 JSON 原值 / 失败清空、文本清理、保存丢失响应原请求重放、匿名同语言回跳、标签页存储拒绝、恢复预览不产生请求、文件大小限制及可选使用报告隐私验证；既有英文观测与原生私有历史测试继续通过 |
| 静态检查与构建 | TypeScript、Oxlint、Oxfmt、离线配置检查通过；产品 Astro 86 文件零错误 / 警告 / 提示。邮件、公开页、工作台、独立官网与中文教程构建通过；保留既有空案例集合及产物体积提示 |
| 实际生成站 | Tools Workspace 从当前源码生成，安装后分别检查 / 构建 / 启动英文单语言及英 / 西双语言；独立认证 secret、一次性 loopback 数据库与实际 Worker。单语言西班牙语工具入口 404；双语逐页读取六组真实 HTML、语言正文、canonical / 三项 hreflang、sitemap 唯一地址、工具 schema 与根资源，未知工具 / 前缀 API 为 404 |
| 原生业务 | 两个合成账号真实注册、邮件验证捕获、密码登录与原活动团队；两种工具原内容保存 / 原请求重放返回同一记录，改输入沿用旧 UUID 为 409、错误 JSON 为 400、匿名保存为 401。他人历史为空、他人删除为 404；读取页面前后账号 / 会话 / 团队不变，积分 20 |
| 浏览器 | 错误 JSON 无结果可下载；实际粘贴 → 复制 / JSON 下载、匿名保存 → 西班牙语登录 → 恢复同输入 → 保存 → 同语言工作台 / 私有历史通过。实际文本文件本地导入、处理、下载与保存通过，两份下载内容逐字节核对；JSON 示例与原用户结果不翻译。手机菜单、英 / 西切换与刷新、键盘焦点通过 |
| 手机与主题 | 两种工具的 320 / 390 像素浅深主题通过。西班牙语处理标签曾撑宽 320 像素页面，增加工具顶部区域换行与标签宽度限制后重建复验，页面无横向溢出；工具列表手机入口与工作台链接均指向真实语言页 |

首次生成站的工作台构建暴露共享模块的省略扩展名引用无法被配置加载器解析；改用明确包导出入口，并使用可直接加载的错误类声明后，单 / 双语言与最终源码构建通过。存储不可用测试改为模拟实际标签页存储实例，使拒绝分支得到验证；未将测试环境方法绑定差异描述为产品保存故障。

一次性站最终核对两个已验证普通用户、原团队 owner、20 积分，以及两条原生和两条浏览器保存记录；四条记录均属于原账号，处理器 ID 与原输出保持。本地文件导入没有上传到私有文件服务，没有创建后台任务或使用报告。四项专用服务已停止，数据库、复制源码及私密配置已移除，日志、输入 / 下载核对和截图保留在 `.local/i13-tools-*` 与 `.local/evidence/i13-tools-*`；不把验收站称为已发布独立案例。

六项主预览更新后核对原普通账号、已验证邮箱、20 积分、4 文件及原成功任务 / 一次尝试。主库继续已授权的 0012 / 13 条迁移，可选密钥、营销、观测、个人 / 站主通知仍关闭，新结构不存在。默认英文主预览不发布西班牙语路径；没有新增主库迁移、远程操作、真实发信、付款或云部署。

中文语言教程、配置说明、模块与能力清单同步实际工具路径和输入保留限制。后续继续博客、实际邮件正文及托管支付回站语言；人工审校、真实供应商 / 云环境验证、I11 团队观测和 I14—I16 保持原范围。

## 2026-10-11：I13 博客语言与分语言订阅

**状态：I13 第八阶段已本地验收，完整 I0—I16 目标继续进行。** 接续 `2bc3810b`，功能提交 `ca8fb924`。博客目录、两篇完整示例文章、搜索 / 分类、相关文章、目录锚点、首页摘录和 RSS 支持英文 / 西班牙语。默认仍是英文单语言；实际邮件正文与托管支付回站语言继续推进，不将本阶段称为整个 I13 完成。

英文原稿与西班牙语译文按同名 Markdown 文件配对，不维护第二份文章映射。共享目录决定详情、首页、相关卡片、RSS、sitemap 与实际语言替代链接。缺译文明确标注英文原文，草稿原稿同时抑制译文；启用语言的孤立译文、空正文和无效元数据拒绝构建。没有实际发布文章的目录设置 noindex 并从 sitemap 排除。博客关闭时英文索引保留提示、英文订阅无条目，西班牙语博客 / 订阅与所有文章不生成。

公开搜索元数据读取放在构建模块，不进入工具交互的字典模块。首次全仓检查发现两个工具界面测试因字典引入 Markdown 而不能加载；拆分后全仓检查和真实生成站重建通过，工具交互保留原入口。通用文章卡片只接收展示属性，产品卡片适配正文语言、阅读估算、日期和英文回退；独立官网继续使用原英文默认属性。

| 验证 | 结果与口径 |
| --- | --- |
| 全仓 Vitest | 83 文件、781 项通过。覆盖真实发布 / 回退规则、来源草稿、重复 ID、无来源译文、日期与空正文、关闭模块、重音搜索、分类组合、空结果、重置焦点和安全 URL 文本；既有工具、认证、权限与账本回归继续通过 |
| 静态检查与构建 | TypeScript、Oxlint、Oxfmt、离线配置检查通过；产品 Astro 96 文件零错误 / 警告 / 提示。邮件、产品公开页、工作台、独立官网与中文教程构建通过；保留既有空案例集合与产物体积提示 |
| 实际生成站 | Blog Workspace 从当前源码生成、安装并依次检查 / 构建 / 启动英文单语言和英 / 西双语言，独立认证 secret、一次性 loopback 数据库和实际 Worker。单语言西班牙语博客 / RSS 为 404；双语核对三组博客 HTML、完整正文、JSON 示例原值、目录锚点、工具入口、canonical / 三项 hreflang、结构化数据、两份 RSS 的语言 / GUID / UTC 日期及 sitemap 唯一地址 |
| 发布边界 | 在实际生成站将一篇译文置为草稿：目录和相关文章回退英文，英文文章无虚假语言菜单，西班牙语详情 404、对应 RSS / sitemap 地址排除。两篇原稿草稿时详情均 404、目录无文章且 noindex；博客关闭排除全部博客输出，西班牙语 RSS 404。孤立译文与空正文分别实测拒绝构建，恢复真实内容后重新通过 |
| 浏览器 | 搜索 JSON 的单数计数、分类组合、空结果、清除并回到搜索焦点、带重音的查询参数初始化、键盘焦点、文章锚点、英 / 西切换与直接刷新、同语言工具入口、手机菜单和英文回退页面通过。目录与两篇文章在 320 / 390 像素浅深主题均无页面横向溢出，保留真实截图 |

验收脚本的重置步骤曾把生成站品牌配置覆盖为模板配置；改为保存由生成器重新产出的同名站配置，重跑缺译文、草稿、关闭与恢复验收，最终 HTML 的发布者和站点名称仍为 Blog Workspace。作者署名属于显式文章内容，生成器保留原作者；中文教程明确要求替换示例时同步核对作者、日期与正文，不冒充新站作者或真实需求研究。

一次性数据库最终没有账号、私有文件、任务或工具历史；公开博客验收没有创建私有业务记录、发送邮件或请求外部服务。四项专用服务已停止，数据库、复制源码与私密配置已移除；日志、原生输出、边界证据和截图保留在 `.local/i13-blog-*` 与 `.local/evidence/i13-blog-*`。验收站没有发布为独立案例。

六项主预览更新后仍使用已授权的 0012 / 13 条迁移，原普通账号、已验证邮箱、20 积分、4 文件和原成功任务 / 一次尝试保持。可选密钥、营销、观测、个人 / 站主通知继续关闭，新结构不存在；默认主预览不发布西班牙语路径。中文教程同步文章配对、订阅、作者责任和发布边界。语言切换会重新加载，当前目录筛选及文章锚点不保留；两篇译文由 Codex 提供，人工审校仍待。

后续继续实际邮件正文及托管支付回站语言；真实供应商 / 云环境验收、人工审校、I11 团队观测与 I14—I16 保持完整计划范围。

## 2026-10-11：I13 认证与邀请邮件语言

**状态：I13 第九阶段已本地验收，完整 I0—I16 目标继续进行。** 接续记录 `528334d7`，功能提交 `7027ab54`。账号验证、密码重置、验证码和组织邀请邮件支持英文 / 西班牙语主题、预览、HTML、纯文本、按钮和到期说明。默认仍是英文单语言；后台任务 / 营销邮件的持久化语言与托管支付回站语言继续推进，未标记整个 I13 完成。

邮件字典位于独立的 `apps/email/locales.ts`，模板包不引入产品配置。认证客户端每次请求读取当前页面路径，使用 `x-agentbuff-locale` 传递文案语言；API 只接受实际启用语言，未知、缺省或关闭的语言回退英文。请求头不参与身份、团队或权限判断，也不保存长期偏好。邀请按发起者当前页面语言发送 / 重发，不能推断收件人的母语；原邀请 ID、角色值、UTC 截止时间、签名链接与验证码保持原值。

验证 / 重置的签名入口继续使用根路径 `/api/auth`，仅回跳页面保留语言。账号验证令牌实测有效 3600 秒，原邮件的 24 小时描述更正为 1 小时，未延长安全期限；重置有效 1 小时，验证码默认 5 分钟，邀请 48 小时。隐私原页仍为英文，西班牙语邮件明确标注。译文由 Codex 根据原英文文案编写，人工审校仍待。

后台任务和营销确认邮件继续保留英文正文及原 HTML / 纯文本字节，没有给已有排队投递增加临时页面语言。用上一提交的实际公共底座逐字节比较，并加入固定载荷摘要回归，避免相同供应商幂等键重试时改变内容；设置页保留后台任务邮件英文说明。后续须先持久化收件人的语言，再处理投递与重试的正文迁移。

| 验证 | 结果与口径 |
| --- | --- |
| 全仓 Vitest | 85 文件、786 项通过。新增已安装认证 SDK 的逐请求语言选择、真实认证插件验证 / 重置 / 验证码回调、单语言回退、签名期限、四种验证码文案、邀请原角色 / ID、用户文本转义和既有后台邮件载荷兼容验证 |
| 静态检查与构建 | TypeScript、Oxlint、Oxfmt、离线配置检查通过；产品 Astro 96 文件、独立官网 49 文件均零错误 / 警告 / 提示。邮件、产品公开页、工作台、官网与中文教程构建通过；保留既有空案例集合与产物体积提示 |
| 实际生成站 | Mail Workspace 从当前工作区生成、安装并检查 / 构建 / 启动英文单语言及英 / 西双语言。独立认证 secret、一次性 loopback PostgreSQL 和实际 Worker；单语言西班牙语账号页 404，带西班牙语请求头仍发英文。双语验收站仅将免费计划设为三席位，主源码仍一席、可选模块关闭 |
| 原生账号 | 两个合成账号真实注册、验证邮件捕获、签名期限核对、验证与密码登录。西班牙语重置邮件回跳正确，真实重置成功，旧令牌再次使用 400；登录 / 邮箱验证 / 找回三种实际验证码邮件保持原六位代码与 5 分钟说明。更换邮箱文案由模板测试验收，未冒充已启用的实际更换流程 |
| 原生邀请 | 原团队 owner 发起 member 邀请，提交后捕获西班牙语邮件，链接 / 原 ID / 角色 / 截止时间一致；匿名邀请和接受均 401，目标已验证账号实际接受成功。最终仍是原团队 owner / member 两人。最终源码另捕获一份布局邀请后取消，没有新增成员 |
| 浏览器 | 既有账号的西班牙语验证码与密码登录均进入原团队，工作台保持 20 积分。西班牙语找回提交捕获西班牙语重置邮件，切换英文后捕获英文邮件；验证码不在日志输出，展示截图使用替代码。找回页面浅深主题的 320 / 390 像素布局和键盘焦点通过 |
| 实际邮件 HTML | 使用本地捕获的验证、重置、验证码和邀请邮件预览，320 / 390 像素无横向溢出。邀请长链接最初撑宽 320 像素，增加链接段落断行后重新构建、原生捕获并浏览器复验；验证码字体与间距调整后六位完整显示。邮件是固定浅色 HTML，不把此预览称为邮箱客户端或深色邮件验收 |

一次性站最终核对两个已验证普通账号、原接受邀请和角色、20 积分；没有私有文件、后台任务或工具历史。专用四项服务和脱敏邮件预览服务已停止，数据库、复制源码及私密配置已移除。构建、原生流程、兼容性、浏览器及清理证据保留在 `.local/i13-mail-*` 与 `.local/evidence/i13-mail-*`；截图与验证 / 重置链接已脱敏。验收站没有发布为独立案例，没有请求真实 Resend、支付或其他外部供应商。

六项主预览已更新；原普通账号、已验证邮箱、20 积分、4 文件及原成功任务 / 一次尝试保持，浏览器确认原结果预览与下载入口仍在。主库继续已授权的 0012 / 13 条迁移，可选密钥、营销、观测、个人 / 站主通知仍关闭，新结构不存在。默认英文主预览不发布西班牙语路径。中文账号 / 语言教程、配置说明、模块、能力清单与计划已同步。

后续继续后台任务 / 营销邮件的持久化语言和投递重试，以及托管支付回站语言；人工审校、真实邮箱显示 / 投递、供应商 / 云环境验证、I11 团队观测和 I14—I16 保持完整范围。

## 2026-10-11：I13 持久化任务邮件语言

**状态：I13 第十阶段已本地验收，完整 I0—I16 目标继续进行。** 接续记录 `7faec3db`，功能提交 `9d2e5038`。设置页新增独立的任务邮件语言选择，偏好与投递记录分别持久化；成功 / 失败邮件的主题、HTML / 纯文本、任务和设置链接支持英文 / 西班牙语。默认仍是英文单语言且任务邮件关闭，营销确认邮件与托管支付回站语言继续推进，未标记整个 I13 完成。

界面语言切换不自动修改邮件偏好，当前账号必须显式选择并保存。每次保存沿用原 revision 冲突检查、本人已验证邮箱与 Origin 校验；客户端不能指定接收人。显式保存不同语言增加 revision 并重设选择起点，旧未领取邮件失效，同一终态不重复入队；正在发送的请求可能仍按原语言到达。关闭西班牙语后如实保留已保存值，可以改成英文或撤回，相应排队请求停止，不能同键改写为英文。

增量迁移 `0022_task_email_language.sql` 给旧偏好填入英文，但旧投递的语言保留空值。空值继续选择原英文模板、原 `task-mail-v2` 摘要和原幂等键；新投递保存明确语言，使用包含记录语言的 `task-mail-v3` 摘要。旧 HTML / 纯文本逐字节回归继续通过，两种渲染分支在旧待处理记录消退前保留，不将空字段直接改成新版英文。营销邮件暂保留原英文载荷，后续接入独立匿名同意语言。

| 验证 | 结果与口径 |
| --- | --- |
| 全仓 Vitest | 85 文件、797 项通过。新增实际 RPC 的语言保存 / 缺省保留、成功与失败西班牙语、未知 / 关闭语言拒绝、原 revision 冲突、选择变更后的跳过与去重、同键重试、旧摘要交付、增量迁移保留旧记录和数据库语言约束；实际设置组件验证显式保存、失败后的重新读取与不可用语言撤回 |
| 静态检查与构建 | TypeScript、Oxlint、Oxfmt、Drizzle 增量历史检查和离线配置检查通过；邮件、产品公开页、工作台、独立官网与中文教程构建通过。没有修改已应用的迁移、旧快照或历史条目；保留既有空案例集合及产物体积提示 |
| 实际英文链路 | 独立 loopback PostgreSQL 完整应用至 0022，实际 Worker / Queue / R2 执行成功与失败任务，定时入口捕获英文邮件；多次重放没有增加投递。实际捕获故障保留业务结果，恢复后沿用同一键接受；撤回 / 再次开启不补发旧终态，原结果仍可下载 |
| 实际西班牙语链路 | 另一个独立数据库和配置开启英 / 西双语，保存西班牙语偏好；实际队列成功 / 失败、定时扫描和捕获邮件通过。捕获故障后销毁并重新启动实际 Worker，在同一数据库和本地资源目录恢复偏好与原投递；第二次尝试仍是西班牙语和同一记录键，最终共三份任务邮件 |
| 浏览器 | 已有合成账号登录英文设置页，原保存值仍为西班牙语；显式保存英文后切换西班牙语页面，偏好仍为英文。显式保存西班牙语并刷新后恢复同值，再撤回成功；最终 revision 6、语言 es、allowed false。页面检查未产生额外邮件。投递列表继续显示原记录语言 |
| 手机与链接 | 设置页的 320 / 390 像素浅深主题与键盘焦点通过；实际成功 / 失败邮件的两种宽度无横向溢出。邮件按钮打开原西班牙语任务，原任务成功一次，私有结果下载仍使用根路径 API。没有在邮件中加入输入、文件名、结果附件或签名下载地址 |

增量迁移验收起初将多条 SQL 合并为单个预备语句，测试驱动明确拒绝；改为按原迁移断点逐条执行后通过。模板验收始终先重新构建邮件包，避免读取旧产物；既有英文载荷摘要与逐字节比较最终均保持。没有将测试驱动或旧构建产物的差异描述为生产迁移故障。

两次原生验收各自销毁专用数据库、Worker、Queue、R2 目录与私密配置；浏览器专用工作台和本地邮件预览入口均已停止。证据保留在 `.local/i13-task-language-*` 与 `.local/evidence/i13-task-language-*`，截图与 HTML 只包含合成任务邮件，没有认证令牌。该一次性工作台不是已发布独立案例，没有访问真实 Resend、支付或其他外部供应商。

六项主预览已更新；原普通账号、已验证邮箱、20 积分、4 文件及原成功任务 / 一次尝试保持。主库继续已授权的 0012 / 13 条迁移，未应用 0022 或其他可选迁移，任务 / 站主通知、密钥、营销及观测继续关闭，新结构不存在。中文任务通知、账号 / 语言教程、环境与网站配置、模块、能力清单和计划同步真实语言与兼容规则。

后续继续营销确认邮件的同意语言与重试，以及托管支付回站语言；人工审校、真实邮箱显示 / 投递、供应商 / 云环境验证、I11 团队观测和 I14—I16 保持完整范围。

## 2026-10-11：I13 持久化营销确认邮件语言

**状态：I13 第十一阶段已本地验收，完整 I0—I16 目标继续进行。** 接续记录 `83927ab3`，功能提交 `881f3060`。匿名邮件订阅 / 候补名单保存主动同意的语言与对应原文，确认邮件主题、HTML / 纯文本、按钮和确认 / 退订路径支持英文 / 西班牙语；公共页默认英文且两个名单继续关闭。托管支付回站语言、I11 团队付款观测、I14—I16 与各外部服务验收仍待，不将整个 I13 或完整目标标为完成。

语言在每代主动同意时写入，重试与 Worker 重启读取原记录；不采用页面请求头、账号语言或浏览器猜测。冷却期内的匿名重复申请保持原待确认代次，已确认记录不能被另一个匿名语言提交改写。退订并满足冷却期限后，新申请可记录新的语言，旧确认链接失效；原退订能力继续用于该名单，不会确认新代次。名单分别保存同意，不创建或验证账号。

新增 `0023_marketing_confirmation_language.sql` 和对应快照 / 追加日志，只增加可为空的语言及 `en` / `es` 约束。旧空语言保留原英文模板、链接、主题与幂等 key，不自动升级渲染载荷。单元验证先重建迁移前结构，再执行实际增量 SQL，核对 nonce、同意原文、尝试数不变，并比较原英文 HTML / 纯文本；既有黄金摘要仍通过。关闭语言停止领取对应确认投递，不改发另一语言，也不阻止根路径的历史退订；SQL 批量查询同时过滤关闭语言，避免无效记录占满十项处理窗口。已经领取并开始发送的请求仍可能到达。

订阅、候补名单、确认与退订共用既有页面结构和字典。开启第二语言才发布西班牙语页面，关闭名单不发布相应申请页；页脚指向当前已翻译入口。偏好页保持 `noindex`、`no-referrer`，不进入 sitemap、不加载营销统计，只打开邮件链接不修改订阅。成功操作清除 URL 片段。隐私政策仍明确标注英文；译文人工审校及真实邮箱客户端显示仍待。手机检查发现西班牙语申请按钮过长，已缩短并重建，保留明确用途及邮件语言说明。

| 验收 | 结果与边界 |
| --- | --- |
| Vitest | 85 个测试文件、804 项通过；覆盖同意语言与原文、匿名重复提交保护、同键同载荷重试、关闭语言后的跳过 / 退订、批次不被关闭语言阻塞、新同意代次与旧链接、实际迁移约束和旧载荷兼容 |
| TypeScript / Oxlint / Oxfmt | 完整类型检查、严格静态检查和格式检查通过；提交检查通过 |
| Astro / 构建 | 98 个产品页面诊断无错误、警告或提示；邮件、正常单语言预览、模板官网、工作台、产品公共页和中文文档构建通过；独立双语言构建与页面产物检查通过 |
| 配置 / 迁移检查 | 默认英文、名单关闭，配置检查与 Drizzle 检查通过；预检明确名单需完整迁移至 0023，任务邮件需 0022 |
| 实际本地 Worker | 英文与西班牙语分别运行实际 workerd / PostgreSQL；八并发申请一封本地捕获、主动确认 / 退订、名单隔离、确认与申请竞争、失败投递和实际定时恢复通过；西班牙语运行真正销毁并重启 Worker，核对存储语言与重试请求正文 / 原链接 / 幂等 key 完全相同 |
| 实际浏览器 | 合成邮箱在西班牙语页面主动申请，实际捕获邮件链接打开后仍待确认；点击确认才成功，原退订链接展示已确认状态，点击退订后才退出；两次成功均清除片段。320 / 390 宽度、浅深主题、提交按钮键盘实线焦点已检查，保留实际截图 |
| 故障与隐私 | 实际营销维护表故障不阻断文件 / 任务维护；原签名链接日志脱敏检查继续通过；没有创建账号、真实发送、真实 CAPTCHA 或供应商配置变化 |
| 清理 / 正常预览 | 两次一次性数据库与 Worker / 邮件捕获 / 静态资源已清理，端口 21311 已停止；六个主预览运行，主库仍为已授权 0012（13 项迁移），新增营销 / 通知 / 观测结构未应用。原普通账号 20 积分、4 个文件、原任务成功且一次尝试保持完整 |

本地验收程序新增 `--languages --ui`，复用既有邮件捕获和隔离配置，临时固定邮件预览入口只存在于验收程序。完整浏览器过程结束后，程序核对已退订、西班牙语同意和无账号，再清理环境。截图与最小邮件 HTML 留在忽略目录作为本地证据；没有公开成独立案例，没有向 Resend 或其他远程服务发送。本阶段不会把接口接受状态称为真实邮箱收到或付费订阅。

初次旧载荷测试为没有邮件 Logo 的配置错误拼接了 `null` 地址，已修正测试按真实品牌入口的可选 Logo 规则构建预期；产品旧模板与历史迁移没有因此修改。最后整理西班牙语静态路由生成代码，分开列出实际公开页、工具、名单和文章，避免继续扩成长行条件；未新增第二套路由或通知引擎。

**下一项：** 按原计划核对积分包 / 订阅托管支付与门户的发起语言、成功 / 取消 / 返回路径及恢复边界，使用独立本地供应商契约与实际 Worker 验收。真实 Stripe 沙箱、真实 Resend、OAuth / 通行密钥设备、Cloudflare 云资源及人工语言审校继续列为外部待验收；主库后续可选迁移不自动执行。

## 2026-10-11：I13 托管支付回站语言

**状态：I13 第十二阶段已本地验收，完整 I0—I16 目标继续进行。** 接续记录 `e079f735`，功能提交 `26ec0aa0`。积分包的新结账保存发起语言，订阅的新结账使用同语言设置页，账单门户传递当前界面语言并返回固定设置页。公开默认仍为英文，主预览没有 Stripe 凭据，积分包继续关闭。真实托管页面与沙箱交易、人工审校、I11 团队付款事件以及 I14—I16 保持待验收。

积分包语言与原商品请求一起确定，丢失响应后从保存记录恢复；同一请求改商品或显式语言均拒绝。新增 `0024_credit_checkout_language.sql`、对应快照与追加日志，使用购买 ID 为主键的一对一语言表，主键同时支持购买外键查询；没有修改原购买列或历史迁移。旧购买没有语言快照时继续英文地址和不含 `locale` 的原 SDK 载荷。正常主库停留在 0012，未读取或创建该可选表；启用积分包前需完整迁移至 0024 并重建工作台 / API。

订阅语言从保存的成功 / 取消地址确定，两个地址必须同语言；重试不会根据当前页面重建。原 SDK 参数摘要匹配时，保留已有语言、请求标记及无标记旧版本，不给同一幂等键补新字段。门户清除页面中无关的查询参数和片段，保持原个人 / 团队主体、新鲜会话及当前管理权限。订阅成功返回仍经过归属、当前资源和实际保存核查；未付款拒绝，确认后才返回保存的语言设置页，不因此发积分。

| 验收 | 结果与边界 |
| --- | --- |
| Vitest | 85 个文件、811 项通过；新增积分包语言快照 / 冲突 / 关闭语言 / SQL 约束 / 旧请求兼容、实际订阅 SDK 同键重试与旧参数摘要、门户语言与客户端个人 / 团队请求范围；完整测试同时覆盖既有付款核查和恢复 |
| 类型 / 静态检查 | 完整 TypeScript、严格 Oxlint、Oxfmt、Drizzle 和默认配置检查通过，提交检查通过 |
| 构建 | 98 个产品 Astro 页面诊断无错误、警告或提示；邮件、产品公共页、工作台、模板官网、API 与中文文档构建通过；独立双语言工作台也实际构建 |
| 实际 Worker | 受控 Stripe HTTP、一次性 PostgreSQL 与生产 workerd；西班牙语积分包 / 订阅分别模拟接受请求后失去响应，真正销毁并重启 Worker 两次，原请求正文 / 幂等键一致，改英文请求拒绝；未付款成功返回 409，受控当前资源确认后 302 返回西班牙语设置页，门户语言 / 返回地址正确，余额保持 20 |
| 实际浏览器 | 西班牙语购买详情仍显示待确认，设置页按实际本地订阅显示有效；320 / 390 像素与浅深主题已检查，购买详情长按钮允许换行，最终 320 像素无横向溢出。托管链接未被访问，没有真实付款 |
| 正常预览 | 六个服务更新并返回 200；主库仍为 0012 / 13 项迁移，可选语言表不存在。原已验证普通账号、20 积分、4 文件和原任务成功 / 一次尝试保持；实际登录、原任务、积分与未配置账单页面已检查，原购买列表在旧结构正常读取 |
| 清理 / 文档 | 专用数据库、Worker、文件资源、临时工作台及 21315 入口已停止并清理；中文支付 / 语言、环境 / 网站配置、模块、能力与计划已同步，实际文档响应逐字节等于最新构建产物 |

本地验收命令 `bun payments:validate-language` 复用已有 Worker 运行基础；可加 `--ui` 查看专用双语言工作台。专用入口使用 `127.0.0.1`，与 `localhost` 主预览隔离登录 Cookie；最终专用账号登录后原预览仍保持登录。受控供应商补齐插件注册时的客户读取，未预期目的地或 SDK 路径会令验收失败，不能被插件内部捕获后当作通过。验收日志与语言 / 主题截图位于忽略的 `.local/i13-payment-language-*` 与 `.local/evidence/`，没有对外发布合成付款案例。

停用语言前需先处理该语言的未解决结账，保留路由到完成或到期核查；直接关闭可能导致历史返回地址 404。没有自动改写已接受付款请求，也不能把本站参数验收等同于供应商页面翻译验收。首次完整测试的一项门户断言仍使用旧的任意页面地址，已改为固定语言设置页后重跑全部测试通过。

**下一项：** 继续 I11 的团队订阅付款事件，核对团队主体、实际已确认收入、独立同意与个人 / 团队去重边界；随后继续原计划其余模块。真实 Stripe / Resend、OAuth / 通行密钥设备、Cloudflare 云资源和人工审校仍需外部验收，主库后续可选迁移不自动应用。

## 2026-10-11：I11 团队订阅付款观测

**状态：团队付款观测已本地验收，完整 I0—I16 目标继续进行。** 接续记录 `63cd760f`，功能提交 `653cc3c8`。Settings 增加当前团队的独立选择，owner / admin 可以保存或撤回，普通成员只读；个人同意不授权团队账单。两个选择都显示最后确认状态，勾选但尚未保存时不改变该状态。默认仍关闭，未应用主库可选迁移。

个人与团队共用已安装 Stripe SDK 的签名门禁、当前账单与实际收款核查、全局账单 ID / 事件类型唯一键及有界恢复流程。团队付款保存团队 ID，不保存某个管理员为付款所有者；双重身份或客户绑定不清楚时跳过。最终写入在事务内检查当前团队客户、订阅和最新同意，角色变更与选择保存共用团队锁；供应商查询期间撤回不会继续插入。统计不发积分、不修改订阅权限，普通工作台读取不扫描供应商历史。

新增 `0025_team_payment_activity.sql`、对应快照与追加日志。团队选择保存最后决策者 ID 和恢复检查时间；事件表增加团队归属，数据库约束保证恰好一个所有者，团队只能写订阅付款。旧个人选择和事件保持原字段、时间、金额与唯一键。团队删除清除团队选择和事件；个人账号删除不撤销其曾参与决定的团队选择，决策者 ID 保留为历史标识。没有另建通用事件框架或第二套支付核查。

| 验收 | 结果与边界 |
| --- | --- |
| 全量 Vitest | 86 个文件、826 项通过；新增独立选择、成员只读 / 移除、实际会话团队变化、同源 / revision、默认关闭、事件所有者约束、账单改绑去重、查询中撤回 / 新同意起点、观察故障恢复及西班牙语失败确认 |
| 增量迁移 | 在测试数据库重建升级前结构，保存旧个人事件和同意后执行实际 0025 SQL；旧记录逐字段保持、团队选择初始为空，同账单改绑团队仍被原唯一键拒绝。仅变更新迁移和追加条目，已发布 0000—0024 保持 |
| 类型 / 构建 | TypeScript、严格 Oxlint、Oxfmt、Drizzle 和配置检查通过；98 个产品 Astro 页面诊断无错误 / 警告 / 提示；邮件、产品公开页、工作台、独立官网、API 与中文教程构建通过 |
| 实际原生 Worker | 一次性 loopback PostgreSQL 完整迁移至 0025，生产 workerd / Queue / R2 和受控 Stripe HTTP；真实创建 / 选择团队，个人已同意仍不计团队付款；保存等待实际团队锁期间降级为成员，HTTP 返回 403，普通成员只读；恢复测试 owner 后主动保存，旧 revision 返回 409 |
| 付款与故障恢复 | 八个实际 SDK 签名账单回调只写一条团队记录，采用核查后的 2300 最小单位金额而非载荷中的 999999；详情读取不重复。实际统计表故障时有效账单仍返回 200，恢复表后实际定时入口补回续费；撤回后下一账单不记录，余额不因团队付款增加 |
| 实际浏览器 | 在 `activity.localhost:21312` 登录专用合成账号，个人与团队分别保存 / 撤回并刷新读取，最终两者 allowed false、revision 4，共 10 条已核实活动保持；390 像素浅深主题与 320 像素浅主题无横向溢出，保留页面截图 |
| 清理 / 主预览 | 专用数据库、Worker、Queue、R2 和工作台全部清理，21312 已停止；六个正常预览更新并返回 200。主库仍为授权 0012 / 13 条迁移，团队选择 / 事件表不存在；原已验证普通账号、20 积分、4 文件和成功任务 / 一次尝试保持，实际浏览器刷新后原结果继续可用 |
| 中文教程 | 服务端事件、网站配置、模块、能力清单与计划同步独立选择、0025 启用要求、删除归属和恢复上限。正常文档服务重新启动后，实际响应逐字节等于最新构建产物 |

原生验证器新增 `--teams`，包含已有个人账单路径；`--teams --ui` 在专用域名验证两个选择，避免覆盖主预览 Cookie。最后收紧订阅归属读取的事务锁后，重新运行无 UI 原生验收及全量检查。证据保留在忽略目录 `.local/i11-team-*` 与 `.local/evidence/i11-team-payment-*`；测试记录没有发布成独立案例，未访问真实 Stripe / Resend 或云资源。

**下一项：** 继续 I14 的可选客服与联盟营销，先核实一个供应商的实际接口和独立配置，再实现默认关闭、按需加载、联系页回退与生成站重置。完整计佣需要支付、重复事件、退款及结算闭环，不能把前端脚本当成已实现佣金。I11— I13 的真实供应商验收、I15 云端运行与 I16 第二产品仍保留完整范围。

## 2026-10-11：I14 可选客服与联系页回退

**状态：客服首版已本地验收，I14 和完整 I0—I16 目标继续进行。** 接续记录 `c8030b97`，功能提交 `b9fa0e7e`。选用 Crisp 的官方浏览器命令 / 事件协议，增加显式 `support` 配置和中文客服教程。默认关闭、Website ID 为空、支持邮箱为空；工作台新增支持链接，产品联系页共用英文 / 西班牙语页面。真实工作区和消息往返尚未验收，联盟的归因、付款 / 退款及结算仍待。

聊天只在联系页主动点击后加载固定供应商脚本，没有添加依赖包、数据库迁移或第二套客服框架。首屏渲染和工具 / 私有工作台不加载 SDK；同一文档并发点击复用一次加载，关闭 / 重开复用原实例。脚本下载完成不能显示成功：等待会话就绪，再发起窗口打开，由 SDK 打开事件确认。15 秒期限、脚本错误和 SDK 命令异常均显示失败并保留邮件入口；失败不自动重试，迟到会话事件不能重新打开。

联系页和脚本采用 `no-referrer`，点击前清除当前 URL 查询与片段，联系入口不携带工作台来源。联系页不加载已有 Cloudflare 统计脚本。没有自动设置账号身份、邮箱、团队、付款、任务输入或文件，也没有预填 / 发送消息。真实供应商仍有自己的网络、Cookie 和访客会话，关闭聊天窗口不等于删除远程记录或停止网络；未提供账号身份校验或跨设备连续性，边界写入教程和界面说明。

| 验收 | 结果与边界 |
| --- | --- |
| 全量 Vitest | 89 个文件、836 项通过；覆盖按需加载 / 同文档去重、脚本加载与窗口确认区分、超时 / 迟到回调、已有实例保护、SDK 命令故障、真实 React 状态、配置拒绝及连续两次生成站。没有向真实供应商请求脚本 |
| 配置 / 静态检查 | TypeScript、严格 Oxlint、Oxfmt、默认配置和 Drizzle 历史检查通过；104 个产品 Astro 文件诊断无错误 / 警告 / 提示。新配置要求公开 UUID 和邮件回退，生成站主动重置为关闭 / 空 ID / 空邮箱，来源配置保持 |
| 实际静态构建 | 独立开启 / 关闭且英 / 西双语构建通过，核对邮件入口、联系页孤岛、初始 HTML 无供应商脚本、语言 sitemap 与空联系页不索引。额外在受控配置开启 Cloudflare 统计，核对工具页实际含统计脚本而联系页不含；没有连接统计服务 |
| 实际浏览器 | 专用 `support.localhost:21316` 使用本地 SDK 协议与仅允许本地资源的 CSP；初次主动打开、关闭 / 重开共用一份脚本，正常导航到工具页后没有 SDK；切换西班牙语再用键盘主动打开，脚本 503 后保留邮件入口 |
| 实际超时 / 可用性 | 第三份脚本已下载，但会话事件在实际 18 秒后返回；页面经过 15 秒期限显示失败，迟到事件没有打开窗口。故障后文本工具仍实际输出并预览 `Hello world`。验证器核对三次脚本请求、两次打开事件、无 Referrer 及无额外命令；没有消息输入框或发送方法 |
| 手机 / 主题 | 390 与 320 像素浅深主题无横向溢出；长译文与邮箱换行，失败按钮有禁用样式。保留打开预览、桌面超时及手机回退截图，截图只使用合成邮箱和受控窗口 |
| 正常预览 / 清理 | 六项主预览重新构建并更新，均返回 200；实际网页和中文教程响应逐字节等于最新构建。专用目录 / 21316 入口已清理。主库仍为授权 0012 / 13 项迁移；原已验证普通账号、20 积分、4 文件及原任务成功 / 一次尝试保持，浏览器实际支持链接进入默认关闭的联系页后返回原任务 |

初次本地测试的 Happy DOM 设置层级不符合当前 Vitest，已按实际运行器修正并禁用远程脚本文件加载；最初单独构建使用了错误的 Astro 执行文件路径，也已纠正。文档逐字节校验的初次断言只匹配大写供应商名，网站配置页采用小写配置值，改为大小写兼容后通过。上述验收程序问题没有修改业务数据或迁移。SDK 命令故障保护补齐后，重新通过全量回归、类型 / 静态检查和无 UI 原生构建验收；最后的统计抑制验收仅修改隔离验证器，再次通过类型 / 静态检查、隔离及正常构建。

主预览没有填写真实客服邮箱或 Website ID，联系页显示暂不可用并保留 `noindex`，不进入 sitemap。使用独立配置展示受控聊天，不把测试站发布为独立案例。证据保留于忽略目录 `.local/i14-support-*` 与 `.local/evidence/i14-support-*`；没有真实 Crisp、Stripe、Resend 或云环境操作。

**下一项：** 继续 I14 联盟营销，选定一个供应商后先核对推荐标识、支付元数据、重复 / 过期归因、退款撤销和结算接口，再实现默认关闭及完整本地付款闭环。真实客服工作区、真实支付 / 邮件 / 身份服务、I15 云端运行与 I16 第二产品继续保留在完整目标中，主库后续可选迁移不会自动应用。

## 2026-10-11：I14 联盟营销后台核查

**状态：联盟后台首阶段已本地验收，I14 与完整 I0—I16 目标继续进行。** 接续记录 `e9d3f0b7`，功能提交 `acb9637d`。采用 Rewardful 的签名信封、当前佣金 / 结算 API 和 Stripe 当前账户 / Charge 核查；显式配置默认关闭，计划 / 商户 ID 为空，两项秘密凭据成组校验。访客追踪、客户推荐绑定、完整购买归因和真实资金结算仍待，没有通过脚本或合成佣金界面冒充完整交付。

事件先持久化再核查，不信回调载荷金额；`event.id` 去重，不使用会随重投变化的 `request.id` 或整份载荷摘要作为身份。当前资源核对推广计划、商户、客户、币种、模式、捕获 / 付款、争议和退款；较早事件仍读取当前资源，旧版本与同版本矛盾不能覆盖已核查记录。结算最多读取 20 个不重复佣金并核对成员和总额，供应商 `paid` 仅作为观察状态，不表示银行到账。

退款同步滞后留在原事件有限重试；90 秒租约、最多八次、每批三个，复用已有定时维护。最后租约过期转为待复核。佣金新核查、删除、失败或财务变化会把相关已观察结算标为待复核；保留原金额、已付历史及成员关系，不能假装已经追回资金。自己的资源重新完成核查后才能清除标记；没有管理员重放或漏回调扫描接口。

新增 `0026_affiliate_provider_checks.sql`、对应快照和追加日志，三个表分别保存最新供应商快照、当次已核查金额 / 状态与有限恢复、最新已核查结算成员。没有保存原始载荷、客户 / 推荐者邮箱，没有修改产品余额、订阅权限或执行付款。已发布 0000—0025 SQL、快照与日志条目逐字节保持；0026 只在独立测试库执行，主库没有自动升级。

| 验收 | 结果与边界 |
| --- | --- |
| 完整 Vitest | 90 个文件、855 项通过；新增 19 项联盟测试，覆盖默认关闭、验签、并发重复、当前资源归属、退款滞后 / 全退作废、结算总额 / 成员、旧版本 / 同版本矛盾、删除后的历史 / 关联复核、重定向拒绝、最后租约与重试上限；连续生成站沿用三项实际复制测试 |
| 增量迁移 | 测试库退回 0025 结构，保存已验证普通账号、Stripe 客户 ID 和 20 积分后执行实际 0026 SQL；原账号 / 余额逐字段相同，三个新表初始为空，签名回调随后能写入新表 |
| 配置 / 静态检查 | 完整 TypeScript、严格 Oxlint、Oxfmt、Drizzle 和默认配置检查通过，提交检查通过；支持未知供应商 / 不完整 ID / 半组凭据拒绝，生成站关闭并清空推广计划 / 商户 ID |
| 构建 | 104 个产品 Astro 文件诊断无错误、警告或提示；邮件、产品公开页、工作台、独立官网、API 与中文教程构建通过，正常本地配置再实际构建。文档仍有既有体积提示，没有因此改动其他模块 |
| 实际生产 Worker | 一次性 loopback PostgreSQL 与实际 workerd；非法签名 401、超限 413、八个同时发送的同事件只保存一份记录，取核查后金额 300 而非载荷的 999999，同事件改身份 409 |
| 退款与重启 | Stripe 先出现部分退款时，原记录保留、待核查标记生效；真正销毁 / 重启 Worker，供应商追上后通过实际定时入口恢复原事件，尝试数为 2、金额 150 / 退款 500。已付结算成员关系、全退作废、旧通知、删除复核均通过 |
| 请求与恢复边界 | 受控供应商 302 带外站 Location，实际 Worker 不跟随、不向外站发送凭据；恢复正常响应后原事件完成。503 连续八次转为待复核，健康入口仍 200，原文件 / 任务维护继续执行。全部供应商请求只能 GET，未预期地址会令验证失败 |
| 正常预览 | 六项服务更新并返回 200；主库仍为授权 0012 / 13 项迁移，三个联盟表不存在，主 API 与网关回调均 404，公开页没有推荐追踪 SDK。原已验证普通账号、20 积分、4 个文件及成功任务 / 一次尝试保持；实际浏览器刷新原任务继续可用 |
| 中文文档 / 清理 | 联盟教程、配置 / 环境、模块、能力、生成站与计划已同步；实际文档响应逐字节等于最新构建。一次性数据库、Worker 和专用文件均已清理，正常配置字节未变；日志留在忽略的 `.local/i14-affiliate-*` |

初次实际 Worker 请求使用 `redirect: "error"`，在当前运行器中于请求发送前抛出 TypeError；改为 `manual` 并明确拒绝非 200 后，实际正常响应、302 与恢复均通过。增量迁移测试第一次使用全局 URL，受到项目 Node / Workers URL 类型差异影响，改为既有绝对路径读取方式后类型检查通过；完整回归及原生验收随后重新通过。相同重定向模式仍存在于既有 Turnstile 请求，后续需单独使用实际 Worker 验证兼容性，当前不将联盟验收当作 CAPTCHA 验收。

没有使用真实 Rewardful 账户、浏览器 SDK、推荐链接、Stripe 沙箱交易 / 退款或付款 API，未创建真实用户、发积分、支付佣金或操作云资源。依据官方文档选定下一阶段 Stripe Customer metadata 的 `referral` 方案，保留现有 `client_reference_id` 的用户 / 团队与支付归属；当前尚未写入元数据，也没有自动将外部客户绑定到本站订单。

**下一项：** 继续 I14 访客推荐、主动选择 / 过期规则、重复 / 已转化保护、客户元数据绑定和原支付幂等，再补人工恢复 / 漏事件对账与真实供应商验收。先复核现有 Turnstile 请求的 Worker 兼容性。真实客服、支付 / 邮件 / 身份服务、I15 云端运行与 I16 第二独立产品继续保留完整范围，主库后续可选迁移不自动执行。

## 2026-10-11：I3 校验服务 Worker 兼容性

**状态：已修复并完成本地原生验收，完整 I0—I16 目标继续进行。** 接续记录 `dd67a6b6`，功能提交 `5aa09233`。上轮联盟请求发现的重定向模式兼容性问题也存在于共享 Turnstile 校验函数；先以实际文件入口复现，再只将请求模式改为 `manual`，保留固定目的地、POST 字段、十秒期限、响应结构和动作 / 域名检查。3xx 仍拒绝，不跟随或转发 secret / token，校验失败不能写入文件。

复用 `files:validate` 增加 `--turnstile`，没有创建第二个 Worker / 数据库运行框架。开启选项只修改一次性配置、设置合成公开 / 私密标识，Siteverify 由受控出站接口接管；正常网站配置字节保持。旧代码在受控有效目的地尚未被调用时返回 503，程序观测到本应返回 400 的无效 token 请求却为 503、供应商调用数为零。修复后相同入口能调用校验服务，正确区分失败与成功。

| 验收 | 结果与边界 |
| --- | --- |
| 完整 Vitest | 90 个文件、862 项通过；共享函数 21 项检查通过，新增 302 / 307 / 308 拒绝与五种成功动作；文件、任务、购买、营销及密钥原测试一起回归 |
| 真实 Worker 拒绝边界 | 一次性 loopback PostgreSQL、生产 workerd、本地 R2：缺失 / 超长 token 不调用供应商；错误主机 / 动作、重放、非法响应、503、带外站 Location 的 302 均拒绝；每次初始拒绝后文件 / 配额表及 R2 都为空 |
| 真实期限与成功 | 受控服务真实延迟 11 秒，Worker 约 10 秒返回 503，实际计时介于 9.5—15 秒，没有自动重试；正确动作 / 主机响应允许一个文件，重放后仍只有一个文件 |
| 开启 / 关闭回归 | 开启后仍完成原上传、摘要、流式私有读取、跨账号隔离、文件类型验证、任务输入锁定、删除与两次清理；关闭选项另运行整条原流程通过。额外边界探测只调整一次性账号的限流窗口，不提高产品限额 |
| 类型 / 构建 | TypeScript、严格 Oxlint、Oxfmt 与默认配置检查通过；API 与中文文档构建通过，提交检查通过。前端源码和静态产物未变，文档保留既有体积提示 |
| 正常预览 | 仅重启本任务管理的 API / 文档，六项预览均 200；主库仍为授权 0012 / 13 条迁移、可选模块关闭，原普通已验证账号、20 积分、4 文件及成功任务 / 一次尝试保持；实际浏览器刷新原任务正常显示 |
| 清理与文档 | 一次性数据库、Worker、R2 文件和专用目录已清理；捕获日志没有合成私钥或验证请求头。中文验证码教程、计划和能力清单更新，实际 HTTP 文档逐字节等于最新构建产物 |

第一版验收程序把文件入口的嵌套错误对象误读成字符串，修正为已有 `error.code` 后才复现传输问题；没有为此改变产品响应格式。实际期限断言和五种动作测试补齐后，再运行开启 / 关闭的原生流程与完整测试。所有验证码供应商请求均被截获，没有下载真实 widget、完成验证码或连接 Cloudflare；本次文件入口证据不扩大为真实任务 / 支付 / 营销 widget 验收。证据留在忽略的 `.local/turnstile-worker-*`。

继续核对 I14 客户归因的两个现有边界：积分包 Checkout 当前没有 `customer` 参数，不能仅更新订阅客户便宣称覆盖积分包；已尝试结账可能失去响应，不能在重试时增加参数、改变原幂等正文。官方公开推荐 API 只有已核实的列表 / 客户过滤，未核实按 UUID 获取单条的接口；后续不能以猜测地址验证。上述要求已补入[联盟教程](./affiliates)，尚未实现访客或客户绑定。

**下一项：** 继续 I14 的真实推荐 UUID 核查、主动选择 / 过期、个人 / 团队客户绑定和首次结账参数保存，再补安全恢复与漏事件对账。真实 CAPTCHA、客服、支付 / 邮件 / 身份服务、I15 云端运行与 I16 第二产品仍保留完整范围；主库后续可选迁移不自动应用。

## 2026-10-11：I14 登录后的个人 / 团队推荐绑定后端

**状态：绑定后端已本地验收，I14 与完整 I0—I16 目标继续进行。** 接续记录 `aeded66b`，功能提交 `7997e474`。官方客户元数据方案落到受保护的 API：用户明确选择个人或当前团队、提交 `accepted: true` 与推荐 UUID，经官方推荐列表核实后，只向本站已授权账单客户写入 `metadata.referral`。浏览器采集和设置界面尚未接入；没有改变原积分包 / 订阅 Checkout、`client_reference_id` 或旧请求正文，不将这个阶段称为完整购买归因。

当前公开接口是推荐列表，没有使用猜测的单条 UUID 地址。列表最多三页、每页 100 项，核对计划 / 推荐者、商户 / 客户、转化、停用和有效期；超出范围表示无法核查，不推断为不存在。首次有效选择固定范围、推荐与客户；缺客户时等待既有账单流程，不由联盟接口创建客户。数据库唯一约束限制跨范围复用，客户多归属、客户被替换、已有不同元数据、旧付款或未解决结账均拒绝。

团队必须是会话当前选择，并以新鲜成员记录确认 owner / admin；个人选择不能夹带团队 ID。外部读取后再次锁定归属 / 成员，元数据写入期间保留锁至事务结束。原操作者只作历史证据，不代替后续授权。对外只返回状态 / 次数 / 核对时间，数据库或供应商错误不暴露查询、客户或密钥。

绑定有 `awaiting_customer / pending / attached / review` 状态，最多八次、90 秒租约、每用户每分钟五次写入；固定绑定 ID 产生写入幂等键。外部接受但响应丢失后，重读固定客户的相同元数据即可恢复，不重复写入；此前接受的结果不会因原访客随后过期而丢失，尚未写入的过期推荐仍拒绝。当前由原账户显式重试，没有绑定定时扫描或人工重放入口。`attached` 只记录曾核实的元数据结果，不表示实时状态、佣金产生或到账。

| 验收 | 结果与边界 |
| --- | --- |
| 全量 Vitest | 91 个文件、889 项通过；新增绑定 27 项覆盖默认关闭、无效 / 过期 / 跨计划推荐、分页范围、明确团队 / 权限、旧付款 / 未解决或异步付款、异常历史、客户多归属 / 替换、丢响应恢复、等待客户、次数上限和错误脱敏 |
| 迁移历史 | 0000—0026 SQL、快照与原 journal 条目逐字节保持，只追加 0027；Drizzle 检查通过。实际一次性 PostgreSQL 先迁移至 0026、建立普通账号 / 积分余额 / 联盟事件，再升级至 0027，原数据逐字段保持，新绑定表初始为空 |
| 实际生产 Worker | `bun affiliates:validate-bindings` 使用真实 workerd、一次性本地 PostgreSQL 和受控供应商协议；关闭时旧结构没有绑定表仍能查询 / 拒绝写入。启用后 Origin 不符 403、未明确选择 400；八个并发请求只产生一条绑定和一次元数据写入，其余由租约 / 每分钟限额处理 |
| 恢复 / 拒绝 | 在受控供应商已接受元数据之后主动丢失响应，实际销毁 / 重启 Worker；原访客过期后重试仍确认原结果，尝试数为 2、写入数保持 1、其他元数据保留。缺客户等待、客户出现后绑定；已付款、旧结账或其他推荐元数据均转复核，不发生元数据 POST |
| 团队与 PostgreSQL 锁 | 供应商读取后、写入前真实降为 member，返回 403 且无 POST。另一场景在固定客户 POST 内暂停，独立 PostgreSQL 连接修改组织成员，实际观察 `pg_stat_activity.wait_event_type = Lock`；释放供应商后绑定提交、降权完成，旧会话再查询 / 写入均拒绝。推荐存于团队，原管理员个人不承接 |
| 既有联盟回归 | 再运行 `bun affiliates:validate`，签名 / 并发去重、当前资源 / 退款、Worker 重启、结算成员 / 全退 / 旧通知、重定向拒绝与八次上限通过；这条回调验证仍只允许受控 GET |
| 检查与构建 | 完整 TypeScript、严格 Oxlint、Oxfmt、默认配置与 Drizzle 检查通过；邮件、产品公开页、工作台、独立官网、API 与中文文档构建通过，再按正常本地配置构建预览。保留既有文档体积提示和空案例集合提示，没有虚构独立案例 |
| 正常预览与清理 | 六项服务更新并返回 200；主库仍为授权 0012 / 13 项迁移，四个联盟表都不存在，模块关闭、回调 404、公开页无推荐追踪 SDK。原普通已验证账号、20 积分、4 文件、成功任务 / 一次尝试保持，实际浏览器刷新后继续显示 Completed 和原结果文件。中文教程响应逐字节等于构建，一次性数据库 / Worker / 文件已清理，正常配置未改 |

初版原生验证器误用了本站没有启用的 tRPC JSON 外层信封，按既有接口直接提交 input 后验收通过；验证器的积分主键和类型诊断也在运行前修正。业务代码另外补齐异步 / 不明金额历史拒绝、等待客户的归属冲突检查及对外数据库错误脱敏，随后重新通过最终全量测试和原生绑定验收。没有为通过验收提高产品限额或改变正常账号数据。

所有 Stripe / Rewardful 请求由受控协议截获。绑定验证只允许固定客户、单个 `metadata[referral]` 字段及固定幂等键的 POST；没有真实供应商访问、客户创建、Checkout 创建、积分发放、佣金生成、付款或云部署。捕获日志不含合成服务私钥、签名 secret、元数据正文或邮箱；证据留在忽略的 `.local/i14-binding-*`。首次选择之后的外部控制台并发修改、真实 Cookie / SDK、推荐生命周期和实际佣金仍待真实集成验收。

**下一项：** 接浏览器推荐采集和明确选择界面；将新积分包 / 订阅的归因客户参数在首次请求持久冻结，旧尝试与丢响应重试继续原正文，然后串联具体订单 / 佣金、人工恢复 / 漏事件对账和真实供应商验证。真实 CAPTCHA、客服、支付 / 邮件 / 身份服务、I15 云端运行与 I16 第二独立产品继续保留，主库后续可选迁移不自动执行。

## 2026-10-11：I14 公开推荐采集与个人 / 团队设置

**状态：进行中。** 实现 revision：`cc141871`。继已验收的推荐绑定后端，本轮加入公开采集页、设置界面及无浏览器 UUID 的保存后重试。中文教程和配置说明同步更新；完整 I0—I16 目标不标记完成。

`affiliates.tracking` 保留显式默认关闭和空公开 key。公开采集共用英文 / 西语页面与同一组文案定义，SDK 仅在推荐页由访客点击同意后加载。清除其他 URL 查询与 fragment，等待官方 `ready` 而非脚本 load；有效 UUID 才保存至当前标签页，按推广计划 / 商户 / 公开 key 隔离，24 小时上限不替代供应商有效期。没有 email convert、来源改写或工作台 SDK。清除候选不取消后台选择，也不承诺删除供应商 Cookie。

设置页分别展示个人和当前团队，首次选择需各自勾选确认；切换团队重置确认，旧请求只更新原范围。保存后的 `awaiting_customer / pending` 使用 `affiliates.retry`，只提交范围，后台读取不可变选择并重新核对 Origin、会话及数据库权限；浏览器丢失 UUID 不影响合法重试。显示核对时间的 `attached` 仍仅表示曾确认客户元数据，不宣称已计佣。

| 验收 | 结果与边界 |
| --- | --- |
| 全量回归 | 94 个文件、910 项通过。新增 21 项包含 SDK / 页面 / 设置及私钥误填保护；绑定共 29 项。覆盖未勾选、个人 / 团队隔离、过时工作区结果、权限错误、清除候选后重试、默认关闭、脚本故障、迟到事件、存储阻止和跨计划 / 时间边界 |
| 实际浏览器与原生服务 | `bun affiliates:validate-ui` 在一次性 PostgreSQL 和真实生产 workerd 中运行真实公开页 / 工作台构建。访问页面不加载 SDK；同意后只排队 ready，URL 不保留邮箱查询 / fragment，脚本无 Referrer。固定客户写入响应主动丢失后，个人 pending；清除本地候选再重试，确认 attached / 两次尝试 / 一次写入，团队仍无选择 |
| 故障与窄屏 | 西语按键触发受控 503；另一次真实延迟 ready 在超时后发生，页面仍失败且无候选。供应商事件报告证明迟到回调确已执行。320 / 390 像素无横向溢出，浅深主题与工具出口已检查；推荐故障后文本工具仍处理成功。工作台 DOM 无供应商脚本 |
| 后台回归 | 原生 UI 命令先完整重跑 0026→0027 保存原账号 / 余额 / 联盟事件、明确范围、并发、Worker 重启恢复和实际 PostgreSQL 成员锁验收。另运行 `bun affiliates:validate`，回调 / 当前资源 / 退款 / 结算 / 重启与上限验收通过，受控回调核查仍只用 GET |
| 检查与构建 | 完整类型、严格 lint、格式、配置与 Drizzle 检查通过；Astro 113 文件无错误 / 警告 / 提示。邮件、官网、产品公开页、工作台、API 与中文文档构建通过，并按正常本地配置重建预览。生成站默认关闭采集并清空原公开 key |
| 主预览与清理 | 六项正常服务重启并可用，中文教程响应逐字节等于构建。主库仍为 0012 / 13 条迁移，无四个联盟表；普通账号、20 积分、4 文件和原成功任务 / 一次尝试保持，浏览器刷新后仍显示 Completed 及原结果文件。自己的临时 Worker / 数据库 / 文件均清理，无供应商或云端访问 |

初次浏览器验证发现验收代理保留了 Bun 已解压响应的 gzip 头，已修正；SDK 地址替换改为覆盖全部出现位置。一次延迟验收过早离开页面，未得到回调报告，不计作通过；最终完整重跑，等待实际事件报告后确认超时界面仍未成功。首次全量回归中既有任务并发测试超时并连带失败，未放宽限额或超时；最终完整回归 910 项通过。界面截图留在忽略的 `.local/evidence/i14-referral/`，日志与构建证据在 `.local/i14-referral-*`。

**下一项：** 将新积分包 / 订阅的归因客户参数在首次创建时持久冻结；旧尝试和外部接受但丢响应的重试沿用原正文。随后串联购买订单 / 佣金、人工恢复、漏回调对账及真实 Rewardful / Stripe 环境验收。实际 Cookie / SDK、真实归因、付款 / 退款和银行结算仍未外部验收；主库可选迁移不自动执行，I15 云端与 I16 第二独立产品继续保留。

## 2026-10-11：I14 首次结账冻结与共享支付客户

**状态：进行中。** 实现 revision：`f775b08a`。新积分包与个人 / 团队订阅已共用首次选择快照和账单客户创建记录，真实供应商、订单 / 佣金联查和人工恢复仍待实现与验收；完整 I0—I16 范围不标记完成。主预览仍保留已批准的 0012。

只追加 0028 的 `affiliate_checkout` 与 `affiliate_customer_request`，历史 0000—0027 SQL、快照和原 journal 条目保持。新尝试在首次准备时固定账单范围、推荐选择、推广计划、商户 / 模式和已有客户。新选择不会补写旧尝试；启用前的积分购买继续原来没有客户参数的正文。完整 Checkout 参数与摘要在 POST 前保存，个人归属、团队归属和 `client_reference_id` 保持原有含义。

开启联盟时注册不提前创建 Stripe 客户；首次购买按账单账户保存唯一创建请求，积分和订阅共用。客户创建响应丢失后，即使名称 / 邮箱改变也沿用原请求；成功提交客户后擦除创建正文中的名称 / 邮箱。团队只发送团队名称和组织归属，不发送管理员邮箱。未知结果超过 24 小时或八次尝试上限后等待复核，不换新键创建客户。本站客户被替换、当前推荐元数据不匹配、模式 / 商户变化、请求损坏、成员降权或账户封禁时拒绝继续 POST。

已明确保存的推荐在新结账前绑定固定客户。结账发送前重读 Stripe 客户及本站唯一归属，数据库客户和成员锁覆盖有超时限制的 provider POST。既有 `attached` 不能代替当前元数据核对。原请求正文已固定的场景，关联盟模块后仍能恢复原 Checkout，不再做推荐绑定；尚未准备好的客户 / 绑定需恢复配置后继续。购买接口超出每分钟限额现在明确返回 429。

| 验收 | 结果与边界 |
| --- | --- |
| 全量回归 | 95 个文件、927 项通过；新增 17 项首次结账测试覆盖积分 / 个人与团队订阅、已选 / 后选推荐、资料变更、同键正文、丢响应、关模块恢复、旧请求不补写、24 小时未知结果拒绝、商户变化、客户替换、记录损坏、账户封禁、团队移除及替换管理员仍沿用原操作者元数据 |
| 真实迁移与 Worker | `bun affiliates:validate-checkouts` 使用独立实际 PostgreSQL 先迁移至 0027，保存普通账号、初始积分与旧购买，再升级 0028；逐字段保持。生产 workerd 真实注册不创建客户，明确选择后首次积分创建 / 绑定 / Checkout 路径通过 |
| 实际重启恢复 | 供应商接受客户创建后主动丢响应，修改账号名称并销毁 / 重启 Worker，继续同创建正文与键；再次接受 Checkout 后丢响应，关模块并重启，继续同 Checkout 正文与键。个人订阅共用已创建客户，实际 Better Auth 首购接受后丢响应，重启后恢复原结账 |
| 并发与权限锁 | 八个实际认证购买请求，只为新账单账户创建一个客户，其他由租约 / 限额处理。团队结账 POST 内暂停，独立 PostgreSQL 连接修改成员角色，实际观察 Lock 等待；结账提交后降权完成，原会话再写返回 403，无额外 provider POST |
| 原有联盟回归 | `bun affiliates:validate-bindings` 和 `bun affiliates:validate` 通过，覆盖明确绑定、原响应恢复、真实成员锁、签名 / 回调去重、当前佣金 / 退款及结算成员核查、Worker 重启和八次上限 |
| 检查与构建 | 完整类型、严格 lint、格式、默认配置、Drizzle 迁移检查通过；邮件、独立官网、产品公开页、工作台、API、正常预览与中文文档构建通过。原案例集合为空和文档体积提示保留，没有填充虚假案例 |
| 主预览与清理 | 六项正常服务重启并返回 200，中文联盟教程响应与构建一致。主库仍为 0012 / 13 条迁移，新结账和客户创建表不存在；普通已验证账号、20 积分、4 文件、成功任务及一次尝试保持。临时数据库 / Worker / 文件均已清理，配置字节不变，捕获日志不含合成密钥或客户正文 |

初版验收器把 Better Auth 捕获的 Checkout 故障状态误按 500 判断，修正为既有 400，并确认供应商确已接受请求后才计入恢复验收。普通账号的初始免费积分与购买积分分开核对，修正验收基线；并发验收发现购买限流原先会落入 500，已修正为 429，没有提高限额。生成迁移的新增快照 / journal 已按项目格式整理，旧迁移逐字节核对保持。

所有 Stripe / Rewardful 请求都由受控本地协议截获，仅允许固定客户创建、明确推荐元数据和受控 Checkout。没有访问真实供应商、真实付款、购买积分发放、佣金生成、转账或云部署。原生证据保存在忽略的 `.local/i14-checkout-*`。

**下一项：** 串联已核查佣金、Stripe Charge 与具体积分购买 / 订阅订单，展示可追溯的归属和退款复核；继续补人工恢复、漏回调对账与真实 Rewardful / Stripe 验收。I15 云端与 I16 第二独立产品、真实身份 / 邮件 / CAPTCHA / 客服仍保留，不自动升级主库的后续可选结构。

## 2026-10-11：I14 具体订单 / 佣金联查与只读管理证据

**状态：本阶段受控本地验收完成，I14 与完整 I0—I16 目标继续进行。** 接续记录 `43492caa`。供应商财务快照与本站订单关联分开保存；财务回调仅排队，不追加整条订单核查链路。既有维护入口最多处理三个到期记录，能从已保存财务资源补回漏写的排队记录。新管理页面仅供站点管理员读取，不转账、不自行计算佣金，也不以历史供应商 `paid` 声称银行到账。

积分包沿实际 Charge / PaymentIntent / 购买元数据 / 原冻结 Checkout 核对；订阅沿当前 InvoicePayment 的 PaymentIntent 过滤结果找具体已付发票、实际 Stripe 订阅及唯一原结账。最多 100 个分配 / 结账记录，不接受下一页、重复分配、部分金额、多发票、歧义结账或客户 / 元数据不符。原推荐需早于原结账；没有本站原选择或结账证据则保持无匹配，不补绑历史购买。

关联提交前重新锁定财务版本、操作租约、绑定、结账及本地订单；实际订阅编号和正文摘要都要与外部读取一致。已保存的订单归属不可被后来回调覆盖。退款等待本地结算，旧关联进入等待 / 复核仍保留历史编号并明确标注。成功后重置连续失败次数；每轮八次、90 秒租约和每批三个限制，最后未知结果转复核。

| 验收 | 结果与边界 |
| --- | --- |
| 完整回归 | 97 个文件、959 项通过；新增订单证据 26 项、管理面板 5 项和后台权限 1 项。覆盖个人积分 / 个人与团队订阅、付款与客户不符、发票 / 结账范围及歧义、退款同步、来源 / 租约变化、外部读取后的本地变更、历史归属保护、漏排队补建、连续失败和关闭模块不读可选表 |
| 增量数据库 | 只追加 0029—0031，0000—0028 SQL、快照及原 journal 条目保持。0029 保存独立关联；0030 加入实际订阅编号 / 正文摘要，旧已关联记录重新排队但保留历史事实；0031 明确拒绝部分空值，避免 SQL CHECK 的未知值放过不完整证据 |
| 实际 PostgreSQL / workerd | `bun affiliates:validate-orders` 实际从 0028 经 0029、0030 至 0031，普通账号、20 初始积分、历史已付购买、绑定及结账逐字段保持。预存 0029 已关联记录在 0030 转为待核查；八个并发签名通知仅一条事件 / 关联，实际积分与团队订阅链路、发票过滤参数通过 |
| 恢复与权限 | 本地退款滞后时保留原订单、显示等待；实际销毁并重启 Worker，本地结算后完成原关联。普通账号 403、负页码 400，当前管理员降权 / 封禁后同一旧会话 403；八次受控供应商故障转复核，新的财务版本开启新一轮 |
| 实际管理页面 | `--ui` 构建真实工作台并代理到自己的 Worker / 数据库；实际浏览器确认四种状态、历史订单标注、刷新和个人 / 团队 / 发票 / 测试金额。英文、西班牙语与哑光黑白主题已检查。浏览器只能访问本地；截图在忽略的 `.local/i14-orders-admin-*.jpg` |
| 原结账回归 | 另运行 `bun affiliates:validate-checkouts`，原普通账号 / 积分 / 旧购买保持；真实 Better Auth 结账、共享客户、响应丢失 / Worker 重启 / 关闭模块恢复、八请求单客户与 PostgreSQL 成员锁及降权拒绝仍通过；只读证据改造不改变付款正文 |
| 检查与构建 | 全类型、严格 lint、格式、离线配置和 Drizzle 检查通过；邮件、官网、公开产品、工作台、API、正常预览与中文文档构建通过。文档保留既有体积提示与空案例提示，没有填充虚构案例 |
| 正常预览与清理 | 六项正常服务已更新并可用；主库仍为授权 0012 / 13 项迁移，联盟可选表不存在，模块保持关闭。普通主账号、20 积分、4 文件、成功任务和一次尝试保持；临时 Worker、数据库与专用目录均清理，正常配置未改 |

初版历史列表多传了一个关联表参数，实际数据库测试立即检出并修正；既有联盟迁移测试也补齐新表恢复。全量并行回归发现已有订阅同意测试在准备跨秒时，预先构造的付款时间可能早于同意；改为在同意准备完成后生成测试付款时间，业务判断未放宽。证据空值约束在独立增量中加固，不改写已应用的历史迁移；随后最终全量与原生迁移验收通过。

所有供应商 HTTP 被截获，订单验收只允许 GET。该验收使用事先保存的历史付款事实，没有在此流程完成真实支付、购买积分发放或计佣；初始余额保持 20，账本无新增。原结账回归允许受控客户 / 元数据 / Checkout POST，仍没有真实付款、佣金生成、资金转移或云部署。真实 Rewardful / Stripe、来源 Cookie、实际推荐规则 / 延迟、外部退款与银行到账继续待验。证据保存在忽略的 `.local/i14-orders-*`，不写入仓库。

**下一项：** 补站点管理员的安全复核 / 恢复入口及审计，处理连续失败和待复核记录，再做漏回调对账与真实 Rewardful / Stripe 验收。I15 云端运行与 I16 第二独立产品、真实身份 / 邮件 / CAPTCHA / 客服仍保留；主库后续可选迁移不自动应用。

## 2026-10-11：I14 管理员复核、恢复与审计

**状态：进行中。** 本轮基于 `9e7ed0cf` 增量实现。已知佣金和结算可由站点管理员填写原因、检查确认内容、排队重新核查；提交与终态分开审计。完整 I0—I16 目标仍进行中，漏回调对账及真实供应商环境继续待验。

只追加 0032，原 0000—0031 SQL、快照及 journal 条目保持。原供应商事件默认保持 `rewardful` 来源，管理员请求记录独立 `administrator` 来源及历史操作者 / 会话 / 请求编号。队列使用原财务核查与订单证据维护入口；没有新增支付状态修改器、付款接口或并行执行框架。请求固定资源版本并保存原因，相同意图重试只返回原受理结果，不复位已完成工作；进行中的订单租约与未完成请求不能被新的意图覆盖。

排队、财务和订单核查的领取 / 提交都重新确认原管理员权限和实际近期会话；外部读取不占用权限锁，提交后仍需确认当前角色、封禁、验证和会话，降权 / 撤销 / 超过 24 小时转复核。佣金财务未核查时不消耗订单尝试次数；历史订单归属继续不可覆盖。每轮八次、90 秒租约、每批三个及原退避保持，维护补齐最后租约过期或中断后的终态审计。已完成任务的后续自动维护不再依赖旧管理员登录。

| 验收 | 结果与边界 |
| --- | --- |
| 回归与权限 | 全仓 98 文件、983 项通过。新增人工复核测试覆盖当前角色 / 封禁 / 验证 / 匿名 / 会话时效、领取后撤销、供应商读取后降权、原结账读取后撤销、并发幂等、版本与租约冲突、同版本恢复八次失败、无匹配和历史归属保护、结算独立复核、最终租约恢复及完成后正常维护。API 拒绝外站 Origin、普通用户、强制状态和超额请求 |
| 实际增量与 Worker | `bun affiliates:validate-orders --ui` 在一次性实际 PostgreSQL 经 0028—0032 升级，已有普通用户、20 初始积分、购买、选择和结账保持；0031 的历史供应商事件升级后来源保持。真实管理员接口并发重复意图只排队一次，销毁并重启生产 workerd 后完成原团队订单；结算独立核查留下请求 / 完成审计 |
| 实际浏览器 | 真实管理页面首次成功提交后主动丢响应，再次提交严格比较同一正文，后台只保留一次意图与终态。排队时显示等待、保留此前订单；执行原维护入口后显示完成及原订单。取消确认无写入，结算因相关佣金复核重新标为待核查；黑白主题、英 / 西文案、320 / 390 像素检查无横向溢出。截图在忽略的 `.local/i14-recovery-admin-*.jpg` |
| 检查与构建 | 类型、严格 lint、格式、配置、Drizzle 检查以及邮件、官网、公开页、API、工作台、正常预览和中文文档构建通过。原空案例和文档体积提示保留，没有编造真实站点 |
| 主预览与清理 | 正常六项服务更新后均可访问。主库保持 0012 / 13 项迁移，模块关闭、可选表不存在；普通用户、20 积分、4 文件、原成功任务及一次尝试保持。临时数据库 / Worker / 专用目录清理，正常配置未改；日志无合成密钥及客户正文 |

第一轮浏览器发现原后台验收已用满同一管理员每分钟五次请求，界面正确限流；最终浏览器验收改用自己的独立临时操作者，没有提高业务限额。响应主动损坏时最初显示解析错误，改为本地化的提交结果未确认提示，复验同意图重试和终态审计。一次第二轮验收启动早于上一轮退出，端口被占用；清理上一轮后完整重跑并通过，不把失败运行算作完成证据。

所有供应商 HTTP 截获，仅允许固定只读 GET；历史付款事实预先保存，没有真实支付、购买积分发放、计佣或转账，也没有云部署。主库未自动应用 0032。证据在忽略的 `.local/i14-recovery-*`，中文配置教程同步至 0032 的启用要求。

**下一项：** 完善有界漏回调对账和历史资源核查，再进入真实 Rewardful / Stripe 环境验证；I15 云端运行和 I16 第二独立产品继续保留。此前已授权的本地主库 0012 升级已完成，这一可选联盟增量继续在隔离环境验收。

## 2026-10-11：I14 有界漏回调补查与范围进度

**状态：本阶段受控本地验收完成，I14 与完整 I0—I16 目标继续进行。** 接续 `99aa5127`。管理员可选择佣金 / 结算、起始页、最多三页及原因，先检查确认内容再排队；进度、剩余范围和财务结果分别展示。复用原财务 / 订单维护入口，只增加发现进度和审计，没有新增支付状态修改器或并行财务执行框架。

只追加 0033，原 0000—0032 SQL、快照和 journal 条目逐字节保持。旧供应商 / 人工事件来源、历史操作者与结果保留；发现事件使用独立 `reconciliation` 来源，关联 `affiliate_scan`，不伪造签名通知。同一推广计划 / 商户 / 类型只允许一个进行中的范围；原意图重试返回已受理任务，不复位页码或完成结果。补查和人工复核共用五次 / 分钟限额。

每页最多 20 条，每次维护只读一个列表页，单次最多三页；页码、租约与重试持久保存。列表只发现编号，佣金跳过其他计划，结算仍逐个核对当前成员与商户；财务和精确订单关联由原队列分别完成。列表页成功重置连续失败次数，八次上限、90 秒租约和退避保持；最后租约过期可转复核。领取和提交均重查原管理员、近期会话和冻结的计划 / 商户 / 测试模式；读取期间撤销权限不能确认新财务资源。

官方接口按创建时间倒序分页，未核实到更新时间过滤或稳定快照游标；新记录可能使页码偏移。界面明确记录范围、发现数、财务核查 / 等待 / 复核数与未覆盖部分，不称为全量对账，也不把财务检查完成称为所有订单已核实。范围停止时保留此前等待计数，请求与终态分别审计。来源、核对日期与后续范围边界见[联盟教程](./affiliates)。

| 验收 | 结果与边界 |
| --- | --- |
| 全量回归 | 100 文件、1006 项通过。新增 18 项数据库补查、4 项管理面板和 1 项后台接口测试；覆盖漏回调找回原订单、列表 / 财务分阶段、重复提交、三页上限及跨页去重、其他计划、结算成员、读取前后权限 / 会话撤销、配置变化、坏分页、租约替换、八次失败、最后租约恢复、部分范围停止的等待计数、来源约束及默认关闭 |
| 实际数据库与运行时 | `bun affiliates:validate-orders` 实际升级 0028—0033；单独保存 0032 人工任务，0033 后旧字段保持、新关联为空。普通账号、20 初始积分、历史购买、选择和冻结结账保持；实际 same-origin 接口拒绝普通 / 外站 / 强制状态，重复意图只排队一次。没有回调和本地财务记录时从列表发现资源；实际销毁 / 重启 workerd 后继续第二页，财务与原团队订单分别完成，积分账户及账本逐字段保持 |
| 实际浏览器 | `--scan-ui` 构建真实后台并代理至自己的实际 Worker / 数据库。取消不写入；成功提交后主动丢响应，再次提交严格比较同一正文，只保留一个任务 / 请求审计。原维护入口执行后显示所选范围结束与真实财务计数，终态审计通过；英 / 西文案、哑光黑白和 320 / 390 像素无横向溢出。截图在忽略的 `.local/i14-scan-admin-*.jpg` |
| 检查与构建 | 完整类型、严格 lint、格式、默认配置与 Drizzle 检查通过；邮件、官网、公开页、API、工作台、正常预览和中文文档构建通过。原空案例及文档体积提示保留，没有编造真实产品案例 |
| 主预览与清理 | 六项正常服务更新后可访问；主库仍为授权 0012 / 13 条迁移，模块关闭、新联盟结构未应用。普通用户、20 积分、4 文件、原成功任务及一次尝试保持；一次性数据库 / Worker / 专用目录清理，正常配置字节保持 |

初次迁移验收比较包含新列的整行，检出预期新增空关联；改为比较所有旧字段并明确验证新关联为空，没有跳过来源与历史操作者验证。既有增量迁移测试恢复时漏删新进度表，已补齐原测试的清理，再完成最终全量回归。新审计变更没有账户前后状态，原账户审计消费者增加明确类型判断，不加入虚构状态字段。初次类型 / lint 检出测试输入声明与未使用导入，修正后全部检查通过。

所有供应商 HTTP 截获，只允许固定只读 GET。历史付款事实预先保存，没有真实支付、购买积分发放、计佣、转账或云部署；主库未自动升级 0033。证据在忽略的 `.local/i14-scan-*`，中文教程已同步启用结构及分页边界。此前授权的本地主库 0012 升级已完成，不重复迁移。

**下一项：** 准备真实 Rewardful / Stripe 的配置和验收清单，核对真实 SDK、Cookie、购买 / 退款、计佣及供应商延迟；继续 I15 云端运行准备与 I16 第二独立产品。真实环境未验前保持可选模块关闭，不以受控数据宣称真实盈利或银行到账。

## 2026-10-11：I15 资源清单与发布前离线检查

**状态：离线准备阶段已验证，I15 云端运行与完整 I0—I16 目标继续进行。** 接续 `5a289e24`。原配置仅在开发环境声明文件存储、任务 / 死信消费者和定时维护，测试 / 正式环境仍缺失；现按环境补齐声明，不创建实际云资源。Terraform 继续只拥有 Hyperdrive 与可选 R2，Wrangler 负责 Worker / 域名 / 绑定 / 维护入口，队列创建由操作者单独执行。

新增 `bun deploy:check --target staging|production`，输出非秘密资源清单与字段问题。检查 Worker / 服务目标、资源缺失与环境串用、Hyperdrive 占位编号、存储桶命名、主队列 / 死信对应、维护入口、公开域名和发信地址。`--artifacts` 要求三个非空入口，并检查首页唯一规范链接与目标域名相同；不宣称已验证所有 SEO 页面或真实账号 / 供应商。当前模板的示例配置必须失败，正常本地预览继续可用。

发布脚本先检查资源，再以目标域名构建、检查产物，最后执行原 API → App → Web 顺序；仍不迁移数据库。持续集成仅在原已开启的发布任务选择实际目标域名，构建与部署记录共用该地址；恢复产物后的资源检查位于原远程迁移之前。纯检查任务保持可在占位配置下执行，没有自动开启发布。生成器云端 `STORAGE` 名改为 `{站点编号}-{环境}-uploads`，对齐 Terraform，保留开发命名与碰撞拒绝。

| 验收 | 结果与边界 |
| --- | --- |
| 回归与静态检查 | 全仓 101 文件、1028 项通过；类型、严格 lint、格式、默认配置和 Drizzle 检查通过。资源 / 产物测试包含缺绑定、环境串用、非继承变量 / 秘密名、示例值、私密输入不进入诊断、错误 / 重复规范链接及二次生成资源隔离 |
| 实际入口检查 | 对当前示例配置执行测试 / 正式资源命令和原发布脚本，均在构建 / 上传前退出；没有调用上传或数据库迁移。工作流 YAML 可解析，检查步骤先于迁移，两个部署地址均来自已校验构建目标 |
| 实际构建与离线打包 | 实际公开页使用测试 HTTPS 地址构建，目标产物检查通过、另一环境失败；随后完整重建本地预览。三个 Worker 的测试 / 正式环境共六次真实 Wrangler 离线打包通过，仅临时配置使用合成 Hyperdrive 编号，未上传或创建云资源 |
| 中文文档与预览 | 部署、环境变量、生成站教程与计划状态同步；中文文档构建通过。主库与六项预览检查见本轮本地记录，迁移没有变化 |

初次离线验收脚本的依赖路径指向根目录，修正为脚本工作区依赖后执行。第一次同时验证旧本地产物和构建目标产物，目标构建先完成，旧产物断言因此失败；改为先验证目标通过 / 另一环境拒绝，再恢复本地构建，最终顺序验收通过。没有把失败运行计入完成证据。

所有离线打包使用临时配置、隔离工作目录和不含业务 / 云端凭据的进程变量，临时目录清理。证据在忽略的 `.local/i15-*`。未执行 Terraform 计划 / 应用、云资源创建、远程迁移、真实供应商调用或 Worker 上传；不以配置中的资源名证明资源存在。规则与后续真实验收清单见[部署教程](./deployment)。

**下一项：** 准备明确的真实测试环境与供应商配置，完成实际数据库 / 存储 / 队列 / 登录 / 支付流程、备份恢复及成本记录；I14 真实供应商和 I16 第二独立产品继续保留。此前本地主库 0012 升级已经完成，不重复应用新可选迁移。

## 2026-10-11：I15 完整数据库归档与独立空库恢复

**状态：数据库部分已实际本地验收，I15 云端 / 对象恢复与完整 I0—I16 目标继续进行。** 接续 `8a07dfd2`。原导出默认只有结构，新增 `db:backup`、命名环境备份、`db:restore` 和实际 `db:validate-backups`。没有把原导出默认行为改成写入恢复，也不自动创建 / 清空目标或进入发布流程。

备份通过只读可重复读事务导出快照，表数据摘要与真实 `pg_dump` 读取同一快照，包含完整数据、结构及迁移记录。归档 SHA-256、大小、来源指纹、版本、时间和每表行数 / 数据摘要保存在私有清单，不保存连接、密码或客户正文。逐表排序并流式计算摘要，需要额外扫描；没有宣称零成本或零负载。临时归档仅在成功后发布为唯一目录，文件 600、目录 700。

恢复先校验文件 / 清单，再拒绝源数据库和非空目标；实际 `pg_restore` 不使用清空 / 建库选项，单事务执行，之后核对全表清单、行数与数据摘要。恢复只读取根目录 `.env.restore.local` 的独立目标，不沿用来源或 shell 地址。客户端连接通过明确环境字段传递，密码不进入参数；原始数据库 / 客户端错误不输出。对象所有者和 ACL 不照搬，后续需检查自己的应用角色与绑定。

新站生成器同时排除默认备份目录、归档文件、快照及临时目录，二次生成实际不复制源站备份；忽略规则也覆盖归档与恢复环境文件。没有修改历史迁移。R2 对象、队列消息、Worker Secrets、集群角色和恢复时间点后的供应商事实仍需另行处理，不能以数据库 `ready` 元数据证明文件存在。

| 验收 | 结果与边界 |
| --- | --- |
| 回归与检查 | 全仓 102 文件、1035 项通过；类型、严格 lint、格式、默认配置与 Drizzle 检查通过。7 项归档单测涵盖来源指纹、连接字段、诊断不含私密输入、损坏文件、源库拒绝及无效清单；生成器实际二次复制不带入源归档 |
| 实际 PostgreSQL 与工具 | 创建三个自有回环临时库；源库完整应用 0000—0033 并保存账号、文件、配额、成功任务 / 尝试、积分账本与购买。最终备份期间有 58 次已提交并发更新，恢复后的账户余额与账本一致；全表摘要、34 条迁移、序列、约束与外键均通过核对 |
| 拒绝与故障清理 | 原库、已有数据目标、空自定义模式 / 函数目标均拒绝；损坏归档在目标写入前拒绝。缺客户端时清理本次部分归档，没有发布完成目录。恢复不覆盖或删除已有数据 |
| 实际命令环境 | 隔离目录执行真实备份 / 恢复命令，测试来源文件覆盖错误的 shell 地址，独立恢复文件覆盖错误的 shell 目标；恢复文件缺失明确失败。归档私有权限、清单不含客户正文 / 对象路径及输出不含连接 / 合成私人内容通过 |
| 中文文档与主预览 | 新增[数据库备份与恢复](./backup-restore)并接侧栏；部署、复制新站、数据库概览及计划同步。正常主库仍为已授权 0012 / 13 条迁移，普通账号、20 积分、4 文件和原成功任务保留；自有临时数据库、归档与测试环境文件清理 |

第一轮实际验收发现跨模式表标识符被误当成单独标识符，修正为分别转义模式与表，再通过全表恢复。缺客户端验收发现运行时默认路径查询未使用修改后的 PATH，改为显式传入当前路径并复验，失败归档清理通过。失败运行不计入完成证据；临时资源仍经原清理路径删除。

证据在忽略的 `.local/i15-backup-*`。没有连接远程数据库、创建云资源、调用真实供应商、复制 R2 对象或上传归档；不把本地数据库恢复称为完整云端灾备。恢复教程明确权限重新安排、文件核查与供应商对账后再接业务流量。

**下一项：** 补文件对象与数据库的共同恢复验收，以及明确真实环境后的云端完整流程、备份策略、恢复耗时与成本记录；I14 真实供应商和 I16 两个真实独立产品继续按原计划推进。

## 2026-10-11：I15 冻结文件检查点与私有结果共同恢复

**状态：受控本地文件 / 数据库共同恢复已验证，I15 真实云端运行及完整 I0—I16 目标继续进行。** 接续 `c45785fe`。复用已完成的数据库归档 / 恢复与原私有文件、任务、积分入口，增加对象检查点函数和实际 `files:validate-backups`。没有新增公开文件搬运接口、另起任务执行框架或修改数据迁移。

对象清单绑定具体数据库归档 SHA-256 及冻结的 `ready` 文件引用；只在源对象长度、类型、元数据与内容 SHA-256 一致后发布唯一私有目录。单文件 16 MiB、最多 100,000 引用、清单 64 MiB，按文件读取；目录 700、内容与清单 600。对象键保存在私有对象清单，不写业务日志；编号派生本机文件名，拒绝重复与路径形编号。新站生成器与忽略规则也排除对象检查点，实际二次复制不带入源归档。

恢复先确认对应数据库与冻结引用，并校验每个本地内容文件，再要求独立空桶，使用条件写入避免覆盖并发对象，读回核对完整内容，恢复原文件接口所需的类型 / 编号 / 摘要元数据。缺失、损坏或换错清单不写目标；中途存储失败可能留下部分目标对象，保持隔离，不自动清空或删除已有对象。来源停写 / 停消费仍是操作者的前置安排，函数不承诺跨数据库与 R2 原子事务。

| 验收 | 结果与边界 |
| --- | --- |
| 回归与检查 | 全仓 103 文件、1044 项通过；类型、严格 lint、格式、默认配置与 Drizzle 检查通过。9 项对象检查点测试涵盖正常字节 / 元数据、缺失 / 损坏源、全部本地文件先校验、错误数据库 / 引用、并发目标保留、路径 / 重复拒绝及部分写入保留；原生成器实际不复制对象归档 |
| 实际任务与共同归档 | 自有两个回环数据库完整迁移、两个隔离本地 Worker / R2；实际注册两用户、上传、取得报价并确认，任务扣 3 积分、成功结算为 17，原执行次数 1。数据库归档恢复通过全表摘要，再按恢复后的文件引用归档两个真实输入 / 结果对象，不造文件元数据冒充实际对象 |
| 故障与保护 | 受控破坏源内容时不发布完整检查点，临时目录清理；损坏本地内容时目标桶仍为空。已占用桶拒绝；实际 R2 对已有键的条件写入返回未写入并保留原对象，未覆盖或删除源数据 |
| 原工作流与重启 | 恢复后原用户经原私有文件接口下载正确结果，匿名 401、另一用户 404、私有不缓存响应；同一原任务请求重放三次仍是原编号，多轮维护不再次执行 / 扣费，账本与账户保持。实际销毁并重启目标 Worker 后原结果仍可下载 |
| 主预览与中文教程 | 数据库恢复教程扩展文件检查点、范围 / 限制与可执行验收入口，部署、计划及能力表同步。主库保持授权 0012 / 13 条迁移，普通用户、20 积分、4 文件与原成功任务不变；自有数据库、归档、R2 / Worker 目录与会话清理 |

第一次实际任务请求漏带报价确认，原计费入口正确返回 409。验收改为通过原报价接口取得并确认价格，未关闭确认门禁或降低计费要求；最终任务、扣费和恢复通过。数据与文件验证复用原任务 / 文件入口，没有为验收增加强制成功或越权下载路径。

证据在忽略的 `.local/i15-files-*`。所有网络出口受控，源 / 目标只使用自有回环数据库与本地 R2，没有调用真实支付、模型或云端服务。数据库原清单的 `externalObjectsIncluded: false` 保留，文件在独立目录；`db:backup` / `db:restore` 不自动为任意云桶搬运文件。操作步骤、对象清单隐私与暂停来源的边界见[恢复教程](./backup-restore)。

**下一项：** 准备明确真实测试环境后的云端传输 / 恢复、保留删除策略、权限与资源绑定、供应商对账和成本记录；I14 真实供应商与 I16 两个真实独立产品继续保留。

## 2026-10-11：I15 本机归档保留预览与人工清理

**状态：本机保留 / 清理与清理后实际恢复已验，真实云端运行及完整 I0—I16 目标继续进行。** 接续 `077d5b2e`。新增 `db:backup:prune`，默认仅预览，必须明确选择目录、保留数与年龄，再以 `--apply` 执行；没有定时清理、云端生命周期设置或连接数据库的清理分支。复用原归档格式与完整内容摘要，不增加备份状态数据库或另一套归档引擎。

来源指纹与环境分别计算保留数，至少保留每组最新的一份校验通过归档；最近年龄窗口内的归档全部保留，只有数量与年龄条件都满足时才列为删除。损坏的最新归档不占有效保留名额，未来 / 倒置时间、未知内容、链接、未完成目录均保留或跳过。清理快照时数据库与同目录配套文件检查点一起移除；不改写保留归档，也不操作线上 R2 / 队列。

实际执行前重新校验全部保留与待删集合，变化在首次删除前拒绝。没有跨进程锁或文件系统事务，其他备份 / 恢复 / 搬运操作仍需暂停；中途文件系统失败可能已移除部分快照，报告完整移除数量并停止。不以 SHA 校验或保留数量宣称已通过实际恢复，也不认证配套对象内容完整。

| 验收 | 结果与边界 |
| --- | --- |
| 回归与检查 | 全仓 104 文件、1055 项通过；类型、严格 lint、格式、默认配置与 Drizzle 检查通过。新增 11 项保留测试覆盖分组、数量与年龄、边界、损坏最新归档、未知 / 未来条目、链接、配套对象删除及保留 / 待删 / 新增集合变化前拒绝；生成器实际二次生成带入新命令与相同保留实现，不带源归档 |
| 实际 PostgreSQL | 两个自有回环数据库，完整迁移后生成三份真实归档。采用模拟的未来策略时钟达到年龄条件，不修改归档捕获时间或内容；实际移除两份后，保留归档在空库真实恢复，全表摘要、34 条迁移、22 积分余额与账本核对通过 |
| 实际命令 | 通过根命令的数据库工作区转发执行预览，目录逐项保持；非法保留数拒绝且不删除。清理后再次运行 `--apply` 移除数为零；进程提供不可用数据库连接，清理命令仍完成且不使用数据库。捕获输出不含连接、邮箱或合成私人正文 |
| 教程与主预览 | 中文恢复教程补齐命令、路径、分组、对象共同删除、暂停其他操作、部分失败和真实云端边界；部署、计划与能力表同步。六项预览更新，主库保持授权 0012 / 13 条迁移、普通用户、20 积分、4 文件和原成功任务 / 一次尝试；自有临时数据库与归档目录清理 |

初次测试将文件存在性检查的成功返回固定为 `undefined`，当前 Bun 返回 `null`，导致断言失败；改为验证检查正常完成与实际目录保留 / 删除，再完成全量回归，没有放宽归档、变化或分组规则。实际命令验收随后改为走根目录转发入口，确认教程所列命令可用。

证据在忽略的 `.local/i15-retention-*`。本轮只删除自有一次性验收归档，没有删除用户正常备份、迁移主库、创建云资源或调用真实供应商。保留策略不替代近期实际恢复验收、独立副本和外部付款对账，详见[中文教程](./backup-restore)。

**下一项：** 确定真实测试环境后完成云端传输 / 恢复、实际保留 / 删除与成本记录，补密钥轮换与权限验收；I14 真实供应商及 I16 两个真实独立产品继续按原计划保留。

## 2026-10-11：I15 认证版本密钥与实际重启轮换

**状态：认证轮换已完成受控本地验收，真实云端权限 / 轮换与完整 I0—I16 目标继续进行。** 接续 `2ebb2cb4`。当前库支持版本密钥，但模板原契约只有单一值；新增可选 `BETTER_AUTH_SECRETS`，复用 Better Auth 1.7.4 的 `secrets`，不另写加密算法、Cookie 鉴权或密钥服务。

显式配置一至十个唯一版本 / 不同密钥，第一个用于新认证数据；版本必须是非负安全整数，密钥为 32—1024 字符且无空白，诊断只输出编号与字段。未配置时明确版本 0 和原基础密钥，避免库另选进程中的密钥列表；旧格式读取保留基础密钥后备。生产 / 测试环境各旧版本占位值也拒绝，示例仅增加空的可选字段，没有分发密钥或修改正常主预览值。

实际安装版本只用当前密钥验证会话 Cookie；旧版本读取加密数据不代表旧登录持续有效。模板自己的营销链接、任务接收人和运营目标摘要继续使用 `BETTER_AUTH_SECRET`，不会自动跟随认证当前版本；过渡保持基础用途，撤销旧基础密钥需要另外处理链接与选择，不用旧密钥仍在后备中宣称已撤销。

| 验收 | 结果与边界 |
| --- | --- |
| 全量回归 | 104 文件、1060 项通过。新增 2 项实际认证库配置 / 加解密测试、2 项环境输入测试和 1 项营销链接测试：显式版本不读其他进程列表、旧格式与版本 0 读取、版本 1 写入 / 撤销旧版、坏列表与私密错误、非开发环境旧占位值、基础用途过渡与撤销拒绝 |
| 实际 Worker / 数据库 | 自有回环数据库完整迁移，独立 Worker / R2；实际注册、上传、报价确认、扣 3 积分、任务成功和私有结果下载。销毁 / 重启两次；当前密钥切换时旧 Cookie 401，原密码重新登录成功；只删除旧密钥且当前不变时新 Cookie 继续下载。原任务请求重放仍原编号 / 一次尝试，账号仍普通用户，账户 / 账本逐字段保持 17，无重复执行或扣费 |
| 邮件边界与诊断 | 自有邮箱资格记录仅为合成验收条件，不冒充外部邮箱验证。实际选择接口确认后过渡期仍有效，基础密钥撤销后有效选择关闭、旧 revision 保留，原设置重新明确确认成功。实际合法 / 非法配置诊断只输出编号 / 字段，不含密钥、连接、邮箱、密码或输入正文 |
| 构建与主预览 | 类型、严格 lint、格式、默认配置与 Drizzle 检查通过；完整本地预览与中文文档构建通过。新增中文轮换教程并接侧栏，环境、部署、计划和能力表同步。六项预览更新，主库保持授权 0012 / 13 条迁移、普通账号、20 积分、4 文件及原任务 / 一次尝试；自有数据库、Worker / R2 目录、邮件与会话清理 |

没有将新版官方网站的 Cookie 兼容说明直接当成本项目安装版本证据；检查实际包的当前密钥验证路径，再在 workerd 中证明旧 Cookie 拒绝与原密码可用。认证库旧格式 / 带版本解密由实际库验证，未以自写模拟算法替代；没有添加 Cookie 旧密钥绕过或降低鉴权要求。

证据在忽略的 `.local/i15-rotation-*`。真实 OAuth / Passkey 回跳、云端发布、历史密文批量处理、外部投递、数据库角色与供应商凭据仍待实际环境；营销旧链接失效也不等于用户已退订，需安排可用退订通道。操作边界及复验入口见[认证密钥轮换](./auth-key-rotation)。

**下一项：** 验收数据库应用角色、凭据变更与连接边界，再在明确真实测试环境后完成绑定 / 密钥 / 外部服务与恢复成本；I14 真实供应商和 I16 两个真实独立产品保留原范围。

## 2026-10-11：I15 数据库应用角色与密码连接边界

**状态：受限应用角色、密码认证、授权回滚和原业务恢复已本地验收，真实云端及完整 I0—I16 目标继续进行。** 接续 `17beecda`。补强原 `db/scripts/grant-app-role.sql`，新增 `db:validate-app-role`；复用原迁移、账号、文件、队列与积分入口，没有新增公开角色管理接口、权限框架或数据迁移。

授权要求实际数据库 / 公共对象所有者运行，检查已有角色的特权属性、成员关系、全局对象所有权、数据库直接授权，以及所选库的模式、表 / 序列、列、函数与默认授权。拒绝额外权限与混合对象所有者，避免仅警告而部分跳过授权。创建角色、新密码、当前与默认权限放在同一事务中；新密码通过 `psql` 交互设置，不放明文参数 / SQL，旧 `-v password` 被拒绝。已有角色重复授权保持原密码。

| 验收 | 结果与边界 |
| --- | --- |
| 回归与检查 | 全仓 104 文件、1060 项通过；类型、严格 lint、格式、默认配置与 Drizzle 检查通过。中文教程构建通过；本轮权限不由 PGlite 或模拟密码认证代替，使用 PostgreSQL 17 的实际 SCRAM 实例 |
| 自有权限实例 | 仅回环监听，独立目录、所有者及两份完整迁移；应用角色实际业务读写与未来表 / 序列可用。建表、模式、临时表、修改 / 删除表、清空表、重置序列和读取迁移记录拒绝；两库分别加固后另一环境账号连接拒绝，错误密码拒绝 |
| 预检查与回滚 | 已有其他库对象所有者、额外建表 / 清空表 / 函数 / 默认权限、继承所有者代运行及公共表混合所有者拒绝。受控最后默认授权失败时，新角色未留下、原数据库 / 模式 / 表授权保持不变 |
| 真实受限业务 | Worker 使用应用角色，实际注册普通用户、上传、报价确认、队列任务扣 3 积分、成功结算为 17；原私有结果下载内容正确，尝试次数 1。未为验收增加管理员身份或绕过报价确认 |
| 密码与旧连接 | 实际交互更改密码后旧密码新连接拒绝，新密码可用；原连接后端编号不变，改密码 / 撤销 `CONNECT` 后仍可查询。明确终止本次自有后端才断开；没有对主预览或其他环境批量终止连接 |
| 凭据更新与原结果 | 恢复连接授权并用新凭据重启隔离 Worker；原会话下载原结果成功，同一提交仍原任务编号。账户 / 账本逐字段保持，17 积分、一次尝试、无再次执行 / 扣费 |
| 模板复制与主预览 | 实际新站及二次复制包含角色脚本、复验入口及中文教程，未复制私有环境与临时数据。六项预览可访问；新增及更新教程逐字匹配构建产物。主库保持已授权 0012 / 13 条迁移、普通用户、20 积分、4 文件与原成功任务 / 一次尝试，自有实例及目录清理 |

早期验收发现 `psql` 引入文件的引用方式没有读取目标脚本，改为同一连接顺序执行两个文件；又发现 PostgreSQL 17 的 `\quit 1` 不能产生预期错误状态，改为 SQL 异常配合 `ON_ERROR_STOP`。生成器也正确拒绝了源仓库内目标，改用自有仓库外临时目录。失败运行不计入完成证据，最终完整流程、额外授权与末尾故障回滚均实际通过；没有降低权限检查来使验收通过。

证据在忽略的 `.local/i15-role-*`。正常预览集群未改角色 / 密码 / 授权，所有迁移与断开操作仅在本轮自建实例中；没有远程迁移、云端资源或真实供应商调用。脚本只处理所选数据库及公共模式，不认证其他库的内部授权或整个集群隔离；数据库业务角色也不等于逐用户行权限。Cloudflare 官方说明更新源凭据不会自动关闭旧池，本地连接测试不能替代真实 Hyperdrive 重连验收。维护步骤见[数据库角色与凭据](./database-roles)。

**下一项：** 在明确测试环境后验收真实 Neon / Hyperdrive 权限与连接池、资源绑定 / 外部服务及恢复成本；继续按原范围推进 I14 真实供应商与 I16 两个真实独立产品，不把受控本地结果当作完整目标已完成。

## 2026-10-11：I2 手机文件工作台与键盘删除补充验收

**状态：补齐本地手机 / 键盘 / 永久删除浏览器流程，完整 I0—I16 及真实云端目标继续进行。** 接续 `50f26f96`，核对能力表后优先处理文件工作台仍明确标记的实际界面缺口。本轮没有新增业务权限、表结构或后台平台；改动集中在原文件组件、共享附件预览的两处调用和原验收命令。

浏览器发现关闭预览 / 取消删除时焦点落到页面空白，删除失败时被临时禁用的按钮也会丢失焦点。现在预览 / 取消回到该文件的原按钮，失败回到可重试按钮，成功回到选择文件。共享预览在任务附件中也传入对应按钮引用；不读渲染阶段的 ref。列表刷新较慢时，确认删除后恢复操作焦点，且不抢走用户已主动移动的焦点。

| 验收 | 结果与边界 |
| --- | --- |
| 回归与构建 | 全仓 104 文件、1061 项通过；原删除失败 / 待确认 / 取消与西班牙语用例继续通过，新增预览返回焦点，并扩展成功删除后延迟刷新与失败重试焦点断言。类型、严格 lint、默认配置及完整预览构建通过 |
| 实际手机布局 | 同一隔离文件工作台在 320 / 390 像素分别切换浅色 / 深色，四种组合记录实际视口、文档宽度和弹窗边界；无横向溢出，确认弹窗在视口内。手机直接刷新仍在原 `/files`，导航初始收起；不是只缩放桌面截图 |
| 上传、预览与下载 | 用真实文件选择器上传长文件名 JSON、PNG 和文本；真实私有预览与键盘打开 / Escape 关闭。实际浏览器下载原 JSON 43 字节，与上传样本字节及 SHA-256 一致；PNG 实际解码为 1×1，不仅核对 HTTP 200 |
| 删除与任务保护 | 实际点击 / 回车永久删除后，列表与配额更新、焦点回到选择文件。一次性库中原任务存储入口创建未派发任务，占用文本时删除真实返回 409；弹窗、文件及配额保持，失败焦点回到重试。通过原取消入口解除占用后，在同一失败弹窗回车重试成功，另一张图片仍保留 |
| 真实清理终态 | 最后图片也经界面永久删除；停止前核对一次性数据库文件记录 0、文件 / 字节配额 0、实际 R2 对象 0，然后才清理测试库、Worker、回环站和目录。原文件接口 / 定时验收以最终代码另跑通过 |
| 生成与资料 | 实际新站及二次复制包含最新文件工作台、共享附件调用与复验脚本，私有环境和临时数据未复制。文件教程、计划及能力表补充具体证据与 `--browser` 复验，不把本地模拟当真机或云端验证 |

列表刷新延迟的测试先证明成功删除后仍会丢失焦点，再补齐恢复，未通过扩大等待时间或降低断言使其通过。构建检查还发现共享预览的任务附件调用遗漏，补齐第二处真实调用；渲染阶段读取 ref 被 lint 拒绝，改为在关闭事件读取。最终类型、lint、行为与全仓回归通过，早期失败不计入完成证据。

证据在忽略的 `.local/i2-mobile-*` 和 `.local/evidence/files-mobile/`，包括四种布局实测数据、原件字节核对、失败提示与完成截图。所有账号 / 文件 / 未派发任务只在本轮一次性数据库，外部请求阻断；手机尺寸测试是浏览器视口，未声称真实设备。测试结束还原浏览器尺寸并关闭自有页面，原主预览账号、0012 / 13 条迁移、20 积分、4 文件和原成功任务保持。中文文档、构建产物与六项预览按最终版本核对。

**下一项：** 继续补原计划剩余实际交付，真实供应商、Neon / Hyperdrive 连接池、云端恢复成本及两个真实独立产品仍保留原范围；不以本轮文件界面验收宣布整个模板完成。

## 2026-10-11：I6 / I9 未标记旧结账的人工恢复

**状态：补齐本地管理员核查 / 关联、永久审计与原用户恢复，完整 I0—I16 继续。** 接续 `1434fbf9`，解决能力表仍明确留待开发的旧版本结账：创建已发送但本地失去响应，且没有新请求标记，无法安全自动查找原会话。

管理员在订阅视图填写原 Stripe 会话编号，先核查再填写原因 / 确认。服务端检查新鲜站点身份、近期会话、来源、原租约、唯一客户归属和未解决插件行；分页读取固定一小时窗口的全部状态，同一本地订阅编号 / 到期时间必须只有一个候选。当前会话再次核对主体、客户、模式、环境、创建时间、期限和缺失标记；关联提交使用核查摘要，状态或原请求变化则重新核查。原幂等键仍需要人工对照供应商原始请求，本入口不将归属核对当作原请求证据。

关联只补原会话及继续地址，和两条审计在同一事务提交。审计失败全部回滚，失去响应保留请求编号重试；完成后重放也不复活或重新关联原请求。审计保留主体 / 尝试 / 会话 / 摘要 / 状态 / 原因，省略完整载荷、支付地址和凭据。用户随后通过原核查流程继续 open / complete / expired 处理，管理员关联不创建付款、退款、权益或直接解除购买阻塞。原插件保持订阅状态的唯一写入者，沿用现有协调表与审计表，没有新增 SQL 迁移或调整主预览权限。

| 验收 | 结果与边界 |
| --- | --- |
| 回归 | 全仓 105 文件、1080 项通过；真实 SDK / 已迁移 PGlite 验三种状态的人工关联后原插件恢复、同请求重放 / 不重复创建；歧义、错误主体 / 期限 / 标记、分页异常、摘要变化、过程中降权 / 会话撤销 / 过期，以及审计故障全部保持阻塞或回滚 |
| 原生数据库与 Worker | 原 `admin:validate-payments` 增加一次性旧请求数据；实际生产 bundle / SDK 受控读取验站点权限和来源、歧义 / 状态变化、PostgreSQL 审计触发器故障、同请求修复重试及原用户接口返回 ready；全部资源实际清理。旧请求为明确测试记录，未冒充真实 Stripe 历史 |
| 实际管理页 | 隔离账单账号在真实浏览器完成核查、取消重新核查、填写原因、明确确认；实际落库原会话、两条审计，账号原恢复可继续，既有积分未变。页面始终显示原订阅未完成，关联没有伪造权益。核查、取消、确认及完成有对应键盘焦点，失去响应的页面重试保留同一 ID；西班牙语失败提示另经组件验收 |
| 生成与交付 | 新站及二次复制包含最新恢复入口、API、审计类型 / 展示、双语文案、原生验收及中文教程；不复制私有环境或临时目录。类型、严格 lint、数据库历史 / 默认配置和完整预览构建通过 |

早期检查发现返回状态推断泄露供应商内部类型、旧审计展示未覆盖新变更类型、速率命名未沿用现有额度，均修正并重新通过；配置关闭场景的测试改为实际前置条件错误，未放宽业务验证。实际页面核查后旧按钮消失时焦点落到空白，补上原因输入、取消返回、确认 / 重试和完成提示的焦点处理，再加载最终组件走通确认。失败运行不计入完成。

证据在忽略的 `.local/legacy-checkout-*` 和 `.local/evidence/legacy-checkout/linked.jpg`。正常主预览保留 0012 / 13 条迁移、原账号、20 积分、4 文件、原成功任务和 1 次执行；中文资料、六项预览与最终构建核对。测试没有真实供应商写入、远程迁移或云部署。

**下一项：** I6 真实月付 / 年付沙箱和生产绑定仍待明确环境；继续推进 I7 真实处理器、I14 真实供应商、I15 云端权限 / 恢复成本与 I16 两个真实独立产品，受控本地验收不等于整个目标完成。

## 2026-10-11：I9 审计记录精确检索

**状态：补齐本地历史检索与实际页面验收，完整 I0—I16 继续。** 接续 `fc674fa9`。原管理页只能翻页查记录，现在可组合审计目标、执行者和请求编号；粘贴完成编号也能同时找到请求与完成记录。三个字段只在提交后应用，清空筛选重置页码；每页 20 条，按时间及记录编号稳定排序，不提供模糊匹配或私有任务正文搜索。

原审计展示移到独立组件，查询键包含当前管理员、筛选及页码。查询失败隐藏旧缓存，不将先前读到的历史当成权限仍有效的证明；沿用新鲜站点权限检查。记录明确展示原请求和记录编号，说明历史不等于当前付款或任务状态；默认保留审计，没有定时删除。账号删除后保留历史标识，这些记录仍用于行政操作幂等及首次管理员证据。

| 验收 | 结果与边界 |
| --- | --- |
| 回归 | 全仓 106 文件、1085 项通过；实际迁移 PGlite 验同一 UUID 的不同执行者隔离、组合条件、完成编号归一化、部分编号 / 通配符不匹配、严格参数与稳定分页。删除目标账号仍能查记录，管理员降权后读取拒绝；原私有输入及摘要未增加到返回值 |
| 原生数据库与 Worker | 原 `admin:validate-payments` 使用独立完整迁移库和实际 Worker，读取人工旧结账的两条真实落库记录；普通账号 403、额外字段 400。通过 PostgreSQL 目录核对新增请求字段的有效 btree 索引；保留原支付对账和关联回滚验收 |
| 浏览器 | 最终组件实际填三项精确筛选、刷新、部分编号空结果及清空。请求 / 完成两条记录同屏，搜索和刷新后焦点恢复；320 / 390 像素分别检查黑白主题，四种组合无横向溢出。停止前核对审计数量与原积分不变，测试库及 Worker 已清理；视口验收不声称真机测试 |
| 结构与迁移 | 只新增 `0034_admin_audit_request_lookup.sql` 及对应快照 / 历史条目，不修改旧 SQL。旧表已有请求字段，正常预览继续兼容 0012 / 13 条历史；新索引只在一次性库验收。正式选择升级环境后应运行完整增量历史，不能单独跳过中间迁移 |

首次原生索引断言错误地依赖数据库输出 SQL 的引号形式，改为读取真实索引属性；未降低索引有效性要求。实际点击又暴露禁用期间焦点丢失，补齐完成 / 失败后的恢复；短请求也通过成功 / 错误更新时间触发，且不抢用户主动移到输入框的焦点。最终组件复验 2 文件、10 项通过，失败运行不计入完成。

证据在忽略的 `.local/audit-search-*` 和 `.local/evidence/audit-search/`。中文审计教程、计划和能力表同步；正常主预览继续保留原普通账号、20 积分、4 文件及原成功任务 / 一次尝试。没有真实供应商请求、远程迁移或云部署。具体站点的审计保留期限、归档和隐私处理仍需实际政策，不能直接按备份保留天数清理源审计。

**下一项：** 继续原计划的实际产品处理器和生产环境验收；Image to SVG 首站及真实测试环境仍待用户选择，先推进不依赖它们的模板交付。I7、I14、I15 云端及 I16 两个真实独立产品保留原范围。

## 2026-10-11：I15 已有站增量升级与旧代码回退

**状态：补齐 0012 已发布基线到当前历史的本地升级证据，完整 I0—I16 继续。** 接续 `0feb56b7`。新增 `db:validate-upgrades` 及中文升级演练说明；没有改业务接口、生成器覆盖规则或 SQL 历史，也没有升级正常主库。

基线为实际 Git 提交 `3e6dd9df578e2f927a5493a2b06f1dbcc14f8293`，不是当前源码另起一个 Worker。读取完整旧版本归档，以旧锁文件安装 / 构建邮件；仅在副本把文本任务价格由 0 改为 3，作为明确的产品定价配置。原注册、文件、报价、任务及队列入口产生一个已交付任务；第二个由旧任务存储入口创建、尚未派发，代表提交和投递之间的崩溃边界。

| 验收 | 结果与边界 |
| --- | --- |
| 已有数据 | 旧 Worker 实际注册普通账号，上传文本、确认 3 积分报价、Queue / R2 交付并下载私有结果。第二次预扣后余额 14，任务仍 pending / reserved；旧表全部原列和行保存摘要，迁移编号 / 哈希 / 时间保存原值 |
| 故障升级 | 仅在私有迁移副本的最后语句注入除零错误，明确核对 PostgreSQL `22012`，证明跑到末尾；整批增量回滚、旧公共字段 / 原历史保留，新增密钥表及请求索引不存在。内部序列间隔不冒充数据丢失 |
| 正常升级与重跑 | 使用未修改的完整历史升级到 0034 / 35 条；旧公共字段摘要保持、原 13 条记录保持。再次迁移不重复应用，业务和历史仍保持；没有跳过中间增量或修改已发布 SQL |
| 新版与在途恢复 | 同一 Cookie 下载原结果；原请求返回原编号。实际维护入口补投第二个任务、Queue 处理、R2 私有下载内容正确；余额仍 14、两条预扣、各任务尝试 1，账号仍普通用户 |
| 旧代码回退 | 再启动原基线 Worker，使用扩展后的数据库及原资源下载两份结果、重放原请求；原业务字段摘要保持。正常请求推进限流计数，运行阶段单独排除该计数表，停机迁移阶段仍完整核对 |

首次请求把报价响应的余额一并放入严格报价输入，被原接口正确拒绝；改为只提交价格和版本，没有放宽 API。随后迁移记录前缀比较因数据库驱动返回 `Result` 子类与普通数组原型不同而失败，改为比较真实记录数组；原行数、编号、哈希和时间继续保留严格断言。失败运行均清理资源，不计入完成；最终完整三次 Worker 启动、故障 / 正常 / 重复迁移及原结果恢复实际通过。

本轮不改产品行为，验证重点是实际旧依赖 / workerd / PostgreSQL 的端到端演练与新脚本的类型、严格 lint、格式和中文文档构建，不以重复原全仓测试代替升级证据。资料同步升级、部署、能力与计划；新站及二次复制保留复验入口，但没有原 Git 历史的副本必须在有历史的源仓库验收。

证据在忽略的 `.local/i15-upgrades-*`。自有旧版本归档、安装目录、数据库、Queue / R2 与 Worker 清理；原配置、正常主库 0012 / 13 条、普通账号、20 积分、4 文件及原任务 / 一次尝试保持。没有真实供应商、远程迁移或云部署。旧付款 / 联盟存量、其他基线、产品自定义处理器、真实云端混合发布及费用需分别验，不能据此宣布 I15 或 I16 完成。

**下一项：** 按完整计划继续真实处理器 / 第一产品、真实供应商、云端升级 / 恢复与运行费用；已有站合并自定义代码仍按明确差异在产品分支处理，生成器不覆盖现有产品。

## 2026-10-11 · I16 开发源码交付包与安装验收

**状态：分发准备的本地验收完成，完整 I0—I16 目标继续进行。** 接续 `48c0771f`。新增 `site:package`，从干净的确切 Git 提交归档并复用原新站生成器；没有新增产品复制规则、改数据迁移或把模板提升为正式销售版本。产品 README 改为中文安装与配置说明。

| 验收 | 结果 |
| --- | --- |
| 实际源码交付 | `c7ba533f` 的提交归档生成独立产品，压缩包与最后写入的清单记录来源、产品身份、835 个文件的字节数 / SHA-256、工作区直接依赖声明和原许可证 |
| 完整性与复制边界 | 实际解压逐文件核对；LICENSE / THIRD-PARTY-NOTICES 原文保持；无 Git、私有配置、本地数据、依赖 / 构建产物及官网源码；解压产品可再次生成新站并保留模板来源 |
| 拒绝与清理 | 已有输出目录保留；未提交源代码、子目录来源、无效端口、源码符号链接、损坏归档与错误归档路径拒绝；失败只清理本次拥有的新输出 |
| 实际独立安装 | 新空目录中普通安装更新产品工作区锁文件，再冻结安装成功；使用本次随机认证密钥，离线配置检查、公开页 / 工作台 / 邮件与中文文档构建通过 |
| 检查与教程 | 两个测试文件共 7 项通过；类型、严格 lint、格式、配置诊断、数据库历史检查和文档构建通过；交付教程、侧栏、能力、计划和复制说明同步 |
| 主预览保护 | 六个预览仍正常，主库保持已授权 0012 / 13 条迁移，普通账号、20 积分、4 文件和原任务 / 一次尝试保留；本次解压源码、依赖和私有验收配置清理 |

清单中的依赖是源码直接声明及版本范围，不是安装解析清单、全部传递依赖或完整许可审计。归档摘要仅校验这一份文件，不能认证作者身份；校验命令不解压或执行源码。产品来源提交与模板原始来源分别记录，生成时间不同可能产生不同归档。

本轮没有连接真实模型 / 支付供应商、远程迁移或云部署，也没有宣称两个样例是两个真实上线产品。开发包与本地证据保存在忽略的 `.local/distribution/` 和 `.local/i16-package-*`；正式分发、价格 / 授权 / 支持和完整 I16 验收仍待原计划条件满足。

**下一项：** 按已验证需求确定第一真实处理器及产品，在明确测试环境后完成真实服务、独立部署、成本与第二产品复用；完整 I7、I14、I15 和 I16 范围保持。

## 2026-10-11 · I16 安装后的依赖版本与许可报告

**状态：依赖核查资料已实际本地验收，完整 I0—I16 继续。** 接续 `ee7296f7`。交付包原先只保存直接声明的版本范围，新增 `site:dependencies`，复用 Bun 已有的许可报告功能；导出准确版本、报告标签及分组，移除本机路径、作者、描述和主页，并记录当前锁文件摘要、工具、系统 / 架构和范围。报告不会自动改第三方声明或判断授权。

| 验收 | 结果 |
| --- | --- |
| 实际独立产品 | `a190cd12` 已提交归档解压后逐文件核对摘要，普通安装及冻结再安装成功；在解压产品中实际运行两种导出 CLI |
| 全部 / 生产范围 | 当前本机样本分别为 1180 / 627 个依赖版本；包含实际 Astryx、StyleX 和 Better Auth。全部范围含开发 / 构建，生产范围依照 Bun 图，不代表最终构建产物 |
| 文件与版本关联 | 两份报告的摘要均对应本次安装后的同一 `bun.lock`，导出前后锁文件字节不变；附保留的安装后锁文件。导出资料不含模板 / 临时目录绝对路径，原 LICENSE / THIRD-PARTY-NOTICES 保持 |
| 未知标签核查 | 全部报告中 `khroma@2.1.0` 为 `Unknown`，生产报告没有未知标签。实际随包 `package.json` 无许可字段，小写 `license` 原文标明 MIT；报告不覆盖原标签，教程记录二者差异 |
| 拒绝与回归 | 原有报告不可覆盖；未安装的目录不自动安装或生成报告；无效数据、重复版本 / 冲突声明拒绝。生成器、交付包与依赖报告三个文件共 10 项测试，以及类型、严格 lint、格式、配置诊断和中文文档构建通过 |

首轮验收脚本误写 Astryx 包名为 `@astryx/react`，在真实导出结果核对时失败；改为源码实际声明的 `@astryxdesign/core` 后重新完成整套独立产品验收，没有放宽产品检查。失败与成功两次自有安装目录均清理，完成证据为忽略的 `.local/i16-dependencies-native-final.log`。

报告来自本平台当前安装，不能代替其他平台、原许可 / 二进制 / 素材核查或完整法律审计。实际核查资料及安装后锁文件放在 `.local/distribution/agentbuff-dependencies-a190cd12-verified/`。没有主库迁移、真实供应商调用、云部署或正式销售发布。

**下一项：** 保持真实处理器 / 产品、真实服务、两站部署复用和费用验收的原依赖；其他平台依赖、分发素材与供应商条款在对应实际交付时逐项核对，不以依赖报告宣布 I16 完成。

## 2026-10-11 · 全计划核对与独立测试域名

**状态：独立测试配置与本地产物准备完成，云端发布仍未执行，完整 I0—I16 继续。** 接续 `c910fcdf`。逐项保留原计划 17 阶段、94 条任务与 17 条阶段验收，新增[当前验收核对](./completion-audit-2026-10-11)及中文侧栏入口；纠正模块、语言、事件观测与环境示例中的过时状态，仍明确保留真实模型 / 供应商、云端运行 / 费用 / 恢复和两个真实产品的门槛。

用户指定 `stack.agentbuff.dev` 后，只修改 API 与 Web 的 `staging` 公开地址及自定义域名。复制检查发现旧生成器按源域名是否以 `staging` 开头推断环境，会让任意命名的测试入口复制成正式入口；复用原 JSONC 配置编辑器，按实际环境分别生成正式、测试域名，去除正则猜测。源域名不再带入新站，原注释和其他配置保持；不支持的非自定义域名路由明确拒绝。

| 验收 | 结果与边界 |
| --- | --- |
| 原源码全仓回归 | `c910fcdf` 基线 108 文件、1092 项通过；随后域名 / 生成器增量复验为四文件、32 项通过，不混记为新增全仓回归 |
| 实际复制 | 原生成器测试实际生成与二次生成，分别核对正式 / 测试 / 本地入口；第二次来源刻意使用没有 staging 前缀的自定义测试域名，原资源重置和品牌 / 归档排除仍通过 |
| 配置和隔离 | 新测试域名离线检查已接受；只剩两个 Hyperdrive 占位及测试发信地址三个字段错误。逐字段对比原配置，开发与正式环境保持；没有用假编号消除问题 |
| 独立构建产物 | 公开页、工作台、邮件输出到本次独立目录；入口非空、17 页规范链接及 sitemap / RSS 使用 `https://stack.agentbuff.dev`，主预览产物未被覆盖。仅检查构建，不代表域名 / 证书在线 |
| 云端身份 | 本机 Wrangler 只读检查返回未登录；私有仓库可读的 Actions 秘密名称列表为空。未能验证账号、资源、域名权限或供应商；不据此称远程资源不存在 |
| 代码和中文教程 | 类型、严格 lint、格式、中文文档构建及主预览保护完成；正常库保持 0012 / 13 条迁移、普通账号、20 积分、4 文件和原任务 / 一次尝试 |

首次临时构建的命令位置只打印工具帮助，未产生有效构建；改为在对应工作区执行后核对真实输出。验收脚本首次未从依赖所属工作区解析 JSONC 包，调整导入后重新完整核对通过。失败尝试不计入构建验收，没有改发布门禁或放宽域名断言。

本机证据在忽略的 `.local/completion-audit-*` 和 `.local/staging-domain-*`。本轮未创建云资源、执行远程迁移、上传 Worker、发送真实邮件或调用模型 / 支付接口。

**下一项：** 在本机完成 Cloudflare 登录与独立 Neon 测试库准备，核对域名所属账号、真实资源及发信配置；第一真实任务仍等用户选择，再接入已有任务 / 扣返 / 结果链路。完整 I7、I14、I15、I16 条件继续保留。

## 2026-10-11 · I7 候选图片转矢量接口核对

**状态：完成官方契约与源码接入差异核对，真实处理器仍未实现，完整 I0—I16 继续。** 接续 `2642fd42`。沿用用户此前关注的 Image to SVG 作为候选研究，没有代替用户确认首个产品；新增[中文接入核对](./image-to-svg-contract)及侧栏入口，模块和全计划核对同步。

实际读取官方转换、输入 / 结果、限额、价格、错误和 OpenAPI 资料，保存公开 JSON 规格、获取时间与摘要。解析请求 / 响应引用，确认 JSON 数据 URL、单个图片对象、Base64 格式与计费单位。发现二进制字段在说明和规格不一致、转换模型版本未公开，以及本次规格没有幂等或转换任务查询 / 取消入口；明确区分图片编号、请求编号、本站处理器版本与供应商模型版本。

这改变下一项接入决策：优先用已被两份资料共同描述的 JSON 数据 URL 与 Base64 结果；付费调用的不确定超时沿用待核对，不能照搬一般重试建议；接入前还需确认供应商版本与恢复能力是否满足产品要求。当前报价推算与实际单位 / 已核实费用分开，不能把用户积分返还当作供应商没有成本。源码逐项确认原任务提交、输入 pin、消费者、结果命名与记录仍按文本实现，记录需要扩展的位置；没有先堆多个模型适配器、未使用的密钥或假响应。

本轮只运行公开规格的字段 / 引用 / 摘要核对、中文文档构建、格式检查及实际教程读取；没有业务代码变更，不重新用全仓回归代替接口证据。本机 Cloudflare 只读登录复查仍为未登录，没有修改正常主库、发送图片、调用收费接口、创建资源或发布。资料在忽略的 `.local/recraft-contract-2026-10-11/`，不是成功转换样本或成本账单。

**下一项：** 首个任务与实际测试环境准备到位后，实现一个明确处理器、增量执行记录、SVG 内容检查与原图对照预览，完成受控故障和真实固定样本质量 / 费用验收。模型未选择 / 未接入期间遵守原 I7.6，图片转换保持待开发；I15 云端与 I16 两个真实独立产品门槛保持。

## 2026-10-11 · 干净检出的类型检查与产品复制

**状态：本地复现和修复完成，完整 I0—I16 继续。** 接续 `dcac4f60`。继续核对时发现该提交与前一提交的 GitHub Build 在类型检查失败：官网博客集合未生成类型，内容、RSS 与 sitemap 共六处隐式宽类型错误。此前本地检查有 Astro 构建留下的生成文件，不能证明首次检出可检查。

统一 `bun typecheck` 先执行公开站 / 官网的 `astro sync`，成功后再检查 TypeScript 项目图。两个 Astro 工作区分别增加同步命令，生成器清除产品中官网的类型检查过滤器；原业务接口、依赖版本、数据库历史与严格类型设置保持。检查准备放在用户与 CI 共用入口，不只修复 CI；同步失败会停止检查。中文快速开始和类型工具链决策同步。

| 实际验收 | 结果 |
| --- | --- |
| 旧命令复现 | 从 `dcac4f60` 的 Git 归档建立无生成目录的独立源码，以原锁冻结安装；原强制类型检查实际出现与 GitHub 相同的六处 `TS7006` |
| 修复后的干净检查 | 在上述副本仅应用四个命令 / 生成器文件变更，实际生成两个工作区的 Astro 类型，强制类型检查通过；安装锁文件字节保持 |
| 类型仍约束数据 | 在副本临时索引不存在的博客字段，强制检查明确返回 `TS2339`；恢复原文件后再次通过，没有给集合加宽类型 |
| 新产品首次安装 | 由副本实际生成独立产品，不含官网 / Astro 缓存；普通安装、冻结安装与仅公开站的强制类型检查通过，检查前后产品锁文件字节保持 |
| 相关回归 | 生成器与交付包两文件、7 项通过；本地强制类型、严格 lint、公开站 113 文件与官网 49 文件模板检查均通过，模板检查无错误 / 警告 |

干净归档、源码与产品安装目录均为本次自有，成功后清理；证据在忽略的 `.local/ci-fresh-*`、`.local/ci-product-*` 和 `.local/ci-typecheck-*`。本次新命令不连接数据库或供应商，不上传代码；Cloudflare 只读登录复查仍为未登录，目标测试配置文件仍未准备。真实任务选择、外部服务、云端 / 费用 / 恢复及两个真实产品条件继续保留。

**下一项：** 推送后核对实际 GitHub 干净环境的完整检查结果，再继续真实任务与测试环境的准备；不能以本地修复通过宣布线上检查或完整目标完成。

同一门禁的后续项目图核对发现，公开站已有的通配路径没有纳入隐藏的 Astro 类型入口；官网则显式包含该文件。为公开站补齐 `.astro/types.d.ts`，避免新增集合时查询退化为宽类型。在另一份实际安装的生成产品中加入自有内容集合：移除入口后，错误字段可通过检查；恢复入口后明确返回 `TS2339`，改用正确字段后通过。实际项目图包含内容生成文件，检查不改锁文件；自有安装目录已清理。证据在 `.local/ci-product-type-graph-*`，不属于真实产品上线或模型验收。

## 2026-10-11 · 官网域名用途澄清与配置

**当前范围：先做好模板官网配置，暂不云端发布，暂不接真实产品。** 用户明确 `stack.agentbuff.dev` 用于 AgentBuff Stack 官网。此前将它配置为产品测试域名是理解错误；撤回 API / Web 的对应设置，产品测试环境恢复 `staging.example.com` 示例，并在 `apps/website/wrangler.jsonc` 单独声明官网自定义域名。官网是静态站，不需要产品数据库、Hyperdrive、任务队列或模型凭据。

新增 `.env.website.example`，只保存已确认的官网域名；公开中文教程和模板演示地址留空，正式构建保持缺项拒绝，避免发布本地地址或猜测的域名。官网示例不会进入生成产品；已有本地教程与模板样例演示继续使用原端口。部署、官网、环境与全计划核对的中文教程同步澄清。

此前 `925a2047` 的实际 GitHub 完整检查通过：108 个测试文件、1093 项测试与所有应用 / 文档构建成功，部署步骤未执行。此结果属于该提交，不冒充当前配置修改的回归。本次官网独立目录构建与中文教程构建通过，生成器 / 产品发布检查两文件 24 项测试通过；原生核对确认官网只声明静态资源、API / Web 仅撤回错误域名，实际生成产品没有官网及专用环境文件。直接加载未补齐链接的官网示例时，正式构建明确拒绝而未生成发布产物；自有生成目录已清理。证据在忽略的 `.local/official-website-domain-*`。历史域名构建与接口研究仍是历史证据，不说明官网上线、产品上线或模型已接入。

原 I0—I16 完整验收条件保留，真实产品和云端阶段按当前要求暂缓；当前官网配置不以完成这些后续阶段为前置条件。没有创建云资源、迁移数据库、修改本地预览数据、发布站点或调用真实模型。

## 2026-10-11 · 模板、官网及核心教程中英文国际化

**当前范围：全站双语已完成本地验收，暂不接真实产品、暂不发布云端。** 接续 `33e0e827`。用户确认核心使用指南和教程界面双语，历史记录保留中文。产品默认启用英文 / 简体中文，保留可选西语；官网独立维护自己的双语内容，不导入产品运行配置。英文产品路径保持，中文使用 `/zh/`；教程原中文路径保持，新增 `/en/` 核心指南。

扩展已有语言登记、公开页面组件、工作台地址改写和完整字典，复用同一套业务流程。覆盖认证 / 团队 / 管理、工具交互 / FAQ、文件 / 任务 / 购买、推荐 / 营销同意及邮件，日期和金额按语言展示；原始输入、文件名、标识、执行历史和账本原文不改写。官网首页 / 功能 / 案例 / 定价 / 博客共用页面组件，已有两篇文章提供完整中文译文，未制造真实产品案例。

| 验收 | 结果与边界 |
| --- | --- |
| 全仓回归 | 109 个测试文件、1108 项通过；涵盖中文请求 / 捕获邮件、认证回跳、真实路由树、语言停用、原邮件载荷兼容、通知重试、营销同意及支付原请求保持 |
| 编译与页面 | 类型、严格 lint、格式、配置诊断和迁移元数据检查通过；产品公开页 119 文件、官网 63 文件页面检查无错误 / 警告；产品 33 页、官网 14 页和工作台 / 邮件实际构建成功 |
| 核心教程 | 新增 20 篇英文核心指南及英文入口；中文语言配置教程同步重写。搜索、目录、页尾、主题与代码复制提示按语言展示；英文指南能直接回到对应中文页，中文历史入口明确标注。文档实际构建通过 |
| 内容与搜索元数据 | 页面、RSS、站点地图及规范 / 语言替代链接只指向实际发布版本；中文缺译文不混入英文，草稿原稿不发布其译文。官网校验重复身份、孤立译文与空正文，沿用实际案例要求 |
| 原生浏览器 | 中文官网完整导航 / 文案、中文 JSON 格式化成功及错误提示、已登录工作台与原任务详情实际可用；任务切成英文并刷新后保留同一标识和记录。英文核心指南实际显示英文侧栏、复制按钮和英文搜索结果，切回中文同一指南成功 |
| 独立复制 | 实际生成、首次安装并检查独立产品，类型和邮件 / 公开页 / 工作台构建通过；生成站包含中文工具 / 博客、20 篇英文指南和 0035 迁移，不含模板官网。将生成站改为仅英文后重新构建，中文页面目录、站点地图与替代链接消失 |
| 数据兼容 | 原字段虽为文本，四处检查约束原来仅允许英文 / 西语。新增 `0035_chinese_locales.sql` 放宽对应约束；隔离测试核对旧偏好 / 待投递原载荷保留，随后可保存中文。未修改既有迁移，不在主库执行 |
| 主预览 | 六个自有预览已重启；主库仍为 0012 / 13 条迁移、2 个普通账号 / 0 管理员、20 积分、4 文件和 1 个原任务。浏览器只读核对后再次确认状态保持 |

首轮增量测试中的西语固定回跳断言未随中文参数化，按当前语言修正后完整回归通过。独立验收最初选择源码内部目录，被生成器按原隔离规则拒绝；随后改用本次自有临时目录完成生成和构建，没有放宽生成器。窄屏浏览器检查遇到控制通道超时，已恢复默认尺寸，本轮不将其记为移动端验收。所有临时证据保存在忽略的 `.local/i18n/`，自有安装目录完成后清理。

中文语言持久化的可选模块需在实际目标库升级完整增量历史后启用；默认主预览仍不启用通知 / 营销 / 推广等后续表。真实邮件送达、托管支付、模型、云端及两个真实产品的验收条件保留，没有调用供应商、云部署或正式销售发布。

**下一项：** 继续本地模板与官网迭代，依据实际使用排查双语措辞与配置；真实产品接入和云端发布等待用户重新安排。历史记录保留中文，不把当前双语页面和样例构建当作真实产品上线。

## 2026-10-11 · 静态官网与双语教程发布准备

**当前范围：用户已授权发布 `stack.agentbuff.dev` 官网及 `/docs/` 双语教程，暂时隐藏演示；产品 Worker、数据库和真实供应商仍不在本次范围内。** 接续 `76179d69`。这项授权更新此前暂不发布的官网安排，不表示整个模板云端验收完成。

官网公开链接改为可选：缺失目标隐藏入口，已填写公开地址拒绝本地地址；本地预览保留原默认端口。教程支持可配置挂载路径，导航、配对语言切换、搜索资源、规范链接、站点地图和模型阅读入口统一带 `/docs/` 前缀；历史中文页不伪造英文替代链接。

`website:package` 先核对官网域名及教程入口，再将官网与教程构建到新的忽略目录，产生专用 Worker 配置、合并站点地图索引和目录外版本清单。`website:deploy` 也使用同一构建入口，避免上传仅有官网或本地预览地址的旧产物。生成独立产品排除官网专用发布脚本。

| 验收 | 结果与边界 |
| --- | --- |
| 增量回归 | 公开 URL、教程地址与独立生成器共 3 文件、7 项通过；核对生成产品确实不含官网发布器 |
| 静态检查 | 类型、严格 lint 与格式检查通过；官网页面检查 65 文件、零错误、零警告 |
| 合并发布包 | 官网 14 页与双语教程实际构建通过；产物规范地址、教程资源及站点地图均使用官网目标地址；演示入口隐藏 |
| Cloudflare 离线打包 | 专用配置 631 项静态资源打包成功，没有产品服务绑定或数据库绑定；离线成功不表示线上发布 |
| 原生浏览器 | 实际静态 Worker 中中文官网无演示按钮；英文快速开始切到同一中文指南成功，中文文档搜索实际返回正确挂载路径 |
| 主预览 | 只读核对原数据库迁移、账号角色、积分、文件及任务与此前快照一致；发布包没有覆盖现有预览产物 |

本机 Wrangler 尚未认证，登录页面已交给用户完成授权，当前未上传或验证线上域名。第一次登录请求超时，不作为已登录证据。本地安装的 Worker 运行时只支持到 `2026-09-17`，静态预览使用命令行兼容日期覆盖完成验证，正式配置的 `2026-10-09` 保持。证据保存在忽略的 `.local/website-cloud/` 和 `.local/website-release-*`。

**下一项：** 完成 Cloudflare 登录与目标域名权限核对，上传同一份已检查静态产物，再检查实际 HTTPS 页面、双语教程、搜索和站点地图。产品接入、数据库及原 I0—I16 完整验收条件继续保留。
