修「检查会话落到未分组」+ 检查程序静默阈值 20 → 10 分钟
一、检查会话跑到未分组(用户报障逐字)
「vibe-product 的检查会话没有创建到工作区下,跑到未分组的会话中去了」。
根因(实测坐实):collabd.py::create_check_schedule() 的 INSERT **少了 workspace_scope 列**
⇒ 落库 NULL ⇒ 排期触发出来的会话被宿主当**游乐场**建
(sessions 行:is_playground=1 + source_mode='craft' + use_sandbox_cli=0)⇒ 不进工作区分组。
对照读数(同一晚两条排期):会话侧 automation_update 建的是 'workspace' ✓,
机制自建的是 None ❌;近 3 天 59 条排期里只有机制那条是 None。
修法:INSERT 补 workspace_scope 并以 'workspace' 落库。
配套:新增 selftest 用例 t_check_schedule_scope(3 项),含变异对照
(把列删掉 ⇒ 报红;还原 ⇒ 逐字节一致)。
二、检查程序等待时间 20 → 10 分钟(用户令逐字)
「把检查程序的等待时间由 20分钟 改为 10分钟」。
改法:新增常量 CHECK_IDLE_MIN = 10,**闸门与 --dry-run 试算都读它**(原来两处各写死 20);
并同步**写给检查会话看的 prompt 文案**(≥20 → ≥10)与 4 处注释/文档
(references/supervise-persistence.md §六;顺带订正该节「基准取台账 tasks.json 的 mtime」——
与代码不符,实际是「本工作区排期的 updated_at 最大值」)。
配套:新增 selftest 用例 t_check_idle_min(4 项,**不锁数值**、只锁"常量/闸门/试算/文案同源"),
含变异对照(把文案改回 20 ⇒ 报红)。
三、旧数据归位与分发
- 今晚那条歪掉的检查会话已改回工作区档(is_playground 1→0、source_mode craft→work、
use_sandbox_cli 0→1;排期 workspace_scope → 'workspace');改前原值已备份到
归档/检查会话归位-20261007/;PRAGMA integrity_check = ok。
- 副本分发:ai1net-dsh-server 与 vibe-product 各 7 个文件;两区常驻已重启
(判据=心跳 started_h 07:54:35 / 07:54:37,晚于分发时刻 07:54:07)。
验收:selftest.py rc=0 PASS 102 / FAIL 0(改前 99);manifest 70 份、语法失败 0。
This commit is contained in:
1 parent
9a665039a9
commit
a3935b5fc5
4 files changed
+87
-20
No files matched your search
@@ -797,7 +797,7 @@ def t_two_kinds_of_check_agent():
|
||||
用户原话两条:
|
||||
1、会话全结束(**还要加上 定时任务中没有本项目待执行的任务**)且**队列不为空** ⇒
|
||||
**结果检查会话**去跟进任务会话执行结果,判断是否创建对应任务会话继续完成目标;
|
||||
2、会话全结束(同上)且**队列为空 >20 分钟** ⇒ **目标检查会话**去核对目标完成状态,
|
||||
2、会话全结束(同上)且**队列为空 >10 分钟** ⇒ **目标检查会话**去核对目标完成状态,
|
||||
判断是建任务会话还是**修改目标状态**,并执行。
|
||||
|
||||
⇒ 改前**两套 prompt 完全共用一个模板** ⇒ 结果检查会话拿到了"改目标状态"的出口(越权),
|
||||
@@ -7295,5 +7295,55 @@ def t_dispatch_gate():
|
||||
return r
|
||||
|
||||
|
||||
@case("⛔ 机制自建的检查排期必须挂进工作区(少 workspace_scope ⇒ 会话落到未分组)")
|
||||
def t_check_schedule_scope():
|
||||
"""🔴 2026-10-07 立。
|
||||
|
||||
用户报障逐字:「**vibe-product 的检查会话没有创建到工作区下,跑到未分组的会话中去了**」。
|
||||
实测根因:`collabd.py::create_check_schedule()` 的 INSERT **少了 `workspace_scope` 列**
|
||||
⇒ 落库 NULL ⇒ 触发出来的会话被宿主当游乐场建(`is_playground=1` / `source_mode='craft'`
|
||||
/ `use_sandbox_cli=0`)⇒ 不进工作区分组。
|
||||
对照读数(同一晚两条排期):会话侧 `automation_update` 建的是 `'workspace'` ✓,
|
||||
机制自建的是 `None` ❌;近 3 天 59 条排期里**只有机制那条**是 None。
|
||||
"""
|
||||
src = (HERE / "collabd.py").read_text(encoding="utf-8", errors="replace")
|
||||
i = src.find("INSERT INTO automations")
|
||||
seg = src[i:i + 1000] if i > 0 else ""
|
||||
return [
|
||||
("找得到建排期的那处 INSERT", i > 0),
|
||||
("列清单里有 `workspace_scope`(⛔ 少了它,会话就落到未分组)",
|
||||
"workspace_scope" in seg),
|
||||
("且写死 `workspace`(⛔ 不是 NULL、也不是别的档)",
|
||||
('"workspace"' in seg) or ("'workspace'" in seg)),
|
||||
]
|
||||
|
||||
|
||||
@case("⛔ 检查程序静默阈值:常量、闸门、试算、文案必须同源(⛔ 别只改一处)")
|
||||
def t_check_idle_min():
|
||||
"""🔴 2026-10-07 立(用户拍板:检查程序等待时间 **20 → 10 分钟**)。
|
||||
|
||||
这个数**散落在四处**,改一处漏三处就会"判据说 A、写给检查会话的文案说 B":
|
||||
① 常量 `CHECK_IDLE_MIN`;② 闸门 `if idle_min < CHECK_IDLE_MIN`;
|
||||
③ `--dry-run` 试算(⛔ 不同源 ⇒ 试算说"不会建"、实际却建了);④ `CHECK_PROMPT_GOAL` 的文案。
|
||||
⚠️ 本条**不锁具体数值**(换个值不该报红)—— 只锁"四处同源"。
|
||||
"""
|
||||
import re as _re
|
||||
src = (HERE / "collabd.py").read_text(encoding="utf-8", errors="replace")
|
||||
m = _re.search(r"^CHECK_IDLE_MIN = (\d+)", src, _re.M)
|
||||
v = int(m.group(1)) if m else -1
|
||||
# ⚠️ 锚**定义处**(`= (`),⛔ 不能用 `find("CHECK_PROMPT_GOAL")` ——
|
||||
# 它先命中本常量上面那条注释 ⇒ 3000 字窗口够不到真正的文案 ⇒ **假红**(第一版就这么栽的)。
|
||||
i = src.find("CHECK_PROMPT_GOAL = (")
|
||||
prompt = src[i:i + 3000] if i > 0 else ""
|
||||
return [
|
||||
("常量 `CHECK_IDLE_MIN` 存在且是整数(现为 %d 分钟)" % v, v > 0),
|
||||
("闸门读常量、⛔ 不写死数字", "idle_min < CHECK_IDLE_MIN" in src),
|
||||
("`--dry-run` 试算读同一个常量(⛔ 不同源 ⇒ 试算与实际打架)",
|
||||
"idle >= CHECK_IDLE_MIN" in src),
|
||||
("写给检查会话的文案与常量同值(⛔ 别只改判据、文案还写旧值)",
|
||||
("≥%d 分钟" % v) in prompt),
|
||||
]
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Reference in new issue
Block a user