dsh-explain PRD(P0 定稿)
September 2, 2026 · View on GitHub
状态:P0 定稿;M9 可校正学习画像实现(2026-09-02)。实现证据见 验收矩阵。 技术方案见 ARCHITECTURE.md;本文档与架构 v12 同步。
定位
学习模式把多个 DSH 工作会话中值得学习的内容汇入用户唯一的全局学习线程。explain 自主判断每个来源会话是否需要讲解;同一来源会话最多有一个等待反馈的讲解,不同来源会话可以各自拥有讲解。用户通过「✓ 懂了 / ✗ 没懂」结束或继续对应来源会话的知识点。
explain 维护一份不进入主 Agent 的全局 ExplainContext,用来判断用户当前的对话偏好、知识水平和学习进展。全局线程在用户连续 30 分钟未操作 explain,或下一次 explain 模型请求的预计上下文占模型容量 50% 以上时压缩;压缩更新 ExplainContext,不删除用户可见的原始学习记录。
学习模式服务于正在使用 DSH 工作的用户,不按身份分类。讲解价值和深度取决于当前工作涉及的知识是否超出用户已有认知,以及历史反馈表现出的解释偏好。
术语与作用域
| 术语 | P0 定义 |
|---|---|
| 本地用户 | 一个 $DSH_HOME。P0 不等同于云账户,也不跨设备同步 |
| 来源会话 | 提供学习素材的顶层 DSH Session |
| 全局学习线程 | 该 $DSH_HOME 下唯一、跨来源会话和重启保留的有序学习记录 |
| 活跃讲解 | 绑定一个来源会话、当前等待用户反馈的最新 revision;每个来源会话最多一个,全局可以有多个 |
| 候选知识点 | 来源回合结束后提交给 explain 调度器、尚未生成讲解的临时素材 |
ExplainContext | explain 私有的全局上下文快照,由受限来源观察、对话偏好、知识概况和学习进展组成,只提供给辅助 explain 模型 |
| 压缩检查点 | 对已关闭讲解和既有 ExplainContext 的有界摘要;替代旧内容进入后续 explain 模型请求,但不替代 UI 历史 |
| explain 操作 | 用户成功执行 /explain on、普通/selection/answer 显式学习请求、提交 ✓ / ✗ 或撤销掌握;status、仅打开、阅读或切换「学习」视图不算操作 |
| 上下文占用 | 完整预计 explain 请求 token 加输出预留量,占所选 provider/model contextWindow 的比例 |
用户从未操作 explain 时,30 分钟不活跃计时从第一条产生可持久数据的 explain 决策(可见讲解或只有 observation 的 skip)提交时开始。成功的 explain 操作会重置计时;模型生成、后台压缩、页面刷新和单纯阅读不会重置。
产品不变量
- 一个用户只有一条学习线程:来源会话可以并发,所有记录按一个全局顺序提交。
- 讲解按来源会话隔离:同一来源会话最多一个活跃讲解;该讲解未反馈时只阻塞本来源的新讲解,不阻塞其他来源会话。
- 辅助模型全局单飞:主动讲解、自主讲解、重讲和压缩共享一个调度器,全局最多一个 explain 模型请求。
- 反馈只推进目标讲解:✓ 关闭目标来源的当前 Topic;✗ 只重讲目标来源的当前 Topic。没有反馈时,该来源保持等待。
- 学习事实用户全局有效:Topic 的已掌握状态跨来源 Session 生效;同一
TopicKey全局最多一个活跃讲解,fork 与恢复不复制独立副本。 - 主工作不受控制流影响:explain 不阻塞主 turn,不修改主模型输入,不注入消息,也不向主 agent steer。
- 模型上下文有界:压缩只改变后续辅助模型看到的历史;原始学习记录、反馈和来源坐标继续保留并可在 UI 中读取。
P0 功能清单
| 功能 | P0 行为 |
|---|---|
| 全局开关 | /explain on、/explain off、/explain status;默认关闭,作用于整个 $DSH_HOME |
| 主动学习 | composer 输入 /explain <学习请求>;请求不发送给主 Agent,由 explain agent 结合全局 ExplainContext 和当前来源最近一个合格回合生成一条不能 skip 的讲解 |
| Explain 快捷入口(P1,M6 已实现) | Explain 自己在 composer 工具行填写 /explain --selection <text>,并在已完成 assistant 回答上填写 /explain --answer <turn> <request>;都不自动提交、不覆盖非空草稿,Advisor 只经用户显式选中进入 |
| 自主选题 | 只观察顶层 Session 中正常完成且包含非空 assistant 输出的回合;explain 可以返回“不讲” |
| 来源讲解槽 | 每个来源 Session 最多一个活跃讲解,可以没有;有活跃讲解时仍保留本来源最新一个候选 |
| 全局单飞 | 全局最多一个辅助模型请求;主动请求、复习评估、重讲、压缩和自主候选按明确优先级串行执行 |
| 自主调用预算 | 自主判断默认最多发送 50 次/滚动 24 小时;发送失败与重试也计数,耗尽后候选暂停,用户触发的主动讲解、重讲与压缩不占额度 |
全局 ExplainContext | 汇总对话偏好、知识概况和学习进展;每次主动讲解、自主讲解和重讲都读取,永不进入主 Agent 请求 |
| 可校正学习画像(M9) | 展示长度、结构、示例、术语和 Topic 熟悉度推断的信心与来源;支持纠正、忘记和显式偏好,优先级固定为显式偏好 > 用户修正 > 模型推断 |
| 自动压缩 | 连续 30 分钟无 explain 操作,或预计上下文占用大于 50% 时,压缩尚未纳入检查点的 observations 与已关闭讲解 |
| 学习界面 | DSH 主对话区 conversation.view 中的「学习」Tab,按全局顺序显示历史,并突出当前来源会话的活跃讲解 |
| 讲解内容 | 标题、是什么、为什么、常见坑;字段有长度限制 |
| 来源标记 | 显示来源 Session、turn 和时间;P0 不承诺跨 Session 一键跳转 |
| ✓ 懂了 | 将目标 Topic 标为全局已掌握并关闭该来源的活跃讲解;其他来源的活跃讲解不变 |
| ✗ 没懂 | 保持同一 ExplanationId、TopicId 和来源 Session,生成 revision + 1 |
| 撤销掌握 | 已掌握状态提供「撤销」操作;撤销不自动生成讲解,只允许未来再次命中该 Topic |
| 本地持久化 | 学习历史、反馈、Topic 状态、来源活跃状态、压缩检查点、ExplainContext 和全局顺序写入 $DSH_HOME/dsh-explain/v1/thread.sqlite |
| 复习闭环(M8) | 新掌握概念次日进入复习;每轮最多三道回忆/应用/辨析题,评估为掌握/模糊/遗忘,按确定性间隔排期并回链来源 |
| 数据管理(M7–M9) | 设置页导出版本化、脱敏的 dsh-explain-backup-v3.json,包含复习历史、有效学习画像及修改审计;输入 CLEAR 并通过 store revision CAS 后原子清除学习内容,同时保留 settings、运行租约和滚动自主额度计数 |
| UI 依赖 | 只使用 DSH 第一方 conversation.view、conversation.input.left 和 conversation.chat.assistant-actions 槽位;P0/P1 不引入外部 UI 插件 |
交互与调度流程
- 全局开关为 on 时,
/explain <学习请求>进入当前来源的显式请求队列;来源已有活跃或待处理主动讲解时立即返回稳定冲突,不发送模型请求。 - 主动请求优先于尚未开始的重讲、自主候选和不活跃压缩;若后台自主生成或 idle 压缩在途则取消并先处理主动请求,已在途的主动请求或重讲不被抢占。
- 主动模型必须返回讲解,不能返回
skip;提交时重新校验来源活跃槽和全局 Topic 活跃门。既有已掌握 Topic 可由用户的显式请求重新进入 learning,既有活跃 Topic 则拒绝重复讲解。 - 没有主动请求时,调度器从没有活跃讲解的来源会话中选择最早的自主候选;其他来源正在等待反馈不构成阻塞。
- 自主模型返回
skip时不创建用户可见记录,继续处理下一候选;返回explain时只有来源和 Topic 门仍成立才提交。 - 用户选择 ✓ 后,目标 Topic 进入全局已掌握状态,目标来源讲解关闭;调度器可以处理该来源等待的最新候选。
- 用户选择 ✗ 后,调度器重讲目标讲解;成功后追加同一
ExplanationId的下一 revision,继续等待反馈。 - 自主调用达到滚动 24 小时上限后只暂停自主候选;主动讲解、重讲和压缩不消耗自主额度,仍可按单飞规则运行。
压缩与全局 ExplainContext
触发规则
- 不活跃触发:存在尚未纳入检查点的 context observation 或已关闭讲解,且距离最近一次 explain 操作已满 30 分钟时,调度器安排一次后台压缩。若用户从未操作,使用第一条产生可持久数据的 explain 决策提交时间作为基线。
- 压力触发:主动讲解、自主讲解或重讲请求完整渲染后,预计上下文占用大于 50% 时,必须先压缩可压缩内容,再重新估算请求。
- 无内容时不调用:没有新的 observation 或已关闭讲解可压缩时,触发检查是 no-op,不产生模型请求,也不反复轮询。
- 活跃内容不压缩:任何仍等待反馈的 Explanation 及其 revisions 保持逐字可用,直到关闭后才进入后续压缩批次。
- 失败不丢数据:压缩失败不标记任何内容为已覆盖;不活跃压缩等待下次触发,压力压缩则阻止当前辅助请求并显示稳定错误。
上下文占用基于 DSH 的固定 token 估算和所选模型的 contextWindow,计算范围包括固定 prompt、当前 SourceCapsule、最新 ExplainContext、尚未压缩的 observations/学习内容、所有活跃讲解和 maxOutputTokens 预留。provider/model 的 adapter 未公开也未配置容量时,/explain on 明确失败,因为 50% 阈值没有可计算的分母。
ExplainContext 内容
| 分区 | 内容 | 权威性 |
|---|---|---|
| 对话偏好 | 当前来源回合表现出的表达偏好,以及历史上偏好的讲解长度、结构、示例方式和术语密度 | 模型推断;只允许封闭类别,带置信度和来源坐标,不得当作用户明示事实 |
| 知识概况 | 当前来源回合表现出的 Topic 熟悉度,以及已掌握、正在学习和仍不确定的主题概览 | Topic 状态和反馈是权威事实;熟悉度和层级概括是模型推断 |
| 学习进展 | 当前活跃 Topic、近期掌握变化、重复没懂的领域和累计反馈统计 | 标识与计数由数据库实时生成;趋势描述由压缩产生 |
每次自主判断可以从当前 SourceCapsule 同时返回最多四条结构化 context observation:对话偏好只允许长度、结构、示例、术语四类;Topic 熟悉度只允许 unknown / beginner / working / advanced。观察带来源 Session/turn 和置信度,进入尚未压缩的 context 尾部;observation 本身不保存支撑它的原始用户文字。重讲不从旧来源重新生成观察。
每次辅助请求使用“最新压缩快照 + 未压缩 observation/学习尾部 + 数据库实时 Topic/活跃状态覆盖层”。实时状态始终覆盖摘要中的旧判断。ExplainContext 只用于决定是否讲、讲多深和如何表达;熟悉度观察不能把 Topic 自动标为已掌握,也不能修改主工作会话。
用户画像控制作为 checkpoint 之外的本地权威覆盖层保存。纠正或忘记只执行 SQLite 事务、提高 context generation 并通知页面,不主动调度模型;后续辅助请求和压缩都会携带控制层。原始模型 checkpoint 保留供审计,有效投影按“显式偏好 > 用户修正 > 未被忘记的模型推断”计算。
P0 不从工作转录推断职业、身份、健康、政治或其他敏感属性。完整 SourceCapsule 只在当次自主判断期间存在;只有成功创建 Explanation 时,才从中持久化下述重讲来源摘要。压缩不读取该摘要,只读取结构化 observations 和不含来源摘要的学习展示字段;系统不保存完整工作转录。
呈现位置
| 元素 | P0 位置 | 行为 |
|---|---|---|
| 全局学习线程 | 当前工作 Session 的「学习」视图 | 每个 Session 有自己的视图入口,所有入口展示同一份全局数据 |
| 当前来源讲解 | 学习视图顶部 | 当前 Session 有活跃讲解时优先显示;没有时明确显示“当前会话暂无讲解” |
| 其他活跃讲解 | 当前来源讲解之后 | 按创建顺序显示;每条最新 revision 都有独立 ✓ / ✗ |
| 历史讲解 | 同一 Tab 内分页加载 | 原始记录不因压缩消失;已关闭项只读,已掌握项可撤销 |
| 主动来源 | 讲解元信息 | /explain <学习请求> 生成的 entry 显示“主动请求”;空白 Session 发起时没有虚构 turn 编号 |
| 选中/回答来源(P1) | 讲解元信息 | 分别显示“选中解释”和“学习回答”;无可靠坐标的 selection 不显示伪造 turn |
| 学习概况 | 同一 Tab 内可校正区 | 显示当前 ExplainContext、画像信心和来源;支持纠正、忘记、显式偏好与最近修改记录 |
| 行内讲解卡片 | 不在 P0 | 本地旁路数据没有标准 ConversationNode 推送入口 |
| 回合尾部反馈 | 不在 P0 | conversation.chat.turnTail 按会话作用域渲染,无法同时表达全局历史和其他来源活跃讲解 |
P0 不自动切换或抢占 conversation.view。用户在当前工作 Session 的头部选择「学习」后看到全局线程;视图选择按 Session 保存,不是学习事实。空白 Session 的 Hero 阶段不显示会话头部和视图 Tab,用户需要先进入一个已建立的 Session。学习视图只替换聊天记录区域,当前工作 Session 的 composer 仍然显示,用户从中发送的内容继续进入该工作 Session。
开关语义
/explain on开启未来回合观察,不补扫历史 Session。/explain off立即提高运行 epoch、取消在途模型请求并清空内存候选;迟到结果因 epoch 不匹配而丢弃。- off 不删除学习历史、压缩检查点、
ExplainContext、来源活跃讲解或已掌握 Topic。 - off 时学习视图保持可读,但反馈、撤销和其他学习状态写入禁用;重新 on 后恢复交互与各来源活跃状态。
/explain status返回全局开关、模型路由和容量是否完整、runtime 状态、各来源活跃讲解数、候选数、最近用户操作时间、最近压缩时间与当前预计上下文占用。/explain <学习请求>只在 enabled 且路由可用时接受;命令由宿主记录后直接交给 explain 调度器,不形成主 Agent turn,也不进入主模型历史。空参数返回用法,on、off、status保留为精确管理子命令。--selection以选中文本作为请求,逆序定位最新匹配消息;无可靠坐标时使用 turn 0,不把当前最新回合冒充为来源。--answer <turn>只读该 assistant 消息对应的精确回合,不存在或不合格返回EXPLAIN_SOURCE_UNAVAILABLE;旧--suggested只作为输入兼容别名。- 两个 P1 入口均由 Explain 注册,只在点击时从当前 Session input facade 重新确认 plain 且空草稿;不读 SQLite、ExplainContext 或其他插件私有 API,不自动发送或新增模型调用。
- 主动请求成功时返回新讲解标题;关闭、运行时不可用、来源繁忙、Topic 已活跃、取消、模型失败和压力无法化解均返回稳定错误码。命令完成不自动切换「学习」视图。
- provider、model 或可解析的
contextWindow缺失时,on明确失败;不得隐式借用来源 Session 的模型。
候选与防吵
- P0 排除
origin: subagent的 Session;子代理成果由顶层会话吸收后再成为学习素材。 - 只接收
turn/end.reason.kind === 'completed'、至少进入一个 step 且包含非空 assistant 文本的回合。 - 每个来源 Session 最多保留一个未处理自主候选;更新的回合替换该 Session 的旧候选。
- 来源已有活跃讲解时,其候选等待;讲解关闭后只有当候选仍是该来源最新回合时才处理。
- 全局候选上限默认 8,达到上限时丢弃最旧自主候选;用户触发的主动讲解、重讲和压缩不占该上限。
- 自主判断默认最多发送 50 次/滚动 24 小时。计数在请求发送前持久占额,失败和
maxAttempts重试均计数;额度耗尽时不丢弃候选,最早占额过期后再按公平顺序继续。主动讲解、重讲和压缩不占自主额度。 - 可执行自主候选按
observedAt最早优先,避免繁忙来源长期挤占其他来源。 TopicKey精确相等才视为同一 Topic;已掌握或正在其他来源活跃的 Topic 不创建第二条讲解。P0 不宣称完成语义去重。- 已掌握 Topic 再次命中时不创建讲解,但模型判断本身可能已经产生调用成本。
能力复用结论
| 能力 | 核验结论 | P0 采用方式 |
|---|---|---|
DSH ctx.compact / compact-basic | 只操作一个 DSH Session 的 durable surface,不能压缩插件 SQLite 中的全局线程 | 不直接调用;复用“容量阈值、保留活跃尾部、摘要检查点”的策略 |
DSH ctx.llm.resolveModelInfo() | 能按精确 provider/model 返回部署拥有的 contextWindow | 直接用于 50% 阈值分母;缺失时要求显式配置 |
DSH ctx.tokenMeter | measure() 只接受 Session;estimateMessage() 可估算任意模型消息 | 使用 estimateMessage() 对完整 explain 请求做一致的启发式计价,不伪装成 provider 精确 token |
DSH ctx.systemPrompt.context() | 支持全局注册和按 Agent scope 渲染,但由 AgentLoop 把快照写入主 Session 的模型上下文 | 不用于 ExplainContext,避免改变主模型输入;辅助请求显式组装私有上下文 |
dsh-memory | 当前只有占位 README,没有可调用服务或数据协议 | 不依赖,等待其未来定义稳定能力 seam |
dsh-memory-evolve | 已实现本地跨会话 memory/user 快照,但没有公开 Cordis memory service,且默认注入主 Agent | 只参考分层、低频快照和用户可见性,不建立运行依赖或读取其私有文件 |
| DSH 第三方 memory MCP 示例 | 提供模型主动调用的外部记忆工具,存储和检索语义由各 provider 拥有 | 不用于 P0 自动 explain context;避免新增服务、工具调用和外部存储依赖 |
因此 P0 由 dsh-explain 自己拥有 ExplainContext 的 SQLite schema、压缩流程和辅助模型注入。未来若 DSH 发布通用的全局 memory Service Definition,可在保持数据语义和主模型隔离的前提下增加 provider 适配层。
数据与隐私
- 持久层保存讲解、反馈、来源坐标、模型路由、usage、自主调用占额、Topic 状态、各来源活跃指针、压缩检查点、
ExplainContext和 explain 操作时间。 - 每个 Explanation 的首个 entry 额外保存一份重讲来源摘要:自主讲解保存当前 turn 用户文本,主动讲解保存有界命令请求;两者经标准化后最多 2,000 字符,并可保存最多 32 个去重工具名、可选
cwdLabel和截断标记。它不包含 assistant 全文、工具参数、工具结果、reasoning、绝对路径或其他 turn;typed Remote 不向学习视图返回该内部字段。 - 完整工作转录、工具输出、system prompt 和待处理候选默认不持久化。
- 自主生成请求使用当前来源回合的有界素材;重讲只读取首个 explanation entry 中的来源摘要、该 Explanation 的 revisions 与反馈,不重新读取来源 Session。来源 Session 删除后仍可重讲。
- 压缩请求不读取重讲来源摘要;Explanation 关闭后摘要只随 append-only entry 留在本地数据库,P0 不提供单项删除或导出接口。
topics.title始终取该 Topic 最近一次成功提交的 explanation revision 标题;更新在同一事务中提高topicRevision,历史 entries 的标题保持不变。- 压缩检查点只影响辅助模型上下文;历史分页始终从原始 entries 读取。
- 来源 Session 被删除、归档或不可读取时,既有学习记录保留,来源只显示为不可访问。
- 清空、导出或手工编辑整条学习线程与
ExplainContext不在 P0;停止 DSH 后删除插件数据目录是 P0 的运维兜底。
非目标
- 跨设备同步、云账户、多用户服务器隔离。
- 同一来源会话同时学习多个 Topic,或预生成一批该来源未读讲解。
- 子代理直接提交候选。
- 行内讲解、回合尾部反馈、右侧悬浮窗和自动抢焦点。
- 空白 Session Hero 阶段的学习入口、独立学习页面和隐藏工作 composer。
- 学习卡内连续自由对话、语音、深度档位和自适应课程;P0 的主动学习是一次命令对应一条讲解。
- 语义向量查重、知识图谱、自适应课程、外部题库与社交排行。
- 将
ExplainContext注入主 Agent,或自动读取/写入其他 memory 插件的私有数据。 - 跨 Session 定位到具体消息;M4 只支持打开仍存在的来源 Session。
- 完整生产提示词与工作转录的审计重放。
验收标准
- 关闭零成本:除显式切换 enabled 设置外,off 时产生零辅助模型请求、零候选写入和零学习数据变更,学习 Tab 只读。
- 来源隔离:Session A 未反馈时,A 不产生第二个活跃讲解;Session B 仍可产生自己的活跃讲解,且 A/B 均可没有讲解。
- 全局单飞:两个来源的主动生成、自主生成、重讲和压缩交错时,全局最多一个在途模型调用。
- 反馈隔离:对 A 点 ✓ 或 ✗ 只改变 A 的活跃讲解;B 的 ExplanationId、revision 和状态不变。
- 跨会话掌握:在 Session A 点 ✓ 后,Session B 命中的同一
TopicKey被全局抑制;同一 TopicKey 不能在 A/B 同时活跃。 - 重讲一致:点 ✗ 后保留同一来源、
ExplanationId/TopicId,revision 严格加一。 - 来源摘要可恢复:来源 Session 删除或不可读取后,✗ 仍能仅用首个 explanation entry 的有界来源摘要产生下一 revision;摘要不包含禁止持久化的工具结果、绝对路径或其他 turn。
- 自主预算:第 50 次自主请求发送后的滚动 24 小时内不发送第 51 次;失败与重试消耗额度,重启不能清零,额度恢复后保留的 latest-wins 候选继续处理;主动讲解、重讲和压缩不计数。
- Topic 标题新鲜度:同一 Topic 的新 Explanation 或重讲 revision 成功后,
topics.title等于最新标题且topicRevision前进;旧 entry 标题不改写。 - 不活跃压缩:有新的 observation 或已关闭内容且 30 分钟没有成功 explain 操作时只触发一次压缩;阅读视图不延时,成功反馈会重新计时,无新内容时不调用模型。
- 压力压缩:预计请求占用首次超过 50% 时,目标请求前先完成压缩并重新估算;活跃讲解不被压缩,压缩失败不写覆盖标记也不继续发送超阈值请求。
- 上下文有效:主动讲解、自主讲解和重讲请求都包含最新
ExplainContext与实时 Topic/活跃覆盖层;旧摘要不能覆盖新反馈,主 Session 的deriveMessages()保持完全一致。 - 原始历史保留:完成任意次数压缩后,学习视图分页仍返回压缩前的原始讲解、反馈和来源坐标。
- 持久一致:正常重启和页面刷新后,全局顺序、各来源活跃状态、revision、反馈、Topic 状态、压缩覆盖、调用占额和
ExplainContext一致。 - 迟到隔离:off、fiber 撤销、反馈状态变化或压缩检查点变化后,旧 epoch 的模型结果不能提交。
- 并发反馈:两个浏览器标签竞争同一 Explanation revision 时,一个成功,另一个收到明确的 stale revision;对不同来源的有效反馈不因无关 store 更新互相拒绝。
- 故障透明:数据库损坏、未知 schema、模型路由/容量缺失和压缩失败均明确报错,原数据不被静默重置。
- 界面一致:从不同来源 Session 打开的「学习」视图展示同一全局线程,并优先呈现各自来源的讲解;一个 Session 的视图选择不改变业务状态。
- 视图约束:空白 Session 不显示「学习」入口;已建立 Session 切入学习视图后 composer 仍可向当前工作 Session 发送消息,且插件不通过 DOM/CSS 私有路径改变该行为。
- 主动学习命令:composer 能发现
/explain <学习请求>;成功后全局线程新增带“主动请求”来源的活跃讲解,空白来源不显示 turn 0;请求进入 command 日志但不进入主 Agent 消息,自主额度保持不变,来源/Topic 冲突与取消返回稳定结果。 - P1 Host 协议:selection 对 assistant/tool/user/Advisor 可见文本的来源坐标符合定位规则,重复文本取最新匹配;answer 在草稿中固定精确 turn,之后的新回合不改变来源。成功分别持久化
origin: selection/answer,重讲保留 origin;旧 suggested 数据保持可读,失效来源、命令用法错误和竞争返回稳定结果。 - P1 自有入口:Explain 未安装时两个入口都不存在;安装时只填写可编辑草稿,不覆盖既有输入、不依赖或修改其他插件、不增加后台调用;Advisor 未被选中时绝不进入 ExplainContext。
- 测试伴随:单元测试、集成测试、keyless Web replay/snapshot 和真实流程 GIF 从首个 UI PR 开始,发布前全部通过。
决策记录
| 日期 | 决策 |
|---|---|
| 2026-08-12 | 目标用户按知识差距定义,不按职业身份分类 |
| 2026-08-12 | 讲解时机由 explain 自主判断,不使用固定关键词规则 |
| 2026-08-12 | 每个 $DSH_HOME 只有一条全局学习线程,工作 Session 只是素材来源 |
| 2026-08-12 | 活跃讲解从“全局最多一个”改为“每个来源 Session 最多一个”;其他来源不因等待反馈而停摆 |
| 2026-08-12 | 辅助模型仍全局单飞;并发是多个等待反馈状态,不是并发模型调用 |
| 2026-08-12 | 自主模型请求受持久化的滚动 24 小时全局额度约束;失败和重试计数,用户触发的重讲与压缩豁免 |
| 2026-08-12 | Topic 掌握和活跃去重用户全局生效,并提供撤销 |
| 2026-08-12 | 首个讲解 entry 持久化有界来源摘要供重讲;Topic 当前标题随最新成功 revision 更新,历史 entry 不改写 |
| 2026-08-12 | 全局线程在 30 分钟无 explain 操作或预计上下文超过模型容量 50% 时压缩;原始 UI 历史不删除 |
| 2026-08-12 | 新增 explain 私有全局 ExplainContext,包含对话偏好、知识概况和学习进展,不进入主 Agent |
| 2026-08-12 | DSH 原生 Session compaction 与通用 prompt context 不能直接承载 explain 私有全局状态;P0 自有 SQLite schema,复用容量解析与 token 估算 |
| 2026-08-12 | dsh-memory-evolve 和 memory MCP 只作为能力参考,P0 不建立依赖 |
| 2026-08-12 | P0 数据使用插件自有本地 SQLite,不写外部自定义 Session 事件 |
| 2026-08-12 | P0 主界面使用第一方 conversation.view;删除 turnTail,行内卡片移出 P0 |
| 2026-08-12 | P0 只观察顶层正常完成回合,排除子代理直接提交 |
| 2026-08-12 | 学习数据用户全局,但 conversation.view 入口和选中状态按 Session;空白 Session 无入口,工作 composer 保留 |
| 2026-08-12 | P0 删除 vendored better-sidebar,保持零外部 UI 依赖 |
| 2026-08-13 | /explain <学习请求> 复用第一方 command/composer,进入全局 explain 单飞队列且不占自主额度;管理子命令保持兼容 |
| 2026-08-13 | M6 Host 增加 selection 逆序来源定位和精确 turn 来源协议,为可编辑快捷草稿提供稳定命令入口 |
| 2026-08-14 | M6 快捷入口全部迁入 Explain:通过第一方 composer/message slots 生成 selection/answer 草稿;其他插件保持不变,旧 suggested 输入与数据只读兼容 |