codex@macbookpro
·
2026-03-31
BUG-027-startup-plugin-diagnostic-events-lost-before-ws-open.md
1# BUG-027: 插件启动期诊断事件会在 WS 建立前丢失,阻塞 `logs/baa-plugin` 排障链路
2
3> 提交者:代码核对
4> 日期:2026-03-29
5
6## 现象
7
8当前 `logs/baa-plugin/YYYY-MM-DD.jsonl` 被设计成 Firefox 插件诊断的统一落点,但插件冷启动、插件重载或页面首次注入时,最早一批关键事件可能完全不会进入 conductor:
9
10- `page_bridge_ready`
11- `interceptor_active`
12- 其他依赖页面刚加载时立即发送的诊断事件
13
14结果是:
15
16- 插件后续若成功连上 WS,后面的诊断日志能看到
17- 但最关键的“页面桥接是否成功注入”“page-interceptor 是否已激活”这批启动期证据会静默缺失
18- 当当前排障路径依赖 `logs/baa-plugin/` 判断注入链路时,会出现“没有日志,不知道是没注入还是只是太早发了”的盲区
19
20## 触发路径
21
22```text
23刷新 ChatGPT / Claude / Gemini 页面
24-> content-script / page-interceptor 刚加载即发送 page_bridge_ready / interceptor_active
25-> controller 这时尚未 connectWs() 或 WS 仍未 open
26-> wsSend() 直接返回 false
27-> 事件无重试、无排队、无本地缓冲
28-> conductor 侧 logs/baa-plugin/ 看不到这批启动期日志
29```
30
31## 根因
32
33根因基本确认:
34
35- content-script 会在加载后立即发送 `page_bridge_ready`
36- page-interceptor 会在激活后立即发送 `interceptor_active`
37- controller 直到初始化尾部才调用 `connectWs()`
38- `wsSend()` 在 socket 未连接时直接返回 `false`
39- `plugin_diagnostic_log` 没有补发、排队或本地缓存机制
40
41因此,所有发生在 WS 建立之前的诊断事件都会被静默丢弃。
42
43## 复现步骤
44
45这是一个很短的时序问题,最小复现依赖真实 Firefox 插件环境:
46
471. 启动 conductor,确保会写 `logs/baa-plugin/`
482. 重载 Firefox 插件或冷启动浏览器
493. 刷新一个 AI 页面,例如 ChatGPT
504. 观察页面控制台可看到 `content_script_loaded` / `interceptor_active`
515. 再查看 conductor 的 `logs/baa-plugin/YYYY-MM-DD.jsonl`
52
53预期:
54
55- 应能看到 `page_bridge_ready`
56- 应能看到 `interceptor_active`
57
58当前高概率实际情况:
59
60- 若事件发生在 WS `open` 之前,这两条日志不会出现在 `logs/baa-plugin/`
61- 后续较晚产生的日志可能正常出现,造成“部分有日志、最早证据缺失”的假象
62
63## 当前影响
64
65- 直接影响当前依赖 `logs/baa-plugin/` 排查插件注入、桥接就绪、SSE 拦截起点的问题
66- 当问题恰好发生在页面刚加载或插件刚重载阶段时,conductor 侧日志失去最关键证据
67- 这不是普通信息缺失,而是会阻塞“确认 page-interceptor / content-script 是否启动成功”这条诊断路径
68- 对正常业务请求不一定构成功能性故障,但对当前诊断主流程是阻塞性的
69
70## 修复建议
71
72### 方案 A(推荐)
73
74在 controller 侧为 `plugin_diagnostic_log` 增加一个很小的启动缓冲队列:
75
76- WS 未 open 时先暂存在内存
77- `onopen` 后立即 flush
78- 队列限制条数,避免无上限积累
79
80### 方案 B
81
82在 content-script/page-interceptor 侧延迟发送首批诊断事件,等 controller 与 WS 建立后再发。
83
84这个方案实现简单,但会把可靠性依赖到更多时序假设上。
85
86### 方案 C
87
88保留现有链路,但在 controller 与页面握手成功后主动补发一轮启动状态摘要。
89
90这样能补证据,但语义上不如真实事件直观。
91
92## 严重程度
93
94**High**
95
96这会直接阻塞当前 `logs/baa-plugin/` 诊断链路最重要的一段:页面启动与注入时序。功能本身不一定坏,但排障会失真。
97
98## 发现时间
99
100`2026-03-29 by Codex`
101
102## 备注
103
104相关代码位置:
105
106- 启动期事件发送:[content-script.js](/Users/george/code/baa-conductor/plugins/baa-firefox/content-script.js#L888)
107- 启动期事件发送:[page-interceptor.js](/Users/george/code/baa-conductor/plugins/baa-firefox/page-interceptor.js#L228)
108- WS 未连通时直接丢弃:[controller.js](/Users/george/code/baa-conductor/plugins/baa-firefox/controller.js#L4003)
109- controller 在初始化尾部才开始连 WS:[controller.js](/Users/george/code/baa-conductor/plugins/baa-firefox/controller.js#L7322)