---
type: devlog
kind: impl
title: R3 检查点后连续尾段恢复
date: 2026-09-09
status: partial
stage: P4
evidence: E2
---

# R3 检查点后连续尾段恢复

## 开发前合同

用户批准继续开发。默认恢复行为不变;显式 --include-tail 允许扫描检查点后连续完整记录。必须先独立校验检查点前缀,再逐行接纳尾段;序号连续、逐Adapter时钟不倒退、完整换行、Envelope结构合法;外置blob offset连续、length合法、范围完整、逐块hash匹配。首个异常停止,保留此前合法尾段;不得跳过异常后继续拼接。

恢复仅接受已停止写入的源。尾段没有历史检查点可信哈希,语法和内部hash一致不是来源真实性证明,状态partial、identity unresolved,明确区分checkpointEventCount与recoveredTailEventCount。只写新目录,原会话不改;新manifest重算完整恢复文件hash并独立validate,不复用旧指标缓存。

资源:单线程逐行扫描,O(前缀+尾段字节数),复制1MiB块;新增尾段单行上限16MiB(超过则停止并记录原因,不丢弃原文件)。blob逐块复制与hash有界,不一次读取整个blob。校验器仍驻留已恢复事件,整体内存尚非有界。单进程基准120秒;自动周期checkpoint/实时首响应、1GB/长会话和E4仍开放。匹配测试含完整/半行/缺口/坏hash/截断blob/时钟倒退和默认兼容;20轮同负载前缀/尾段恢复资源对照,明确输入规模不同,不宣称无成本。

## 实施与E2验证

新增recover-checkpoint --include-tail;默认前缀恢复不变。尾段单行16MiB上限、连续序号/Adapter时钟校验、blob连续范围与逐块哈希,首个错误停止。成功恢复重新hash并独立校验;recovery.json显式记载checkpointEventCount、recoveredTailEventCount与停止原因,tailHasCheckpointAttestation=false。尾段时长不伪造,recoveryDurationIncludesTail=false。

Python267/267(1.684秒),完整/半行/缺口/倒退/错误hash/截断blob/布尔序号与原源不变性回归通过。恢复仍partial、identity unresolved,不升级指标质量。

## 资源对照

单输入实际300MiB,checkpoint在200MiB;20轮/模式、独立进程、交替AB/BA。前缀组恢复20事件/200MiB,尾段组恢复30事件/300MiB;不同处理量不计算优化收益。

| 模式 | 中位ms | P95ms | 最大ms | CPU中位ms | RSS峰值bytes |
| --- | --- | --- | --- | --- | --- |
| prefix | 790.470 | 894.797 | 1039.004 | 764.279 | 236994560 |
| tail | 1973.738 | 2160.684 | 2192.181 | 1931.701 | 553709568 |

基准包含复制、hash、独立校验及写出恢复目录;OS缓存和主机并行工作可能影响,OS block计数不替代物理I/O峰值。恢复校验依然驻留全量事件,不宣称有界RSS;输出源代码SHA256随证据冻结。未新增实时线程/定时器,周期默认集成尚未执行。

[40轮匿名证据](/archive/validation/evidence/perfowl-r3-tail-benchmark.json)。本批不作完整停止≤2秒、设备E4或1GB/60分钟结论。

## 下一步与整体进度

R3显式离线恢复继续推进,R0~R6整体partial。下一步周期checkpoint调度与真实事件循环资源/首响应测试,再处理持久化引擎状态和满盘重启。目录发布不是整场原子事务;发布中崩溃可留下不完整新目录,原目录不变,应另选新目的地重新恢复。完整签名/公证/GPL与真机门禁仍开放。

## 最终源码复测与内存修正

首轮发现前缀对象与完整校验对象同时驻留;第二次验证前释放前缀引用。最终源码再次40轮,tail中位1896.293ms、P952014.769ms、max2038.628ms,CPU中位1848.234ms、RSS峰值340013056字节;较首轮553709568字节下降约38.6%。prefix中位779.878ms、P95894.023ms、max1004.913ms,RSS236867584字节。

[最终40轮证据](/archive/validation/evidence/perfowl-r3-tail-final-benchmark.json)。前后非同时随机代码A/B、存在缓存与主机负载差异,内存变化与对象生命周期修正一致,不外推全源稳态。最终最差仍超过2秒;离线恢复不等于点击停止,但也不以此宣布2秒合同达标。Python最终267/267(1.639秒)。

## Build42 内部包(E2)

Swift111/111、64项站点合同与构建通过(有bundle体积警告)。Build42 x86_64 ZIP独立解包内容一致、严格codesign通过、包内probe ready。包内recover-checkpoint --include-tail实际恢复1条前缀+1条尾段,partial/unresolved和无历史凭证标记正确。

ZIP110335263字节,SHA-256 `a6dc3376bb32e98fe15a8ba6f6b72e203242968d16b454a2e971ed9f35d41c1b`。[包证据](/archive/validation/evidence/perfowl-build42-package.json)。ad-hoc、Gatekeeper/staple未通过,未安装Applications、未真机。正式签名公证/GPL门禁开放。