Files
goodbuddy/docs/features/conversation-supervision/review-scheduling-design.md
T
mesalogo db5e43d7d5 fix: complete supervisor review coverage and execution workflow
Replace truncated review input with paged, resumable batches and retain extracted facts and source references through navigation summaries. Expose concurrency, timeouts, batch budgets and response capacity in supervisor settings.

Separate automatic supervision from review results, activity and settings; use a standard plan modal and show execution stages with saved batch details. Fix historical entity identity mapping, navigation output validation and arbitrary summary length failures.

Include focused regressions, isolated real-data validation scripts and updated design and verification records. Overall layout acceptance remains outstanding; this commit does not claim that all visual issues are resolved.

Release note: 监督回顾支持完整分页、分批保存和暂停后继续,可配置并发、超时及响应容量;修复实体引用、汇总校验和长摘要报错,并重新组织自动监督与活动记录入口。
2026-09-25 22:32:43 +08:00

61 KiB
Raw Blame History

监督回顾分块调度设计

日期:2026-09-24。状态:生产分块、持久化续跑、设置及活动入口已接线;27 条消息的完整会话通过真实模型验证,较早的 129 条消息实验仍未完成。当前实现以第 0 节为准,第 1 节保留改造前基线,第 2 至 11 节保留目标设计,第 12 节为早期隔离原型证据。

本文针对全局七天 supervision:run 出现 AbortError 的反馈,设计完整分页、证据分块、模型任务调度和逐层汇总。用户已明确要求预算耗尽或失败后保留成功批次及位置,重启后可继续,不重复计算成功叶子。生产接线复用 SupervisorService、现有数据库及 review_checkpoints;不另建定时调度器。schema 47 的实现与目标差异见第 0 节。

产品范围仍由监督者产品设计定义;本设计对应 FR-S4、FR-S6、FR-S10 及 US-S12、US-S26、US-S27。既有规则见逻辑设计,实现架构见技术设计,已验证事实见实施进度。第 0 节以当前代码为准,其余目标须逐项核对实现状态;大范围回顾仍需独立性能验证。

0. 生产接线与剩余边界

Main 的手动 IPC 和心跳完成回调均使用 createProductionSupervisorService,该工厂连接 SupervisorService、SupervisionReviewStore、共享模型池及实际 ask Runtime。生产路径不再调用旧的 20 会话 × 20 消息 collector,也不使用旧服务分支的 100 条 / 48,000 字符裁剪。旧的有界服务注入方式仍供原有测试和实验脚本使用;心跳报告本身继续使用原报告预算。

已接入的调度与存储

schema 47 增加运行配置、来源清单、成功批次、导航节点四张表和一个实时来源视图。迁移只创建新结构,保留此前迁移、结果及用户数据。来源清单通过 (project_id, conversation_id, sequence, source) 稳定键分页,SQL 事务冻结范围内的来源身份、版本、长度及自动起点;清单不保存正文。项目和会话由来源页共同枚举,不另设全量 JavaScript 目录数组。正文随后按主键和有界 substr 读取。

派发按项目及项目内会话轮转,每个会话同一轮至多一个批次,会话内按 sequence/source 排序。批次跨数据库页累计;长消息未装入部分保留待处理。每片最多 8,000 UTF-16 单元、每批最多 50 片,均为封块条件,不是范围上限。位置采用零基、左闭右开的 Unicode 码点;消息 locator 保存 messageId、conversationId、projectId、role、sequence、source、revision、start、end、length。知识引用另保留原 locator 及所属消息,任务使用当前状态和区间内创建/完成时间。

成功叶子的输出、原文片段和连续 offset 在同一事务提交。失败或软预算到期保留此前批次。继续操作使用同一 run ID、时间范围和分块配置;重启后可继续。手动运行不读写自动 checkpoint。自动运行先恢复同 scope 的未完成 run;仅在全部来源连续覆盖、导航完成、最终发布事务成功时写入 stage=supervisor 的 checkpoint。空范围无需模型。

叶子输出仍使用现有事件、实体、变化和关系契约,并校验引用与候选身份。会话、项目、scope 使用二叉递归合并导航摘要,单子透传,总共 N 个叶子至多 N-1 次合并。已成功导航节点按孩子 ID 保存,发布失败后可复用。叶子、导航及最终结果的生成文本不设字段字符上限,事实数组不设独立数量上限;导航节点仍不得生成替代叶子的事件或实体。发布事务逐页读取叶子,保存既有历史/图谱结构,保持历史定位、来源及用户确认状态;完整叶子同时通过独立批次接口分页读取。

单次 Runtime 响应继续在接收过程中限制为 100,000 字节,防止响应缓冲持续增长。超过边界时停止接收,明确提示本批次未保存、已保存批次可继续使用;不裁剪后冒充成功结果。该边界与摘要字符数不同,不增加摘要长度设置。监督旧摘要读取、导航输入、保存和恢复均保留全文。身份格式、来源归属、字段类型与导航空事实数组的校验继续生效;原有数据库字段及已保存结果无需迁移。

导航使用独立的严格输出 schema,要求 summary、changeDigest、openItems;四个事实数组允许省略或为空,非空数组、错误类型和额外字段仍拒绝。验证通过后才在内部补空数组,以复用现有导航存储形状。叶子继续要求四个数组齐全,不将缺字段当作成功;来源、事件实体、变化实体和关系端点均校验。继续时还会核对已保存叶子的引用,导航不覆盖其独立事实。

supervision:pause 将父 signal 传入排队及在途模型;取消后的输出不提交。supervision:resume 恢复已保存 run;supervision:batches 默认每页 10 批、最多 20 批,返回完整叶子及来源。活动返回已保存批次、码点数、剩余来源、当前阶段、排队或执行中的模型任务数及已保存配置。软预算到期会等待已派发批次各自结束,随后显示 paused;完成判定不依赖摘要措辞。

当前阶段以 phase 写入既有 supervision_review_runs.state_json,取值为 collecting / extracting / summarizing / saving;无新表或迁移。它记录服务最后进入的阶段,失败和重启后保留;完成仍由 supervision_runs.status 的发布事务决定。活动的 navigationNodes 从已保存导航表计数,inFlight 仍来自进程内计数。旧运行没有 phase 时不回填推测值。清单和最终发布为同步事务,短阶段不保证被轮询看到,清单事务失败也不会留下部分阶段记录。批次接口只有成功记录,没有逐个失败/在途任务或项目、会话聚合状态;界面仅按分页返回的真实归属组织详情。

当前设置合同

字段 默认 整数范围 生效规则
supervisionReview.pageSize 50 1..200 每次来源元数据页条数;不改变最终集合或批次边界
supervisionReview.batchCharacters 8000 1000..16000 每批新正文 UTF-16 单元,不含提示、候选及 JSON
supervisionReview.batchMessages 20 1..50 每批不同消息数;任务等无消息 ID 的来源单独计数
supervisionReview.executionSeconds 300 30..3600 每次执行软预算,继续后重新计时;到期停止新增工作
supervisorOrganizeTimeoutSeconds 240 30..600 创建回顾时冻结,节点获槽并解析 Runtime 后计时
heartbeatReportTimeoutSeconds 240 30..600 维持报告发起时冻结及既有租约规则
supervisorModelConcurrency 1 1..4 回顾保存接纳并发;共享池上限仍随应用设置实时变化,实际执行取较小值

