Skip to content

fix(ths): 交易弹窗结构化处置 + 防卡死 + 超时 unknown 语义 - #5

Merged
suny911 merged 2 commits into
mainfrom
worktree-ths-dialog-handling-design
Jul 13, 2026
Merged

fix(ths): 交易弹窗结构化处置 + 防卡死 + 超时 unknown 语义#5
suny911 merged 2 commits into
mainfrom
worktree-ths-dialog-handling-design

Conversation

@suny911

@suny911 suny911 commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator

背景

2026-07-13 14:42 真实事故:市价 sell 弹出「委托确认」模态框,受控端卡死,MCP 30s 后报 -32003,但用户手动点「是」后订单实际成交——「报错但静默成交」差点导致补单事故。

根因(已实证)

  1. 卡死直接根因:市价提交用 SendMessage(BM_CLICK)——同步跨进程调用,按钮 handler 弹模态框后不返回,线程死锁,后续关弹窗代码根本没执行。
  2. 弹窗处理本质是盲按 Enter:不看弹窗在不在、废单原因带不回。
  3. 系统性放大:to_thread 无超时 + win_lock 永久持有 + WS 消息循环内联 await → 单笔卡死瘫痪整个受控端。

修复(P0 + P1 已落码)

P0 防卡死

  • SendMessage(BM_CLICK)PostMessage(市价提交 + 验证码确定),并立为铁律写进架构文档 §7.7
  • dispatcher 单笔 25s 总超时(低于网关 30s):下单类超时回 code=2 status=unknown +「先核单勿补单」;拿锁 5s 超时回 busy;超时置 degraded,下次调用先清弹窗自愈
  • ws_client call 帧改 create_task,消息循环不再被单笔 RPC 卡死(核单查询永远进得来)

P1 弹窗看门人(ths/dialogs.py DialogSentry) —— 处置不耦合弹窗内容(用户定的原则:任何弹窗快速肯定式消除、回到既定轨道),决策只看结构:

  1. Edit 输入框 → 验证码 → 走既有 input_ocr
  2. 枚举到肯定按钮(是 > 确定 > 确认 > 同意 > 唯一按钮)→ PostMessage(BM_CLICK);绝不点否/取消
  3. 无按钮(自绘弹窗)→ 向弹窗投递回车(真机验证有效);两次回车不消才 WM_CLOSE全程禁 ESC(对确认框语义是「否」)

每个弹窗截图存证 + 标题/全文/动作记入回执 dialogs 字段;机会性提取合同编号;回查失败时弹窗原文进回执(废单真实原因不再丢失)。

协议/文档:PROTOCOL.md 增补网关超时必须回 unknown 语义的强制条款;README 补关弹窗设置建议;spec 定稿于 docs/superpowers/specs/2026-07-13-ths-dialog-handling-design.md

测试

  • macOS 单测:106 passed, 10 skipped(新增 16 例:弹窗决策纯逻辑 / dispatcher 超时·busy·degraded / WS 消息循环不阻塞)
  • 待真机联调(用户配合开启弹窗):跑 python tools/ths_dialog_dump.py(开着任意弹窗)核对新版皮肤弹窗控件结构;按 spec §6.3 清单回归市价/限价/撤单/废单/风险警示/验证码六类场景

🤖 Generated with Claude Code

suny911 and others added 2 commits July 13, 2026 15:01
事故驱动(2026-07-13 委托确认弹窗卡死、MCP 报错但实际成交)。
根因实证:市价提交用 SendMessage(BM_CLICK) 遇模态框死锁 +
to_thread 无超时/win_lock 饿死/WS 消息循环内联 await 放大为全端瘫痪。
方案:P0 防卡死(PostMessage 化 + 25s 总超时 + 循环解耦)、
P1 弹窗看门人(识别-分类-处置-回执)、P2 引导与真机回归、
网关超时回执改 unknown 语义。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
根因修复:
- 市价提交/验证码确定按钮 SendMessage(BM_CLICK)→PostMessage:同步跨进程
  调用遇模态「委托确认」框死锁是本次委托卡死的直接根因
- dispatcher 单笔调用 25s 总超时(低于网关 30s):下单类超时回
  code=2 status=unknown +「先核单勿补单」;win_lock 拿锁 5s 超时回 busy;
  超时置 degraded,下次调用先跑弹窗清扫自愈
- ws_client call 帧改 create_task:单笔 RPC 卡死不再瘫痪整个消息循环

弹窗看门人(ths/dialogs.py DialogSentry):
- 下单/撤单提交后用 pump()「等待-发现-处置」取代三连盲 Enter
- 处置不耦合弹窗内容:含 Edit→input_ocr;肯定按钮(是>确定>确认>同意>唯一)
  →PostMessage 点击;无按钮→向弹窗投递回车(真机验证);两次回车不消才
  WM_CLOSE;全程禁 ESC(对确认框语义是否)
- 每个弹窗截图存证 + 标题/全文/动作记入回执 dialogs 字段;机会性提取
  合同编号;回查失败时弹窗原文进回执(废单真实原因不再丢失)

文档与工具:spec 定稿、PROTOCOL.md 网关超时语义条款、架构文档 7.7 节
PostMessage 铁律、README 弹窗设置建议、tools/ths_dialog_dump.py 真机
弹窗结构诊断脚本。测试:106 passed(新增弹窗决策/超时语义/消息循环 16 例)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@suny911 suny911 changed the title docs(spec): 同花顺交易弹窗处理与超时语义修复设计 fix(ths): 交易弹窗结构化处置 + 防卡死 + 超时 unknown 语义 Jul 13, 2026
@suny911
suny911 marked this pull request as ready for review July 13, 2026 07:32
@suny911
suny911 merged commit 61bc1ff into main Jul 13, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant