归档说明(2026-10-01):本文保留归档时的完整正文和历史验收要求,不再作为现行状态或执行入口。后续工作统一见架构调整收尾工作计划。正文中的缺口、完成状态与下一步仅代表当时记录;运行证据保留原位置。 原计划的最新工作区更新(含尚未提交的 M05 状态)完整保留。
架构改进与验证计划(2026-10-01 更新)
现行执行计划,按实机证据持续更新。 W05a/b/c 实现与此前普通 Run、浏览器传播和截图生命周期的定向场景保持通过。10-01 新增完整
4c7eee8镜像的 PG/SQLite 入口、迁移中断/应用回滚和 N/N-1 公共 Kit/产物组合,修复 SQLite DDL 原子性及 Renderer 语义错误 500,见本轮 M05 记录。固定样本的 M05 定向范围已完成,完整 M01/M02/M04、容量、远端发布和其它门按 §7 保持开放。 原计划基线:7bff842b306503e894b4cde5b24b8f2a8319421b;最新复核基线:9ebc414(dev)。问题定义以现行评估为准,原始完成条件保留。 §1–§5 为更新后的实施与验收要求;§6 保留此前本地实施证据,§7 汇总当前进度。下一轮执行前固定候选版本与环境,历史结果不替代变更后候选的必要复测。
1. 范围与执行顺序
保持 Backend/Runtime/Renderer 与共享契约包的模块边界,继续复用 CAS、租约与写围栏。普通 Run 保持中断不自动续跑,本轮补的是终态收敛与会话解除。W05a/b/c 是 W05 的子项,沿用现有编号,不另建总计划。
首批:W05a 迁移兼容 + W05b Run owner 收敛 → 本地行为验证
第二批:W05c 版本传播 → 固定修复后候选 → M01 定向链路复测
→ M04 竞争/故障/一次消费 + M05 完整业务兼容/浏览器跨版复测
第三批:W01 剩余权限边界 + M02;W06 隔离恢复 + M07
第四批:W03 延迟分解与 drill 修正 → M03 独立负载/资源与槽位对照
收口:W04/M06 最终镜像、双架构与外部契约;W02/W07/M08 联合回归
全程:W08 同步场景状态、版本与原始证据;按实际修改执行 W07 拆分顺序表示优先级与验收依赖。W04 证据脚本、W06 恢复环境、W03 采样工具及 M06 版本清单可独立准备;M07 无需等待 M03,M08 的既有用户路径无需等待容量压测。每批选择与修改匹配的最小测试集,稳定性、权限、Schema 或镜像边界发生变化时再补相关跨域回归。
前轮最终 Runtime 来源 e82c793、Backend/Lite 来源 a0779df,精确 image ID 与中间候选的故障记录分别留证。普通 Run 故障演练使用 aab57cd Backend;该轮最终 Backend 仅新增 Renderer 失败 CAS 修复,AI 生产源码未变。隔离 PG 已完成 N-1 schema 前滚。本轮已补完固定样本 M05 的完整旧镜像入口、双库迁移/回滚与产物组合,见 §7。接下来补 M01 剩余交付/取消超时负例、M04 外部交接/attempt/额度/一次消费;随后按既定依赖推进 M02/M03/M06/M07/M08。真实部署 20260930_0100 的应用/发布范围仍需核对,升级继续停旧实例、预览池同版排空切换。
2. 工程工作包
下表将已有交付与剩余产出分开。执行优先级以 §1 为准,最新进度以 §7 为准,§6 仅是历史实施快照。责任域用于确定改动边界。
| ID / 责任域 | 对应问题 | 具体产出 | 完成条件 / 验证关联 |
|---|---|---|---|
| W01 · Runtime/部署,P1 | AR-01 | 已有 UID 降权与全局凭证 0400 边界;补同 UID 子任务的文件访问矩阵、token/网络负例、取消和超时回收,按实测修正实现或限定支持范围 | M02 逐项留允许/拒绝与 PID/槽位回收证据;全局凭证 EACCES 不代表跨任务隔离完成 |
| W02 · Backend/Editor/Runtime,核心实现完成 | AR-02 | 保留生成类型实际消费、隔离重生成、previewSchema 生产校验与双入口精确对拍;新增 DTO/预览协议随 W05c 联动生成 | 已完成门禁持续有效;M08 补真实 UI、权限、双入口与跨仓行为,不重做同一轮单源化 |
| W03 · Backend/观测,P1 剩余验收 | AR-03 | v2 状态/租约口径已修;新增排队、执行、端到端时间与全量结果计数,修正容量 drill 的负载与拒绝归因 | 时间戳与计数可对账,未知量不填零;完成 §2.2 后正式采集 M03 |
| W04 · 交付/测试,P1 | AR-04 | 探针已有;补最终候选的固定 digest、构建入口加载、凭证/清理负例、修复后原始结果与可重跑脚本;整理各模板版本清单 | M01/M06 覆盖最终拓扑与两架构;同 job 重复读取不能计为多个独立任务 |
| W05a · Backend/迁移,P1 首批 | AR-05a | 核对删列 revision 发布状态;制定并实现保留/恢复旧 ORM 所需列的前向兼容方案,以及旧迁移器退出、升级和回滚顺序 | 选定 N-1 在目标 schema 上完成页面入队、Batch 读写/取消/续跑;M05 不能以登录替代业务兼容 |
| W05b · Backend/AI,P1 首批 | AR-05b | 独立于 SSE 的持久化 owner 存活登记、心跳、过期收敛与 CAS;终态解除会话占用,保持普通 Run 不自动续跑 | M04 强杀/重建/PID 重用后旧 Run 有界终态;B 活跃 Run 与有效外部续跑租约受到保护 |
| W05c · Backend/Runtime/部署,P1 第二批 | AR-05c | 发布构建身份与副本 ID 分离;服务端绑定预览版本,覆盖 HTML/模块/CSS 等子请求,或形成可验证的版本路由 | M05 正常 iframe 跨版请求明确拒绝或稳定路由;不依赖用户手工设置请求头 |
| W06 · 部署/运维,P1 | AR-06 | PG 脚本与备份清单已有;补显式隔离目标、数据库/对象/密钥/版本一致性验证和完整恢复演练 | M07 实测登录、页面、资源、凭据解密、预览/截图/构建及 RPO/RTO,负例清晰失败 |
| W07 · Backend/Editor/Runtime,P2 | AR-07 | AssetsView 筛选/详情/批量已拆;随 W05/W01 修改拆 Runtime 身份、进程、工作区和上传职责;资源/包服务按读取、校验、事务与生命周期分责 | API/租约语义保持一致,分层白名单逐步缩小;相关最小测试与 M08,不按行数单独排全仓重构 |
| W08 · 文档与证据维护,随批更新 | AR-08 | 同步计划、兼容矩阵、任务契约、Lite 历史发布/HEAD/候选形态;把 M04/M05 修复后场景原始文件与环境说明补入记录 | 每项完成绑定具体提交、镜像、场景和结果;完整门保持逐项状态,历史摘要不覆盖新的失败 |
2.1 W02 的约束
- OpenAPI 导出应在隔离配置下可重复,不依赖开发者正在运行的服务;不能静默连业务数据库或下载生产数据。
- 手写兼容层可以短期保留,但必须有明确映射和迁移边界;不能长期依赖 8 类字段名子集测试代表完整类型契约。
- JSON Schema 结构验证与 Runtime Kit/工作空间引用授权是两层检查,接入前者不能删除后者。
- 保留四类防漂移反例:Backend 字段类型、可选改必填、非法 previewSchema 嵌套字段、删除指定 method/path 但保留相同前缀。只有新契约输入或失败暴露未覆盖情况时才扩展。
- 不修改 External API v1 的
canceled拼写来追求内部统一;破坏性变化需单独迁移方案和消费者验证。
2.2 W03 的约束
- 使用真实队列状态词汇,避免另一份不受约束的映射;缺列不能无声地等同“没有过期租约”。
- 给 pending、运行占用、供应商等待、Batch 续跑分别定义时间起点与单位。
- 页改/图片领域 Job 与 ExternalTask 的关系要可解释;组件执行虽存于 ExternalTask,也必须能单独观察。
- 用非空 fixture 验证正常排队、重试等待、执行、过期租约和终态;空库只作为补充。
- 采集开销也计入 M03。快照中的最老年龄不能直接冒充所有请求的 P95,分位数需从带时间戳的任务样本计算。
剩余实现与采样要求:
- 为可关联的逻辑请求与执行 attempt 保留入队、开始、结束时间及结果;分别计算
queue_wait_ms、execution_ms和端到端时间,重试等待与多 attempt 单独说明。输出到达/完成/失败/拒绝/超时/取消/在途数量,阶段结束继续采集至排空。 - 指标只保存必要标识、时间与错误码,不复制页面源码、模型历史或密钥。汇总的单位延续 v2 分层;领域 Job、ExternalTask 与 Attempt 不重复算成用户请求。
- M03-F1 记录被拒绝的操作、实际 UTF-8 大小、单项/总量预算、现有占用和清扫结果。先复现拒绝位置,再确定是 payload 设计、预算记账、错误映射还是测试构造的问题,不能直接提高上限。
- 修正 drill:small/medium/large 应构造可区分的 artifact 负载;另设同项目重复新建预览以验证 TTL/清扫,不把这三次同项目预览称为三档模块测试。预算内、单项超限、总量超限分别留证,失败也必须输出结果。
- M03 的预览、页更、截图、构建使用独立请求生成器,记录实际到达率与阶段边界;图片、资源导入/归档另标可用依赖与样本,未采集的类型不得并入容量结论。
2.3 W05a 迁移兼容与回滚
- 起手核对
20260930_0100是否已在实际部署应用、对应镜像是否已发布,并固定 N/N-1 的 Git ref、DB revision、ORM 字段和迁移命令。4c7eee8的缺列复现作为回归输入保留。 - 默认按新增前向兼容迁移设计:为旧 ORM 保留/恢复
ai_page_mutation_batches.lease_generation及旧写路径所需默认值。已应用的历史 revision 不重写;若有证据确认未应用/未发布,可在实施说明中选择相应修订方式。 - 旧列的删除安排到旧实例全部退出、回滚窗口结束后的发布;当前代码可继续不使用该列。兼容检查同时覆盖旧 ORM 的完整 SELECT、INSERT、UPDATE、当前代码与历史数据,不只检查实际业务显式引用的字段。
- 明确谁只运行应用、谁执行迁移。N-1 迁移器缺新 revision 时不得参与升级;平台/Lite 入口的自动迁移开关须与混跑/回滚方案一致,不能仅在手工探针中绕过。
- 先在 SQLite 与真实 PG 隔离库验证前滚、旧/新页面任务、迁移中断、回滚顺序及数据保留,再更新兼容矩阵支持范围。保留列只解决此处兼容问题,不能自动证明全部 N-1 路径可用。
2.4 W05b 普通 Run 的 owner 存活与收敛
- 在平台持久化层登记具体进程实例身份与心跳,失效判定与模型事件空闲时间分开。hostname/PID/实例身份重建与重用都应可辨别,普通 Run 启动与继续执行时绑定实际执行 owner。
- 用独立后台收敛路径处理 owner 失效遗留;终态提交在同事务以 owner、Run 状态与取消状态复核 CAS,保护其它副本、同机 sibling 和仍有效的执行。所有 Run 相关写入遵守既有写围栏。
- paused、waiting_external 与持有有效 Batch 续跑租约的 Run 不得按普通进程遗留处理;收敛条件需与外部协调器交接语义联动验证。历史缺 owner/无心跳记录采用显式迁移/宽限规则,不能恢复全局扫杀。
- 收敛为失败或取消后,会话可再次启动;SSE、查询接口继续只观察,普通 Run 不自动恢复模型执行。用户
force_cancel保留为手动补偿。 - 开跑前固定 owner TTL、心跳与扫描周期,以及租约/写冲突重试的预算;记录由这些参数推导的终态上界,实测不得只比较一次结果与租约秒数。
2.5 W05c 预览版本绑定与传播
- 镜像/发布配置注入确定的构建标识,同一发布的副本使用相同值;副本 ID 独立记录。
dev仅代表开发形态,不能作为生产镜像同版证明。 - 服务端创建预览时绑定期望版本,选择可覆盖浏览器导航与相关子请求的机制;可采用受控版本路径/路由或签名上下文传播。无需浏览器用户手工增加请求头,也不依赖本进程临时 token 缓存保证正确性。
- HTML、页面/组件模块、CSS、Vite/HMR 等相关请求应维持同一版本语义;Backend/Gateway 代理保留诊断所需的版本与错误信息。版本不支持时明确拒绝,不把失配映射成源码错误或 500。
- 同版副本间强制分发仍应可用;跨版必须稳定路由或明确拒绝。验收前保持同版池与排空切换,不因入口 409 放开混版。
- manifest/令牌/HTTP DTO/Runtime Kit 或 Renderer 协议有变更时,联动相应契约包、生成物、指纹缓存输入与消费者测试;接口与公开 import path 继续遵循版本化规则。
3. Lite 镜像专项的接续方式
旧 IMG 方案提出“Lite 内置独立 Renderer 进程,同时继续发布独立 Renderer 镜像”。该方案及历史体积估算已归档;当前 HEAD 未实施 Lite 内置 Renderer。保留既有自用/小团队风险接受,不把文档归档视作新方案获批或工程完成。
| 旧项 | 新计划处置 |
|---|---|
| IMG0 | M01 已有真实 PNG/ZIP;剩余按最终候选走官方完整探针与 executor 默认路径,补入口加载、凭证与清理负例,不单凭 --no-sandbox 作结论 |
| IMG1 | 旧文档纠偏已有记录;AR-08 发现的剩余矛盾由 W08 更新 |
| IMG2–IMG4 | W04/M06;先核对现有发布,再决定是否需要预发布 |
| IMG5–IMG8 | 条件候选:若仍选择内置 Renderer,落实包/进程隔离、监督退出、强随机凭据持久化、卷权限和编排迁移 |
| IMG9–IMG11 | W04/M01/M03/M06;两种架构各自保留真实截图和产物下载证据 |
| IMG12 | 仅在对应交付形态实际通过后更新发布与回滚文档 |
候选实现的前置是 M01 基础链路通过、M03 有当前拓扑基线、W01/既有威胁模型对拟合并形态给出明确权限设计。若实施合并,变更后必须重新跑 M01/M03/M07,原两容器结果不能直接给新形态背书。合并镜像不意味着把浏览器放回 Backend 进程;Backend 运行环境约束继续遵守 AGENTS.md。
本轮不设“必须合并”的里程碑,也不根据历史压缩层大小保证体积持平。若测试不达标,保留已验证的独立 Renderer 交付路径,记录候选推迟原因。
4. 后续验证矩阵(本地 Docker 与测试机)
以下保留 M01–M08 编号与完整完成条件,按最新证据更新前置和剩余场景;§7 记录对应实施与实机证据。原运行记录中的大项关闭标记不能替代逐场景验收。
本地 Linux 容器可继续承担隔离行为、故障、权限、迁移及恢复演练,无需为这些场景先申请测试机。真实 arm64、Registry/外部部署与无其它负载干扰的正式容量基线需要对应架构或独立资源;本轮 Docker Desktop 的 16 CPU/约 14 GiB 不代表 2C4G Lite 达标。
4.1 开跑前固定条件
- 记录候选提交 SHA、补丁/工作区差异及校验和、镜像 digest/CPU 架构、主机 CPU/内存、Docker/Compose 版本、依赖锁文件和 DB revision。修复后候选不能沿用旧镜像身份。
- 优先复用明确属于本次测试的环境;先确认已有服务和端口,避免反复启动。使用独立 Compose project、数据卷、数据库、对象前缀及测试账号;不使用生产恢复目录。
- Lite 基准目标为受限 2C4G;多副本使用独立较充足资源(旧清单 4C8G+ 仅作资源起点,不是“足够”的证明),每个角色记录实际资源限制。
- M03 保留约 3 个预览并发、5–10 测试用户的目标工作负载,先采空闲 10 分钟基线再逐级施压;各业务独立到达,用户数与并发只是输入,体验验收仍需预先确定分业务延迟和成功率目标。
- 采用有效测试凭据,记录 key id/来源即可,不把密钥、访问 token 或登录态写入结果仓库。
- PG 与 Redis 使用真实测试实例,不能以缺配置跳过冒充通过。记录双库/租约参数、owner 心跳/TTL/扫描预算、Runtime 发布身份和副本 ID,以及迁移由哪个入口执行。
- 升级/回滚前确认目标 schema、实际已应用的 revision 和 N-1 可识别范围;使用隔离库与可恢复快照,不让旧实例自动迁移器误入未知 revision。
- 通过明确的内部采集入口观察队列、租约与 Runtime 状态,并验证响应确为指标数据;不能把 Gateway 返回的 SPA HTML 当指标,也不为测试默认公开内部指标。
- M03 前必须完成 W03;若指标尚未修复,只允许做预采样并标注,不签署容量结论。
4.2 场景、门槛与产物
| ID / 当前状态 | 前置 | 下一轮测试机动作 | 通过条件与必须保留的证据 |
|---|---|---|---|
| M01 · 真实交付链路,部分完成 | W04;隔离凭据与修复后最终候选 | 对 Runtime/Renderer/platform/lite 固定 digest,按实际入口运行官方完整探针;截图、构建 ZIP 下载并加载入口;补缺失/空 Worker 凭证、取消与超时清理负例。W05 变更后先定向复测受影响链路 | PNG 可解码且对应目标页,ZIP 入口实际可加载;凭证缺失拒绝;浏览器、子进程和槽位释放。健康端点或手动 Playwright launch 不替代这些证据 |
| M02 · 凭证与执行隔离,局部证据 | W01 剩余边界、M01 | 补编译子进程挂载/UID/权限/网络允许与拒绝矩阵;同 UID 任务间文件、全局 Worker 凭证、其它任务 token/接口访问;浏览器控制 API/内网访问;取消和超时回收 | 逐项证明所承诺的隔离;记录任务 token 范围、路径权限与进程退出。已有 EACCES 只证明全局凭证不可读;Lite 接受项不算生产多租户隔离通过 |
| M03 · Lite 容量与双库压力,探索完成/正式门开放 | §2.2 W03、M01 | 2C4G 基线使用独立业务生成器与完整时间窗;记录预览/页改/截图/构建及可用图片/资源操作;SQLite/PG 锁与执行耗时对照,修正 M03-F1/drill;对比增 CPU、Runtime 分角色或增加单槽 Renderer,控制全局预算 | 输出各业务排队/执行/端到端 P50/P95、到达与全量结果计数、RSS、锁重试/耗尽、拒绝、排空与产物。单槽继续保持;不能由零样本断言饥饿,也不能用计划时长计算实际吞吐;预定体验门槛满足才关门 |
| M04 · 跨副本与故障恢复,基础证据/完整门开放 | W05b、M01;2 Backend、2 preview、2 build/check 执行副本、2 Renderer,共享 PG/Redis/存储/密钥 | 按 §4.5 定向测试 owner 失效与 B 活跃保护、独立任务竞争、租约/迟到 attempt、双协调器与一次消费;页面/图片/组件取消及 Worker 摘流。跨 preview 版本场景由 W05c/M05 验收 | 旧 owner 的普通 Run 有界终态并解除会话;活跃 Run 不误杀;额度不超限、旧 attempt 不提升、Batch 仅消费/续跑一次。使用不同 Job/Attempt ID,补修复后的原始日志与状态文件 |
| M05 · 版本与升级回滚,固定样本定向完成 | W05a/W05c、M01、M04 基础场景 | 完整旧/新 ORM 与页面任务、真实 platform/Lite、双库迁移中断/应用回滚及旧 Kit 产物组合已通过;浏览器传播沿用既有定向证据 | 支持范围绑定本轮 ref、镜像和配置;旧 Runtime 缺身份明确不支持预览/截图,独立 ZIP 另验。真实发布范围和最终模板继续核对,不外推任意旧版本或无中断混跑 |
| M06 · 发布与远端门禁,未执行 | W04、M01;目标 registry/仓库可访问 | 各 Compose 模板的 manifest/digest 与可拉取性;amd64/arm64 各实际截图与下载产物;外部 Gateway 验 OpenAPI;核对 required checks 与真实 job 名,确需发布时使用固定预发布 tag | 记录模板镜像权限、固定版本与双架构真实产物;构建成功不替代运行;外部契约 JSON 满足检查,门禁配置与运行结果分别留证。不自动移动 latest/sqlite-lite 或改仓库可见性 |
| M07 · 系统恢复,未执行 | W06、M01;可独立于 M03 准备与执行 | 显式隔离目标恢复 SQLite/PG、资源/产物、密钥及版本;模拟缺资产、错误密钥、版本失配;验证登录、读页、凭据解密、预览/截图/构建下载 | 恢复点与时长可计算,关键资产校验和一致;真实 RPO/RTO 对照预定目标,负例清晰失败。目标锁定与操作轨迹留证,清理仅限本轮环境 |
| M08 · UI、权限与跨仓回归,未执行 | W02 已落地;纳入本轮 W07;M01 | 资产筛选/详情/批量,AI 进程停止文案与会话重新发起,富文本自闭合/成对空节点;跨用户工作空间写入拒绝;双入口读写/异步任务/归档;匹配 agent-kit 版本联调 | 真实行为与权限满足契约;自闭合无富文本写绑定、成对空节点可编辑、诊断不使整页失败;停止后可按终态再发起。保留 E2E 报告、截图、两个仓库的候选版本 |
M03 的性能门槛在第一次正式采集前由目标工作负载确定并写入运行记录;当前只有团队规模和预览并发目标,没有已批准的 P95 数字,本计划不虚构 SLA。若暂时不能定阈值,产物仅标“探索性基线”,容量门保持开放。
4.3 可复用命令
下列为仓库已有入口,按实际修改选择最小相关集合;命令清单不表示执行状态,历史本地与实机证据见 §6/§7。故障注入、版本组合、恢复与 registry 检查仍需对应场景脚本,不能仅靠总测试命令关闭。本轮已实施 W05a/b/c 并执行本地定向回归,未重新执行完整测试机矩阵。
# 契约与代码改动验证
pnpm run codegen:editor-api
pnpm run test:contracts:generated
pnpm run test:backend:unit
pnpm run test:backend:api
pnpm run test:backend:integration
pnpm run test:contracts
pnpm run test:repository
pnpm run test:editor:gate
pnpm run test:runtime:gate
pnpm run test:render-contracts
pnpm run test:renderer
pnpm run test:python-workspace
# 真实依赖与交付验证:仅在本轮专用测试环境已准备后执行
pnpm run test:backend:pg-claim
pnpm run test:backend:runtime-state-parity
pnpm run test:contracts:gateway
pnpm run test:contracts:docker-context
pnpm run test:lite:runtime-state-drill
pnpm run test:render-e2e
pnpm run test:e2e:regression
pnpm run test:contracts:cli-skilltest:render-e2e 和 E2E regression 的 prepare 会准备/重置 smoke 数据,只能指向本轮专用测试数据。PG 配置使用 P4_POSTGRES_DATABASE_URL、P4_POSTGRES_REQUIRED=1;Redis 对拍使用独立库和 RUNTIME_STATE_PARITY_REQUIRED=1,不能将生产 Redis 填入。执行前按测试命令文档复核环境变量。
外部 Gateway 契约使用 check-gateway-openapi.py;镜像使用 check-image-startup.py,完整拓扑使用新增 check-deployment-pipeline.py;入口与证据边界见测试命令;Worker 摘除使用 uv run --project backend python -m app.scripts.check_render_worker_removal。参数在下一轮按入口 --help 和实际测试拓扑填写,本轮不猜测地址或凭据。
4.4 结果记录模板
下一轮创建 docs/temp/runs/<实际日期>-<候选短SHA>/summary.md;不要提前创建空的“通过”报告。原始大日志/二进制进入 CI artifact 或既有 test-results/e2e/,摘要只记录可访问的证据位置、校验和与必要统计,不将可重生成的大产物入库。
| 字段 | 必填内容 |
|---|---|
| 标识 | M 项编号、关联 AR/W 项、执行人、起止时间与时区 |
| 环境 | Git SHA/补丁校验和、镜像 digest/架构、发布与副本身份、机器资源、拓扑、DB revision、租约/owner 收敛配置 |
| 前置/目标 | 前置工作是否完成;性能/RPO/RTO 预定阈值;测试数据范围 |
| 操作 | 实际命令、迁移/故障注入顺序(脱敏)及退出码;逻辑请求/Job/Attempt/Batch/Worker 的关联关系 |
| 结果 | 通过/失败/受阻/未执行;实际到达与执行时间窗、排空结束时间、全量结果数和分业务样本;实际数值与阈值对照 |
| 证据 | 原始日志、PNG/ZIP、状态迁移、浏览器请求和指标快照的路径或 artifact 链接与校验和;复测不得只改摘要 |
| 后续 | 缺陷编号、恢复/清理结果、复测条件、承诺是否可调整 |
机器未到位、权限不足、测试跳过、探针通过但业务失败,都保持“受阻/未通过”,不能将旧记录粘贴为当前成功。
4.5 M04/M05 的必测定向场景
下列是现有矩阵的场景细分,不增加另一套总编号。每行记录独立输入、候选版本、状态变化和原始结果,部分通过仅关闭相应场景。
| 归属 / 场景 | 操作与关键断言 |
|---|---|
| M04 / owner 失效 | 对普通 Run 强杀 owner、重建容器/改变 hostname、构造 PID 重用;旧实例身份失效后按预算收敛,终态释放会话,新 Run 可启动;普通 Run 不自动恢复模型执行 |
| M04 / 活跃与交接保护 | A 重启/扫描时 B 持续执行,覆盖同机 sibling、长时间无模型事件但 owner 正常、paused/waiting_external、有效 Batch 续跑租约;与取消/续跑竞争时 CAS 与写围栏阻止旧执行提交 |
| M04 / 认领与额度 | 多个独立 Job 同时入队并由双执行副本竞争;分别保存 Job/Attempt/Worker ID、认领时间与额度快照。重复读取同一 Job 不计为新的任务或认领样本 |
| M04 / attempt 与取消 | 杀执行进程、租约过期/回收、晚到上传及取消与完成竞争;过期 attempt 无法提升,页面版本复核生效,浏览器/子进程/槽位与额度回收;Worker 摘流前运行既有检查入口 |
| M04 / Batch 一次消费 | 页面/图片/组件同 step 封口,包含成功/失败/取消、供应商 next_poll_at 与双协调器抢占;全部终态只恢复一次,Requirement 与有效 resuming 租约匹配,消费后清空完整 Task result |
| M05 / 旧 ORM 与业务 | 固定 N-1(保留 4c7eee8 回归输入),在前向兼容 schema 上运行完整 SELECT/INSERT/UPDATE、页面入队/Batch 读写、取消/续跑;SQLite 和真实 PG 均留证,当前版本与历史数据同步验证 |
| M05 / 启动、迁移与回滚 | 从 N-1 schema 前滚,覆盖迁移中断与约定的回滚/补偿顺序;按真实 platform/Lite entrypoint 启动,明确旧实例禁用迁移或退出。未知 revision 与不支持组合明确报错,旧列删除晚于回滚窗口 |
| M05 / 浏览器版本传播 | 正常 iframe 导航,强制 HTML 与模块/CSS/Vite 等子请求落到同版不同副本和不同版副本;同版可用,跨版稳定路由或明确拒绝,并记录版本/错误响应,无需人工请求头 |
| M05 / 公共能力组合 | 按兼容矩阵验证 N/N-1 Runtime/Renderer、旧 Kit 产物及目标 Backend 的真实截图/构建;入口拒绝、协议拒绝、构建与产物加载分别留证,不用单一 HTTP 结果替代整组 |
10-01 对本表 M05 的完整旧镜像、启动/迁移/回滚与公共能力组合已执行,结果见固定样本实机记录。23 个旧 Kit 入口逐项对拍,实际渲染样本为表格与页面尺寸;旧 Runtime 入口 503 与截图真实失败、旧 Renderer 500 历史限制分别保留。浏览器同版双副本及具备门禁的真实旧镜像跨版 409 沿用既有记录,不把它外推到更早且无版本路由门禁的 4c7eee8。
5. 验收门与失败后的处理
| 门 / 当前状态 | 关闭条件 | 未通过时 |
|---|---|---|
| 核心契约门 / 已完成约定实现 | W02 现有生成消费、生产 Schema 与正反例保持通过;新 DTO/协议同步生成与消费验证 | 新漂移重开对应范围;真实 UI/双入口/跨仓行为另由 M08 关闭,不因尚未跑 M08 重做已完成实现 |
| 观测门 / 基础完成、采样开放 | W03 非空对账与 §2.2 时间/计数/drill 口径正确,可解释拒绝与排空 | 容量只做探索,不能将队列年龄当请求 P95 |
| 普通 Run 收敛门 / owner 定向通过,保护矩阵开放 | 强杀/暂停/hostname 改变/PID 重用、静默 B 保护、会话解除与迟到写拒绝已实测;paused/waiting_external/有效 Batch 续跑保护仍需补齐 | 保留手动取消与中断限制,不把 owner 局部通过写成外部交接完整门关闭 |
| 迁移兼容门 / 固定样本定向通过 | 完整旧/新依赖、双库 ORM/页面业务、真实入口、迁移中断与保留 schema 的应用回滚通过,支持 ref 与配置明确 | 真实已发布迁移范围仍需核对;继续停机前滚与关闭旧迁移器,不承诺迁移中混跑 |
| 预览版本门 / 浏览器与固定组合定向通过 | 既有同版双副本/具备门禁旧镜像跨版 409 有效;本轮全 N、N Runtime/旧 Renderer 与旧完整入口公共 Kit/产物通过,旧 Runtime 缺身份明确拒绝 | 保持同版池与排空切换;最终模板、每项能力渲染及任意旧版本兼容不外推 |
| 镜像交付门 / 部分链路通过 | M01 + M06 对最终候选、模板与目标架构通过 | 不将旧 tag、历史产物或 workflow 定义当当前完整交付 |
| 隔离门 / 局部证据 | W01 + M02 所承诺的文件/token/网络边界及取消/超时回收通过 | 维持既有受限威胁模型,不扩大多租户承诺 |
| 多副本门 / 完整场景开放 | M04 + M05,相关隔离、共享存储/密钥及角色预算前提齐备 | 只保留逐场景已验证能力;完整门保持待验,不承诺滚动无中断 |
| 容量门 / 探索基线完成 | M03 分业务稳定样本达到开跑前目标,独立到达与全量结果可对账 | 调整资源/推荐规模或实现后定向复测,不保留名义 SLA |
| 恢复门 / 未执行 | M07 完整业务恢复达到预定 RPO/RTO,负例与隔离目标留证 | 保持 AR-06 与恢复限制 |
| 行为与跨仓门 / 未执行 | M08 用户路径、工作空间权限与匹配 agent-kit 候选通过 | 对应交付范围继续待验,不用类型检查替代行为证据 |
失败只重跑与修复相关的集合及必要跨域回归;若变更了镜像拓扑、DB Schema、权限或执行生命周期,则相应门重新开放。架构项关闭需要具体提交与结果位置,禁止用“WS 已完成”替代。
6. 实施进度与本地证据(2026-09-30 第二批)
首批(W02/W03/W04)已随 2045f55 提交;第二批 W01/W05/W06/W08 已随 a49d1c7、acae00e、541bc90 提交。以下保留当时的实施快照,针对已提交代码,不代表已发布或远端 CI 通过,也不包含本次新增 W05a/b/c 的剩余实现。
| 工作包 | 当时状态 | 本批交付与剩余条件 |
|---|---|---|
| W02 | 约定范围内代码与本地门禁已完成 | 核心 API DTO 实际引用生成物;CI 隔离重导并比较完整生成物;previewSchema 生产结构校验与两端类型生成;共享正反例;Top 操作精确 method/path、响应与差异对拍。其余手写视图/请求类型保留明确迁移边界;M08 未执行 |
| W03 | 代码与 SQLite 非空对账已完成 | 修复渲染状态,区分 Request/Attempt;增加组件 kind、Batch 与供应商轮询指标;totals 只汇总领域任务行。真实 PG、采集开销和 M03 容量验收仍待执行 |
| W04 | 探针代码与本地模拟测试已完成,交付门开放 | Renderer 镜像走真实控制 API/生产执行器并保存 PNG、回执和镜像身份;完整拓扑探针经 Gateway 检查截图和构建 ZIP;CI 上传镜像证据。真实容器、最终站点加载、全 Compose 版本清单及双架构执行仍待 M01/M06 |
| W01 | 代码与权限矩阵已落地,M02 开放 | 执行隔离文档;rtworker/rtchild 分 UID、spawn 降权、任务工作区 setgid;凭证宽松权限在已配置降权时 fail-closed。M02 测试机证明不可读/不可越权仍未执行 |
| W05 | 兼容矩阵与 Run 边界已文档化并补测,M04/M05 开放 | N/N-1 组合、停机/滚动/排空策略;修正 multi-backend 误写的全局收敛;hostname/PID/PID 重用边界与验收用例。实测组合仍未执行 |
| W06 | PG 备份恢复入口与清单已交付,M07 开放 | pg-backup.sh/pg-restore.sh(校验和、alembic、隔离目标);备份清单、一致性顺序、RPO/RTO、隔离演练与验证/负例。真实演练未执行 |
| W07 | 筛选/批量/详情已拆出 | useAssetListFilters+AssetFilterSidebar、useAssetBatchSelection、useAssetDetail+AssetDetailDialog;AssetsView 约 1885→1009 行,19 项集成测试通过。新建/上传/回填弹窗与 asset_service 后续按改动再拆 |
| W08 | 随本批更新 | 更新计划进度、任务运行时契约恢复列与 Run 收敛描述;兼容矩阵/执行隔离/备份恢复已入部署文档导航。其余历史专题矛盾继续按实际修改维护 |
本地验证(第二批):
- Runtime:
runtime-build-worker/runtime-build-runner.infrastructure/runtime-diagnostics-workspace-pool共 48 项通过(2 项 POSIX-only 在 Windows 跳过);pnpm --filter web-runtime-vue check通过。 - Backend:
test_ai_run_recovery_owner.py12 项通过。 pnpm run test:repository:13 项通过(含文档链接)。- 首批既有本地验证仍有效(contracts/generated、editor/runtime check、previewSchema、队列指标等)。
以上是第二批本地实施时的记录,当时 M01–M08 未执行。随后测试机已产出 §7 的结果,不再用本节快照描述当前总进度。Vite 测试输出既有的未来 native config-loader 兼容提示,未据此改动运行配置。
下一批以 §7 的剩余条件和现行评估优先级执行;W07 按实际改动继续拆分。探针产物、容量数字与恢复记录必须来自实际执行。
7. 实机进展与复核后的有效状态(2026-10-01)
证据来源:测试机总记录、容量、阶梯负载、多副本、版本。这些记录使用 a06120e + 修复 等镜像,不能自动代表最新 HEAD 的最终发布候选。
| 项 | 有效状态 | 下一步 |
|---|---|---|
| W02/W03 | 核心实现与本地门禁完成 | M08 行为回归;M03 延迟分解、压力下对账 |
| W01/M02 | 降权与全局凭证不可读有局部实机描述;截图取消/超时/故障后无浏览器、驱动或僵尸残留,完整门开放 | 跨任务权限/token/网络与其它业务进程回收负例 |
| W04/M01 | 既有 Gateway PNG/ZIP、Lite/Renderer 实际入口、凭证与截图生命周期通过;本轮补最终 N platform/Lite 真实 CMD 的公共 Kit 预览/PNG/ZIP/加载和完整旧四镜像构建 | 最终正式 Compose 模板、Registry/digest/arm64;其它执行域取消与超时回收继续验收 |
| W03/M03 | 探索性容量已采集,正式门开放 | 先分业务定义目标;独立负载生成、排队/执行耗时、M03-F1 定位与角色/槽位对照 |
| W05a/M05 | 固定 4c7eee8 完整旧镜像/独立锁,PG/SQLite 原始入口、完整 ORM 与页面创建/取消/自动 deferred 续跑、真实迁移中断、前向补偿及保留 head 的完整应用回滚通过;修复 SQLite 首个 DDL 半迁移 | 固定样本定向完成;真实已部署删列 revision 范围仍核对,继续排空停旧、N 独立迁移器前滚、回退应用关闭旧迁移器;不恢复删列前历史代次 |
| W05b/M04 | 本轮双 Backend 实测强杀、暂停、hostname 改变/PID=1 重用;13.299/11.635/11.479 秒收敛,静默 B 保护、唯一终态、会话解除及迟到写拒绝通过 | paused/waiting_external/有效续跑租约保护和取消竞争继续补齐;本轮 12/2/1 秒配置不是默认生产 SLA,历史未登记 Run 保留原补偿路径 |
| W05c/M05 | 既有 iframe 同版双副本/实际旧镜像跨版拒绝有效;本轮 N/N-1 Runtime/Renderer、23 个旧 Kit 入口指纹与两个实际渲染能力、完整旧两入口及最终 N 两入口 PNG/ZIP/加载通过;旧 ZIP 经 N 原产物接口重下摘要不变。缺身份旧 Runtime 的预览/截图不支持,独立 ZIP 另验;N Renderer 协议语义错误改为 400 | 固定样本组合完成;最终模板、任意旧版本混池与其它公开能力渲染仍按实际范围补证,继续同版池排空切换;旧 Renderer 原镜像仍有 500 映射限制 |
| M04 其余场景 | 双 Build/双 Renderer 正常独立任务竞争已通过;本轮截图导航取消、PNG 返回取消竞争、硬期限、Renderer SIGKILL/自然租约回收及迟到真实 PNG 拒绝均通过,两个 Worker 无进程/临时文件/占用残留 | 截图生命周期定向门已通过;按 §4.5 补构建强杀/迟到上传、额度饱和、外部交接与 Batch 一次消费,完整门开放 |
| W06/M07 | 脚本与清单完成,业务恢复未执行 | 隔离目标中恢复 DB/资源/密钥/版本并验登录、凭据解密、预览/截图/构建及 RPO/RTO |
| W04/M06 | 发布定义存在,远端/双架构验收未执行 | 拉取/digest/arm64 真实产物、外部 OpenAPI、required checks |
| W07/M08 | 资产筛选/批量/详情拆分完成;联合回归未执行 | UI、权限、富文本、双入口及 Agent Kit 匹配版本 |
| W08 | 本轮评估、计划状态、归档和版本矩阵纠偏 | 按实际交付继续对齐 Lite 形态与历史专题,不把候选写成已发布 |
架构评估本地复核:Backend 五组单测 52 通过,Runtime 三组 49 通过/3 跳过,生成物检查通过;实际旧 ORM 在独立内存表中复现 no such column: ai_page_mutation_batches.lease_generation。这属于静态代码与隔离复现证据,没有重新执行测试机演练。
W05a 本地修复新增前向迁移,未改已存在的删列 revision;旧 ORM 缺列负例、修复后完整 SELECT/INSERT/UPDATE、当前 ORM 省略兼容字段写入及迁移往返两项回归通过,既有 SQLite 迁移八项通过。W05b 新增 20260930_0300 实例表迁移,存活/启动/DB 边界 47 项、模型/超时/外部队列/管理器/迁移 51 项通过。W05c 的 Backend 正常入口/签名/换票 8 项与 Runtime 身份/HTTP/HMR/模块/健康/配置 52 项通过,Runtime 类型检查与生产构建、根仓 contracts 41 项、真实 Nginx 回归与 Docker 上下文检查通过;未变更 HTTP DTO、Renderer 协议或 Runtime Kit 公开路径,无新增类型生成物。本轮另在独立 PostgreSQL 16 容器执行认领与双库 head 迁移门禁,9 项通过/1 项历史字段跳过;未在业务数据库应用迁移,也未执行完整测试机矩阵。
分步提交:文档纠偏 652c835;W05a 前向兼容 9afce53(导入规范 563cf7f);W05b 实例心跳与写围栏 99b041d;W05c 签名版本与浏览器传播 7a521ad,交付输入 hash 完整覆盖 aab57cd;PG UTC 夹具修正 8128b91。
最终代码候选 aab57cd 已在本机 Docker Desktop/Linux amd64 构建 Runtime 与 Lite,生产依赖裁剪后真实入口、模块/CSS/Vite、跨版 HTTP 与 HMR 拒绝通过;两种交付形态的 Runtime 指纹一致。另验证 Runtime 缺身份实际启动失败。原始镜像身份与具体边界见本地实施记录;没有新的 Renderer 截图/ZIP 或双架构证据,不关闭 M01/M06;未推送或发布候选。
上述 aab57cd 是上一轮镜像记录。本轮最终 Runtime 来源 e82c793,Backend/Lite 来源 a0779df;原始证据、镜像构建差异及分步提交见09-30 至 10-01 Docker 演练。可重跑脚本和命令见测试说明。本轮定向 Runtime 52 项及类型检查、Backend 56 项、根 contracts 41 项通过;普通 Run、浏览器、真实产物、凭证和独立任务的已通过场景不再列为待执行,完整门按本节剩余条件保留开放。
10-01 后续截图生命周期演练基线为 b3771bc + 本轮补丁(镜像构建时尚未提交,随后代码与记录一并提交),最终 Lite/Renderer 官方镜像分别为本地 191a9ca… / 936a364…,Runtime 复用 e82c793;精确身份及源码/补丁摘要见本轮记录。实测修复取消未传递、Worker 不可达仍续租、结果提交取消/期限/租约竞争及 PID 1 僵尸残留;两个隔离项目清理完成。Backend 85 项、根 contracts 41 项、repository 13 项、Docker 上下文、最终五场景及正常 PNG/ZIP/浏览器链路通过。没有推送或发布,不把本轮定向结果视为完整 M01/M02/M04/M05/M06 关闭;下一步按剩余条件推进 M05 完整旧镜像入口/回滚和公共能力组合。
上述下一步已由 73b0036 + 本轮补丁的完整 M05 演练执行:N-1 原始四镜像均使用其完整 Git 源和锁文件,N 最终两种入口也通过真实 PNG/ZIP。SQLite 实际 DDL 后 SIGKILL 暴露半迁移,独立迁移引擎显式事务修复后重试通过;Renderer 实际无效协议 500 修为 400,保留过期票据幂等。旧 Lite 远程截图要求可达 Runtime 角色基址,配置后复测通过,旧源码不变。Backend 最小迁移集合 31 通过/2 跳过,Renderer 27 通过、render-contracts 22 通过、repository 13 通过。三个专属库×两个 Worker 的六项只读摘除门禁通过,专属项目容器/卷清理完成,开发 PG/Redis 健康。此轮完成固定 ref 与配置范围的 M05,M02/M04 其余场景、正式容量、M06 远端/双架构/最终模板、M07/M08 保持开放。