| 权重项(方案 §2 / TL §3.2.4) | 分 | 说明 |
same_card 同卡 | +50 | 反向索引显示候选已服务当前卡 |
upstream_lineage 上游血缘 | +30 | 已服务 depends_on 闭包中的 Item |
needs_history 需历史 | +25 | 缺字段/规则 |
same_role 同角色 | +10 | 「任一历史 Item」还是「最近 Item」未定义 |
workspace_fresh 工作区新鲜 | +15 | 缺分界阈值 TL#13;缺值时两者均 false,不阻塞 |
workspace_stale 工作区陈旧 | −20 |
serves_card_count>=3 主题污染 | −25 | 方案唯一给定的污染阈值;=2 不扣分 |
oversized_session 超大会话 | −15 | 指标与阈值均缺 |
runner_switch 需切 runner | −10 | 已绑定不符走硬门,不在此扣分 |
| 阈值:最高分 ≥40 → 复用;<40 或无候选 → 新建。每项最多计一次;同分 tie-break 未定义 TL#13 |
| 五条硬门(方案原文) | 出局码 |
| 引擎锁不一致 | engine_lock_mismatch(不能靠切 runner 绕过已绑定引擎) |
| adopt 会话 cwd 不符 | adopt_cwd_mismatch |
| cwd 不在 allowlist | cwd_not_allowed |
| 已删除 | session_deleted |
| CLI 占用中 | cli_in_use(dispatch 时必须重新检查,不能只信规划快照) |
同一候选命中多个硬门时全部理由都保留,不只显示第一条。返回值形状:mode(reuse|new|forced_same|blocked) · session_id · score · reasons[] · excluded_candidates[] · serialize_after[] · degraded[]。
第五种技术结果 blocked,PM 的四态里没有(TL#15)。热文件要求同一 session,但该 session 可能 deleted / CLI 占用 / 引擎不符——此时物理上无解。不能把它伪装成普通「新建」,那会违反物理串行约束。本稿把它单独画出来(点候选 TL S6 可见),不并入四态、不替用户选。
两条会影响正确性的既有事实:TL#16「CLI 占用中」今天只是 heartbeat 的 UI 提示、不是服务端锁,规划与派发之间存在 TOCTOU;TL#17 engine lock 目前不是所有派发入口的统一前置,新卡路径测试绿不能证明全局不变量。TL#14 另指出:Item 没有目标 runner/cwd 字段,硬门却要比对 runner lock / adopt cwd / allowlist,必须由 adapter 传 normalized candidates。
C3-1 完整算式即上面
TL S4 那条候选,逐字对应方案 §2 的示例(同事项 +50 · 引擎一致 +0 · 需历史上下文 +25 · 主题污染 −25 · 工作区落后 main 37 提交 −20 →
30 分,阈值
40;建议名
workbench_12:会话统一 · 轮1(dev))。
本稿不代裁的措辞分歧:方案原式含「引擎一致
+0」一项,TechLead §3.2.4 的九项权重表
不含该项并明写「没有『引擎一致 +0』奖励」——两者合计都是 30,见
C7 · D2。