30 KiB
DWS Multi IM 优化方案
状态:Phase 0–4 已在当前分支实施;无下层能力的项目已以 typed 负面边界收口
日期:2026-08-03
DWS 口径:当前分支
codex/multi-im-optimization及其工作树; 设计对比基线为017258e5b49517e3787a3d373f90953c128eaf58对照基线:本机当前安装的
lark-im、lark-shared、lark-contact、lark-event
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 项中尚无平台接口的部分以显式负面合同收口,不作为本轮未完成项。
chat-message.md、chat-group.md、chat-bot.md、chat-conversation.md和event-im.md仍会把 Agent 从 Golden Shortcut 带回手工查 ID 或原子命令;- 某些原子写 leaf 的 confirmation 比对应 Golden Shortcut 更弱,reference 回流可能绕开
typed resolver、稳定 DTO 或
typed_yesgate; - Chat 发布包携带 3 个 Python 入口和 1 个公共 helper,其中两个入口直接选择第一个搜索结果;现已从 Multi/Mono 发布树删除,功能由 typed Shortcut 接管;
- Mono/Multi 存在同名脚本副本且内容已经分叉;现已取消这组脚本的生成与发布, policy 对全部退役路径 fail closed;
- Shared 的全局输出、flag 和错误文档部分落后于当前 Runtime;
- 现有 policy 主要证明根 Skill 预算和 Shortcut Runtime,不证明完整加载链一致;
- reviewed selection 中仍有 Shortcut 与原子工具同时声明同一高频正向场景,修 reference 不能单独消除 Schema 选路歧义;
selection/chat.json当前仍有约 120 个source_refs指向已不存在的旧版单文件schema_command_registry.json;已迁移到schema_command_registry/products/chat.json, Event 同步迁移,并由 policy 校验锚点;- Mono reference 仍直接推荐或列出待迁移脚本;现已迁移到 Runtime 命令并清理发布路径;
- 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 表,并已补充:
- identity/message/Card/capability boundary 的单一 typed contract reference;
- 消息分页/导出、Bot 多群 ledger、owner 选择和 Card 负面边界的精确入口;
- 只包含
intent_id的导航校验 marker,默认工具从 reviewed 路由清单解析; - 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
已实施文件:
skills/multi/dingtalk-event/SKILL.mdevent-im.mdevent-im-keys.mdevent-im-lifecycle.mdevent-im-output.mdevent-im-operations.md
实施结果:
- 保留
+listen-im为消息/reaction/read/recall 的唯一高频入口; - 自动回复示例统一使用
dws chat +messages-send; - 将旧宽 reference 拆为 EventKey/Filter、lifecycle、output/handoff、operations/troubleshooting;
- 根 Skill 只保留 ready、bounded/unbounded、干净退出等不可省略的宿主合同;
- 订阅保护文件、重试预算和紧急恢复进入 operations reference;
- 增加 Chat/Event 交接 drift gate,确保
conversation_id和sender_open_dingtalk_id只映射到对应稳定 ID 参数。
6.4 Shared、Profile、Contact 与 AI Search
| 文件/产品 | 实施结果 |
|---|---|
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
- 不因文档修改机械改 reviewed CommandRegistry;当前分支的根清单位于
schema_command_registry/registry.json, Chat owning shard 位于products/chat.json。只有 canonical identity、primary path、alias 或 visibility 真正变化时才修改; - selection 路由变化写入
schema_hints/selection/chat.json; 高频路由调整必须同时处理 Shortcut 和对应原子工具:Shortcut 承接普通正向场景,原子工具 只保留未覆盖字段/原始响应场景,并在avoid_when中明确普通任务走 Shortcut; - confirmation、runtime gate、interface 或参数 overlay 变化写入
schema_hints/metadata/chat.json; - Event 同理修改各自 owning block;
- typed resolver、消息投影、下载 ledger 和 Event consume 保持共享组件,不在每个 Shortcut 复制实现;
- 修复
selection/chat.json中指向旧版schema_command_registry.json的失效source_refs,并增加精确路径存在性校验; - 新 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、参数或安全元数据来源。
至少检查:
- Chat/Event 根 Skill 的所有相对 reference 链接可解析;
- 每个受控 reference marker 都能精确映射到唯一 manifest intent,且没有孤儿或重复 ID;
- manifest 的 preferred/fallback canonical tool 都能经当前 CommandRegistry 绑定到可执行 Cobra leaf;
- 标记区块中的默认 CLI path 与 preferred tool 一致,不出现未允许的原子 fallback;
- Shortcut 与对应原子工具的 selection 正负场景符合 manifest 的默认/例外关系;
- 写路径的 Runtime confirmation 通过
ResolveMeta获取并与文档声明一致; source_refs中的仓库路径和锚点可解析,不再接受旧 CommandRegistry 路径;- 退役脚本的 Multi/Mono 精确路径不得再出现;
- Chat/Event 交接必须使用稳定 conversation/sender ID;
- identity/message/Card/capability boundary 文档片段必须与 typed descriptor 逐字节一致;
- Shared 文档中的 flag/example 能通过真实 Cobra command tree;
- 新
+chat-members-listleaf 必须持续绑定真实 Cobra/Schema 命令; - 只扫描 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:
- reviewed intent route、selection/metadata、CommandRegistry 与生成 Catalog;
- typed resolver、message/member/card/identity contracts 与 Runtime tests;
- Chat/Event/Card references、Shared/Mono 消费者与 typed drift policy;
- 退役脚本、生成器发布边界与防回流门禁。