返回 DeepSeek-Reasonix
history-startup-loading.zh-CN.md
根目录 / docs / history-startup-loading.zh-CN.md
1 # 历史目录发现、历史准备与执行恢复
2
3 普通启动不运行正文格式迁移。旧 JSONL、DAG 和既有目录会话保留原存储;新会话继续使用当前目录格式。缓存数据库、分页定位数据均为可丢弃的派生数据,不是恢复原始会话的前提。
4
5 ## 三种不同的就绪状态
6
7 - **目录可查询**:目录数据库已经打开。已有元数据可立即读取;不表示所有历史根已经发现完毕。
8 - **历史可阅读**:被打开会话有经过校验的显示窗口。显示索引准备独立于执行控制器,可以取消。
9 - **可以发送**:当前会话的完整执行上下文和写入权限已经恢复。历史可读不代表可以发送;恢复期间仍可编辑草稿和切换会话。
10
11 执行恢复失败(包括外部写者占用租约)不会把历史准备提前标成读取失败。相同导航与源身份的被动元数据刷新复用正在进行的冷读取,不改为依赖控制器的 Follow 请求。运行时重建通知也遵守此边界。真实冷读取失败才显示局部重试状态;后续运行时就绪仍可通过现有交接流程替换该窗口。
12
13 只有明确不支持的格式才可进入兼容读取。原生格式的缓存、I/O 和解析错误保留为读取失败,不悄悄启动全量回放。古老 kind/type 事件在首条记录被明确识别;有效检查点消息之后混入其他格式属于损坏。目录删除或重命名时同步释放底层原生监听,确保相同路径的新目录能重新注册。
14
15 目录扫描只读取文件身份、文件属性和受限的小型元数据侧文件。缺失字段保留为未知,未知轮数不能解释为零。中断或失败的扫描不会确认目录内其余历史缺失。正文损坏也不能作为一段完整的可恢复历史发布。
16
17 ## 已接入的维护边界
18
19 普通启动已移除全库正文显示索引修复。目录实例先发布,监听先于扫描注册;活动会话通过已保存的身份恢复。待完成创建和持久化操作仍由原恢复流程处理。
20
21 文件监听现在会在已保存身份仍在恢复时开始。启动准入不等待项目、主题元数据同步,也不等待已恢复路径的索引写入;已恢复路径进入现有精确路径队列。首次、周期及用户操作触发的元数据刷新共享一个可取消的任务,最多保留一次待处理请求。该任务等待数据库时,监听循环继续接收事件,关闭时等待任务退出。
22
23 创建事务恢复在活动界面准入后只通知注册元数据刷新,首次旧会话目录发现统一由监听器安排,避免恢复通知与监听器交错而排入第二次全量扫描。扫描期间真实源变化仍保留后续协调。建议性注册表投影现接入共享后台调度,每个受限批次后释放数据库写锁;比较实际项目和主题行,包括旧写者的修改,仅发布变化。清理按主键分页,只访问注册表管理的行,且必须先成功处理完全部输入;取消或失败的批次不会把未处理输入当作删除。源主题的清理由源删除和协调负责。每个写入片段保留 30 秒取消期限,完整注册信息可跨片段继续推进,不因整任务到期反复从头开始;其他目录模式保留原子刷新语义。首次建立可选部分索引仍是后台全表操作,注册 JSON 的加载和解析尚未增量化。
24
25 目录发现保留进程内目录迭代器并轮转历史根。每个片段最多 128 个目录项、4 MiB 输入或 50 ms;片段间隔至少 100 ms,共享 8 MiB/s 后台读取预算。前台准备并发为 1,后台扫描并发为 1;当前项目元数据优先,前台历史准备期间暂停其他项目的后台片段。64 KiB 读取检查点检查取消。这里是调度参数,不是硬实时或已测得的整机性能保证。
26
27 排队的元数据发现最多保留 8 个目录迭代器。普通后台目录最多占 7 个名额,为当前可见项目保留 1 个名额。已开始的扫描保留原迭代器和进度,完成后才接纳等待中的目录;连续切换项目不会突破上限,也不会驱逐未完成扫描。全部名额占用时,新可见目录等待空位,小型精确路径更新不依赖这些名额。此上限覆盖排队发现,不包括显式同步管理扫描。
28
29 目录尚未获准开始扫描时收到的失效通知合并到首次扫描,包含最新范围和持久化任务序号;扫描已经开始后收到的变化仍须完成后续扫描,才关闭共享完成信号。测试通过可控检查点区分这两种交错。
30
31 前端每次挂载时的语言同步只刷新界面显示,不调度历史目录扫描,即使首次扫描已经开始也如此。回归测试同时覆盖重复启动同步和实际切换语言。
32
33 目录监听复用既有平台实现:macOS 使用 FSEvents,Windows 使用 ReadDirectoryChangesW,其他平台使用原通知适配器。macOS 注册监听不再枚举所有子文件,也不再为每个历史文件分配一个句柄。规范化监听路径的精确事件映射回注册时的访问路径。监听注册失败会单独重试;不可用期间由五分钟轮转巡检覆盖,注册恢复时协调漏听区间。30 秒元数据刷新不再让每个未监听目录重复全量扫描。
34
35 精确保存事件更新对应路径。目录待协调记录持久化,重启后继续安排发现。目录协调失败使用 1 秒、5 秒、30 秒退避;不可访问的目录保留失败状态,不批量隐藏其历史。
36
37 文件监听使用不等待数据库的精确路径队列准入。队列满时,监听器按目录合并待协调标记,在原有批次中写入任务日志;写入失败继续保留重试,不再为每条溢出的文件通知同步写一次日志。权威保存通知仍保留原持久化溢出路径。首次发现前的通知并入首次扫描,扫描开始后的变化仍需协调,不作为噪声丢弃。
38
39 根目录失效通知会在下一个时间片边界替换正在扫描的元数据迭代器。未完成的代次不能确认缺失记录,也不能清除待协调日志。通知先合并等待 100 ms,每次准入等待最多延长到一秒,然后启动替代扫描;普通预算让出仍保留迭代器。未变化的元数据会在提交事务内再次校验,仅更新扫描存在代次,不重写主题聚合、不发送冗余列表修订;发现进度独立更新。
40
41 新安装环境中,从未收录历史的可选旧目录可以不存在,此时发现以空目录完成,不创建目录。已有目录记录的历史根消失时仍报告不可访问,不能据此确认会话缺失。可选目录随后创建时继续安排正常发现。
42
43 项目的发现完整性沿用上述发现结果,不再因为重新检查文件系统发现目录不存在而忽略其失败。已有记录仍可显示,失败目录计数明确表示发现尚未完整。
44
45 自动排序的旧会话“全部会话”列表可直接分页读取固定的目录数据库快照,即使项目已有分组,也不再先拉完所有历史页。时间筛选直接进入分页查询,时间边界在快照内固定。自动排序的项目置顶列表使用同一分页入口,只读取被置顶的新格式成员头部元数据。一个主题包含多个物理会话时,列表按物理会话分页。快照释放时关闭其独立的只读数据库连接;活动更新通过刷新进入新快照。
46
47 自动排序的分组及未分组列表也使用有界结果分页。成员关系固定在当前组织快照中,按物理来源身份匹配;同一主题下的不同会话不会因此互相串组。新格式会话在读取头信息前先筛选分组和置顶成员。空分组保持为空,已删除分组报告错误;成员变化只进入新快照。稀疏分组仍可能扫描较多数据库元数据键,因此这不代表固定耗时,也不代表旧组织偏好的增量导入已经完成。来源身份保持原哈希约定,比较候选键不重新解析每个文件路径,也不增加依赖新函数的持久化 schema 或索引。
48
49 自动排序的单头列表进行文本筛选时,也保留固定目录快照并分批读取元数据。匹配继续使用 Go 的 Unicode 大小写规则,覆盖显示标题、预览及物理来源身份,包含本地化的自动标题。来源身份直接使用目录内已捕获的标识,不重新解析每个候选文件;内存中只保留匹配的结果页。稀疏匹配或无匹配仍可能扫描全部元数据,这表示内存有界,不代表已接入全文索引或固定响应时间。候选项之间及数据库批次之间检查取消。
50
51 没有待导入的旧来源相关偏好时,创建、重命名和删除分组不再强制遍历旧会话列表。分组及取消分组只在组织事务中准入明确指定的来源;路径选择器和来源选择器使用同一个物理成员身份。显式取消分组会保留导入标记,避免后续发现把旧主题分组重新套回。事务内重新检查来源接管和新格式会话的生命周期,过期版本或归属冲突不能准入来源。手工排序和旧分组、排序偏好导入仍沿用原有全量来源流程。
52
53 旧 JSONL 检查点、可信 `.display-index.json` 和 DAG 可建立本地 SQLite 定位投影。正文仍由原格式读取,DAG 按选中分支及覆盖记录回放,不创建新格式 manifest。读取绑定与兼容分页入口按源、分支及观察到的代次共享同一个准备任务。源替换会取消旧代次的在途读取,释放单个读取方不影响同代次的其他读取方。任务在数据库真正关闭前仍保留在管理器中,立即重开及接连取消的后继任务都必须等待关闭完成。应用退出也会取消没有持久读取句柄的兼容分页任务。目录格式会话可在控制器尚未创建时读取原存储。
54
55 原生读取绑定通过 `history-native-search-v1` 声明按需全文搜索能力。只有显式搜索才会从已校验的检查点或选中事件/DAG 分支逐条读取消息,建立可丢弃的 SQLite 文本索引。完整代次发布前返回 `preparing` 和空结果;单纯打开或分页不会启动搜索准备。多个读取方共享准备与取消所有者,最后一个读取方释放及应用退出时,先等待搜索结束再关闭数据库。搜索游标绑定查询、来源与分支代次,结果可通过既有消息定位接口访问;重新打开会话复用匹配的完整缓存。本次提供绑定搜索接口和能力协商适配器,未新增搜索对话框。
56
57 历史根服务共享 256 MiB 空闲运行时预算和既有 60 秒空闲 TTL。执行中、等待审批以及仍有绑定的运行时不作为空闲对象回收。这个预算不是应用总内存上限。
58
59 JSONL/检查点及 DAG 的绑定读取还支持按页查询用户轮次大纲,以及直接按轮次或消息定位,无需创建执行控制器。大纲位置使用 SQLite 部分索引,预览只逐条解码当前请求的用户消息,并保留有界文本;这个冷读取路径暂不提供可选的回答预览。主显示消息身份直接解析为固定快照游标,派生子行不作为独立定位身份。大纲和跳转与正文窗口校验相同的来源、分支和改写代次。未声明 `history-native-navigation-v1` 的旧服务继续使用既有导航协议。读取取消或源替换后,不会把部分大纲发布到另一次导航。
60
61 没有可信显示侧文件的 schema-1 原生事件日志也接入同一读取路径。`replace`、`append` 事件合并为磁盘上的消息位置索引,即使一次替换包含全部对话,也逐条解码消息。追加链断裂、未来 schema 和损坏尾部均不能把有效前缀发布为完整历史。JSON 字段顺序保持兼容;即使标识字段位于大消息数组后方,已验证缓存再次打开也无需重扫。仅修改派生 SQLite 文件,不改写检查点、事件日志或兼容显示侧文件。
62
63 绑定窗口返回的大字段引用还保留原读取句柄。正文分块读取沿用同一分页索引、来源快照和取消生命周期;句柄释放或替换后,旧引用不能转向新读取者或管理操作目标。这些引用的正文读取不再调用兼容检查点修复路径。
64
65 对于原生分页器已接受的格式,没有绑定句柄的兼容正文请求也借用同一个准备任务,显式管理目标读取同样如此。读取前后校验原始来源,不发布兼容显示侧文件,也不修复过期检查点。取消一个借用方不影响仍在使用的绑定读取方。原生准备路径尚未支持的情况和古老事件行引用仍走既有兼容读取;这些协议并不因此获得持久读取句柄的生命周期。
66
67 冷兼容读取按已捕获的历史路径解析已知来源目录。全局界面的当前工作区目录不会取代旧全局历史目录;分页、正文字段和旧预览 RPC 共用这项解析。未知目录及逃逸已知目录的符号链接仍会被拒绝。
68
69 维护诊断只记录计数和资源占用,不记录正文。`historyMaintenance.instrumentedReadBytes` 只统计经过受控读取器的实际字节;不以文件大小冒充读取量。
70
71 ## 注册表读取与归属解析
72
73 注册表每次成功验证后发布不可变快照,一次构建会话归属、生命周期、共享主题和源分支查找索引。导航、执行归属验证和旧源映射查询按明确会话身份读取;单会话查询不复制项目成员列表或全部操作日志。保存事务成功后立即发布独立的新快照,已持有的旧快照保持不变。
74
75 同一次发布还会构建来源与会话的失效校验值,包含来源证明、生命周期代次和持久化未知字段。每次分页验证中,项目成员检查与来源检查共享一次实际字节验证,随后按相关身份查询,避免复制完整注册表以及为每行重复遍历全部来源映射。标题、置顶及无关会话变化不会使旧读取失效。显示副本共享的是同次验证的不可变索引,不能仅凭数值代次相等绑定到另一次发布。
76
77 显示方可以持有已发布快照,但它不是执行授权。执行和管理操作仍验证注册表的实际字节,兼容保留时间戳或代次的旧写入方;重叠校验共享一次读取,取消一个调用不会取消其他调用的验证。文件损坏、未来格式或归属冲突不会覆盖最后一个可显示快照,也不会允许用旧缓存覆盖权威文件。
78
79 复杂度边界:稳定快照的单会话查询是 O(1);首次读取、外部修改校验和 JSON 注册表写入仍是 O(B),其中 B 是注册表字节数。100、10,000、100,000 会话与 1、100、1000 项目组合的查询基准只衡量快照内查找,不代表启动性能验收。
80
81 主线的正式会话创建及输入恢复保持不变。创建结果由持久化操作回执确认;后续历史或侧栏投影失败不能成为再次创建会话的理由。运行态继续沿用现有 epoch/revision 同步,正文继续由已协商的读取绑定提供。
82
83 ## 尚须完成的验收边界
84
85 history.29 生产包(`741ce6a81`)包含事件/DAG 断点恢复、受保护窗口预算修复,以及缓存淘汰时释放历史读取绑定。原生 smoke 已通过 checkpoint 与 schema-1 events 冷读取、有界分页、大纲、锚点、搜索、Unicode 大字段、写入租约冲突、分组游标及主进程/服务正常退出。同一生产包完成了 [缓存 soak 证据](validation/history-cache-history29.json):四轮、八个检查点/事件会话的双向翻页和 A→B→A 导航,共 195 个观测点;驻留窗口峰值 3,正文峰值 130,080 字节,Markdown 峰值 987,280 字节,历史窗口淘汰 20 次,回收 2 页,SVG URL 创建 466 个、释放 464 个;稳定采样时 Markdown worker 无待处理任务。原始内容哈希未变,主进程和服务正常退出。
86
87 history.28 生产包(`66f838fdf`)仍是当前有效的规模测量包。macOS arm64 / Apple M1 Max 上的 [90 次已有缓存测量](validation/history-startup-history28.json) 达到原门槛:100/10,000/100,000 条时,按钮可见 p95 为 1,411/1,468/1,485 ms,目录首页为 1,354/1,422/1,358 ms,可信窗口为 1,446/1,491/1,528 ms,可发送为 1,476/1,514/1,550 ms。首次后台发现分别为 1.2/22.4/249.3 秒,与启动分开计时。history.29 使用过修改后的测量脚本,未产生合格的规模验收证据,因此不替代这组结果。
88
89 这些缓存夹具覆盖淘汰和页回收,没有填满字节预算,也不能证明整个进程内存、跨历史根空闲运行时、所有列表模式、非活动正文零读取及其他平台验收完成。原生包证据也不能证明所有历史格式对单条超大消息都已避免整体解码。
90
91 history.26 生产包(`bc8cdb9fd`)包含增量注册表投影、检查点断点恢复和显示索引流式恢复。原生 JSONL/events 分页、大纲、搜索、正文读取、写锁冲突、分组快照游标和正常退出均通过。macOS arm64 / Apple M1 Max 上全部 90 次已有缓存测量达到原门槛:100/10,000/100,000 条时,按钮可见 p95 为 1,430/1,345/1,350 ms,目录首页为 1,304/1,295/1,309 ms,可信窗口为 1,464/1,366/1,360 ms,可发送为 1,483/1,376/1,382 ms。首次后台发现为 1.2/21.5/241.1 秒,与启动分别记录。[完整样本与包身份](validation/history-startup-history26.json) 已保存;这些结果不覆盖之后的产品改动,也不代表内存、正文零读取、所有列表模式及跨平台验收完成。
92
93 发现进度更新现在与元数据刷新、会话行提交和扫描完成共用同一个进程内 SQLite 写入边界。旧扫描代次不能更新新代次的进度,取消也不能把发现标记为完成。这修复了一个并发写入准入缺口;外部进程导致的数据库争用仍须正常报告,重试次数没有放宽。
94
95 原生测量工具为 `node desktop/packaging/history-startup-scale.mjs /path/Reasonix.app`。默认固定一个活动会话,分别增加到 100、10,000、100,000 个未打开的旧会话,每个规模启动 30 次。结果分别记录包身份、机器、逐次样本及 p95:操作按钮可见、目录前 50 条、可信正文窗口、非空未发送草稿的发送就绪时间。按钮可见只是交互就绪的代理指标,不是完整响应性测试。工具检查活动身份、没有额外模型调用和 shell/service 正常退出。失败保留样本目录并标记不完整组;少量冒烟运行不能通过 30 次验收门槛。
96
97 2026 年 9 月 22 日的 history.12 测量完成了 100 条和 10,000 条各 30 次:目录首页 p95 从 1,296 ms 增至 2,374 ms,按钮可见 p95 分别为 1,337 ms 和 1,330 ms。100,000 条在发现预热阶段超时,尚未开始测量,保留数据库记录了写锁争用错误。这属于失败及不完整的验收证据,不能作为性能通过结果。后续包已包含写入边界修复,组合通过结果见上述 history.24/history.26 记录。
98
99 history.13 包(`d3522a790`)完成了 100 条和 10,000 条各 30 次:目录首页 p95 为 1,227/1,302 ms,按钮可见为 1,330/1,330 ms,可信窗口为 1,344/1,385 ms,可发送为 1,357/1,371 ms。100,000 条首次发现约 245 秒到达末尾后重新扫描,超过未调整的 300 秒预热上限,未取得该规模启动样本。已保留样本目录和进度日志;这是不完整验收,不能记为通过。后续组合包已包含恢复重复通知与元数据刷新修复;本包的失败记录仍予保留。
100
101 history.14 包(`8bf67d4a4`)同样只完成较小两组各 30 次:目录首页 p95 为 1,256/1,424 ms,按钮可见为 1,340/1,437 ms;100,000 条约 242 秒后重新扫描,在取得样本前超时。因此,仅移除恢复重复通知还不足以解决问题。后续平台监听及调度合并修复已通过相关 race 测试,包含在 256 个进程文件句柄上限下注册 512 个文件的原生 macOS 测试;其生产包规模结果仍须单独取得。
102
103 history.15 包(`29e62fc10`)通过了原生导航,但外部写者用例切换到 schema-1 事件历史时失败:选中会话受租约限制,被动刷新把未完成的冷读取替换成被拒绝的实时 Follow。确定性生命周期测试复现了这一顺序,并已通过上述读写状态分离修复。这是修复证据,不代表原包或待完成规模组已通过验收。
104
105 history.16 包(`5d2f9a5c6`)通过了原生冷读取、外部写者冲突和快速导航。100/10,000 条各完成 30 次:目录首页 p95 为 1,265/1,366 ms,按钮可见为 1,353/1,387 ms,可信窗口为 1,366/1,375 ms,可发送为 1,381/1,408 ms。100,000 条再次在首次扫描末尾后重扫,超过未调整的 300 秒预热上限,未取得启动样本。启动现已先提交首次监听目录批次,再放行中断后恢复的扫描任务;界面查询准入仍不等待任务日志写入,提交失败的目录请求保留重试。这修复了另一种重复调度顺序,仍需新生产包测量。
106
107 history.17 包(`1833a5fac`)通过相同原生检查,但 100,000 条仍重扫并在采样前超时。100/10,000 条各完成 30 次,目录首页 p95 为 1,340/1,312 ms,按钮可见为 1,352/1,322 ms。进一步的确定性复现定位到 `SetTrayLocale`:前端挂载时的语言同步调用了全部目录刷新,修复前四次同步产生四次扫描请求。现改为仅通知界面刷新;其独立性能贡献未单独测量,后续组合包结果见上述记录。
108
109 history.19、history.20 和 history.21 的十万会话探测也都在采样前超时。过滤目录根写入通知未被证实有效,该过滤已撤销。history.22 包(`7f6695004`)通过原生 JSONL/events 导航、搜索、分组分页、写入租约冲突和正常退出检查;100/10,000 条各完成 30 次,目录首页 p95 为 1,319/1,368 ms,按钮可见 p95 为 1,328/1,399 ms。十万条约 247 秒后重扫,超过未调整的 300 秒预热上限,仍无启动样本。因此,首次发现前同步一次原生通知还不足以解决问题。诊断确认后续仍有大量精确路径队列溢出,新的监听准入改动须单独测量。
110
111 history.23 包(`39733a7cd`)通过相同原生检查,消除了逐文件同步写协调日志的洪峰。100/10,000 条各完成 30 次,目录首页 p95 为 1,272/1,284 ms,按钮可见为 1,310/1,354 ms,可信窗口为 1,345/1,414 ms,可发送为 1,359/1,388 ms。十万条仍在约 239 秒后重扫,超过未调整的 300 秒预热上限,未取得启动样本。后续时间片换代与未变化元数据优化已通过确定性交错及 race 测试,后续组合包规模结果见上述记录,不把改善单独归因于其中一个改动。
112
113 history.24 生产包(`bcef753a5`)在 macOS arm64 / Apple M1 Max 上完成全部 90 次测量,达到未调整的已有缓存规模门槛。100/10,000/100,000 条时,按钮可见 p95 为 1,299/1,368/1,350 ms,目录首页为 1,277/1,351/1,319 ms,可信窗口为 1,380/1,408/1,349 ms,可发送为 1,340/1,388/1,371 ms。首次后台发现约需 1.1/21.4/238.3 秒,与启动采样分别记录。原生 JSONL/events 分页、导航、搜索、写入冲突、原始内容不变、分组游标及正常退出也通过。该包早于增量注册表投影改动,不能据此宣称所有列表模式、格式、内存预算和平台均通过。
114
115 当前实现不能宣称已完成全部性能治理:自定义排序和多分支侧栏仍使用原完整快照适配器;导入旧有分组或手动排序偏好时仍可能遍历旧会话页。普通“全部会话”列表仍读取全部新格式成员头部元数据,历史目录格式发现仍需接入持久化增量投影;项目外层列表仍会收集所有显式置顶项。因此,尚不能宣称所有启动和列表配置都与历史总量无关。
116
117 Desktop 的侧栏元数据目录不再等待数据库全量完整性扫描才能打开。恢复准入后,完整的 `integrity_check`(包含索引一致性)通过后台维护调度执行。检查或元数据查询发现损坏时,撤销该目录代次并取消工作,关闭全部独立分页连接,然后由生命周期所有者通过原有校验与隔离流程重新打开;替代目录的修订号高于已撤销代次。临时 I/O 错误、写锁争用和取消不会触发隔离。正文定位索引等其他投影继续保留原同步校验。
118
119 后台完整性检查目前是一条可取消的 SQLite 语句,其内部 I/O 尚未拆成应用层的 64 KiB/50 ms 时间片。schema 升级和元数据刷新仍可能处理全量投影,因此移除同步完整性扫描还不能证明所有打开路径与后台任务都不随目录规模增长。
120
121 检查点 JSONL 的索引准备已支持取消后重新打开时恢复已提交进度。唯一的派生暂存数据库在同一事务保存消息位置、源偏移、轮次和语义摘要状态,由既有跨进程重建锁串行管理。恢复键包含原生源身份及变更元数据;准备前后校验实际读取句柄与当前路径,已有权威内容摘要时必须匹配才能发布。源被替换、源校验记录缺失或进度损坏时重新准备;普通构建错误丢弃暂存数据。只有完整验证后的数据库才替换可读代次。新增内容均为旧读取方可以忽略的派生缓存,不写 manifest 或正文。确定性测试覆盖批次中断、子进程提交批次后不关闭数据库直接退出、恢复修改时间的等长重写、准备期间替换文件和新增权威事件日志,并计量实际受控读取字节,确认恢复不重复解析已完成前缀;这些证据不能证明所有文件系统都提供相同的源版本语义。
122
123 导入已有显示索引 JSON 时也会持久保存已提交条目批次和已消费的 JSON 偏移。恢复只重建数组的语法上下文,不重读已完成前缀;条目之前、之后的头部字段均保留。偏移取自解析器已消费位置,不使用缓冲预读位置。源变化或断点损坏时重新导入派生数据。连续取消和最后一个条目处取消仍保持取消语义;分隔符错误及不完整尾部继续报错,原显示索引文件不被改写。
124
125 Schema-1 事件准备现已把已消费的解析偏移、完整事件状态和消息数组中途状态与暂存定位数据一同提交。随后生成选中视图的阶段,另行保存消息位置、轮数和摘要状态。重开时校验源代次并恢复两个阶段;数组后的头字段、重复 messages 字段、替换/追加顺序和非法 JSON 尾部均保留原语义。测试覆盖取消、进程不清理直接退出、损坏/缺失断点、源替换及恢复修改时间的等长重写。这些只涉及可丢弃缓存,旧读者可以忽略。特殊旧字段顺序下,源类型探测仍可能在恢复准备前重读识别字段所在的事件。
126
127 DAG 准备也已拆成可恢复的扫描、父链回溯和选中视图投影三个阶段。解析偏移、分支选择、链位置、轮数与摘要状态同派生行原子提交;每批仅更新发生变化的分支头,避免反复改写全部分支。测试覆盖各阶段取消、进程直接退出、连续取消、缺失/损坏断点、源替换、等长重写、显式分支切换及发布前取消,恢复结果与原格式回放比较。分支头恢复仍占用与分支数量相关的内存;此改动不解决单条超大记录的问题。
128
129 生产包缓存检查还发现:执行被写锁阻止时,被动就绪通知会把独立可读的历史窗口换回最新页。现已让同一身份、同一代次且无新内容证明的被动元数据刷新保留已验证窗口;显式重试、缺失证明、版本或代次变化仍重新读取。history.27 原生冷读、搜索、定位和正常退出通过,但连续切换暴露了另一个问题:驻留预算漏算受保护窗口。现已按全部驻留窗口计算预算,仅从非活跃候选中回收;若活跃任务本身超过预算,不销毁活跃所有者,解除保护后立即重新执行回收。必须用包含这些修复的新包重跑,才能宣布原生缓存验收通过。
130
131 超大单条消息处理和追加后保留旧游标仍需继续实现与验证。目前检查点准备对单条解码记录设置 16 MiB 上限,尚未实现更大记录的临时文件处理。事件中的消息数组已流式读取,但单条 provider 消息仍整体解码。原生全文索引准备仍保留一条已解码消息及其搜索文本;一至两个字符的查询可能扫描选中会话的搜索索引。不支持的古老格式仍使用兼容路径;不能把可解析前缀当作不支持或损坏历史的完整替代品。
132
133 未支持新读取绑定的格式或远端协议沿用其已协商的原读取方式。读取失败不能授权切换到其他存储源。显式导入、归档、恢复、复制、移动与完整导出保持原有管理语义。
134
135 验收应分别记录界面可交互、目录首页、首个可信窗口与可发送时间。100、10,000、100,000 会话各至少 30 次固定环境测量,生产包真实启动与退出,以及长时间导航的内存收敛,均须单独提供证据。浏览器 mock 测试通过不能替代这些验收。
136
136 lines MARKDOWN