先保住数据
取证冻结快照中 232 条线程元数据只有 77 条仍有 rollout;155 条已确认被一次过宽关键词清理误删。第一步是建立不带 delete propagation 的增量、可恢复归档。
Architecture study · 2026
当前调研对象:
当前需求是单用户、全私有。
取证冻结快照中 232 条线程元数据只有 77 条仍有 rollout;155 条已确认被一次过宽关键词清理误删。第一步是建立不带 delete propagation 的增量、可恢复归档。
AgentsView 负责会话;Obsidian 负责 Wiki;Cursor / SSH 直接操作服务器文件、终端、tmux 和 Codex。三者共享服务器路径与证据 ID。
MADR 是 Markdown 结构模板,不是新系统。单用户只保留日期、背景、决定、理由、后果和证据;不引入复杂审批、visibility 或发布状态机。
它们没有直接提升个人会话浏览、知识整理和服务器操控体验。claude-replay 也只在需要分享某一次会话时临时使用。
本报告把需求拆为五个问题:
| 问题 | 需要回答什么 | 主要证据 | 交付判断 |
|---|---|---|---|
| 会话保存 | Codex 哪些文件是真正的逐字记录?缺失后还能否恢复? | 本机 $HOME/.codex 只读核验、官方 Codex 手册 | 需要独立增量归档 |
| 会话浏览 | 是否能搜索、回放工具调用、统计 token,并实时看到活跃会话? | AgentsView、claude-replay、Codex viewer 项目文档 | AgentsView 最贴合 |
| 知识提炼 | 如何把真正长期有效的取舍变成稳定、可引用的知识? | MADR / ADR 模式、现有 memory hook | MADR-lite + 证据指针 |
| MacBook 访问 | 如何浏览、整理并直接操作服务器内容? | Tailscale、Obsidian Sync / Headless、Syncthing、Remote SSH | 网页浏览 + Obsidian 整理 + Cursor 操控 |
| 可选网页知识层 | 何时值得把 Wiki 生成带搜索、反向链接和图谱的静态站? | Quartz、SilverBullet、MkDocs、Pagefind 等 | Quartz 最匹配,但不进入核心 MVP |
app-server、remote-control 等接口仍可能变化,报告把它们视为高级集成接口,不作为第一阶段的数据事实源。[S1]没有公开或复制任何完整 transcript;没有改动 Codex 配置、memory hook、隧道服务或现有项目;没有启动对外监听端口。rollout 取证只读取 metadata、数量、文件时间线和已留存的最小 Stop 审计摘要。
这台机器完全能承担
Ubuntu 26.04 LTS、Docker 29.5.1、Node.js 24.12、Python 3.14.4、uv 0.11.7、Chrome 148、Codex CLI 0.144.1。Quartz 与 AgentsView 都能直接运行。npm 缓存中见过 Obsidian Headless 0.0.12,但当前没有安装 ob 命令,也未登录或关联远程 Vault。
Tailscale 服务处于 active 且本机在线;Cursor Remote SSH 服务当前已由 MacBook 连接并绑定 loopback。私有网页入口直接复用 Tailscale,编辑和终端继续复用 Cursor / SSH。Cloudflare Tunnel、FRP 与 Pages 暂不进入本方案。
AgentsView 的服务文件、归档 timer 与可选 Quartz 配置成熟后,再放入 projects/codex-knowledge-hub/。Wiki 内容继续留在现有 wiki/,研究与项目继续留在 Raw Sources;第一阶段无需复制 staging 或重组根目录。
Codex 本地状态可供浏览。
取证冻结快照:2026-07-11。数据库合计 232 条 thread row;77 个 plain rollout JSONL 仍存在。调查期间新会话会继续增加,但历史缺失集合稳定为 155 条。
责任会话 019f404e-96d1-7690-aed7-0cbb91d2fc62 从 13:58:40 开始。保留的 Stop 审计快照在 14:10:58 明确报告删除了 Claude/Codex 历史、缓存与旧备份,14:14:41 又承认“刚才这部分我删过头了”。155 条缺失记录所在的 36 个日期目录,其 mtime 全部集中在 14:08:05.257–14:08:05.289 或 14:09:26.334–14:09:26.351;没有一条落在其他时间桶。SQLite metadata 位于独立文件,因此没有同步消失。责任会话自己的 rollout 也被删掉,无法恢复逐条删除命令;但批次归因由独立审计摘要与完整目录时间线共同确认。[S34]
tokens_used > 0,部分达到数百万或数千万,说明多数 rollout 曾真实存在。.jsonl.zst,原子持久化并再次核验源文件状态,最后才删除 plain JSONL;本机与 home 全盘没有任何 .jsonl.zst 或压缩临时文件。0.143→0.144.1 也没有相关修复。[S35]ALTER TABLE threads ADD COLUMN history_mode ...,不读写 rollout;它与删除时间接近,但没有因果路径。[S35]archived_sessions/、其他已知 Codex 根目录和 home,没有找到被移动的副本。| 数据源 | 当前观察 | 可承担职责 | 不能承担职责 | 建议 |
|---|---|---|---|---|
$HOME/.codex/sessions/ | 77 个 rollout JSONL,约 629 MiB | 完整事件流、消息、工具调用、补丁、token、子线程证据 | 误操作可直接删除;格式会演进 | 只读索引 + 不传播删除的增量归档 |
$HOME/.codex/history.jsonl | 120 行 prompt 历史 | 快速检索用户输入线索 | 缺少助手响应与工具记录 | 作为辅助索引,不当事实源 |
$HOME/.codex/state_5.sqlite | 232 条 thread metadata | 标题、cwd、时间、模型、token、rollout path 等定位信息 | 不能替代已经缺失的 rollout | 只读读取;备份要保证 SQLite 一致性 |
$HOME/.codex/memory-hook/ | 后台审计仍活跃 | 生成记忆/决策候选 | 候选不等同于已确认的长期记忆 | 复用候选,增加审阅队列 |
$WORKSPACE/wiki/ | Obsidian 风格、含 wikilinks | 稳定知识、实体、概念、来源摘要 | 不适合塞入完整逐字会话 | Obsidian 主编辑;Quartz 可选只读渲染 |
research/ / projects/ | 327 篇研究 Markdown、18 个 HTML、29 个项目 | 原始报告、项目说明、实施产物 | 不建议整库同步到 MacBook Obsidian | Cursor Remote SSH 直接浏览和编辑 |
本机 rollout 已观察到 session_meta、response_item、event_msg、工具调用、补丁、token 统计与子线程关系等事件。现有工具已经能把 Codex 的 exec_command、apply_patch 等映射为可读视图。[S10]
| 能力 | 官方定位 | 适用点 | 本架构结论 |
|---|---|---|---|
CODEX_HOME | 默认 $HOME/.codex,保存配置、历史和本地状态 | 发现数据源 | 以实际配置为准,不把默认路径写死到解析器 |
| OpenTelemetry | 默认关闭;可导出 API、SSE、工具、审批、token 与工具结果片段等事件;默认 log_user_prompt=false | 未来运行观测 | Collector 事件 / 属性 allowlist;原始 trace 归入高敏感 Internal |
codex app-server | 通过 WebSocket / Unix Socket 提供较底层应用协议 | 未来自研实时 UI 或控制面 | 先不用它作为长期档案协议,避免版本耦合 |
remote-control / Remote | 仍偏实验性;官方 Remote 依赖桌面端产品路径 | 远程控制当前任务 | 不能替代 Ubuntu 服务器上的历史网页门户 |
以上官方边界来自 Codex 官方手册,核验日期 2026-07-11。[S1]
会话 viewer、
| 工具 | 核心能力 | 主要优势 | 主要缺口 | 本机场景适配 |
|---|---|---|---|---|
| AgentsView | 多 coding-agent 会话索引、SQLite FTS5、统计/费用、文件变更、SSE 实时刷新、HTML 导出 | Codex 原生目录支持;默认 loopback;Docker;本地 SQLite;可要求鉴权;原始目录可只读挂载[S9] | 完整显示仍依赖 rollout 存在;它是浏览层,不负责知识策展 | 推荐基线 |
| claude-replay | 把 Codex/Claude/Cursor 等会话转成单文件交互 HTML;章节、书签、文件活动、watch、编辑器 | 自包含、可嵌入、生成前可裁剪与模式脱敏;非常适合教学、复盘和单次分享[S10] | 仅适合选中会话;压缩 blob 仍包含完整选中内容,CSS 隐藏不等于删除 | 精选导出 |
| codex-viewer | Web 读取 Codex sessions 与 history,支持 SSE 更新 | 目标单一、原型直观 | 生态与安全能力弱于 AgentsView,长期维护风险更高[S11] | 原型备选 |
| Codex History Viewer | 搜索、时间线、文件变更、标签和笔记 | 编辑器内体验完整,数据保持本地 | 入口依附 VS Code;跨设备和只读分享路径较弱[S12] | 个人辅助 |
| coding_agent_session_search | SQLite 事实源、BM25、可选本地语义检索、跨 agent 搜索 | 索引和检索设计扎实,可作为自研数据层参考 | 没有面向普通浏览器用户的 Web UI[S13] | 设计参考 |
| 工具 | 与当前资料的匹配 | 优势 | 代价 / 边界 | 结论 |
|---|---|---|---|---|
| Quartz v5 | 原生面向 Obsidian-flavored Markdown、wikilinks、反向链接和图谱 | 把 Markdown 构建成带全文搜索、目录、反向链接和图谱的静态网站;与现有 wiki/ 高度一致[S18] | 不负责同步、数据库或编辑;每次内容变化后需要重新构建 | 可选浏览器知识层 |
| Pagefind | 可为任意静态 HTML 增加离线生成的全文索引 | 无搜索服务器、部署极轻、适合混合静态产物[S19] | 只提供搜索能力,仍需内容结构与站点外壳 | 增强组件 |
| Obsidian Headless + Sync | 服务器命令行与 MacBook Obsidian 连接同一个 remote vault | 保留原生 Obsidian、wikilinks、插件配置、版本历史与端到端加密;Headless 可持续监听同步[S28][S31] | 需要付费 Sync 订阅;当前服务器没有安装 ob;同一设备不能同时运行 desktop Sync 与 Headless Sync | 订阅用户首选 |
| Syncthing | 服务器与 MacBook 直接同步一个知识目录 | 免费、自托管、双方保留本地文件;可选择 send/receive 等 folder type[S32] | 两端都需常驻;并发编辑可能产生冲突文件;仍应独立备份 | 免费首选 |
| SilverBullet | 浏览器 Markdown Wiki,支持双向链接、查询和脚本 | 如果未来需要直接在网页编辑,体验比静态站自然[S20] | 服务端与写权限扩大攻击面;会改变现有 Git/Raw Sources 工作流 | 编辑型备选 |
| MkDocs Material | 适合线性技术文档、导航和版本化站点 | 成熟、插件丰富、部署容易[S21] | Obsidian wikilinks 与知识图谱需额外适配 | 文档站备选 |
| Docmost / Outline | 适合团队空间、评论、权限与浏览器编辑 | 协作和权限模型完整[S22][S23] | 数据库、缓存、升级和备份负担明显更高;会复制现有 Markdown 事实源 | 团队阶段 |
| Log4brains | 专门生成可浏览 ADR 静态站 | 决策历史呈现清晰[S25] | 职责过窄且活跃度较低;与 Quartz 会形成重复站点 | 采用模型,不采用站点 |
| 工具 | 采集方式 | 最适合 | 敏感度 / 运维重量 | 阶段 |
|---|---|---|---|---|
| Codex 原生 OTel | Codex 自身导出事件;默认关闭,prompt 日志默认关闭;工具结果与错误仍需过滤 | token、工具、审批、错误、API/SSE 运行观测[S1] | 高敏感;取决于 Collector 过滤与后端 | 未来首选采集 |
| OpenLIT | CLI hooks 采集 coding-agent session、prompt、工具、文件编辑与子 agent,输出 OTel | 快速获得 Codex/Claude/Cursor 统一观测面[S15] | 高敏感;完整栈含 ClickHouse 等组件 | 可选第二阶段 |
| Phoenix | OTel-native trace / eval | 调试 LLM traces、评估、实验分析[S16] | 中;需要额外存储和生命周期治理 | 问题驱动接入 |
| Langfuse | SDK / OTLP、trace、prompt、eval、成本 | 团队化 LLM 产品观测与评测[S17] | 较重;自托管组件和升级面更大 | 团队 / 产品阶段 |
| claude-tap | 代理层捕获 API 完整上下文与 trace | 协议调试、系统提示和上下文问题诊断[S14] | 极高敏感;能看到系统提示、工具 schema 与完整流量 | 临时诊断专用 |
这套架构只有一个权威数据位置。
127.0.0.1:8080 提供网页;支持会话搜索、文件变更、token / cost 统计与实时刷新。[S9]research/、projects/、wiki/ 后立即作用于事实源。| 组件 | 读取什么 | 用户看到什么 | 是否能编辑 | 是否负责同步 |
|---|---|---|---|---|
| MacBook Obsidian | MacBook 本地同步副本 | 原生 Vault、wikilinks、graph、插件与编辑器 | 可以;修改再同步回服务器 | 桌面 App 配合 Sync,或由 Syncthing 同步文件 |
| Quartz v5 | 服务器上的 Markdown 构建输入 | 静态 HTML、全文搜索、目录、反向链接和图谱 | 不能;它是静态站生成器 | 不能;需要外部同步或直接读取服务器文件 |
| 浏览器 | Quartz 构建后的 HTML | 任意设备可打开的知识网页 | 通常只读 | 不涉及 Vault 同步 |
只要服务器把 Quartz 静态站通过 Tailscale Serve 暴露到 tailnet,MacBook 的 Safari、Chrome 或 Obsidian 中的外部链接都能打开。Obsidian 不会把 Quartz 页面当成 Vault;要在 Obsidian 内编辑同一批知识,必须把 Markdown 同步到 MacBook 本地。Quartz 和 Obsidian 可以共享同一份 Markdown 源,但它们没有彼此依赖关系。[S18][S31]
原始会话能告诉你“发生了什么”,
纯 Markdown,可由 Obsidian 编辑、Git 追踪、Quartz 渲染;一篇只记录一个长期决定,并能链接 session ID、报告和文件。未来追问“为什么没选另一个方案”时,不必重新读数万行 transcript。[S24]
临时命令、一次性排错、小范围实现细节和模型在单个 turn内的普通选择,不值得建 ADR。真正触发条件是:决定会持续影响未来工作,而且以后可能需要解释或推翻。
| 字段 | 含义 | 为什么需要 |
|---|---|---|
| title / date / project | 标题、日期、所属项目 | 支持检索、时间线和项目聚合 |
| status | active / superseded | 单用户无需 proposed / accepted 审批流水线 |
| context | 当时的问题、约束和目标 | 避免只保留“结论口号” |
| decision / rationale | 最终选择和关键理由 | 回答“选了什么、为什么” |
| alternatives | 真正考虑过的替代方案,可省略 | 只有存在重要权衡时才写 |
| consequences | 已知收益、代价和后续验证 | 帮助未来判断是否应推翻 |
| evidence | session ID、文件、报告 URL、commit(若有) | 从总结回到原始来源 |
---
title: 服务器作为唯一事实源
date: 2026-07-11
status: active
project: codex-knowledge-hub
evidence:
- session_id: "<codex-session-id>"
- report: "research/.../2026-07-11-codex-web-knowledge-hub.html"
---
## Context
Codex 会话、Wiki、研究和项目都已经位于服务器;MacBook 需要稳定访问和编辑。
## Decision
服务器保存权威文件;浏览器、Obsidian 和 Cursor 都只是访问或同步视图。
## Rationale
避免多个副本争夺事实源,也能继续使用服务器算力、路径和现有自动化。
## Consequences
Obsidian 需要独立同步;Cursor Remote SSH 可直接编辑;Quartz 只能做只读构建。
memory hook 可以提示“这里可能有长期决定”,但不需要另建复杂 review queue。人工确认后直接写入 wiki/decisions/YYYY-MM-DD-slug.md;若只是临时状态,继续留在会话或 volatile memory。
即使完全不部署 Quartz,MADR-lite 仍然有价值,因为 Obsidian、Cursor、普通文本工具和 Git 都能直接读取。Quartz 只负责把这些 Markdown 变成更适合浏览器阅读的页面。[S24][S26]
知识库当前只对本人可见。
AgentsView 和可选 Quartz 保持 loopback,统一通过 Tailscale Serve 给 MacBook 使用。当前不建立公网域名、Cloudflare Access 或 public build。
AgentsView 的 SQLite、缓存和服务配置放在独立目录。若用 Docker,把 sessions 以 :ro 挂载;若直接运行 binary,也不把索引目录放进 ~/.codex。[S8]
禁止对归档使用 rsync --delete 或“镜像源端现状”的策略。保留历史版本或 snapshot;源文件被删时,归档仍应存在。任何清理先 dry-run、输出 manifest,并排除 sessions、history、state 与审计备份。
同步和站点配置只引用系统 credential store、环境文件或交互登录;不把 token、密码和 cookie 写入 Markdown、Quartz 输出、Git 或报告。日志只记录状态,不复制会话正文。[S27]
那时再增加 public staging、脱敏扫描、独立域名与 Cloudflare Access。当前私有系统不为一个尚未发生的公开场景承担持续复杂度。[S7]
三个入口互相补充,
日常检索 Codex 会话;若加入 Quartz,也在这里阅读知识网页。
维护 Wiki、来源摘要、概念页和 MADR-lite 决策。
wiki/ 或精选知识目录直接处理 research、projects、服务、Git、tmux 与 Codex。
| 方案 | 服务器侧 | MacBook 侧 | 优点 | 代价 / 建议 |
|---|---|---|---|---|
| 暂不同步 | 无新增服务 | 继续用 Cursor Remote SSH 编辑 | 零配置、零冲突、立即可用 | 没有 MacBook 原生 Obsidian;作为第一周默认 |
| Obsidian Sync + Headless | ob sync --continuous 连接 remote vault | Obsidian desktop 连接同一 remote vault | 原生体验、版本历史、选择性同步、E2EE[S31] | 付费且 Headless 仍是 open beta;如果已经订阅,优先选它 |
| Syncthing | 同步 wiki/ 文件夹 | 同步到本地 Vault 目录 | 免费、点对点、无需第三方内容服务[S32] | 两端常驻并处理冲突;未订阅 Obsidian Sync 时优先 |
| Git | 提交知识目录 | pull / edit / commit / push | 来源追溯和版本审计最好 | 不是实时同步;作为 Sync / Syncthing 的补充,不作为唯一日常链路 |
$HOME/.codex/ # Codex live source
$HOME/.local/share/codex-archive/ # 版本化会话归档,不传播删除
$HOME/.local/share/agentsview/ # AgentsView SQLite / cache
$WORKSPACE/wiki/ # Obsidian / MADR-lite 知识源
$WORKSPACE/research/ # Cursor 直接访问;Quartz 按需纳入
$WORKSPACE/projects/ # Cursor 直接访问;不做 Obsidian 全量同步
$WORKSPACE/projects/codex-knowledge-hub/ # 成熟后再放 service / Quartz config
这样可以让 viewer、同步客户端与构建器各写自己的状态目录,同时保持 Codex 和工作区内容位置不变。
二者对 base URL、静态资源和实时接口的处理不同。为省去 subpath 调试,第一阶段只上线 AgentsView;Quartz 加入时再给它单独入口。
先保护数据,
为 sessions、history、state 和 memory-hook 审计建立版本化归档;同步策略不得传播源端删除。增加用户级 systemd timer,但先手工运行并恢复一条 session。把“关键词命中整文件删除”列为禁止操作,清理必须 dry-run + manifest。
安装 AgentsView binary,以用户级 service 监听 loopback;同时索引 live sessions 与归档目录。先用 SSH port forwarding 验证,再用 Tailscale Serve 提供 MacBook HTTPS。验收:能按项目和关键词找到已知会话,打开工具调用与文件变更,并对缺失会话显示 metadata-only。
Cursor Remote SSH 保持现状;只在确实需要 Obsidian 原生体验时,为 wiki/ 选择一种同步。已有 Sync 订阅则安装 Headless;否则用 Syncthing。验收:MacBook 新建一篇测试笔记,服务器收到修改,冲突与删除恢复路径都实际演练。
建立 wiki/decisions/,只迁移 3–5 条真正长期决定。每篇记录背景、决定、理由、后果和证据;memory hook 只提供候选。验收:从决策页能回到 AgentsView session、研究报告或具体文件。
只有在经常希望“不打开 Obsidian也能浏览 Wiki”时加入 Quartz。先只构建私有 wiki/;研究 Markdown 和既有 HTML 通过显式索引逐步纳入。验收:Tailscale 内可搜索、wikilinks / backlinks 正常、MacBook 多尺寸无溢出,源 Markdown 修改后能自动重建。
--delete 类镜像语义。这套架构日常资源消耗很低。
| 失败模式 | 可见症状 | 根本控制 | 验证方式 |
|---|---|---|---|
| 再次执行过宽关键词清理 | 多个历史目录在同一分钟变空,但 SQLite 列表仍存在 | 禁止按命中关键词整文件删除会话与审计材料;dry-run + manifest + 版本化归档 | 清理演练只作用于临时 fixture;确认归档不传播删除 |
| Codex 事件格式升级 | 新会话缺字段、工具调用显示为空 | 解析器按 event type 宽容读取;保存原始归档;固定 viewer 版本并先在副本升级 | 升级前后对同一 fixture 做结构与页面快照比较 |
| 复制活跃 JSONL 得到截断尾行 | 最后一行 JSON 解析失败 | append-safe 同步;解析器忽略未完成尾行并在下次重试 | 对正在写入的 fixture 做两次同步与校验 |
| SQLite 不一致快照 | 备份库无法打开或缺最近数据 | 使用 SQLite backup API / 一致性导出,不直接假设裸复制安全 | 恢复库执行 integrity check 与代表查询 |
| AgentsView 索引落后 | 磁盘已有新会话,网页搜不到 | 运行 daemon / sync;监测最后索引时间和源目录文件数 | 创建一条短会话后等待刷新并检索唯一关键词 |
| Obsidian / Syncthing 冲突 | 出现 conflict 文件、笔记回滚或删除扩散 | 同一设备只运行一种同步方式;保留版本历史;避免双端同时编辑同一篇 | 双端编辑 fixture,检查冲突处理和删除恢复 |
| Quartz 内容陈旧 | Obsidian 已修改,网页仍是旧版本 | 文件变化触发构建;页面显示构建时间;失败保留上一版 | 修改测试笔记并确认搜索索引与页面同时更新 |
| Tailscale 或 SSH 暂时不可达 | 网页与 Cursor 同时连接失败 | 保留本机 loopback;检查 tailnet 在线状态、SSH 与服务进程;MacBook Obsidian 仍可离线阅读本地副本 | 断网后阅读本地 Vault,恢复网络后确认同步续传 |
oneshot 增量会话归档;记录成功时间、文件数和字节变化,不记录会话正文,也不从归档删除源端已消失的文件。
检查 AgentsView 最后索引时间和 Tailscale 可达性;若使用 Obsidian / Syncthing,检查同步队列与冲突;若使用 Quartz,仅在知识内容变化时重建。
报告 metadata / existing / missing 三个计数、备份新鲜度和同步冲突;随机恢复一条最近会话,抽查一条 MADR-lite 证据链接。
做完整恢复演练;在归档副本上升级 AgentsView / Quartz;确认新版本不会重写 live source 或丢失旧索引。
AgentsView 的单 binary + SQLite、Tailscale、一个文件同步进程以及 Quartz 静态构建都属于轻量组件;对这台 60 GiB 内存服务器几乎没有资源压力。保持架构轻量的关键是不要提前加入数据库型 Wiki、OTel 后端、public staging 和多套反向代理。
本机的 Tailscale 与 Cursor
wiki/;需要 MacBook Obsidian 时,在 Obsidian Sync + Headless 与 Syncthing 中二选一。MADR 采用轻量 Markdown 模板。Quartz v5、claude-replay、OTel 与公网发布全部按需。
这一选择让服务器继续作为唯一事实源,同时分别获得会话网页、原生知识编辑和完整远程操控能力;没有为了尚未发生的公开或多人需求引入持续运维。
$HOME/.codex/sessions、history、state 与 memory-hook 审计建立不传播删除的版本化归档,并恢复一条 fixture。wiki/decisions/ 写 3–5 条 MADR-lite;如果确实希望在 MacBook Obsidian 中整理,再选择 Sync + Headless 或 Syncthing。最小可交付范围是:归档 timer、AgentsView、Tailscale Serve、现有 Cursor Remote SSH、wiki/decisions/ 与一套恢复/浏览器验收脚本。这个范围已经覆盖会话浏览与检索、知识整理与溯源、服务器事实源和 MacBook 操控;Quartz 与同步客户端都可以在核心闭环稳定后独立加入。
外部来源访问日期:
ro bind mount 的官方语义。state_5.sqlite 只读查询、155 条缺失 path 与 36 个父目录 mtime 交叉核验;冻结于 2026-07-11。history_mode 列的源码证据。