应用仍默认关闭。新参数由共享 Zod 合同、ApplicationSettingsStore、App 设置回调和 Renderer 表单保存;没有放置尚未生效的高级字段。

未完成与实测限制

  • 真实验证覆盖一个 27 条消息的完整会话;较早的 129 条消息实验在第二次输出 JSON 无效后停止。两实验合计 5 次付费请求,没有重复付费或回退。范围及缓存复核说明见进度。
  • 来源被修改或删除时保留旧批次并明确失败,标记需要新建回顾,活动页停止提供无效的继续按钮;下一次自动检查可创建新 run,不会永久重复该失败。尚未实现仅使受影响叶子和父节点失效后重算。清单记录冻结版本,不保存全库正文快照。
  • 分块配置、超时、接纳并发及算法版本已保存。实际默认 Runtime、模型及候选背景仍在执行时解析;未实现跨重启模型/提示词版本固定,也未实现共享池排空后切换冻结并发的目标规则。
  • 元数据清单和最终发布仍是同步 SQLite 事务,缺少大库延迟验证及可中断来源读取。批次详情已分页,既有历史图谱查询仍返回整份结果;大图谱的响应大小尚未改造。
  • 没有 token/费用预算、提供商 RPM/TPM、Retry-After 冷却、执行硬期限、独立清理期限或逐层可配置超时。默认正文预算不保证任意模型上下文容量;超长输出、非法 JSON 和引用错误会失败,保留已成功批次。
  • 片段以码点边界切分,尚未增加句界优先和重叠背景。事实保留指保留模型已产出的结构化记录,不证明语义无遗漏;生产契约校验引用 token,不要求原型的逐字引文和 reviewedTokens 回执。提供过的 locator.source 仅在本节点唯一对应一个片段时可作为引用别名;歧义及未知来源拒绝。

1. 改造前代码事实

下列旧草案行号仅作定位参考,工作区代码更新可能使其偏移;以所列函数和下方本次核对的控制清单为准。

环节 当前行为与代码依据 对调度设计的影响
手动入口 ipc.ts:7917 校验应用启用和维护状态,等待 SupervisorService.run() 返回 当前没有提前返回 runId 的开始接口,也没有监督取消接口
运行串行 supervisor-service.ts:124 用一个 pending Promise 串行执行整个服务的请求,出队后才创建运行 当前不是按项目并发;排队时间不在摘要定时器内,也尚无排队活动记录
单次摘要 supervisor-service.ts:135 最多取 100 条证据,每条最多 8,000 个 JS 字符,总正文最多 48,000,再调用一次 summarize 没有分块队列或递归汇总;48,000 不包括实体候选、系统指令、旧摘要和 JSON 开销
模型超时 ipc.ts 的监督摘要器读取 supervisorOrganizeTimeoutSeconds,默认 240 秒,超时带明确原因 abort;流结束检查 signal 和 done,finally 释放会话 新控制已实现,完整清单见下节;不能据此反推原始 AbortError
底层模型请求 model-runtime.ts:206 默认请求超时十分钟;createRequestSignal 传播上层 signal 并设置底层超时;retryModelStream 对部分网络失败重试 上层默认四分钟可以先到,当前已可配置;调度层不能再盲目叠加网络重试。注入 Runtime 的实际类型和配置仍须运行时核实
手动采集 ipc.ts:7120 传入精确时间范围;buildHeartbeatInput 在时间和范围过滤后最多取 20 个会话、每会话最后 20 条消息、100 个任务、100 条记忆 SQL 层未入选的证据在服务分块前已经遗漏,单改 summarize 无法补齐
自动采集 collectIncrementalReview 按阶段、scope、来源版本和位置过滤,再按发生时间和来源 ID 排序;最多 100 个来源,各取后续 2,000 个 Unicode 字符 已有片段定位与进度能力;查询需要扩展运行内位置,避免提交前反复读到同一片段
自动预算 ipc.ts:7115 监督新证据预算 44,000 个 JS 字符;heartbeat-service.ts:227 报告预算 12,000;reviewBackground 最多四条各 500 字符记忆,旧摘要最多 2,000 字符 自动路径与手动路径的证据集合、预算和游标语义不同
输出及身份 supervisor-service.ts:71 检查 100KB 输出与来源引用;同文件:167 校验候选身份;共享输出契约 限制每对象 20 个来源、40 个事件、40 个实体、80 个变化和 80 个关系 多个合法子输出拼接后不一定合法;汇总必须同时约束字节、数量与引用
保存 saveSupervisionResult 一个事务保存运行状态、结果、来源正文片段、图谱快照及进度,来源重新分配 UUID 可复用一次结果事务;当前 coverage_json 只有证据条数,不能表达完整覆盖
自动入口 heartbeat-service.ts:220 先处理报告,再经 ipc.ts:1914 调同一监督服务;报告 no_change 仍检查监督阶段 报告和监督是独立消费阶段,报告成功不能替监督推进游标
活动 活动契约 没有 partial、cancelled 或子任务计数;数据库活动投影 按 heartbeat run ID 合并;SupervisorActivity 仅在激活时轮询 展示新进度需要明确扩展契约,不能只添加状态文案

初稿阶段没有检查真实运行日志或用户数据库。后续只读探测记录了两次约 240 秒的失败,但没有复现该次请求或取得明确 abort 原因,尚不能确定是四分钟定时器或证据规模导致超时。诊断记录应包含运行 ID、阶段、耗时、输入规模、错误类型和 abort 原因;不记录证据正文、模型凭据或完整提示词。

当前监督输出先累积字符串、再检查 100KB;它不像心跳摘要器那样在流中检查字节数。报告和监督均将池 signal 与局部超时 signal 合并;清除本地数据会取消池内等待和在途工作,IPC 释放时 dispose 池。该生命周期取消不等于已有用户取消入口或分块 run 父级取消。以上都是静态实现差异,不是本次真实日志结论。

是否截断丢数据

手动回顾会遗漏本次分析输入:SQL 的数量限制,以及服务的 .slice(0, 100)、单条和总字符裁剪均会排除内容;任务和记忆排在会话证据之后,还会竞争余量。未入选内容没有自动续读机制。原始消息并未因此从数据库删除,但结果不能代表七天全部记录,裁剪后的来源也不能冒充完整消息。

自动回顾的未读片段仍保留待处理资格。supervisor-service.ts:174 只将完整进入摘要输入的片段 checkpoint 交给保存事务,模型或保存失败不推进。这里的“完整”指采集片段,并非整条消息。来源若在后续执行前离开滚动窗口,就不会被自动补读,因此“不会误标已处理”不等于“未来必定覆盖”。

