DWS Wiki Shortcut 全景评审
以 13 项成熟 Wiki 用户任务为基线,重新审视 DWS 的空间、成员、节点与动态能力。本次不是按命令名凑数:每个入口都要求真实业务证据,缺失数组、畸形响应、空确认或读回不一致一律失败。
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-list | wiki +space-list | 完整对齐 | 严格空集合、游标续传、自动翻页、停滞检测;支持组织/我的知识库。 |
+space-create | wiki +space-create | 超过 | 公开真实 32 字符名称上限;创建后按 workspaceId 读回。 |
+delete-space | wiki +delete-space | 超过 | 预读目标、高风险确认、只接受 success=true;兼容 +space-delete。 |
+member-add | wiki +member-add | 任务对齐 | 支持 1–30 个 userId 与四种角色;以写接口终态作为成功证据,不把最多 50 条的名单误作精确读回。 |
+member-list | wiki +member-list | 任务对齐 | 严格成员数组、角色过滤、真实上限 50;后端无游标,不能提供诚实的 page-all。 |
+member-remove | wiki +member-remove | 任务对齐 | 支持批量 userId;只接受写接口明确终态,并公开无法进行精确成员读回的边界。 |
+node-list | wiki +node-list | 完整对齐 | 正确跨域路由 doc/list_nodes,严格空目录、分页与自动翻页。 |
+node-get | wiki +node-get | 任务对齐 | 支持 DingTalk 节点 ID/在线文档 URL 并返回文档域元数据;不接受跨平台专用的 token/type 组合。 |
+node-create | wiki +node-create | 任务对齐 | 支持 adoc/axls/able/appt/adraw/amind/folder 并读回;无 origin/shortcut 等价接口。 |
+node-copy | wiki +node-copy | 超过 | 确认后要求新 nodeId 并读取副本;底层面向在线节点,不把 .dlink 当独立副本。 |
+move | wiki +move | 任务对齐 | 同一入口支持 Wiki 内移动和“我的文档”在线节点入 Wiki,读回 workspace/folder;底层接口没有 apply 权限迁移开关。 |
+move-to-drive | wiki +move-to-drive | 超过 | DWS 当前接口同步完成并读回 workspace 变化,无需暴露异步 task 轮询。 |
+node-delete | wiki +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-create | success=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。脚本只输出能力标签,不输出业务对象;受保护操作及最终清理均由命令逐项获取终端确认,非交互环境会在创建测试数据前拒绝运行。
成功判定与发布门
运行时证据层
- 传输/MCP 调用成功。
- 响应契约存在且类型正确。
- 写操作必须有
success=true;创建类操作还必须有业务 ID。 - 后端具备精确查询时必须读回;不具备时明确发布不可读回,而非从截断集合推断。
- 集合只有显式数组才允许为空。
交付门
- 20/20 语义目录与注册面精确覆盖。
- Contract、Safety、Result、统一输出完整。
- 生成漂移、Schema、确认真值、全量 Go 测试。
- 独立真实数据 E2E 与 finally 清理。
- diff PII/密钥/本地绝对路径扫描。