Files
dingtalk-workspace-cli/docs/dws-multi-im-optimization-plan.md
T

30 KiB
Raw Blame History

DWS Multi IM 优化方案

状态:Phase 0–4 已在当前分支实施;无下层能力的项目已以 typed 负面边界收口

日期:2026-08-03

DWS 口径:当前分支 codex/multi-im-optimization 及其工作树; 设计对比基线为 017258e5b49517e3787a3d373f90953c128eaf58

对照基线:本机当前安装的 lark-im、lark-shared、lark-contact、 lark-event

详细证据:Lark IM 与 DWS Multi IM Skill 设计对比

1. 一句话结论

DWS Multi IM 已在不推翻 Golden Route、不复制 Lark 全量手册的前提下,完成 Runtime、Schema、Skill 根入口、task references、Event 子产品和发布脚本链路的统一。 Lark 中值得借鉴的精确 task reference、身份能力矩阵、Card 工作流和结果合同 已转化为 DWS 的 typed descriptor 和 drift gate,而不是独立手写事实表。

目标不是“看起来像 Lark”,而是:

任何合法加载路径
→ 选择同一个任务级入口
→ 使用同一个 typed resolver / Runtime gate / DTO
→ 得到可验证、可继续编排的结果

1.1 2026-08-03 实施检查点

当前工作区已完成全部计划交付:

  • 新增 9 条 reviewed 高频 IM intent route fixture,并把 policy 接入 make policy;
  • policy 从 CommandRegistry 绑定真实 Cobra leaf、从 ResolveMeta 读取 confirmation,校验 marker、selection 正负场景、fallback 安全、source-ref 路径/锚点和脚本合同;
  • Chat/Event 根 Skill、任务 references、Mono 入口统一到 Golden Shortcut;原子 leaf 只保留 显式底层 fallback;
  • Chat/Event selection 已收窄,旧单文件 CommandRegistry provenance 已迁移到当前 product shard;
  • Shared 的公开 flag、默认 JSON、无统一成功 envelope、typed error/retry/profile 合同已按当前 Runtime 修正;
  • 3 个 Chat 第二 Runtime 入口、1 个公共 helper 及其 Mono 副本已退役;生成器不再发布它们,policy 用精确退役路径防止回流;
  • 当前分支的群名 resolver 已由并行开发补齐全量分页、停滞游标和安全页数上限保护,并通过 Chat/targetresolver 回归测试。
  • +chat-messages 已支持有界 --page-all、typed continuation、消息去重、完整性 ledger 和 工作区内 .json 原子导出;+conversation-list --page-all 同样遵守服务端页上限并公开截断。
  • Bot 多群发送已下沉 +messages-send --groups|--groups-file,统一确认一次并输出 im.batch-write.v1 逐目标 ledger;
  • +group-members 与 +chat-members-list 已实现用户桶全量分页、稳定 ID 去重、用户/机器人 分桶、有界 continuation 和中途失败的 partial ledger;+chat-create 支持显式 owner 或 歧义安全的 owner 自然查询;
  • 身份、消息结果、Card 流程和 IM 能力边界均有 typed descriptor; contracts.md 的标记区块由 policy 与 Runtime descriptor 逐字节比对;
  • Card 已拆为 create/update/callback/schema 任务 reference;Event IM 已拆为 keys、lifecycle、 output/handoff、operations,Chat/Event 交接 ID 映射由 policy 锁定;
  • 评测中高频出现的群搜索历史路径/位置参数、--chat、单值 --message-ids 和冗余 aisearch --type person 已加入不改变业务语义的兼容层;稳定 ID 类型误用在下层调用前失败。
  • 群机器人、邀请链接和指定群 @我 已接受自然群目标并复用同一歧义安全 resolver;撤回可由 单个消息 ID 只读补齐会话上下文。

对下层当前不存在的 Thread writer、Bot 富媒体、Card action callback 和资源断点续传, 本轮没有伪造实现;它们已进入 typed 负面能力矩阵,Schema/Skill 明确引导到当前可用替代路径。 当平台提供真实下层接口时,再按 Runtime → Schema → task reference → root navigation 新增正向能力。

2. 当前基础与主要问题

2.1 已经做对的部分