目标是不再静默裁剪,把单次上限改成分页、分块和暂缓派发的依据,直至冻结范围内全部项目、会话、消息及其他入选来源处理完毕。模型提取仍可能遗漏原文含义,但已产出的叶子事实、事件、冲突及来源必须完整保留、可分页读取。摘要只用于导航,不能替代叶子结果;“原文已处理”也不等于模型识别了全部事实。

当前超时与调度控制清单(已实现)

以下是当前代码事实,不是后文拟议的多层调度预算。设置暴露两个阶段超时和一个监督并发数。

控制 实际值、读取时点与范围 代码依据与边界
心跳报告模型阶段 heartbeatReportTimeoutSeconds,整数 30..600 秒,默认 240;runNow / processDue 在等待池之前读取并冻结,获得槽位后才领取数据库任务 共享设置、设置存储、HeartbeatService;手动及自动均适用,排队期间修改设置不改变该次报告值;到期领取每次最多一条
监督整理模型阶段 supervisorOrganizeTimeoutSeconds,整数 30..600 秒,默认 240;出队、采集完成后,在摘要器开始时读取 IPC 摘要器;后续监督阶段可读到新值,正在执行阶段不变;不覆盖排队、采集、Runtime 解析、保存或 finally 清理
监督模型并发 supervisorModelConcurrency,整数 1..4,默认 1;报告与监督整理共用一个 Main 内 FIFO 池 SupervisionModelPool、IPC 接线;普通聊天不入池。升限可派发等待项,降限不打断在途项,等占用降到新上限以下再派发;监督服务外层 run 仍串行
报告计时与失败 获得槽位、领取、采集和 Runtime 解析完成后,在实际请求开始前续租并启动计时;timeout 原因优先于下层 abort,流结束检查 signal、done 及空输出;流中限制 100KB IPC 报告摘要器;失败不保存报告及其 checkpoint,finally 清 timer、释放会话;报告槽位覆盖领取与采集,但排队和这些步骤不消耗模型时限
监督计时与失败 摘要器读取设置后等待池,获得槽位并解析 Runtime 后启动计时;保留明确 timeout 原因及非 timeout 的提供商错误,流结束检查 signal 和 done IPC 监督摘要器、SupervisorService;排队不消耗模型时限,失败不保存结果及 checkpoint;100KB 仍在服务收齐后校验,无监督用户取消入口
直连模型传输 产品默认固定 600 秒的独立请求超时,本页两个阶段超时设置不修改它;内部 requestTimeoutMs 可由 Runtime 构造配置 model-runtime.ts 的 createRequestSignal / fetchWithTimeout;传播上层 signal,不是整次回顾预算;其他 Runtime/提供商可能更早失败
直连传输重试 最多 3 次重试,间隔 500 / 1,000 / 2,000ms,仅符合条件的网络错误且尚未有阻止重试的流事件时重试 同文件 retryModelStream;等待也受上层 signal 约束,不重新获得报告/监督阶段时限,不是用户设置或调度叶子重试
报告领取租约 max(300, reportTimeoutSeconds + 60) 秒,实际范围 300..660 秒;模型请求实际开始前按同一冻结值刷新 HeartbeatService / renewHeartbeatLease;刷新须匹配运行 ID、owner、attempt、claimed 状态且尚未过期,否则拒绝启动。300 是下限;数据库默认仍为 300 秒,租约不是取消定时器,不覆盖下游监督
阶段交接 报告保存成功或 no_change 后释放报告槽位,再进入下游监督;finally 的重复释放幂等 HeartbeatService;默认并发 1 时不会持有报告槽位等待监督取得同一个槽位
心跳失败重领 最多 3 次尝试,失败退避 60 秒、300 秒;过期租约按领取条件重领 AssistantDatabase 的 claimDueHeartbeats / failHeartbeatRun;与 HTTP 重试及未来成功批次续跑不同
后台 tick 30 秒一次,启动时也检查;heartbeatTickRunning 防重入 ipc.ts 的 runDueHeartbeats;是到期检查周期,不是阶段超时或分钟级计划设置
计划迟到 到期超过 2 小时记为 skipped 并计算下次时间 claimDueHeartbeats;这是漏跑处理窗口,不是模型超时
活动轮询 有运行中记录时读取结束 2 秒后刷新,否则 10 秒;串行,离页停止 UI 设计;只读展示,不终止任务、不触发模型
提供商限流 尚无跨聊天与监督的提供商全局并发、RPM 或 TPM 调度限制,也无监督层 Retry-After 冷却 当前池只限制监督工作;普通聊天仍可能与之竞争同一上游额度。已核对直连文本 model-runtime.ts 的 HTTP 失败分支和 retryModelStream:网络错误重试不等于按 429 或 Retry-After 退避;其他 Runtime 的内部策略需分别核实

阶段超时以各自读取设置时的值为准;并发数更新则影响池的后续派发。两个时限不包含数据采集和保存,不能相加视为整次 run 的最大耗时;清理也可能使实际返回晚于计时值。当前 FIFO 无排队超时或持久化等待记录,也没有按项目公平调度。池的生命周期取消不证明完整分块调度及所有子任务清理已实现。原始错误没有关联日志证据,仍不能确定是否来自旧四分钟定时器、传输、提供商或其他 Runtime。

2. 执行单位与范围

一次 run 对应一个冻结的 scope、时间区间和最终结果。项目、会话和消息块只是 run 内部的分组,不能各自创建故事线或把全局请求改写成多个项目 scope,否则既有实体身份将被分散。Global 在启动时分页解析并保存符合条件的项目集合及目录读取边界;后续新增项目留给下一次运行。正文按读取时版本处理,不持有跨模型调用的数据库事务,也不建立全库来源快照;成功批次仍须保存事实及其对应原文片段和定位。

手动新回顾重新读取所选区间,使用该 run 的持久化位置,不读取或写入自动 checkpoint;继续操作恢复同一逻辑 run。自动模式从 stage=supervisor 的已提交位置开始。批次输出及其恢复位置一起持久化,自动消费 checkpoint 只在最终完整结果提交时推进。两种位置分开,避免其他自动运行跳过尚未发布的事实;同 scope 有未完成自动 run 时先恢复它,不重复创建相同工作。

采集器按项目轮转、项目内按会话轮转;会话内遵循消息 sequence,同序时用消息 ID,任务和知识引用有各自的来源顺序。每轮先给各组一个块,再给仍有余量的组第二个块。分页在范围与时间过滤后执行,使用稳定排序键,不再使用“最新 20 个会话 × 最后 20 条消息”的预筛选。项目、会话目录也须分页,不能先加载全库正文再切片。页内只读元数据及即将派发的正文。

自动查询的排序与现有实现不同,需定向验证旧 checkpoint 仍能复用。项目目录、会话目录、消息页和其他来源页均保存恢复位置、稳定排序边界及来源版本;内存只缓存有界在飞批次。预算、失败或退出不删除已提交批次。续跑使用原冻结区间,不让滚动窗口移动丢掉该 run 尚未读取的尾部;来源删除或版本不符必须显式处理,不能当作已覆盖。只有目录和全部来源页耗尽、无空洞且汇总提交成功,才完成该 run。

