想解决的问题
当前 `packages/orchestration/src/hooks/with-hooks.ts:154-162` 的 ask 路径没有前端实现——permission engine 返 `ask` 时只是返 `isError + "requires approval (ask path not yet wired; see ADR-0011)"`,agent 撞墙后只能让用户手动 curl/admin。
这导致 D-9 `paper.promote_candidate` 不得不用 workaround 走 `allow` + prompt 自检 + 后端硬校验代替 `ask` 拦截(见本次 promote 修复的 `permissions/defaults.ts` 注释 + `tools/strategy.ts` 文件头)。
长期影响:
- 任何"金融硬约束 — 人保留最终决定权"的 tool 都没有正式审批通道(promote、未来的实盘开关、risk config 修改等)
- `permissions/defaults.ts` 里 `ask` 列表(`live.submit_order(notional<1000)` / `risk.update_config`)实际等同于 deny + 提示,规则被悄悄改变
提议的方向
实现 ADR-0018 askUserChoice:
- 后端:with-hooks 收到 `ask` 时挂起 tool 调用,发 SSE / WebSocket 事件到前端(包含 tool name + input + 调用理由)
- 前端:CopilotKit / Mastra Studio 收到事件后弹气泡,用户点"允许 / 拒绝"
- 回执:前端 POST `/api/permissions/{request_id}/respond`,后端拿到 decision 后恢复 tool 调用或抛 deny
- 超时:30s 无响应默认 deny + audit log
回归路径:接通后把 `paper.promote_candidate` 从 `allow` 改回 `ask`(见 `permissions/defaults.ts` 现有注释 TODO)。
这个建议属于哪个 Phase?
是否破坏现有约束?
其他
验收标准:
- 把 `paper.promote_candidate` 临时回退到 `ask` 后,agent 调用时前端弹气泡
- 用户允许 → tool 真执行;用户拒绝 → agent 收到清晰错误信息
- 超时 / 用户关页面 → 默认 deny
关联:
- ADR-0011(permission engine)
- ADR-0018(askUserChoice 设计)
- 本次 promote 修复用 workaround 绕开了 ask 拦截
- `packages/orchestration/src/permissions/defaults.ts` 里 `paper.promote_candidate` 的注释 TODO
优先级判断:HIGH —— 长期阻塞所有"高危操作走 ask 审批门"的设计,当前 D-9 是临时绕开。
想解决的问题
当前 `packages/orchestration/src/hooks/with-hooks.ts:154-162` 的 ask 路径没有前端实现——permission engine 返 `ask` 时只是返 `isError + "requires approval (ask path not yet wired; see ADR-0011)"`,agent 撞墙后只能让用户手动 curl/admin。
这导致 D-9 `paper.promote_candidate` 不得不用 workaround 走 `allow` + prompt 自检 + 后端硬校验代替 `ask` 拦截(见本次 promote 修复的 `permissions/defaults.ts` 注释 + `tools/strategy.ts` 文件头)。
长期影响:
提议的方向
实现 ADR-0018 askUserChoice:
回归路径:接通后把 `paper.promote_candidate` 从 `allow` 改回 `ask`(见 `permissions/defaults.ts` 现有注释 TODO)。
这个建议属于哪个 Phase?
是否破坏现有约束?
其他
验收标准:
关联:
优先级判断:HIGH —— 长期阻塞所有"高危操作走 ask 审批门"的设计,当前 D-9 是临时绕开。