完善借款、编号、付款与预算并发及验收(09-06-release-gate-integrity)
汇总已落盘的借款本金与还款、兼容历史编号的周期化编号、付款责任与回单核验、报销进度和排序、PWA/采购事务、错误原因与日期校验及ERP退役。 统一共享预算池锁序和锁后判断,恢复差旅原预算选择,补原因码固定夹具及反向完整性检查。 纳入配套迁移、测试、受管QA、分层验收合同、规约及任务记录;原始证据留在ignored artifacts。 关联任务:09-17-company-loan-principal-repayment、09-17-erp-exclusive-retirement、09-18-reimbursement-periodic-numbering、09-08-reimbursement-payment-closeout、09-18-local-concurrency-product-fixes、09-19-budget-pool-concurrency、09-05-error-explainability-payment-readiness。 预算补审由Claude定向验证2文件928项通过,原4446/28及r6结果仍仅对应各自历史输入;本轮未重跑测试。 完整新候选门禁、R1真实入口接入与12项公网义务仍开放。生产编号未启用、差旅仍冻结;不推送、不部署,不宣称发布资格。
这个提交包含在:
@@ -1,5 +1,298 @@
|
||||
# 隔离备份恢复演练实施计划
|
||||
|
||||
## 2026-09-19 K0 独立补审接收(最新)
|
||||
|
||||
- [x] 接回 b1rubx7qf 原报告 `artifacts/qa-governance/business-followup-claude-review-20260919T023537Z.txt`:K0 **PASS_STATIC_CONTENT_REVIEW**。reviewer 只读源码与既有合成测试,未运行测试、未核候选 SHA、未访问真实资料。
|
||||
- [x] 主会话另核原候选 manifest 自摘要、6件冻结文件和当前3个代码/测试输入一致;这不是 reviewer 运行证据。原候选的 PENDING 保留为交审时点状态,本段和新增接收回执记录最新状态,不重签冻结包。
|
||||
- [x] 在 PRD/design 明确脱敏不在K0合同;通知密钥迁移入口会读配置、连库并批量写入,排除在K0/K1/K2默认执行之外。未来K2通知字段只按绑定方案只读验密,真实迁移另批;本轮未 import 或执行迁移脚本。
|
||||
- [ ] K1双角色原密钥可取用的非秘密事实、K2新绑定与具体操作批准仍待取得;K0 PASS不替代它们,旧恢复不重跑。
|
||||
|
||||
两项审查观察已通过明确范围完成文档处置,不将未测脱敏、其他crypto消费者或真实通知解密改写为PASS。本轮仅任务文档/元数据,无产品修改或新增测试计数;完整implement历史、已消费恢复入口与原PARTIAL均保留。证据:artifacts/qa-governance/business-followup-reception-20260919。
|
||||
|
||||
## 2026-09-18 后续清单接回
|
||||
|
||||
09-06本轮仅本地在用门禁重验,并将K1非秘密保管事实、K2新源/制品/字段/资源/注入清理绑定列入retained-gates-closeout-20260917/independent-and-external-readiness.json。K0独立复核仍PENDING,K1/K2真实事实未查;没有连接生产/ARM、读取真实配置密钥备份或重跑旧恢复。借款及付款本地通过不抵扣保管/真实解密条件,原PARTIAL和历史缺件事实保持。
|
||||
|
||||
## 2026-09-17 后续推进:K1/K2准备与独立复核交接
|
||||
|
||||
用户要求按已梳理顺序继续,并补齐缺失规划。本轮授权落实为本地准备与已规划治理;具体保管核验、原密钥取用和新恢复绑定尚无事实,不据此开放生产/ARM或重跑旧入口。K0主会话通过保持,独立审查在inline模式下仍PENDING,不能通过另派检查代理代替真实独立身份。
|
||||
|
||||
- [x] 固定K0源码、生产crypto依赖和本task合同形成新只读审阅候选,保存文件摘要与审阅清单;不覆盖K0原证据或旧恢复四包。
|
||||
- [ ] 接回独立审阅意见:核生产函数复用、错误/空值分流、禁输出秘密及原异常、无外部输入/环境读取、合成与真实结果分离;审阅方重跑须单列环境/命令/结果与候选摘要。
|
||||
- [ ] 接回双角色保管渠道类别/可用状态的非秘密陈述;用户陈述只记REPORTED,实际取用仍NOT_TESTED。
|
||||
- [ ] 按下述设计审阅具体K1操作;渠道不可用时仅提出补建方案,不先导出/转移/生成Secret。
|
||||
- [ ] 具备K1事实后填写K2源/制品/字段与资源绑定清单,独立只读审查后取得一次新操作批准;缺任一项不生成可运行远端命令。
|
||||
|
||||
K0审阅候选位于`artifacts/qa-layout/followup-governance-20260917/k0-review-candidate/`。本轮后续本地B1/B2移至09-05,K1/K2与独立复核保持明确待办,不把等待条件写成任务全完成。
|
||||
|
||||
## 2026-09-17 K0本地合同已实施,K1/K2另批
|
||||
|
||||
规划来自09-08顶部优先级表;用户本轮明确批准仅K0本地合同检查与合成验证,旧一次恢复完成事实不变。官方current已从09-08通过task.py start切到本task并回读为当前会话来源;task仍in_progress,不代表K1/K2敏感操作获批。
|
||||
|
||||
- [x] 审阅本task顶部PRD/design,取得K0本地实施批准后切官方current到本task并核执行树差异。
|
||||
- [x] 运行现有`node deploy/trialrun/validate-env-contract.js`,核preserve_original、双角色保管要求和来源/保管/可恢复三个不同结论;只读模板/代码。
|
||||
- [x] 新增最小合成恢复合同测试`server/tests/unit/services/sensitiveRecoveryContract.test.js`及独立本地补件`scripts/qa/check-sensitive-recovery-contract.cjs`,覆盖缺钥/错钥/篡改/空值/成功与输出脱敏;复用生产crypto函数,不改旧冻结runner。
|
||||
- [x] 执行`cd server && npm test -- tests/unit/services/sensitiveRecoveryContract.test.js --maxWorkers=2 --minWorkers=1`及涉及脚本的语法检查、环境合同/Trellis/process/敏感扫描;具体新增文件及结果见下方回执。
|
||||
- [x] 输出K0本地回执和K1无秘密值的保管检查清单。K1访问或建立保管渠道前单独列操作者、范围与风险申请,不要求用户回忆密钥。
|
||||
- [ ] K1具备条件后准备K2新源/制品/字段类别数量/资源/秘密注入及清理绑定包,独立只读复核后集中请求一次具体操作批准;K0通过不预先批准K2。
|
||||
- [ ] 真正执行后只登记实际分项和清理结果;错误/不可用/无样本分别停止或NOT_TESTED,未完成条件不勾选。
|
||||
|
||||
本地阶段不用sudo,不连接生产/ARM,不读取真实密钥、密文或备份。若K1/K2等待管理员操作或具体绑定,回到09-08协调并推进09-05治理;不反复让用户运行旧恢复入口。提交/推送/部署及所有真实数据/秘密操作仍另批。
|
||||
|
||||
### K0本地回执
|
||||
|
||||
- 工作树沿用已指定的20260911-detail-layout;进入时HEAD为b1d25d3c、detached,官方current为09-08的session-fallback。初始18份脏文档/元数据及借款planning任务四文件已在ignored本地证据保存原字节/差异基线,不接管借款实施。
|
||||
- 现有环境合同PASS:config键150、模板及分类键均166;FIELD_ENCRYPTION_KEY仍为preserve_original,双角色仓库外保管要求与来源/保管/真实恢复三种结论保持独立。没有加载生产配置。
|
||||
- 新增30项定向测试PASS(1文件);合成CLI的7类矩阵PASS。覆盖缺失/无效密钥、有效长度错钥、IV/tag/密文三个位置篡改、空/null/缺字段、畸形/未知版本/类型、明文不匹配、原始异常抑制、无日志和CLI无输入/无回显边界。7类CLI检查也是这30项中的覆盖,不累加为37个不同测试。两新增JS文件node --check通过。
|
||||
- 执行使用精简子进程环境;仅做元数据检查确认工作树根和server无Vite会自动加载的.env系列及项目.npmrc,npm用户/全局配置使用本轮新建空文件。首次把二者都指向同一空设备被npm以double-loading拒绝,测试尚未开始;拆为两个空文件后30项通过,未读取真实配置。保留启动失败日志,不将其计为产品失败或测试通过。
|
||||
- 四份旧冻结包逐项核对manifest、登记字节数/SHA及精确文件集合均PASS:R1为17+2=19、R2为19+2=21、R3为28+2=30、绑定执行包14+2=16,合计86。09-08上轮文字写96,与本次现场计数不同;本轮未发现任何manifest登记件缺失,不推断历史多计原因,也不改旧记录或冻结字节。
|
||||
- 新证据归`artifacts/qa-layout/sensitive-recovery-k0-20260917/`,只存本地合同摘要、验证日志及既有非秘密差异基线;没有真实数据/密钥材料。原恢复的PARTIAL、历史缺件1、密钥来源UNKNOWN、真实解密NOT_TESTED继续保留。
|
||||
- 收口检查:task validate、Trellis治理(23项task合同、1242份Trellis文件敏感扫描)、process baseline、CURRENT事实源敏感扫描(30份、finding=0)及git diff --check通过。docs registry为0错误、1项既有告警(22份未登记文档),未修理无关文档。未改schema/产品代码,不运行Prisma、前端构建、浏览器或旧恢复测试。当前规约已覆盖保管/恢复边界,本轮细化合同留在本task,不扩写原有脏spec。
|
||||
- 范围对账:本轮仅新增上述2份本地QA/测试源码,增量更新本task的PRD/design/implement/task notes及09-08入口implement;其余17份初始文件(含借款四文件)原字节不变,五份更新文件的既有非K0内容保留。四包86件集合/摘要、HEAD及真实index不变;当前指针留08-23供接续,不自动切入下一实施段。
|
||||
- 主会话inline实施/检查,未派子代理;独立只读复核仍PENDING,尤其K2真实执行绑定方案尚不存在。本地通过不代表公网验收或K1/K2放行;未连接生产/ARM、未重跑旧恢复、未提交/推送/部署/归档。
|
||||
|
||||
### K1保管检查清单(空白,未访问)
|
||||
|
||||
只填角色、渠道类别、验证时间和可用状态;不填姓名/账号、Secret及摘要、保管地址/目录或原始凭据。来源历史仍UNKNOWN,可用性必须经另批实际核验。
|
||||
|
||||
| 角色 | 渠道类别 | 验证时间 | 可用状态 |
|
||||
| --- | --- | --- | --- |
|
||||
| 系统管理员 | 待批准核验(未访问) | 未验证 | NOT_TESTED |
|
||||
| 公司责任人 | 待批准核验(未访问) | 未验证 | NOT_TESTED |
|
||||
|
||||
- [ ] 在访问或建立保管渠道前,明确操作者角色、仅可用性核验的范围、暴露风险与批准;不由代理查历史命令或让用户发送明文。
|
||||
- [ ] 另批后确认两个角色各自有仓库外受控取用渠道,且不只依赖原主机或单人记忆;只记录渠道类别(共享保管/加密封存/不可用),不导出Secret作为证据。
|
||||
- [ ] 无渠道或原密钥不可用则STOP并提出最小后续方案,不创建新钥替代,不将K0合成成功记为保管成功。
|
||||
- [ ] K2另行绑定新鲜源/制品/字段类别数量/秘密注入/清理及独立只读复核,再取得具体一次操作批准;旧入口不再使用。
|
||||
|
||||
## 2026-09-17 09:33 CST实际恢复完成:按批准范围结束,整体PARTIAL
|
||||
|
||||
用户通过新单次入口完成真实ARM影子恢复。本地manual-bound-restore-result.txt唯一JSON与用户回传的观测时间、review/execution/source三摘要及分项结果核对一致,已脱离终端地址/密码提示保存real-bound-restore-result.json,executor=USER_MANUAL_SUDO。最终PARTIAL_KNOWN_MISSING_AND_SENSITIVE_DECRYPTION_NOT_TESTED,failedStage=null、restoreStarted=true;这不是完整灾备PASS,也不是新的NO_GO。
|
||||
|
||||
| 分项 | 本轮实测 | 边界 |
|
||||
| --- | --- | --- |
|
||||
| 现场预检 | PASS,1.167秒;RPO25372秒(7小时2分52秒) | 新源d9a23d59…、b1d25d3c、匹配ARM镜像;24小时/最新性/资源门实际通过 |
|
||||
| 准备/数据库 | PASS,1.455/2.677秒 | 真实备份恢复到一次性PG16;71项完整迁移映射核对通过,12类关键表可读 |
|
||||
| 附件 | PARTIAL,0.873秒;62条引用/1原始不一致/1已接受历史缺件/0未知不一致/0外部引用 | 原严格校验器未过滤归档件;恢复副本重核精确身份/归档时间/七类零关联/实际缺失;其余引用在适用大小/SHA范围内无新异常,非所有文件均有SHA字段 |
|
||||
| 应用 | PASS_SHADOW_AUTHENTICATED_READ,8.542秒 | 实际镜像健康、匿名拒绝、影子凭据通过真实认证/权限后只读列表与恢复库行身份一致,DB只读权限成立;非真实密码/浏览器验收 |
|
||||
| 清理/后验 | PASS/PASS,cleanupPending=false,productionWrites=false | 正式归档元数据与摘要、生产ready、监控timer后验通过;只删除本轮影子资源,不改生产或历史缺件 |
|
||||
|
||||
attachmentCount=62是归档/解包普通文件数,不等于62条引用全存在,不能抵消引用中的历史缺件。缺件处置SHA仍5ed1e910…,完整值见实际回执;原R2的09-16 NO_GO及R3冻结包、绑定执行包原字节保留,不改历史结果。两类包的“未执行”是冻结时刻事实,当前执行状态以本节及绑定三摘要的实际回执为准。
|
||||
|
||||
时间口径:准备+数据库+附件阶段小计5.005秒,加入应用为13.547秒,含预检的已报阶段合计14.714秒;未独立记录清理/后验耗时或精确启动时刻,不将小计称完整RTO/切换RTO,不宣称满足未约定SLA。RPO为现场测值,不是备份频率或业务允许丢失窗口的承诺。
|
||||
|
||||
01:36Z主会话补做只读元数据后验PASS:单次入口暂存目录已移除,restore-run标签容器0/网络0、临时恢复目录0;备份dead-man与公网健康timer均active/enabled;公网ready仍b1d25d3c。仅元数据与公开健康读取,无新容器、恢复、备份内容读取、生产Secret/业务写入;证据real-bound-restore-postcheck.json。新入口已消费,不重新暂存、不重跑、不再索取本次授权。
|
||||
|
||||
当前结论:本次批准的受限演练执行/分项验收/清理已完成。完整附件恢复仍有一条已接受且未找回的历史缺件;SENSITIVE_DECRYPTION=NOT_TESTED、生产密钥来源UNKNOWN、保管/恢复能力没有被此次验证证明。后续如验证敏感字段恢复,应另做受控密钥保管与灾备方案,不索要聊天明文、不自行换新密钥;不为清单全绿删除引用或重复实际恢复。AC4完整附件及AC5完整计时/同源滞后指标保留未全满足,task维持in_progress,不自动归档/提交/推送/部署;09-08其他自然业务和到期治理不随本轮结案。
|
||||
|
||||
本轮只核实际回执、执行只读元数据后验并更新任务/操作手册;任务校验、Trellis(含敏感扫描)/process/docs及diff通过,两级冻结包文件集/逐件摘要未变。未重跑原104项或新增产品测试计数;原54项独立单测与R3静态内容审查继续按原范围记录。本次运行出口已关闭,不再要求用户执行命令。
|
||||
|
||||
## 2026-09-17 09:28 CST:R3新源绑定包已冻结并暂存,待管理员单次恢复
|
||||
|
||||
用户交互sudo回执PASS_SOURCE_DIRECTORY_BINDING_OBSERVATION_NOT_EXECUTION,01:18:40Z实测:固定源d9a23d59…、b1d25d3c,年龄6.81小时,DB/storage摘要/字节与归档元数据/timer前后均通过。实际runId为auto-20260916T183002Z、相对目录hyb-oa-backup-auto-20260916T183002Z,完整目录身份3cd4b78f…;createdAt18:30:04不能替代runId的18:30:02。rootIdentity1201d50a…与批准值一致;87.84GiB可用磁盘,memoryGiB11.68是物理总量,不冒称MemAvailable,执行前另核可用内存。
|
||||
|
||||
本轮继续既有批准内的执行输入定稿:
|
||||
- [x] 从本地原始终端回执提取唯一JSON并与用户回传关键身份核对,保存脱敏USER_MANUAL_SUDO证据。
|
||||
- [x] 重新只读核生产ready/固定ARM镜像版本/资源;从b1提交生成完整71项migration映射并与R3核对,不凭数量假设相同。
|
||||
- [x] 新建绑定执行包,原R3代码/helper/历史例外/migrations保持字节或完整映射不变,仅新bundle的源build、manifest、实际batchName及appImage更新;review/execution两级摘要绑定,不改原R3/R2。
|
||||
- [x] 沿原一次性入口与暂存方式准备新封装,定向测摘要篡改拒绝、白名单重绑、PARTIAL/NO_GO与清理后验出口;不重用09-16已消费入口,不在生成/传输阶段调用Session.execute。
|
||||
- [x] 冻结/校验通过后普通用户暂存并回读一致,交付交互sudo单次恢复命令。实际root现场preflight通过后才写影子资源;源过期/变化仍停止,绝不自动回退或扩例外。
|
||||
- [x] 管理员执行新入口,接回实际DB/附件/应用/清理/后验结果并分项判定;详见09:33 CST最新记录,整体保留PARTIAL。
|
||||
|
||||
此回执本身未创建容器、未恢复/解包、未修改生产;不把它升级为真实恢复PASS。既有一次受限恢复批准不重复询问,最终敏感解密仍NOT_TESTED,有历史缺件时最高PARTIAL_KNOWN_MISSING_AND_SENSITIVE_DECRYPTION_NOT_TESTED。
|
||||
|
||||
01:22Z新增只读前提PASS:生产ready仍b1d25d3c,ARM app5d279fef…/db c05eced0…分别核实linux/arm64及BUILD_SHA/PG_MAJOR16;可用内存10.25GiB、磁盘87.84GiB、swap0。b1来源71项迁移名及逐件SHA组成映射与R3完全相等,规范化映射SHA8adf634b…,不是只对数量。该观察不替代实际执行时preflight,未新建容器或读生产Secret。
|
||||
|
||||
新绑定包restore-once-execution-20260917-r3-b1:14登记文件+manifest两份,执行manifest SHA f7cf4d62f58f540f950570518568f70aa1f44db328f58a769566f7e5a5e4acce;review-manifest仍33001f58…。原R3执行器及四helper逐字相同,原review-bundle保留;新bundle只改plan的appImage/batchName/build/manifestSha256四项和executionBinding,完整迁移映射/历史处置/其他计划不变。新包独立状态为PASSED_STATIC_R3_CODE_ONLY,封装/绑定增量只有主会话检查,不伪称已独立审新入口。
|
||||
|
||||
新入口approved-bound-restore-entry.py为170741字节、SHA011b42bd282b7fccc8ee0953c034da66973e28e222cf1c0db3948a326437db2e;装载先核执行manifest及全部payload,再核R3原manifest/code/helpers/旧bundle、白名单变更及源/镜像/配置/迁移证据,之后才取得Session类。12项入口合同通过,含每份payload篡改拒绝、装载零外部调用、非白名单改动/目录和摘要漂移/配置或迁移变动拒绝、两类成功仍PARTIAL、清理/后验失败非零。
|
||||
|
||||
01:28Z仅普通用户暂存新入口,上传摘要及另次回读一致;暂存目录身份8e34a582…,无真实数据,rootExecuted/restoreStarted均false。新shell run-approved-bound-restore.sh SHA55589a0424b445a5632bb5a0906da58b8691a01793a17171bcf1ae4cf2cc33fa,输出manual-bound-restore-result.txt,TTY/sudo/严格host-key/noclobber单次门;root loader再核入口摘要和实际暂存目录身份,先消耗入口并移除专属空目录再执行。4项传输合同通过:正确摘要只消费本入口、篡改/错目录不执行、意外文件保留且不执行;旧暂存/旧入口未触碰。暂存文件有意保留等待管理员,不称已清理完毕;真实执行前会移除。
|
||||
|
||||
管理员应在项目根运行artifacts/isolated-worktrees/20260911-detail-layout/artifacts/qa-layout/postrelease-recovery-20260917/run-approved-bound-restore.sh。这是已授权的真实影子恢复,不是只读选源;先现场预检,任何新增不一致/源变化或超龄都停止,不自动重跑。即使成功仍保留历史缺件/解密未验PARTIAL;正式归档、生产数据/配置/权限、旧镜像零修改,未提交/推送/部署。
|
||||
|
||||
最终主会话整批104/104通过(4.757秒,原88+新封装12+传输4),不新增独立通过计数;源R3/新执行包文件集、逐件摘要、入口/shell摘要和语法、Trellis/process/docs及diff门禁均通过。bound-final-check.json状态READY_FOR_MANUAL_SUDO_FRESH_PREFLIGHT,实际rootExecuted/restoreStarted仍false;HEAD/index不变,暂存无真实数据并等待一次消费,未把暂存当成恢复成功。
|
||||
|
||||
## 2026-09-17 09:11 CST配置专项通过,目录绑定只读入口已备
|
||||
|
||||
用户要求继续推进。本会话找到并读取restore-once-r3-claude-review-20260917T005959Z.txt完整外部报告:六项静态内容审查通过、无阻断项;与先前用户转回的独立完整性及54项重跑分开登记。报告明确未运行测试/未重算哈希/未做真实恢复,不能把三类不同证据混成一个独立执行结论。冻结R3不改,外部报告摘要另附补件记录。
|
||||
|
||||
三条信息项按已知接受登记,不为清理卫生改动重写已审候选:F1先核历史目标后核总失配数,额外失配仍NO_GO;F2只读探针存在不可达production分支,硬编码arm使之不可达;F3测试跨目录fallback,本包必需文件齐全/摘要已核,实际不触发。后续收敛时再处理,不扩大历史例外。
|
||||
|
||||
本轮清单(已有受限恢复准备范围,不是新恢复启动授权):
|
||||
- [x] 用固定b1镜像的一次性network=none、只读根、非root、禁日志/挂载的工具容器运行原配置检查器和冻结app-check非空密钥拒绝分支;只用新生成合成秘密,不启动HTTP服务、不连DB、不读备份/生产Secret,精确清理。
|
||||
- [x] 原R3只读选源探针保持不变,另备最小增量的目录绑定探针,输出实际runId/相对batchName并绑定已核源manifest/版本;超龄/漂移/完整性失败仍停,不从createdAt推导目录。
|
||||
- [x] 验证并生成交互sudo只读入口;root读取不能由代理绕权限或索要密码,无管理员回执前保持SOURCE_DIRECTORY_BINDING_PENDING。
|
||||
- [ ] 接回目录身份后再冻结全量新bundle/执行输入,现场preflight后才恢复;不重用旧一次入口,不修改R2/R3字节或提前宣称恢复PASS。
|
||||
|
||||
外部完整内容报告SHA256 fd58e49199f4172cb3e3544c35f909b7424dae6bc422feb597c5a560631fa07b,已读取原件;静态内容PASS与用户转回的54项独立重跑分别有据,后者原日志仍未取得。本轮不改包内PENDING字节,以本节及binding-preparation.json附录标注PASSED_STATIC。不是全恢复验收,新增准备器未包含在该外部内容审查范围。
|
||||
|
||||
01:10:49–01:11:08Z实际ARM固定image5d279fef…纯配置专项exit0:原check-image-config.cjs SHA41d213ec…、config SHA a3b62630…、冻结app-check SHA7e56f081…一致,真实镜像依赖、无替身;字段密钥缺省空、合成非空值被app-check拒绝,未启动HTTP应用/DB、未读取真实备份/生产Secret。工具容器512MiB内存/同值swap上限、1CPU/pids128、非root/只读根/cap-drop ALL/no-new-privileges、network none、无挂载/宿主端口、log-driver none,启动前及结束后实际inspect核验;精确ID/label清理PASS、cleanupPending=false,回执arm-image-b1-config-check.json。
|
||||
|
||||
目录绑定补件source_binding_probe.py在原R3探针外另存,source-binding.delta.diff可重放:增加实际runId、相对batchName与完整路径摘要;只观察最新规范批次,不向旧源回退,规范名下最新symlink/非目录拒绝;不重复镜像全盘盘点。最终要求固定manifest d9a23d59…、b1版本/原amd64 sourceImage、时效≤24h、DB/storage完整性与归档/timer未变,成功仅为PASS_SOURCE_DIRECTORY_BINDING_OBSERVATION_NOT_EXECUTION,绝不写成已恢复或可跳过preflight。原R3不可达production分支保留,不借此清理已审代码。
|
||||
|
||||
只读入口read-arm-source-binding.sh绑定probe SHA e6f9cd8517c7860ad19ee00d86b2b21b4ef3704e17c3abf434fb2dd913c4ccb6;自身SHA b9c3f4724e460eb1560d69a5369a952cbce660e030425fa701907d47830063a8。前后摘要闸、StrictHostKeyChecking、交互TTY、输出noclobber;仅内存传入sudo python3 -I,无远端安装/容器/解包/恢复。与已消费refresh-arm-source.sh为不同输出,不改旧入口。尚未执行root探针、无实际runId证据;用户在项目根运行该入口并回传JSON后才可定稿bundle,不猜目录秒数。
|
||||
|
||||
新增5项配置隔离单测、10项目录绑定单测、4项入口合同全部通过,合并此前69项为88/88(4.571秒,主会话);命令为PYTHONDONTWRITEBYTECODE=1 python3 -B -m unittest discover -s artifacts/qa-layout/postrelease-recovery-20260917 -p 'test_*.py' -v。测试均合成,只有上述配置专项启动过无网工具容器;新源未解包、无真实恢复/敏感解密/业务写入/提交/推送/部署。R3的30件字节和manifest33001f58…再次核对不变,原19项PG不重跑、不冒增独立计数。
|
||||
|
||||
## 2026-09-17 R3独立完整性/54项重跑回执已接回,内容审查仍进行中
|
||||
|
||||
用户转回独立执行方报告:R3 manifest33001f58…自摘要、28份登记文件摘要/字节数/文件集、前驱R2 076078be…、R2执行器/manifest及五份helper/原测试字节保留、两份delta重放均PASS。独立方在包外以PYTHONDONTWRITEBYTECODE=1/python3 -B先导入unittest/unittest.mock,再discover全部test_*.py;EXIT0、54项、4.557秒,23+28+3与交付日志逐名一致。包内30件跑前后摘要不变、无pycache;日志仍在独立方scratchpad,摘要短标afa5c7d9…,本会话未取得日志原件,不冒称亲自独立执行或已验日志全摘要。
|
||||
|
||||
本会话仅重新核本地R3完整manifest及28份文件摘要/字节,均一致,未重跑这54项、未新增测试通过计数。转述中历史处置摘要简写尾部与实算值不同,完整值以包内5ed1e910408b32d336235729850cb35238bb3ee15b587618c0a56417f2bee8fd为准;原manifest校验及处置文件均未变,不按简写修改冻结身份。
|
||||
|
||||
当前分项:包完整性独立PASS;54项单测独立重跑PASS(用户转述回执);内容审查IN_PROGRESS,外部会话b1ferktxd尚未给结论。19项最小合成PostgreSQL合同仍仅主会话执行,独立方只读元数据未重跑;b1构建新增15项同样不是本次独立54项范围。冻结包内independentContentReview=PENDING保持,审查进度在包外本节登记,不提前写成整体放行。
|
||||
|
||||
继续等待内容审查结论,同时保留新源runId/实际目录绑定、新镜像实际配置专项、重冻执行输入及现场fresh preflight门禁;这份中间回执不授权跳过任一项,不生成或运行第二次恢复入口。未改R3/R2、源码、生产或ARM资源,未提交/推送/部署;用户无需重复批准既有范围。
|
||||
|
||||
## 2026-09-17 08:45 CST:b1原生ARM64构建完成(未启动/未恢复)
|
||||
|
||||
本轮用户批准固定b1d25d3c/树a9f1c8ab与既有node digest的同源码ARM64镜像构建,不包含部署、应用启动、真实恢复或Secret读取。主会话直接实施和检查,不派实现/检查子代理、不冒充独立复核。复用本task清单,不改原R2/R3冻结包或已消费恢复入口。
|
||||
|
||||
- [x] 准备独立的一次性b1构建器,验证源码/归档/固定base与资源停止门禁;不依赖b7旧失败回执。
|
||||
- [x] ARM现场核base/平台及至少6GiB可用内存、20GiB磁盘,固定30分钟构建时限;失败记账、不自动重试、不prune。
|
||||
- [x] 产物平台、BUILD_SHA、OCI revision及未启动应用/旧制品保留元数据核验,保存源码/锁/上下文/日志/镜像摘要。
|
||||
- [x] 更新本task与09-08协调记录,保留R3独立复核及新源最终绑定待办,不把构建称为恢复PASS。
|
||||
|
||||
实际一次构建exit0,00:44:10–00:45:16Z全程66.691秒(含源码准备/SSH预检/后验,不是恢复RTO)。产物sha256:5d279fefadee0e6d8d0e9f13c80a521165d495d2a141679ca276aeba51489d79、1075296688字节,linux/arm64,BUILD_SHA/OCI revision均为固定b1提交;镜像无FIELD_ENCRYPTION_KEY/DATABASE_URL/JWT_SECRET/AUTH_CODE_PEPPER非空配置,容器数0,旧b7镜像保留。后验内存可用10.23GiB、磁盘87.84GiB、swap0,未清共享缓存;构建日志9处CACHED,因此不声称全新依赖安装或原amd64制品字节复原。
|
||||
|
||||
输入1103份固定Git文件,只有部署Dockerfile首个node FROM改为批准digest;原Dockerfile SHA1699c6aa…、修改后26b5a2b2…,三份依赖锁摘要与原批准记录一致。gzip上下文2371581字节、SHA8cfab7a816ced0fe330d9b3202cb2a8165439885f019efa7a36de9b0d6ba7767,逐源列表SHA6b0d5f62…,构建日志SHAbec77d0a…;完整值留在postrelease-recovery-20260917/arm-build-b1-result.json及source-hashes文件。仅源码上下文通过stdin传往ARM,无真实备份或生产配置传输。
|
||||
|
||||
本地新增15项保护单测通过,合并原54项为69/69;最初两例mock把docker inspect数组写成对象导致测试失败,已仅修测试夹具并保留初次失败日志,未因此发生ARM构建重试。覆盖归档范围/路径/链接/秘密文件、FROM最小替换、固定base/资源/产物身份、失败预检不build、已有回执拒重跑、构建失败不重试及成功不启动应用。主会话执行,不算独立复核;未新增DB集成、浏览器或应用运行计数。task/Trellis/process/diff通过,R3 manifest33001f58…及28登记文件共30件原字节保持。
|
||||
|
||||
剩余门禁:R3外部内容复核仍PENDING;取得新源同manifest的runId/实际目录身份后重冻执行输入,补新镜像实际配置专项,再现场重核源/最新性/资源。当前源有效期至09-17T18:30:04Z;超龄则重新核源,不回用旧b7、不改R3冻结字节。没有生成新恢复入口,没有第二次真实恢复、生产访问/写入、Secret读取、部署、提交或推送。
|
||||
|
||||
## 2026-09-17 08:15 CST新源只读回执已接回:数据源完整,b1匹配镜像待批准准备
|
||||
|
||||
用户手工sudo只读回执与本地脚本输出JSON核对一致,已脱离终端地址/密码提示保存arm-fresh-source-readback.json(executor=USER_MANUAL_SUDO)。ARM固定根身份1201d50a…一致,最新自然源createdAt=2026-09-16T18:30:04Z,manifest SHA256 d9a23d59fb31e3807ed720efb89a4219c466763551e6aa897a5532c40d496b65,来源b1d25d3c,实测5.75小时;DB3186135字节、storage17880399字节,均通过manifest摘要/字节检查,源元数据与timer前后未变。旧09-15源29.75小时超龄,不回退。此结果是配对归档完整性,不是新源已恢复或应用PASS。
|
||||
|
||||
新源sourceImage=9a9d2dfd…与当前生产image、BUILD_SHA只读核验一致,原制品linux/amd64,ARM清单不含此image。ARM97个image ID与上一轮版本盘点完全相同,只有b7对应1d4d70f8…,没有可证明对应b1的ARM64应用镜像。普通账号资源再读MemAvailable10.25GiB、Docker余87.88GiB、2CPU、swap关闭;只读,无build/pull/load/恢复或配置更改。
|
||||
|
||||
本地来源树a9f1c8abd16b260d23ee38508b3ff3c51710371e;b1与b7的71项migration名称及校验和全相同。实际部署Dockerfile deploy/trialrun/Dockerfile、.dockerignore、前后端package-lock及BIFF8 requirements逐字相同。最初兼容性探针误以server/Dockerfile作检查路径,不能证明实际Dockerfile;已以fresh-source-build-inputs.json对真实五个路径逐个Git blob比对补正,原回执不冒称该项充分。schema/构建入口一致不等于应用镜像版本可混用。
|
||||
|
||||
下一项单独受保护动作是b1同源码ARM64镜像构建,范围见design新节;未获此构建批准,不执行Docker build或仿真、不读取Secret。R3内容复核仍PENDING,manifest33001f58…保持原字节;新源绑定/制品身份另行附包,不把R3的PENDING_NEW_SOURCE改一字段当放行。当前只读回执未输出runId/实际目录名,不能由createdAt推导;后续绑定须从已核manifest.runId或同摘要目录现场取证,未取得前不猜测可执行batchName。
|
||||
|
||||
新源24小时有效期到2026-09-17T18:30:04Z(北京时间09-18 02:30:04),实际执行仍重新核最新性/完整性/资源/生产版本;过期或新源变化则停止重新绑定。已批准的精确历史例外和一次受限恢复不重复索取,匹配新源码制品的构建须单列明确批准。证据均在postrelease-recovery-20260917,未提交/推送/部署。
|
||||
|
||||
## 2026-09-17 精确历史例外实施(已批准,未重跑恢复)
|
||||
|
||||
用户批准本地修订、测试并独立复核后一次受限恢复,不重复索取同范围批准。执行顺序:保存R2/原NO_GO→工作副本实现精确归档身份/七类关联/真实缺失校验→沿用原严格校验器,保留全部引用和原不一致计数→单测与真实合成PG查询验证→冻结增量供独立复核。例外成功也只给PARTIAL,新增不一致仍阻断应用;不改产品代码或生产记录。
|
||||
|
||||
本轮北京时间09-17晨间接续,旧固定源已过24小时,原入口已消费且不可重用。只读刷新最新自然源事实,不把旧ARM镜像当成新备份匹配镜像,不启动实际恢复或擅自构建新制品。R3若绑定前提未齐,仅作为不可执行的内容交审包,清楚标出source binding待补,不伪装READY。
|
||||
|
||||
实施完成:原严格附件helper保持原字节和全量输入,执行器仅修改preflight/verify_storage/execute三个既有方法,新增处置证据/精确查询/实际缺失三方法;其余14方法AST相同。先记录rawMismatches,再在恢复库验证唯一记录/路径、manual归档且归档早于备份、七类关联全部false,检查实际文件不存在且路径无符号链接/非法父节点。只有一条明确历史缺失且无其他不一致才继续app,storage及整体保留PARTIAL;若原严格检查零不一致则不虚构例外。未绑定源的bundle在preflight以SOURCE_BINDING_PENDING拒绝,不生成恢复启动器。
|
||||
|
||||
验证:主会话54/54(原23源码未改+例外28+只读选源3)通过,冻结副本再跑同54项亦通过,不计108个不同测试;真实本地PostgreSQL16最小合成schema验证19项,含实际新SQL/原helper、长路径base64、七类关联、身份/时间/重复、额外缺件与大小/SHA、空SHA、只读拒写,临时容器及文件清理PASS。未运行R3完整app/JWT/真实恢复,不把最小schema验证称生产全库复验。syntax、task validate、Trellis/process、敏感扫描及diff门禁通过,docs仍0 errors/22项未登记警告,不处理无关文档。
|
||||
|
||||
只读刷新:普通生产账号读取归档ACCESS_UNAVAILABLE,生产build仍b1d25d3c,timer本自然周期success/0;这不证明新的成对备份完整。ARM镜像元数据盘点集合未变,仅已知b7的1d4d70f8…匹配,没有可证明对应b1的镜像。新自然备份build/manifest仍待ARM管理员只读回执,禁止推测后直接重建或套旧镜像;本轮没有新增ARM镜像/容器或真实恢复。
|
||||
|
||||
R3交审包artifacts/qa-layout/restore-once-review-20260917-r3已冻结28份登记文件,manifest SHA256 33001f5894ab48c99cac92c388837fcb1b5c549536f0ee29ccedb010d1017100,指回R2 076078be…;两份差分重放与快照一致、逐文件摘要/字节检查PASS,权限644。状态CONTENT_REVIEW_ONLY_SOURCE_REBINDING_PENDING,independentContentReview=PENDING;本会话主会话检查不冒充独立复核,不派检查子代理。bundle仍保存过期R2计划作审计参考,并有PENDING_NEW_SOURCE执行闸,不可直接修改字段后运行;重绑须重新冻结执行输入。
|
||||
|
||||
管理员只读选源入口postrelease-recovery-20260917/refresh-arm-source.sh已准备,probe SHA e835bc0155aba978447822cab781f488fe0cde85dbdadf8166caa7088295218b,shell SHA 7d7202b8198d16950e1fcbb411b00652cc574fff27e445c70644efabb5886000。复用前次只读探针,强制ARM/root和固定归档根身份,以hash校验的内存代码运行;不在远端落文件、不解包/建容器/恢复,不读字段密钥,不改sudoers。需要用户终端交互sudo取得新源事实,与独立内容复核可并行;本地真实恢复入口仍未生成,原NO_GO和冻结R2未改。下一步接回这两项外部证据后处理匹配镜像/重新绑定,不再要求重复批准已明确的历史例外。
|
||||
|
||||
## 2026-09-16 实际受限恢复:NO_GO / ATTACHMENT_REFERENCE_MISMATCH
|
||||
|
||||
用户通过交互sudo执行一次固定入口,14:54:53Z返回:preflight 4.169秒、prepare 1.453秒、database 2.607秒均PASS;恢复源0913782f…、复核manifest076078be…,RPO73482秒(20.41小时)。来源迁移集合/校验和及12表读取通过,数据库已实际恢复,不再标NOT_RUN;在storage阶段附件引用校验返回不一致,application未运行,敏感解密NOT_TESTED,整体NO_GO。storage解包/普通文件计数已过才会到该失败码,但不能据此把引用或逐件内容判PASS。该码聚合了空/不安全路径、缺件、大小或SHA不一致、外部存储等情况,回执没有数量/类别,不能直接断言“缺了一件”或“就是旧测试附件”。
|
||||
|
||||
本次cleanup=PASS、cleanupPending=false、postcheck=PASS、productionWrites=false;即原源摘要/元数据、生产ready和timer后验通过。影子库及附件副本已清理,未执行应用验收;失败阶段自身时长未记录,不能推算完整RTO。原入口已消费,不盲重试,不为了推进删除引用/修改原件/过滤归档项或重写R2。
|
||||
|
||||
下一步仅先保存原始脱敏回执、核代码判定与历史已批准治理证据,并在原只读授权内核当前生产附件路径/存在/大小及治理关联摘要;不读取原件正文、不额外调用云服务、不开第二轮恢复。当前生产状态只能用于归因线索,不能冒充本次冻结备份DB的复现。若需要重建影子库才能定因,先列出一次诊断所需的最小新增范围和证据,不复用已消费的单次入口。
|
||||
|
||||
14:59Z当前生产只读扫描62条引用(发票44、报销附件16、付款回单2、采购/请假0),存在/大小检查仅发现一条invoice_pool原件缺失,pathIdentity=b22a1162…与09-11旧缺件完全相同,其余61条元数据检查通过;未读文件正文/重算内容SHA,因此不能排除本次冻结备份另有内容不一致。15:01Z单条只读复核:recordIdentity=36383435…同旧记录,manual归档发生在源备份之前、该行备份后未更新,报销/明细/差旅/报销附件/采购附件/付款回单/请假七类关联均false。两次运行生产容器身份/启动时间不变,未写业务或重新恢复。
|
||||
|
||||
已找回此前未在本副本定位到的原始处置证据:另一20260910-reimbursement-payment-integration副本的qa-flow/20260911-invoice-reference-readonly/provenance/historical-missing-disposition.json(SHA256 5ed1e910408b32d336235729850cb35238bb3ee15b587618c0a56417f2bee8fd)及disposition-precheck-result.json(9a0b99c051d423b254e67ba5c17f5e40579ec4176c2d5697504fcda8c38c6414)。09-11原决定是DOCUMENTED_MARK_KEEP_ARCHIVED_RECORD,仅在task/证据标记,未修改生产记录/UI、未删文件或更改校验器,并明确原恢复overall仍NO_GO。当前发现与这条历史处置一致,但它不等于“任何归档件均可忽略”,也没有批准把原完整性验收改成PASS。
|
||||
|
||||
下一步建议见design拟议补充:仅对此精确记录/路径登记一个有条件的历史缺件例外,保留原始不一致计数和PARTIAL结论;在恢复副本确认七类关联及无其他不一致后才继续应用只读验收。此项改变当前遇任何引用不一致即停止的门禁,另需一次明确批准,包含本地修订/定向验证/重新冻结并复核后一次受限恢复;未批准前不修改R2或执行第二轮。当前PAUSED_PENDING_NARROW_ACCEPTANCE_DECISION,不重复索要旧单次批准。
|
||||
|
||||
## 2026-09-16 独立23项重跑接回,接续管理员现场入口
|
||||
|
||||
用户转回独立执行方回执:Python3.9.2,包外先导入unittest/unittest.mock,再discover冻结test_restore_once.py;23项、exit0、0.088秒。21份文件(19登记及manifest两件)运行前后摘要相同,无新增pyc;用例名与原日志一致。日志由独立方保存在其scratchpad,本会话仅接收用户转述,没有取得原始日志全文,不将本地自检冒充这次独立执行。
|
||||
|
||||
独立单测门禁已满足;内容结论仍为有条件通过,现场源/最新性/manifest、资源及生产前后检查只能由实际执行回执解除。执行前条件2已有包外源config与非空fail-closed补件,本轮再用固定ARM镜像实际config和冻结app-check补无真实资料的隔离验证;不读生产字段密钥。附件Finding1/2的范围限制沿上一节,纳入最终验收纪要,不改冻结R2字节。
|
||||
|
||||
接续清单:核R2全部摘要→实际镜像配置专项→将原执行器和bundle按manifest原字节封装为摘要固定入口→本地检查入口只调用已审Session→普通用户暂存与回读→用户交互sudo运行。现场预检在任何真实恢复前执行;固定源超过2026-09-16T18:30:05Z或最新性/版本/资源变化立即停止,不自动换源、不放宽门禁。受限恢复授权不重复索取;本轮不提交/推送/归档/部署。
|
||||
|
||||
14:46:33–14:46:57Z实际ARM配置专项通过:固定image 1d4d70f8…中的config字节SHA与来源相同,镜像未设置字段密钥、getConfig缺省为空;以合成非空值运行冻结app-check原字节和实际依赖(无边界替身),返回APP_READ_FAILED/exit1,外层断言exit0。专属配置工具容器network=none、非root、只读根、512MiB/1CPU/pids128、无宿主挂载/持久日志,精确清理PASS。未启动OA服务、读取真实备份或生产密钥;这是主会话现场补证,不新增独立测试计数。回执arm-image-config-check.json。
|
||||
|
||||
14:50:28Z入口普通用户暂存完成,独立一次传输后回读摘要相同;未sudo、未执行真实源preflight或恢复。入口SHA256 e2f57c3e0429fa581acb9f31f5baf29193d94c6a9e61c6c57823beb98c669653,将R2 manifest、restore_once.py和bundle原字节嵌入;再次校验内嵌摘要/四helper后,仅调用原Session.execute,保留信号/30分钟边界,NO_GO映射非零退出,不重写原门禁。root加载器先核入口摘要,再消费唯一暂存脚本并删除空目录,然后从已校验内存执行;失败不自动重试。手工入口为postrelease-recovery-20260916/run-approved-restore.sh,回执entry-staging.json,暂存仅代码、无真实资料。审查状态通过包外本节接续,冻结包仍21份、076078be…不改。
|
||||
|
||||
主会话新增入口专项6项与传输/摘要先于执行及精确自清理2项通过,使用unittest/unittest.mock预导入后discover两个test文件;不合并为原23项独立通过数。脚本bash -n、两个task validate、Trellis治理/process及git diff --check通过;文档审计errors=0,既有22份未登记文档警告不在本轮修复。当前READY_FOR_MANUAL_SUDO_PREFLIGHT:现场预检本身只读,通过后才准备容器/网络并恢复;受权限边界限制必须由用户在终端输入sudo密码,不在聊天获取密码或改sudoers。真实DB/storage/app验收仍NOT_RUN,配置专项不是APP_READONLY通过;完整解密仍NOT_TESTED。稳定边界由现有配对恢复规约覆盖,本轮不另改spec。
|
||||
|
||||
## 2026-09-16 R2外部内容结论接回:有条件通过,证据门禁未解除
|
||||
|
||||
已收到外部报告restore-once-r2-claude-review-20260916T141328Z.txt及用户独立完整性核验:19/19摘要/字节、manifest 076078be…、R1链和bundle四个可执行件一致。内容审查有条件通过,无阻断性代码缺陷;Finding4仍要求独立执行证据,不能将其隐去写成无条件放行。当前CONDITIONAL_PASS_PENDING_EXECUTION_EVIDENCE:需原独立会话重跑23项单测,管理员真实执行前在ARM当场重验源/最新性/manifest和环境,不能沿用13:28–14:03旧快照。
|
||||
|
||||
补齐Finding2依赖(报告执行前条件2,不是附件Finding2):包外source-config-b7d2285d.js来自git show b7d2285d,SHA256 a3b62630cb05935194e0297dedbd82e38f6fd4fa4f7042a2ca4ca2e2baeff1c4,与镜像构建登记的server/src/config.js摘要一致,FIELD_ENCRYPTION_KEY缺省为空。ARM目标镜像只读inspect确认镜像环境没有该变量;不代表尚未启动的真实影子容器已经验收。check-key-fail-closed.mjs使用原config和冻结app-check断言,以全新合成非空值验证APP_READ_FAILED、exit1,DB与网络调用均0;边界依赖替身,不是实际容器重跑。证据key-fail-closed.json明确MAIN_SESSION/independentExecution=false,没有读取生产字段密钥。
|
||||
|
||||
附件覆盖限制明确接受并写入后续验收纪要:file_sha256为空时只能验证安全路径、存在性及可用大小,不能证明该条业务引用的内容哈希一致;leave_requests无size/sha字段,只核路径与存在。归档整体SHA一致不补出原本不存在的逐件业务哈希。tmpfs未加noexec列为已知低风险加固项,保留冻结字节,不为非阻断项未经复核修改R2。
|
||||
|
||||
两处事实澄清:该备份采集时来源是b7d2285d,b1d25d3c是后来演练时要求保持的生产版本,并非用b1备份冒充b7;两提交migration目录再次静态diff为空。publicOrigin仅由ARM宿主控制器做已批准的生产/ready前后只读探测,不传给隔离应用或影子DB,不能把宿主健康观察误读为允许影子应用访问公网。
|
||||
|
||||
本次R2 19份文件重核仍全匹配,manifest保持076078be…,补件全在包外,没有恢复真实备份、没有新增应用启动、配置变更或生产业务写入。原受限演练授权不重复索取;补证完成后再给管理员执行命令,源过24小时/版本变化仍停,不绕门禁。
|
||||
|
||||
## 2026-09-16 受限演练已授权:适配/合成验证完成,真实执行待独立复核
|
||||
|
||||
用户已明确批准design所列受限演练,不再重复索取同范围批准。本轮完成ignored的一次性restore_once.py编排与app-check.cjs,复用与b7d2285d逐字相同的restore-db/storage/附件校验器;未改产品代码或安装长期runner/sudoers。源时效、根/manifest/文件集、链接/容量、镜像digest、内部网络、无端口、只读挂载/权限、超时和精确清理均有门禁;生产只读ready前后核验。
|
||||
|
||||
验证:本地主会话23项安全单测PASS,既有offhost runner合同32条PASS输出(含汇总,非32项独立产品用例);ARM上使用已批准镜像创建纯合成库,执行实际来源迁移SQL并登记合成迁移摘要、生成部门/员工/角色/报销/长路径附件,经pg_dump→原DB恢复脚本→迁移/12表聚合→原storage恢复/引用/摘要检查;缺失引用负例拒绝;实际app/匿名401/短期影子JWT/只读权限/行身份比对通过,清理PASS。最终synthetic-full-final-result.json的restoreStarted=true仅指合成库,realBackupRead=false。全程未接触生产字段密钥、真实银行资料、真实备份解包或生产业务写入。
|
||||
|
||||
首轮单测加载失败是本目录inspect.py遮蔽Python标准库inspect;修正测试入口为先导入unittest/unittest.mock再discover,旧探针未改。旧日志保留不作通过证据。首次ARM合成验证为应用/权限链,最终补足实际dump/restore/附件长路径和缺失反例;各阶段回执区分,不把主会话自检当独立验收。合成使用DB容器内tmpfs,root宿主tmpfs挂载路径未运行;SIGKILL/断电/断网、真实副本恢复和敏感字段解密仍未验证。失败阶段自身时长未完整捕获,不声称完整失败RTO/SLA。
|
||||
|
||||
交审入口artifacts/qa-layout/restore-once-review-20260916-r2,manifest SHA256 076078be37dcd3c03c4be9b3413904b01fe1ac86f1bf34b34db88cc240334b05,19份登记文件逐项摘要/字节数复核一致,文件权限644。独立只读复核PENDING;受inline工具边界限制未派实现/检查子代理,不虚报外部结论。包内README列出5项审查重点和全部未覆盖,包内不含真实备份/密码/JWT/字段密钥。
|
||||
|
||||
R1先冻结后交叉核对发现配置误将createdAt的18:30:05当runId末尾;生产只读按精确manifest查到唯一runId=auto-20260915T183002Z。R2只修正bundle的batchName并补来源回执,指回R1哈希,执行器/测试源码未变、R1未重写、不新增测试计数。R1禁止用于执行;真实运行仍会在ARM验证最新目录/同manifest,不能以生产回读代替ARM检验。
|
||||
|
||||
当前没有执行真实入口。下一步接回对R2的独立只读结论,解决实质阻断后提供摘要固定的ARM管理员命令;普通账号仍无法读归档/sudo非交互不可用,不能偷偷扩权。真实开始前固定源过24小时或生产/最新批次变化即停止,重新绑定来源/镜像;现有批准不授权绕过门禁。敏感字段解密保持NOT_TESTED,最终受限成功也只记PARTIAL。
|
||||
|
||||
## 2026-09-16 P2单次操作范围准备完成,待授权及合成合同验证
|
||||
|
||||
本轮按用户批准准备清单,没有继续创建远端资源或启动镜像。已在design最新节固定manifest/来源树/两个ARM64镜像、30分钟总时限、只读DB身份、内部网络/禁外联、容量与内存/CPU上限、失败停止及精确清理规则。ARM补充只读资源观察为MemAvailable10.24GiB、磁盘87.91GiB/2CPU,执行前需重取。
|
||||
|
||||
认证采取明确披露的影子短期签发token+恢复库现有合格身份,仅调用已静态审查的报销列表own范围及匿名拒绝,不写员工密码/角色,也不声称真实密码登录。为此允许的影子DB权限DDL与恢复数据核验分阶段,应用无DML/CREATE/TEMP权限;缺合格身份不造数据。不读取生产字段密钥,因此敏感字段解密NOT_TESTED、完整应用灾备结论仍PARTIAL;这条需要随单次批准清单明确告知,不隐藏为已完成。
|
||||
|
||||
配置专项check-shadow-config.mjs执行原b7d2285d config源码、空白环境及随机合成JWT/pepper,结果shadow-config-check.json为PASS_SOURCE_CONFIG_ONLY,未连DB/未启动app。源码检查涉及index/app/auth/reimbursements/delegation/tracing/crypto,原restore-db/storage及附件校验器继续复用。未执行现有真实数据runner或冒用旧安装/sudoers授权。
|
||||
|
||||
下一门禁:用户批准design所列受限演练范围后,完成相应执行器适配及本地合成安全合同检查、只读复核/冻结,再提供需ARM管理员权限的精确命令;若源已过24小时或模型前提变化停止重新绑定。当前是方案可审,不是脚本已验收,不将未满足的权限/网络/资源测试写成PASS。实际恢复、运行应用与源文件读取仍未开始。
|
||||
|
||||
## 2026-09-16 已授权ARM64镜像准备完成(非恢复验收)
|
||||
|
||||
用户明确批准本次ARM镜像构建。13:26–13:29Z执行:从固定b7d2285d8d1a2a912222917f7c74067f8bd9f810/树0ef8f7d5597b1fc425888596241d041585aaccab导出1102个构建所需文件,不含工作树差异、生产.env/业务密钥/真实备份。拉取ARM64 node:22-alpine后,将原Dockerfile唯一FROM替换为已解析的node@sha256:c610fcdfb1d5b4740dd70c284ed3cb16bb857e0f7166196e36a5501df7a3aa32;原/派生Dockerfile、三个lockfile、源码逐文件和上下文摘要均登记。该Dockerfile派生只为固定基础镜像,不改Git源码。
|
||||
|
||||
首轮构建器在输入识别阶段报ambiguous Dockerfile source,exit1;只读确认拟产物不存在,没有盲目重试。保留首轮回执后,将相同源码tar改为有明确签名的gzip tar并做本地解包文件计数校验,再进行一次修正构建;未重复拉取基础镜像。R2 exit0,npm ci及Vite构建完成。产物image sha256:1d4d70f843976e327106d53d13d45118e22372ac6e71cbe7db96953315b4fed3,linux/arm64,大小1075264677字节;BUILD_SHA及OCI revision均为固定来源提交。
|
||||
|
||||
独立一次元数据回读(仍主会话执行,不冒充外部审查)确认相同image/平台/版本,引用该镜像的容器数量0,目标盘余87.91GiB。无应用启动、备份读取/恢复、生产连接、业务写入、仿真或部署;未清共享缓存/旧镜像。保留已批准新镜像及本轮基础镜像/构建缓存,不将其当临时残留自动prune。
|
||||
|
||||
结果ARM64_IMAGE_BUILT_IDENTITY_VERIFIED_NOT_RUNTIME_TESTED。这是同源码跨平台重建,不是原amd64制品字节复原;npm锁及Python哈希约束已保留,但基础系统依赖、平台包和构建时下载不宣称与历史生产完全相同。未运行产品单测、应用健康/业务读取/解密或DB/storage恢复,不能升级为APP_PASS或恢复任务完成。
|
||||
|
||||
证据位于artifacts/qa-layout/postrelease-recovery-20260916:build-arm.py及首轮arm-build-result.json/log;build-arm-r2.py、arm-build-r2-result.json、arm-build-r2.log、arm-build-r2-source-hashes.json、arm-build-readback.json。下一步按已批准恢复设计准备具体清单,重核源时效、原件引用治理、只读身份/解密、禁外联和资源门禁;真实恢复及应用运行仍待专项授权,不沿用此次镜像构建批准。
|
||||
|
||||
## 2026-09-16 ARM人工回执接回及镜像版本只读核验
|
||||
|
||||
13:16:49Z用户在ARM手工sudo执行已登记摘要的只读探针,回执已脱离密码提示/SSH尾部单独保存为postrelease-recovery-20260916/arm-user-readback.json,executor=USER_MANUAL_SUDO。最近两个自然批次manifest与生产逐一相同,DB/storage字节及SHA256通过且归档元数据未变。最新b7d2285d源18.78小时,目标剩余89.38GiB、内存11.68GiB、2 CPU;这些是该时点值,不自动授权恢复或修改访问权限。
|
||||
|
||||
随后按用户批准以普通账号只读检查95个本地镜像的BUILD_SHA及OCI revision:90个arm64、5个amd64,均没有符合提交格式的上述标记;源image 48dfa8e4…不在集合内。结论NO_PROVEN_MATCHING_APP_IMAGE,不等同于证明95个镜像均不含对应源码。ARM64 PostgreSQL标记PG_MAJOR=16的镜像c05eced0…存在,但尚未启动/运行验证。证据image-versions.py/json,镜像集合前后不变,无构建、pull、load或容器创建。
|
||||
|
||||
本地确认b7d2285d来源树0ef8f7d5597b1fc425888596241d041585aaccab,是当前b1d25d3c祖先,二者migration目录无差异;不据此把当前应用替换为备份匹配应用。恢复源最新时效仍须在实际执行前重验。
|
||||
|
||||
下一受保护操作建议单列为ARM64应用镜像准备:经批准后传输该来源提交的脱敏构建上下文,按来源Dockerfile在ARM原生构建,固定BUILD_SHA/VITE_BUILD_SHA并登记基础镜像digest、lockfile、构建输入/产物摘要;无需读取或传入生产.env、业务密钥、真实DB/附件。新产物属于同源码跨平台重建,不是原amd64制品复原;基础镜像与依赖差异必须披露。只创建本轮专属构建目录/镜像,不启动OA、不恢复真实数据、不启用仿真、不清理共享缓存或其他镜像。构建网络用于获批的镜像/依赖下载,与后续禁外联恢复网络分开。尚未取得该构建写入批准,未开始构建。
|
||||
|
||||
镜像准备后才可冻结完整恢复清单;只读应用身份/必要解密、所有后台与外联关闭、资源硬限制仍待核定。恢复数据写入继续另批,不能把本轮95个镜像元数据检查当应用恢复PASS。
|
||||
|
||||
## 2026-09-16 待执行清单(最新)
|
||||
|
||||
当前PLANNED_NOT_AUTHORIZED_FOR_RESTORE;不因b1d25d3c已上线就关闭恢复缺口。09-15历史8d源方案不再默认执行,按本task最新PRD/设计和09-08的P1→P3接续。
|
||||
|
||||
- [ ] 接收P1新时点只读结果:源manifest/字节/SHA、自然或手工、所在节点、年龄、源build/image/platform、ARM容量与权限。归档损坏/传输缺失/源码未知分别归因。
|
||||
- [ ] 选定一个源和匹配镜像;核应用启动入口、后台任务与出站关闭、只读身份/解密条件,列未满足前提而不读取生产Secret。
|
||||
- [ ] 冻结一次操作清单并集中请求批准:必要的源复制/镜像加载、专属临时副本/卷/内部网络/容器、资源及超时上限、DB/附件恢复、应用只读检查、仅本轮资源清理;不包含生产业务写入、旧件治理、监控修改或测试通知。
|
||||
- [ ] 获批后再核源与目标无漂移、生产ready基线;开始计时并执行单次DB恢复,非零停止后续阶段,核迁移集合/校验和与关键表聚合,不硬编码旧66/68数量。
|
||||
- [ ] 恢复storage临时副本并核安全路径、引用存在性、适用大小/SHA;缺件细分源缺失/传输不全/校验器误判,无批准治理证据不排除记录。无存量摘要时明确仅存在性验证。
|
||||
- [ ] 以匹配平台/来源应用执行已批准的只读验收,分别记录health和业务读取/必要解密;不可用则APP_BLOCKED/PARTIAL,禁止DB PASS顶替。
|
||||
- [ ] 核原归档未变、生产前后健康、精确资源清理回执;分段记录DB/storage/app耗时与总RTO、源时点相对演练起点RPO,未计时字段不猜测。
|
||||
- [ ] 汇总一次结论:各阶段PASS/FAIL/NOT_TESTED、异常类别、清理及生产影响;仅全部合同通过才标本次演练PASS,08-28两个自然周期另验,不混结案。
|
||||
|
||||
等待真实恢复批准期间只做本地方案/校验器审查或已授权只读核验,不重复OCR、发布或创建新备份来制造完成证据。
|
||||
|
||||
## 2026-09-15 简单配对恢复的集中批准边界(未执行)
|
||||
|
||||
不新增runner。已知可识别的历史输入为receipt-followup-release回滚备份:manifest `56a9addf57556580c46205ae8e68b01a8e23a45ae7757d4cfce9ec9c92660c86`、来源8d08d46d;对应镜像归档SHA256 `d17d7efaef073b5cc6b78f1ce2a73e938835e4910946c83e855b48e61780541b`,历史回读通过。它不是已核最新自然备份,不能报24小时内,也不能换成b7或当前本地代码假装同源恢复。
|
||||
@@ -237,3 +530,12 @@
|
||||
- 本任务涉及真实备份数据和远端运维边界。执行完成后做一次只读复核,重点确认:生产零变更、归档未修改、RTO/RPO 口径正确、附件验证没有漏项、敏感内容未进入证据、临时对象已清理。
|
||||
- 若现有脚本需要修改,回到规划阶段补充设计和新的批准;不得在远端临时放宽 shadow/路径/确认门禁。
|
||||
- 门禁通过后用中文 commit 引用 `08-23-isolated-backup-restore-drill`,是否推送仍按用户当时授权执行。
|
||||
## 2026-09-16 恢复前置实施:HOLD_ACCESS_AND_PLATFORM
|
||||
|
||||
已按批准执行只读预检,不是恢复执行授权。生产最新自然源b7d2285d(09-15T18:30:05Z,manifest 0913782f84bf7253a8ea1a24e727f8c20a6a637c58737b5df767331809dd2f4e)实测18.34小时、DB/storage完整;源image 48dfa8e4…实测linux/amd64,生产x86_64,目标ARM实测aarch64。ARM归档不可读、sudo非交互不可用,容量/完整性/镜像集合NOT_VERIFIED。不能以生产容量27.39GiB替代ARM容量;不能承诺原生产镜像能在ARM运行。当前DB_RESTORE/STORAGE_REFERENCES/APP_READONLY均NOT_RUN,cleanupPending=false(未创建资源)。
|
||||
|
||||
本地启动合同检查:Dockerfile默认npm start→node src/index.js,未在该入口发现migrate/seed;app会mkdir(storageDir)且无条件调用startJobs,后者仅JOBS_ENABLED=false提前退出,默认是开启。恢复应用必须显式关闭jobs并预建专用存储目录;镜像启动命令、全部插件/外联配置、只读身份和必要解密还需按最终源提交复核,不能用当前HEAD片段代替源镜像的完整启动审查。不加载生产.env,不把OCR_PROVIDER=off当禁止所有后台任务的替代。
|
||||
|
||||
集中申请的前置清单:①以有权限方式只读核ARM两个自然批次及容量/镜像;②匹配源与平台,若只存在amd64原镜像则另提同提交arm64构建或已批准的其他隔离目标,禁止隐式仿真/改用生产宿主;③据实测冻结资源预算、只读应用身份、禁外联配置、清理ID范围及停止条件;④取得该具体范围的一次恢复写入批准。源若超过24小时重新选最新合格批次,不固守本次历史摘要。前两项未解决前不生成看似可直接执行的恢复命令。
|
||||
|
||||
证据归artifacts/qa-layout/postrelease-recovery-20260916;此次公网末次/ready为b1d25d3c且PASS。尚无DB恢复、附件引用、解密或应用恢复通过证据,恢复任务保持进行中。
|
||||
|
||||
在新工单中引用
屏蔽一个用户