任务按其实际项目归组;无项目任务仅在 Global 的独立组内处理。知识引用按所属消息分组,保留项目、会话、引用位置及本地或外部 locator。当前手动 collector 未输出这些完整分组字段,自动知识引用 locator 也需补所属消息元数据;这是采集接口的拟议改动。

3. 消息分块与背景

优先将一个会话中连续的短消息合成一个叶子任务;项目或会话改变就结束该块。单条长消息按段落或句界切分,找不到适当边界时按字符位置切分,后半段必须留在队列中。结构化任务、引用 JSON 保留完整字段及对象身份。超长说明按字段分段,游标仍映射到采集器原始 body 的位置;若暂未实现这种映射,则整条装入一个符合预算的块,装不下时明确失败,避免以重新序列化后的下标写入旧 checkpoint。

每个原文片段在运行内用 source + revision + start + end 标识,另保存 projectId、conversationId、messageId、角色、发生时间和原始 locator。消息来源的业务 sourceId 继续是会话 ID,不能用它代替消息身份。范围统一采用零基、左闭右开的 Unicode 码点位置,与 SQLite substr 的位置规则转换;JS 字符预算按 UTF-16 code unit 计算。中文、emoji、代理对和组合字符需有测试,不能用 JS slice 的下标直接推进 SQLite 位置。

允许加入前一片尾部或前一轮对话作为理解背景。背景注明原来源及位置,与本块的新证据分开传递;重叠区域计入模型输入预算,但不计新增字符、不推进 checkpoint、不独立产生事件。若结论只引用背景而没有本轮新证据,不把它作为新增变化输出。范围外的旧上下文也须标为背景,不能据此创建区间内事件。

已有摘要、同 scope 实体说明和已确认记忆同样属于背景。记忆是当前内容,任务状态也是当前状态,不推断历史快照。只有这些背景改变时,自动运行仍是 no_change。长消息完整分析后的累计覆盖是新证据区间的并集,不是包含重叠后的输入长度之和。

4. 设置配置清单

本节是监督者算法配置的权威清单,对应 FR-S2、FR-S4、FR-S6、FR-S10。目标是在“监督者 > 设置”开放有实际调优用途的参数,普通项常显,高级项按需展开;交互见 UI 设计。除明确标为已实现的三个字段外,均为规划,不代表已有设置合同或控件。未测参数的产品默认值与数值范围均为待定,下表只给设计校验规则;原型参数单独列出,不作为推荐默认值。

普通配置

设置 单位、默认值与状态 用途与约束
消息每页条数 条/数据库页;待实现,默认值与范围待定 正整数;只控制一次数据库 fetch 的消息数,不是总接纳消息上限、每次模型调用消息数或活动列表页大小
监督模型并发数 supervisorModelConcurrency;已实现,整数 1..4,默认 1 报告和监督共用;未来叶子、会话、项目及全局汇总也入同一池,不将项目并发与叶子并发相乘;外层 run 仍串行
心跳报告模型超时 heartbeatReportTimeoutSeconds;已实现,整数 30..600 秒,默认 240 报告模型阶段;当前读取时点及租约规则见第 1 节
监督整理模型超时 supervisorOrganizeTimeoutSeconds;已实现,整数 30..600 秒,默认 240 当前单次整理;未来作为未单独覆盖的节点超时,仍须按层测量,不声称现值适合所有节点
单次执行软预算 秒/次执行;待实现,默认值与范围待定 到期停止读页、接纳和派发;已在飞节点在各自期限及硬期限内结束,校验后保存批次,再暂停。继续同一 run 可重新获得一次执行预算

消息页必须按稳定键持续读取至冻结范围耗尽,可跨多次执行继续。增大或减小页大小只改变数据库读取批量,不改变来源资格、最终待覆盖消息集合或语义分块边界。块可跨数据库页,但不能跨本设计规定的会话/项目边界;一条消息也可拆成多个片段。页面耗尽、批次封块和执行预算耗尽是不同事件,不能用页数或单轮接纳上限代替完整覆盖判定。

高级配置

下列分组均待实现。计数、字符、token、字节和时间分别校验,不使用一个“批量大小”兼任多个含义;数值上限需通过内存与真实模型测量后写入共享合同。

分组 拟开放参数及单位 设计校验、依赖与到限行为
来源分页 项目目录每页项目数、会话目录每页会话数、任务/引用等来源每页记录数 各为正整数,与消息每页条数独立;只改变 fetch 大小,不限制范围总量。正文读取还受内存接纳预算限制,不能一次装入多条无界长消息
叶子分块 每批不同消息数、每批片段数、每批新增正文字符数(UTF-16 单元) 各为正整数;任一到限即封块,未装入内容继续排队。拆分消息按消息 ID 去重计数,片段另计;字符切分必须保留完整 Unicode 码点
上下文与重叠 相邻片段重叠字符数、旧摘要字符预算、记忆条数及单条字符预算 非负整数,重叠可为零;均计入完整输入预算,不计新增正文及覆盖。输入预算不足时优先缩减可选背景,不能通过缩减新证据后丢弃余段来满足预算
模型输入 每节点完整输入 token 上限、模型上下文容量、无 tokenizer 时的保守估算系数 输入包含系统指令、元数据、JSON、实体候选、背景与重叠。上下文容量优先读取实际模型配置,手工值不得超过已知能力;估算必须标明,不能冒充实测 token
模型输出 叶子与汇总各自的输出预留 token、输出字节预算 输入上限加输出预留不得超过模型上下文;预留还受提供商输出上限约束。用户预算不得放宽生产输出合同;超限拆小任务或显式失败,不截断 JSON、事实或引用
摘要卡 叶子/中间导航卡的目标 token、字节预算 卡片只用于导航,完整事实独立保存;须能在父节点输入预算内放入至少两个孩子及必要元数据,否则拒绝该组合
实体候选 每组候选数、候选描述字符/token 预算 数量与正文均有界,UUID 和名称保留;合法孩子身份继承规则不变,缩小候选预算不授权按同名合并
汇总结构 每次合并孩子数(扇入)、最大汇总深度 扇入至少两个,单子透传;层级必须严格收缩,触及深度限制显式失败,保留叶子。产品默认及上限待测
内存接纳 待执行块数、每轮新增字符/token、采集与在飞内容合计字节预算 约束内存和本轮接纳量,包含元数据、背景、摘要卡;到限暂缓读取/接纳并持久化成功批次。不得当作整次 run 的消息总额
来源与排队 单页来源读取超时、队列等待超时(秒) 分开计时;读取超时不能变成空页,排队超时保留恢复记录。同步 SQLite 查询须验证真实中断能力;等待不消耗模型时限
节点时限 叶子、会话汇总、项目汇总、跨项目汇总模型超时(秒,可继承监督整理值) 包含 Runtime 内部重试,各自获槽并解析 Runtime 后开始;显式覆盖需校验实际 Runtime 能力,不能自动沿用现有字段的数值范围
阶段预算 单项目处理、全局汇总与最终发布前的阶段预算(秒) 与单节点超时分开;到限停止新增工作并保存可恢复状态,缺失项目不能用空摘要补齐;发布事务保持原子性
执行硬期限与清理 本次执行硬期限、独立清理期限(秒) 硬期限不得早于软预算;到期向在飞节点传播取消,拒绝迟到提交,保留此前批次。清理单独计时和报告,不承诺实际返回时间等于硬期限
调用与用量 每次执行及逻辑 run 累计模型调用数、token 预算;费用预算仅在价格和用量可可靠换算时开放 派发前预留,完成后核算;逻辑调用与 HTTP 尝试分别计数,重试也计入用量。累计预算续跑不归零,到限暂停;费用不可计算时显示不可用,不猜价格
失败与续跑 自动续跑开关、最大自动尝试次数、重试退避起始/上限(秒) 仅失败或未提交节点可重试;成功批次复用。次数有界、退避上限不小于起始值;初版不新增节点网络重试,复用 Runtime 策略,后续根据失败证据再开放对应字段
上游额度 同额度组并发数、RPM(请求/分钟)、TPM(token/分钟)、429 冷却等待预算(秒) 额度组按实际提供商账号/连接/模型共享规则确定;生效并发取监督池与额度组限制的较小值。遵守 Retry-After,等待预算不足则暂停,不能提前重发;冷却不占模型槽或报告租约

