# 整仓可靠性补强与验收边界 日期:2026-09-30。基线:PR #4 的 `555c5df`。本轮在独立 PR 上工作,不修改运行中的 DSH,不合并主分支。 ## 范围 检查现有事实库与事务、每步工作投影、工具权限与子代理控制接口、插件生命周期和离线验证入口。实现集中于可复现的归属、回滚、投影和超时问题;权限守卫、子代理控制、生命周期的既有实现保持不变并运行原回归。没有新增调度器、数据库表、模型工具或权限。自审与自动测试不是独立人工或独立代理审查。 ## 事实库:父任务与附属记录同时校验归属 任务详情、事实摘要、计数、证据筛选、交接和晚到阻塞同时要求附属记录的 `run_id` 与任务一致;SQL `IS` 保留未归属域的 NULL 语义,不能把 NULL 当具体 run 的通配符。`v_run_board` 在正常迁移路径重建。历史 `v_task_board` 保持原口径,不应作为 run 隔离接口。 默认及详情看板增加 `scope_integrity`,每条仅含本 run 的 `task_id`、`mismatched_facts`、`mismatched_handoffs`。归属异常的正文、路径、操作者和异域 run 不会通过该诊断泄露。已收口任务也能报告异常,但不会自动改写历史结论。 验收出现异常时返回 `E_STORE_INTEGRITY`,即使提交了 `waiver_reason` 也不能通过;应停止自动重试,由管理员先备份、查证归属,再明确修复。没有自动删除、接管或改归属。本测试通过原始 SQL 构造损坏记录,不代表已发现用户现场数据库损坏。 ## SQLite:先清理未知连接,再保留诊断 已知 async、generator、async generator 回调在调用前拒绝,避免把惰性或异步执行误认为事务已完成。普通回调返回 thenable 仍被同步拒绝;原生 Promise 的拒绝被消费,避免额外的未处理拒绝。同步事务不能取消普通回调自行安排的异步副作用,调用者仍须遵守同步契约。 回滚失败先尝试关闭连接并撤销服务句柄,再附加错误信息。抛出 null、字符串、冻结 Error 或带异常访问器的错误,也不能阻止句柄失效;不可修改的原值保留在 cause 链。原生 busy/locked 分类和首个回滚错误仍保留。关闭操作自身失败时只能报告未知状态,不能声称底层资源已成功关闭。 ## 工作投影:精简查询,准确表达不确定性 `workingState(runId)` 是只读服务方法,一条 SQL 同时返回事实总数、四种待办状态的数量和当前任务,不展开每个任务的事实列表。投影优先使用此方法;旧服务仍可使用带 run 的 stats/board 兼容路径。 本地 Node 22.16.0、临时数据库中统计 prepare 调用次数: | 待办任务数 | 同版本 stats/board 兼容入口 | 新 workingState 入口 | |---|---:|---:| | 0 | 8 | 1 | | 10 | 18 | 1 | | 100 | 108 | 1 | 这不是模型耗时/费用测试,也不表示 SQL 扫描复杂度为 O(1)。单 SQL 保证该投影来自同一读取快照;完整看板仍可能随任务数增长。 派发失败被从未结算估计扣除,有身份的重复调用、回执和通知去重。通知按消息 ID 或事件序号辨认,不能把同一 continuable 子代理的不同通知合并。缺失身份、截断历史、续作和嵌套仍可能影响估计,因此显示为“未结算派发估计”,不是活动代理精确数量或硬额度。结算通知/派发回执与事实库事实分别标注。 旧状态没有可确认的新状态时,以中性提示使旧投影失效,不能假称所有任务都已停止。同一步的多份投影合并为一份,保留其他消息。 ## 验证入口与证据 验证进程具有明确的 60 秒执行期限;超时先发 SIGTERM,500 毫秒宽限后仍未退出则发 SIGKILL。已超时或带终止信号的结果不能因退出码为零被判定通过。此实现控制直接子进程,不承诺回收任意后代进程树。失败仍继续收集后续独立检查。 CI 两个 Node 版本分别完成检查,不因另一项失败而取消。保存实际检出的 commit/tree、tracked-tree、git archive 源码、运行时版本和离线日志,保留 7 天。测试失败时也尝试上传证据。仅归档受版本管理内容,不归档 .git、未跟踪文件或运行时凭据;已经被提交的敏感文件不会被该机制自动脱敏。PR CI 使用测试合并提交,证据记录的是实际检出版本,不冒称已经合并主分支。 新增四套回归:store-scope-integrity(11 项)、sqlite-failure-safety(10 项)、working-state(11 项)、process-runner(5 项)。验收运行完整 `npm test`,不能只运行新增测试。 真实 DSH boot、宿主配置 schema、恢复生命周期、模型决策质量与实际代理启动/续作次数仍须现场验收。离线日志中的宿主 UNVERIFIED 与真身交叉验证 SKIP 不算通过。阶段 B/C 的持久化全树预算、资源准入和自动开发仍未实现;本轮不将软规则包装成硬保证。