13 KiB
13 KiB
执行清单与验证记录
授权与工作区
- 2026-09-05 用户已批准 PRD 并实施,task 已幂等 start,状态 in_progress;实施后先交独立 diff,不自动提交或部署。
- 基线 HEAD:
05d2a3f。已有旧 task 的 implement.md 未提交交接笔记必须原样保留,不纳入本 task 提交;Trellis 升级独立 worktree 不操作。 - 当前无原生 update_plan,以本文件为执行清单,不另建计划系统。inline 主会话实施和检查,不派 implement/check 子代理;实施后的只读独立 reviewer 按用户要求执行。
- deployment spec 体积超过自动上下文注入上限,task validate 会提示截断风险;主会话及后续只读 reviewer 必须按目标章节直接读取源文件,不以自动注入内容代表完整规约,不在本 task 顺手拆分 spec 或调整注入配置。
已完成规划核对
- 核对 wrapper 固定 existing、远端模式校验与显式 db/间接依赖三个入口。
- 确认 server、worker、init 都在当前 Compose 文件依赖健康 db;MinIO profile 单独覆盖。
- 检查现有 deployment-safety-contract.test.js 的 fake PATH/临时目录及静态合同模式。
- 完成 PRD、设计、实施顺序和验收矩阵;只写当前 task 材料。
- 用户审阅本轮最终方案并批准实施;将健康等待明确为固定 120 秒,测试 PATH 仅作用于临时子进程,保留旧工具命令作为首次真实发布的人工恢复参考。
批准后实施顺序
- 读取 trellis-before-dev 与 deployment/test/spec 相关约束,复核未变化基线;先用真实远端段构建命令捕获回归,证明原行为触发 db 违规。
- 将显式 db up 限制到 initialize;补 existing/initialize 的有界只读就绪检查,保持既有安全门禁。
- init/server/worker 隔离依赖,验证可选 profile 无 db 旁路;不改 migration/seed 内容。
- 执行正向矩阵与四类源码变异,验证具体违规服务与执行阶段;补非法模式、db 不可用、init 失败阻断。
- 将专用测试接入 run-release-gate.sh static,更新现有 deployment spec;不夹带其他门禁整改。
- 主会话 trellis-check,启动只读独立 review,修复当前范围内问题并复验;交付一个 task 的独立 diff 待审。
- 提交、push、生产执行、归档等待对应明确授权;不因 task 立项自动开展生产动作。
验证入口
- 专用测试路径:
server/tests/unit/scripts/deployment-db-lifecycle.test.js;使用现有 Vitest,覆盖 V1/V2、模式、worker、MinIO、失败及变异矩阵。 - 相关合同:
cd server && npx vitest run tests/unit/scripts/deployment-db-lifecycle.test.js tests/unit/scripts/deployment-safety-contract.test.js。 - Shell:
bash -n deploy/trialrun/deploy.sh deploy/trialrun/deploy-existing.sh scripts/qa/run-release-gate.sh。 - 既有 static 门禁、env contract、Trellis validate/governance、docs registry、process baseline、git diff --check。
- 生产发布前后 db 容器身份比较仅为未来获批验收设计,本轮不 SSH、不运行真实 Docker,不执行迁移/seed,不测真实数据。
待交付停点
本轮停在本地实施与 diff 复核;不提交/push/部署/归档。财务 403 及其他债务不纳入此 task。
实施与验证过程(2026-09-05)
- 真实远端段 baseline 红测:原部署脚本可执行到最终服务状态,但服务语义断言报
database_lifecycle_forbidden:up,run,up,Vitest 退出 1。首个 harness 调试因缺少白名单 chmod 提前退出,不作为缺陷复现;补齐后才得到上述真实违规。 - 显式 db up 已移入 initialize 分支;existing 不修复缺失/停止/不健康 db。固定 120 秒强制 deadline 和 2 秒轮询覆盖状态查询卡住;init/server/worker 及显式选择的 MinIO 服务隔离依赖。
- fake 来自测试专用临时目录,只有测试子进程使用白名单 PATH/env;DOCKER_HOST 指向临时不存在 socket,DOCKER_CONFIG 指向临时目录;没有继承真实凭据或 Docker 配置,不修改父进程 PATH。测试结束清理临时目录。
- 捕获器解析参数及当前 Compose 图,区分一次性 init 删除和 db 删除;未知调用失败。四类变异作用于实际 REMOTE 源码的临时副本,先断言修改命中,再核对 forbidden db 事件;不修改仓库脚本做探针。
- timeout 专项两项通过(持续 starting、inspect 卡住);仅临时副本缩短为 1 秒,实际执行 GNU timeout 验证强制截止,生产值保持 120。初轮 fake 未把被 SIGKILL 的子进程映射为 shell 的 137,导致两项失败;修正 fake 信号转码后重新通过,不改产品退出逻辑或放宽断言。
- 既有部署安全与来源合同:
deployment-safety-contract.test.js24 项、check-source-provenance.test.js7 项,共 31 项通过。均本地合成,不接触生产。 - 首轮 static(当时 41 项新回归)通过,含 Prisma validate、client typecheck/build;后续 review 增量完成后再次复跑,不以此前通过替代最终版本验证。
- 独立 reviewer 首轮发现 P2:单次健康检查早于耗时构建,可能在 db 随后变坏时仍进入 init/应用切换。已复用有界检查并把 server build 与切换拆开;worker 显式准备镜像后检查,以 --no-build 阻止检查后的隐式构建。补五个跨阶段健康漂移场景与 worker 有/无镜像测试,待最终验证和只读复核闭环。
- 追加复核发现 P2:worker 关联镜像 ID 非空但启动标签可能已缺失。已改为容器 Config.Image 引用校验,标签缺失则先构建,且整个准备阶段前移到 server 切换之前;补该具体边界回归,不把 Docker image ID 与可用启动引用混为一谈。
最终本地验证与 diff 交付(2026-09-05)
| 检查 | 实际结果 |
|---|---|
bash scripts/qa/run-release-gate.sh static |
PASS;最终版本 49 项专用回归全部通过,Prisma validate、client typecheck/build 通过。 |
| 部署安全与来源合同 | 两文件 31 项 PASS;与上行 49 项不重叠,共 80 个不同用例。 |
| 四类变异 | 源码中恢复无条件 db up、分别移除 init/server/worker 隔离,均执行到受测阶段并触发按 db 服务判定的违规断言;正常发布测试必须到达 init、应用及最终状态。 |
| 健康漂移与镜像 | 五类跨阶段健康变化、worker 现有/缺失镜像及标签缺失用例通过;真实 timeout 在临时缩短版的持续 starting/卡住 inspect 场景通过。生产每次仍固定 120 秒。 |
| 工程与治理 | shell syntax、JS/CJS syntax、Trellis validate/governance、docs registry、process baseline、敏感扫描、git diff --check 通过。task validate 的大 spec 注入截断警告保留并已要求直接按章节阅读。 |
| 只读独立 review | 两项 P2 均在代码和回归设计层面闭环,无新增高置信问题;reviewer 未写文件、未执行测试或生产操作,最终运行结果由主会话提供。review 已结束并关闭。 |
| 环境边界 | 测试只使用临时合成 env/路径/fake;未连接真实 Docker daemon、SSH、数据库或生产系统。仅查看本机 Compose 帮助/版本确认现有 CLI,不将其视为真实 V1/V2 发布验证。 |
完整隔离 diff(包含未跟踪新增文件,排除旧 task 笔记):artifacts/qa-flow/existing-deploy-db-lifecycle-isolation/review.diff。
旧工具原始命令序列:artifacts/qa-flow/existing-deploy-db-lifecycle-isolation/old-tool-sequence-05d2a3f.txt,只读参考、不可执行;稳定恢复边界见 design.md,不能照抄旧序列启动 db 或重放 init/seed。
AC1–AC7 已完成本地验收;AC8 的首次真实发布观察保持未执行,需单独批准并由人工盯住工具与应用两个恢复面。不提交、push、部署或归档,task 保持 in_progress 等待用户 diff 复核。旧错误可解释性 task 的交接笔记 diff 摘要在本轮前后保持一致,未纳入隔离 diff;Trellis 升级 worktree 未操作。
根因与防复发
- 根因属于跨层合同传播缺失和隐式假设:existing 模式只约束数据目录,未约束真正执行命令;原测试没有执行命令并计算依赖传播。
- 仅移除显式 up db 会遗漏 run/up 依赖;仅加 --no-deps 又会丢失 service_healthy 时序;只做一次健康检查会被耗时阶段后的状态漂移击穿。
- 预防已落地:实际模式分支、各关键阶段的同一有界健康函数、显式构建与隔离切换、真实源码变异、服务依赖图事件断言、static 门禁及现有 deployment spec。未扩展治理、账号、权限、状态机或其他债务范围。
用户复核与首次发布授权(2026-09-05)
- 用户独立复核 PASS:将 initialize 条件改为 if true 后 49 项中 30 项失败;还原后 49/49 通过,md5 与备份一致且变异无残留。用户另行确认治理与 whitespace 通过、static 已接入。
- 用户明确批准本 task 提交、push 和首次真实部署;先回报产品提交,再执行 push/受控部署。财务 403 排下一项,不与本次发布混做。
- 部署前保留不可执行的旧工具命令序列,完成正式身份/迁移预检,捕获同一 Compose 项目 db 的 ID、Created、StartedAt、RestartCount、镜像和健康状态;发布期间持续查看阶段结果,完成后逐项对比,不能只用 /ready 代替 db 身份证据。
- 健康超时或任何前置失败均停止,不调长 120 秒、不自行启动 db、不切换 initialize、不盲目重放旧命令或 init/seed。备份合同刷新、/ready 与 bundle marker 仍须通过。
- 当前有旧 task 未提交交接笔记;它不属于本次提交。为满足部署来源 clean-worktree 门禁,将只对该文件临时 stash 保管,记录对象和摘要,发布及证据提交结束后原样恢复,不删除其他 stash 或改动。
- 用户观测测试约 90 秒;保留全覆盖,不改抽样运行。如后续优化,仅合并冗余 fixture/减少重复准备,不删除独立行为断言和四类变异覆盖。
首次真实发布与数据库身份观察(2026-09-05)
- 产品提交:
f223bfb72fb2baef51199702c2def84c41af7aef,已 push;线上应用版本为f223bfb72fb2。部署从该产品提交的干净工作区执行,后续验收记录提交仅更新本 task 文档,不代表重新部署或新的线上应用版本。 - 先执行
PRODUCTION_READ_ONLY_PREFLIGHT=1 node deploy/trialrun/production-identity-bootstrap.mjs,再执行获批的node deploy/trialrun/production-identity-bootstrap.mjs,两者均 exit 0。主会话持续查看阶段日志至部署完成;旧工具命令序列仅保留为不可执行参考,未重放。
| 检查 | 真实发布结果 |
|---|---|
| 前置门禁 | 13 项聚合预检与生产身份验证 PASS;迁移前后均为 pending=none,回滚窗口 OPEN。 |
| 数据库健康与阶段时序 | 四次健康检查均 PASS;未放宽固定 120 秒上限、切换 initialize 或自动启动/修复 db。init、server build、应用切换及迁移状态检查完成。 |
| 同一项目 db 身份比较 | ID、Created、StartedAt、RestartCount、镜像五项前后均相同,部署后仍 healthy;证明本次应用发布未重建或重启该 db 容器。 |
| 应用更新 | server 容器与镜像均变化;公网 /ready 为 HTTP 200、data.ok=true、buildSha=f223bfb72fb2。 |
| 公网包与文案 | scanned=106 focused=2 buildMarker=PASS findings=0。 |
| 既有发布合同 | external deps/runtime smoke 及备份合同刷新 PASS,未绕过门禁。 |
- 脱敏观察结果:
artifacts/qa-flow/existing-deploy-db-lifecycle-isolation/first-live-observation.json。原始有限容器元数据与受控阶段日志仅保留在本轮私有临时证据目录;提交只记录布尔比较结论和公开构建标记,不纳入容器标识、秘密或业务响应。 - 本次身份观察只查询目标 Compose 项目的容器元数据;正式部署仍实际运行既有 migration/seed 和备份合同刷新,因此不能表述为数据库内容或运维状态完全只读。
- AC8 已获授权并完成,AC1–AC7 的本地验证与独立复核记录保持不变。未操作 0014、真实银行资料、财务账号、IM routing 或 Trellis 升级 worktree;旧 task 笔记不属于本次提交。
- 证据回填后,Trellis validate、governance/敏感扫描、process baseline、git diff --check 均通过。docs registry 检查 exit 0、errors=0,仍提示 22 个未登记文档;task validate 仍提示现有 deployment spec 超过注入上限。两项提示如实保留,不作为本 task 的整改范围;本轮只更新三份 task 文件,不重复运行产品回归或部署。
- 产品交付与验收记录提交分开;不为纯证据提交再次部署。task 保持
in_progress,未归档;财务 403 仍为下一项,尚未启动。