session-mechanism:主会话只能由用户开(撤掉"排期建主会话"那条路)

用户报障:「技能中没有任何创建主会话的机制,除非是创建接续会话」。

病灶:supervise-persistence.md §〇 早期把「定时任务创建主会话」与「用户手动
创建主会话」并列成两种合法场景,SKILL.md §⑥ 顺着抄了一遍 ⇒ 读到的人会理解成
"这条路是允许的",于是照做。

实测事故(mcn-aigc-ontology 2026-10-14 07:31):init_workspace 装机制后建出
recurring 排期 [主]-super-i卡片采集-主会话(FREQ=DAILY;BYHOUR=09),prompt 里
写着「你是本工作区的主会话……要推进就直接建 [执行] 排期拉起任务会话」——
主会话的口径被套到了一条排期身上。排期开出来的会话恒是任务会话那一档
(is_background_automation=1)⇒ 台账里多一条"主会话",用户那边没多窗口。

改动:
- SKILL.md §⑥:改成「形态只有一种:主会话由用户手动开」,⛔ 排期拉不出主会话
- supervise-persistence.md §〇:表格两列改一列 + 新增事故回放小节
- supervise-persistence.md §八:删掉「B · 定时任务创建主会话」整行
- architecture.md §1:新增《主会话怎么来:只能由用户手动开》段
- session-rules-check.py:新增判据 ⑬ main_sched(扫排期名以 [主] 开头或含
  "主会话" ⇒ ACTIVE 报 fail、非 ACTIVE 报 warn);扫描面 recurring 与 once 全含
- SKILL.md 体检清单:十二项 → 十三项,补 ⑬ 变异对照记录

判据验收(非恒绿):喂 mcn 区真数据三种输入 —— 原样 PAUSED ⇒ warn;
伪造成 ACTIVE ⇒ fail;无此类排期的区 ⇒ ok。

同批带上的既有改动:supervise-launch.py 路径相对化 + 三级取值(禁回落 ~)。
This commit is contained in:
admin committed 2026-10-14 09:48:01 +08:00
1 parent aa89ee0333
commit 053a6a6723
5 files changed
+178 -24

No files matched your search

@@ -625,6 +625,37 @@ def check_orchestration():
else:
rec("cwd", "C", "ok", "`cwds` 归属同形", "本工作区的排期都写在同一条路径上")
# ⑬ 🔴🔴 「顶着主会话名字的排期」—— 2026-10-14 加(用户报障「技能中没有任何创建主会话的机制」)
# 口径(`SKILL.md`《三类会话》类别表逐字):
# **主会话 | 用户手动开 | 管目标与方向、派活 | 用户关窗**
# ⇒ 排期**开不出主会话**:它开的会话恒是任务会话那一档(`is_background_automation=1`)。
# 症状(mcn-aigc-ontology 2026-10-14 实测):
# 07:31 建出 `[主]-super-i卡片采集-主会话`(`recurring` `FREQ=DAILY;BYHOUR=09`),
# prompt 里写着「你是本工作区的主会话……要建 `[执行]` 排期拉起任务会话」
# ⇒ 每天 09:00 开出一条**顶着主会话名头的任务会话** ⇒ 台账里主会话越积越多,
# 而用户那边**根本没多窗口** ⇒ 用户报「机制自己创建了一个主会话」。
# ⚠️ 与「旧前缀 `[主]`」区分:`[主]` 本身没作废(现役主会话可写成 `[主]-…` 或 `主控 · …`),
# 本判据抓的是**它出现在排期名里**这件事,⛔ 不抓会话名。
# ⚠️ 扫描面**必须含 `recurring` 与 `once` 两种**(当年就是只扫 `recurring` 才看不见机制建的 `once` 排期)。
_mainlike = [a for a in _allmine
if (a.get("name") or "").startswith("[主]")
or "主会话" in (a.get("name") or "")]
if _mainlike:
_st = ["%s(%s)" % ((a["name"] or "")[:30], a.get("status") or "?") for a in _mainlike]
# ACTIVE 才算真隐患;已 PAUSED 的留痕只提示
_act = [a for a in _mainlike if (a.get("status") or "") == "ACTIVE"]
if _act:
rec("main_sched", "C", "fail",
"排期顶着「主会话」的名字 ⇒ 主会话只能由用户开(2026-10-14 口径)",
"本区 %d 条在 ACTIVE:%s" % (len(_act), "、".join(_st[:3])))
else:
rec("main_sched", "C", "warn",
"排期曾顶着「主会话」的名字(现已非 ACTIVE,留痕非隐患)",
"本区 %d 条:%s" % (len(_mainlike), "、".join(_st[:3])))
else:
rec("main_sched", "C", "ok", "本区没有「顶着主会话名字」的排期",
"扫描面 %d 条(recurring + once 全含)" % len(_allmine))
# ⑩ 投递心跳
hbs = [WS + "/.workbuddy/collab/logs/supervise-heartbeat.json",
WS + "/.workbuddy/collab/supervise-heartbeat.json"]