--- doc_id: TST-202606-001 feature_id: FEAT-202606-006-agent-semantic-interaction type: test-plan title: Agent 语义交互与命令治理测试计划 status: reviewing owner: 医梦研发团队 created_at: 2026-06-29 updated_at: 2026-07-01 reviewers: - 开发负责人 - 测试负责人 - 终端负责人 related_docs: - PRD-202606-002 - DDS-202606-004 - API-202606-004 related_modules: - emoon-openplatform - emoon-ai-agent - emoon-ai-command - emoon-ai-mcp tags: - 测试计划 - 挂号 Agent - 契约测试 - 安全测试 --- # Agent 语义交互与命令治理测试计划 ## 验收范围 覆盖: - 挂号 Agent 纵向样板; - FastGPT 文本与只读工具调用; - TaskState、ResultSnapshot、SemanticResponse; - 无状态 Presentation 与 interaction; - L1 锁号和 L2 挂号命令; - SSE v2、幂等、异常、安全和全链路回放; - 旧链式卡片语义清理。 不覆盖: - Dify、自研引擎和多引擎切换; - 真实支付、真实医保和 L3 医疗动作; - 生产性能容量与跨医院通用性; - 其他 Agent 的完整回归。 ## 测试环境 实施时记录: - emoon 分支、提交和构建版本; - FastGPT 部署版本及 App/Workflow 版本; - Mock HIS/MCP 数据版本; - 终端 Web 版本与 deviceId; - 数据库迁移版本; - Bearer/HMAC 测试凭证范围。 不得在测试文档记录真实患者身份或生产密钥。 ## 测试数据 至少准备: 1. 明天呼吸科有多位主任医师和多个时段; 2. 明天无主任医师、后天有主任医师; 3. 明天只有副主任医师; 4. 号源查询后被其他请求占用; 5. 重复锁号和重复挂号; 6. ResultSnapshot 和 Command 过期; 7. 下游写超时但实际成功; 8. 无卡片能力终端; 9. 跨租户、跨患者和跨会话伪造 ID。 ## 验收用例 | 编号 | 场景 | 核心步骤 | 预期结果 | 状态 | |---|---|---|---|---| | TST-001 | 完整条件直查 | 输入明天+呼吸科+主任医师 | 不重复补问,返回可信候选 | planned | | TST-002 | 精确结果为空 | 查询无结果 | 按策略推荐并标注放宽条件 | planned | | TST-003 | 不自动放宽 | 返回替代候选 | 未明确选择前不更新条件、不锁号 | planned | | TST-004 | 文本完整性 | 禁用终端展示能力 | 纯文本/语音可完成查询 | planned | | TST-005 | 展示异步 | 延迟领域 ViewModel 转换 | semantic_result 先返回,不被阻塞 | planned | | TST-006 | 展示失败 | 模板生成异常 | 文本成功,任务不失败 | planned | | TST-007 | 无状态展示 | 返回医生/号源展示 | 不创建 Command/Card 实例 | planned | | TST-008 | 点击选择 | 回传 interaction | 解析稳定 candidateId | planned | | TST-009 | 自然语言序号 | 输入“选第二个” | 与点击第二项解析一致 | planned | | TST-010 | 版本冲突 | 使用旧 resultVersion | 返回冲突并要求刷新 | planned | | TST-011 | 快照过期 | 使用过期 resultRef | 返回过期并重新查询 | planned | | TST-012 | 锁号前复核 | 查询后改变余号 | 不信任快照,使用实时结果 | planned | | TST-013 | L1 锁号 | 明确选择号源 | 无额外二次确认,幂等锁号 | planned | | TST-014 | L2 挂号 | 准备最终挂号 | 返回 command_prepared,等待确认 | planned | | TST-015 | 命令确认 | 合法确认 | 执行一次并完成 TaskState | planned | | TST-016 | 重复确认 | 重复相同幂等键 | 返回首次结果,不重复挂号 | planned | | TST-017 | 命令拒绝 | 调用 reject | 不执行写工具,记录审计 | planned | | TST-018 | 命令过期 | 确认过期命令 | 拒绝执行,要求重新准备 | planned | | TST-019 | 写状态未知 | 模拟下游超时 | 进入 UNKNOWN,不盲重试 | planned | | TST-020 | 身份越权 | 跨患者确认命令 | 403,记录安全审计 | planned | | TST-021 | 租户越权 | 跨租户读取 result/command | 403,不泄露存在性细节 | planned | | TST-022 | FastGPT 写工具 | 模型请求写工具 | 后端拒绝,不调用 HIS | planned | | TST-023 | 模型伪造风险 | 模型将 L2 标为 L0 | 后端使用固定 L2 | planned | | TST-024 | 插入问答 | 挂号中问医生擅长 | 回答后保留原 TaskState | planned | | TST-025 | 切换任务 | 挂号中转缴费 | 挂号暂停,锁号不续期 | planned | | TST-026 | 断线恢复 | SSE 中断 | 通过 turn/command 查询恢复 | planned | | TST-027 | 全链路回放 | 按 traceId 查询 | 能还原模型、工具、展示、确认和执行 | planned | | TST-028 | v2 契约 | 校验 OpenAPI/SSE | 无 nextCard 和通用 card_created | planned | | TST-029 | 架构边界 | 运行架构测试 | FastGPT 不调用写工具,Command 不依赖模型 | planned | | TST-030 | 旧语义清理 | 仓库检索有效代码/契约 | 旧 Card 流程只存在历史说明 | planned | | TST-031 | ToolCatalog 过滤 | 注册读写混合工具 | FastGPT 只看到授权只读工具 | planned | | TST-032 | 查询参数无效 | FastGPT 提交非法日期/字段 | 最多修复一次,否则自然语言澄清 | planned | | TST-033 | 阶段零门禁 | 模拟工具正常/空结果/参数错误/超时 | 能力验证有明确通过或停止结论 | planned | | TST-034 | 无 Card 端到端 | 关闭 Presentation,完成查询、选择、锁号和挂号 | 文本/语音与 Command 可独立完成全链路 | planned | | TST-035 | Card 控制信号清理 | 检索运行代码并执行任务状态测试 | cardKey/cardData/nextCard/Card 类型不参与完成判断和状态迁移 | planned | ## 性能基线 实施测试先测量再确定阈值,至少分别记录: - 首个 `message_delta`; - `semantic_result`; - 只读 MCP 查询; - `presentation`; - L1/L2 命令执行; - 展示失败时的文本完成时间。 验收原则:Presentation 延迟或失败不能增加文本与 semantic_result 的关键路径等待。 ## 自动化范围 - DTO/OpenAPI Schema 契约测试; - TaskState 和 Command 状态机单元测试; - ResultSnapshot 过期、版本、租户校验; - MCP 读写权限隔离; - 幂等与 UNKNOWN 状态集成测试; - SSE 事件解析与终端交互契约测试; - `AiPlatformArchitectureTest` 扩展。 ## 回归范围 - 统一入口鉴权和设备场景; - 会话创建与断线恢复; - FastGPT Adapter; - MCP 工具注册、权限和审计; - HIS Mock 科室、医生、排班、锁号和挂号; - 计量/Outbox 对命令业务事实的归集; - 管理后台 Agent、展示和命令配置。 ## 风险 - FastGPT 目标版本尚未实测,工具事件可能需要 Adapter 特化。 - 真实性能阈值需基于部署环境,不在本计划中预设虚假数字。 - 真实 HIS 幂等和状态查询能力不足时,需要 Adapter 补偿设计。 ## 结论 当前为测试计划,尚未执行。不得据此将专题标记为 `implemented`; 实施后必须创建独立 `测试结果.md` 记录真实环境、通过项、失败项和结论。