DWS Wiki Shortcut 全景评审

以 13 项成熟 Wiki 用户任务为基线,重新审视 DWS 的空间、成员、节点与动态能力。本次不是按命令名凑数:每个入口都要求真实业务证据,缺失数组、畸形响应、空确认或读回不一致一律失败。

评审日期 2026-08-14独立 worktree / 独立分支真实组织数据 E2E 28/28报告已去标识化
20公开 Wiki Shortcuts
13/13基线用户任务有对应路径
7DWS 额外场景
20/20真实数据能力已触达

结论先行

DWS 已形成比“API 快捷别名”更完整的 Wiki 任务层。 基线中的 13 个用户任务均有对应入口;DWS 还提供空间搜索/详情/唯一解析、成员角色更新、库内节点搜索、协作动态和按空间名新建文档。创建、复制、移动等关键写能力从“请求发出”升级为“终态 + ID + 读回”成功标准。
能力边界必须诚实表达。 DingTalk 成员接口不提供游标,单次真实上限是 50,因此不能实现成员 --page-all;成员身份只接受同组织可用的 userId,无法提供 email/open_id 等多种身份模式;节点创建也没有等价的 origin/shortcut 模式。这些差异保留为明确边界,而不是用本地循环或空结果伪装。

13 项基线任务逐条映射

基线任务DWS 主入口结论DWS 视角与边界
+space-listwiki +space-list完整对齐严格空集合、游标续传、自动翻页、停滞检测;支持组织/我的知识库。
+space-createwiki +space-create超过公开真实 32 字符名称上限;创建后按 workspaceId 读回。
+delete-spacewiki +delete-space超过预读目标、高风险确认、只接受 success=true;兼容 +space-delete。
+member-addwiki +member-add任务对齐支持 1–30 个 userId 与四种角色;以写接口终态作为成功证据,不把最多 50 条的名单误作精确读回。
+member-listwiki +member-list任务对齐严格成员数组、角色过滤、真实上限 50;后端无游标,不能提供诚实的 page-all。
+member-removewiki +member-remove任务对齐支持批量 userId;只接受写接口明确终态,并公开无法进行精确成员读回的边界。
+node-listwiki +node-list完整对齐正确跨域路由 doc/list_nodes,严格空目录、分页与自动翻页。
+node-getwiki +node-get任务对齐支持 DingTalk 节点 ID/在线文档 URL 并返回文档域元数据;不接受跨平台专用的 token/type 组合。
+node-createwiki +node-create任务对齐支持 adoc/axls/able/appt/adraw/amind/folder 并读回;无 origin/shortcut 等价接口。
+node-copywiki +node-copy超过确认后要求新 nodeId 并读取副本;底层面向在线节点,不把 .dlink 当独立副本。
+movewiki +move任务对齐同一入口支持 Wiki 内移动和“我的文档”在线节点入 Wiki,读回 workspace/folder;底层接口没有 apply 权限迁移开关。
+move-to-drivewiki +move-to-drive超过DWS 当前接口同步完成并读回 workspace 变化,无需暴露异步 task 轮询。
+node-deletewiki +node-delete超过预读并核对 workspace,高风险确认,要求删除终态。

DWS 可挖掘的 7 个额外场景

定位与创建链

  • +space-search:严格关键词搜索。
  • +space-get:空间详情与 workspaceId 证据。
  • +resolve-space:唯一命中直出 ID,多命中拒绝猜测。
  • +wiki-new-doc:空间名解析 → 创建 → 文档读回。

治理与巡检链

  • +member-update:角色变更终态与不可精确读回声明。
  • +node-search:库内关键词/扩展名搜索,严格零命中。
  • +feed-list:知识库动态时间线与服务端 exclude-file 过滤。

隐藏问题与修复

