mirror of
https://github.com/whyour/qinglong.git
synced 2026-09-20 16:07:11 +08:00
8.3 KiB
8.3 KiB
ADR-0527:受审核 Automation Reconciliation 应用与显式回滚
- 状态:Accepted(源码与本地 exact arm64 演练已闭合;双架构阶段实物待交付)
- 日期:2026-09-01
- 决策:D-426c2
- 关联:ADR-0484、ADR-0485、ADR-0486、ADR-0487、ADR-0526
上下文
ADR-0526 已把 active target 的真实产品写入密封为独立 reconciliation capture,但 downloadable Trial Kit 仍停在 review_required。底层 plan、强认证 review、跨域 application plan、Automation row plan、apply 与 rollback 已存在;缺少的是一条部署者可执行、资源有界、不会自行替人决策的 exact artifact 链。
本切片只闭合一个最小可恢复事实:操作者审核完整计划并在 owner-private 文件中给出外部决定后,短生命周期 Operator 应用一个无冲突 Automation 行,验证正式 Task/Trigger 投影,再显式回滚到应用前 SQLite 快照。Secret/Config、Run History、completion 与服务重启继续留给后续独立决策。
决策
- Trial Kit 新增 canonical
reconciliation-rehearsal.sh,分为prepare、review、apply-rollback三个显式阶段。每个阶段只接受前一阶段的 exact sealed evidence,不跨阶段猜测路径、digest、时间或决定。 prepare只从 ADR-0526 的 stopped capture 建立 bounded reconciliation plan、诊断页与强认证 review prepare,并终止于operator_decision_required。review只消费外部 review NDJSON,完成 authorization commit/verify、application prepare/commit/verify 与 Automation plan/verify,并终止于automation_decision_required。apply-rollback只消费外部 Automation row NDJSON,完成 decision commit、apply/verify、rollback/verify,终态为reconciliation_automation_rolled_back。- 交付脚本永不生成 review 或 Automation decision。仓库中的
ql3-local-alpha-reconciliation-decision-fixture.cjs只为 CI 合成数据生成冻结决定,不进入 Trial Kit、manifest、checksum 或用户下载包。Legacy Run History 固定为manual_external,不能为了让演练通过而丢弃。 - 每份外部 decision 必须是 owner-private canonical regular file:父目录为当前 UID 拥有的
0700目录、目录中恰好只有该文件,文件不位于 deployment/reconciliation/capture 权威根内;容器只读挂载整个父目录。review 与 Automation decision 使用不同父目录,不能复用或替换。 - review authorization 的有效期为 60 秒且不得晚于 strong principal;commit/verify 与 application/Automation 操作必须消费同一授权谱系。Automation decision commit 必须
await完整确认后才能关闭 authentication database,避免异步确认读取已关闭 authority。 - Automation target SQLite 必须位于 canonical deployment root 下,同时与 plan、capture、review、application、Automation 和 decision sibling roots 双向不重叠。apply/verify/rollback 使用短命名空间
reconcile_automation_apply,满足既有 32 字节授权上限。 apply-rollback显式接收原始 Legacy root,并只读挂载它以复算 stopped proof;target deployment root 是唯一业务可写根。Operator 继续使用只读 rootfs、network=none、drop-all capabilities、no-new-privileges、128 MiB memory/swap、0.5 CPU、32 PID 与 8 MiB noexec tmpfs。- 所有带时间的 command 只在首次阶段创建;中断后必须复用原文件和原时间。容器输出先写 PID-scoped 临时结果,命令成功后才原子替换正式 result。失败重跑不能覆盖已存在的 authorization、intent、decision 或成功 result。
- 成功 summary 只公开低敏 lineage:review/Automation/decision identity 与 digest、apply digest、采用的 Task/Trigger 数量、rollback head digest,以及
target=restored_to_pre_automation_snapshot。它固定completion=not_attempted、targetRestart=not_attempted、legacyRestart=not_attempted。 - Trial Kit、verification、offline audit 分别升级为
@v10/@v8/@v7,manifest schemaVersion 为 11;Local milestone 升级为@v6、schemaVersion 6,并绑定双架构upgradeReconciliationRehearsalSha256。required gate 新增legacyUpgradeReconciliationAutomationRollback=passed,旧 bundle/milestone 不会被新 auditor 静默接受。
Profile 与部署边界
- Edge/低配路由设备:默认 headless Application 和稳态资源不变。D-426c2 只启动串行短生命周期 Operator;不会新增 package、依赖、daemon、listener、timer、watcher、连接池或常驻缓存。
- Standalone:复用相同命令与安全边界,仅沿用既有较大 reconciliation 文件预算;本 ADR 不提高 Operator 资源上限。
- Console:同一 reconciliation script 可存在于 Console bundle,但不会启动 Web listener;3.0 Console 与 2.x 面板仍是不同 API/认证/领域协议,不能据此声明零改动兼容。
- Cluster:不复用 Local SQLite/POSIX/Docker 证据。PostgreSQL HA、Kubernetes lease、Worker 与 Cluster reconciliation 不受本 ADR 授权。
被拒绝的方案
- 在脚本内自动选择
prefer_target或批量 adopt:会把 CI 策略伪装成人类审核,拒绝。 - 一次命令从 capture 直接推进 completion/restart:跨越 Secret/Config、Run History 与服务权威,拒绝。
- 只验证目标行数、不执行显式 rollback:无法证明应用前快照、backup digest 与恢复 head 闭合,拒绝。
- 把 decision 单文件直接 bind mount,或允许父目录中存在额外文件:会扩大路径替换与同目录注入面,拒绝。
- 为 Docker Desktop 放宽 POSIX owner 校验:会削弱原生 Linux 的 owner proof,拒绝。只读 readiness 可对瞬时 mount UID 漂移执行同一命令的一次有界重试;持续错误仍失败关闭。
验证与交付状态
- GitNexus 对修改的 TypeScript 符号均为 LOW:decision authorization 2 个上游、apply contract 8 个上游、apply/rollback authentication 4 个上游,均无 execution flow;shell 模板未被索引,按静态引用、
sh -n、功能测试与 exact Docker gate 约束。 - 聚焦回归覆盖 strong-principal expiry、authentication database close fence、target path containment、短 authorization namespace、decision file private parent、命令/结果精确重放,以及 CI fixture 不进入 bundle。
- 本机完整 backend 回归为
1667 total / 1665 pass / 0 fail / 2 conditional skip;18 个 QL3 package clean build、package boundary、cluster dependency 与 image audit 均通过。PostgreSQL 18.6 arm64 HA Docker 门进一步完成 timeline1→2promotion 与 147 项检查,私有报告摘要为sha256:68e2f60b962ac62cee3c70bf759fccb6f8080541264427a4ea66bf8f586707db。 - 本机 exact arm64 headless Trial Kit 使用最终 Application
sha256:eec404d24b5c101871e000caac902d3866e5fe3f0e6dcef31366cb526ef32f80与无源码覆盖的 Operatorsha256:10f75f12d185e5796dcc4a230b6684c074bd9a6e6156ee1110fff1c2d8dd3390,离线 audit v7 返回compatible=true。全新 2.x fixture 已贯通 readiness、stage、cutover、post-write capture、437 条外部 review 决定、1 条外部 Automation 决定、apply/verify 与 explicit rollback/verify;最终实际采用 1 个 Task、1 个 Trigger并返回reconciliation_automation_rolled_back,且未尝试 completion、restart、Secret/Config 或 Run History mutation。 - 提交
c8d9eed95d402aae642e81e60fce336670ac06a0的普通主 CI run 33526720941 为 41 success/3 expected skip/0 fail,Kubernetes run 33526721040 成功;显式 Local headless run 33528370769 为 42 success/2 scope skip/0 fail。amd64/arm64/milestone artifact9809046864/9809000920/9809293769保留至 2026-10-01,下载后的 milestone v6 auditor 返回compatible=true并绑定 exact source/run/attempt、两个不同 archive digest 与两个不同 reconciliation script digest。D-426c2 因此已是可下载阶段产物,但仍不是 Public Release 或生产升级授权。
后续
D-426c3 再独立处理 Secret/Config、Run History、跨域 completion 与 target/Legacy restart 选择。2.x 面板复用走单独 UI adapter RFC:保留现有视觉组件,替换 /api/* 数据层、JWT/session 假设与 Crontab/Env/Log 领域映射;不得把 D-426c2 当作 2.x API compatibility layer。