- 变更规模:新增 514 / 修改 62 / 重命名 155 / 删除 4(归档重组与文档轮次) - .gitignore 修:`归档/**/db-cwd归一-备份-*/` —— 原规则写绝对层级(归档/db-cwd归一-…), 目录搬进 归档/配置与备份/ 后**静默失效**,43 MB 的 DB 备份又变成未跟踪 - .gitignore 补:嵌套 git 内部数据(归档/内嵌git-20261008/、归档/skills-git-旧线-20261007/dotgit-原样移出/) - .gitignore 补:运行态与部署副本(.workbuddy/collab/、.workbuddy/tools/、.workbuddy/.load-pending、.workbuddy/tmp-*) - .gitignore 补:备份件(*.bak-*) - 未跟踪文件从 2190 降到 890(其余为 归档/ 归档件与 .workbuddy/memory/ 知识文件,按口径入库)
68 lines
5.3 KiB
Markdown
68 lines
5.3 KiB
Markdown
# 接续包 · 查「唤醒」为什么断了
|
||
|
||
- 出具:主会话 · 2026-09-30 11:5x
|
||
- 用户原话:「**还是会发呆,上次唤醒 56分钟前**」,随后:「**处理完成后 创建接续会话继续 排查为什么唤醒断了**」
|
||
- 🔴 **只做这一件**:查清"唤起主会话的那个定时闹钟为什么停",⛔ 不顺手扩范围
|
||
|
||
---
|
||
|
||
## 一、已知事实(全部已实测,⛔ 别重做)
|
||
|
||
| # | 事实 | 读数 |
|
||
|---|---|---|
|
||
| 1 | 原任务 `bbaf9baf`(08:47 建 · `*/5` · durable)**已从网关消失** | `GET /api/v1/scheduled-tasks?sessionId=fe146dd9-…` → **`{"tasks":[]}`**(11:43 实测:一条都没有) |
|
||
| 2 | 🔴 **网关没有重启过** | `GET /api/v1/health` → `pid=50716`、`uptime≈40676s`(≈11.3 h ⇒ 约 00:25 起)。而任务是 08:47 建的、11:43 发现没了 ⇒ **它是在网关一直活着的情况下消失的** |
|
||
| 3 | 网关**无法核实任务是否存在** | `GET /api/v1/scheduled-tasks/{id}` → **404 `No mapping found`**(无此路由);列表里 durable 的**永远不显示** |
|
||
| 4 | 10:44→11:42 主会话**闲着 57 分钟,一条心跳都没收到** | 用户看到「上次唤醒 56 分钟前」 |
|
||
| 5 | 现存两个投递方**都不是时间驱动** | ① `collabd.py --tick`:**钩子事件驱动** ⇒ 只有"有会话在跑工具调用"时才被唤起 ⇒ **闲着必然不响** ② `collabd.py --supervise`(PID 55332,06:02 某会话起的孤儿):**已死**(最后投递 10:44:43) |
|
||
| 6 | 当天投递台账 22 次投递,**无一次**能归因于 cron | 只有 `上报·唤醒`(--tick)与 `监督程序·心跳`(--supervise)两种 kind |
|
||
|
||
**结论(已成立)**:**没有任何"时间驱动"的触发在真正工作** ⇒ 主会话一闲就没人叫 ⇒ 发呆。
|
||
|
||
## 二、已做的处置(⛔ 别推翻,也别重做)
|
||
|
||
- **重建了任务**:`POST /api/v1/scheduled-tasks`(体 = `cron:"*/5 * * * *"` + `prompt` + `recurring:true` + `durable:true` + `sessionId:fe146dd9-…`)
|
||
- 新 id **`91f8baeb`**(11:47 建,`humanSchedule=Every 5 minutes`);旧的 `bbaf9baf` 已归入登记册 `_历史`
|
||
- 🔴 **prompt 第 0 步要求它先写触发戳** `tmp/supervise-inbox/_wake.stamp` —— 这是**唯一**能核实"它真来过"的办法(因为事实 3)
|
||
- **看板去假绿**:`.workbuddy/collab/board_ext.py` 的 `up` 改成按"最近真痕迹"判(cron 戳 或 投递台账,<15 分钟才绿)⇒ 现在显示**黄色** + 「上次唤醒:无记录」
|
||
|
||
## 三、🔴 你要查的(按顺序,每条都要给读数)
|
||
|
||
### 1️⃣ 新任务 `91f8baeb` 到底会不会响?(11:47 建 ⇒ 首次应在 **11:50**,之后每 5 分钟)
|
||
- **判据**:`tmp/supervise-inbox/_wake.stamp` 有没有出现/更新;主会话转录里有没有来心跳
|
||
- **不来** ⇒ **网关的 cron 引擎本身不工作** ⇒ 从此所有 `scheduled-tasks` 都不可信(这正是最可能的结论)
|
||
- **来** ⇒ 那要解释"`bbaf9baf` 为什么消失"(见 3️⃣)
|
||
|
||
### 2️⃣ 若不来 ⇒ 摸网关 cron 的真实行为
|
||
- 拿口令(**钩子/`--tick` 上下文天然有** `CODEBUDDY_GATEWAY_PASSWORD`)建一条**一次性**任务试验:
|
||
`POST /api/v1/scheduled-tasks`,`recurring:false`,`cron` 指向 **2 分钟后**,prompt 写一个能留痕的动作
|
||
- 观察:① 到点是否被执行 ② 执行后从内部消失还是留着 ③ 有无任何日志/持久化文件
|
||
|
||
### 3️⃣ `durable` 到底管不管用?(本次**最强嫌疑**)
|
||
- `bbaf9baf` 是 `durable:true`,却在**网关没重启**的情况下消失 ⇒ 存疑:`durable` 可能只是"跨 session",**并不做进程级持久化**
|
||
- **只读**查法(优先):翻 WorkBuddy 的数据目录/日志,找 scheduled task 有没有落盘文件
|
||
- ⚠️ 要重启网关来验证的话 —— **先问用户**(重启网关=重启宿主,影响面大)
|
||
|
||
### 4️⃣ 若确认 cron 不可信 ⇒ 给用户一个**替代方案**(先别动手)
|
||
- 候选:Windows 计划任务(`schtasks.exe` 被程序黑名单硬拦,但 **PowerShell 的 `*-ScheduledTask` 不走 schtasks.exe**,值得一试)/「启动文件夹」
|
||
- ⛔ **但本线有明确口径**:用户反对"什么都塞进自动任务"(原话「**又给我整到自动任务去了**」)⇒ 取舍必须写清再报
|
||
|
||
## 四、边界(⛔ 越线即事故)
|
||
|
||
- ⛔ 不动正在跑的看板 `127.0.0.1:8788`(主会话起的,还挂着)
|
||
- ⛔ 不动中继客户端 `DSH-Overlay-Node-Dev`
|
||
- ⛔ 口令不落盘、不进日志、不回显
|
||
- ⛔ 不改 A 方案的口令入站通道(它已实证可用)
|
||
- ⚠️ **任何"重启网关 / 重启宿主"的动作,先问用户**
|
||
|
||
## 五、相关文件
|
||
|
||
| 用途 | 路径 |
|
||
|---|---|
|
||
| 隐形体登记册(现役 `91f8baeb`/`_历史` `bbaf9baf`) | `.workbuddy/collab/gateway-schedules.json` |
|
||
| 看板扩展(`_stamp_age` / `_last_wakeup` / `_triggers`) | `.workbuddy/collab/board_ext.py` |
|
||
| 投递台账 | `tmp/supervise-inbox/wakeups.jsonl` |
|
||
| 唤醒触发戳(**要盯的就是它**) | `tmp/supervise-inbox/_wake.stamp` |
|
||
| 当天全过程(11:42–11:52 节最相关) | `.workbuddy/memory/2026-09-30.md` |
|
||
| 网关 API 契约(含 `scheduled-tasks` 的体与 R5 风险) | 技能 `workbuddy-extension-surface` §1.4 |
|