上游额度设置必须标明实际纳入的请求路径。仅监督接线时标为“监督请求额度”,不能称为提供商全局限额;覆盖普通聊天及相关 Runtime 后才能称为应用内共享额度,其他进程或客户端的消耗仍不可控。跨连接共享同一账号额度时需归入同组,不能按连接各放一份完整额度;未知共享关系不猜测。未支持的 Runtime 不显示可保存却不生效的控件。

配置冻结与续跑

目标设计中,保存设置仅影响新建 run;创建时保存解析后的有效配置及算法/提示词/输出合同版本,整个 run(含排队、节点和跨重启继续)使用同一份配置。共享模型池不能为不同 run 各创建独立上限:不同并发配置的执行须等待当前报告及监督工作排空,再采用该执行冻结的值;恢复旧 run 同样使用其原值,不修改已保存的新设置。这是待实现的生效规则调整;第 1 节记录的当前阶段读取与并发即时影响后续派发行为保持事实描述,不提前改称已冻结整个 run。

默认“继续”沿用原配置,不能因应用设置已保存新值而重切剩余片段。性能字段(分页条数、并发、等待/执行时限、速率与退避)不改变已保存事实的有效性,但本设计仍只在新 run 使用新值,不隐式修改恢复中的配置。语义字段(消息/片段/字符分块、背景重叠、模型与提示词、候选选择、输入输出预算、汇总结构)会影响产物;需要采用新值时新建 run,不将旧叶子按新规则冒充同一版本结果。

恢复时复查来源 revision、算法/提示词/输出合同版本及依赖。来源变更使该来源叶子及依赖汇总失效,其他有效批次保留;仅汇总规则失效可保留可验证的叶子、重做受影响汇总,叶子语义或合同不兼容则相应叶子及上层都需重做。软件升级后无法按原版本继续时明确说明并提供重新回顾,禁止静默套用新版本。这里只要求最小有效配置与依赖记录,不新增通用历史版本执行引擎。

累计调用/token 预算、成功批次和恢复位置须随 run 保存;普通恢复不能重置累计额度,也不能自动删除未完成 run 的唯一输出。后续若增加显式调整预算的续跑操作,需单独定义其生效范围与记录;当前清单不将保存设置视为该操作。

固定正确性条件

以下不提供关闭开关或可降低的阈值:冻结范围内全部目录与来源页耗尽、同 revision 连续无空洞覆盖、来源及精确位置校验、叶子事实与 provenance 保留、输出结构/身份校验、取消后的迟到提交拦截,以及最终发布与自动 checkpoint 的原子提交。覆盖率不得配置成低于完整覆盖的“成功阈值”;任何预算都不能授权静默截断或将未读内容标为完成。批次持久化与恢复所需记录不是可选性能开关。

原型参数依据

静态核对 review-algorithm.mjs 和 review-deepseek.mjs:pages 默认 17 条/页,chunks 默认 8,000 UTF-16 单元/叶子且跨页累计;没有单批消息数/片段数上限、句界切分或重叠参数。extract 默认宽度 2、调用上限 Infinity,DeepSeek 入口仅接受并发 1..2,首次执行最多两次叶子调用,实验总 HTTP 上限 12(包含评估),单请求 180 秒,输出 16,384 token、200,000 字节校验上限。这些是脚本值和实验边界,未验证为产品默认或合法范围;尤其不能用原型 200,000 字节替换生产 100KB 合同,也不能采用无限调用作为产品默认。

没有可用 tokenizer 时用保守字符估算,并将计数明确标为估算值。上线前按模型、中文长文本和大量实体测量输入 token、首字延迟、总耗时、输出大小及调用数,再调整参数。证据数量大但每条很短时,也要计入元数据和引用 token 开销。

一次执行接纳量不限制整个逻辑 run 的范围。内存片段、元数据和摘要卡总量应有上界;达到上界就持久化已完成批次并暂缓派发,不能删来源。现有全局 100 条/48,000 字符裁剪须改为每节点校验及分页结果。存储不足明确暂停/失败,保留已保存内容及未完成状态,不通过删除叶子事实满足容量限制。

未来超时与清理清单(均未实现)

以下是调度设计项,不是现有设置字段或已接通的分块取消能力。没有测量依据的数值保持未定。

层次 拟议范围和到期行为 参数状态
叶子模型 单块执行含底层重试;超时停止该节点,保留其他成功批次,恢复只重试未成功部分 未定
会话汇总 有界卡片合并;失败保留所有叶子事实及引用 未定
项目汇总 单项目各合并节点及项目阶段预算;不得用失败项目的缺省摘要替代完整结果 未定
跨项目汇总 全局合并节点及最终发布预算;缺任一项目时不能标完成 未定
来源读取 项目/会话/消息分页、任务及引用读取;读取超时不是空页或无变化 未定;同步 SQLite 查询不能仅靠 JS timer 中断,实现时需验证
排队等待 区分等待与执行时间;到期移出待执行队列,保留恢复记录,不创建假完成结果 未定
批次接纳预算 块数、字符、token、内存到限后暂停接纳;成功输出及连续位置先落库 未定
单次执行与整次 run 软预算停止派发并保存进度,硬期限取消在飞调用;逻辑 run 可跨执行继续,累计调用/token 预算不重置 默认与范围待测;费用预算以可可靠换算为开放前提,不能以预算耗尽视为完成
提供商速率与冷却 按上方额度组与实际接线范围限制并发、RPM、TPM;冷却不占执行槽,不领取报告租约,预算不足时保留待恢复工作 未实现;先核实各 Runtime 已有重试与错误信息,避免重复退避;未覆盖聊天时只称监督请求额度
用户取消与进程关闭 父 signal 到全部节点,停止读页/派发/发布,保留已提交批次,忽略迟到完成 待接类型化 IPC 和状态;关闭应用开关仍按既有规则,非取消
清理期限 清 timer、监听器和 controller 注册,等待在飞调用终止,释放临时会话,核验本次拥有的远程进程已退出 独立期限未定;不得误停共享或其他运行资源,清理失败单独记录

