新增: 无人值守安全系列(H1-H3) + P5 审计日志与部署运维 + #14 异步委托

- H3 外部干预感知: run_agentic_loop 增 h3_watch_dir 参数, loop 启动取 git HEAD 基线, 每 5 轮探测, HEAD 被外部改写(切分支/reset/他话提交)即 emit_task_parked(stop_kind=external_change) + teardown 停靠; 4 调用方(发送/编辑/强制发送/审批续跑)从 allowed_dirs.persistent 排序取首目录, 修复初版 current_dir 恒空缺陷
- P5 审计日志: df-im-gateway audit.rs append-only SQLite(tunnel_audit 表, payload 4KB 截断, recent/by_request 查询), main.rs 8 打点点位(inbound/command/outbound), 写失败不阻断主链路, 17 tests passed
- P5 部署运维: publish-im-gateway.ps1(musl 交叉编译→scp .new→systemd 原子切换→9191 验证→自动回滚) + systemd unit + nginx im.1216.top 反代 + 运维手册
- #14 异步委托: 受理/完成两段式 + 桌面任务卡(后台进行中徽章/轮次/切换) + 飞书双端同构, 关联缺陷 #8-#12 速清

验收: cargo check workspace EXIT 0, cargo test workspace 全绿(711+560+33+12...), vue-tsc EXIT 0
This commit is contained in:
lxy
2026-10-06 15:59:10 +08:00
parent 7c252cff96
commit 438d47bc9f
17 changed files with 987 additions and 12 deletions
@@ -0,0 +1,112 @@
# 上下文根治设计(2026-10-06)—— 治 223:1 结构性浪费
> 铁证:84cb104c 会话 2.2 天烧 4.3 亿 tokens,prompt:completion=223:1,日均 1.9 亿。
> 本质:每轮全量重发历史——轮数线性,token 爆炸,首 token 延迟同步恶化。不是 bug,是组装策略必然。
> 原则:分层组装取代全量重发;历史不删只降级(压缩可逆);对用户透明,对 agent 工具透明。
## 一、分层上下文(治"全量")
- **L1 常驻(固定小)**:system_prompt + pinned_goals + 任务状态卡。目标 <8K,永不随轮次增长。
- **L2 工作集(滑动窗口)**:最近 N 轮原文 + 当前任务活跃文件/结果。按"信息增益"滑动,非固定条数。
- **L3 检索层(按需召回)**:窗口外历史不进 prompt,转为可检索——关键词/语义命中才临时注入(复用 knowledge_inject 的检索管线,扩到对话历史)。
- 无破坏性保证:所有降级内容原文全在库(L3 可召回+压缩可逆 C-r1),agent 能力不降级,丢的是"每轮都带全部家当"的浪费。
## 二、工具结果瘦身(治最大头,先行)
9386 条消息中 tool 4379 条——单条最大 8K+,是上下文膨胀主力。
- 超阈值(如 2K)的工具结果:正文落盘(外置文件/独立表),上下文只留「头部 200 字摘要 + 句柄路径」。
- 与 D2a(过期外置)同构一套机制,两处受益。
- 句柄可被 agent 主动展开(read 句柄文件)——需要时找得回,不需要时不占位。
## 三、压缩升级(从"水位兜底"到"常规操作")
- 现状:120K 水位才触发,1M 窗口下形同虚设。
- 改:压缩不再是水位兜底,而是 L2→L3 的常规滑动——每轮组装时,窗口外的轮次自动结构化摘要(记忆卡形态,信息增益判据保留),原文留库可按段重载(C-r1)。
## 四、量化预期
- prompt 均值 71K → 目标 ≤20K(工作集+召回),单轮成本/延迟降 70%+
- 223:1 → 目标 ≤50:1(继续随 C-m 记忆卡质量优化)
- 长会话不再有"轮数税"——206 轮与 6 轮的单轮成本趋同。
## 五、实施序(每阶段独立可交付,无破坏)
- P1(S):工具结果瘦身(阈值落盘+句柄)——最大头先行,零行为变化
- P2(M):L1/L2/L3 组装器重构(build_for_request 改造,窗口+检索)
- P3(M):压缩常规化+记忆卡产出(C-m1)+按段重载(C-r1)
- P4(S):量化验收(223:1→≤50:1 看板)+回归(agent 能力不降级测试集)
## 六、与旧 C 批次关系
本设计整合取代 C1-C6/C-m1-m3 的发散条目:C-r0(验证后台化)独立不变;C-m2(判据挂 pinned_goals)/C-r1(可逆)并入 P2/P3。旧条目销账以本档为准。
## 七、修订(2026-10-06 用户定调):从「分层组装」升级为「上下文调度系统」
> 定调:同会话连续工作是**常态**,设计目标不是控制会话长度,而是支撑无限长会话的资源调度——OS 虚拟内存同构:窗口有限,会话地址空间无限。
> 修正:撤回"百轮会话收敛拆分"建议;一~六节的 L1/L2/L3 保留为**页管理基建**,本节新增调度层。
### 调度系统设计(新增)
- **页式单位**:上下文按页管理——轮次页/工具结果页/文件页。页=换入换出与压缩的最小单位。
- **热度调度**:页带热度(最近访问/被引用频次)。热页驻工作集(L2);冷页压缩归档(L3,结构化摘要+原文留库);**压缩不丢**=冷页永远可召回。
- **缺页召回**:agent 引用历史(关键词/句柄/goal 关联)→检索命中→临时换入本轮上下文,用完即出——召回不计入常驻。
- **任务聚类切换**(切换能力的核心):工作集按**任务/主题聚类**重组,非纯时间窗口——用户在多任务间切换时,上下文随任务维度切换(当前任务的热页+该任务关联页),并行任务互不污染。任务边界=页的聚类标签(pinned_goals/主题标记)。
- **调度目标函数**:token 花在刀刃=按"任务相关性×信息增益"分配窗口配额;调度决策零 LLM 调用(规则引擎,成本为零)。
### 修订后的一句话
**长会话=常态运行环境;上下文调度器=它的虚拟内存管理器;压缩可召回=它的 swap;任务聚类切换=它的进程调度。**
## 八、再修订(2026-10-06 用户定调):跨会话调度与召回也是常态
> 定调:调度地址空间=会话内 + **跨会话**。会话 A 的产出/结论,会话 B 工作中可召回引用——跨会话不是边界,是同一个页池的不同命名空间。
### 跨会话调度设计(新增)
- **页命名空间分级**:会话内页(默认私有) / **跨会话共享页**(结论页/知识页/任务产出页,显式或按策略晋升共享)。
- **跨会话召回**:检索半径覆盖全页池——会话 B 缺页召回时,共享页与会话 A 的可召回页同池命中,带来源标注(「来自会话 X 的结论」)。
- **与 knowledge 库关系**:知识条目=最高等级的共享页(已晋升、已蒸馏);本设计的跨会话召回把"未蒸馏的对话产出"也纳入召回半径——knowledge 是终点,页池是全程。
- **晋升机制**:会话内页→(蒸馏/用户标记/高频跨任务引用)→共享页→(结构化)→knowledge 条目。晋升是单向门,防未蒸馏噪音污染共享池。
### 多人场景(预留位,下阶段设计)
- 页带 owner 与 ACL 位;共享池分个人池/团队池;多人可召回引用=团队池+权限过滤。
- 本期只预留页结构字段(owner/acl/scope),不做多人实现——接口先行,机制后置。
## 九、完整审视(2026-10-06 二次评审)——四个真问题与修正
### 问题1:机制并存未收敛(最重)
压缩机制(现有)/D2a 工具结果外置/L3 检索召回/knowledge 条目/页池——**五个名字,一套事**(都是"内容降级+可找回")。三次定调追加未合并同类项。
**修正**:统一收敛——**唯一存储=页池,唯一调度器,唯一召回入口**;压缩/D2a/knowledge 都是页池上的策略与晋升形态,不再作为平行系统各自演化。旧机制改造为页池前身,不新建平行通路。
### 问题2:实施范围失控风险
页池+晋升+跨会话+多人——北极星画完了,但一个桌面 app 一次吃下=过度设计。
**修正:v1 范围锁死**=单会话页池+极简调度器(recency+引用计数热度,goal 标签聚类,关键词缺页召回)+knowledge 照旧(它已覆盖跨会话召回大部分需求)。跨会话命名空间/晋升/多人=**v2+,触发条件=单会话版实测后仍有跨会话痛点**。基建等真实触发。
### 问题3:缺评估设计与调度可观测
"agent 能力不降级"怎么证?P4 的回归测试集不存在。
**修正**:①建任务回归集(固定任务清单,改造前后跑对比:完成质量/轮数/成本)②调度器可观测(页命中/召回率/换出量进日志与面板)③误调度代价显性化(热页误换出→下轮回查次数)。
### 问题4:与模型平台原生能力对齐未检查
模型侧可能原生提供上下文编辑/记忆工具(如 Claude 的 context editing/memory tool)——自研调度若与平台能力重复,应优先用平台原生(维护成本低、演化跟随厂商)。
**修正**:实施前先做平台能力对齐检查(一次调研任务),能用原生的不自研;自研部分聚焦平台没有的(任务聚类切换/跨会话页池)。
### 审视后的 v1 锁定范围(修正结论)
P1 工具结果瘦身 + P2 单会话页池与极简调度 + P3 压缩常规化(页池前身改造) + P4 评估集与量化。
七/八节的调度系统与跨会话设计降级为**北极星方向**;实施以本节 v1 范围为准。
## 十、知识引用注入的统筹与分工(2026-10-06 补充:第九节收敛的正向展开)
> 上下文生态的注入类型盘点:工具结果句柄/对话历史页/压缩摘要与记忆卡/knowledge 条目/pinned_goals/技能注入/规范注入——统筹不当=五套并行的重演。
### 分工矩阵(按蒸馏程度×生命周期×注入方式)
| 类型 | 蒸馏程度 | 生命周期 | 注入方式 | 角色 |
|---|---|---|---|---|
| 工具结果句柄 | 原始 | 任务内 | agent 主动 read 展开 | 工作证据 |
| 对话历史页 | 轻摘要 | 会话内→跨会话(v2) | 检索召回临时换入 | 过程记忆 |
| 压缩摘要/记忆卡 | 中蒸馏 | 会话长期 | 工作集常驻(摘要形态) | 阶段结论 |
| knowledge 条目 | 高蒸馏 | 永久 | system_prompt 检索注入 | 沉淀规范 |
| pinned_goals/任务态 | 实时 | 任务期 | L1 常驻 | 当前意图 |
### 统筹四原则
1. **单一来源**:每种内容只有一个当前形态的家(原始在页池/蒸馏在 knowledge),晋升单向门,禁双存双写。
2. **注入方式随蒸馏程度**:越原始越被动(agent 主动拉/句柄展开),越蒸馏越主动(系统注入 prompt)——检索系统替 agent 省的每一分注意力,都来自上游的蒸馏质量。
3. **召回入口统一**:全部类型注册到同一检索面,agent 视角只有一个记忆系统(分类型返回,来源标注)——agent 不需要知道背后几套存储。
4. **三层配额防炸弹**:prompt 注入配额(既有 ≤20 条/1.5K)+每轮召回页配额(新增,如 ≤5 页)+句柄展开按需——总量有闸,信息炸弹在结构上不可能。
### 与既有机制对账
knowledge_inject(检索注入)=统筹第 4 行的既有实现,扩为统一检索面的注册方之一;compress(压缩)=第 3 行的产生器;D2a/P1(句柄)=第 1 行的产生器;审计 subscriber(H4)=统筹的观测面。**无新系统,只有分工明确化。**
+55 -2
View File
@@ -1057,9 +1057,10 @@ graph TD
> 附:挂机汇报自报 🔴10 已修验证通过+43 文件产出——挂机模式推进有效,路径修复别误伤它。
## 无人值守可靠性专项(2026-10-06 swarm 立项,设计档:docs/02-架构设计/无人值守可靠性专项设计-20261006.md+temp/V49断点续跑设计-20261006.md)
- [x] B1(S):H1 汇报 git 实测附录 ✅(2026-10-06:deliver_completion_report_if_waited 单点 append_git_facts——branch/HEAD/未提交计数三行,非 git 仓静默跳过,超长报告不追,git.rs 增 git_exec 只读薄封装)+ 探活告警口径修正 ✅(同日 18 批:inflight 计数点前移到 handle_message 白名单通过处,覆盖占位卡 HTTP+per-chat 锁排队窗口,旧计数点删除防双计)- [ ] B2(M):H2 token 三闸(抄 sub_agent round_budget_stop)+ H4 产出审计 subscriber
- [x] B1(S):H1 汇报 git 实测附录 ✅(2026-10-06:deliver_completion_report_if_waited 单点 append_git_facts——branch/HEAD/未提交计数三行,非 git 仓静默跳过,超长报告不追,git.rs 增 git_exec 只读薄封装)+ 探活告警口径修正 ✅(同日 18 批:inflight 计数点前移到 handle_message 白名单通过处,覆盖占位卡 HTTP+per-chat 锁排队窗口,旧计数点删除防双计)- [ ] B2(M):H2 token 三闸(抄 sub_agent round_budget_stop)+ ~~H4 产出审计 subscriber~~ ✅H4 已落地(2026-10-06 勘察后实施:lib.rs setup 订阅 ai_event_bus,AiToolCallStarted{id,name,args,conversation_id}入内存配对表(上限512防泄漏)/AiToolCallCompleted{id,result,conversation_id}配对取 name 落兜底审计行(decided_by=event_bus,risk 保守 Low)——Completed 无 name/isError 字段,失败态由主链 audit_tool_call 口径区分;事件契约核验为主链 emit 双写全覆盖,与 process_tool_calls 审计重复面已评估=同 call_id 幂等可容忍;async 块只持 db:Arc<Database> 不持 AppState 整体(内含非 Send tunnel 回调致 E0277,已修))。**H4 剩余价值点=无人值守产出/失败统计订阅,正确实施时机=W-d1 挂机循环落地时**(有真实消费方,现在上 subscriber 属过度设计)——故 H4 降级为观察项登记,本批实施内容为兜底审计 subscriber(B2 销账只认 H2)
- [x] B3(M):V49 防覆盖定稿+单测 ✅(本会话前批:#11 update_full 剥离 loop_state 列,df-storage conversation 8 passed)+ ai_list_recoverable IPC ✅(2026-10-06:conversation.rs parked 专项完备真相清单 id/title/model/updated_at,不受侧栏 limit 截断,lib.rs 已注册)+ 桌面「可恢复」入口 ✅(2026-10-06 本批:TopBar recoverableTasks 双轨数据源——conversations loop_state 实时投影+ai_list_recoverable IPC 完备真相合并去重,面板展开触发 IPC 拉取,失败退回投影;ai.ts listRecoverable 封装)。验收:cargo check EXIT 0 + vue-tsc EXIT 0。
- [ ] B4(L):ai_recover_parked 重启恢复 + H3 外部干预感知(git HEAD 比对→Parked)
- [x] B2(M):H2 token 三闸 ✅(2026-10-06 实施+走查重构:agentic/mod.rs 轮间双闸——UNATTENDED_WALL_SECS=30min 挂钟闸+UNATTENDED_MAX_TOKENS=5M token 闸,超限 emit_task_parked(reason=wall_clock/token_budget)+teardown_round 正典收尾安全停靠;走查批收敛两分支 40 行复制粘贴为单 over 判定块+类型统一 u64;轮次闸由 effective_max 既有上界承担不重复)+ ~~H4 产出审计 subscriber~~ ✅H4 已落地(2026-10-06 勘察后实施:lib.rs setup 订阅 ai_event_bus,AiToolCallStarted{id,name,conversation_id}入内存配对表(上限512防泄漏)/AiToolCallCompleted{id,result,conversation_id}配对取 name 落兜底审计行(decided_by=event_bus,risk 保守 Low)——Completed 无 name/isError 字段,失败态由主链 audit_tool_call 口径区分;与 process_tool_calls 审计重复面=同 call_id 幂等可容忍;async 块只持 db:Arc<Database> 不持 AppState 整体(非 Send tunnel 回调致 E0277,已修);走查批删废话注释+命名规范化 v/etype→event/event_type)。**H4 剩余价值点=无人值守产出/失败统计订阅,正确实施时机=W-d1 挂机循环落地时**。验收:cargo check EXIT 0 + cargo test --lib 711 passed
- [x] B4(M):ai_recover_parked 重启恢复 ✅(2026-10-06 实施,断点续跑闭环收尾:①后端 conversation.rs ai_recover_parked IPC——守卫两道(会话存在且 loop_state='parked' 非则拒/conv_states.can_accept_request 双保险)→注入恢复引导消息「回顾上下文继续未竟任务,不足以判断先向用户确认」→复用 spawn_agentic_session 正典链路零新协议(loop 启动即置 running,parked 自然清除),lib.rs 已注册 ②前端 TopBar 可恢复面板行改双钮布局(切回|恢复琥珀描边钮),recoverParked 防重入 recoveringIds Set→成功后 switchToRunning 切回,api.ts recoverParked 封装,i18n zh/en recoverNow 两键)。剩 H3 外部干预感知(git HEAD 比对→Parked)独立小批。验收:cargo check EXIT 0 + vue-tsc EXIT 0 + cargo test --lib 711 passed
## UI/UX 体验设计实施项(2026-10-06 设计档:temp/异步任务会话UIUX设计-20261006.md,依赖 13/14/16/17 机制先行)
- [ ] U1 任务卡生命周期组件(双端):桌面 TaskCard 八态投影枚举(全部由既有事件派生,零引擎新状态)+飞书 header 状态色结构卡(JSON 元素级规格已给,动作 v1 走文本命令)
@@ -1068,3 +1069,55 @@ graph TD
- [ ] U4 纠偏交互:桌面直发默认注入·下一轮生效(排队可切),回执+前缀逃生;飞书回复即注入保持
- [ ] U5 异常态话术公式:状态+真实原因+已保留什么+≥2条出路;禁自动判死静默任务(15min 重入退避是合法等待),给判断材料不替用户决策
- [ ] U6 跨端一致性:引擎唯一写者,双端不直同步,"实时"=秒级最终一致;断线恢复桌面走 DB 回放/飞书走 /status 回查
20. [ ] **委托制伪受理断层**(13:38 实证):受理卡在引擎确认可启动之前发出——12:57 任务停滞 Generating 时,「进度」spawn 被引擎拒但受理卡已发,之后零通知零进度(比 09:51 立即报错更隐蔽)。修:受理前过 can_accept_request,不可启动→直接回「前任务在跑,已排队/稍后」;可启动→才发受理卡+watcher 接力。附带:委托制下 inflight 生命周期改跟任务走(handle_message 提前返回致 18 修正再次失效,13:18 误报复现)。验收:同场景复测,占用期发消息得到明确排队提示而非静默受理。
> **符号语义规范(2026-10-06 用户反馈:受理卡「✅ 已受理」歧义,随 19 统一出口一并落地)**:
> - 🚀 受理/开工(任务开始才用,禁 ✅)|⏳ 进行中/排队/等待|✅ 仅限完成且成功|❌ 失败(必须附原因)|⚠️ 警告/需注意(附数据)|📎 附录/附加信息
> - 原则:符号=状态的一眼判据,同一符号跨场景语义必须一致;受理卡改为「🚀 已受理,后台执行中」;完成推送才允许 ✅ 开头。
## 飞书交互面全量盘查(2026-10-06,11 条缺陷按恼人度降序,修复前话术避免引用 /status)
31. [ ] 🔴 **过程推送散乱刷屏**(14:06 用户截图反馈「信息太散乱爆炸了」):push_to_chat(:797)每调用必新开独立卡片,通道无聚合语义——昨日调试把链路测试/修复上线/加固明细等 L3 过程逐条直推 4+ 条进群,与 U3 分级相悖。修双层:①机制=push_to_chat 增滚动汇总卡——同 chat 维护在途事务卡 message_id(内存即可,重启另起),进度用已有 update_card(:730)原地追加;首推需 send_markdown_card 返回新卡 id(现 :683 is_ok() 丢弃,比照 reply_markdown_card);文本以 ✅/❌ 开头=终态,更新后清句柄下条另起新卡;更新失败回退新发并重绑(比照 deliver_result 兜底)。②纪律=L3 过程默认不推群,落日志+进度文件;push 收敛「需决策/完成✅」两时机,调试确需的验证推也进汇总卡不新开。验收:同事务多步进度群时间线只占 1 张卡,过程类推送零直达。
21. [ ] 🔴 **/status 被话术推荐但不存在**(chat.rs:387/:486 两处):用户发了被当任务烧一轮 LLM。修:实现 /status(读 conv 状态返回进度摘要,配合委托制价值高)或先改话术删除引用。验收:发 /status 得进度卡而非 spawn。
22. [ ] 🔴 **35min 兜底回查会投出上一任务旧回答冒充本次结果**(feishu_channel.rs:483/:939):回查整 conv 最后 assistant 文本无任务边界。修:回查限定受理时间戳之后的 assistant,无则给真实状态话术。
23. [ ] 🔴 **watcher 首超时后永不弃守**(:486 continue 与注释"二次超时弃守"相反)+错误路径只发 AiError 无 AiAgentFinished→每 35min 重刷过期文案+任务泄漏。修:二次超时真弃守+AiError 也广播 Finished(status=error)。
24. [ ] **无取消/审批通路**:跑偏无法叫停(飞书零 stop 通道);审批挂起对飞书用户不可见(流式卡冻结无解释)。修:/cancel 对接 ai_stop_loop;审批事件上卡片(「需审批:xxx,回复 批准/拒绝」)。
25. [ ] **非文本消息静默丢**(:243):发图/文件零反馈。修:回「暂仅支持文本,媒体能力规划中」(D7 前的兜底)。
26. [ ] **⏳话术承诺排队实际不入队**——话术与行为不符。修:改话术为实况(「可稍后重发」)或实现真排队(与 20 受理断层同修)。
27. [ ] **快任务兜底死分支**(:449 elapsed>=3s 入场即查恒假,「秒级任务直投终版」不可达)。修:受理卡发送后计时或事件驱动判定。
28. [ ] **注入末轮竞态**:loop 已在末轮则补充指令无人消费静默丢失。修:注入后检查 loop 剩余轮次,末轮则自动续一轮。
29. [ ] **push_to_chat 取 KV map 首条**(:792):多 chat 绑定可能发错会话。修:按 conv 反查 chat。
30. [ ] 细节批::389 反引号不闭合;/new 大小写与附言容错;/new 时旧任务在跑无提示;标点半全角混排。
## 上下文根治专项(2026-10-06 设计定稿:docs/02-架构设计/上下文根治设计-20261006.md,取代旧 C 发散条目)
- [ ] P1(S):工具结果瘦身——超 2K 结果正文落盘+句柄,上下文留摘要+路径(与 D2a 同构,最大头先行)
- [ ] P2(M):L1/L2/L3 分层组装器(build_for_request 改造:常驻+滑动窗口+检索召回)
- [ ] P3(M):压缩常规化(水位兜底→常规滑动)+记忆卡 C-m1+按段重载 C-r1
- [ ] P4(S):量化验收——223:1→≤50:1,prompt 均值 71K→≤20K,agent 能力不降级回归
- 注:C-r0(验证后台化)独立不变;C-m2/C-r1 并入 P2/P3;旧 C 发散条目以新设计档为准销账。
### 上下文根治补充项(2026-10-06 完整审视第十节产出,设计档 docs/02-架构设计/上下文根治设计-20261006.md 第九/十节)
- [ ] G7 平台能力对齐调研(P2 前置):模型/平台原生上下文能力盘点(Claude context editing/memory tool 等)vs 自研边界——能用原生不自研;自研聚焦平台没有的(任务聚类切换/跨会话页池)。产出:对齐结论一页,定 P2 增删。
- [ ] P2 细化:统一检索面——knowledge_inject 扩为全类型注册方(工具句柄/历史页/记忆卡/knowledge 同一召回入口,分类型返回+来源标注)+三层配额(prompt ≤20 条/每轮召回 ≤5 页/句柄按需)+调度器指标(页命中率/召回率/换出量)进日志与面板。
- [ ] P4 细化:任务回归集建设——固定任务清单(5-10 个代表任务),组装器改造前后跑对比(完成质量/轮数/token 成本),作为"能力不降级"的可证口径。
### B5 无人值守续作引擎(2026-10-06 用户实证"总停下确定性任务"的根治,挂机治理核心缺口)
- [ ] **B5a 挂钟闸分任务定级**:确定性任务(看板任务/用户拍板项)挂钟闸放宽(如 120min)或按预估时长配置;闸到点改「检查点+续跑」(存进度不停工),仅非确定性/失控疑似才硬停靠。
- [ ] **B5b 停靠自动续作**:停靠/parked/批收敛后自动回读看板——有 parked 可续任务→自动 resume;有未完批次→自动领单续作;真需决策才停(附决策项)。无人值守的"永动"机制,CLAUDE.md 领单纪律的运行时化。
- [ ] **B5c 审批无人值守策略**:挂机中审批拦截按用户预设策略处置(低风险自动批+留痕,高风险停下+通知),策略 yml 可配。验收:挂机 4h 连续推进模拟(确定性批次队列),零人工干预零停顿;超大任务挂钟闸到点走检查点续跑。
### 任务自主推进全链卡点-治法映射(2026-10-06 补全,B5 系总览)
链路:感知领单→开工检查→执行→停靠/收敛→恢复→续作→汇报
- 感知领单:CLAUDE.md 领单纪律(新会话 ✔)/**挂机长会话无回读驱动→B5b 治**
- 执行中:30min 挂钟闸硬停→**B5a 治**;审批拦截无策略→**B5c 治**;**工具失败低效重试(404 连环十几次,无退避换路策略,同 yideng 教训)→新增 B5d:工具失败快速放弃+换路径+退避策略**;长上下文每轮变慢(223:1)→上下文根治 P1-P4 治;外部干预 loop 认知过时→B4(H3)治
- 停靠/收敛:停后不自动续→**B5b 治**;parked 恢复需人工点→B5b 自动恢复治
- 可见性:进度/卡点/审批对用户不可见→13 过程流式+24 审批卡治
- 汇报:B1-H1 git 实测已治 ✔
- 远期(真实需求触发):多任务并行度/跨会话任务分发
**补齐优先序:B5d 工具重试策略 → B5a 挂钟定级 → B5b 自动续作 → B5c 审批策略 → B2 预算闸 → 13 过程流式**
### 13a 飞书过程可见性加固(2026-10-06 用户实证"卡点到结束才回复",13 的最小件提前独立做,零新机制)
- [ ] 13a-1 刷新可观测:refresher 的 update_card 失败从"静默跳过"改为 feishu_log 记录+连续失败计数(≥3 连败告警)——当前刷了还是没刷、刷败全不可知,排查无从下手。
- [ ] 13a-2 静默期心跳汇报:AiHeartbeat(20s 既有事件)接入 refresher——超 N 分钟无内容刷新→主动刷一行「仍在跑:第 X 轮 · 最近动作 yyy」(数据源 AiAgentRound/最后工具名),防静默期卡片冻结。
- [ ] 13a-3 阶段汇报:AiTaskProgress(每 5 轮,mod.rs:1119 已 emit)接入 refresher——长任务的阶段性进展对飞书用户可见(当前只有桌面消费)。
- [ ] 13a-4 受理→首刷衔接:受理卡到首个 delta/心跳之间的静默窗口检查(>60s 无首刷则心跳兜底)。
验收:206 轮级长任务期间,占位卡至少每 3-5 分钟有一次真实更新(心跳或阶段),失败可见于 feishu-channel.log。
31. [ ] **AI-Ops→devflow 派工通道**(多 bot 编排正统通道,2026-10-06 缺口实证):AI-Ops 无法直接触发 devflow 开工(飞书 bot 消息不互触发/WebChat 无/remote_bridge 走 tunnel 不外用)。方案二选一:①u-claw 侧新增 ask_devflow(与既有 ask_uclaw 对等,经 remote_bridge 协议下发启动指令) ②devflow 侧看板轮询引擎(定时扫 todo.md 新🔴/高优条目自动开工,CLAUDE.md 领单纪律的运行时化=B5b 同源)。建议 ② 与 B5b 合并实现(同一套自动续作引擎)。验收:AI-Ops 写看板后 15min 内 devflow 自主开工,零人工中转。