Version: 0.7.2.dev.260322

feat(schedule-plan):  重构智能排程链路并修复粗排双节对齐问题

-  新增“对话级排程状态持久化”能力:引入 `agent_schedule_states` 模型/DAO,并接入启动迁移
-  智能排程图升级:补齐小幅微调(quick refine)分支,完善预算/并发/状态字段流转
-  预览链路增强:完善排程预览服务读写与桥接逻辑,新增本地预览页 `infra/schedule_preview_viewer.html`
- ♻️ 缓存治理统一:将相关缓存处理收口到 DAO + `cache_deleter` 联动清理,移除旧散落逻辑
- 🐛 修复粗排核心 bug:禁止单节降级,强制双节并按 `1-2/3-4/...` 对齐;修复结束日扫描边界问题
-  新增粗排回归测试:覆盖孤立单节、偶数起点双节、Filler 对齐等关键场景
This commit is contained in:
Losita
2026-03-22 13:50:10 +08:00
parent f3f9902e93
commit e5b27df80d
20 changed files with 1961 additions and 166 deletions

View File

@@ -0,0 +1,77 @@
package scheduleplan
import (
"context"
"fmt"
)
// runQuickRefineNode 是 small 微调分支的“轻量预算收缩节点”。
//
// 职责边界:
// 1. 负责在进入 weekly_refine 前收缩预算与并发,避免小改动走重链路;
// 2. 负责保留“可回退”的最低预算,避免直接压成 0 导致无动作可执行;
// 3. 不负责执行任何 Move/Swap真正动作仍由 weekly_refine 完成)。
func runQuickRefineNode(
ctx context.Context,
st *SchedulePlanState,
emitStage func(stage, detail string),
) (*SchedulePlanState, error) {
_ = ctx
if st == nil {
return nil, fmt.Errorf("schedule plan quick refine: nil state")
}
emitStage("schedule_plan.quick_refine.start", "检测到小幅微调,正在切换到快速优化路径。")
// 1. 预算收缩策略:
// 1.1 small 场景目标是“快速响应 + 可解释改动”,不追求大规模重排;
// 1.2 因此把总预算压到最多 2 次尝试、有效预算压到最多 1 次成功动作;
// 1.3 如果上游已配置更小预算,则尊重更小值,不做反向放大。
if st.WeeklyTotalBudget <= 0 {
st.WeeklyTotalBudget = schedulePlanDefaultWeeklyTotalBudget
}
if st.WeeklyAdjustBudget <= 0 {
st.WeeklyAdjustBudget = schedulePlanDefaultWeeklyAdjustBudget
}
st.WeeklyTotalBudget = clampBudgetUpper(st.WeeklyTotalBudget, 2)
st.WeeklyAdjustBudget = clampBudgetUpper(st.WeeklyAdjustBudget, 1)
// 2. 预算一致性兜底:
// 2.1 总预算至少为 1否则 weekly worker 无法执行);
// 2.2 有效预算至少为 1否则所有成功动作都不被允许
// 2.3 有效预算永远不能超过总预算。
if st.WeeklyTotalBudget < 1 {
st.WeeklyTotalBudget = 1
}
if st.WeeklyAdjustBudget < 1 {
st.WeeklyAdjustBudget = 1
}
if st.WeeklyAdjustBudget > st.WeeklyTotalBudget {
st.WeeklyAdjustBudget = st.WeeklyTotalBudget
}
// 3. 小改动路径把周级并发收敛到 1优先保证稳定与可观察性。
st.WeeklyRefineConcurrency = 1
emitStage(
"schedule_plan.quick_refine.done",
fmt.Sprintf(
"快速微调预算已生效:总预算=%d有效预算=%d并发=%d。",
st.WeeklyTotalBudget,
st.WeeklyAdjustBudget,
st.WeeklyRefineConcurrency,
),
)
return st, nil
}
// clampBudgetUpper 把预算裁剪到“非负且不超过上限”。
func clampBudgetUpper(current int, upper int) int {
if current < 0 {
return 0
}
if current > upper {
return upper
}
return current
}