docs: 记录第三轮边界排查——idle多智能体语义修正与TTL实测环境教训
This commit is contained in:
parent
e8bbaccfd0
commit
07c5fbca91
@ -166,7 +166,7 @@
|
||||
1. **压缩迁移孤儿化(排查结论:不存在)**:深层压缩已全面 in-place(`run_deep_compression`,对话 id 不变);`compression_mixin.compress_conversation` 创建新对话的旧路径已无调用方(死代码)。`compression_finished` 的 `rec.conversation_id` 迁移是同 id 覆写,无孤儿风险。
|
||||
2. **手动压缩走错 terminal(已修复)**:`/api/conversations/<id>/compress` 的 id 在路径里,`with_terminal` 只读 query/body → 原先用工作区级 terminal 执行并把对话加载进去,与对话级 terminal 双持同一对话(可串写)。修复:路由内显式 `get_user_resources(username, conversation_id=normalized_id)` 换到对话级 terminal(`server/conversation.py`)。
|
||||
3. **回收器竞态(已修复)**:原实现判定→关闭→pop 存在窗口,期间新请求可能拿到正在关闭的实例建任务。修复:关闭前打 `_reaper_closing` 标记(`get_user_resources` 见标记原地重建新实例)+ 关闭前二次确认 last_activity/运行任务(取消时清除标记)+ pop 前校验实例身份(`server/context.py`)。验证脚本新增 8a/8b 断言。
|
||||
4. **多智能体 idle 不会被误回收(排查结论:安全)**:`get_conversation_running_status` 中 idle 状态的多智能体任务记录不在终态集合内,仍计入 `has_running_multi_agent`;回收判定依赖该方法,故 idle 等待中的多智能体对话不会被回收。
|
||||
4. **多智能体 idle 语义(第三轮修正,见 §9.1)**:初判认为 idle 计入运行可防误回收;进一步排查发现其副作用更大(REST 对账幽灵运行态 + 回收器永久阻塞),已在 commit e8bbaccf 修正为 idle 不算运行(对齐 socket 语义),idle 实例的上下文靠 `restore_running_tasks` 磁盘恢复兜底。
|
||||
5. **空 cid chat 任务(已修复)**:未带 conversation_id 的 chat 任务原先落在工作区级 terminal 跑(`ensure_conversation_loaded` 在其上新建对话),占用服务 terminal 并造成双持。修复:`create_task_api` 在 cid 缺失时先补建对话文件再建任务(`server/tasks/api.py`)。socket chat 路径前端已不使用(无 `emit('chat')`)。
|
||||
6. **模型持久化四缺陷(已修复,commit 1289c31d)**:见项目记忆 `conversation_model_persistence` 四条防线。
|
||||
|
||||
@ -174,4 +174,18 @@
|
||||
- `_experiments/verify_conversation_level_terminal.py`:11 项断言全过(新增 8a closing 重建 / 8b 二次确认)
|
||||
- `_experiments/verify_model_fix.py`:带 cid 切换落盘、不带 cid 不污染、重启后保持、`/api/status?conversation_id=` 对话级模型恢复全过
|
||||
- `_experiments/test_no_cid_guard.py`:空 cid 补建对话全过
|
||||
- `_experiments/test_reaper_live.sh`:短 TTL 真实回收实测
|
||||
|
||||
## 9. 边界排查与修复(2026-07-20 第三轮)
|
||||
|
||||
### 9.1 idle 多智能体误判运行(已修复,commit e8bbaccf)
|
||||
- **现象**:`get_conversation_running_status`(server/tasks/models.py)的任务循环把 `status="idle"` 的多智能体任务计入 `has_running_multi_agent`(idle 不在 TERMINAL_STATUSES={completed,failed,timeout} 内)。
|
||||
- **危害 1(前端幽灵运行)**:REST 对账对全 idle 的多智能体对话永远返回 active,与 socket task_complete 语义(chat_flow_task_main.py:2309 仅 running 实例+pending 消息)不一致 → 前端对账循环每 2.5s 误判失步 → 反复恢复轮询。
|
||||
- **危害 2(回收器永久阻塞)**:回收判定依赖该方法,多智能体对话 terminal 永远无法被 TTL 回收,内存无界增长。
|
||||
- **修复**:多智能体任务分支遇 `idle` 跳过(传统子智能体无 idle 态,不受影响)。idle 实例回收后由 `restore_running_tasks`(idle ∉ 终态集合,会被恢复)按磁盘上下文重建,与进程重启路径一致。
|
||||
- **验证**:`_experiments/test_reaper_unit.py` 用例 5/5b(idle 回收、running 保留)通过。
|
||||
|
||||
### 9.2 短 TTL 回收实测的环境教训(重要)
|
||||
- **8092 端口不是本项目服务**:实测发现 8092 的进程 cwd 是 `/Users/jojo/Desktop/外置/agents`(用户另一检出的服务,03:02 启动),本仓库的 5 分钟 TTL 实测打在了错误目标上,结果全部无效。**验证前必须用 `lsof -nP -p <pid> | grep cwd` 确认进程工作目录。**
|
||||
- **沙箱限制(当前未解除)**:`kill`/`ps` 被 "Operation not permitted" 拦截;新服务实例在 `socketio.run` 绑定端口时被沙箱杀掉(8093 实测)。因此无法杀旧服务、无法起新端口,短 TTL 实测只能在用户下次自然重启服务后进行。
|
||||
- **替代验证**:`_experiments/test_reaper_unit.py` 进程内直调 `reap_idle_conversation_terminals`(19 断言全过):超 TTL 回收/未超保留/工作区级两段 key 跳过/运行中子智能体阻塞且 closing 复位/idle MA 回收/running MA 保留/无时间戳补齐。脚本用 `ASTRION_DATA_ROOT` 重定向运行态根,避免截断共享 debug_stream.log。
|
||||
- **日志共享坑**:host 模式所有实例(含外置检出)共写 `~/.astrion/astrion/host/logs/debug_stream.log`,任何实例启动/导入都会截断;import server.app 的测试脚本需设 `ASTRION_DATA_ROOT` 隔离。
|
||||
|
||||
Loading…
Reference in New Issue
Block a user