当前分支已经完成 IM 高频主链升级:

  • Chat 根 Skill 只保留 Golden Route、关键结果语义和按需 reference 导航;
  • +dm、+send-to-group、+messages-send、+chat-messages、+search-msg、 +chat-create 和 event +listen-im 复用 typed target resolver;
  • 自然目标的零命中和多候选会在写入前停止,解析和执行复用当前 profile;
  • 消息读取具有 complete、hasMore、failures 和资源下载 ledger;+chat-messages 已支持 有界 --page-all 与原子文件导出,+search-msg 支持游标全量搜索和批量富化;
  • +listen-im 能从自然目标和事件意图确定 EventKey 集合,并复用一个 consume 生命周期;
  • 参数、安全、selection 和 interface 由 reviewed Schema 输入与 Runtime 交付。

这里不把“显式稳定 ID 必然在写入前完成跨 profile 校验”列为现有能力。当前 Runtime 没有为 任意显式 ID 携带可验证的 profile provenance;这类 ID 的来源仍由调用方负责,也可能到下游 权限或组织边界才被拒绝。

这些设计不应回退。

2.2 基线审计发现的问题

以下是实施前基线的问题清单。第 1–9 项和可由当前下层支撑的 Runtime 等价能力均已处理; 第 10 项中尚无平台接口的部分以显式负面合同收口,不作为本轮未完成项。

  1. chat-message.md、chat-group.md、chat-bot.md、chat-conversation.md 和 event-im.md 仍会把 Agent 从 Golden Shortcut 带回手工查 ID 或原子命令;
  2. 某些原子写 leaf 的 confirmation 比对应 Golden Shortcut 更弱,reference 回流可能绕开 typed resolver、稳定 DTO 或 typed_yes gate;
  3. Chat 发布包携带 3 个 Python 入口和 1 个公共 helper,其中两个入口直接选择第一个搜索结果;现已从 Multi/Mono 发布树删除,功能由 typed Shortcut 接管;
  4. Mono/Multi 存在同名脚本副本且内容已经分叉;现已取消这组脚本的生成与发布, policy 对全部退役路径 fail closed;
  5. Shared 的全局输出、flag 和错误文档部分落后于当前 Runtime;
  6. 现有 policy 主要证明根 Skill 预算和 Shortcut Runtime,不证明完整加载链一致;
  7. reviewed selection 中仍有 Shortcut 与原子工具同时声明同一高频正向场景,修 reference 不能单独消除 Schema 选路歧义;
  8. selection/chat.json 当前仍有约 120 个 source_refs 指向已不存在的旧版单文件 schema_command_registry.json;已迁移到 schema_command_registry/products/chat.json, Event 同步迁移,并由 policy 校验锚点;
  9. Mono reference 仍直接推荐或列出待迁移脚本;现已迁移到 Runtime 命令并清理发布路径;
  10. DWS 缺少 Lark 已形成闭环的任意 Card 编译/callback、富 Thread 回复等能力;现已对 DWS 真实支持的 streaming-text Card create/update 建立子产品 reference 和 typed workflow, 对 callback/Thread writer 建立显式不支持边界。

3. 优化原则

3.1 一个意图只能有一个默认入口

同一用户终点可以有底层 fallback,但不能在不同文件中出现两个并列默认答案。

例如:

按姓名发消息       → +dm
高级/Bot/Webhook   → +messages-send
建群               → +chat-create
引用回复           → +messages-reply
监听个人 IM        → event +listen-im

原子命令只在 Shortcut 未暴露的特殊字段、原始响应或底层运维控制场景出现,并必须写明 fallback_reason、能力损失和确认差异。

高频意图使用 reviewed、机器可读的路由清单固定默认工具与允许 fallback,例如:

{
  "intent_id": "chat.create",
  "preferred_tool": "chat.shortcut_chat_create",
  "allowed_fallbacks": [
    {
      "tool": "chat.create_group_conversation",
      "reason_code": "shortcut_missing_required_field"
    }
  ]
}

清单建议位于 scripts/policy/multi-im-skill-chain/testdata/intent_routes.json,reference 只写精确的 intent_id marker。它只拥有高频任务的选路断言,不创建命令身份、CLI path、参数或安全事实: canonical tool 必须由 reviewed CommandRegistry 解析,confirmation 必须由 ResolveMeta 读取, selection 正负场景仍由 schema_hints/selection/<product>.json 拥有。

3.2 Skill 负责选路,Runtime 负责确定性执行

