# 必须回复的问题 > 属于 [DSH MCP Server](../../README.md) · [文档索引](../README.md) 向一个会话提问,它必须在回合结束前回答。 当调用方没有答案就无法继续时,单向的提示词算不上提问。`dsh_ask_session` 会把一个会话的提问 变成一个持续挂起的请求: - **每个问题一个 id。** 问题完整地投递一次,并获得一个 id(`q-…`)。该调用会阻塞:提问的回合 在目标回答之前无法结束,因此答案总能到达需要它的那部分工作。 - **提醒搭在目标本来就会发起的调用上。** 没有提醒定时器,也没有“提醒回合”:在每次回合、步骤、 助手消息和工具结果时,仅含 id 的提醒会被注入目标的下一次调用(Harness 的无唤醒 `inject` 路径;缺少 `inject` 的运行中句柄则改用插话)。空闲或被人手动停止的会话绝不会仅仅为了提醒 而被唤醒,间隔小于一秒的事件只产生一条提醒。如果问题还在投递途中就有活动到来,提醒会在 问题落地后立即发出。提醒只携带 id 和那两个调用,绝不重复问题本身;目标要再读问题,用 `dsh_get_question`。 - **只有被提问的会话能回答。** `dsh_answer_question` 会拿调用方的会话 id 与请求的目标比对, 因此另一个会话(或没有会话的外部 MCP 客户端)无法处理它。第一个答案生效;重复回答会返回 `alreadyAnswered`。 - **人工停止优先。** 被人停止的回合(`turn/end`,其 `aborted` 原因由 `user` 造成)会以 `status: "stopped"` 处理掉挂起的问题,并且不向该会话发送任何东西——没有提醒、没有撤回、 没有新回合。向最新记录回合是这种停止的会话提问,会在投递前被拒绝(重载之后也一样),因此 问题永远不可能成为让它恢复的原因;正常恢复会话即可清除该停止状态。 - **等待可以主动结束,但绝不悄悄结束。** `timeoutMs: 0`(默认)会一直等到有人回答;正数则在 到达后返回 `status: "timedOut"`。提问回合被取消、HTTP 请求被关闭或插件重载都会让该调用被 拒绝,同时目标会收到一行“已撤回”,以便它停止处理一个没人在等的问题。 - **自问和死锁会在投递前被拒绝。** 问自己没有意义;向一个已经(直接或间接)在等你发出的必须 回复问题的会话提问,会让两个回合都死锁,因此会被拒绝并列出这条等待链。 - **它需要一条回答通路。** 目标通过本端点的 DSH 本地工具作答,因此 `exposeToDsh` 关闭时该请求 会被拒绝(一个没人能回答的问题只会一直挂着)。外部 MCP 调用方也可以提问,但只有被提问的 DSH 会话能回答。 本端点唯一的一个 `session/event` 监听器正是为这两件事而存在——目标即将执行一个步骤,以及 目标被人停止。任务启动同步引擎仍然在独立的 `dsh-work-sync` 行上。 `dsh_status` 会报告 `questions: { pending, settled, activity }`,其中 `activity` 按事件类型统计 看到过的调用事件、注入的提醒、拒绝次数以及最后一次拒绝原因(`not-live`、`no-inject`、 `inject-threw`、`steer-threw` 等)。部署方据此可以区分“目标从未运行”和“Harness 拒绝了注入”。