# dsh-explain PRD(P0 定稿) > 状态:**P0 定稿;M6 P1 快捷入口实现与组合验收完成**(2026-08-14)。实现证据见 [验收矩阵](./ACCEPTANCE.md)。 > 技术方案见 [ARCHITECTURE.md](./ARCHITECTURE.md);本文档与架构 v11 同步。 ## 定位 **学习模式**把多个 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 操作会重置计时;模型生成、后台压缩、页面刷新和单纯阅读不会重置。 ## 产品不变量 1. **一个用户只有一条学习线程**:来源会话可以并发,所有记录按一个全局顺序提交。 2. **讲解按来源会话隔离**:同一来源会话最多一个活跃讲解;该讲解未反馈时只阻塞本来源的新讲解,不阻塞其他来源会话。 3. **辅助模型全局单飞**:主动讲解、自主讲解、重讲和压缩共享一个调度器,全局最多一个 explain 模型请求。 4. **反馈只推进目标讲解**:✓ 关闭目标来源的当前 Topic;✗ 只重讲目标来源的当前 Topic。没有反馈时,该来源保持等待。 5. **学习事实用户全局有效**:Topic 的已掌握状态跨来源 Session 生效;同一 `TopicKey` 全局最多一个活跃讲解,fork 与恢复不复制独立副本。 6. **主工作不受控制流影响**:explain 不阻塞主 turn,不修改主模型输入,不注入消息,也不向主 agent steer。 7. **模型上下文有界**:压缩只改变后续辅助模型看到的历史;原始学习记录、反馈和来源坐标继续保留并可在 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 `,并在已完成 assistant 回答上填写 `/explain --answer `;都不自动提交、不覆盖非空草稿,Advisor 只经用户显式选中进入 | | 自主选题 | 只观察顶层 Session 中正常完成且包含非空 assistant 输出的回合;explain 可以返回“不讲” | | 来源讲解槽 | 每个来源 Session 最多一个活跃讲解,可以没有;有活跃讲解时仍保留本来源最新一个候选 | | 全局单飞 | 全局最多一个辅助模型请求;主动请求、重讲、压缩和自主候选按明确优先级串行执行 | | 自主调用预算 | 自主判断默认最多发送 50 次/滚动 24 小时;发送失败与重试也计数,耗尽后候选暂停,用户触发的主动讲解、重讲与压缩不占额度 | | 全局 `ExplainContext` | 汇总对话偏好、知识概况和学习进展;每次主动讲解、自主讲解和重讲都读取,永不进入主 Agent 请求 | | 自动压缩 | 连续 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` | | UI 依赖 | 只使用 DSH 第一方 `conversation.view`、`conversation.input.left` 和 `conversation.chat.assistant-actions` 槽位;P0/P1 不引入外部 UI 插件 | ## 交互与调度流程 1. 全局开关为 on 时,`/explain <学习请求>` 进入当前来源的显式请求队列;来源已有活跃或待处理主动讲解时立即返回稳定冲突,不发送模型请求。 2. 主动请求优先于尚未开始的重讲、自主候选和不活跃压缩;若后台自主生成或 idle 压缩在途则取消并先处理主动请求,已在途的主动请求或重讲不被抢占。 3. 主动模型必须返回讲解,不能返回 `skip`;提交时重新校验来源活跃槽和全局 Topic 活跃门。既有已掌握 Topic 可由用户的显式请求重新进入 learning,既有活跃 Topic 则拒绝重复讲解。 4. 没有主动请求时,调度器从没有活跃讲解的来源会话中选择最早的自主候选;其他来源正在等待反馈不构成阻塞。 5. 自主模型返回 `skip` 时不创建用户可见记录,继续处理下一候选;返回 `explain` 时只有来源和 Topic 门仍成立才提交。 6. 用户选择 ✓ 后,目标 Topic 进入全局已掌握状态,目标来源讲解关闭;调度器可以处理该来源等待的最新候选。 7. 用户选择 ✗ 后,调度器重讲目标讲解;成功后追加同一 `ExplanationId` 的下一 revision,继续等待反馈。 8. 自主调用达到滚动 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 自动标为已掌握,也不能修改主工作会话。 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 ` 只读该 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。 - 完整生产提示词与工作转录的审计重放。 ## 验收标准 1. **关闭零成本**:除显式切换 enabled 设置外,off 时产生零辅助模型请求、零候选写入和零学习数据变更,学习 Tab 只读。 2. **来源隔离**:Session A 未反馈时,A 不产生第二个活跃讲解;Session B 仍可产生自己的活跃讲解,且 A/B 均可没有讲解。 3. **全局单飞**:两个来源的主动生成、自主生成、重讲和压缩交错时,全局最多一个在途模型调用。 4. **反馈隔离**:对 A 点 ✓ 或 ✗ 只改变 A 的活跃讲解;B 的 ExplanationId、revision 和状态不变。 5. **跨会话掌握**:在 Session A 点 ✓ 后,Session B 命中的同一 `TopicKey` 被全局抑制;同一 TopicKey 不能在 A/B 同时活跃。 6. **重讲一致**:点 ✗ 后保留同一来源、`ExplanationId` / `TopicId`,revision 严格加一。 7. **来源摘要可恢复**:来源 Session 删除或不可读取后,✗ 仍能仅用首个 explanation entry 的有界来源摘要产生下一 revision;摘要不包含禁止持久化的工具结果、绝对路径或其他 turn。 8. **自主预算**:第 50 次自主请求发送后的滚动 24 小时内不发送第 51 次;失败与重试消耗额度,重启不能清零,额度恢复后保留的 latest-wins 候选继续处理;主动讲解、重讲和压缩不计数。 9. **Topic 标题新鲜度**:同一 Topic 的新 Explanation 或重讲 revision 成功后,`topics.title` 等于最新标题且 `topicRevision` 前进;旧 entry 标题不改写。 10. **不活跃压缩**:有新的 observation 或已关闭内容且 30 分钟没有成功 explain 操作时只触发一次压缩;阅读视图不延时,成功反馈会重新计时,无新内容时不调用模型。 11. **压力压缩**:预计请求占用首次超过 50% 时,目标请求前先完成压缩并重新估算;活跃讲解不被压缩,压缩失败不写覆盖标记也不继续发送超阈值请求。 12. **上下文有效**:主动讲解、自主讲解和重讲请求都包含最新 `ExplainContext` 与实时 Topic/活跃覆盖层;旧摘要不能覆盖新反馈,主 Session 的 `deriveMessages()` 保持完全一致。 13. **原始历史保留**:完成任意次数压缩后,学习视图分页仍返回压缩前的原始讲解、反馈和来源坐标。 14. **持久一致**:正常重启和页面刷新后,全局顺序、各来源活跃状态、revision、反馈、Topic 状态、压缩覆盖、调用占额和 `ExplainContext` 一致。 15. **迟到隔离**:off、fiber 撤销、反馈状态变化或压缩检查点变化后,旧 epoch 的模型结果不能提交。 16. **并发反馈**:两个浏览器标签竞争同一 Explanation revision 时,一个成功,另一个收到明确的 stale revision;对不同来源的有效反馈不因无关 store 更新互相拒绝。 17. **故障透明**:数据库损坏、未知 schema、模型路由/容量缺失和压缩失败均明确报错,原数据不被静默重置。 18. **界面一致**:从不同来源 Session 打开的「学习」视图展示同一全局线程,并优先呈现各自来源的讲解;一个 Session 的视图选择不改变业务状态。 19. **视图约束**:空白 Session 不显示「学习」入口;已建立 Session 切入学习视图后 composer 仍可向当前工作 Session 发送消息,且插件不通过 DOM/CSS 私有路径改变该行为。 20. **主动学习命令**:composer 能发现 `/explain <学习请求>`;成功后全局线程新增带“主动请求”来源的活跃讲解,空白来源不显示 turn 0;请求进入 command 日志但不进入主 Agent 消息,自主额度保持不变,来源/Topic 冲突与取消返回稳定结果。 21. **P1 Host 协议**:selection 对 assistant/tool/user/Advisor 可见文本的来源坐标符合定位规则,重复文本取最新匹配;answer 在草稿中固定精确 turn,之后的新回合不改变来源。成功分别持久化 `origin: selection/answer`,重讲保留 origin;旧 suggested 数据保持可读,失效来源、命令用法错误和竞争返回稳定结果。 22. **P1 自有入口**:Explain 未安装时两个入口都不存在;安装时只填写可编辑草稿,不覆盖既有输入、不依赖或修改其他插件、不增加后台调用;Advisor 未被选中时绝不进入 ExplainContext。 23. **测试伴随**:单元测试、集成测试、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 输入与数据只读兼容 |