Skill 不应自己完成以下工作:

  • 搜索后选择 users[0] 或 groups[0];
  • 手工拼接跨步骤 ID;
  • 自己兼容多代 JSON envelope;
  • 用脚本重新实现分页、下载、重试、幂等和 partial failure;
  • 根据文案猜测 confirmation。

这些都应由 typed resolver、Shortcut、稳定 DTO 和最终 Schema/Runtime gate 承担。

3.3 Reference 只拥有一种主要职责

每个 reference 应明确属于以下一种类型:

类型 内容 不应包含
Task reference 默认入口、任务边界、结果、错误和 continuation 全量原子 Catalog
Platform semantics 对象区别、身份限制、平台不可推导规则 重复完整 flags 表
Atomic fallback Shortcut 未覆盖的底层能力 高频意图选路
Static resource emoji、枚举、Card 组件等受控数据 业务工作流

3.4 不改变现有稳定 Schema wire contract

优化应复用当前 CommandRegistry、ToolSpec、Schema Catalog 和 ResolveMeta 单一来源。 文档对齐不构成修改 JSON wire contract、重建第二套 identity source 或从生成物反向合并的 理由。

3.5 Profile 保证分层表达

  • 自然目标:resolver 在当前 profile 内完成唯一解析,并由同一 RuntimeContext 执行;
  • Agent 编排:reference 和 script 禁止缓存后跨 profile 复用解析结果;
  • 显式稳定 ID:没有 provenance 时不承诺本地预写拦截,只能说明其来源由调用方负责;
  • 若未来需要硬保证,应引入携带 profile/organization provenance 的 typed target,并让写入 Shortcut 验证它;不能只靠 Skill 文案宣称已经实现。

4. 从 Lark 借鉴什么

4.1 借鉴精确 task reference

Lark 为高阶 Shortcut 提供精确 reference,每个文件通常包含:

适用任务
→ 身份/权限
→ 参数边界
→ 输出字段与完整性
→ 常见错误
→ 后续动作

DWS 不需要为 97 个 Chat Shortcut 各建一个文件,但高频且语义复杂的任务应采用这个 模板。优先覆盖:

  • 消息发送;
  • 消息读取/搜索/资源;
  • 引用回复与转发;
  • 建群与批量成员解析;
  • Bot/Webhook;
  • 实时 IM 监听;
  • Card 创建/更新及未来 callback。

4.2 借鉴显式身份能力矩阵

Lark 会明确 user/bot 的 token、可见性、群成员关系和 Scope 差异。DWS 已在 Runtime 中 校验真实能力,但不能再由 Skill 手写一份独立事实表。应先在 internal/shortcut/chat/ 抽取 typed identity capability descriptor,至少表达 identity、target kinds、content kinds、自然目标 解析支持和失败恢复类别,并让现有校验逻辑与测试共同约束它。

短矩阵由该 descriptor 与最终 leaf Schema/Help 受控生成或校验后再投影到 Skill。过渡期只链接 精确 leaf Schema,不复制 user/bot/webhook 能力表。矩阵只描述 DWS Runtime 已发布事实,不从 Lark 推导平台能力,也不成为新的身份或参数来源。

4.3 借鉴结果合同和富化说明

Lark 对 reaction、更新时间、thread、资源下载、分页和缺字段语义有精确说明。DWS 已有更强 的完整性 ledger,应把它固定为所有消息读取 Shortcut 的公共合同:

  • 稳定消息投影字段;
  • reaction/updateTime/resourceRefs 的来源;
  • --no-reactions 与 --download-resources 的成本边界;
  • complete=false、hasMore=true、单项 failure 的含义;
  • 子消息 ID 与父 conversation fallback 规则;
  • 下载的相对路径、默认不覆盖、原子落盘和跨主机 header 规则。

发布公共文档前,应在 internal/shortcut/chatmsg/ 抽取 typed message result contract,使 Runtime 输出、分页/完整性测试和文档投影共享同一组字段定义。生成的 Markdown 片段只能单向发布到 Skill,不能反向作为 Catalog、参数或 Runtime 输入。过渡期 references 只链接精确 leaf Schema 并说明当前单页边界,不复制一张可能漂移的字段表。

4.4 借鉴 Card 子产品化

