Version: 0.9.5.dev.260407

后端:
1.粗排链路收口(按 task_class_ids 精确加载 ScheduleState + 规划窗口抗脏数据)
  - 更新conv/schedule_provider.go:新增 LoadScheduleStateForTaskClasses;优先按本轮任务类加载窗口;buildWindowFromTaskClasses 改为逐条过滤坏日期,避免 DayMapping 被全量任务类污染
  - 更新model/state_store.go:新增 ScopedScheduleStateProvider 可选接口
  - 更新model/graph_run_state.go:EnsureScheduleState 首次加载时优先走 scoped provider,再做 scope 裁剪
2.粗排建议态语义统一(pending/existing → pending/suggested/existing)
  - 新建tools/status.go:统一 IsPendingTask / IsSuggestedTask / IsExistingTask / scope 过滤逻辑
  - 更新node/rough_build.go:粗排回写后任务显式转 suggested;pending 统计仅看“真实 pending”
  - 更新tools/state.go:ScheduleTask.Status/Slots/Duration 注释补齐 suggested 语义
  - 更新tools/read_helpers.go + read_tools.go:overview/list_tasks/task_info 支持 suggested 展示;占用计算按“已落位任务”统一处理
  - 更新tools/write_helpers.go + write_tools.go:place/move/swap/unplace 全量切到 suggested/existing/pending 新语义
  - 更新tools/registry.go + SCHEDULE_TOOLS.md:工具描述、参数枚举、文档口径同步到 suggested 语义
  - 更新conv/schedule_preview.go:预览层统一通过 IsSuggestedTask 输出 suggested,兼容旧快照
  - 更新service/agentsvc/agent_newagent.go:预览 debug 摘要改为 pending/suggested/existing 三态统计
3.粗排调试增强
  - 更新node/rough_build.go:新增 applied/day_mapping_miss/task_item_match_miss 统计及样本日志,便于排查 placement 未落回 state 的根因
前端:无 仓库:无
This commit is contained in:
Losita
2026-04-07 23:58:00 +08:00
parent 07d307fe07
commit cdedd3c968
14 changed files with 599 additions and 174 deletions

View File

@@ -112,10 +112,10 @@ State 是工具层的操作对象,存在于内存中,不直接暴露给 LLM
| `source_id` | int | 原表主键ScheduleEvent.ID 或 TaskClassItem.ID写库时用于反查 |
| `name` | string | 任务名称,来自 ScheduleEvent.Name 或 TaskClassItem.Content |
| `category` | string | 类别名,来自 TaskClass.Name如"课程"、"学习"、"作业" |
| `status` | string | `"existing"`(已安排)| `"pending"`(待安排)|
| `status` | string | `"existing"`(已安排/已确定)| `"suggested"`(已预排/可优化| `"pending"`(待安排)|
| `locked` | bool | 是否锁定。推导规则ScheduleEvent.Type="course" 且 CanBeEmbed=false 时为 true |
| `slots` | array | 已安排任务的时段列表,每项含 day/slot_start/slot_end |
| `duration` | int | 待安排任务需要的连续时段数(pending 任务 |
| `duration` | int | 待安排/已预排任务需要的连续时段数pending / suggested 任务常见 |
| `category_id` | int | 所属 TaskClass 的 ID仅 source=task_item 时有值) |
**嵌入任务相关字段(仅 can_embed=true 的任务):**
@@ -291,7 +291,7 @@ DB 记录:
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| category | string | 否 | 过滤类别(对应 TaskClass.Name如"课程"、"学习" |
| status | string | 否 | existing / pending / all默认 all |
| status | string | 否 | existing / suggested / pending / all默认 all |
**返回示例(待安排):**
@@ -365,7 +365,7 @@ DB 记录:
### 5.1 place
将待安排任务放置到指定位置。
将待安排任务预排到指定位置。
**入参:**
@@ -408,7 +408,7 @@ DB 记录:
### 5.2 move
移动已任务到新位置。
移动已落位任务到新位置。
**入参:**
@@ -449,7 +449,7 @@ DB 记录:
### 5.3 swap
交换两个已安排任务的位置。
交换两个已落位任务的位置。
**入参:**
@@ -515,7 +515,7 @@ DB 记录:
### 5.5 unplace
将已安排任务恢复为待安排状态。
将已落位任务恢复为待安排状态。
**入参:**
@@ -551,7 +551,8 @@ DB 记录:
- place 新任务到锁定时段同样拒绝
### 状态约束
- pending 任务只能 place不能 move / swap
- pending 任务只能 place不能 move / swap / unplace
- suggested 任务可以 move / swap / unplace
- existing 任务可以 move / swap / unplace
- 状态不符时返回明确错误信息
@@ -574,7 +575,7 @@ DB 记录:
- 嵌入任务的 locked 继承宿主:宿主不可移动时,嵌入任务也不可单独移动
### 数据库交互
- State 初始化:从 Schedule + ScheduleEvent 加载 existing 任务,从 TaskClassItem 加载 pending 任务
- State 初始化:从 Schedule + ScheduleEvent 加载 existing 任务,从 TaskClassItem 加载 pending 任务;粗排或工具预排成功后,任务转为 suggested
- State 落库Confirm 节点统一处理,将 state 变更转换为 Schedule/ScheduleEvent/TaskClassItem 的增删改
- 落库时使用 source + source_id 定位原记录,使用 day_mapping 将 day_index 转回 (week, day_of_week)
- 落库时将 (slot_start, slot_end) 展开为逐条 Schedule 记录