# 手工验收清单(真实 DSH profile) > **要在真实 DSH profile 上确认什么**:构建产物(`ui/client.js`)能加载 → 四个槽位能注册 → 宿主 props 形状与 glue 对齐 → 核心链路(组装 → 写入草稿 → 发送)行为正确。 > > **耗时**:安装启动 3 分钟 + 快线 6 分钟 + 发布门槛 4 分钟 + 观测 3 分钟。 > > **为什么不能省**:仓库内的自动化测试覆盖纯逻辑断言、渲染级初始状态(`test/render-smoke.test.js`,真实 react-dom/server)与源码/产物文本断言,但**交互(点击 / 事件)与宿主 props 形状**仍覆盖不到。`test/dsh-slots.test.js` 会读真实构建产物做包含性检查,但 slots 服务是模拟对象——它只能证明「产物能调用注册接口」,不能证明目标 DSH 版本喂进来的 props 形状与之一致。这一条只能靠真实 profile。 --- ## 0. 先填被测版本 **Desktop App 专项**:先运行 `npm run check:dsh-app -- /path/to/deepseek-harness`,再在 App 的 Plugins 页安装插件;Web profile 的安装结果不计入 App 验收。打开暗色主题,分别在宽窗口与窄窗口检查科研工具详情卡的准备中/执行中/完成或失败状态,确保文字可读、不横向溢出。用测试数据在 Web 导出迁移包,在 App 选文件预览;确认预览时未写入,下载本端备份后导入,刷新并复核证据、知识、资产及关联,再重复导入确认无稳定 ID 副本。迁移流程详见 [App 迁移说明](APP-MIGRATION.md)。 **Desktop Claim 专项**:在 App 的测试课题中进入「科研工作台 → 研究资产库 → Claim 审阅」。用带公开 DOI 的测试段落提取候选,勾选后登记;确认刷新后仍能看到来源位置。先点「发布检查并导出」,应列出待人工确认项且不下载发布文件;再点「Agent 审阅」,应显示建议但仍为待核验;人工填写评估人、理由并关联测试证据后确认,再次发布检查应通过并下载 JSON。最后在窄窗口确认按钮、建议与阻断提示可见。Agent 调用要使用当前 App 会话已配置的模型路由;不要在生产课题里制造测试 Claim。此项必须在真实 App 中执行,浏览器回归和静态契约检查不能替代。 | 项 | 值 | | --- | --- | | 被测对象 | 待发布的构建产物 `ui/client.js`(应等于当前源码构建结果) | | DSH 版本 | | | Node 版本 | | | 安装方式 | 本地目录 / GitHub 钉 commit / tarball | | 日期 | | > **确认产物与源码一致。** `dsh plugin add <目录>` 读取的是工作区文件;若验收中途改了源码,必须重跑 `npm run build` 并重新安装,否则测到的是旧产物。 --- ## 1. 安装与启动(约 3 分钟) 本仓库无运行时依赖,不需要 `npm install`。 > **环境前置:`dsh plugin` 会调用 PATH 上的 `pnpm`,其 store 布局主版本必须与目标 profile 记录的一致。** 否则命令会以 `ERR_PNPM_UNEXPECTED_STORE` 直接失败(失败是原子的,不会产生任何改动)。先校验: > > ```bash > grep storeDir ~/.dsh/profiles/web/node_modules/.modules.yaml # 例:…/store/v11 > pnpm --version && pnpm store path # 例:v10 → …/store/v10 ← 不一致 > ``` > > 末段 `v11` 对应 pnpm 11.x、`v10` 对应 10.x。不一致时改用**与记录一致的主版本**执行,例如隔离安装 `npm i pnpm@11` 后把其 bin 目录前置到 PATH。 ```bash npm run build dsh plugin --profile web add ``` 刷新浏览器,打开一个**已有会话**。 **预期**:会话视图区出现「科研工作台」;输入框左侧出现「资源」「工作流程」;右侧出现草稿增强入口。 不出现 → 停止,按 §4 的 L1/L2 定位。 --- ## 2. 快线(4 项,约 6 分钟) 任一项失败即停止并记录。 ### F1 槽位注册无重复 **操作**:查看视图标签区与输入框两侧,同时打开浏览器控制台。 **预期** - 「科研工作台」**恰好出现一次**;输入框左侧两个入口、右侧增强入口各一次,增强入口旁的**沉淀伴生钮**(小圆钮)恰好一个; - 控制台无 `undefined is not an object` / `register` 相关报错。 **判定**:重复出现 = 残留旧版本安装或 disposer 未执行;完全不出现 = 槽位名与宿主不匹配。 ### F2 四分区可切换 **操作**:在「科研工作台」内依次点选四个二级分区。 **预期**:资源与工作流 / 方法工坊 / 研究资产库 / 研究证据图谱 均可切换,标题与内容对应,**默认落在「资源与工作流」**。 **判定**:标题错位、内容空白、切换报错 → L4 渲染层。 ### F3 写入不发送 + 只发一次 **操作** 1. 在「资源与工作流」选中 `审阅论文`; 2. 填写至少一个必填参数; 3. 点「写入输入框」; 4. 观察输入框; 5. 再点「发送到当前会话」。 **预期**:步骤 4 出现完整 Prompt 且**未自动发送**;步骤 5 **只产生一条**用户消息。 **判定** | 现象 | 定位 | | --- | --- | | 步骤 4 直接发出消息 | `setDraft` 被误接成 `submit` → L3,查 `dsh/standalone-glue.js` 的 props 取值 | | 步骤 5 出现两条消息 | `submit()` 被调用两次(绑定重复)→ L3 | | 输入框始终为空 | 草稿写入路径断开 → L5 状态/存储 | ### F4 切换会话不串台 **操作**:切换到另一个会话,再切回,重复 F3 的步骤 3–5。 **预期**:消息落在**当前**会话,不会写进上一个会话。 **判定**:串台 → `sessionId` 未随会话刷新,或 `inputActions` 被跨会话缓存 → L3。 --- ## 3. 发布门槛(2 项,约 4 分钟) §2 全绿后再做。 ### R1 卸载无残留 **操作**(三步,需要 **1 次重启**): ```bash dsh plugin --profile web remove dsh-research-kit # 1) 卸载 # 2) 重启 profile 并刷新页面 → 核对控件消失 dsh plugin --profile web add # 3) 重装 ``` **预期**: - **卸载后**:以下五处都不得再出现 `dsh-research-kit`——`package.json` 的 `dependencies`、`package.json` 的 `dsh.profile.bundles`、`pnpm-lock.yaml`、`node_modules/.modules.yaml`、`--dump-config` 合成树; - **重装后**:`package.json` 应逐字节回到卸载前,`bundles` 只 1 条,合成树只 1 层,重新打开会话时各控件**仍只出现一次**。 > **卸载在运行态不立即生效。** 插件树在 profile 启动时合成,重启前旧实例仍在服务(DSH 自身的卸载日志也会标注「待重启生效」)。因此「卸载无残留」必须**重启后**才能判定运行态。 ### R2 降级不崩 **操作**:构造一次宿主动作缺失(禁用对应能力,或在 devtools 中断开 `inputActions`)。 **预期**:相关按钮禁用并给出说明文案,视图不崩溃。 --- ## 4. 失败定位树 | 症状 | 层 | 首要检查点 | | --- | --- | --- | | 插件根本没被加载 | L1 加载 | `package.json` 的 `main` / `type: module`;`cordis.patch.yml` 的 id 与安装名是否一致 | | 加载了但没有任何槽位 | L2 注册 | `dsh/slot-registry.js` 的 slot 名是否与目标 DSH 版本一致 | | 槽位重复出现 | L2 注册 | 是否残留旧版本安装;`registerResearchSlots` 返回的 disposer 是否被调用 | | 槽位在但视图空白 / 报错 | L4 渲染 | 浏览器控制台首个 React 错误栈;`src/ui.js` 的组件契约 | | 写入草稿变成直接发送 | L3 契约 | `dsh/standalone-glue.js` 中 `inputActions` 的取值与调用点 | | 消息发两次 | L3 契约 | `submit` 的调用是否被重复绑定 | | 切换会话后串台 | L3 契约 | `sessionId` 的更新路径 | | 直查返回 503 / 增强提示「尚未建立模型路由」 | L5 路由 | `index.js` 三条路由是否注册;`ctx.sessions` 惰性兜底是否命中 | | 自动沉淀开启但回答完成后图谱无知识节点 | L3 契约 | `ctx.sessions` 是否存在(不存在时 `attachKnowledgeDeposition` 静默跳过);事件流 `assistant/message` 的 `data.message.content` 是否为内容块数组;控制台有无沉淀环节报错 | **修复位置原则** 1. 宿主 props 形状不符 → **只改 `dsh/standalone-glue.js`**,不要让 React 模块去读宿主私有数据; 2. `vendor/promptkit-embed.js` **不得改动**——其 SHA-256 被 `npm run check` 锁定,改动会导致校验失败; 3. 分区结构变更只改 `src/lib/console-sections.js`,并同步 `src/research-console.js` 的 `SECTION_VIEWS`,否则 `test/research-console.test.js` 会失败。 --- ## 5. 观测项(不阻断发布,建议记录) | # | 检查项 | 预期 | 结果 | | --- | --- | --- | --- | | O1 | 深色主题(`body[data-ds-dark-theme]`)下四分区可读 | 对比度足够,无错位底色 | | | O2 | 窄屏(< 880px)下分区导航与工作台为单列 | 不出现横向滚动 | | | O3 | 空结果状态 | 搜索无结果时显示空态而非空白 | | | O4 | 证据库在真实 profile 中可用 IndexedDB(无「刷新会丢失」提示) | 列表上方无降级提示 | | | O5 | 打开需宿主能力技能(如 bulk-rnaseq)的详情 | 显示宿主前提说明、使用前提核验清单与琥珀色「需宿主能力」提示;不出现在附加指导勾选列表;搜索可命中其正文 | | | O6 | 打开工作流详情 →「弹出回放窗口」 | 新窗口打开 archify viewer:路线动画逐段回放本次组装事实;窗口内可切换视觉预设(classic/signal-flow/blueprint/editorial)、章节播放(P、[ ])、透镜(L)、雷达(M);必填参数未填时该站显示空占位;面板内紧凑回放与导出快照可用且含免责声明 | | | O7 | 证据库筛「已核验」→「导出解释图素材」→ `render-diagrams --evidence` 渲染任一 IR | 导出 JSON 只含稳定标识符与核验状态(无检索词/Prompt 正文);渲染产物含「证据库来源」卡片且全部标注「已核验」;混入未核验条目时标题如实回落为「证据库来源(含核验状态)」 | | ### 插件详情页(4 项,约 2 分钟) | # | 检查项 | 预期 | 结果 | | --- | --- | --- | --- | | P1 | 打开 Plugins 页 → Research Kit 详情 | 标题旁出现规模徽章,数字与 `npm run build` 烘焙的目录真源一致(工作流 / 技能 / 数据源),且不随会话能力变化 | | | P2 | 点头部「复制诊断」→ 粘贴到文本编辑器 | 得到只含版本、规模、能力探测与 UA 的 JSON;不含会话内容、提示词或任何 Key;网络面板里只有本机同源的 `/dsh-research-kit/host-capabilities`,无外部上传 | | | P3 | 在未提供 `plugins.detail.*` 槽位的宿主、或行级 subject 下查看 | 徽章与诊断按钮不出现,控制台无报错(`ctx.slots.inject` 不触发即静默降级) | | | P4 | 在提供 `uiConversation.openView` 的宿主上点头部「打开工作台」 | 主区从 Plugins 页切回当前会话,且选中「科研工作台」标签页(而非默认对话视图);标签页内数据正常加载。宿主没有该服务时按钮**整块不出现**(不是灰按钮、不是点了没反应),会话内功能不受影响 | | ### 证据库闭环(ROADMAP §4b 验收,4 项) | # | 检查项 | 预期 | 结果 | | --- | --- | --- | --- | | E1 | 保存一条证据后**刷新页面** | 条目仍在,状态为「未核验」 | | | E2 | 新建并切换项目,再刷新 | 列表只显示当前项目的条目;当前项目跨刷新不变 | | | E3 | 在同一项目重复保存同一 DOI / PMID | 停下并询问「覆盖已有 / 仍然另存一份」,**不静默入库** | | | E4 | 删除单条、清空当前项目 | 清空走二次确认;其他项目条目不受影响 | | > E1 依赖宿主提供可用的 IndexedDB。若证据库列表上方出现「证据暂存在内存中,刷新页面后会丢失」提示,说明当前 profile 未提供 IndexedDB,此时 E1 不成立——记为环境限制,不是回归。 ### 证据库写入 Prompt(ROADMAP §4c 验收,3 项) | # | 检查项 | 预期 | 结果 | | --- | --- | --- | --- | | W1 | 勾选 1–2 条证据后看面板;随后改检索词或核验状态筛选 | 出现引用块预览,首行为「…尚未经逐条核验…不得据此直接断言结论」,每条带稳定标识符与来源链接;按钮显示「写入 Prompt(N)」,N 与勾选条数一致。**改筛选后按钮计数与预览条数不变**——勾选跨筛选保留,不因被筛掉而缩水 | ✅ 2026-09-11 | | W2 | **不勾选任何条目** | 写入按钮为禁用态、点不动,**不产生任何注入**(「未选择不注入」的现场核对) | ✅ 2026-09-11 | | W3 | 勾选后点「写入 Prompt(N)」 | 输入框出现引用块全文且**未自动发送**;提示语报出的条数与实际注入条数一致 | ✅ 2026-09-11 | > W2 现场只能证明「点不动」;真正的不变式由 `planCitationWrite()` 的回归测试守护(未选择时 `action` 必为 `empty`、文本为空,且视图只在 `action === 'write'` 时调用 `setDraft`)。若在真实 profile 上发现按钮可点却无注入、或注入条数与提示不符,先跑 `npm test` 定位决策层,再查宿主 `inputActions` 契约。 > **验收记录(2026-09-11,真实 DSH Web profile,§4c 逐项)**:W1–W3 通过——勾选后「写入 Prompt(N)」可用、引用块预览出现且首行为核验边界;不勾选任何条目时按钮为禁用态、点不动(W2);点击写入后输入框出现引用块全文并**未自动发送**,提示条数与实际注入条数一致,本次为 1 条(W3)。W1 的现场观察覆盖「按钮可用」与「N 与勾选条数一致」;「改筛选后计数不变」与前者同源(选择集以 `entries` 为基准),由接线契约测试守护,现场调整筛选条件时顺带复核即可。 ### 研究证据图谱(ROADMAP §4d 验收,4 项) | # | 检查项 | 预期 | 结果 | | --- | --- | --- | --- | | G1 | 保存一条证据后打开分区④ | 出现独立证据节点,标注「来源库 · 稳定标识符 · 核验状态」;**不显示笔记、全文或检索词** | ✅ 2026-09-11 | | G2 | 观察证据节点与来源库的连线 | 来源库在目录中存在时,证据连到同库资源节点(本次:测试证据 → PubMed 资源) | ✅ 2026-09-11 | | G3 | 本会话查询过与证据同 URL / 同稳定标识符的来源时 | 证据另有一条连到该查询来源节点的线(`saved-copy`) | — 未触发(本次会话无同 URL / 标识符来源) | | G4 | 观察箭头与图谱说明 | 箭头按两端节点实际位置选锚点,逆向关系不再固定「左进右出」;图谱说明明确标注箭头含义 | ✅ 2026-09-11 | > G3 需要「先直查、再保存同一条来源」的操作顺序才会产生 `saved-copy` 边;只保存别处看到的证据时不会触发,属预期而非缺陷。G1–G2 的现场观察:测试证据与 PubMed 资源共 **2 个节点、1 条关系**。 > > G1 的「不显示笔记」不靠眼力判断:`test/evidence-graph.test.js` 断言图谱序列化结果里不得出现笔记正文;现场只是复核渲染没有把笔记画上节点。 ### 证据图谱 Viewer(ROADMAP §3.1 验收,4 项) | # | 检查项 | 预期 | 结果 | | --- | --- | --- | --- | | V1 | 打开分区④,Ctrl / ⌘ + 滚轮缩放、拖拽平移、点「复位」 | 缩放以视口中心为锚且在 40%–250% 之间;平移拖不丢(有边界);复位回到 100% 居中;右下角迷你地图视口框实时联动、点击可跳转 | | | V2 | 依次切换「聚焦 / 上游 / 下游 / 两点路径」模式并点选节点 | 非范围内节点降透明度但**不消失**(保留参照系);路径模式点两个节点后高亮连线;键盘 Tab 到节点后 Enter / 空格同样可聚焦 | | | V3 | 调整视图后点「复制视图链接」,在新会话打开该链接 | 焦点、范围模式与缩放恢复;链接 hash 中**不含任何节点标题或标识符**;系统开启「减少动态效果」时链路流动动画自动停止 | | | V4 | 点「导出快照」分别下载 SVG 与 HTML | 导出前弹窗明确写明元数据范围(仅节点标题 / 来源库 / 标识符 / 核验状态 / 关系);HTML 离线双击可打开且配色正常(非黑块);文件内不含笔记、全文或检索词 | | > V1–V3 的纯逻辑部分(布局稳定性、路径语义、URL 编解码)已由 `test/evidence-graph.test.js` 覆盖;现场核对的是渲染与交互层。V4 的「离线可打开」是导出物把主题解析成真实色值的原因——脱离宿主 CSS 变量后,`fill="var(--rk-surface)"` 会退化成黑块。 ### 数据源能力标注(2 项) | # | 检查项 | 预期 | 结果 | | --- | --- | --- | --- | | D1 | 在工作台点开 PubMed、Crossref 等 11 个直查来源的详情 | 「当前状态」为绿色**「插件可直接查询」**,且出现可用的查询入口 | | | D2 | 点开一个非直查来源(如 Scopus、GTEx) | 状态为琥珀色「需要 MCP 或 Web 能力」,写明接入前提,**不伪造查询结果** | | > 这两项守护的是「目录标注与实现一致」这条双向契约。若 D1 出现琥珀色提示,说明 `catalog/resources/` 分片的 `availability` 与 `dsh/database-query.js` 的适配器漂移——`npm run check` 本应拦住它,先跑一次即可定位。 ### 自动与逐条沉淀链路(9 项,尚未现场执行) > 自动沉淀的纯逻辑(提取确定性、稳定 id 合并、水位线去重、事件接线行为、手动入口错误路径)已由 `test/knowledge-deposition.test.js` 覆盖,但它与宿主 `sessions` 服务的事件接线、IndexedDB 真实持久化、图谱/灵感库/证据库三处联动**只能在真实 profile 上确认**。以下条目即为现场脚本:**开启开关 → 提问科研问题 → 图谱应出现知识节点**。 | # | 检查项 | 预期 | 结果 | | --- | --- | --- | --- | | A1 | 打开分区④,点「自动沉淀 · 已关闭」 | 按钮变为「自动沉淀 · 已开启」;刷新页面后状态保持(localStorage 持久);开启瞬间图谱不因历史消息回溯补节点 | | | A2 | 开启后在当前会话提一个科研问题(例:「Ghd7 是如何影响水稻耐盐性的?」),等回答完成 | 图谱出现知识节点(实体/发现等)与关系;图例出现「最近沉淀:+N 节点 · +M 关系 …(消息 #seq)」;灵感资产出现「待验证」卡片;证据库出现带「自动沉淀」标签的未核验条目 | | | A3 | 沉淀后**刷新页面**再回分区④ | 知识节点与关系仍在(IndexedDB 持久),数量不变——事件窗口重放被水位线拦住,不重复入库;点开知识节点可见来源消息摘录与关联证据 | | | A4 | 关闭开关 → 再问一个问题 → 重新开启 | 关闭期间的新回答不入库(水位线照常前进,不回溯补提取);重新开启后只有新回答入库 | | | A5 | 关闭自动开关,点「沉淀最近回答」 | 最近一条助手回答被手动入库一次(节点/资产/证据计数口径与 A2 一致);无会话服务或无可沉淀回答时给出明确提示而非报错;重复点击不翻倍(稳定 id 合并) | | | A6 | 输入框旁的沉淀伴生钮(贴靠增强器按钮上方) | 点击后最近一条回答入库一次,状态条显示计数并在数秒后自动消失;拖动增强器按钮后伴生钮跟随重算;与 A5 互相通用(同一去重口径,两边都点不翻倍) | | | A7 | 关闭自动沉淀,在一条非最新的已完成回答旁点「审阅沉淀」 | 预览必须对应所点消息而非最近回答;取消不入库;重新打开后取消勾选引用、确认沉淀,图谱只增加所选知识且证据库不新增该引用;全部内容仍待核验 | | | A8 | 在输入框选中一段普通文本后触发轻量或语义增强;增强期间再修改草稿后重试 | 首次只替换选中段,前后文保持不变;修改导致选区版本过期时提示重试,不覆盖新草稿;含 `@` 引用 chip 的选区提示改用整稿增强 | | | A9 | 触发研究 MCP 工具并观察工具卡的准备、执行、成功及失败阶段 | 准备阶段显示参数接收/摘要,执行阶段显示可用的项目或检索范围;失败时显示「失败」与原因而非「已完成」;成功后 DOI 与两种等级分开呈现 | | | A10 | 沉淀一条同时涉及水稻、基因和 DOI 的回答,打开研究资产库的灵感资产与证据库 | 新资产/证据带多个主题和类型/来源标签;列表默认按主题分组,搜索 `主题:植物科学` 能命中,关闭分组后条目不重复也不丢失;旧资产不改写即可归类,无法识别的内容在「待归类」 | | ### 宿主集成(2 项,依赖部署实际接入情况) | # | 检查项 | 预期 | 结果 | | --- | --- | --- | --- | | H1 | 工作台点开任一直查数据源详情 | 「宿主能力」行显示部署级事实摘要(已装配 Web/Shell/… 与已连接 MCP 名单);**不改变**该条目「当前状态」的颜色与文案;未连接 MCP 时如实显示「MCP:未连接任何服务器」 | | | M1 | 增强面板勾选「项目记忆」 | 宿主接入 Memory Center MCP 时:来源区出现「Memory Center · …」标签,注入内容含记忆摘要;未接入时只有会话资源摘要,增强照常工作不报错。**默认不勾选时不发生任何检索注入**。若检索工具是多动作门面(如本部署的 `personal-assistant-wiki/assistant_knowledge`,必填 `action`),需在浏览器控制台设置一次参数模板再勾选:`localStorage.setItem('dsh-research-kit.memory-search.template', JSON.stringify({action:'search',query:'{query}',limit:5}))` | | ### 动线整合 · 资产-证据互链(P5,3 项) > 素材建议用真实科研内容走查(例:把一次扩增子面板分析的结论存为灵感资产,如「HG0051660 突变体 cDNA 产物错位」,再关联支撑文献证据)。 | # | 检查项 | 预期 | 结果 | | --- | --- | --- | --- | | L1 | 资产卡点「关联证据(N)」展开 | 候选区按同项目/共同标签/知识链推导并标注理由;勾选后点「建立关联(N)」才入库——**不做任何勾选时不产生任何关联**;已关联列表可逐条「解除」 | | | L2 | 建立后打开分区④ | 「持久沉淀」范围出现「资产 → 支撑证据」边;切到「本会话」该边消失(随范围收敛);删除一端后边自然消失(悬空端点优雅剔除) | | | L3 | 证据条目上的反查 | 「被引用于:…」显示引用它的资产标题;对应资产删除后如实显示「不在当前列表」;导出备份的完成提示注明「资产-证据关联关系不在备份内」 | | --- ## 6. 证据记录(复制填写,建议附在发布说明里) | # | 检查项 | 结果 | 证据(截图 / 日志) | | --- | --- | --- | --- | | 0 | 被测版本与产物指纹(§0) | | | | F1 | 槽位注册无重复 | | | | F2 | 四分区可切换 | | | | F3 | 写入不发送 / 发送只一次 | | | | F4 | 切换会话不串台 | | | | R1 | 卸载无残留、重装不重复 | | | | R2 | 宿主动作缺失时降级不崩 | | | | O1–O4 | 深色 / 窄屏 / 空态 / 证据库存储可用 | | | | E1–E4 | 证据库闭环(刷新 / 项目 / 去重 / 删除) | | | | W1–W3 | 证据库写入 Prompt(引用块 / 未选择不注入 / 注入条数一致 / 跨筛选不缩水) | ✅ 2026-09-11 | | | G1–G4 | 证据图谱接入已保存证据(节点元数据 / 同库资源连线 / 来源匹配连线 / 箭头方向) | ✅ 2026-09-11(G3 未触发) | | | V1–V4 | 证据图谱 Viewer(缩放平移迷你地图 / 范围模式与键盘 / 视图链接与减动效 / 脱敏导出) | | | | D1–D2 | 数据源能力标注(直查来源绿色 / 非直查来源琥珀色不伪造) | | | | A1–A6 | 自动沉淀链路(开关持久 / 回答完成入库 / 刷新不重复 / 关闭不回溯 / 手动沉淀入口 / 增强器伴生钮) | | | | H1 / M1 | 宿主集成(能力探测事实行 / 项目记忆显式检索) | | | | L1–L3 | 动线整合 P5(资产-证据互链:候选显式建立 / 图谱支撑边 / 只读反查与备份边界) | | | **发布判定**:F1–F4 与 R1 全部通过方可发布;R2 与 O1–O3 失败须记录为已知限制。 --- ## 7. 已完成的验收与遗留 ### 已完成 真实 DSH Web profile 上已完成两轮完整走查:F1–F4、R1 与 O1–O3 全部通过,期间发现并修复 1 处分区渲染缺陷(容器内嵌套 `main.rk-page` 导致多余滚动、工具栏被推到标签栏背后;已补 `test/research-console.test.js` 的「分区嵌入契约」守护该缺陷类)。 2026-09-11 在真实 DSH Web profile 上补验证据库写入 Prompt(ROADMAP §4c)的 W1–W3,全部通过——**§4c 至此闭环**:勾选后「写入 Prompt(N)」可用、引用块预览可读;不勾选任何条目时按钮禁用、点不动;点击写入后输入框出现带来源链接与核验边界的引用块全文且未自动发送,提示条数与实际注入条数一致。该切片的自动化层(`planCitationWrite()` 的三态决策 + 视图接线契约)与现场层至此互为印证。 同日同一 profile 上验收证据图谱接入已保存证据(ROADMAP §4d)的 G1–G4:证据节点只带来源库 / 稳定标识符 / 核验状态(不含笔记),与同库资源节点连成 **2 个节点 / 1 条关系**,箭头按实际方向选锚点、图谱说明标注含义——**§4d 至此闭环**。(G3 的 `saved-copy` 边因本次会话无同 URL / 标识符来源而未触发,属预期。) > 该缺陷纯逻辑测试无法覆盖(渲染层),只有真实 profile 能暴露——这正是本清单存在的意义。 ### 遗留 1. ~~**R2 缺渲染级自动化测试**~~ **已闭环(2026-09-11)**:`test/render-smoke.test.js` 以真实 `react-dom/server` 渲染初始状态,五处守卫全部覆盖到渲染级——工作台降级提示 + 双按钮 `disabled`(含提供 inputActions 的对照组)、证据库写入按钮 `disabled`、灵感库与数据库面板完整渲染不抛错、输入框浮层关闭态不抛错;异步降级与点击路径由源码接线断言钉住。**边界**:SSR 不执行事件,「点击后不注入」仍由 `planCitationWrite` 三态决策测试 + 接线断言 + 真实 profile(W2/W3)守护;交互级覆盖需引入 jsdom,见 [ROADMAP §1](../ROADMAP.md) 的演进方向。CI 已加 `npm ci` 安装 react/react-dom(仅 devDependencies,运行时仍零依赖)。R2 场景本身仍建议在发布前按 §3 现场构造一次,双保险。 2. **工作台左列非 sticky**:右列详情可达约 1044px,左列列表仅约 415px 且随页面滚走;滚到详情底部出口按钮时列表已滑出视口。建议给左列加 `position: sticky` + 视口内高度约束; 3. **升级 DSH 后必须重跑本清单**:本次验收证明的只是当时那个 DSH build 的 props 形状。 4. **V1–V4 待真实 profile 验收**:§3.1 Viewer 的渲染与交互层(缩放平移 / 范围模式 / 视图链接 / 脱敏导出)自动化只覆盖纯逻辑,现场核对见上表。 5. **自动沉淀链路待真实 profile 验收(A1–A6)**:现场条目已写入(见 §5「自动沉淀链路」),尚未执行。跑法:`npm run build` 重装后在真实 DSH Web profile 上**开启开关 → 提问科研问题 → 图谱应出现知识节点**,再按 A2–A6 逐项核对刷新去重、关闭不回溯、手动入口(图谱页与伴生钮两处);顺路核对宿主集成的 H1 / M1 与动线整合的 L1–L3。 6. **动线整合 P5 待现场核对(L1–L3)**:条目已写入(见「动线整合 · 资产-证据互链」),与 A1–A6 同一次安装走查即可。 > 原遗留第 4 条「§4c 尚未过真实 profile 验收」已于 2026-09-11 闭环(W1–W3 通过),见上文「已完成」。 > 与插件无关但会影响 `dsh plugin` 工作流的两个环境事实:pnpm store 布局主版本与 profile 记录不一致会让命令整体失败(见 §1 环境前置);`remove` 不会清理 `link:` 依赖在 `node_modules` 下的符号链接(因插件树由 `bundles` 驱动,残留链接不会被加载,影响为低)。