有效节点期限不得超过本次执行剩余硬期限;软预算只停止新增派发,不立即取消已在飞调用。暂停、错误和用户取消分别记录原因;自动恢复与重试按配置有界执行,不能形成无限付费循环。上述清单的设置交互等实现后再开放,目前算法控制 UI 只显示报告/监督两个超时及共享监督并发数。

5. 队列及汇总算法

run(request):
  create or resume durable run with frozen scope, time range, runtime and effective configuration
  wait for existing supervisor run queue and compatible shared pool configuration
  load successful batches and page/source positions; read next bounded page
  if automatic, all eligible pages exhausted and no new evidence: save no_change; return
  admit bounded leaf tasks, round-robin by project and conversation
  run admitted leaves in a shared worker pool
  validate and persist each successful batch with facts, provenance and resume positions
  if budget expires, a task fails or cancellation arrives: stop; retain batches; mark incomplete
  continue paging all project/conversation/message/source groups until exhausted
  reduce within conversation, then project, then requested scope
  pass through singleton groups; reduce oversized groups in bounded rounds
  validate final output, identities, original references and coverage
  persist successful reduction nodes without replacing leaf facts
  if coverage is exhaustive and gap-free: publish result and automatic checkpoints atomically
  return completed only after publication; otherwise return resumable incomplete status

采集与叶子执行可交错,但入队和在飞任务有界,不使用对全部来源的 Promise.all。每批完成后持久化,再接纳下一批;时间不足就暂停。首次派发前用有界探测判断是否直通;穷尽范围后确实只有一个叶子时直接生成最终输出,通过校验后只调用一次模型。因预算只接纳一个叶子时仍是未完成 run。空范围及自动 no_change 必须在全部相关目录/来源页检查完毕后判定,不调用模型、不把预算未读误作无变化。

叶子有多个时输出受限摘要卡及结构化事实,Main 保存卡片 token 到原文片段的映射。会话只有一个卡片时透传,项目只有一个会话摘要时透传,全局只有一个项目摘要时透传。不得为了层级外观额外调用模型。边界必须标清项目和会话,跨项目汇总仍使用原请求 scope 的候选实体集。

每次汇总只读取符合输入预算的一组有界卡片、少量背景和所需实体候选,不重新附上所有原文、所有中间摘要或全部候选描述。若一个大组有 N 个卡片,划成至少两个孩子的组,单个余项透传;下一轮卡片数必须严格小于 N。以卡片数量作终止度量,同时限制每张输出卡大小和最大深度。输入预算连两张卡都放不下时,重新缩小叶子卡输出目标或明确失败;禁止用同一内容反复“再总结一次”形成不收敛循环。

24 个叶子使用二叉合并时至多产生 23 个合并节点;分组层级不额外生成单子节点调用。最终合并节点直接生成最终结果,不再调用独立的润色模型。小任务直通和此调用上界都应有确定性测试。上述次数按摘要器逻辑调用计,底层 HTTP 重试应单独统计。

单节点 JSON 继续遵守事件、实体、关系和引用上限,整个 run 的事实结果使用分页读取,不能把最终 40 个事件等单输出上限套在叶子事实总集上。归纳层可以合并导航条目,但必须保留被合并的叶子 ID、事实及冲突;不能以父摘要覆盖孩子。一个对象展开后超过 20 个来源时,以分页关联读取完整引用或显式拒绝该节点,不能截断。完整叶子事实及 provenance 的存储和查询合同属于本设计的必要实现项,不再作为可选后续工作。

6. 来源与实体合并

来源归属由 Main 管理。模型只返回本节点收到的引用 token;中间卡片 token 由 Main 展开为原始来源 token,校验引用属于本 run、对应版本与范围,并存在于已保存片段集合。每个成功批次持久化叶子事实、原始引用映射、版本、范围和有界原文片段,恢复时不依赖内存映射。中间摘要只作导航;父摘要未列出的事实仍能从叶子结果分页访问。覆盖依据成功片段,不以最终摘要引用数推算,不复制完整用户库。

重叠输入的同一原文区间只登记一次;不同版本或不同片段保持可区分。不同 run 的来源 UUID 继续重新分配,底层 source、revision、位置和业务 sourceId 用于追溯,不能拿结果内 UUID 当增量身份。引用去重与实体合并是两件事。

实体采用两类明确身份:已有实体用允许候选中的 persistedId,本轮新实体先用带叶子命名空间的局部 ID。多个叶子引用同一合法 persistedId 时,Main 合成一个身份并改写事件和关系端点,再汇总描述及冲突,最终输出中的 persistedId 保持唯一。父节点可继承孩子已校验的身份,Main 同时校验它属于本轮原始候选集;候选描述的筛选不应使已确认合法的孩子身份丢失。

新实体只在有界汇总中显式给出“这些局部 ID 指同一概念”的映射后合并,并校验 ID 均来自孩子输出;同名、相同裸模型 ID 或相似描述都不是自动合并规则。保留未能判断的独立实体,接受候选集有界带来的漏复用风险,不新增语义检索服务。合并后从实体到事件、变化、关系及来源的引用必须全部重写,去掉合并导致的重复关系,并校验自关系是否仍有意义。

实体候选始终来自原请求的同 scope 故事线。不得将项目分组变成跨 scope 身份复用,也不批量修复历史重复实体。保存事务再次检查候选归属和撤销状态,沿用 assistant-database.ts:8564 的保护;已确认、已修订字段及已撤销关系不被自动结果覆盖。候选在执行中被撤销时整次保存失败,游标保持原值,下一次重新读取候选。

7. 超时、取消和部分失败

一个 run 持有父 controller,节点持有独立的超时 controller;父取消传到全部在飞节点。取消后停止采集、派发和结果提交,清除定时器并释放临时 Runtime 会话。节点超时只触发本轮失败,不取消其他运行或共享 Runtime。节点采用独立 requestId/conversationId;冻结默认 Runtime 选择,不因证据来自某个项目就切换到该项目远程执行环境。

当前监督通过无 projectId 的 resolveRequestRuntime 获取默认 Runtime。此设计只改变桌面侧编排,不要求新增 Agent 调度协议。后续实现若改动共享 Runtime 的取消或释放逻辑,必须检查 gbagent 是否共用该实现,并按仓库要求验证实际受影响的远程路径,不能据桌面测试推断远端行为。