Lark Card 不是一个散落的 JSON 示例,而是独立的 workflow + schema + style + components + callback 子树。DWS 若继续扩展卡片能力,也应采用同样的分层思想:

card/
├── create.md          # 创建/校验/发送流程
├── update.md          # 流式状态与结束状态
├── callback.md        # 当前负面边界;平台真实支持后升级
├── schema.md          # DWS 卡片模型,不复制 Lark JSON
├── style.md           # 可选的 Agent 设计规则
└── components/        # 仅收录 DWS Runtime 真正支持的组件

在 callback 或任意组件下层未真实支持前,Skill 必须明确 avoid_when,不能通过文档先行 伪造能力。

4.5 借鉴“脚本不是第二 Runtime”

Lark IM 没有产品脚本重新解析 CLI 输出;分页、富化、下载、目标解析和事件生命周期都在 Shortcut/CLI 内。DWS 应采用同一原则:

  • 完全被 Shortcut 覆盖的脚本删除;
  • 仍有通用价值的批量流程下沉为 typed Runtime Shortcut;
  • 只有暂时无法下沉的纯结果格式转换才允许脚本存在,而且只能消费稳定 DTO,不调用原子 写命令,也不能自行做候选选择。

4.6 借鉴精确 Event 运维合同

保留 Lark 值得借鉴的 ready marker、stdin/SIGTERM 干净退出、结构化错误和禁止 kill -9 规则;继续使用 DWS 更适合 Agent 的多 EventKey 单生命周期和自然目标编译,不退回 “一 EventKey 一进程”。

5. 不应照搬什么

  • 不复制 Lark 的 open_id、chat_id、message_id、Scope 和 EventKey;
  • 不假设 DWS user/bot 对富媒体、Thread、Card 的支持与 Lark 对称;
  • 不把 Lark Feed Group、Feed Shortcut、Flag 字段直接映射成 DWS category/Top/Favorite;
  • 不强制所有正常 Chat 任务预加载完整 dws-shared;
  • 不在 DWS 根 Skill 放完整原子 API、静态 Scope 表或 97 条 Shortcut Catalog;
  • 不为文件数量对齐而机械创建 58 个 reference;
  • 不采用一 EventKey 一进程的 Lark 实现限制;
  • 不因借鉴 Lark 而修改 DWS 已发布的稳定 Schema wire contract。

6. 按文件的实施结果

6.1 Chat 根 Skill

文件:skills/multi/dingtalk-chat/SKILL.md

保持了小根入口,没有重新展开完整 Shortcut 表,并已补充:

  1. identity/message/Card/capability boundary 的单一 typed contract reference;
  2. 消息分页/导出、Bot 多群 ledger、owner 选择和 Card 负面边界的精确入口;
  3. 只包含 intent_id 的导航校验 marker,默认工具从 reviewed 路由清单解析;
  4. Card create/update/callback/schema 子产品的直达链接。

6.2 Chat references

文件 实施结果
01-messaging.md 作为任务级编排主 reference,已接入 identity/result/fallback 合同
chat-message.md 默认发送/回复/读取/搜索已收敛到 Golden Shortcut;明确 Thread writer、callback 和 resume 的负面边界
chat-group.md 建群统一到 +chat-create;新增 owner 选择、成员全量分页和用户/机器人分桶语义
chat-bot.md Bot/Webhook 发送统一到 +messages-send;补多群 ledger,明确 Bot 富媒体当前不支持
chat-conversation.md 按会话 Top/消息 Top/Favorite/category 分流,自然目标统一走 typed resolver
chat.md 已降级为低频原子 Catalog,不与高频 Golden Route 竞争
intent-guide.md 保留对象层级消歧和禁止回流原子写路径的负例
lite-recipes.md 已删除无信息中转层
chat-emoji-list.md 已标注 reviewed snapshot 来源、更新日期和维护方式
contracts.md 新增 typed 身份、消息结果、Card 和能力边界投影,受 byte-exact policy 约束
card/ 新增 create/update/callback/schema 四个子产品 reference

6.3 Event

已实施文件:

实施结果:

  1. 保留 +listen-im 为消息/reaction/read/recall 的唯一高频入口;
  2. 自动回复示例统一使用 dws chat +messages-send;
  3. 将旧宽 reference 拆为 EventKey/Filter、lifecycle、output/handoff、operations/troubleshooting;
  4. 根 Skill 只保留 ready、bounded/unbounded、干净退出等不可省略的宿主合同;
  5. 订阅保护文件、重试预算和紧急恢复进入 operations reference;
  6. 增加 Chat/Event 交接 drift gate,确保 conversation_id 和 sender_open_dingtalk_id 只映射到对应稳定 ID 参数。
