Commit 48d37f7982f923d64ea5d6fc3f7f81c87af409fb

Authored by yibo
1 parent 266b0b95

docs(wechat-auto-reply): 端到端闭环里程碑 + flush 加固记录 + gitignore pycache

- 需求文档环节5:补 flush 加固三经验值 + 端到端闭环验证(私聊+群@我送达)
- README 真机验证:加 2026-07-12 里程碑段(系统正式跑通,~15s 送达)
- .gitignore 忽略 __pycache__/*.pyc

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
.gitignore
@@ -11,6 +11,10 @@ node_modules/ @@ -11,6 +11,10 @@ node_modules/
11 .DS_Store 11 .DS_Store
12 Thumbs.db 12 Thumbs.db
13 13
  14 +# Python
  15 +__pycache__/
  16 +*.pyc
  17 +
14 # Logs & runtime output 18 # Logs & runtime output
15 *.log 19 *.log
16 nohup.out 20 nohup.out
md/wechat-auto-reply-requirements.md
@@ -100,12 +100,14 @@ @@ -100,12 +100,14 @@
100 - 安全:生成超时/失败 → 无草稿 → policy skip → 不发(失败即静默,绝不误发)。 100 - 安全:生成超时/失败 → 无草稿 → policy skip → 不发(失败即静默,绝不误发)。
101 - 真机验证:接线(watcher inotify → 自动拉起编排器 drain)通过;真实上下文(猎头 婷婷)生成「哈哈婷婷,我不是什么总,就是个写代码的,不负责招人这块哈」→ 正确进 /approvals 待审。 101 - 真机验证:接线(watcher inotify → 自动拉起编排器 drain)通过;真实上下文(猎头 婷婷)生成「哈哈婷婷,我不是什么总,就是个写代码的,不负责招人这块哈」→ 正确进 /approvals 待审。
102 102
103 -### 环节 5 · 可靠发送 —— ✅ **API 发送打通(2026-07-11)**  
104 -经历一场硬仗才让 API 发送真正送达(火星人跨账号收到确认)。两个坑: 103 +### 环节 5 · 可靠发送 —— ✅ **打通并端到端验证(2026-07-11 打通 / 07-12 加固+闭环)**
  104 +经历一场硬仗才让 API 发送真正送达。两个坑 + 一轮 flush 加固:
105 1. **中文被弄乱**:`send_text_via_hook` 用 `--es text` 传中文被 shell/am 弄乱→服务器拒收→卡 status=1。hook 早已要求 `--es text_b64`,发送端漏改。→ 改用 text_b64。 105 1. **中文被弄乱**:`send_text_via_hook` 用 `--es text` 传中文被 shell/am 弄乱→服务器拒收→卡 status=1。hook 早已要求 `--es text_b64`,发送端漏改。→ 改用 text_b64。
106 -2. **z2.b 只入队不派发(设备机制,非代码 bug)**:`sendViaHighLevel` 的 `z2.b` 把消息入队(status=1 转圈),WeChat NetSceneQueue **要一次 onResume(后台→前台切换)才派发**。发送代码跨版本逐字节相同,不是回归。→ 发送后自动 `input keyevent KEYCODE_HOME` + `am start LauncherUI` 触发 onResume,消息 flush 到 status=2。  
107 -- 落地 `_send_text_verified`(orchestrator):前台微信 → text_b64 发送 → 后台前台切换 → 轮询 status 直到 2。status=1 超时视为"已入队将送达"(不误报失败)。 106 +2. **z2.b 只入队不派发(设备机制,非代码 bug)**:`sendViaHighLevel` 的 `z2.b` 把消息入队(status=1 转圈),WeChat NetSceneQueue **要一次真实的 app 切换(切走→切回微信=onPause→onResume)才派发**。发送代码跨版本逐字节相同,不是回归。
  107 +3. **flush 加固(2026-07-12)**:单次切换+被动等常卡几十秒~分钟。三个经验值(`_send_text_verified`):① 发送后 `sleep(4)` 让消息稳稳落库(切太快微信没登记这条)② 切换给足时间(`HOME` 背景 2.5s → `am start LauncherUI` 切回停 3s)③ **切回后停前台连查多轮,不立刻再切走**(否则打断正在进行的网络发送),没到 2 再来一轮。真机实测屏亮/灭都 **~15s flush 到 status=2**。
  108 +- 落地 `_send_text_verified`(orchestrator):前台微信 → text_b64 发送 → sleep(4) → 切换 cycle + 前台停留轮询 → status 到 2。超时仍 1 视为"已入队将送达"(不误报失败)。
108 - 详见 memory `wechat-api-send-onresume-flush`。 109 - 详见 memory `wechat-api-send-onresume-flush`。
  110 +- **✅ 端到端闭环验证(2026-07-12)**:火星人私聊 → 自动回复送达;延墨/丁鹏群里 @我 → 自动回复送达。私聊 + 群@我两条链路全通。
109 - **待深挖(下次)**:onResume 到底改变了什么让队列派发(疑似后台暂停网络场景/长连接休眠)——要 hook NetSceneQueue/网络模块在前后台切换点打 log 拿根因。 111 - **待深挖(下次)**:onResume 到底改变了什么让队列派发(疑似后台暂停网络场景/长连接休眠)——要 hook NetSceneQueue/网络模块在前后台切换点打 log 拿根因。
110 112
111 ### (原)环节 5 · 发送回复带引用(原生气泡) 113 ### (原)环节 5 · 发送回复带引用(原生气泡)
wechat_plain/scripts/auto-reply/README.md
@@ -76,14 +76,20 @@ python wechat_reply_orchestrator.py --drain # 手动跑一轮编排 @@ -76,14 +76,20 @@ python wechat_reply_orchestrator.py --drain # 手动跑一轮编排
76 - 敏感词(钱/承诺/约时间/隐私)即使白名单也仍会拉回人工审批。 76 - 敏感词(钱/承诺/约时间/隐私)即使白名单也仍会拉回人工审批。
77 - 建议先审核模式跑几天,草稿质量稳了再放开。 77 - 建议先审核模式跑几天,草稿质量稳了再放开。
78 78
79 -## 真机验证(2026-07-10) 79 +## 真机验证
80 80
  81 +**2026-07-10(各环节)**
81 - inotify 触发读取 → 写队列 → 自动拉起编排器 ✅ 82 - inotify 触发读取 → 写队列 → 自动拉起编排器 ✅
82 - 真实猎头上下文 → 生成火星人口吻草稿「哈哈婷婷,我不是什么总,就是个写代码的,不负责招人这块哈」→ 进 /approvals ✅ 83 - 真实猎头上下文 → 生成火星人口吻草稿「哈哈婷婷,我不是什么总,就是个写代码的,不负责招人这块哈」→ 进 /approvals ✅
83 - 审批页发送 → `send_text_via_hook` 广播到 filehelper(sent)、取消(cancelled) ✅ 84 - 审批页发送 → `send_text_via_hook` 广播到 filehelper(sent)、取消(cancelled) ✅
84 - 策略引擎 8/8、多账号自适应、生成失败静默不误发 ✅ 85 - 策略引擎 8/8、多账号自适应、生成失败静默不误发 ✅
85 - 单实例防重、杀 watcher 自动重启、纯 root(boot 上下文) selftest ✅ 86 - 单实例防重、杀 watcher 自动重启、纯 root(boot 上下文) selftest ✅
86 87
  88 +**2026-07-12(端到端闭环,系统正式跑通)** 🎉
  89 +- `/whitelist` 页开自动发总开关 + 把火星人加白名单 → **火星人私聊 → 自动回复送达** ✅
  90 +- **延墨/丁鹏群里 @我 → 自动回复送达** ✅(私聊 + 群@我两条链路全通)
  91 +- 发送 flush 加固后真机:屏亮/屏灭(Dozing) 都 **~15s** 到 status=2 ✅
  92 +
87 ## 待收尾(都非阻塞,系统已可用) 93 ## 待收尾(都非阻塞,系统已可用)
88 94
89 1. **原生引用气泡 / 群@昵称前缀**:现发纯文本;微信原生引用(A11y 长按→引用)是环节5 增强。 95 1. **原生引用气泡 / 群@昵称前缀**:现发纯文本;微信原生引用(A11y 长按→引用)是环节5 增强。