摘要器应在流式输出期间检查字节上限,并要求完成事件;超时、用户取消、关闭进程、提供商失败、非法 JSON 和引用错误保留可区分的原因。调度层初版不重试节点网络错误,复用 Runtime 已有重试;模型格式错误也不无限“修 JSON”。先用小块降低失败成本,再根据实际失败数据决定是否值得增加一次有界纠正调用。

取消需要 Main 注册与执行生命周期连接,并扩展类型化 Preload/IPC;只让 Renderer 忽略响应不构成取消。取消先于最终发布事务开始则拒绝发布,保留此前批次;仅最终完整结果已经同步提交时,取消才返回“已完成”。单个批次已提交不能使 run 完成。关闭监督应用继续遵循现有规则:停止新领取,允许已开始的运行结束,不等同于用户取消。

情况 本轮结果与进度 用户可见结果
叶子或汇总失败 保留已持久化成功批次和恢复位置,不发布完整结果、不推进自动消费 checkpoint run 失败但可恢复;仅重做失败/未提交节点,旧完整结果仍可读
用户取消或执行硬期限到达 停止在飞调用和发布,保留已提交批次 显示取消或预算暂停及可恢复范围,不标 completed;具体新状态需扩展合同
执行软预算到达 停止读页、接纳和派发,在飞节点在节点及硬期限内结束并保存成功批次 未完成时显示预算暂停,可继续;若已满足全部完成条件则可正常发布
批次或发布事务失败 该事务回滚;此前成功批次不回滚 从最后持久化位置恢复;发布失败不重算已有合法叶子
达到采集预算,已接纳任务全部成功 保存有限覆盖批次及位置,仍有未读内容 显示“未完成,可继续”,不以 completed 加提示代替真实状态
有来源读取失败或运行中被删除 初版按本轮失败处理,不将读取失败当作没有新证据 显示来源不可用的数量和范围,后续重新查询
自动无新来源 保存 no_change,无新结果或图谱事件 保留旧结果,模型调用数为零

成功批次持久化是用户已授权的续跑要求。最小记录包含 run 冻结范围、目录/页位置、来源 revision 与连续 offset、已校验叶子输出及引用、必要的汇总依赖和成功输出。输出与对应位置同事务提交,以 run 和来源区间等稳定身份防止重复保存;不持久化每次进度动画或完整提示词。崩溃前未提交的在飞批次允许重算,已提交成功批次必须复用。表结构及保留/清理实现仍待设计落地,不能声称现有 schema 46 已支持此能力。

8. 游标与覆盖提交

同一来源片段可能乱序完成。恢复位置只能是同一 revision 从已提交 offset 开始、成功持久化区间连续覆盖的最远位置,不能取最大 end 跨过空洞;空洞后的成功批次单独保留,恢复时跳过其已完成工作。背景、仅读取内容和失败片段不推进。自动消费 checkpoint 在完整发布事务中推进,现有 MAX 合并位置的调用方仍须满足连续覆盖条件。

同一来源读到不同 revision 时不拼接版本;标明该来源及依赖汇总需重新处理,保留其他未受影响的成功批次。若最后读取之后来源修改,提交的仍是确实分析过的旧 revision,下一次查询因版本不符处理新版本。已保存旧事实及片段保留版本标识,不冒充当前内容;不还原未保存的历史正文,也不引入全库快照。

建议扩展 coverage_json:是否读完冻结范围、已处理新字符和片段数、覆盖项目/会话数、是否仍有来源、停止原因及恢复引用。精确片段继续用 locator,恢复记录关联批次输出,不仅保存一个总计数。总数未知时显示“仍有未读内容”,不用动态发现数充当固定分母。结果读取合同需显式暴露 coverage;当前数据库查询了 coverage,但共享结果 schema 未返回它。

手动和自动均须跨重启继续同一未完成逻辑 run。Main 根据持久化 run ID 读取冻结范围、成功输出及位置,复查来源版本,恢复剩余页和未成功汇总;Renderer 不能自报已处理 offset。手动继续不污染自动位置;自动恢复先于创建同 scope 新 run。恢复后的单次执行重新获得执行预算,但不丢失既有进度。

持久化续跑及手动“继续”入口是本设计的验收要求,不能以建议缩小范围替代。恢复记录的保留期限、主动放弃后的清理规则和具体 schema 尚未确定;不得在 run 未完成时自动删除唯一成功输出或继续所需位置。显式放弃可以终止后续工作,但不能标为完整覆盖。

9. 心跳接线与重复调用

手动 supervision:run 和心跳完成回调继续进入同一个服务及同一运行内队列。外层按计划唤醒仍归 HeartbeatService,不能让各项目、会话和叶子再调用 heartbeat.runNow、创建计划或再次进入 supervision:run。队列等待中的自动请求到执行时重新查询 checkpoint,从而看到前一个 run 的已提交结果。

初版保留既有报告语义:每次心跳最多执行一次原报告阶段,再执行一次分块监督;报告含记忆和任务建议,不能直接用监督 summary 替代而悄悄删除这些产物。报告阶段无新证据时零次模型调用,仍允许监督补读或重试;报告已经提交而监督失败,下次报告仍按自己的 checkpoint 判定,无变化则不再付费。设置中的“立即运行”目前会主动重做报告,此行为不与自动无变化混淆。

因此本设计消除的是分块引入的重复报告调用,不声称将现有两类模型输出合为一次调用。一个叶子的自动首次运行在两阶段都有新输入时仍为“报告 1 次 + 监督 1 次”;多叶时为“报告至多 1 次 + 叶子数 + 必要汇总数”,另计底层重试。报告只读报告阶段的有界输入,不能宣称它覆盖监督处理的全部片段。

若后续决定让心跳只触发监督、报告从同一结构化结果投影,必须先定义记忆建议和任务建议的共同输出契约、各自成功语义及旧报告展示,另行修改 FR-S4 和 US-S27;本轮不把该产品调整藏在调度重构里。也不使用多阶段事务将两个结果强行绑定。

报告先获共享槽位再领取租约,并在实际模型请求开始前刷新;报告完成或无变化提交后释放槽位,再执行下游监督。领取与续租条件见当前控制清单。未来整次执行预算不能套到报告租约,也不能在报告完成前等待整棵监督树。现有 tick 防重入不替代共享池上限;监督过长会延迟到期检查,拟通过有界执行和持久化续跑控制,不另建后台调度服务。

10. 活动与结果展示

沿用现有活动设计及全局界面规范,活动仍是一条手动逻辑 run 或合并后的心跳 run。拟显示采集中、整理会话、汇总项目、生成回顾、保存中,以及已发现块数、成功块数、在飞数和新字符数。持久化成功批次提供可恢复进度,实时在飞数只存内存。发现未结束时显示“已处理 N 块,继续读取”,不用不可靠百分比。摘要、项目导航可展开分页叶子事实及完整来源。