文件/产品 实施结果
dws-shared/global-reference.md 已按当前 Help/Runtime 修复默认输出、全局 flag 和 envelope
dws-shared/error-codes.md 已修复 Chat text/flag、confirmation 和 profile 错误恢复说明
dws-shared/SKILL.md 已将最小契约覆盖说明收窄到真实发布边界
dingtalk-profile 继续拥有组织/profile 选择;Chat reference 只引用,不复制
dingtalk-contact 明确资料查询与完整手机号职责;普通 DM 不再要求先 Contact
dingtalk-aisearch 保留人员语义和跨源搜索;普通发消息/读群不再成为强制前置

6.5 产品 scripts

退役 script Runtime 替代
chat_history_with_user.py +chat-messages --user-query --page-all --output *.json
chat_export_messages.py +chat-messages --chat-query --page-all --output *.json
bot_broadcast.py `+messages-send --as bot --groups

3 个入口和 1 个公共 helper 的 Multi/Mono 共 8 个发布路径已删除,生成器不再复制; 退役清单受 policy 精确路径校验。 替代能力已覆盖目标唯一解析、分页终止/停滞防护、页数/条数上限、partial failure、 完整性 ledger、安全输出路径、默认不覆盖、原子发布和批量写逐项结果。

6.6 Schema 与 Runtime

  1. 不因文档修改机械改 reviewed CommandRegistry;当前分支的根清单位于 schema_command_registry/registry.json, Chat owning shard 位于 products/chat.json。只有 canonical identity、primary path、alias 或 visibility 真正变化时才修改;
  2. selection 路由变化写入 schema_hints/selection/chat.json; 高频路由调整必须同时处理 Shortcut 和对应原子工具:Shortcut 承接普通正向场景,原子工具 只保留未覆盖字段/原始响应场景,并在 avoid_when 中明确普通任务走 Shortcut;
  3. confirmation、runtime gate、interface 或参数 overlay 变化写入 schema_hints/metadata/chat.json;
  4. Event 同理修改各自 owning block;
  5. typed resolver、消息投影、下载 ledger 和 Event consume 保持共享组件,不在每个 Shortcut 复制实现;
  6. 修复 selection/chat.json 中指向旧版 schema_command_registry.json 的失效 source_refs,并增加精确路径存在性校验;
  7. 新 Card/Thread/资源能力必须先有 Runtime 与 typed contract,再写 Skill reference。

7. 分阶段实施结果

Phase 0:冻结正确主链(已完成)

  • 9 个高频 intent 已有 reviewed route fixture 和精确 marker;
  • canonical path 由 CommandRegistry 解析,confirmation 由 ResolveMeta 读取;
  • policy 会拒绝孤儿/重复 marker、非法 fallback、安全降级、失效 source-ref 和根导航断链。

Phase 1:selection、文档与 provenance 收敛(已完成)

  • Chat/Event 根入口、冲突 references、Mono 产品索引和 Shared 合同已统一;
  • Shortcut 承接普通正向场景,原子 leaf 仅保留特殊字段/原始响应 fallback;
  • Chat/Event source_refs 已迁移到当前 product shard。

Phase 2:Runtime 等价能力与脚本退役(已完成)

  • +chat-messages 具备有界全量分页、typed continuation、去重、停滞防护、partial ledger 和安全 .json 原子导出;
  • Bot broadcast 已下沉为 +messages-send 多群模式和 im.batch-write.v1;
  • 3 个 Chat 入口、1 个公共 helper 及其 Mono 副本(共 8 个路径)已删除,policy 防止重新发布。

Phase 3:精确 references 与 typed 合同(已完成)

  • 发送、读取/资源、回复/转发、建群、Bot/Webhook 已按任务边界收敛;
  • identity/message/Card/capability boundary 从 typed Runtime descriptor 投影到 contracts.md;
  • Event IM 宽文件已拆为 4 个按需 reference,Card 已建立 4 个子产品 reference。

Phase 4:真实能力闭环(已完成可实现范围)

能力 完成状态
群成员全量分页/分桶/partial result 已实现,并将 +chat-members-list 纳入 reviewed Schema
显式 owner/自然 owner 建群 已实现并去重 owner/member
streaming-text Card create/update 已建立 typed workflow、flow-status validation 和精确 references
身份矩阵 已实现 user/bot/webhook 目标、内容、自然解析、幂等和 ledger 合同
Thread writer 下层无接口;typed boundary 明确 supported=false
Bot 富媒体 下层当前仅 text/markdown;typed boundary 明确禁止宣告支持
Card action callback 下层无 callback 消费链;callback reference 只描述负面边界
资源断点续传 下层无 Range/resume;保留原子落盘与默认不覆盖

这些负面项不是文档遗漏,而是当前平台真实能力的 fail-closed 交付。

8. 已落地门禁

本轮已新增:

scripts/policy/check-multi-im-skill-chain.sh
scripts/policy/multi-im-skill-chain/main.go
scripts/policy/multi-im-skill-chain/main_test.go
scripts/policy/multi-im-skill-chain/testdata/intent_routes.json

该布局沿用现有 scripts/policy/*/main.go 约定,已接入 make policy。 intent_routes.json 是 reviewed policy fixture,不是 CommandRegistry、参数或安全元数据来源。

至少检查:

  1. Chat/Event 根 Skill 的所有相对 reference 链接可解析;
  2. 每个受控 reference marker 都能精确映射到唯一 manifest intent,且没有孤儿或重复 ID;
  3. manifest 的 preferred/fallback canonical tool 都能经当前 CommandRegistry 绑定到可执行 Cobra leaf;
  4. 标记区块中的默认 CLI path 与 preferred tool 一致,不出现未允许的原子 fallback;
  5. Shortcut 与对应原子工具的 selection 正负场景符合 manifest 的默认/例外关系;
  6. 写路径的 Runtime confirmation 通过 ResolveMeta 获取并与文档声明一致;
  7. source_refs 中的仓库路径和锚点可解析,不再接受旧 CommandRegistry 路径;
  8. 退役脚本的 Multi/Mono 精确路径不得再出现;
  9. Chat/Event 交接必须使用稳定 conversation/sender ID;
  10. identity/message/Card/capability boundary 文档片段必须与 typed descriptor 逐字节一致;
  11. Shared 文档中的 flag/example 能通过真实 Cobra command tree;
  12. 新 +chat-members-list leaf 必须持续绑定真实 Cobra/Schema 命令;
  13. 只扫描 manifest 和 marker 声明的精确文件/区块,不用自然语言相似度,也不使用会隐藏 未来命令的通配豁免。

9. 验证矩阵

当前分支的最终验证矩阵为:

python3 scripts/gen_skill_shortcut_sections.py --check
./scripts/policy/check-multi-im-skill-chain.sh
./scripts/policy/check-skill-context-budget.sh
./scripts/policy/check-skill-commands.sh
./scripts/policy/check-runtime-confirmation-truth.sh
./scripts/policy/check-schema-catalog.sh
./scripts/policy/check-generated-drift.sh

go test ./internal/shortcut/targetresolver -count=1
go test ./internal/shortcut/chat ./internal/shortcut/smart ./internal/app \
  -run 'Test.*(NaturalTarget|MessageView|MessagesSend|MessagesReply|ChatCreate|ListenIM)' \
  -count=1
go test ./internal/app -run '^(TestEventListenIM|Test.*ListenIM.*)$' -count=1

由于本轮修改了 Agent-visible command、selection、metadata 和参数,以下生成与交付校验为必跑项:

make generate-schema
./scripts/policy/check-runtime-confirmation-truth.sh
./scripts/policy/check-generated-drift.sh
./scripts/policy/check-schema-catalog.sh

真实写审计只在需要验证对应能力时运行,不能用 live audit 代替上述确定性门禁。

9.1 本轮最终结果

2026-08-03 在当前稳定工作树上复验:

  • make generate-schema 成功:26 产品、849 工具、159 组参数别名;
  • Multi IM policy 通过:9 个 reviewed intent;
  • Skill 命令面通过:1009 条可执行 path;
  • Runtime confirmation truth 通过:137 个 gated 工具;
  • Schema Catalog、CommandRegistry 和两次独立生成漂移检查通过;
  • DWS_PACKAGE_VERSION=0.0.0-test go test -p 1 ./... 通过;默认包级并行复跑曾因 internal/helpers 的共享测试环境竞争失败一次,该包隔离强制复跑通过;
  • go build -o /tmp/dws-multi-im-build ./cmd 通过。

9.2 真实环境端到端审计

2026-08-03 使用当前分支构建的 CLI、有效个人登录态和真实 DingTalk 后端完成两组审计。 报告只保留命令名、下层工具名、数量和脱敏错误类别,不落业务 payload:

python3 scripts/run_chat_shortcut_live_audit.py \
  --dws /tmp/dws-multi-im-final \
  --out-dir /tmp/dws-im-live-audit-019fc653/read-current-branch \
  --timeout 90 --max-group-probes 8 --max-member-probes 8

python3 scripts/run_chat_shortcut_live_write_audit.py \
  --dws /tmp/dws-multi-im-final \
  --out-dir /tmp/dws-im-live-audit-019fc653/write-current-branch \
  --timeout 90 --yes-live

结果:

  • 读链路共 34 项:28 项 pass,2 项 pass_empty,4 项 fixture_blocked,无投影 不一致、下层错误或超时;
  • 写链路共 57 项:46 项 pass,11 项 external_fixture_required,无执行错误;
  • 写审计使用单用户临时群,并在 finally 中恢复可逆开关、解散临时群;按 4 类审计 名称前缀复查,残留为 0;
  • 未覆盖项都保留精确 fixture 原因:数字 groupId、真实 openTaskId、媒体消息、配置 完成的机器人/Webhook、第二测试成员和待审批入群请求;不使用业务数据伪造通过;
  • +conversation-mute-at-all 和 +conversation-mute-red-envelope 均在真实环境通过,旧 Mono reference 的“当前不可用”结论已移除;真实前置条件是先开启总免打扰,否则平台返回 NotificationOffNotEnabled;连续审计两个子开关时,红包应先于 @所有人,或在恢复 @所有人通知后重新开启总免打扰;
  • +at-me 曾因上层同时提供 messages/items 兼容别名被审计器重复计数,现固定选择一个 canonical message projection;该问题属于审计器误报,不是 Runtime 数据丢失;
  • 首轮 +messages-list-unread-conversations 出现一次瞬时后端超时,同一原子入口和最终 完整复测均通过,未将瞬时故障掩盖为 contract-only。

真实审计补充确定性门禁,但不替代 Schema、policy、单元测试和全量 Go 测试。

10. 完成定义

DWS Multi IM 优化完成应同时满足:

  • 根 Skill、所有精确 references 和相关子产品对同一意图选择同一默认入口;
  • 不存在自然目标取第一候选、reference 指示跨 profile 复用解析结果或第二 Runtime 猜 envelope;没有 typed provenance 时,不对任意显式稳定 ID 宣称本地跨 profile 硬校验;
  • 写操作的 confirmation 在文档、Schema、Runtime 和最终交付路径一致;
  • 单页和全量消息读取、资源下载始终暴露完整性/失败 ledger;全量替代脚本时具备明确分页 上限、终止和导出合同;
  • 高频任务不需要预加载完整 Shared、产品 Catalog 或原子命令全集;
  • 原子 fallback 有明确原因和能力损失说明;
  • Shortcut/原子 selection 不为同一普通任务同时声明正向默认入口;
  • reviewed source_refs 指向当前存在的 authored source 或可验证 Runtime evidence;
  • 退役脚本不在 Mono/Multi 发布树中,且不会被生成器重新引入;
  • Card、Thread、Bot、资源等能力只发布下层真实支持的正向范围,其余由 typed 负面边界防止误选;
  • 所有生成、Schema、policy 和 focused Runtime tests 通过;
  • 不改变未版本化的稳定 Schema wire contract。

11. Review 交接

当前工作树已同时包含路由/文档、Runtime 等价能力、脚本退役和真实能力边界四类改动。 Review 建议按以下四个逻辑分组查看,但不应将它们当作未完成的后续 PR:

  1. reviewed intent route、selection/metadata、CommandRegistry 与生成 Catalog;
  2. typed resolver、message/member/card/identity contracts 与 Runtime tests;
  3. Chat/Event/Card references、Shared/Mono 消费者与 typed drift policy;
  4. 退役脚本、生成器发布边界与防回流门禁。