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: 监督回顾支持完整分页、分批保存和暂停后继续,可配置并发、超时及响应容量;修复实体引用、汇总校验和长摘要报错,并重新组织自动监督与活动记录入口。
This commit is contained in:
@@ -1,10 +1,10 @@
|
||||
# 监督者与会话监督
|
||||
|
||||
监督者统一工作回顾、会话监督与故事线图谱,以智能心跳作为定时唤醒机制。现有智能心跳页面承载监督者工作回顾入口,手动回顾、定时结果投影、来源原文、实体/关系确认、继续讨论、知识库预览提交和侧栏反馈已经接入。历史回顾定位到对应结果图谱;侧栏按会话或任务查询,并支持固定目标。同 scope 的跨 run 实体复用依赖 Main 提供的候选 UUID,具体规则和验证边界见[实施进度](./progress.md)。
|
||||
监督者统一工作回顾、会话监督与故事线图谱,以智能心跳作为定时唤醒机制。现有智能心跳页面承载监督者工作回顾入口,手动回顾、定时结果投影、来源原文、实体/关系确认、继续讨论、知识库预览提交和侧栏反馈已经接入。历史回顾定位到对应结果图谱;侧栏按会话或任务查询,并支持固定目标。同 scope 的跨 run 实体复用依赖模型显式选择 Main 提供的候选引用,Main 处理 UUID 和旧文本主键的精确映射,具体规则和验证边界见[实施进度](./progress.md)。
|
||||
|
||||
## 文档导航
|
||||
|
||||
主页面包含工作回顾、故事线图谱、活动和设置。活动读取实际手动回顾及心跳执行,合并展示同一次心跳的报告与监督回顾阶段;状态规则、历史缺失和保留期限见[活动记录](./logic-design.md#活动记录)。
|
||||
主页面包含工作回顾、故事线图谱、自动监督、活动记录和设置。工作回顾阅读统一监督结果并选择历史,图谱定位同一结果;自动监督管理计划、概览、自动监督报告、记忆与行动建议和心跳审计。活动记录展示统一执行、进度及详情,可按计划 ID 筛选;设置只保留算法参数。当前布局以 [UI 设计](./ui-design.md#应用入口)为准。活动读取实际手动回顾及心跳执行,合并展示同一次心跳的报告与监督回顾阶段;状态规则、历史缺失和保留期限见[活动记录](./logic-design.md#活动记录)。
|
||||
|
||||
自动心跳报告和监督回顾已接入按来源版本及正文位置的增量处理,无变化时跳过模型。手动历史回顾继续重新整理所选区间;进度、失败重试和删除边界见[自动增量与手动重看](./logic-design.md#自动增量与手动重看)。
|
||||
|
||||
@@ -16,7 +16,10 @@
|
||||
| [UI 设计](./ui-design.md) | 应用导航、工作回顾、侧栏反馈及页面状态 |
|
||||
| [User Stories](./user-stories.md) | 监督者与故事线图谱的用户操作和验收场景 |
|
||||
| [技术设计](./technical-design.md) | Main/Renderer 分层、数据模型、IPC、安全边界和实施顺序 |
|
||||
| [回顾分块调度设计](./review-scheduling-design.md) | 第 0 节定义生产分页、批次持久化、续跑、当前设置及剩余边界;其余章节保留改造前基线、目标设计和原型证据 |
|
||||
| [实施进度](./progress.md) | 已验证实现、验证证据和当前边界 |
|
||||
| [故事线图谱设计](../story-graph/prd.md) | 图谱对象、环绕时间轴与实体交互 |
|
||||
|
||||
生产入口已接通完整来源分页、叶子持久化、预算暂停、活动页继续及批次详情;设置可调页大小、批次正文/消息上限、软预算、两个模型超时和共享并发。实际合同及限制见[生产接线](./review-scheduling-design.md#0-生产接线与剩余边界)。真实 DeepSeek 验证已覆盖一个完整的 27 条消息会话;较早的 129 条消息实验仍未完成。两次实验共 5 次付费请求,详情见进度。原始 AbortError 原因尚未由日志确定。
|
||||
|
||||
实施状态以代码和[实施进度](./progress.md)为准。逻辑待定项见[逻辑设计](./logic-design.md),架构边界见[技术设计](./technical-design.md)。现有心跳行为见[智能心跳](../smart-heartbeat/README.md),原型范围见[Story Graph 演示](../story-graph/README.md)。
|
||||
|
||||
@@ -6,6 +6,10 @@
|
||||
|
||||
## 整体逻辑架构
|
||||
|
||||
报告、监督叶子与导航整理共用监督专用 FIFO 并发池,普通聊天不入池;监督服务外层 run 仍串行。报告在排队前冻结超时,获槽后领取,实际模型请求前校验并刷新租约;报告提交或无变化后先释放槽位,再执行监督。监督超时在 run 创建时保存,节点获槽并解析 Runtime 后计时。阶段超时、租约、传输时限、后台检查与活动轮询各自独立,取值及生效规则见[当前设置合同](./review-scheduling-design.md#当前设置合同)。
|
||||
|
||||
完整回顾的生产接线已增加分页来源清单、逐批输出/offset 事务和导航节点。预算耗尽显示 `paused`,模型或保存失败显示 `failed`;两者均保留此前成功批次,可继续同一 run。存在未读来源、覆盖空洞或未成功导航时不能标 `completed`。手动位置与自动 checkpoint 分开,自动位置只在最终发布事务推进。来源变更目前要求重新回顾,模型配置跨重启固定等差异见[生产接线与剩余边界](./review-scheduling-design.md#0-生产接线与剩余边界)。真实模型验证覆盖 27 条消息的完整会话,较大样本失败单独记录。
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
subgraph Entry["入口与触发"]
|
||||
@@ -71,7 +75,7 @@ flowchart TB
|
||||
|
||||
工作回顾、监督反馈和图谱引用同一次整理的结论与来源。展示可以裁剪为阶段摘要、会话卡片或图形,但不能分别维护相互矛盾的结论。一次整理可以没有图谱变更,也可以有整理结果但无需主动通知。
|
||||
|
||||
结果定位以结果 ID 为准。历史选择不能回退到其他项目的最新图谱;侧栏需同时匹配目标来源和范围,没有匹配结果时显示空态。固定目标失效时保留目标并显示读取错误,用户可取消固定。跨 run 仅允许引用同 scope 的 Main 候选实体,模型局部 ID 和同名均不构成身份。每次结果保留当次描述,自动更新不得改写已确认字段或其他结果;人工修改仅更新当前对象与明确选定的结果。
|
||||
结果定位以结果 ID 为准。历史选择不能回退到其他项目的最新图谱;侧栏需同时匹配目标来源和范围,没有匹配结果时显示空态。固定目标失效时保留目标并显示读取错误,用户可取消固定。跨 run 仅允许引用同 scope 的 Main 候选实体,模型局部 ID 和同名均不构成身份。模型候选引用与存储身份分离;历史文本主键按 Main 精确映射保留,格式错误的旧模型身份字段只产生新实体,不猜测合并对象。每次结果保留当次描述,自动更新不得改写已确认字段或其他结果;人工修改仅更新当前对象与明确选定的结果。
|
||||
|
||||
应用维护来源正文;监督者维护其产生的阶段总结、事件关联、实体描述与关系。图谱是这些对象的视图。图中“纠正”只更新整理内容或关系,修改来源正文仍需进入对应应用的编辑流程。
|
||||
|
||||
@@ -150,13 +154,17 @@ flowchart LR
|
||||
|
||||
当前活动没有 `cancelled` 或 `partial` 状态,也不提供取消按钮。实体和关系修改只有当前状态及结果内容,没有按时间追加的人工修改记录。
|
||||
|
||||
收集、叶子整理、导航合并和发布分别展示。阶段推进只依据服务记录,最终完成只依据结果事务;“六批已保存、剩余零来源”仍可处于合并失败或发布失败。继续保留成功叶子和导航节点,缺失阶段不得靠错误文本或来源数猜测。导航摘要允许省略事实数组,叶子缺少事实数组仍失败;导航不得生成替代叶子事实的非空数组。阶段及输出合同见[生产调度](./review-scheduling-design.md#已接入的调度与存储)。
|
||||
|
||||
### 自动增量与手动重看
|
||||
|
||||
自动心跳报告和下游监督分别记录已成功处理的来源版本及正文位置。首次自动运行只读取计划范围和回顾窗口内的来源;后续运行在同样边界内处理新增、修订或上次预算未覆盖的片段。项目列表顺序不改变自动进度;不同项目集合和 Global 分开处理。失败、未送入模型或结果事务未提交的输入保留待处理状态。
|
||||
|
||||
两个阶段都在调用模型前检查输入。没有待处理来源时记录 `no_change`,保留旧报告和图谱,不产生新结果或重复事件。心跳报告无变化仍进入受应用开关控制的下游检查,允许监督阶段重试之前的失败。已确认记忆、已有实体说明及最近摘要仅作为背景,不单独触发自动模型调用。
|
||||
|
||||
工作回顾的手动操作重新整理所选区间,沿用有界历史收集,不读取或推进自动进度。设置中的“立即运行”重新生成心跳报告,其下游监督仍按自动进度处理。删除报告或计划不重置来源进度;重看历史、删除报告和重建图谱是不同操作。当前没有清空或重建图谱功能。
|
||||
工作回顾的手动操作重新整理所选区间,沿用有界历史收集,不读取或推进自动进度。自动监督计划列表中的“立即运行”重新生成心跳报告,其下游监督仍按自动进度处理。删除报告或计划不重置来源进度;重看历史、删除报告和重建图谱是不同操作。当前没有清空或重建图谱功能。
|
||||
|
||||
计划 Modal 的新建草稿不产生持久化或执行副作用,显式保存时创建并启用;编辑沿用已有 enabled。保存失败保留草稿,提交期间禁止关闭,未保存关闭须确认。活动筛选只改变读取范围,不触发执行;同名同范围计划仍按 configId 区分,筛选在分页前应用,结果跳转继续按 resultId 定位。
|
||||
|
||||
规则冲突时,先满足所选范围与既有观察边界,再保留用户修订和来源事实,最后应用自动归纳和展示策略。新增证据与已确认结论冲突时显示待核对差异,不能自动断言旧观点失效。
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
## 1. 背景
|
||||
|
||||
本 PRD 继续定义会话监督能力。统一应用“监督者”已整合智能心跳入口、工作回顾、故事线图谱、活动与设置;实际能力及执行记录要求见[监督者应用产品设计](./supervisor-prd.md)。本文其余执行观察与介入目标仍按各节范围实施。
|
||||
本 PRD 继续定义会话监督能力。统一应用“监督者”提供工作回顾、故事线图谱、自动监督、活动记录与设置五个页签;实际能力及执行记录要求见[监督者应用产品设计](./supervisor-prd.md)。本文其余执行观察与介入目标仍按各节范围实施。
|
||||
|
||||
GoodBuddy 的魔法笔记已经提供一种有价值的交互:用户持续写作,AI 在右侧以长评、建议和
|
||||
警告进行评论,用户可以选择综合、扩展、润色、质疑或发散方向。该能力是内容分析,不是
|
||||
|
||||
@@ -1,14 +1,303 @@
|
||||
# 监督者实施进度
|
||||
|
||||
日期:2026-09-23。
|
||||
日期:2026-09-24。
|
||||
|
||||
当前记录以已验证生产行为为准。监督者尚未覆盖全部 user stories。
|
||||
|
||||
## 已验证
|
||||
|
||||
### 2026-09-24 长摘要与内容区对齐
|
||||
|
||||
针对全局七天回顾的 `summary max 2000` 报错,代码确认导航输出 schema 的 `max(2000)`、服务层对叶子及导航的二次 2000 字符检查,以及模型提示词中的同值要求。另发现监督旧摘要通过 SQL `substr` 和 JavaScript `slice` 截断。以上监督路径限制已移除;生成内容和事实集合的合同见[生产调度合同](./review-scheduling-design.md#已接入的调度与存储)。未读取本次 16:03 失败的原始模型响应,不能据此声明该运行的具体失败节点。
|
||||
|
||||
生产工厂回归使用隔离 SQLite 和离线 Runtime 流,验证 14,000 字符的叶子及导航摘要完整进入合并输入、存储、历史读取,发布失败后以已保存节点恢复且不再请求模型,叶子长描述仍进入最终图谱。单次超过 100,000 字节的响应明确失败,保留续跑位置。共享契约另覆盖原字段及数组数量边界,仍拒绝导航事实和叶子缺字段;旧身份兼容、跨范围拒绝和六叶合并恢复测试继续通过。IPC 暂停/继续测试改用 3,600 字符摘要,并修正已有 `persistedId` 提示词断言为当前 `candidateRef` 合同。
|
||||
|
||||
布局采用共享阅读、dashboard 宽度,范围、工具栏、历史和结果的对齐规则见[UI 设计](./ui-design.md#应用入口)。真实 Electron 加载生产 React 组件,使用隔离 fixture 验证 2000、1440、1024、390px 的浅深主题,覆盖长摘要、活动、运行中、失败共 32 组,并保存 8 张正文末尾截图。无页面横向溢出,正文末尾保留,宽屏阶段行低于 40px,刷新紧邻筛选。另运行既有活动分支,验证原生键盘展开、完整错误滚动、六个叶子及 12 批分页。已人工查看宽窄屏、浅深主题、运行/失败、正文末尾及批次树截图。
|
||||
|
||||
截图分别保存在本机临时目录 `opencode/supervision-content-layout` 与 `opencode/supervision-content-activity`。复现命令为设置 `GOODBUDDY_SUPERVISOR_CONTENT_LAYOUT=1` 或 `GOODBUDDY_SUPERVISOR_ACTIVITY=1` 后运行 `npx vitest run tests/supervisor-layout.electron.test.ts`,可用 `GOODBUDDY_SUPERVISOR_ARTIFACTS` 指定保留目录。模型调用 0 次,未改写用户数据库、运行全量测试或提交。
|
||||
|
||||
验证记录:首轮服务、分块、历史和工作区 6 文件 68 项通过;补充共享契约、生产工厂、活动存储/preload、心跳中心及工作区共 8 文件 112 项通过。`npx vitest run src/main/ipc.test.ts -t 'supervis'` 为 17 项通过;修正测试等待的 TypeScript 类型后,暂停/继续单项再次通过。最终 `npm run typecheck`、本轮修改 TS/TSX/MJS 的定向 ESLint 和 `git diff --check` 通过。中文变更按 `deai-writing` 清单人工审校。
|
||||
|
||||
### 2026-09-24 活动阶段、批次层级与导航输出修复
|
||||
|
||||
对应 FR-S4、FR-S6、FR-S10、US-S26。活动记录改为紧凑运行摘要、实际阶段、恢复操作、折叠错误、按需批次层级和次要配置详情。阶段存入既有运行 JSON;叶子与导航分别校验,叶子缺数组仍失败。当前字段与缺失数据规则见[生产调度合同](./review-scheduling-design.md#已接入的调度与存储),布局见[活动设计](./ui-design.md#活动)。
|
||||
|
||||
只读检查 portable 原库的最新失败运行 `f6800335-5765-4163-9f55-a30c8ab18a94`,确认 32 个来源、剩余 0、6 个成功批次、4,515 字符和 1 个已保存导航节点。错误仅包含 `events / entities / entityChanges / relations` 四个缺失数组。旧代码把导航响应交给叶子 schema,且提示词同时要求“只返回摘要字段”和“事实数组必须为空”,合同矛盾已确认。原始失败响应和阶段没有保存,因此该次失败发生在导航解析仍属有数据支持的推断,不能声称取回了原响应。
|
||||
|
||||
使用 SQLite 一致性备份和关联笔记副本执行 `scripts/supervision-navigation-replay.ts`。仅私有副本初始化;第一次因缺少关联笔记停止,补齐后完成。生产工厂继续同一 run,复用已存导航节点,4 次离线响应完成剩余合并及发布,6 个叶子逐项未变。回放文本来自该 run 已保存的成功导航,只保留 summary、changeDigest、openItems,以验证缺数组的合法导航形状;它不验证新摘要质量,也不是原失败响应回放。原库只读,原失败 run 前后相同,付费模型调用 0 次。
|
||||
|
||||
本轮验证:
|
||||
|
||||
- `npx vitest run src/main/assistant/supervision-production.test.ts src/main/assistant/supervision-review.test.ts src/main/assistant/supervisor-service.test.ts src/main/assistant/supervision-activity.test.ts src/preload/supervision-activity.test.ts src/renderer/src/SupervisorActivity.test.tsx src/renderer/src/HeartbeatCenter.test.tsx src/renderer/src/SupervisorWorkspace.test.tsx`:8 文件、116 项通过。包含六叶零剩余后的合并失败与继续、发布失败后无模型继续、缺数组叶子拒绝、未知来源/实体拒绝、实际阶段呈现、旧阶段缺失、错误与配置折叠、树分页及读取失败重试。
|
||||
- `npm run typecheck` 和本轮变更 TS、TSX、MJS 文件的定向 ESLint 通过;未运行全量测试。
|
||||
- `GOODBUDDY_SUPERVISOR_ACTIVITY=1` 下运行 `npx vitest run tests/supervisor-layout.electron.test.ts`:1 项通过。真实 Electron 加载生产 React 组件,以多项目、多会话的隔离数据覆盖 1440×1000、390×1000 和浅深主题,分别截取运行摘要、错误展开、批次树,共 12 张截图。检查原生 Enter 展开、240px 错误滚动、全部六个已保存叶子及 12 批跨页读取,无横向溢出和控制台错误。失败运行摘要高度为桌面 366px、窄屏 476px,两主题一致;已人工查看截图。
|
||||
|
||||
私有数据库、回放报告及截图位于 `C:/Users/jiang/AppData/Local/Temp/opencode/activity-incident-20260924/`,截图测量文件为 `screenshots/review-activity-measurements.json`。收尾检查修正成功返回 coverage 沿用合并前阶段的问题,3 个生产服务测试文件共 33 项复验通过,活动与返回结果均使用发布阶段投影。`git diff --check` 通过,仅提示现存行尾转换。中文文档经 deai-writing 扫描与人工复核,本轮新增段落无阻断项;全文件扫描的 7 项阻断均在既有非本轮段落,未改动其内容。
|
||||
|
||||
历史缺失 phase 仍显示未记录;树只列成功批次,没有持久化的单任务失败/在途状态,项目和会话数量仅针对本页。收集与发布仍为同步 SQLite 阶段,不保证轮询可见。未修改 Agent、远程 Runtime、传输或凭据逻辑;原暂存及未暂存修改保留,未暂存、提交或替换 portable 构建。
|
||||
|
||||
### 2026-09-24 工作回顾与自动报告分区
|
||||
|
||||
对应 FR-S2、US-S22 至 US-S24。工作回顾仅阅读统一监督结果,历史选择和精确结果图谱入口移到正文前;手动新回顾控件保持内联,390px 下使用双列。结果常显生成时间、覆盖区间和范围,正文按原始段落及已有结构化字段展示,限制阅读宽度。新请求配置与运行状态不改写旧结果。自动报告、记忆与行动建议全部归入自动监督,保留展开、确认/忽略、带入对话、标记完成和每次追加 20 条;移除独立最近报告副本。五页签当前布局以 [UI 设计](./ui-design.md#应用入口)为准,下方各轮记录保留为历史证据。
|
||||
|
||||
- `npx vitest run src/renderer/src/HeartbeatCenter.test.tsx src/renderer/src/SupervisorWorkspace.test.tsx src/renderer/src/SupervisorActivity.test.tsx`:66 项通过。覆盖非空结果与空自动报告不矛盾、完整建议操作、长内容展开与分页保留、历史精确 ID、变更新请求范围不重标旧结果、运行中保留正文和活动入口。
|
||||
- `npx vitest run src/renderer/src/App.test.tsx -t 'graph navigation opens the pinned sidebar result|keeps heartbeat plans independent|saves Supervisor timeouts'`:3 项通过,284 项按名称跳过。校正已有设置保存测试的旧字段选择器,保留实际 App 接线验证。
|
||||
- `npm run typecheck` 与本轮修改的 Renderer、测试及 Electron driver 定向 ESLint 通过。中文 UI 文档经 deai-writing 扫描,无阻断项;复核项涉及既有状态与实现边界,保留事实限定。
|
||||
- 设置 `GOODBUDDY_SUPERVISOR_RECAP=1` 后运行 `npx vitest run tests/supervisor-layout.electron.test.ts`:1 项通过。现有生产组件 fixture 覆盖 1440×1100、390×1100 的工作回顾与自动监督,含两类结果均非空、自动报告为空、两者均空,共 12 个页面场景;另验证历史结果运行中保持可见及活动跳转。每页一处刷新、横向溢出及正文宽度断言通过。
|
||||
|
||||
截图与 `recap-measurements.json` 保存在 `C:/Users/jiang/AppData/Local/Temp/opencode/supervisor-recap/`。已人工查看桌面与窄屏正文、运行中的历史结果、自动报告展开、建议操作和独立空态截图。此次验证使用隔离 fixture,未读取用户数据库,模型调用 0 次,未运行全量测试;未修改 Main、Preload、数据库、Agent 或远程 Runtime。保留已有暂存和未暂存修改,未暂存或提交。
|
||||
|
||||
### 2026-09-24 自动监督概览归属修正
|
||||
|
||||
对应 FR-S2、US-S22 至 US-S24。当前状态、范围与刷新、成功率、记忆、洞察、行动指标、报告趋势和心跳运行审计已整体移到“自动监督”,与计划列表同页。当前状态下只保留计划列表的创建按钮和未配置说明,点击直接打开原 Modal。活动页只显示统一监督活动、进度、详情及结果入口,计划 ID 筛选、清除、分页和精确结果跳转沿用原路径;活动筛选不改变自动监督概览。当前归属见 [UI 设计](./ui-design.md#应用入口),下方旧方案的截图与测试记录保留为历史证据。
|
||||
|
||||
- `npx vitest run src/renderer/src/HeartbeatCenter.test.tsx src/renderer/src/SupervisorActivity.test.tsx`:48 项通过。覆盖空/非空时整块归属、唯一创建入口、独立刷新回调、原 Modal 的 X/footer/关闭保护、计划操作、审计分页、同名计划筛选和结果跳转。
|
||||
- `npx vitest run src/renderer/src/App.test.tsx -t 'keeps heartbeat plans independent of the active project'`:1 项通过,286 项按名称跳过,保留实际 App 的跨项目计划列表与暂停计划 Modal 保存验证。
|
||||
- `npm run typecheck`、本轮修改的 `HeartbeatCenter.tsx`、`HeartbeatCenter.test.tsx`、`supervisor-layout-driver.mjs` 定向 ESLint 通过;`git diff --check` 无空白错误,仅提示现存行尾转换。
|
||||
- 设置 `GOODBUDDY_SUPERVISOR_AUTOMATIC_OVERVIEW=1` 和产物目录后运行 `npx vitest run tests/supervisor-layout.electron.test.ts`:1 项通过,约 10 秒,仅运行本轮范围。现有生产组件 fixture 覆盖浅色 1440×1100、390×1100,空/非空计划与自动监督/活动共 8 个页面场景;检查整块归属、唯一创建按钮、横向溢出、原 Modal 打开关闭及精确计划活动筛选。
|
||||
|
||||
截图和 `automatic-overview-measurements.json` 位于 `C:/Users/jiang/AppData/Local/Temp/opencode/supervisor-automatic-overview-20260924/`。已查看桌面、窄屏空/非空计划、活动及滚动后的趋势和运行审计截图;桌面指标四列、窄屏单列,内容无横向裁切,活动页无重复心跳列表。本轮中文修改按 deai-writing 清单人工审校。未运行全量测试,模型调用 0 次,未读取用户数据库;未修改 Agent/远程 Runtime、Modal 实现或共享样式,保留已有暂存和未暂存修改,未暂存或提交。
|
||||
|
||||
### 2026-09-24 真实失败运行身份修复
|
||||
|
||||
只读定位到 `dist/GoodBuddy-windows-x64/data/assistant.sqlite` 中的运行 `db9902ab-22c8-4aae-86ae-7850bfc07b76`。Roaming 库不含该运行。原运行是全局手动回顾,范围为 2026-09-17 14:33:02 至 09-24 14:33:02,开始于 14:33:02,失败于 14:44:52(本机 UTC+8)。保存配置为分页 50、批次文本量 8000、消息数 20、执行预算 300 秒、模型超时 240 秒、并发 1;清单 32 个来源,成功批次 0。
|
||||
|
||||
原错误指向 `entities[0].persistedId` 的 UUID 校验。原始模型响应未保存,诊断文件没有该次响应,无法确认原错误值及 710 秒耗时的模型、排队、重试分解。只读候选检查发现 15 个旧实体均使用文本主键;隔离真实调用再次证明,即使模型选择提供的候选,旧主键仍会触发严格 UUID 校验。修复采用候选短引用、Main UUID 别名及旧键精确映射,详细规则见[技术设计](./technical-design.md)。
|
||||
|
||||
通过 SQLite 一致性备份复制数据库和关联笔记文件,仅隔离副本运行初始化及生产工厂 `createProductionSupervisorService`、`ModelAgentRuntime`、批次事务和结果保存。首次隔离启动因缺少笔记文件停止,付费调用 0 次;补齐副本后开始模型验证。使用 `.env.deepseek.local` 的 `deepseek-flash`,总计 3 次 HTTP 请求,无自动付费重试或模型回退:
|
||||
|
||||
| 验证 | 本机开始时间 | HTTP | 响应耗时 | 结果 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 原运行首叶提取 | 14:53:57 | 200 | 5.994 秒 | 首次暴露旧键校验失败,响应私存;修复后缓存复验并保存 |
|
||||
| 真实来源有界回顾 | 14:58:25 | 200 | 4.445 秒 | 2 个来源、402 字符、1 批,完成并发布 2 个实体 |
|
||||
| 同一来源候选复用 | 14:58:30 | 200 | 4.703 秒 | 完成并复用 2 个既有实体 |
|
||||
|
||||
缓存复验要求请求除 Runtime 当前时间外一致,没有新 HTTP。隔离副本中原失败 run 保存 1 批、3 个精确匹配的原文片段、490 字符及 3 个完整来源位置后主动暂停;32 个来源还剩 29 个,不冒充原全局回顾已完成。两个有界回顾分别完成结果发布,实体总数保持 15。手动回顾不写自动检查用的 `review_checkpoints`。只读复核原 run、来源清单及批次逐项未变;副本完整性检查通过,原有 1 个受保护实体保持不变。
|
||||
|
||||
私有产物在 `C:/Users/jiang/AppData/Local/Temp/opencode/supervision-incident-real-20260924/`:`incident.private.json`、`candidates.private.json`、3 份请求与 SSE 响应、`live-metrics.json`、`audit.json` 和副本 `assistant.sqlite`。原库只读打开,无初始化、迁移或业务写入;原失败状态及原有数据保留。验证脚本为 `scripts/supervision-incident-{inspect,launch,audit}.cjs` 与 `scripts/supervision-incident-live.ts`,重复付费启动受检查限制。
|
||||
|
||||
定向 7 文件共 47 项测试、`npm run typecheck`、本轮改动文件 ESLint 和 `git diff --check` 通过,后者仅提示现存行尾转换。回归包含真实旧键形状、严格 UUID 别名、空值和占位符的新事实保留、未知候选/跨 scope 拒绝、确认字段及图谱端点保护、失败后成功叶子不重算,以及中英文可展开错误详情。活动页显示本地化失败原因,技术错误保留在可选择文本的折叠详情;进度与设置不再直接展示 UTF-16、Unicode 或共享池术语。新增中文文档按 deai-writing 清单人工复核。未运行全量测试,没有提交、暂存或构建替换应用。此修复属于桌面监督身份边界,未修改 Agent 或远程 Runtime 执行实现;正在运行的 portable 和 D 盘安装版均需包含新源码的构建并重启后才会生效。
|
||||
|
||||
### 2026-09-24 计划 Modal 标题与操作区统一
|
||||
|
||||
对应 FR-S2、US-S22 至 US-S24。`HeartbeatSettings` 复用既有 `custom-task-dialog__header/content/actions` 和按钮样式,标题在左、带本地化可访问名称及工具提示的 X 在右,取消与保存位于右对齐 footer。采用共享 Grid 的固定标题、滚动正文、固定操作区,没有新增 Modal 框架或页面专属 CSS。共享规范见根目录 [表单 Modal](../../../UI-DESIGN.md#615-表单-modal),计划交互见[自动监督设置](./ui-design.md#自动监督设置)。
|
||||
|
||||
本轮验证:
|
||||
|
||||
- `npx vitest run src/renderer/src/HeartbeatCenter.test.tsx src/renderer/src/CustomTaskDialog.test.tsx`:50 项通过。覆盖中英文创建/编辑结构、X/取消/Escape/遮罩的干净关闭与未保存确认、Tab 循环、焦点恢复、提交锁定、失败草稿及暂停计划保存重试。
|
||||
- `npx vitest run src/renderer/src/App.test.tsx -t 'keeps heartbeat plans independent of the active project'`:1 项通过,286 项按名称跳过;验证实际 App 的暂停计划编辑提交、Portal 和背景隔离恢复。
|
||||
- `npm run typecheck` 通过;本轮修改的 Renderer、翻译和 Electron driver 文件定向 ESLint 通过;`git diff --check` 无空白错误。
|
||||
- `GOODBUDDY_SUPERVISOR_PLAN_MODAL=1`、`GOODBUDDY_SUPERVISOR_ARTIFACTS=C:/Users/jiang/AppData/Local/Temp/opencode/supervisor-plan-modal-standard` 下运行 `npx vitest run tests/supervisor-layout.electron.test.ts`:1 项通过,约 13 秒。创建/编辑 × 浅/深色 × 1440×1100、390×1100、390×480 共 12 个截图场景,测量无横向溢出、标题与底部按钮不随正文滚动,关闭及底部操作可命中;原生 Shift+Tab、Enter、Escape 验证焦点循环、取消确认和返回编辑。首次两次运行暴露测试驱动的 Enter 字符事件缺失及窗口焦点不稳定,补充字符事件和输入前显式聚焦后通过。
|
||||
|
||||
截图与 `plan-modal-measurements.json` 保存在上述产物目录。已查看宽窗口、390px 单列及短窗口的浅深主题创建/编辑截图,X 保持右上、取消与保存保持右下,短窗口只滚动正文。fixture 使用现有五页签和生产 React 组件,未读取用户数据库;模型调用 0 次。未运行全量测试,保留原暂存区与工作区改动,未提交或推送。
|
||||
|
||||
### 2026-09-24 监督者文案整理
|
||||
|
||||
设置帮助删除“提供商 RPM、TPM、Retry-After 控制及费用预算尚未实现”,保留执行软预算到期后保存正在处理的批次、暂停和从活动记录继续的说明。活动说明删除人工修改审计缺失提示;计划帮助改为选择每日或每周时间、保存并启用后运行。图谱说明实体状态以所选回顾结果为准,事实详情提示展开批次并对照来源核对模型内容。中英文同步,不承诺全局限流或完整语义识别。
|
||||
|
||||
已检查监督者设置、帮助、空态、错误展示及相关测试。真实运行错误、失败、超时、暂停和来源失效仍按原路径显示,保留恢复操作。根目录 UI-DESIGN 的既有监督者章节记录文案原则,UI 设计和用户故事同步;内部技术设计与验证记录仍保留事实边界。
|
||||
|
||||
本轮验证:
|
||||
|
||||
- `npx vitest run src/renderer/src/SupervisionReviewSettings.test.tsx src/renderer/src/SupervisorActivity.test.tsx src/renderer/src/HeartbeatCenter.test.tsx src/renderer/src/SupervisorWorkspace.test.tsx`:4 文件、57 项通过。新增中英文用例覆盖帮助文案、监督并发范围、来源核对提示,以及真实 HTTP 429 / Retry-After 错误、失败状态和继续入口的保留。
|
||||
- `npx eslint src/renderer/src/SupervisionReviewSettings.tsx src/renderer/src/SupervisionReviewSettings.test.tsx src/renderer/src/SupervisorActivity.test.tsx src/renderer/src/i18n/locales/zh-CN/heartbeat.ts src/renderer/src/i18n/locales/en-US/heartbeat.ts`:通过。`git diff --check` 通过,仅有现存行尾转换提示。
|
||||
- 中文 UI 文档扫描无阻断项,9 项复核提示均涉及实际行为边界,按事实保留;新增规则和技术记录另经人工审校。未运行全量测试、类型检查、Electron 或真实模型调用,本轮模型调用 0 次。
|
||||
|
||||
本轮仅修改监督者 Renderer、i18n、相关测试和文档;Main、Shared 只读核对。保留已有暂存及未暂存修改,未暂存、提交或推送。
|
||||
|
||||
### 2026-09-24 persistedId 并行修复记录
|
||||
|
||||
此段记录被上文真实旧库修复替代的早期方案。当时静态核对并行 Main 改动:新实体示例省略 `persistedId`,空字符串和 `null` 视为省略,其他格式错误值仍拒绝。该方案未处理真实候选中的旧文本主键,不能证明用户故障已解决。当前合同见[技术设计](./technical-design.md)。原始失败响应的具体坏值仍未知。
|
||||
|
||||
用户提供的并行验证结果为 29 项定向测试及另 1 项 IPC 测试通过;两次真实 DeepSeek 请求分别验证创建和复用,实体数保持 2,实体 ID 稳定。本轮仅记录并静态核对修复,没有复跑这些测试或模型请求;此证据不证明全部事实的语义识别,也不替代此前完整会话实验的范围与计数。
|
||||
|
||||
### 2026-09-24 五页签与计划 Modal 修正
|
||||
|
||||
对应 FR-S2、US-S22 至 US-S24。当前导航为工作回顾、故事线图谱、自动监督、活动记录、设置。计划列表移入自动监督,原有表单移入共享 Modal;设置只保留算法参数。保存失败保留草稿,未保存关闭确认,暂停计划编辑后仍暂停;计划执行记录按 configId 进入活动筛选,数据库在分页前过滤。报告、建议、概览、审计及精确结果跳转按[当前 UI 设计](./ui-design.md#应用入口)归属。
|
||||
|
||||
- 六文件定向组最终 61 项通过:HeartbeatCenter、SupervisorWorkspace、SupervisorActivity、SupervisionReviewSettings、Main supervision-activity、Preload supervision-activity。包含计划创建/编辑、失败重试、放弃确认、焦点循环与恢复、同名计划筛选、报告/审计分页,以及真实 SQLite 分页前过滤。新增换计划重置分页和忽略旧响应回归,筛选与清除保留键盘焦点。
|
||||
- App 筛选 3 项通过:跨项目计划列表与暂停计划 Modal 保存、设置保存后重开、精确结果跳转。IPC 筛选 2 项通过,验证活动 configId 经真实 handler/SQLite 过滤并拒绝空 ID;其余 App/IPC 测试未运行。
|
||||
- 最终 `npm run typecheck`、`npm run lint` 和 `git diff --check` 通过;按要求未运行全量测试。中文 UI 文档审校无阻断项,复核提示涉及执行限制和未实现边界,按事实保留。
|
||||
- Electron 生产组件 fixture 测试 1 项通过,约 66 秒,覆盖 1440/1024/390px、浅深主题、五页签归属、Modal 焦点与放弃、390×720 短窗口保存按钮命中、计划活动过滤和原生方向键。首次运行被终端 60 秒上限中断,延长后通过。
|
||||
|
||||
截图位于 `C:/Users/jiang/AppData/Local/Temp/opencode/supervisor-five-tabs/`,包括 `menu-plans-light-390.png`、`plan-modal-dark-390-short.png`、各页签浅深主题截图及 `measurements.json`。人工检查计划、Modal 和设置截图,无横向裁切;短窗口长表单内部滚动。fixture 复用实际生产组件与已有模拟数据,未读取用户数据库,未调用模型。此次不修改 Agent/远程 Runtime,无需远程执行验证。
|
||||
|
||||
开始检查时 HEAD 为 `7adae97`,监督改动仍在暂存区与工作区,未发现上轮计划提交;本轮保留其他 dirty 修改,未提交、amend 或推送。
|
||||
|
||||
### 2026-09-24 菜单归属调整
|
||||
|
||||
此段记录上轮四页签方案,已由上文五页签修正替代。当时设置包含自动监督计划、模型超时与并发、回顾算法三个纵向区块;报告与建议迁入工作回顾,运行概览和心跳审计迁入活动记录。以下保留当时验证证据,当前交互以[应用入口](./ui-design.md#应用入口)为准。
|
||||
|
||||
本轮验证:
|
||||
|
||||
- `npx vitest run src/renderer/src/HeartbeatCenter.test.tsx src/renderer/src/SupervisorWorkspace.test.tsx src/renderer/src/SupervisorActivity.test.tsx src/renderer/src/SupervisionReviewSettings.test.tsx`:50 项通过,覆盖双语菜单归属、设置无嵌套导航、计划操作、建议确认/忽略、报告及审计分页、页签切换保留展开状态、快捷按钮焦点、图谱来源与持久进度。
|
||||
- App 按测试名称筛选运行 4 项并通过:页面读取失败重试、侧栏结果跳转与 keepalive、计划独立于当前项目、模型及回顾参数保存后重开。其余 App 测试未运行。
|
||||
- `npm run typecheck`、本轮修改的 TS/TSX/MJS 文件 ESLint、`git diff --check` 通过;未运行全量测试。
|
||||
- `npx vitest run tests/supervisor-layout.electron.test.ts`:最终 1 项通过,约 51 秒。保留原图谱、异常状态、设置及活动的 1440/1024/390px 验证,新增非空菜单在 1440/390px 浅深主题的 12 个页面场景、区块归属、报告全宽、设置无范围徽标/刷新行和原生方向键导航检查。人工查看截图后修正了报告遗留双栏宽度,并补全 fixture 下次运行时间。一次复验受终端 60 秒限制中断,延长执行上限后通过。
|
||||
|
||||
截图及测量保存在 `C:/Users/jiang/AppData/Local/Temp/opencode/supervisor-menu-20260924/`,菜单截图以 `menu-` 开头,`measurements.json` 包含布局结果。Electron 使用生产 React 组件和隔离 fixture,未读取用户库、调用模型或验证真实模型产出。本轮模型调用 0 次,无提交或推送。
|
||||
|
||||
### 2026-09-24 完整会话生产验证与收尾
|
||||
|
||||
生产链路已通过一个独立完整会话的真实模型测试;较早的 129 条消息实验仍为未完成,不能据本次成功改写其状态。按用户要求,没有重发此前的两个请求,也没有重新计算其已保存批次。
|
||||
|
||||
只读选择器 `scripts/supervision-select-readonly.cjs` 在 `readOnly`、`query_only` 和读取事务下选择另一条完整会话,筛选条件为 21..40 条 user/assistant 消息、8,001..14,000 码点,并排除旧目标 ID。命中会话共 27 条消息、9,677 码点;选取的是整条会话,没有截取其头尾。仅该会话进入外部临时快照及隔离产品库,原用户库未初始化、迁移或写入。
|
||||
|
||||
首次请求输出有效 JSON,提供商以 `stop` 结束,但使用输入的 `locator.source` 作为引用,未使用带范围的 fragment ID。生产校验因此拒收。修正为:引用若是本节点提供的 source token,且只匹配一个输入片段,就映射到该片段 ID;同源多片歧义或未知来源仍拒绝。映射不扩展引用范围,不把片段升级为整条消息。针对唯一映射、歧义拒绝补了确定性测试。
|
||||
|
||||
原始 SSE 已保存在外部临时目录。继续测试时通过同一生产工厂、`SupervisorService` 和 `ModelAgentRuntime` 重放该响应,校验相同来源快照、运行配置及请求字节数;这是一次本地响应复核,没有新增付费请求。之后只为未调用的第二叶子和导航节点请求 DeepSeek。最终与每条原消息逐字比较,并检查码点区间连续性。
|
||||
|
||||
| 实测项 | 结果 |
|
||||
| --- | --- |
|
||||
| 完整覆盖 | 27 / 27 条消息,9,677 / 9,677 码点,27 个片段;重建差异及剩余来源均为 0 |
|
||||
| 生产产物 | 2 个叶子、1 个导航合并、1 个完整发布结果 |
|
||||
| 叶子记录 | 19 个事件、15 个实体、8 个变化、11 个关系,共 53 条;摘要未替换叶子 |
|
||||
| HTTP | 本会话共 3 次 HTTP 200:两个叶子和一个导航;另有一次缓存响应复核,HTTP 为 0 |
|
||||
| 本轮总付费请求 | 较早失败实验 2 次 + 本会话 3 次 = 5 次;无重复付费请求、无自动重试、无回退模型 |
|
||||
| 配置 | `deepseek-flash`;页大小 17;默认正文批次 8000、默认消息上限 20;模型超时 180 秒、软预算 600 秒、接纳并发 2 |
|
||||
| 耗时 | 首次 20,164ms,缓存复核及剩余执行 19,584ms;二者不含人工修正间隔 |
|
||||
| 手动隔离 | 自动 checkpoint 为 0;SQLite integrity_check 为 ok |
|
||||
|
||||
产物目录为系统临时目录 `opencode/review-production-complete-20260924`;来源快照在 `opencode/review-production-selected-20260924`。计数见 `metrics.json` 和只读审计入口,响应 `.private.sse` 仅供本机诊断,未进入仓库。模型输入包含完整选中正文,但未进行独立语义召回评估;“覆盖完成”不表示模型识别了每个事实。
|
||||
|
||||
最终确定性验证:12 文件定向组 136 项通过,覆盖服务/存储、迁移、设置、Preload 和页面;生产 IPC 筛选 22 项通过,其余 128 项未运行。完整 App 的设置保存及重开 1 项、AssistantDatabase 的监督历史筛选 4 项通过。Electron 使用生产组件,在 1440/1024/390px、浅深主题通过布局测试。首次视觉测试发现脚本仍只选中第一个设置表单,改为测量整个设置面板的可见控件后通过;两个表单同名保存按钮也已分别命名。
|
||||
|
||||
收尾新增用例确认 schema 46 已提交的 2,000 码点前缀不重读,只处理后续 1,300 码点;来源变化保留旧批次并要求新 run,后续自动检查不会永久卡在旧版本。来源上下文按已保存 messageId 和片段返回,避免同时间消息误定位或用当前正文冒充历史片段。`npm run typecheck`、本轮修改及新增 TS/TSX/CJS/MJS 文件的定向 ESLint 均通过。没有运行全量测试、提交或推送。
|
||||
|
||||
最终定向命令:
|
||||
|
||||
```text
|
||||
npx vitest run src/main/assistant/supervision-review.test.ts src/main/assistant/supervisor-service.test.ts src/main/assistant/supervision-history.test.ts src/main/assistant/supervision-activity.test.ts src/main/assistant/incremental-review.test.ts src/main/assistant/supervision-model-pool.test.ts src/main/application-settings-store.test.ts src/preload/supervision-activity.test.ts src/renderer/src/SupervisorActivity.test.tsx src/renderer/src/SupervisionReviewSettings.test.tsx src/renderer/src/HeartbeatCenter.test.tsx src/renderer/src/SupervisorWorkspace.test.tsx
|
||||
npx vitest run src/main/ipc.test.ts -t "supervision|heartbeat enabled gates|admits .*reports before claiming"
|
||||
npx vitest run src/renderer/src/App.test.tsx -t "saves Supervisor timeouts and concurrency"
|
||||
npx vitest run tests/supervisor-layout.electron.test.ts
|
||||
npm run typecheck
|
||||
```
|
||||
|
||||
### 2026-09-24 生产接线与真实模型失败
|
||||
|
||||
本节记录首轮生产接线及较大样本失败;最终补充证据见上一节。下方同日的原型、设计及旧 collector 记录是更早阶段证据。
|
||||
|
||||
已接线:Main 手动 IPC 与心跳回调共用 `createProductionSupervisorService`;schema 47 保存来源清单、配置、叶子和导航节点;稳定键分页、项目/会话轮转、Unicode 片段、逐批事务、失败/预算后继续、严格发布判定已进入生产服务。活动及 Preload 增加暂停、继续、分页批次详情;设置存储、App 回调和中英文表单已接通页大小、字符/消息批次上限及软预算。应用仍默认关闭。实现合同和未完成项见[生产接线与剩余边界](./review-scheduling-design.md#0-生产接线与剩余边界)。
|
||||
|
||||
确定性验证使用隔离 SQLite、生产 IPC 和可控 Runtime,先于真实请求执行。覆盖超过 20 会话/20 消息的 506 条来源、Unicode 精确重建、手动/自动位置隔离、失败后重开、冻结配置、事务回滚、暂停 signal 到 Runtime、成功批次不重算及历史结果来源。后续增加项目轮转、分页大小不改变语义块、发布失败后复用导航节点、Preload 方法和 UI 操作验证。
|
||||
|
||||
真实验证入口为 `scripts/supervision-production-live.cjs` / `.ts`,使用与 Main 相同的生产工厂及 `ModelAgentRuntime`,不使用 `review-algorithm.mjs`。输入为已有只读快照中的完整目标会话,截止时间为 2026-09-23 16:09:45.919 UTC,共 129 条消息;逐消息集合 SHA-256 与原探测清单一致。只将选中会话导入临时产品库,没有复制整份用户库,未打开或改写原库及用户设置。
|
||||
|
||||
| 实测项 | 结果 |
|
||||
| --- | --- |
|
||||
| 配置 | DeepSeek `.env` 中的 `deepseek-flash`;页大小 17、正文批次 16000、消息上限 50、并发接纳 2、模型超时 180 秒、软预算 600 秒 |
|
||||
| HTTP | 2 次,均 200;无付费重试、无模型回退、无工具 |
|
||||
| 结果 | 第 1 批校验并保存,第 2 次输出 JSON 无效;逻辑 run 为 failed,没有完整结果 |
|
||||
| 来源清单 | 129 条消息,54,979 个 Unicode 码点 |
|
||||
| 已持久化覆盖 | 16,000 码点;28 条完整消息及 1 条部分消息,共 29 个片段;101 个来源未完成 |
|
||||
| 已保留输出 | 10 个事件、9 个实体、9 个变化、9 个关系,共 37 条结构化记录 |
|
||||
| 完整发布 / 自动 checkpoint | 均为 0;此次为手动运行,失败批次没有推进位置 |
|
||||
| 耗时 | 56,775ms;HTTP 测量仅记录响应头延迟,不能当作完整模型耗时 |
|
||||
| 完整性 | 临时库 `PRAGMA integrity_check` 为 ok |
|
||||
|
||||
私有产物位于系统临时目录 `opencode/review-production-20260924`。`metrics.json` 与只读命令 `node scripts/supervision-production-audit.cjs <外部临时目录>/assistant.sqlite` 可核对上述计数;不在仓库保存正文或凭据。失败响应正文没有保存,尚不能确定 JSON 无效是格式问题还是输出截断;不补造原因。按用户要求未重发失败付费请求,**该 129 条消息样本没有完成真实模型全会话覆盖验收**。16000 字符测试上限也不能视为经过可靠性验证的推荐默认。
|
||||
|
||||
已完成的定向命令包括:
|
||||
|
||||
```text
|
||||
npx vitest run src/main/ipc.test.ts -t "production supervision IPC|collects supervision within the exact UI timeRange"
|
||||
npx vitest run src/main/assistant/supervision-review.test.ts src/main/assistant/incremental-review.test.ts src/main/assistant/supervision-history.test.ts src/main/assistant/supervision-model-pool.test.ts src/renderer/src/HeartbeatCenter.test.tsx src/renderer/src/SupervisionReviewSettings.test.tsx src/preload/supervision-activity.test.ts
|
||||
npx vitest run src/main/assistant/assistant-database.test.ts -t supervision
|
||||
```
|
||||
|
||||
前述 IPC 3 项、七文件 45 项及数据库历史 4 项通过。更早一次十文件定向运行 116 项通过,2 项因两个表单保存按钮同名失败;已分别命名并复查相关文件。类型检查、最终定向 lint 和收尾验证在本节后续记录。未运行全量测试、提交或推送,保留已有 dirty 改动。此次没有修改 Agent、远程 Runtime 协议或其取消实现;监督父 signal 使用既有 Runtime 接口,本轮不声称完成远程真实验证。
|
||||
|
||||
### 2026-09-24 DeepSeek 全目标会话隔离原型
|
||||
|
||||
使用 `.env.deepseek.local` 的 `DEEPSEEK_BASE_URL`、`DEEPSEEK_MODEL`、`DEEPSEEK_API_KEY`;配置模型及 12 次响应的实际模型均为 `deepseek-flash`。直接调用配置端点,没有 GPT 回退、自动付费重试或工具调用。原型复用 `SupervisionModelPool`,实验并发参数设为 2,实测峰值为 2;没有修改应用设置。单请求超时 180 秒,输出预留 16,384 token,12 次均以 `stop` 结束。
|
||||
|
||||
启动前核对旧探测的 PID、创建时间、启动记录及命令路径,终止已取消的全会话 GPT 探测。旧尝试记录 10 次已插桩 HTTP 及 2 次未插桩调用,不计入下表的 DeepSeek 12 次。原始消息复用 `review-full-20260924/sources.private.json`,核验冻结消息集合的 SHA-256 及逐消息重建;未沿用旧 GPT 事实或导航。该快照来自既有 `readOnly`、`query_only` 采集入口,本轮没有打开原库,也未初始化、迁移或写入原库。
|
||||
|
||||
| 测量 | 结果 |
|
||||
| --- | --- |
|
||||
| 完整目标范围 | 1 个会话,129 / 129 条 user/assistant 消息,8 页;截至 2026-09-23 16:09:45.919 UTC 的冻结快照 |
|
||||
| 正文覆盖 | 54,979 / 54,979 个 Unicode 码点;本样本 UTF-16 单元数相同;135 个片段、7 个叶子批次,每批正文不超过 8,000 UTF-16 单元 |
|
||||
| 来源核验 | 重建差异 0、覆盖空洞 0、引用码点区间错误 0 |
|
||||
| 持久化结果 | 354 条叶子事实、503 条引用;其中一个重复短引文保留 2 个明确标为歧义的候选位置,没有猜选唯一位置 |
|
||||
| 导航 | 18 组完整索引 354 条事实,每条一次;生成导航前后叶子内容散列一致 |
|
||||
| 真实调用 | 7 次叶子提取 + 2 次独立检查点选择 + 1 次导航 + 2 次语义评分,共 12 次 HTTP 200 |
|
||||
| 首批速度 | 并发两请求分别 20.376 / 9.236 秒,首轮 20.420 秒;先保存 16,000 码点并正确返回 partial |
|
||||
| 叶子速度 | 单请求 9.236..20.376 秒;七请求耗时之和 107.334 秒,含并发重叠,不能当作墙钟耗时 |
|
||||
| 全实验时间 | 四次执行的进程内耗时合计 111.955 秒;首次请求至末次响应约 333.869 秒,包含检查、修改及人工重启间隔;另两次离线验证合计约 38ms |
|
||||
| token | 提供商报告输入 188,377、输出 56,009;其中叶子提取为 34,771 / 35,852,其余用于评估及导航;未换算货币费用 |
|
||||
| 续跑与无变化 | 三个已保存叶子在校验失败后复用;失败批次的已有响应重新本地校验,未再次请求。最终重启复用七批,无变化检查 4.362ms、模型调用 0;独立离线验证 19.826ms、模型调用 0 |
|
||||
|
||||
目标会话在旧探测后继续增长,先前记录的 119、123 条与本轮 129 条属于不同读取时点,不能混为同一分母。本轮覆盖完整目标会话,不等于覆盖旧全局区间的 830 条消息、63 个会话,也未测试任务、记忆和知识引用的全量采集。
|
||||
|
||||
独立检查点选择请求只看到两半完整原文,没有看到叶子结果,也未注入指定引文。模型返回 125 个检查点,超过要求的每半 24..32 个;排除 2 个原消息中不存在的逐字引文后,评分采用 123 个。第二半的消息回执虽有 64 项,但 ID 集合不匹配,因此仅声称全部 129 条已提交给评估器,不以模型回执证明它逐条读懂。
|
||||
|
||||
| 独立检查类别 | 有效检查点 | 模型判为保留 | 遗漏 / 失真 |
|
||||
| --- | --- | --- | --- |
|
||||
| 决策 | 46 | 46 | 0 / 0 |
|
||||
| 修正 | 9 | 9 | 0 / 0 |
|
||||
| 否定约束 | 1 | 1 | 0 / 0 |
|
||||
| 未解决事项 | 5 | 5 | 0 / 0 |
|
||||
| 助手陈述归属 | 62 | 62 | 0 / 0 |
|
||||
|
||||
模型评分未报告不受引用支持的事实;离线核验 123 项均有原消息的引用,118 项在所引用叶子中保留完整逐字检查引文,另 5 项依赖语义比较。评估器报告导航短摘要遗漏 69 项叶子细节,相关叶子仍完整保留。评估独立性仅指先从原文选择检查点、再比较输出,提取与评分使用同一模型;缺少人工金标准,否定类仅一项,跨两半的修正关系没有单独审计。这些数字不构成全部事实召回率或“无语义遗漏”的证明。
|
||||
|
||||
实际出现两次本地校验失败:重复引文导致叶子拒收,以及评估输出违反检查点数量与引用合同。成功批次在失败后仍可读取;原型为重复引文保存全部候选定位,对无效评估引文明确排除并计数。原始响应保留在临时目录,三次缓存读取不产生 HTTP。确定性测试另外覆盖批次失败、截断、取消和预算暂停后的恢复,未刻意制造提供商失败来增加付费调用。
|
||||
|
||||
执行入口为 `scripts/review-deepseek.cjs` / `scripts/review-deepseek.mjs`,共享原型为 `scripts/review-algorithm.mjs`。私有正文、来源、模型响应及 SQLite 均位于系统临时目录;仓库仅包含脚本、合成测试和不含正文的测量记录。产物目录:`C:/Users/jiang/AppData/Local/Temp/opencode/review-deepseek-20260924`。可公开计数见 `metrics.json`、`coverage.json`;私有依据见 `batches.sqlite`、`facts.private.json`、`navigation.private.json`、`gold-*.validated.private.json`、`evaluation-*.private.json`。
|
||||
|
||||
复现命令如下。`first`、`finish`、`verify` 启动独立进程,须待上一次退出再运行下一条;`status` 仅读取计数。现有输出目录会复用已保存产物;更换输出目录重跑会新增最多 12 次付费调用。
|
||||
|
||||
```powershell
|
||||
$source = "$env:TEMP/opencode/review-full-20260924"
|
||||
$output = "$env:TEMP/opencode/review-deepseek-20260924"
|
||||
node scripts/review-deepseek.cjs first $source $output .env.deepseek.local 2
|
||||
node scripts/review-deepseek.cjs status $output
|
||||
node scripts/review-deepseek.cjs finish $source $output .env.deepseek.local 2
|
||||
node scripts/review-deepseek.cjs verify $source $output .env.deepseek.local 2
|
||||
node --test scripts/review-algorithm.test.mjs
|
||||
npx vitest run src/main/assistant/supervision-model-pool.test.ts
|
||||
npx eslint scripts/review-algorithm.mjs scripts/review-algorithm.test.mjs scripts/review-deepseek.cjs scripts/review-deepseek.mjs
|
||||
```
|
||||
|
||||
10 项原型测试、3 项共享池测试及上述定向 ESLint 通过;没有运行全量测试、提交或推送。测试覆盖分页同序键、Unicode 重建和引用位置、空洞、预算暂停、失败后重开、无变化零调用、来源版本变化、输出拒收、取消以及导航不删除冲突叶子。该原型未接生产 IPC/UI、自动 checkpoint、全局多项目调度或多层汇总;真实请求绕过产品 ModelRuntime。生产实现仍存在下节记录的采集遗漏,未来实现边界见[分块调度设计](./review-scheduling-design.md#12-隔离原型的设计结论)。
|
||||
|
||||
### 2026-09-24 模型阶段超时、并发与设计边界
|
||||
|
||||
- 本次静态核对当前新代码:报告 `heartbeatReportTimeoutSeconds`、监督 `supervisorOrganizeTimeoutSeconds` 已接入共享校验、设置存储、App/设置表单及 Main 摘要器;整数 30..600 秒、默认 240。报告在等待池前冻结值,监督在摘要器入池前读取值,均在获槽及 Runtime 解析后才计时。完整控制及未覆盖环节见[控制清单](./review-scheduling-design.md#当前超时与调度控制清单已实现)。
|
||||
- `supervisorModelConcurrency` 已接入同一设置链路,整数 1..4、默认 1;报告与监督共用 FIFO 池,普通聊天排除,降限不终止在途项。报告获槽后才领取,每次到期领取最多一条;租约为 `max(300, 报告超时 + 60)` 秒,实际请求开始前按运行 ID、owner、attempt、claimed 和未过期条件校验并刷新。报告提交或无变化后先释放槽位,再进入下游监督。尚无提供商全局并发、RPM、TPM 或监督层 Retry-After 控制。
|
||||
- 本轮协作提供的新增验证记录:24 项并发相关测试、33 项租约相关测试及 typecheck、lint 通过。本次文档修订仅核对实现,没有重新执行这些测试;记录未附精确过滤命令,不补造命令或与此前批次相加。
|
||||
- 实现代理报告:87 项测试、App/IPC 聚焦用例、另 19 项取消测试,以及 typecheck、lint 通过。本次文档修订未复跑这些命令,不将数量相加当作独立用例总数,也不推断全量测试已通过。
|
||||
- 实现代理报告的真实远程取消验证耗时 30.75 秒,清理后本次拥有的进程为 0。该证据验证相应 Runtime 取消/清理路径,不证明完整分页调度、父级取消、批次持久化或跨重启续跑已经实现。
|
||||
- 真实用户数据探测结果见下节。两次原始失败耗时与旧 240 秒时限一致,但缺少 abort 原因记录,尚不能证明证据规模是超时根因。
|
||||
- [回顾分块调度设计](./review-scheduling-design.md)已按用户授权加入完整分页、保留叶子事实/来源、成功批次及位置持久化、预算/失败后继续和严格完成判定。上述调度、存储合同、状态及 UI 仍待实现;当前有界单次成功不等于整个时间区间完整覆盖。
|
||||
|
||||
### 2026-09-24 真实会话覆盖与模型小样本
|
||||
|
||||
原始数据库以 `readOnly` 和 `query_only` 打开,只读事务内分析,未初始化或迁移。用户所述安装路径不存在;实际安装位于 `D:\Program Files (x86)\GoodBuddy`,数据位于用户配置目录。统计使用当前数据库内 9 月 16 至 23 日记录,并非还原该次运行时的数据库快照。
|
||||
|
||||
| 测量 | 结果 |
|
||||
| --- | --- |
|
||||
| 区间内会话消息 | 830 条、63 个会话、5 个项目 |
|
||||
| 手动采集器返回 | 202 条消息、70,491 个 UTF-16 单元 |
|
||||
| 实际进入当前摘要器 | 100 条消息、17,714 个 UTF-16 单元;覆盖 9 个会话 |
|
||||
| 目标会话 | 区间内 80 条中仅 20 条进入摘要器;正文覆盖 3,693 / 33,247,即 11.11% |
|
||||
| 离线完整分块审计 | 123 条消息分为 127 块,重建差异为 0;未对这些块执行模型提取 |
|
||||
| 只读采集耗时 | 手动 182ms、单批增量 375ms、整个探测 805ms |
|
||||
|
||||
整条消息遗漏发生在 SQL 数量限制及服务取前 100 项处;本样本进入摘要器的消息未再发生正文裁剪。100 条来源均缺少 `locator.messageId`,现有会话定位不能代替逐消息覆盖凭据。完整分页与消息定位仍为待实现项。
|
||||
|
||||
隔离模型实验使用两条已保存的真实样本,共 814 个 UTF-16 单元,经 `createDefaultModelRuntime` 调用 `gpt-6-astra`。3 次 HTTP 请求均为 200,未付费重试;两次提取耗时 34.665 / 35.413 秒,导航概述 6.703 秒,实验总耗时 76.813 秒。模型输入与原消息逐字一致,要求保留的两处引用及消息引用均核验通过,导航引用两项已保留事实;无变化复查耗时 5.99ms,模型请求为 0。原应用设置在完成时逐字节未变。
|
||||
|
||||
两处引文已在提示中明确指定,因此该实验仅验证小样本的引文保留、引用正确性与保留产物,不能证明自由提取完整性、全会话无失真或未来调度器性能。实验采用自定义单来源准入及直接模型 Runtime,未经过完整生产 IPC/UI。原库两次失败运行分别耗时 240.211 / 240.216 秒,监督结果仍为 0;样本成功不等于原问题已修复。
|
||||
|
||||
复核产物保存在本机临时目录 `opencode/review-fidelity-20260923-current`:`verification-current/coverage.json`、`live-resolved/live-metrics.json`、`verification-current/verification.json`。执行入口为私有临时脚本 `resume-supervision-probe.cjs` 和 `verify-supervision-probe.cjs`;核验退出码为 0。启动器等待曾超时,最终产物记录三次请求完成且进程随后退出,未因此重发请求。此前依赖加载失败均发生在请求发送前。会话正文及配置副本未加入仓库。
|
||||
|
||||
### 既有实现
|
||||
|
||||
- 共享监督者契约已接入 Main 服务,模型请求包含系统指令;证据总字符预算为 48,000,输出仍限制为 100KB,并校验本次证据集内的来源引用、输出局部实体 ID 和关系端点。手动回顾当前收集会话、任务、消息已有的知识引用和已确认记忆;记忆使用 `memory` 来源类型。
|
||||
- SQLite schema 43 包含监督运行、结果、来源、故事线、事件、实体、实体关联和关系表,并保存每次结果的实体与关系内容。来源保存本地 library/document/chunk 或外部 locator 元数据;持久化与升级规则见[技术设计](./technical-design.md)。
|
||||
- 监督者入口只有一个页面页头和四项顶层页签:工作回顾、故事线图谱、活动、设置。原有计划、概览、建议及报告内容保留在设置页内部;手动运行仍通过 Supervisor 通道,未绑定自动计划时也可用。
|
||||
- 初版监督者入口只有一个页面页头和四项顶层页签,原有计划、概览、建议及报告当时保留在设置页内部。2026-09-24 已按上文菜单调整迁移内容;手动运行仍通过 Supervisor 通道,未绑定自动计划时也可用。
|
||||
- 工作回顾显示结果自身冻结的 scope/time range。故事线视图使用真实数据库结果,外围事件按实际时间逆时针排列并保留缺口,事件实体连线和来源过滤来自 Main 查询投影,图形不可用时仍可通过事件/实体/关系列表操作。
|
||||
- `HeartbeatService` 在定时或手动心跳成功落库后调用同一个 `SupervisorService`,按心跳范围和回顾窗口自动保存监督结果;投影失败不会改写已经成功的心跳状态。
|
||||
- 监督图谱提供 Main/Preload IPC 的来源读取、实体确认/修订/撤销和关系确认/移除;关系移除保存 `revoked` 状态,不删除来源,后续自动 run 不恢复相同身份的关系。
|
||||
@@ -36,6 +325,10 @@
|
||||
|
||||
## 当前边界
|
||||
|
||||
### 2026-09-24 算法设置文档补充
|
||||
|
||||
已静态核对共享设置合同、设置存储及隔离原型参数,补充[设置配置清单](./review-scheduling-design.md#4-设置配置清单)和 [UI 交互目标](./ui-design.md#算法配置设置目标)。本次仅更新文档;新增分页、分块、预算、续跑及额度控件均未实现,原型值不作为产品默认。未运行代码、测试、探测或模型调用,未修改应用配置和用户数据库。
|
||||
|
||||
### 2026-09-23 Main 与侧栏定向修复
|
||||
|
||||
- 已修复:继续讨论不再把数组写入要求字符串的 `serializedContexts`;请求省略 Runtime 时复用会话选择。真实 SQLite 入队后,生产队列解析器成功派发请求。
|
||||
@@ -74,7 +367,7 @@
|
||||
|
||||
### 2026-09-23 自动监督设置
|
||||
|
||||
- 对应 US-S22 至 US-S24:监督者设置直接显示完整自动监督配置,运行概览、建议、报告与记录保留为次要面板。界面统一中英文命名,保留内部 heartbeat 标识和已有内容。无计划时明确显示仅支持手动回顾,填写草稿不触发保存或运行。
|
||||
- 对应 US-S22 至 US-S24:当时设置直接显示完整自动监督配置,并保留运行概览、建议、报告与记录次要面板;2026-09-24 已迁移这些面板并移除内部导航。界面统一中英文命名,保留内部 heartbeat 标识和已有内容。无计划时明确显示仅支持手动回顾,填写草稿不触发保存或运行。
|
||||
- 核对共享 recurrence 合同及实际调度器后,仅展示已支持的每日、每周指定时间;页面明确说明不支持分钟间隔。编辑保留原时区和暂停状态,计划列表显示范围、周期、时区、回顾窗口与保留期限,继续提供编辑、暂停、恢复、运行及确认删除。
|
||||
- 已核对 App、Preload、Main 和 HeartbeatService 的既有 CRUD 接线,本轮未修改调度器或创建默认计划。保留工作区原有默认关闭及 Main 启用检查改动。
|
||||
- 定向测试:`HeartbeatCenter.test.tsx` 23 项、`application-settings-store.test.ts` 50 项通过;`heartbeat-recurrence.test.ts`、`heartbeat-service.test.ts`、`heartbeat-database.test.ts` 合计 17 项通过;`ipc.test.ts -t 'heartbeat enabled gates'` 4 项通过、128 项未运行。覆盖中英文直接入口、每日/每周提交、多项目、无效窗口、失败保留草稿、时区及暂停状态、各项计划操作,以及默认关闭、无计划不运行和启停行为。首轮整文件运行发现原有顶层图谱测试未清理 DOM,补充文件级 cleanup 后通过。
|
||||
@@ -96,10 +389,10 @@
|
||||
|
||||
### 其他边界
|
||||
|
||||
- 来源读取对本地会话可精确定位到会话和时间;本地知识引用通过现有 `KnowledgeService` 解析文档/分块,失效时显示不可用;外部引用只使用已保存 locator,不调用远端全库。
|
||||
- 新批次来源读取按 messageId 返回已保存片段及版本;旧历史缺少消息 ID 时保留会话/时间定位。本地知识引用通过现有 `KnowledgeService` 解析文档/分块,失效时显示不可用;外部引用只使用已保存 locator,不调用远端全库。
|
||||
- 继续讨论和知识库写入使用现有本地会话队列与知识库实体接口,并要求先预览、再由用户确认提交。侧栏已支持结果直达图谱,尚无可编辑的上下文预览。
|
||||
- 关系移除保留撤销状态及原始来源;界面没有提供恢复入口。
|
||||
- 候选集最多 100 个实体,复用依赖模型显式选择;不会自动合并历史重复实体或跨 scope 合并。结果级历史内容已保存,事件滑块仍不重建逐事件的实体演变。Experiment、完整图谱回放和取消状态尚未贯通生产链路。
|
||||
- 候选集最多 100 个实体,复用依赖模型显式选择;不会自动合并历史重复实体或跨 scope 合并。结果级历史内容已保存,事件滑块仍不重建逐事件的实体演变。Experiment 和完整图谱回放尚未实现;批次暂停/继续已接通。
|
||||
|
||||
## 2026-09-23 自动增量验证
|
||||
|
||||
|
||||
@@ -0,0 +1,348 @@
|
||||
# 监督回顾分块调度设计
|
||||
|
||||
日期:2026-09-24。状态:生产分块、持久化续跑、设置及活动入口已接线;27 条消息的完整会话通过真实模型验证,较早的 129 条消息实验仍未完成。当前实现以第 0 节为准,第 1 节保留改造前基线,第 2 至 11 节保留目标设计,第 12 节为早期隔离原型证据。
|
||||
|
||||
本文针对全局七天 `supervision:run` 出现 `AbortError` 的反馈,设计完整分页、证据分块、模型任务调度和逐层汇总。用户已明确要求预算耗尽或失败后保留成功批次及位置,重启后可继续,不重复计算成功叶子。生产接线复用 `SupervisorService`、现有数据库及 `review_checkpoints`;不另建定时调度器。schema 47 的实现与目标差异见第 0 节。
|
||||
|
||||
产品范围仍由[监督者产品设计](./supervisor-prd.md)定义;本设计对应 FR-S4、FR-S6、FR-S10 及 US-S12、US-S26、US-S27。既有规则见[逻辑设计](./logic-design.md#自动增量与手动重看),实现架构见[技术设计](./technical-design.md),已验证事实见[实施进度](./progress.md)。第 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 次付费请求,没有重复付费或回退。范围及缓存复核说明见[进度](./progress.md#2026-09-24-完整会话生产验证与收尾)。
|
||||
- 来源被修改或删除时保留旧批次并明确失败,标记需要新建回顾,活动页停止提供无效的继续按钮;下一次自动检查可创建新 run,不会永久重复该失败。尚未实现仅使受影响叶子和父节点失效后重算。清单记录冻结版本,不保存全库正文快照。
|
||||
- 分块配置、超时、接纳并发及算法版本已保存。实际默认 Runtime、模型及候选背景仍在执行时解析;未实现跨重启模型/提示词版本固定,也未实现共享池排空后切换冻结并发的目标规则。
|
||||
- 元数据清单和最终发布仍是同步 SQLite 事务,缺少大库延迟验证及可中断来源读取。批次详情已分页,既有历史图谱查询仍返回整份结果;大图谱的响应大小尚未改造。
|
||||
- 没有 token/费用预算、提供商 RPM/TPM、Retry-After 冷却、执行硬期限、独立清理期限或逐层可配置超时。默认正文预算不保证任意模型上下文容量;超长输出、非法 JSON 和引用错误会失败,保留已成功批次。
|
||||
- 片段以码点边界切分,尚未增加句界优先和重叠背景。事实保留指保留模型已产出的结构化记录,不证明语义无遗漏;生产契约校验引用 token,不要求原型的逐字引文和 reviewedTokens 回执。提供过的 locator.source 仅在本节点唯一对应一个片段时可作为引用别名;歧义及未知来源拒绝。
|
||||
|
||||
## 1. 改造前代码事实
|
||||
|
||||
下列旧草案行号仅作定位参考,工作区代码更新可能使其偏移;以所列函数和下方本次核对的控制清单为准。
|
||||
|
||||
| 环节 | 当前行为与代码依据 | 对调度设计的影响 |
|
||||
| --- | --- | --- |
|
||||
| 手动入口 | [ipc.ts:7917](../../../src/main/ipc.ts#L7917) 校验应用启用和维护状态,等待 `SupervisorService.run()` 返回 | 当前没有提前返回 runId 的开始接口,也没有监督取消接口 |
|
||||
| 运行串行 | [supervisor-service.ts:124](../../../src/main/assistant/supervisor-service.ts#L124) 用一个 `pending` Promise 串行执行整个服务的请求,出队后才创建运行 | 当前不是按项目并发;排队时间不在摘要定时器内,也尚无排队活动记录 |
|
||||
| 单次摘要 | [supervisor-service.ts:135](../../../src/main/assistant/supervisor-service.ts#L135) 最多取 100 条证据,每条最多 8,000 个 JS 字符,总正文最多 48,000,再调用一次 `summarize` | 没有分块队列或递归汇总;48,000 不包括实体候选、系统指令、旧摘要和 JSON 开销 |
|
||||
| 模型超时 | [ipc.ts](../../../src/main/ipc.ts) 的监督摘要器读取 `supervisorOrganizeTimeoutSeconds`,默认 240 秒,超时带明确原因 abort;流结束检查 signal 和 `done`,finally 释放会话 | 新控制已实现,完整清单见下节;不能据此反推原始 AbortError |
|
||||
| 底层模型请求 | [model-runtime.ts:206](../../../src/main/agent/model-runtime.ts#L206) 默认请求超时十分钟;[createRequestSignal](../../../src/main/agent/model-runtime.ts#L584) 传播上层 signal 并设置底层超时;[retryModelStream](../../../src/main/agent/model-runtime.ts#L1891) 对部分网络失败重试 | 上层默认四分钟可以先到,当前已可配置;调度层不能再盲目叠加网络重试。注入 Runtime 的实际类型和配置仍须运行时核实 |
|
||||
| 手动采集 | [ipc.ts:7120](../../../src/main/ipc.ts#L7120) 传入精确时间范围;[buildHeartbeatInput](../../../src/main/assistant/assistant-database.ts#L8168) 在时间和范围过滤后最多取 20 个会话、每会话最后 20 条消息、100 个任务、100 条记忆 | SQL 层未入选的证据在服务分块前已经遗漏,单改 `summarize` 无法补齐 |
|
||||
| 自动采集 | [collectIncrementalReview](../../../src/main/assistant/assistant-database.ts#L8333) 按阶段、scope、来源版本和位置过滤,再按发生时间和来源 ID 排序;最多 100 个来源,各取后续 2,000 个 Unicode 字符 | 已有片段定位与进度能力;查询需要扩展运行内位置,避免提交前反复读到同一片段 |
|
||||
| 自动预算 | [ipc.ts:7115](../../../src/main/ipc.ts#L7115) 监督新证据预算 44,000 个 JS 字符;[heartbeat-service.ts:227](../../../src/main/assistant/heartbeat-service.ts#L227) 报告预算 12,000;[reviewBackground](../../../src/main/assistant/assistant-database.ts#L8419) 最多四条各 500 字符记忆,旧摘要最多 2,000 字符 | 自动路径与手动路径的证据集合、预算和游标语义不同 |
|
||||
| 输出及身份 | [supervisor-service.ts:71](../../../src/main/assistant/supervisor-service.ts#L71) 检查 100KB 输出与来源引用;[同文件:167](../../../src/main/assistant/supervisor-service.ts#L167) 校验候选身份;[共享输出契约](../../../src/shared/supervision-contracts.ts#L62) 限制每对象 20 个来源、40 个事件、40 个实体、80 个变化和 80 个关系 | 多个合法子输出拼接后不一定合法;汇总必须同时约束字节、数量与引用 |
|
||||
| 保存 | [saveSupervisionResult](../../../src/main/assistant/assistant-database.ts#L8531) 一个事务保存运行状态、结果、来源正文片段、图谱快照及进度,来源重新分配 UUID | 可复用一次结果事务;当前 `coverage_json` 只有证据条数,不能表达完整覆盖 |
|
||||
| 自动入口 | [heartbeat-service.ts:220](../../../src/main/assistant/heartbeat-service.ts#L220) 先处理报告,再经 [ipc.ts:1914](../../../src/main/ipc.ts#L1914) 调同一监督服务;报告 `no_change` 仍检查监督阶段 | 报告和监督是独立消费阶段,报告成功不能替监督推进游标 |
|
||||
| 活动 | [活动契约](../../../src/shared/supervision-contracts.ts#L27) 没有 `partial`、`cancelled` 或子任务计数;[数据库活动投影](../../../src/main/assistant/assistant-database.ts#L8501) 按 heartbeat run ID 合并;[SupervisorActivity](../../../src/renderer/src/SupervisorActivity.tsx#L21) 仅在激活时轮询 | 展示新进度需要明确扩展契约,不能只添加状态文案 |
|
||||
|
||||
初稿阶段没有检查真实运行日志或用户数据库。后续只读探测记录了两次约 240 秒的失败,但没有复现该次请求或取得明确 abort 原因,尚不能确定是四分钟定时器或证据规模导致超时。诊断记录应包含运行 ID、阶段、耗时、输入规模、错误类型和 abort 原因;不记录证据正文、模型凭据或完整提示词。
|
||||
|
||||
当前监督输出先累积字符串、再检查 100KB;它不像心跳摘要器那样在流中检查字节数。报告和监督均将池 signal 与局部超时 signal 合并;清除本地数据会取消池内等待和在途工作,IPC 释放时 dispose 池。该生命周期取消不等于已有用户取消入口或分块 run 父级取消。以上都是静态实现差异,不是本次真实日志结论。
|
||||
|
||||
### 是否截断丢数据
|
||||
|
||||
手动回顾会遗漏本次分析输入:SQL 的数量限制,以及服务的 `.slice(0, 100)`、单条和总字符裁剪均会排除内容;任务和记忆排在会话证据之后,还会竞争余量。未入选内容没有自动续读机制。原始消息并未因此从数据库删除,但结果不能代表七天全部记录,裁剪后的来源也不能冒充完整消息。
|
||||
|
||||
自动回顾的未读片段仍保留待处理资格。[supervisor-service.ts:174](../../../src/main/assistant/supervisor-service.ts#L174) 只将完整进入摘要输入的片段 checkpoint 交给保存事务,模型或保存失败不推进。这里的“完整”指采集片段,并非整条消息。来源若在后续执行前离开滚动窗口,就不会被自动补读,因此“不会误标已处理”不等于“未来必定覆盖”。
|
||||
|
||||
目标是不再静默裁剪,把单次上限改成分页、分块和暂缓派发的依据,直至冻结范围内全部项目、会话、消息及其他入选来源处理完毕。模型提取仍可能遗漏原文含义,但已产出的叶子事实、事件、冲突及来源必须完整保留、可分页读取。摘要只用于导航,不能替代叶子结果;“原文已处理”也不等于模型识别了全部事实。
|
||||
|
||||
### 当前超时与调度控制清单(已实现)
|
||||
|
||||
以下是当前代码事实,不是后文拟议的多层调度预算。设置暴露两个阶段超时和一个监督并发数。
|
||||
|
||||
| 控制 | 实际值、读取时点与范围 | 代码依据与边界 |
|
||||
| --- | --- | --- |
|
||||
| 心跳报告模型阶段 | `heartbeatReportTimeoutSeconds`,整数 30..600 秒,默认 240;`runNow` / `processDue` 在等待池之前读取并冻结,获得槽位后才领取数据库任务 | [共享设置](../../../src/shared/application-settings-contracts.ts)、[设置存储](../../../src/main/application-settings-store.ts)、[HeartbeatService](../../../src/main/assistant/heartbeat-service.ts);手动及自动均适用,排队期间修改设置不改变该次报告值;到期领取每次最多一条 |
|
||||
| 监督整理模型阶段 | `supervisorOrganizeTimeoutSeconds`,整数 30..600 秒,默认 240;出队、采集完成后,在摘要器开始时读取 | [IPC 摘要器](../../../src/main/ipc.ts);后续监督阶段可读到新值,正在执行阶段不变;不覆盖排队、采集、Runtime 解析、保存或 finally 清理 |
|
||||
| 监督模型并发 | `supervisorModelConcurrency`,整数 1..4,默认 1;报告与监督整理共用一个 Main 内 FIFO 池 | [SupervisionModelPool](../../../src/main/assistant/supervision-model-pool.ts)、[IPC 接线](../../../src/main/ipc.ts);普通聊天不入池。升限可派发等待项,降限不打断在途项,等占用降到新上限以下再派发;监督服务外层 run 仍串行 |
|
||||
| 报告计时与失败 | 获得槽位、领取、采集和 Runtime 解析完成后,在实际请求开始前续租并启动计时;timeout 原因优先于下层 abort,流结束检查 signal、`done` 及空输出;流中限制 100KB | [IPC 报告摘要器](../../../src/main/ipc.ts);失败不保存报告及其 checkpoint,finally 清 timer、释放会话;报告槽位覆盖领取与采集,但排队和这些步骤不消耗模型时限 |
|
||||
| 监督计时与失败 | 摘要器读取设置后等待池,获得槽位并解析 Runtime 后启动计时;保留明确 timeout 原因及非 timeout 的提供商错误,流结束检查 signal 和 `done` | [IPC 监督摘要器](../../../src/main/ipc.ts)、[SupervisorService](../../../src/main/assistant/supervisor-service.ts);排队不消耗模型时限,失败不保存结果及 checkpoint;100KB 仍在服务收齐后校验,无监督用户取消入口 |
|
||||
| 直连模型传输 | 产品默认固定 600 秒的独立请求超时,本页两个阶段超时设置不修改它;内部 `requestTimeoutMs` 可由 Runtime 构造配置 | [model-runtime.ts](../../../src/main/agent/model-runtime.ts) 的 `createRequestSignal` / `fetchWithTimeout`;传播上层 signal,不是整次回顾预算;其他 Runtime/提供商可能更早失败 |
|
||||
| 直连传输重试 | 最多 3 次重试,间隔 500 / 1,000 / 2,000ms,仅符合条件的网络错误且尚未有阻止重试的流事件时重试 | 同文件 `retryModelStream`;等待也受上层 signal 约束,不重新获得报告/监督阶段时限,不是用户设置或调度叶子重试 |
|
||||
| 报告领取租约 | `max(300, reportTimeoutSeconds + 60)` 秒,实际范围 300..660 秒;模型请求实际开始前按同一冻结值刷新 | [HeartbeatService](../../../src/main/assistant/heartbeat-service.ts) / [renewHeartbeatLease](../../../src/main/assistant/assistant-database.ts);刷新须匹配运行 ID、owner、attempt、claimed 状态且尚未过期,否则拒绝启动。300 是下限;数据库默认仍为 300 秒,租约不是取消定时器,不覆盖下游监督 |
|
||||
| 阶段交接 | 报告保存成功或 `no_change` 后释放报告槽位,再进入下游监督;finally 的重复释放幂等 | [HeartbeatService](../../../src/main/assistant/heartbeat-service.ts);默认并发 1 时不会持有报告槽位等待监督取得同一个槽位 |
|
||||
| 心跳失败重领 | 最多 3 次尝试,失败退避 60 秒、300 秒;过期租约按领取条件重领 | [AssistantDatabase](../../../src/main/assistant/assistant-database.ts) 的 `claimDueHeartbeats` / `failHeartbeatRun`;与 HTTP 重试及未来成功批次续跑不同 |
|
||||
| 后台 tick | 30 秒一次,启动时也检查;`heartbeatTickRunning` 防重入 | [ipc.ts](../../../src/main/ipc.ts) 的 `runDueHeartbeats`;是到期检查周期,不是阶段超时或分钟级计划设置 |
|
||||
| 计划迟到 | 到期超过 2 小时记为 skipped 并计算下次时间 | [claimDueHeartbeats](../../../src/main/assistant/assistant-database.ts);这是漏跑处理窗口,不是模型超时 |
|
||||
| 活动轮询 | 有运行中记录时读取结束 2 秒后刷新,否则 10 秒;串行,离页停止 | [UI 设计](./ui-design.md#活动);只读展示,不终止任务、不触发模型 |
|
||||
| 提供商限流 | 尚无跨聊天与监督的提供商全局并发、RPM 或 TPM 调度限制,也无监督层 Retry-After 冷却 | 当前池只限制监督工作;普通聊天仍可能与之竞争同一上游额度。已核对直连文本 [model-runtime.ts](../../../src/main/agent/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 设计](./ui-design.md#算法配置设置目标)。除明确标为已实现的三个字段外,均为规划,不代表已有设置合同或控件。未测参数的产品默认值与数值范围均为待定,下表只给设计校验规则;原型参数单独列出,不作为推荐默认值。
|
||||
|
||||
### 普通配置
|
||||
|
||||
| 设置 | 单位、默认值与状态 | 用途与约束 |
|
||||
| --- | --- | --- |
|
||||
| 消息每页条数 | 条/数据库页;待实现,默认值与范围待定 | 正整数;只控制一次数据库 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](../../../scripts/review-algorithm.mjs) 和 [review-deepseek.mjs](../../../scripts/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. 队列及汇总算法
|
||||
|
||||
```text
|
||||
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](../../../src/main/assistant/assistant-database.ts#L8564) 的保护;已确认、已修订字段及已撤销关系不被自动结果覆盖。候选在执行中被撤销时整次保存失败,游标保持原值,下一次重新读取候选。
|
||||
|
||||
## 7. 超时、取消和部分失败
|
||||
|
||||
一个 run 持有父 controller,节点持有独立的超时 controller;父取消传到全部在飞节点。取消后停止采集、派发和结果提交,清除定时器并释放临时 Runtime 会话。节点超时只触发本轮失败,不取消其他运行或共享 Runtime。节点采用独立 requestId/conversationId;冻结默认 Runtime 选择,不因证据来自某个项目就切换到该项目远程执行环境。
|
||||
|
||||
当前监督通过无 projectId 的 [resolveRequestRuntime](../../../src/main/ipc.ts#L1492) 获取默认 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. 活动与结果展示
|
||||
|
||||
沿用[现有活动设计](./ui-design.md)及[全局界面规范](../../../UI-DESIGN.md),活动仍是一条手动逻辑 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 隔离原型的测量、复现命令、范围和限制统一记录在[实施进度](./progress.md)。这些证据不证明生产分块调度已实现;原始 AbortError 仍缺乏明确 abort 原因的日志证据。
|
||||
|
||||
## 12. 隔离原型的设计结论
|
||||
|
||||
`scripts/review-algorithm.mjs` 实现了可执行的消息分页、码点分块、逐批 SQLite 保存、按已保存片段恢复、完整覆盖判断及叶子导航校验。`scripts/review-deepseek.mjs` 用配置中的 DeepSeek 完成整条目标会话验证;具体计数和耗时只在[实施进度](./progress.md#2026-09-24-deepseek-全目标会话隔离原型)维护。原型按已授权的续跑要求使用最小批次表,没有修改产品数据库。
|
||||
|
||||
来源覆盖、事实保留和短摘要须分别验收。覆盖以完整冻结消息集合及成功批次的区间并集判断;事实以精确来源引用和独立语义检查判断;导航必须索引全部叶子,生成前后核验叶子内容未变。真实实验中导航摘要确实省略了仍保留在叶子中的细节,因此产品查询和 UI 必须能访问叶子,不能只存最终 summary。模型的 reviewedTokens 回执仅参与结构校验,不能证明事实召回。
|
||||
|
||||
重复引文是已出现的定位歧义。原型保留同一已提交片段内全部精确匹配区间,标记 ambiguous 和候选数;这些位置都能重建原引文,但不冒充已确定的唯一发生位置,也不复制事实。生产接口需要携带该歧义或要求更长引文,禁止无提示地选第一次出现。来源中不存在的引文仍拒收。
|
||||
|
||||
成功叶子与覆盖区间一起提交,另一批校验失败不回滚已提交结果;重开时只处理缺失批次。测试脚本额外保存原始提供商响应,以便校验器修正后本地复核,不因此增加付费请求。该实验缓存不是新增的产品响应日志设计。无变化路径必须遍历所选批次并核验完整覆盖后返回零调用,不能因本轮预算耗尽就返回 no_change。
|
||||
|
||||
本次每叶 8,000 UTF-16 单元、并发 2、输出预留 16,384 token 只是在该模型和单会话样本上验证过的实验参数,不直接定为产品默认值。原型加载完整冻结来源,尚未满足生产有界内存采集;没有句界切分和上下文重叠,也未实现项目轮转、多层有界汇总、生产发布事务、自动 checkpoint 或继续 UI。导航关联保持空数组,跨项目身份和关系合并未作真实验证。第 11 节中的生产端到端场景仍需分别落实。
|
||||
@@ -19,9 +19,13 @@ FR-S1:将现有智能心跳入口整合、升级为监督者,不增加另一
|
||||
|
||||
应用默认关闭,用户显式启用后才接受新的回顾工作;关闭时保留计划和历史。默认值、已保存选择、自动运行条件及在途运行边界由[应用启停与执行](./logic-design.md#应用启停与执行)统一定义。
|
||||
|
||||
FR-S2:应用包含“工作回顾 / 故事线图谱 / 活动 / 设置”四个主视图。设置管理自动监督计划,活动展示实际执行及结果入口。原有计划、运行记录及用户启用、常驻偏好保留,继续使用既有应用和存储标识。
|
||||
FR-S2:应用包含“工作回顾 / 故事线图谱 / 自动监督 / 活动记录 / 设置”五个主视图。工作回顾提供统一监督结果阅读、历史选择和手动新回顾,结果显示自身范围与日期;自动监督集中展示计划状态、范围、周期及下次执行时间,以及运行概览、指标、趋势、自动监督报告、待处理记忆与行动建议和心跳审计,创建和编辑使用同一份 Modal 表单;活动记录展示统一实际执行、进度、详情及结果入口,支持按计划 ID 筛选;设置只管理超时、并发、分页、分批及执行预算,不嵌套次级菜单。计划保存失败保留草稿,关闭未保存修改须确认;编辑已暂停计划保持暂停,创建须显式保存并启用。原有运行记录及应用、存储标识保留。
|
||||
|
||||
FR-S10:活动同时覆盖手动监督回顾、定时心跳及用户立即运行的心跳。每条记录显示触发方式、范围、开始与结束时间、运行状态、失败原因和已有结果入口。同一次心跳的报告和下游监督回顾合为一条活动,报告保存成功不能掩盖下游仍在运行或失败。自动输入没有变化时显示“无变化(未调用模型)”。活动读取不调用模型,关闭应用后不查询活动。当前不提供监督取消或人工修改的时间序列审计;历史缺失不得猜测补齐。
|
||||
当前设置还支持分别调整报告与监督整理的模型超时,以及两者共用的监督并发数。并发设置不限制普通聊天,也不保证避免上游限流;排队不消耗模型阶段时限,降低并发不打断在途请求。取值及生效规则由[当前控制清单](./review-scheduling-design.md#当前超时与调度控制清单已实现)定义。
|
||||
|
||||
FR-S10:活动同时覆盖手动监督回顾、定时心跳及用户立即运行的心跳。每条记录显示触发方式、范围、开始与结束时间、运行状态、失败原因和已有结果入口。同一次心跳的报告和下游监督回顾合为一条活动,报告保存成功不能掩盖下游仍在运行、暂停或失败。活动读取不调用模型,关闭应用后不查询活动。新批次运行支持暂停及继续,保留成功批次;人工修改的时间序列审计尚未实现,历史缺失不得猜测补齐。
|
||||
|
||||
FR-S2:分页只控制数据库读取批量,不能限制最终处理范围。当前已开放来源页大小、每批正文/消息上限、执行软预算;这些配置在新建回顾时保存,继续沿用。当前字段和未来高级参数的边界见[生产接线](./review-scheduling-design.md#0-生产接线与剩余边界),交互见 [UI 设计](./ui-design.md#算法配置设置目标)。完整覆盖、来源校验与事实保留不作为可关闭选项。
|
||||
|
||||
## 范围与触发
|
||||
|
||||
@@ -33,6 +37,8 @@ FR-S5:会话右侧在跟随模式下展示当前会话的监督反馈;固定
|
||||
|
||||
FR-S6:监督者可提出整理与修改建议;已有会话监督的观察边界继续生效。自动更新图谱不能静默覆盖用户修改的描述、已确认的关系或已有知识库正文。取消整理后保留上次结果;失败说明受影响范围并允许重试,部分结果不得显示为完整回顾。
|
||||
|
||||
FR-S4、FR-S6、FR-S10 的验收要求:完整分页处理冻结范围内的入选来源;叶子事实和来源完整保留,摘要用于导航。预算耗尽或失败后保存成功批次与位置,重启后继续,不重复计算仍有效的成功批次;未读完或汇总未成功不能标完成。该续跑要求已进入生产接线,当前实现、实测范围与剩余差异见[回顾分块调度](./review-scheduling-design.md#0-生产接线与剩余边界)。
|
||||
|
||||
## 与知识库的关系
|
||||
|
||||
FR-S7:知识库管理资料、索引、检索和可复用知识;监督者管理工作事件、阶段总结与演变关系。故事线图谱共用现有来源,引用知识库对象,不复制一套资料正文,也不取代已有知识库图谱。
|
||||
@@ -49,6 +55,6 @@ FR-S9:来源事实、自动归纳、待核对关联和用户确认内容分别
|
||||
|
||||
首个完整流程为:启用监督者、选择范围、生成回顾、进入图谱、核对来源、携带选定上下文继续讨论。知识库双向定位与内容补充随后接入同一流程。图谱关系辅助检索需单独验证效果,不作为首版默认检索策略。
|
||||
|
||||
当前工作回顾和图谱读取生产结果,活动展示实际执行与无变化检查,自动监督设置复用已有计划。完整图谱回放、用户取消及应用市场尚未实现,验收证据见[实施进度](./progress.md)。
|
||||
当前工作回顾和图谱读取生产结果,活动展示实际执行与无变化检查、暂停和继续入口,自动监督设置复用已有计划。完整图谱回放及应用市场尚未实现,验收证据见[实施进度](./progress.md)。
|
||||
|
||||
具体 UI 与验收见[UI 设计](./ui-design.md)和[User Stories](./user-stories.md)。图谱对象与操作由[故事线图谱设计](../story-graph/prd.md)定义。已实现的实体身份和增量处理方式见[技术设计](./technical-design.md),来源旧版本能力仍受原应用限制。
|
||||
|
||||
@@ -4,18 +4,22 @@
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 状态 | 已接入自动增量、无变化状态、结果定位、目标过滤及同 scope 候选身份复用;完整历史回放和取消语义仍未完成 |
|
||||
| 日期 | 2026-09-20 |
|
||||
| 状态 | 生产分页、持久化批次、暂停/继续及设置已接线;27 条消息完整会话通过真实模型验证,较大样本仍未完成;完整历史回放未实现 |
|
||||
| 日期 | 2026-09-23 |
|
||||
| 产品设计 | [监督者应用产品设计](./supervisor-prd.md) |
|
||||
| 行为规则 | [监督者逻辑设计](./logic-design.md) |
|
||||
| 界面设计 | [监督者 UI 设计](./ui-design.md) |
|
||||
| 实施进度 | 共享契约、`SupervisorService`、SQLite schema 46、Preload IPC、定时投影、工作回顾、活动、结果图谱、来源读取、实体/关系状态操作、会话继续讨论、知识库预览写入和目标侧栏已接入 |
|
||||
| 实施进度 | SQLite schema 47;当前算法、设置和验收边界见[生产接线](./review-scheduling-design.md#0-生产接线与剩余边界) |
|
||||
|
||||
本文回答如何在现有 GoodBuddy 桌面端中实现监督者。它不改变产品范围,也不把模拟 Demo 当作生产数据模型。
|
||||
|
||||
当前实现边界:`src/main/assistant/supervisor-service.ts` 接收冻结的范围和时间区间,通过现有 AssistantDatabase 取得有界会话、任务、消息已有知识引用和已确认记忆,调用 ask Runtime 的结构化摘要器,校验来源引用与实体关系后在 SQLite 事务中保存。消息引用中的本地 library/document/chunk 和外部 locator 元数据写入监督来源;source-context 对本地引用调用现有 `KnowledgeService` 解析。记忆使用独立的 `memory` 来源类型,外部引用不触发远端全库检索。
|
||||
生产入口由 `supervision-production.ts` 组装服务、SQLite、共享池和 ask Runtime。`supervision-review-store.ts` 保存冻结来源清单,按有界页和片段供 `SupervisorService` 派发;叶子及连续位置先提交,导航和完整结果之后发布。消息已有知识引用保留本地或外部 locator,已确认记忆通过独立背景输入提供。不会检索外部全库。详细存储、调度及当前限制统一见[分块调度第 0 节](./review-scheduling-design.md#0-生产接线与剩余边界)。
|
||||
|
||||
模型实体 `id` 只在单次输出内有效。Main 从同一 scope 的故事线提供最多 100 个未撤销实体候选,模型可用独立的 `persistedId` 引用其中一个 UUID。服务校验候选集成员和重复映射,保存事务再次按实体主键校验故事线归属及撤销状态。没有 `persistedId` 时分配新 UUID,不按名称或裸模型 ID 合并。来源仍按每次结果分配 UUID,保留原始 `source_id` 和 locator。
|
||||
模型实体 `id` 只在单次输出内有效。Main 从同一 scope 的故事线提供最多 100 个未撤销实体候选,生产提示只暴露 `candidateRef`(如 `known_1`)、名称和说明。模型显式选择候选后,Main 转换为严格 UUID 类型的内部 `persistedId`。服务校验候选集成员和重复映射,保存事务再次按实体主键校验故事线归属及撤销状态。没有有效候选引用时分配新 UUID,不按名称或裸模型 ID 合并。来源仍按每次结果分配 UUID,保留原始 `source_id` 和 locator。
|
||||
|
||||
新实体省略 `candidateRef`,不要求模型生成数据库 ID。未知非空 `candidateRef`、冲突身份和候选集之外的 UUID 均拒绝。旧输出中的 `persistedId` 仅在 UUID 合法且属于候选集时复用;空值、占位符和格式错误值不能证明已有身份,保留为独立新实体。局部 ID 或同名不会触发合并。
|
||||
|
||||
真实旧库存在 `goodbuddy` 等文本实体主键。候选读取为这些键生成稳定 UUID 别名,并在 Main 内保留 `storageId` 到原键的映射;模型看不到这两个字段。别名使用 scope 和原键的 SHA-256 摘要构造 UUID v8,保存时按精确映射查询原实体,保留历史图谱引用和人工确认字段,不迁移或重写原主键。新实体仍由 Main 分配随机 UUID。此兼容仅处理已经存在的旧库键,模型返回同样的文本不能直接复用实体。实测见[真实失败运行修复](./progress.md#2026-09-24-真实失败运行身份修复)。
|
||||
|
||||
schema 42 为实体、实体变化和关系增加 `source_reference_ids_json`,保存映射后的来源 ID。升级只补列,旧记录、ID、确认状态及 locator 保留;此前未保存的引用使用空数组,已被覆盖或忽略的历史内容无法据此恢复。
|
||||
|
||||
@@ -31,21 +35,39 @@ schema 43 在结果上增加 `graph_snapshot_json`,保存当次实体名称、
|
||||
|
||||
继续讨论入队时,无附件请求省略 `serializedContexts`;请求未指定 Runtime 时使用会话保存的选择。知识库预览与提交均检查目标库存在且为本地可写库,更新实体还检查其实际所属库。侧栏确认框展示 Main 返回的实体字段、目标库和来源正文,取消或写入失败后可以重新预览。
|
||||
|
||||
手动监督 collector 将 UI 请求的 `timeRange` 原样传入 `buildHeartbeatInput` 的可选明确区间参数,查询时归一化为 UTC。消息按 `from <= created_at <= to` 在 LIMIT 前过滤,会话也在 LIMIT 前检查存在区间内消息;所选项目复用现有存在且 active 的校验。任务在创建时间或完成时间落入闭区间时收集,证据时间优先使用区间内完成时间,否则使用创建时间;任务状态为当前状态。手动心跳保留原有收集行为;自动运行使用下节的增量查询。
|
||||
监督来源清单将 UI 时间区间归一化为 UTC,先筛选再按稳定键分页。项目必须存在且 active;消息按闭区间筛选,任务按区间内创建或完成时间筛选。手动和自动监督共用该路径,自动清单另读取 supervisor checkpoint;手动心跳报告保留原有 collector。
|
||||
|
||||
已确认记忆作为当前背景收集,不受事件时间区间筛选;`occurredAt` 使用数据库 `updated_at`,locator 保存真实创建、更新时间及 `current-background` 标识。模型指令禁止将当前记忆内容推断成历史时点的内容或区间事件。记忆没有历史内容快照;本次修复不增加历史还原能力,也不追溯修正已有监督结果。既有会话、消息、任务及总证据预算继续生效,严格时间筛选不代表区间内所有记录都会进入摘要。
|
||||
已确认记忆作为当前背景,不参与新增正文覆盖。最多四条、每条 500 字符,时间来自真实更新时间;模型不能把背景引用为本批新增证据。旧结果继续保留原来源类型和 locator。监督正文上限现用于分批,余段继续处理;心跳报告的有界输入语义没有改变。
|
||||
|
||||
## 模型阶段超时与调度
|
||||
|
||||
监督整理超时由 run 创建时冻结;共享模型池仍采用实时设置上限。`supervision:pause` 取消该 run 的排队和在途工作,`supervision:resume` 继续已保存批次;监督整理输出在流中按 `supervisionReview.responseKiB` 检查响应容量,默认 1024 KiB,可在设置页调整为 100 至 16384 KiB。该容量每次请求读取当前设置,继续旧运行也采用新值;超限保留成功批次并提示调高后继续。生成摘要及事实内容不设独立短字符限制,监督旧摘要读取保留全文,具体边界见[生产接线](./review-scheduling-design.md#0-生产接线与剩余边界)。以下报告领取和租约规则继续适用。
|
||||
|
||||
手动和自动监督均在桌面 Main 调用生产工厂,Runtime 解析请求只有 `workMode: ask`,不携带 SSH 项目或执行空间。摘要校验、合并和持久化在 Main 完成;本次取消内容长度限制不改变 `gbagent`、远端 Runtime 启动或桌面到 Agent 协议。
|
||||
|
||||
`ApplicationSettingsStore` 持久化报告和整理模型超时,均为 30..600 整数秒,默认 240。报告排队前冻结,监督创建 run 时冻结;计时从获槽及 Runtime 解析后开始,覆盖模型执行及其内部重试。流结束校验 signal 和完成事件,finally 释放临时会话,心跳报告保持原有 100KB 上限,监督整理使用上文的可调响应容量。采集、排队、保存和清理不计入模型超时。
|
||||
|
||||
`supervisorModelConcurrency` 为 1 至 4 的整数,默认 1。报告和监督整理共用 Main 内 `SupervisionModelPool` FIFO 池,普通聊天不入池;降低上限不终止在途请求。报告槽位从领取前持有至报告完成或无变化提交后,在下游监督开始前释放,避免并发 1 时相互等待。监督服务外层运行仍串行;该池不是完整分块调度器,也不提供跨聊天与监督的提供商全局并发、RPM、TPM 或 Retry-After 控制。
|
||||
|
||||
报告租约为 `max(300, reportTimeoutSeconds + 60)` 秒,300 是下限;每次到期领取最多一条。Runtime 解析后、模型请求开始前按冻结超时刷新租约,数据库要求运行 ID、owner、attempt、claimed 状态和未过期条件均匹配,否则拒绝启动模型。直连模型独立的 600 秒传输超时、网络重试、心跳重领及轮询不属于用户阶段时限。设置 UI 提供两个超时、共享并发及分页/分批/软预算字段。
|
||||
|
||||
schema 47 的四张批次相关表使用外键随监督运行清理,未完成运行不新增自动过期删除规则。启动时原有 running 记录会标 failed,但已保存批次和配置保留,活动页仍可继续。发布逐页读取叶子并复用现有结果/来源/图谱写入,在同一事务更新完成状态和自动 checkpoint。
|
||||
|
||||
当前设置及冻结范围见[当前设置合同](./review-scheduling-design.md#当前设置合同)。未实现的高级参数继续保留在目标清单,不显示为可保存控件;没有兼容原型数据库的读取器。
|
||||
|
||||
## 自动增量收集
|
||||
|
||||
本节的 100 来源/2,000 码点批次查询现用于原心跳报告及旧服务测试;生产监督使用 schema 47 清单及批次位置,自动 checkpoint 只在完整发布时提交。已有 schema 46 指纹算法和 checkpoint 仍复用,不重置用户已处理位置。
|
||||
|
||||
对应 FR-S4、FR-S10 和 US-S27,行为定义见[自动增量与手动重看](./logic-design.md#自动增量与手动重看)。schema 46 在现有数据库增加 `review_checkpoints`,主键为阶段、规范化 scope 和来源标识,保存版本指纹、已处理位置和来源长度。来源标识区分消息 ID、任务 ID 和消息内知识引用位置,不使用消息时间戳作为身份。
|
||||
|
||||
消息正文写入时由 SQLite trigger 更新轻量 `review_revision`;范围、标题、角色和时间共同参与版本指纹。任务标题、状态、创建和完成时间,以及知识引用内容或定位变化分别使对应来源待处理。工具执行元数据更新不会把未修改的消息正文再次标为新增。删除来源时清理其进度。原始消息不复制到进度表;自动查询先排除已处理版本,再读取待处理片段,不重新载入每个会话的历史正文。
|
||||
|
||||
查询按来源时间和 ID 排序,在过滤之后取最多 100 个来源,每个来源每轮读取后续最多 2,000 个 Unicode 字符。自动心跳新证据正文预算为 12,000 个 JS 字符,监督为 44,000;最多四条各 500 字符的已确认记忆和最近 2,000 字符摘要提供背景,监督仍执行 100 条及 48,000 字符证据上限。自动路径取消“只取最新 20 个会话、每会话最新 20 条”的预筛选,预算遗漏和长正文剩余部分留到后续检查。已超出下一次滚动窗口的来源不会自动扩大范围读取。
|
||||
原心跳增量查询按来源时间和 ID 排序,每轮最多 100 个来源、每个最多 2,000 码点,正文预算 12,000 UTF-16 单元。该报告路径的余段留待后续检查,窗口外来源不自动补读。生产监督另用冻结清单和持久化批次,未读尾部不会因继续时的滚动窗口变化而消失;旧监督分支的 44,000/48,000 字符上限已退出生产接线。
|
||||
|
||||
只有实际送入模型、通过结果校验且成功落库的完整片段推进位置。心跳报告及其进度、监督结果及其进度分别在各自 SQLite 事务提交。监督服务串行执行,后续自动请求在前次保存后重新收集。报告成功而监督失败时,下一次自动检查跳过已成功的报告输入,但重试监督输入;无变化不创建报告、来源或图谱事件。
|
||||
|
||||
已有同 scope 故事线的 scope 表示和实体 ID 保留;比较项目集合时忽略排序。模型接收最近摘要和同 scope 最多 100 个未撤销实体的 ID、名称、说明,显式返回 `persistedId` 才复用。不同范围不合并,已有重复实体不自动修复。知识引用继续以独立来源保存 locator;当前记忆和旧摘要不作为新事件。
|
||||
已有同 scope 故事线的 scope 表示和实体 ID 保留;比较项目集合时忽略排序。模型接收最近摘要和同 scope 最多 100 个未撤销实体的候选引用、名称、说明,显式选择候选才复用,身份转换按上文执行。不同范围不合并,已有重复实体不自动修复。知识引用继续以独立来源保存 locator;当前记忆和旧摘要不作为新事件。
|
||||
|
||||
迁移在事务中扩展心跳计划及运行表的状态 CHECK,保留列、索引、ID、计划、报告与引用;消息版本列使用默认值,无需遍历或重写旧正文。进度初始为空,首次自动运行从配置窗口开始。报告保留期限覆盖 `no_change` 运行,但不删除来源进度;删除报告不触发重新消费。
|
||||
|
||||
@@ -53,10 +75,12 @@ schema 43 在结果上增加 `graph_snapshot_json`,保存当次实体名称、
|
||||
|
||||
对应 FR-S10、US-S26。schema 45 在既有 `supervision_runs` 增加可空 `heartbeat_run_id` 和唯一索引,在 `heartbeat_runs` 增加执行范围、下游投影状态、错误及结束时间字段。迁移保留原记录,不补造旧关联。监督服务通过 store 的 start/fail 接线记录执行,保存结果事务更新同一 run;不增加调度器。心跳在执行前记录冻结范围和投影进度,报告事务仍保持原有含义,下游失败单独保存。手动心跳在生产路径使用实际结束时间,活动等待下游结束后才显示整次执行的结束时间。
|
||||
|
||||
`supervision:activity` 沿用可信 sender 与 Zod 输入校验,接受 `limit`(1 至 100,默认 50)和 `offset`(0 至 100000)。应用未启用时返回空列表且不访问活动表。SQL 合并心跳及未关联的监督记录,关联查询使用运行 ID;返回状态、阶段、范围、时间、错误、摘要和 resultId,不调用模型。保留规则和历史缺失见[活动记录](./logic-design.md#活动记录)。
|
||||
`supervision:activity` 沿用可信 sender 与 Zod 输入校验,接受 `limit`(1 至 100,默认 50)、`offset`(0 至 100000)及可选 `configId`。应用未启用时返回空列表且不访问活动表。未筛选时 SQL 合并心跳及未关联的监督记录;筛选时在 LIMIT/OFFSET 前按 `heartbeat_runs.config_id` 精确匹配,排除独立手动回顾,不依赖计划名称或范围。关联查询使用运行 ID;返回状态、阶段、范围、时间、错误、摘要和 resultId,不调用模型。保留规则和历史缺失见[活动记录](./logic-design.md#活动记录)。
|
||||
|
||||
Preload 暴露类型化 `supervision.activity()`。`overview({ resultId })` 支持按 ID 读取历史回顾,供活动跳转使用。Renderer 只在活动页签和 heartbeat 路由同时激活时串行定时读取,每次有界分页;effect 清理撤销定时器并使旧响应失效。App 关闭应用时卸载页面;读取没有执行副作用。该改动位于桌面 Main/Renderer,未修改 Agent 或远程 Runtime 协议。
|
||||
|
||||
活动进度现在包含既有运行 JSON 中的持久 `phase` 及导航表计数 `navigationNodes`。`SupervisionReviewStages` 将实际阶段与监督运行状态组合呈现;`SupervisionBatchDetails` 按既有 10 批分页结果组织项目、会话和批次,新增批数变化时刷新已打开页。导航和叶子使用不同的严格输出 schema,继续仍复用成功叶子与导航节点。字段语义、旧记录缺失和同步阶段限制由[生产调度合同](./review-scheduling-design.md#已接入的调度与存储)统一定义;未增加任务调度器、数据库表或远程协议。
|
||||
|
||||
## 1. 总体方案
|
||||
|
||||
监督者作为 Main 进程中的一个领域服务,复用现有智能心跳的计划、运行领取、租约、重试和有界模型调用。图谱是监督者整理结果的查询视图,知识库继续拥有资料正文、索引和检索。
|
||||
@@ -100,7 +124,11 @@ flowchart LR
|
||||
|
||||
应用启停遵守[逻辑规则](./logic-design.md#应用启停与执行)。`ApplicationSettingsStore` 对新设置及缺失的 `heartbeatEnabled` 使用 `false`,保留显式布尔值。Main 在心跳 tick 调用 `processDue()` 前、`heartbeatsRunNow` 与 `supervisionRun` IPC 入口、心跳完成后的监督回顾回调中读取已保存设置,只有值为 `true` 才继续。此检查不取消已领取运行,也不改变普通任务调度链路。Renderer 由 App 将同一启用状态传入 `RightAssistantSidebar`,控制监督面板挂载。
|
||||
|
||||
设置默认选中既有 `plans` 面板,直接渲染 `HeartbeatSettings`,沿用 App → Preload → Main 的计划 CRUD 接线。`heartbeatRecurrenceSchema` 与 `computeNextHeartbeatRun` 仅支持 daily/weekly;本轮不增加分钟间隔合同或调度分支。编辑草稿保存已有 `timezone` 和 `enabled`,新建仅在显式提交时使用本机时区创建启用计划。UI 命名统一为自动监督,内部 ID、翻译键、数据库及 IPC 名称保留。
|
||||
`HeartbeatCenter` 的五个顶层页签直接选择内容,无内部页签。overview 只由 `SupervisorWorkspace` 读取 `supervision.overview` 的统一结果,历史选择和图谱共享 resultId;新请求控件不改变所选结果的 scope/timeRange。`HeartbeatSections` 仅在 plans 输出内容,包含 `HeartbeatSettings`、范围与刷新、运行概览、指标、趋势、自动监督报告、记忆与行动建议及审计;activity 只渲染 `SupervisorActivity`,settings 只渲染两个算法参数表单。运行中的手动请求保留既有结果,活动入口清空计划筛选并聚焦 activity。计划列表放在当前状态下,复用唯一创建按钮及未配置说明。计划表单在原组件内通过 body Portal 显示,复用 `custom-task-dialog` 和 `activateModalFocus` / `trapTabFocus`,没有复制表单或嵌套 form。关闭确认、提交锁定及失败草稿由本地状态管理;保存继续调用 App 原有心跳 CRUD 回调。
|
||||
|
||||
计划“执行记录”将 `activityPlanId` 交给活动查询,并切换、聚焦 activity 页签。更换计划时清空旧列表、重置 offset 并清理旧轮询,保留筛选控件的键盘焦点;该筛选不传入自动监督概览,返回 plans 时仍显示全部计划的统计和心跳审计。报告展开和追加条数保存在同一组件内,切换顶层页签仍保留;图谱继续由 `SupervisorWorkspace` 持有结果选择,活动结果跳转保留精确 resultId。此次仅调整桌面 UI 和只读活动查询,不修改 schema、Agent 或远程 Runtime。
|
||||
|
||||
计划 CRUD 沿用 App → Preload → Main 接线。`heartbeatRecurrenceSchema` 与 `computeNextHeartbeatRun` 仅支持 daily/weekly;本轮不增加分钟间隔合同或调度分支。编辑草稿保存已有 `timezone` 和 `enabled`,新建仅在显式提交时使用本机时区创建启用计划。UI 命名统一为自动监督,内部 ID、翻译键、数据库及 IPC 名称保留。
|
||||
|
||||
手动回顾和心跳回顾必须经过同一个 `SupervisorService.run()`,只在触发来源上区分。这样可以保证两者使用相同的范围校验、输入预算、输出契约、结果状态和来源处理。
|
||||
|
||||
@@ -126,10 +154,10 @@ sequenceDiagram
|
||||
|
||||
运行状态与内容确认状态分开保存:
|
||||
|
||||
- 当前监督运行状态:`running`、`completed`、`failed`、`no_change`。心跳及合并活动的映射见[活动记录](./logic-design.md#活动记录)。
|
||||
- 当前监督运行状态:`running`、`paused`、`completed`、`failed`、`no_change`。心跳及合并活动的映射见[活动记录](./logic-design.md#活动记录)。
|
||||
- 内容状态:来源事实、自动归纳、待核对、用户确认、用户修订、已移除关系。
|
||||
- 运行成功只表示模型结果已按契约保存,不表示所有实体和关系已经被用户确认。
|
||||
- 失败保留上次成功结果;取消和部分完成仍未接入生产状态。
|
||||
- 失败保留上次完整结果和本次已保存批次;暂停不生成完整结果,继续入口恢复同一 run。
|
||||
|
||||
## 3. 数据模型
|
||||
|
||||
@@ -165,14 +193,14 @@ erDiagram
|
||||
|
||||
外键和索引要求:
|
||||
|
||||
- 所有监督者对象使用 UUID;实体、来源和关系通过稳定 ID 关联,不能只按名称合并。
|
||||
- 新增监督者对象使用 UUID;已有文本实体主键按上文兼容映射保留。实体、来源和关系通过稳定 ID 关联,不能只按名称合并。
|
||||
- `supervision_runs` 按 `created_at`、`scope` 查询;事件按 `story_line_id, occurred_at` 查询。
|
||||
- 关系对 `(from_entity_id, to_entity_id, relation_type)` 建唯一约束,允许同一实体对存在不同关系类型。
|
||||
- 删除故事线只删除其组织关系,不删除共享实体、来源或知识库资料;删除知识库资料后来源标为不可用。
|
||||
- 整理结果、实体变化、关系变化和来源引用在同一 SQLite 事务中提交,提交失败全部回滚。
|
||||
- 只保存整理结果自身的对象内容与有界来源,不建立原会话、记忆或知识库的完整历史快照和独立向量索引。
|
||||
|
||||
模型输出使用版本化共享契约,至少包含 `events`、`entities`、`entityChanges`、`relations`、`summary`、`openItems` 和每项的 `sourceReferenceIds`。Main 必须做数量、字符、枚举、ID 所属范围和引用存在性校验,未知字段拒绝或按契约版本处理,不能直接把模型 JSON 写入数据库。
|
||||
叶子模型输出使用严格共享契约,包含 `events`、`entities`、`entityChanges`、`relations`、`summary`、`changeDigest`、`openItems`,事实项保留 `sourceReferenceIds`。Main 校验数量、字符、枚举、ID 所属范围和引用存在性,拒绝未知字段后才保存。导航输出另用[导航合同](./review-scheduling-design.md#已接入的调度与存储),允许省略空事实数组;该规则不适用于叶子。
|
||||
|
||||
## 4. Main、IPC 与 Renderer
|
||||
|
||||
@@ -267,5 +295,5 @@ IPC 返回图谱查询结果时使用分页和有界字段;详情中的来源
|
||||
- 实体与关系 revoke 保存状态;界面没有 undo 或恢复入口。
|
||||
- 跨 run identity 依赖同 scope 候选 UUID 的显式引用,不自动合并历史重复实体;模型漏选候选时会创建新身份。
|
||||
- 结果图谱使用真实事件实体连线,侧栏已按固定目标过滤并支持结果直达图谱;逐事件状态回放和 Experiment 尚未实现。
|
||||
- 用户取消及其旧结果保留尚未贯通监督运行的生产状态链路;自动 `no_change` 见[自动增量收集](#自动增量收集)。
|
||||
- 用户暂停已接到排队/在途 signal,并保留已保存批次;源版本变更后的局部重算、完整模型配置冻结及其他限制见分块调度第 0 节。
|
||||
- 监督知识实体与知识库正文条目仍是不同对象,知识正文只能通过现有条目定位和预览接口处理。
|
||||
|
||||
@@ -6,31 +6,69 @@
|
||||
|
||||
应用中心中的智能心跳入口升级为“监督者”,沿用既有启用、常驻与排序能力。未来应用市场使用同一应用身份。应用已启用时,停用单条自动心跳计划仍可手动回顾;关闭应用后,已打开页面显示关闭状态并禁用工作区操作。默认值及运行边界见[应用启停与执行](./logic-design.md#应用启停与执行)。
|
||||
|
||||
当前应用页使用共享 PageTabs 展示“工作回顾 / 故事线图谱 / 活动 / 设置”。打开设置直接显示“自动监督”配置;同级次要页签为“运行概览 / 待处理建议 / 报告与记录”。整个页面只有一个一级标题;监督者 bridge 不可用时显示明确错误,设置仍可访问,不回退到旧心跳概览。
|
||||
当前应用页只使用一套共享 PageTabs:“工作回顾 / 故事线图谱 / 自动监督 / 活动记录 / 设置”(英文活动标签为 Activity records)。自动监督独立管理计划;设置只显示模型超时与并发、回顾算法,不含计划、报告、审计或内部页签,也不显示整页全局徽标或独立刷新行。计划范围仍在表单和每条计划内显示。整个页面只有一个一级标题;监督者 bridge 不可用时显示明确错误,设置仍可访问,不回退到旧心跳概览。共享页签保留方向键、Home/End、游标焦点和单一激活面板,窄窗口横向滚动。
|
||||
|
||||
工作回顾只读取统一监督结果。顶部为紧凑的“新回顾”范围、时间、发起与刷新控件,不新增 Modal;简短帮助说明选择仅作用于新请求。历史结果选择与图谱入口位于正文之前,即使只有一条结果也显示选择器。新回顾工具栏、状态、历史选择和结果面板共用 `--content-reading`(820px)宽度,沿页面内容左侧对齐;结果内部按面板内边距排版,不再单独居中窄正文。正文使用“监督结果”标题,常显生成日期、真实范围和覆盖区间,历史结果不标为最新。工作总结按原有空行分段并保留换行;本次变化和未解决事项直接使用已有字段,不补写结论或截断正文。390px 下新请求字段与操作各占两列,结果元数据可换行。
|
||||
|
||||
新回顾运行中保留已显示结果及其日期、范围,禁用重复提交,并显示简短状态和活动记录入口;该入口清除计划筛选并聚焦活动页签。工作回顾不读取自动监督报告,也不显示自动报告空态、记忆与行动建议或第二行全局范围与刷新。无监督结果时显示手动回顾入口;自动报告是否为空不影响此判断。
|
||||
|
||||
## 活动
|
||||
|
||||
文案遵循根目录 [监督者文案规则](../../../UI-DESIGN.md#134-智能心跳):不把内部路线图、交付状态或实现缺项展示给用户。活动说明只描述手动回顾、自动监督执行及自动刷新;真实错误、失败和暂停状态仍展示,并保留恢复操作。事实详情提示展开批次并对照原文核对模型内容,不承诺完整语义识别;图谱说明实体状态以所选回顾结果为准。
|
||||
|
||||
对应 FR-S10、US-S26。活动按开始时间倒序,每页 50 条,提供较新/更早记录和刷新。列表保留触发方式、执行范围、开始/结束时间、实际状态、阶段状态、错误及已保存摘要。没有结果时不显示结果按钮;有监督结果时可分别进入该结果的工作回顾和故事线图谱,焦点移到目标页签。超过最近 20 条的结果仍按 ID 读取,不能回退最新结果。
|
||||
|
||||
活动页只展示统一监督活动、进度、详情及结果入口,不在列表下方重复显示自动监督概览或心跳审计。计划“执行记录”打开此页并按精确 ID 筛选,筛选器显示所选计划并提供清除;监督查询在分页前过滤。同名计划仍按 ID 区分;没有匹配记录时显示筛选无结果,不回退全部数据。自动报告正文和建议处理位于自动监督。
|
||||
|
||||
自动监督页依次展示范围与“刷新自动监督”、当前状态及计划列表、运行指标、报告趋势、待确认记忆与行动建议、“自动监督报告”历史、心跳报告阶段审计。刷新统一更新此页数据。报告与运行历史每次追加 20 条,报告可展开全部摘要和洞察,切换页签保留展开与分页位置;不再单独复制最近报告。建议保留确认、忽略、带入对话、标记完成及长内容展开。活动的计划筛选不改变自动监督的统计范围。当前状态下复用计划列表的唯一创建按钮,无计划时只显示列表的未配置说明,不叠加第二个计划空态或创建入口;点击直接打开现有 Modal。报告为空时明确写“暂无自动监督报告”,与工作回顾的结果状态区分。
|
||||
|
||||
加载、空记录和读取失败分开显示;读取失败保留已显示记录并提供就地重试。活动页面激活时,存在运行中记录则在上次读取结束 2 秒后刷新,否则 10 秒后刷新;每次最多一个请求。切换顶层页签、离开监督者或关闭应用后停止定时器,迟到响应不更新界面。错误后等待用户重试,不持续重发失败查询。
|
||||
|
||||
列表使用共享表面、边框、状态颜色和按钮。元数据按可用宽度换行,窄窗口保留字段标签、范围、时间和结果操作;长错误换行。状态同时使用文字。无变化显示“无变化(未调用模型)”,没有新结果跳转;阶段分别显示,旧回顾仍可从历史打开。修改审计缺失常显,不提供取消操作。
|
||||
活动列表与工具栏共用 `--content-dashboard`(1040px)宽度,沿页面内容左侧对齐。范围、计划筛选、清除筛选和刷新紧邻排列,空间不足时换行。列表使用共享表面、边框、状态颜色和按钮。每条运行首先显示类型、状态、开始时间和范围;“收集来源 / 整理批次 / 合并摘要 / 发布回顾”紧随其后,宽窗口使用按内容排布的紧凑状态行,窄于 720px 时两列,不为每个阶段铺设独立色块卡片。阶段读取已保存位置和真实运行状态,剩余来源为零不表示发布成功。旧运行没有阶段字段时显示“未记录”,不猜测失败位置;已提交来源清单可确认收集结束。无变化运行不显示新结果跳转,后续无需执行的阶段单独标注。
|
||||
|
||||
阶段下显示已保存批数、已读字符数、剩余来源和已保存导航合并数,运行中另显示排队或在途数。字符进度按码点统计,界面不展示 Unicode 术语。恢复操作先于详情:运行中可暂停,失败或暂停后沿用同一运行继续;已记录合并、发布阶段时分别显示“继续合并摘要”“重试发布”。成功叶子保留。来源失效时显示新建回顾提示,不提供无效继续。原始错误默认折叠,展开后的完整文本最多占 240px 高度,可滚动、选择复制和键盘聚焦;错误与恢复操作位于批次树之前。结束时间、覆盖区间、报告状态和已有摘要收进“运行详情与配置”,已保存配置在其中再次折叠。
|
||||
|
||||
“已保留事实与来源”展开后才查询既有批次接口,每页 10 批,按本页持久记录组成项目、会话、批次层级。项目使用可用名称,会话优先使用保存来源的标题;只有已保存批次标记“已保存”,不创建未落库的待执行、在途或失败叶子,也不把本页数量当作项目总量。批次摘要收起时最多两行,展开后保留完整摘要、事件、实体、变化、关系及原文片段。来源显示消息 ID、码点范围及版本;长原文局部滚动。原生 details/summary 保留键盘展开和可见焦点,轮询不主动展开用户收起的会话。加载、空批次和读取失败分开显示,失败可重试;换页失败不显示上一页批次,切换 run 后旧响应失效。暂停状态为“未完成,可继续”,手动回顾软预算暂停后在工作回顾页提示去活动继续,不显示完成通知。
|
||||
|
||||
## 自动监督设置
|
||||
|
||||
对应 US-S22 至 US-S24。表单直接展示名称、项目范围、每日或每周频率、指定时间、回顾窗口(1 至 720 小时)和历史保留(1 至 365 天);每周显示星期选择。时区常显,新建使用本机时区,编辑保留计划原时区。当前调度不支持分钟间隔,限制在表单上方常显。
|
||||
2026-09-23 当前已实现“模型超时与并发”表单:心跳报告与监督者整理分别设置,均为 30 至 600 的整数秒,默认 240;监督模型并发数为 1 至 4 的整数,默认 1。保存真实字段 `heartbeatReportTimeoutSeconds`、`supervisorOrganizeTimeoutSeconds`、`supervisorModelConcurrency`;无效输入不能提交,设置加载/保存中或锁定时禁用,失败保留草稿并提供重试。超时以阶段读取设置的时点为准,不改变已冻结的值;并发数影响后续派发,降低上限不打断在途请求。
|
||||
|
||||
无计划时显示“尚未配置自动监督,目前仅支持手动回顾”;全部暂停时另行说明。加载或首次读取失败不显示未配置状态。打开设置、填写字段、启用应用均不创建计划,只有点击“保存并启用计划”才提交创建。已有计划显示范围、周期、时区、回顾窗口、保留期限和启停状态,保留编辑、暂停、恢复、立即运行和确认删除;暂停时不显示待执行的下次时间。
|
||||
并发说明明确报告和监督整理共用上限,排队不计入模型超时;普通聊天不受此设置限制,但仍与监督竞争上游额度。表单不宣称提供商全局并发、RPM、TPM 或 Retry-After 限流已实现。
|
||||
|
||||
模型超时不包含数据收集与保存,直连模型另有独立 600 秒传输超时。“回顾算法”表单提供“每次读取来源条数”“每批文本量”“每批消息数”和“单次整理时长”,显示默认值及合法范围,使用“保存回顾算法”独立提交。文本量内部仍按 UTF-16 单元计算,界面不要求用户理解编码单位。保存经 App 的现有设置回调进入共享设置存储,加载/保存/锁定时禁用,失败保留草稿。取值以[当前设置合同](./review-scheduling-design.md#当前设置合同)为准。帮助说明执行时间达到软预算后,正在处理的批次完成并保存,再暂停,可从活动记录继续;已保存配置用“同时处理任务数”解释并发,说明实际并发还受当前监督设置限制。
|
||||
|
||||
对应 US-S22 至 US-S24。“自动监督”先显示计划列表,点击创建或编辑才打开 Modal;复用原表单,不保留页面内副本。表单展示名称、项目范围、每日或每周频率、指定时间、回顾窗口(1 至 720 小时)和历史保留(1 至 365 天);每周显示星期选择。时区常显,新建使用本机时区,编辑保留计划原时区。列表上方帮助说明选择每日或每周时间、保存并启用后自动运行。
|
||||
|
||||
无计划时显示“尚未配置自动监督,目前仅支持手动回顾”;全部暂停时另行说明。加载或首次读取失败不显示未配置状态。打开页面、Modal 或填写字段均不创建计划,只有点击“保存并启用计划”才提交创建。已有计划显示范围、周期、时区、回顾窗口、保留期限和启停状态,保留编辑、暂停、恢复、立即运行、执行记录和确认删除;暂停时不显示待执行的下次时间,编辑保存不改变暂停状态。
|
||||
|
||||
Modal 按[共享表单 Modal 规则](../../../UI-DESIGN.md#615-表单-modal)复用 header、body、footer:标题左侧、带本地化名称和工具提示的 X 右侧;底部取消次按钮、保存主按钮整体右对齐。标题和操作区保持可见,仅表单内容滚动。表单使用独立字段容器,不嵌套设置表单;窄窗口表单单列,保留共享窗口安全边距。
|
||||
|
||||
沿用整窗 Portal、共享遮罩、背景 inert、焦点循环与关闭后焦点恢复;初始焦点进入名称。X、Escape、取消或点击遮罩关闭时,有未保存修改先确认;确认初始焦点为继续编辑,Escape 或 X 只返回编辑,点击遮罩不放弃修改。保存期间禁止关闭和重复提交,失败在表单内显示并保留草稿。
|
||||
|
||||
界面及可访问名称统一使用“自动监督 / 回顾”,保留内部 heartbeat 标识及已有计划名称、报告正文。表单继续使用共享控件和容器响应式布局,建议及审计无需先进入即可配置计划。
|
||||
|
||||
### 算法配置设置目标
|
||||
|
||||
以下高级分组为目标交互;已接通的四项算法控件以上节为准。其余参数引用[设置配置清单](./review-scheduling-design.md#4-设置配置清单),不在 UI 文档另设数值,不增加一级页面。
|
||||
|
||||
普通配置常显消息每页条数、监督并发、报告/整理模型超时和单次执行软预算。高级配置按“来源与分块”“上下文与输出”“汇总与内存”“超时与续跑”“上游额度”分组。消息页字段的常显帮助为:“每次从数据库读取的消息数;会持续读完所选范围,不限制回顾总消息数,也不决定每次发给模型的消息数。”模型批次消息数、片段数和新增字符数分别标注,避免统称“批量大小”。
|
||||
|
||||
字段显示单位、已确定的默认值和合法范围;补充帮助说明调大后的内存、等待或模型用量影响。允许继承的节点超时显示“继承监督整理值”及解析后的秒数;依赖模型容量的输入/输出预算显示所用模型、容量及 token 是否为估算。跨字段校验覆盖输入与输出预留之和、扇入可容纳性、软预算与硬期限顺序、退避起始与上限;错误附在字段并关联可访问说明,提交时聚焦首个错误,Main 仍作权威校验。
|
||||
|
||||
规划中的“保存配置”持久化后只用于新建运行,常显“已开始和待继续的回顾沿用启动时配置”。“恢复本组默认值”只修改该组草稿,经保存才生效,不开始回顾、不修改已有计划;取消编辑恢复已保存值。运行详情展示本次实际配置,继续操作沿用它;想采用新算法配置时使用“重新回顾”,说明会重新计算。当前已实现字段仍按上文的阶段读取和共享池生效方式工作,整次 run 冻结接线完成后再统一调整提示。
|
||||
|
||||
初次加载、读取失败、编辑、保存中、保存失败和已保存分别呈现;读取失败不填假默认值,保存失败保留草稿并允许重试。保存成功使用应用通知,字段错误就地显示,不重复通知。窄窗口按单列排列,折叠标题可键盘操作,单位和关键生效说明不藏进悬浮帮助。
|
||||
|
||||
只在真实 Main/存储/运行路径接通后显示相应可编辑字段;尚未实现的配置留在设计文档,不放置永久禁用的假控件。已接通但因加载、保存或依赖缺失而临时不可编辑时说明实际原因。上游额度明确显示适用连接/模型和是否包含普通聊天;未实现跨路径共享时不得标为提供商全局限制。覆盖完整性、来源校验及事实保留不提供开关。
|
||||
|
||||
## 工作回顾
|
||||
|
||||
当前页面提供全局或单项目范围,以及 1、7、30 天时间区间选择。没有自动计划也能手动回顾;成功结果显示自身冻结的范围、时间和未解决事项,可选择历史结果或进入图谱。来源筛选由本次回顾范围和时间限制;图谱详情只列出所选事件的关联来源,实体或关系列出相关事件的来源。独立的来源类型选择器尚未实现。
|
||||
|
||||
选择历史结果后,图谱读取该结果的成员和内容,标题显示其回顾区间和生成时间。切换时清空旧图谱和详情并显示加载状态,迟到请求不得替换新选择。确认、修订和移除反馈更新当前所选结果,后续自动回顾不改写旧结果。
|
||||
|
||||
手动“回顾当前进展”是主要操作,生成中禁用重复提交并显示进行中文案。范围说明明确此操作会重新整理所选区间内已回顾的来源,自动监督只处理新增或修改片段;删除报告不会重置自动进度或重建图谱。失败保留上次结果与本次请求范围,提供重试。取消和部分来源遗漏的专门状态仍属于目标设计。
|
||||
手动“回顾当前进展”生成中禁用重复提交。该操作新建回顾,活动页“继续”恢复原 run;两者不得混淆。失败保留上次结果、本次范围和成功批次。手动操作不推进自动位置,删除报告也不重置自动位置。
|
||||
|
||||
## 会话侧栏
|
||||
|
||||
@@ -55,3 +93,7 @@
|
||||
按实际内容容器宽度响应:不超过 `1190px` 时变为 `184px` 列表加画布,详情移到下方;不超过 `860px` 时变为单列,画布优先,列表限制高度并独立滚动。SVG 最小宽度为 `660px`,窄屏只在画布内部横向滚动,页面本身不横向溢出。范围、时间和操作可换行。节点、关系与事件均可从列表选择,画布节点支持 Enter、Space 和可见焦点。加载、无数据、读取失败和服务不可用各自呈现,错误提供可行的恢复说明或重试入口。
|
||||
|
||||
隔离视觉验证使用 `tests/support/supervisor-layout-regression.tsx` 渲染生产 React 组件;所有输入标为模拟 fixture,不读取用户数据库或调用模型。`tests/supervisor-layout.electron.test.ts` 启动 Vite 与 Electron,通过 `executeJavaScript` 测量布局、`capturePage` 截图,覆盖 1440、1024、390px、浅深主题、长名称、密集事件和异常状态。可通过 `GOODBUDDY_SUPERVISOR_ARTIFACTS` 保留截图;交互预览入口为 `node tests/support/supervisor-preview.mjs`。
|
||||
|
||||
设置 `GOODBUDDY_SUPERVISOR_PLAN_MODAL=1` 可只验证五页签 fixture 中的计划 Modal:创建和编辑各覆盖浅深主题、1440×1100、390×1100、390×480,检查关闭按钮、底部按钮对齐、正文滚动、鼠标命中和原生键盘操作。截图及测量写入同一产物目录。
|
||||
|
||||
设置 `GOODBUDDY_SUPERVISOR_RECAP=1` 可验证本次工作回顾分区:1440×1100 和 390×1100 下覆盖监督结果与自动报告均有内容、仅有监督结果、两者均空,另检查历史结果运行中仍可阅读以及活动入口。该分支检查每页一处刷新、自动报告和建议的归属、正文段落与宽度,并截取自动页建议、展开报告和审计区块。
|
||||
|
||||
@@ -97,8 +97,11 @@
|
||||
|
||||
| Given | When | Then |
|
||||
| --- | --- | --- |
|
||||
| 用户打开监督者设置 | 查看默认内容 | 直接显示自动监督表单,包含名称、项目范围、每日/每周频率、指定时间、时区、回顾窗口和保留期限;说明不支持分钟间隔 |
|
||||
| 应用已启用但没有计划 | 打开设置或填写字段 | 显示“尚未配置自动监督,目前仅支持手动回顾”,不自动保存、创建计划或发起运行 |
|
||||
| 用户打开自动监督 | 查看计划列表并点击创建或编辑 | Modal 显示名称、项目范围、每日/每周频率、指定时间、时区、回顾窗口和保留期限;页面说明选择每日或每周时间、保存并启用后自动运行 |
|
||||
| 应用已启用但没有计划 | 打开自动监督或填写 Modal 字段 | 显示“尚未配置自动监督,目前仅支持手动回顾”,不自动保存、创建计划或发起运行 |
|
||||
| 用户修改计划草稿 | 保存失败或关闭 Modal | 失败保留输入并可重试;Escape、取消和遮罩关闭均先确认放弃,继续编辑保留草稿 |
|
||||
| 已有计划处于暂停状态 | 编辑并保存 | 更新计划字段,保持暂停;只有显式恢复才启用 |
|
||||
| 两条计划名称相同 | 点击其中一条的执行记录 | 打开统一活动记录并按所选计划的精确 ID 筛选;可清除筛选,不影响自动监督页的概览和审计 |
|
||||
| 用户完成配置 | 点击保存并启用计划 | 保存明确选择的频率、时间、范围和期限,参与既有调度 |
|
||||
| 用户编辑已有计划 | 修改字段并保存 | 计划卡片显示新配置、下次运行和上次状态 |
|
||||
| 已有计划暂停且时区与本机不同 | 编辑并保存 | 保留已暂停状态及原时区,不隐式恢复或改变执行时间 |
|
||||
@@ -530,6 +533,9 @@
|
||||
| 活动读取失败 | 点击重试 | 保留可用记录并重新读取,不调用模型 |
|
||||
| 活动有在途请求 | 离开页签、页面或关闭应用 | 停止后续刷新,迟到响应不更新界面;关闭后不查询活动 |
|
||||
| 旧记录缺少范围或运行关联 | 查看活动 | 明确显示缺失,不根据当前计划或相近时间推断 |
|
||||
| 六个来源批次已保存,剩余来源为零 | 导航合并失败后打开活动 | 已记录的合并阶段显示失败,发布保持未完成;继续复用成功叶子和导航节点 |
|
||||
| 已保存批次跨多个项目和会话 | 展开事实并翻页 | 按本页真实归属分层,标明本页数量;原文可读,失败叶子不伪造为已保存 |
|
||||
| 原始错误是多行校验 JSON | 展开错误详情 | 默认折叠,展开后有界滚动,完整文本可选择复制;恢复操作和阶段仍在其前面 |
|
||||
|
||||
取消和人工修改时间序列审计不属于当前已实现范围;实际状态及保留规则见[活动记录](./logic-design.md#活动记录)。
|
||||
|
||||
@@ -554,7 +560,7 @@
|
||||
|
||||
建议实施顺序:
|
||||
|
||||
1. 设置默认显示自动监督配置,保留运行概览、建议、报告和审计面板,以及计划 CRUD 与范围校验。
|
||||
1. 顶层有工作回顾、故事线图谱、自动监督、活动记录、设置五项。自动监督保留计划 CRUD 与范围校验,创建和编辑使用同一 Modal 表单;运行概览、指标、趋势、自动监督报告、建议和心跳审计与计划列表同页,无计划时只有一处未配置说明和一个创建按钮。工作回顾只阅读统一监督结果,新请求的范围和运行状态不改变旧结果的日期、范围及正文;自动报告为空时不会在成功结果下显示“没有报告”。历史选择位于正文前,图谱打开所选结果的精确 ID。活动记录只保留统一执行、进度和详情。设置只显示算法参数,没有计划、报告、审计、第二套页签、整页范围徽标或独立刷新行。
|
||||
2. 增加监督者统一的工作回顾和共享结果模型。
|
||||
3. 接入最小故事线图谱:时间事件、知识实体、实体变化、来源和时间回放。
|
||||
4. 接入文字列表、窄屏和键盘操作,以及失败、取消和部分来源状态。
|
||||
|
||||
@@ -2,13 +2,15 @@
|
||||
|
||||
Smart Heartbeat 已提供按计划或手动执行的有界回顾,生成报告及后续建议。应用默认关闭;启用及计划条件见[应用启停与执行](../conversation-supervision/logic-design.md#应用启停与执行)。条件或事件唤醒仍需后续设计。
|
||||
|
||||
现有入口已升级为“监督者”,智能心跳作为其定期唤醒机制,驱动检查与整理;应用内部提供工作回顾和故事线图谱。定义见[监督者应用产品设计](../conversation-supervision/supervisor-prd.md),实施方案见[监督者技术设计](../conversation-supervision/technical-design.md)。现有计划和范围保留,监督调用继续禁止工具执行。
|
||||
现有入口已升级为“监督者”,智能心跳作为其定期唤醒机制,驱动检查与整理;应用提供工作回顾、故事线图谱、自动监督、活动记录和设置五个页签。计划在自动监督管理,创建与编辑使用 Modal;设置只保留算法参数。定义见[监督者应用产品设计](../conversation-supervision/supervisor-prd.md),实施方案见[监督者技术设计](../conversation-supervision/technical-design.md)。现有计划和范围保留,监督调用继续禁止工具执行。
|
||||
|
||||
自动报告及监督回顾分别按来源版本和已读位置处理增量;没有待处理输入时记录无变化,跳过模型及新报告。手动历史重看和删除报告的边界见[自动增量规则](../conversation-supervision/logic-design.md#自动增量与手动重看)。
|
||||
|
||||
## 文档导航
|
||||
|
||||
监督者“活动”页签同时显示手动回顾和心跳执行,将新心跳报告与下游监督按运行 ID 合并,保留各阶段真实状态。原设置中的报告与记录继续读取心跳报告自身状态;完整执行状态以[活动规则](../conversation-supervision/logic-design.md#活动记录)为准。
|
||||
当前监督者设置已接入报告与监督整理两项模型阶段超时(30 至 600 秒,默认 240)及共享监督并发数(1 至 4,默认 1),模型超时不包含排队、采集、保存或整次执行期限。报告先获槽再领取,实际请求开始前校验并刷新租约,报告提交或无变化后释放槽位再进入监督。普通聊天不入监督池,尚无跨聊天与监督的提供商全局并发或 RPM/TPM 限制。租约、固定传输时限及重试与用户超时分开,见[控制清单](../conversation-supervision/review-scheduling-design.md#当前超时与调度控制清单已实现)。完整分页与持久化续跑仍为设计,不能把现有增量检查称为完整调度器。
|
||||
|
||||
监督者“活动记录”页签同时显示手动回顾和心跳执行,将新心跳报告与下游监督按运行 ID 合并,保留各阶段真实状态。心跳审计、运行概览、指标、趋势、自动监督报告阅读和建议处理与计划列表同在自动监督页;工作回顾只读取统一监督结果,设置只保留配置。当前布局见[监督者 UI 设计](../conversation-supervision/ui-design.md#应用入口)。心跳审计继续读取报告自身状态,完整执行状态以[活动规则](../conversation-supervision/logic-design.md#活动记录)为准。
|
||||
|
||||
| 文档 | 权威职责 |
|
||||
| --- | --- |
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
### 1.1 智能心跳是独立能力
|
||||
|
||||
- “监督者 > 设置”是自动监督配置、报告、建议和运行历史的权威位置;内部继续沿用 heartbeat 标识。
|
||||
- “监督者 > 自动监督”是计划管理、自动监督报告阅读和建议处理的权威位置,创建与编辑使用 Modal;工作回顾只阅读统一监督结果,运行活动位于活动记录,设置只管理算法参数。内部继续沿用 heartbeat 标识。
|
||||
- 任务中心和设置中心不复制完整心跳配置表单。
|
||||
- 智能心跳不并入通用自动化中心,也不作为任务中心条目。
|
||||
- 现有心跳报告、记忆建议、行动建议和审计历史在本轮继续保留。
|
||||
@@ -50,7 +50,7 @@
|
||||
|
||||
### 2.1 目标
|
||||
|
||||
1. 完整自动监督配置统一到“监督者 > 设置”,打开后直接展示表单。
|
||||
1. 完整自动监督配置统一到“监督者 > 自动监督”,创建与编辑复用同一 Modal 表单。
|
||||
2. 心跳配置支持 `Global` 或指定一个、多个 Project。
|
||||
3. 保留现有概览、待处理建议、运行历史和报告能力。
|
||||
4. 新入口完整可用后,再移除任务中心和设置中心中的重复心跳配置。
|
||||
@@ -124,11 +124,11 @@
|
||||
|
||||
| 操作 | 权威入口 | 其他位置 |
|
||||
| --- | --- | --- |
|
||||
| 创建或编辑自动监督配置 | 监督者 > 设置(默认显示) | 不复制表单 |
|
||||
| 选择 Global / Project 范围 | 监督者 > 设置 > 自动监督 | 不依赖当前项目推断 |
|
||||
| 暂停、恢复、立即运行或删除 | 监督者 > 设置 > 自动监督 | 不复制操作 |
|
||||
| 查看报告与待处理建议 | 监督者 > 设置 | 保留既有结果 |
|
||||
| 查看运行历史和失败 | 监督者 > 活动 | 按同一次执行展示心跳报告和下游监督状态;设置 > 报告与记录保留报告本身的历史 |
|
||||
| 创建或编辑自动监督配置 | 监督者 > 自动监督 > 创建或编辑 Modal | 不复制表单 |
|
||||
| 选择 Global / Project 范围 | 监督者 > 自动监督 > 创建或编辑 Modal | 不依赖当前项目推断 |
|
||||
| 暂停、恢复、立即运行或删除 | 监督者 > 自动监督 | 不复制操作 |
|
||||
| 查看自动监督报告与待处理建议 | 监督者 > 自动监督 | 保留既有结果及处理操作 |
|
||||
| 查看运行历史和失败 | 监督者 > 活动记录;自动监督 | 活动按同一次执行展示心跳报告和下游监督状态;自动监督页保留报告本身的运行审计 |
|
||||
| 管理平台级默认值 | 设置中心 | 不显示单条计划 CRUD |
|
||||
|
||||
移除重复入口的顺序:
|
||||
@@ -141,12 +141,7 @@
|
||||
|
||||
## 5. 智能心跳页面
|
||||
|
||||
监督者设置保留四个面板,默认打开自动监督:
|
||||
|
||||
- **自动监督**:唯一完整配置入口,界面规则见[监督者 UI 设计](../conversation-supervision/ui-design.md#自动监督设置)。
|
||||
- **运行概览**:状态、成功率、记忆、洞察和行动统计。
|
||||
- **待处理建议**:记忆建议和行动建议。
|
||||
- **报告与记录**:回顾报告与 Run 审计。
|
||||
五页签归属以[监督者 UI 设计](../conversation-supervision/ui-design.md#应用入口)为准:自动监督管理计划并显示运行概览、统计、趋势、自动监督报告、建议和 Run 审计,设置只展示算法参数,工作回顾阅读统一监督结果及历史,活动记录只展示统一执行、进度和详情,并支持按计划 ID 筛选。原有 CRUD、建议处理、报告展开及分页能力保留,不在设置内部再建页签。
|
||||
|
||||
### 5.1 心跳计划
|
||||
|
||||
@@ -201,7 +196,7 @@ type HeartbeatScope =
|
||||
- Main 在创建、编辑、列出和执行时验证 Project 归属。
|
||||
- Global 读取所有 Project 的有界会话和任务,但长期记忆仍只读取 Global。
|
||||
- 指定 Project 读取选中项目的有界会话和任务,以及 Global 与选中项目记忆。
|
||||
- 现有输入条数、字符预算、输出大小、超时、重试、租约和工具禁用边界继续生效。
|
||||
- 现有输入条数、字符预算、输出大小、超时、重试、租约和工具禁用边界继续生效。报告与监督整理共用监督专用并发池,普通聊天不入池;具体设置、租约和未实现的限流边界见[当前控制清单](../conversation-supervision/review-scheduling-design.md#当前超时与调度控制清单已实现)。
|
||||
- 多项目汇总后统一应用上限,不能按项目倍增预算。
|
||||
- 心跳结果默认不在系统通知中暴露私人正文。
|
||||
- 数据迁移必须使用 SQLite 事务,保留外键、级联删除和现有历史。
|
||||
@@ -215,7 +210,7 @@ type HeartbeatScope =
|
||||
- 扩展共享 Schema、Preload 与 Main 数据合同。
|
||||
- 增加 Global / 多 Project 持久化与旧数据迁移。
|
||||
- 让心跳执行按冻结范围构建有界输入。
|
||||
- 在“监督者 > 设置 > 自动监督”中完成创建、编辑和全部计划操作。
|
||||
- 在“监督者 > 自动监督”中完成全部计划操作;创建和编辑使用同一 Modal 表单。
|
||||
- 补齐范围、迁移、权限和界面测试。
|
||||
|
||||
### 已完成:移除重复配置
|
||||
@@ -236,7 +231,7 @@ type HeartbeatScope =
|
||||
|
||||
## 8. 验收状态
|
||||
|
||||
- [x] 监督者设置是完整自动监督配置的唯一权威入口。
|
||||
- [x] 监督者的自动监督页签是完整计划配置的唯一权威入口。
|
||||
- [x] 用户可以创建和编辑 `Global` 心跳。
|
||||
- [x] 用户可以创建和编辑绑定一个或多个 Project 的心跳。
|
||||
- [x] 切换当前 Project 不会改变已保存范围。
|
||||
|
||||
Reference in New Issue
Block a user