diff --git a/docs/chv-production-readiness.md b/docs/chv-production-readiness.md index 97b4db1..e1157c0 100644 --- a/docs/chv-production-readiness.md +++ b/docs/chv-production-readiness.md @@ -342,11 +342,20 @@ - M4 供应链版本钉死:已钉死——云镜像 SHA256 必填(干跑验 “已设”、全量验哈希)、Ubuntu 版本与 codex 版本均为必填 环境变量;BUILDINFO 新增 versions(构建时从客机读回的 - dpkg + pip freeze 实际版本,可审计、可复现比对)。未钉死 - 的清单:apt/pip 事前精确版本 lockfile(须在构建宿主上 - 生成一次、再固化进脚本,本轨无构建宿主、未编造版本号); - Playwright Chromium 二进制版本同样只随 playwright pip - 版本记录,未单独钉死。 + dpkg + pip freeze 实际版本,可审计、可复现比对)。 + generate_lockfile.py 已改写(to10 轨,本轮干跑复核): + 只读 BUILDINFO.versions 生成 lockfile,不再查构建宿主 + 的 dpkg/pip,codex 三件套与 /app/host.py、gt、chv-sync + 走 BUILDINFO 声明字段;check_lockfile.py 已补强(条目 + 格式、contents 全覆盖、冻结清单双向比对)。 + Chromium 已可单独钉死(本轮):CHROMIUM_HEADLESS_SHELL_REV + 设为纯数字修订号时 buildinfo.py 校验读回的缓存目录名 + 须恰好是该修订号,否则构建失败,generate/check 的 + --verify 也复核;未设时只记录、不强制,构建输出明说 + “未钉死”。/app 已收紧为最小集(本轮):build.sh 只拷 + host.py(只用标准库,不依赖 cloud/),不再把整个 cloud/ + 拷进客机。仍待真机:真实 lockfile 产出须等 V-9 真机 + 构建(本机无 /dev/kvm,版本号绝不编造)。 - M5 审计补齐:host_key_generated/host_key_captured/ host_key_mismatch(stderr 含钉死拒绝标记时立即 fail-fast, 不轮询成普通超时)、preflight_failed、wake 前置失败 @@ -357,7 +366,12 @@ 实验放行须同时声明 CHV_SINGLE_TENANT_PROJECT,否则 preflight 拒绝(reuse_tenant_undeclared);不能校验的 部分明写:代码无法验证数据库里是否真的只有一个租户, - 声明 + 审计就是本项的机制,不假装已校验。 + 声明 + 审计就是本项的机制,不假装已校验。部署核对 + (人工,见 §11.4):启用 reuse 前,部署人须在部署记录 + 里写明“已核对数据库租户数 = 1、项目名与 + CHV_SINGLE_TENANT_PROJECT 一致”,并复核放行审计事件 + disk_reuse_experiment_allowed;多租户部署上误设该标志 + 仍可能发生,代码拦不住,只能靠这道人工核对 + 审计告警。 - M7 容量计数残留 socket 误伤:只有真能连通的 socket 才 计数,空文件/死 socket 不计入 CHV_MAX_VMS;竞态窗口 写清(刚启动未 listen 的 VMM 会被判死,容量门是护栏 @@ -380,9 +394,18 @@ - L3 失败审计:preflight/容量/配额/net 冲突失败均发 vm_failed 审计(见 M5)。 - L4 CHV_NET 与 CHV_NET_JSON 双变量:双设时发 - net_config_dual 警告审计(不硬拒,CHV_NET 是手动直接 - 启动命令的透传值);NET_JSON 条目字段白名单 - (tap/mac/ip/mask),未知字段直接拒绝。 + net_config_dual 警告审计(不硬拒,取舍已定,见下); + NET_JSON 条目字段白名单(tap/mac/ip/mask),未知字段 + 直接拒绝。取舍定案(feat-chv-closeup 复核):保持警告、 + 不改硬拒。理由:CHV_NET 是手动直接启动命令的透传值, + 与 API 模式的 CHV_NET_JSON 是两条不同的使用路径,双设 + 不一定是误配;硬拒会断掉手动运维路径,而误配的代价 + 只是“API 模式忽略 CHV_NET”,已有警告审计 + 本条文档 + 写清。兼容影响评估:现存手动运维用法不受影响;若将来 + 改硬拒,须先全量核查现存部署的 env 是否双设,并给手动 + 路径留显式放行开关,不可直接改。部署核对(见 §11.4): + 生产 API 部署只设 CHV_NET_JSON,不设 CHV_NET;双设时 + net_config_dual 审计须在部署记录里复核。 - L5 WarmPool 预热盘与任务盘对应关系:定义已写进 pool.acquire 文档——预热盘是干净快照盘,不是任务盘; 本轨定案为实验性(ADR-5),不再作为接线待办。 @@ -402,6 +425,17 @@ 收紧 /proc 可见性、进程表采集不记录完整 cmdline; - 部署后核对:state_dir 权限、socket 实际权限、 tap 规则实测(见 §11.5 否定测试)。 +- 环境变量核对(L4/M6,人工):生产 API 部署只设 + CHV_NET_JSON,不设 CHV_NET;双设时 net_config_dual + 审计须在部署记录里复核;启用 reuse 前部署人须在部署 + 记录里写明“已核对数据库租户数 = 1、项目名与 + CHV_SINGLE_TENANT_PROJECT 一致”,并复核放行审计事件 + disk_reuse_experiment_allowed。 +- 残留尾巴审计核对(P2-17/18/19/20,feat-chv-closeup + 已修):部署后抽查审计里有无 net_registry_write_failed、 + dirty_marker_write_failed、vm_net_registry_delete_failed + 事件——任一出现即说明 state_dir 写路径或登记路径有 + 故障,须先修宿主再启用。 ### 11.5 仍需真机验证的清单(本轨一律未做,不声称已验)