原问题错误风险本次修复
5 个旧 Wiki Shortcut 可直接执行,但只有 1 个进入公开目录。Help、Schema、Skill 发现链与运行面漂移。20 项统一评审 全部具备 Contract/Safety/Result 与语义目录记录。
列表投影找不到数组或遇到坏元素时返回空 slice。把内部错误、字段漂移误报为“没有数据”。失败关闭 只有响应中真实存在的 [] 才是合法空集合。
节点列表 Shortcut 调错 Wiki MCP 服务。真实后端 success=false,Mock/静态检查看不出。跨域路由 明确调用 doc/list_nodes,并纳入真实 E2E。
成员帮助宣称最大 200。真实接口超过 50 直接参数错误。真实上限 Shortcut 与原子 Help 均改为 50,并在本地提前拒绝。
成员写操作从最多 50 条、不可分页的名单推断成员存在或缺失。目标在截断部分时会误报写失败,或把未验证的移除报告为已读回。终态证据 只接受写接口 success=true,并在结果中明确 readbackAvailable=false。
空间搜索的稳定工作流属性名与实际请求属性名不同。直接改写已发布的 query/limit 会造成无版本 Schema 破坏;继续隐式转换又会让审计者误以为请求同名透传。显式复合适配 最终 Schema 保留兼容属性并明确声明转换为 keyword/pageSize;回归测试同时锁定最终交付和精确请求参数。
知识库名称帮助宣称最大 100。真实接口超过 32 失败。真实上限 Help 与 Shortcut 校验统一为 32。
复制/移动/创建只把无异常视为成功。空确认、未知远端效果或移动未到目标仍可能被接受。读回证明 在后端具备精确查询能力时检查 success、业务 ID、workspace/folder 等最终状态。

真实数据 E2E 证据矩阵

28 项业务断言全部通过。测试使用一次性空知识库、临时在线文档与一名同组织内部测试成员;所有对象在 finally 清理。报告不保存对象 ID、成员身份、组织信息、URL、trace 或原始响应。

分组Shortcut实际业务断言状态
空间+space-list真实 count、hasMore、nextCursor;自动翻页返回两页结果。PASS
空间+space-search等待搜索索引后命中一次性 workspaceId。PASS
空间+space-get读回 workspaceId 与创建结果一致。PASS
空间+resolve-space唯一名称解析为同一 workspaceId。PASS
空间+space-createsuccess=true、workspaceId 非空、详情读回一致。PASS
空间+delete-space目标预读、确认、success=true;兼容别名执行 finally 清理。PASS
成员+member-list真实 owner 条目与显式 members 数组,limit=50。PASS
成员+member-add命令只报告写终态;一次性小规模空间另行确认名单完整且角色为 READER。PASS
成员+member-update命令只报告写终态;一次性小规模空间另行确认角色变为 EDITOR。PASS
成员+member-remove命令只报告写终态;一次性小规模空间另行确认完整名单中不存在该 userId。PASS
节点+node-list空库返回真实 nodes:[];有数据时验证游标与自动翻页。PASS
节点+node-get读回 nodeId 与请求一致。PASS
节点+node-search等待索引后按标题命中真实 nodeId。PASS
节点+node-create分别创建 folder/adoc,均取得 nodeId 和元数据读回。PASS
节点+node-copy取得不同的新 nodeId,副本元数据可读。PASS
节点+move读回 workspaceId 与 folderId 均等于目标;兼容 +node-move。PASS
节点+move-to-drive移动后读回 workspace 发生变化,再通过 +move 移回。PASS
节点+node-delete目标预读与 workspace 核对后收到 success=true。PASS
节点+wiki-new-doc按唯一空间名创建,nodeId 与文档详情读回一致。PASS
动态+feed-list创建/移动操作后返回真实 feeds 数组,缺字段不会被接受。PASS

可复跑入口:make build 后设置临时 DWS_WIKI_E2E_MEMBER_ID,在交互终端运行 ./scripts/dev/wiki-shortcut-e2e.py。脚本只输出能力标签,不输出业务对象;受保护操作及最终清理均由命令逐项获取终端确认,非交互环境会在创建测试数据前拒绝运行。

成功判定与发布门

运行时证据层

  1. 传输/MCP 调用成功。
  2. 响应契约存在且类型正确。
  3. 写操作必须有 success=true;创建类操作还必须有业务 ID。
  4. 后端具备精确查询时必须读回;不具备时明确发布不可读回,而非从截断集合推断。
  5. 集合只有显式数组才允许为空。

交付门

  1. 20/20 语义目录与注册面精确覆盖。
  2. Contract、Safety、Result、统一输出完整。
  3. 生成漂移、Schema、确认真值、全量 Go 测试。
  4. 独立真实数据 E2E 与 finally 清理。
  5. diff PII/密钥/本地绝对路径扫描。