Version: 0.9.62.dev.260502

后端:
1. 主动调度补齐 `unfinished_feedback` 定位闭环——用户补充信息先在滚动窗口内定位到可校验的日程块,定位失败则继续 ask_user,不再硬猜 target_id 或直接跑 graph。
2. 聊天占管重跑链路加并发保护——`waiting_user_reply -> rerunning` 改为 DB CAS 抢占,重复补充只返回可见等待提示,避免并发生成多份 preview。
3. rerun 结果回写继续收口——新 preview_id 同步回 trigger 审计指针,session 只在拿到新 preview 时更新当前预览,ready_preview 后清空追问状态并释放回普通聊天。
4. 主动调度事件校验放宽 unfinished_feedback 的空 target 场景,允许先触发、后定位,再进入 graph + preview 主链路。
This commit is contained in:
Losita
2026-05-02 12:41:50 +08:00
parent a3eaa9b2c2
commit ba23ebd201
12 changed files with 891 additions and 103 deletions

View File

@@ -2,7 +2,7 @@
## 0. Handoff 说明
本文档已收口为第二阶段主动调度 MVP 的最终实施版。截至 2026-04-30,后端第一至第四阶段主体代码已实现并通过本地 `go test ./...`;真实飞书 webhook 配置接口和 `important_urgent_task` 主动触发端到端链路已通过本地后端验收。接手者请优先阅读本节、第 10 章装配边界和第 14 章验证 checklist再从第五阶段剩余验收继续推进。
本文档已收口为第二阶段主动调度 MVP 的最终实施版。截至 2026-05-02,后端第一至第四阶段主体代码已实现并通过本地 `go test ./...`;真实飞书 webhook 配置接口`/assistant/{conversation_id}` 会话链接`important_urgent_task` 主动触发端到端链路已通过本地后端验收。阶段进度看板请以《主动调度缺口分阶段实施计划.md》为准那里会把已完成阶段标成 `[x]`接手者请优先阅读本节、第 10 章装配边界和第 14 章验证 checklist再从第五阶段剩余验收继续推进。
当前核心共识:
@@ -60,7 +60,7 @@
3. task_pool 正式落库写 `schedule_events(type=task, task_source_type=task_pool, rel_id=tasks.id)`
4. 补做块新增 event不移动原已排任务。
第四阶段worker 与 notification。主体代码已完成,真实 webhook 配置接口已验收)
第四阶段worker 与 notification。已完成真实 webhook 配置接口已验收)
1. 接入 `active_schedule.triggered` worker handler 和 due job scanner。
2. 接入 `notification.feishu.requested` handler。
@@ -75,7 +75,7 @@
3. 根据日志和测试结果补齐 trace 字段与错误码。
4. 主链路稳定后再评估是否打开压缩融合候选。
第六阶段:主动调度 graph 补齐、会话桥与聊天页合流。(待实施
第六阶段:主动调度 graph 补齐、会话桥与聊天页合流。(主体已完成,剩余最终验收与文档收口
0. `estimated_sections` 写入入口已经补完:普通任务创建请求、转换层和 quick task / 随口记创建任务时,都会把 LLM 估计的 1~4 节写入 `tasks.estimated_sections`;主动调度只消费该字段,不在 graph 内重新猜任务耗时。
1. 补主动调度 Eino graph把现有 `BuildContext -> Observe -> GenerateCandidates -> CreatePreview` 固定 pipeline 整理成 graph 节点,并新增 LLM 解释 / 有限选择、`ask_user`、fallback 分支;当前代码里的 first-fit / `Candidates[0]` 只能作为过渡实现。
@@ -141,7 +141,7 @@
- 已实现 preview 写入、详情查询、`apply_id + idempotency_key`、候选转换、同步 apply adapter。
- `add_task_pool_to_schedule` 已能正式写入 `schedule_events(type=task, task_source_type=task_pool, rel_id=tasks.id)` 和对应 `schedules`。
- `create_makeup` 转换与 adapter 已预留并实现基本写入路径,但尚需在第四 / 第五阶段结合正式 unfinished feedback worker 场景补端到端验收。
4. 第四阶段worker 与 notification 主体代码。
4. 第四阶段worker 与 notification 主体代码(已完成)
- 已接入 `active_schedule.triggered` worker handler、due job scanner、`notification.feishu.requested` handler 和 notification retry loop。
- 已新增 `backend/notification` provider / service 分层mock provider 保留,真实投递切到用户级飞书 Webhook 触发器 provider。
- 已新增 `user_notification_channels` model / DAO并接入 AutoMigrate 与 `RepoManager`。
@@ -201,17 +201,30 @@
下一阶段入口:
1. 下一步继续第五阶段剩余验收,不需要重做 dry-run / preview / confirm 主链路,也不需要重做第四阶段 provider / handler 主体代码。
2. 第五阶段剩余重点:
- confirm apply 冲突失败、过期拒绝
1. 下一步继续第五阶段剩余验收,不需要重做 dry-run / preview / confirm 主链路,也不需要重做第四阶段 provider / handler 主体代码,也不需要重做第六阶段 graph / session bridge / 聊天页合流主体代码
2. 第五阶段剩余重点已经收口为负向边界和脚本化验收
- 保留前置验证:`go build ./cmd/all`、backend 下 `go test ./...`,并清理本次生成的 `.gocache`
- 阶段 3 主链路不再全量重跑,只做 1 条真实 chat 烟测确认入口未回归。
- preview 过期、重复 confirm、candidate / preview 篡改、preview 与 session 不匹配都必须拒绝。
- 冲突失败或不可写入场景必须失败并保留可排障状态。
- trigger 幂等、notification 状态矩阵、outbox 重复消费和 `api / worker / all` 启动边界必须补齐证据。
- 更完整的边界清理:测试数据隔离策略、失败注入脚本化、前端真实地址替换为正式域名配置。
4. 工作区注意:
3. 工作区注意:
- 另一个前端对话可能在改前端;后端阶段不要碰 `frontend` 相关改动。
- 当前允许单个 Go 文件 700 行以内;超过 700 再评估拆分。
- 每次执行 `go test` 后必须清理根目录 `.gocache`。
- 后续阶段必须优先自动化验收能由代码、API、DB 查询、日志查询验证的内容,由实现者自己跑完并记录结果。
- 如果受限于外部账号、真实飞书环境、浏览器人工交互、权限或本地环境,导致某项验收无法完成,不能默认为通过,也不能在报告中省略;必须明确写出未验收项、阻塞原因、建议由用户执行的操作和预期结果。
### 0.4 2026-05-02 最新验收记录
这轮接手时,周四窗口的主动调度最小闭环已经再次跑通,可作为周报截图和阶段 5 续验的基线。
1. 测试账号使用 `test0424 / 123456`,任务为“做马原大作业”,并把 `mock_now` 固定到 `2026-04-30T01:14:21+08:00` 的周四窗口,避免周六空窗造成的误判。
2. trigger `ast_1bb62e3e-f2cf-48a9-8f29-1461b99bff6b` 生成 preview `asp_e79db789-ba16-4108-a843-cd33c03aa3f6`,会话 `ce525dc0-101a-50ca-8993-7fc466328de2` 挂接当前 preview`notification_records.id=22` 发送成功。
3. DB 里 `active_schedule_triggers.status=preview_generated`、`active_schedule_previews.status=ready`、`active_schedule_sessions.status=ready_preview`,而 `schedule_events` 对该 preview 的正式写入计数为 0说明这次只到预览态还没有执行正式 apply。
4. 浏览器里能看到周四列同时存在已有课程和待确认任务块,证明“滚动 24 小时窗口 + 课程事实 + task_pool 预览”的展示链路是完整的。
## 1. 文档目的
本文档承接《第二阶段主动调度 MVP 功能预期》和《微服务四步迁移与第二阶段并行开发计划》,用于把产品预期逐步落成可执行的工程方案。