计数在 supervision:activity 读取时与持久化运行信息合并,保持每页 50 条及串行轮询,不持久化每次计数更新。当前出队前没有 run 记录;未来排队/恢复操作需能定位逻辑 run。重启后从成功批次重建已完成计数,不恢复虚构在飞状态;待恢复记录不能被现有未完成记录处理逻辑误判为全部作废。

结束后以持久化状态为准:只有冻结范围穷尽、片段无空洞、必要汇总成功并发布结果,才能显示 completed。预算暂停或失败保留部分产物,显示“未完成,可继续”、实际覆盖和原因,不显示完成徽标。需要扩展活动/结果状态、coverage、恢复入口及中英文文案和 UI 测试;不能从摘要措辞猜状态。旧结果 coverage 缺失时显示“覆盖详情不可用”,不推断已读完。

取消按钮仅在 Main 接线可用时加入。拟增加暂停/未完成/可恢复及取消的明确状态语义,最终枚举和 schema 尚未实现;禁止用现有 completed 冒充部分成功。活动读取不调用模型,离页停止轮询,迟到响应不改写选择。旧完整结果与本次部分产物、失败原因分开展示,继续入口恢复原 run,不暗中重做全区间。

11. 验证方案与本次检查

实现时先用隔离 SQLite、生产采集与保存函数、可控摘要器和时钟验证调度规则,不修改用户数据库。以下生产端到端验收仍待执行;隔离原型已覆盖的子项及其限制见第 12 节和实施进度:

场景 必须验证的结果
全局七天、多项目、超过一页项目/会话、每会话超过 20 消息 过滤在分页前;逐页耗尽项目、会话、消息及其他来源,无静默裁剪;每个片段有来源定位
一条超长消息及中文、emoji 多片段覆盖连续、无意外缺口;Unicode 位置与 JS/token 预算分开;重叠不增加进度和事件
小任务、自动无变化 小任务只有一次监督模型调用;背景变化单独触发时零次;不调用空的会话/项目汇总层
24 叶子测试样本、多级汇总、超大候选及引用 报告及所有节点共用配置的监督池上限;每个节点满足预算;节点数严格收缩;二叉合并调用至多 23;引用展开超限显式处理,样本数不作为产品预算
某叶失败、根汇总失败、保存失败及进程重启 已提交成功批次仍可读取;恢复不重新调用成功叶子;只重做未提交/失效依赖;完整发布与自动 checkpoint 原子提交
预算结束、乱序完成及同源多个片段 批次输出及连续恢复位置原子提交;空洞后成功输出保留但不提前推进;同一冻结 run 续读尾部,绝不标 completed
叶子事实超过最终输出上限 所有已产出叶子事实和 provenance 分页可读;摘要遗漏、合并或缩短不删事实、冲突或来源
来源修改、删除及窗口滑出 版本不混用;下一次处理新版本;窗口外未读不假装已完成,也不擅自扩大范围
两叶同一 persistedId、同名新实体、关系端点变化 显式身份可复用;局部 ID 命名空间隔离;同名不自动合并;人工修订和撤销状态受保护
节点超时、run 超时、取消及迟到完成 signal 到达实际 Runtime,停止派发与提交,释放临时会话;原因可区分,其他请求不受影响
报告与叶子/汇总竞争槽位、运行中调低并发、上游 429 共用监督池且不重入占槽;排队不消耗模型时限、不提前领取报告;未来冷却遵守提供商信息且不重复叠加 Runtime 重试;普通聊天与监督共享额度的行为按实际接线验证
手动与自动先后入队、报告成功而监督失败 后续自动请求重读已提交位置;手动不改自动位置;每次心跳报告最多一次,监督重试不重复已成功且无变化的报告输入
活动及继续入口 合并活动仍关联同一逻辑 run;部分覆盖不伪装完整;重启后从持久化输出重建进度;继续失败明确原因,手动恢复不改自动位置
配置与分页 改变消息/目录页大小不改变最终入选集合和语义块;分别触发消息数、片段数、字符与 token 上限,余段仍被覆盖;跨字段无效组合不能保存
配置生效与恢复 保存和恢复默认值只影响新 run;进行中与重启恢复沿用冻结配置;语义或来源版本失效只重做相应依赖,累计额度不被续跑重置;软预算与硬期限行为分开验证

实现后的定向测试应覆盖 supervisor-service、incremental-review、supervision-activity、相关 IPC 和 Renderer 场景,并检查所有参数上界及调用计数。真实模型性能验证另行执行,使用脱敏固定长文本,限制请求次数,记录不同输入规模的耗时和 token,不以模型替身测试宣称超时已解决。涉及 Runtime 生命周期变化时追加对应真实 Runtime 路径验证。

初稿只做静态核对。后续只读用户数据探测及 DeepSeek 隔离原型的测量、复现命令、范围和限制统一记录在实施进度。这些证据不证明生产分块调度已实现;原始 AbortError 仍缺乏明确 abort 原因的日志证据。

12. 隔离原型的设计结论

scripts/review-algorithm.mjs 实现了可执行的消息分页、码点分块、逐批 SQLite 保存、按已保存片段恢复、完整覆盖判断及叶子导航校验。scripts/review-deepseek.mjs 用配置中的 DeepSeek 完成整条目标会话验证;具体计数和耗时只在实施进度维护。原型按已授权的续跑要求使用最小批次表,没有修改产品数据库。

来源覆盖、事实保留和短摘要须分别验收。覆盖以完整冻结消息集合及成功批次的区间并集判断;事实以精确来源引用和独立语义检查判断;导航必须索引全部叶子,生成前后核验叶子内容未变。真实实验中导航摘要确实省略了仍保留在叶子中的细节,因此产品查询和 UI 必须能访问叶子,不能只存最终 summary。模型的 reviewedTokens 回执仅参与结构校验,不能证明事实召回。

重复引文是已出现的定位歧义。原型保留同一已提交片段内全部精确匹配区间,标记 ambiguous 和候选数;这些位置都能重建原引文,但不冒充已确定的唯一发生位置,也不复制事实。生产接口需要携带该歧义或要求更长引文,禁止无提示地选第一次出现。来源中不存在的引文仍拒收。

成功叶子与覆盖区间一起提交,另一批校验失败不回滚已提交结果;重开时只处理缺失批次。测试脚本额外保存原始提供商响应,以便校验器修正后本地复核,不因此增加付费请求。该实验缓存不是新增的产品响应日志设计。无变化路径必须遍历所选批次并核验完整覆盖后返回零调用,不能因本轮预算耗尽就返回 no_change。

本次每叶 8,000 UTF-16 单元、并发 2、输出预留 16,384 token 只是在该模型和单会话样本上验证过的实验参数,不直接定为产品默认值。原型加载完整冻结来源,尚未满足生产有界内存采集;没有句界切分和上下文重叠,也未实现项目轮转、多层有界汇总、生产发布事务、自动 checkpoint 或继续 UI。导航关联保持空数组,跨项目身份和关系合并未作真实验证。第 11 节中的生产端到端场景仍需分别落实。