协作机制 · 同一工作区 · 多任务类别

2026-09-30 | 归属锚点:跨工作区(cwd) → 同一工作区 + 名称前缀(任务类别) | 自测 PASS 31 / FAIL 0 | 图 ③④ = 收尾整体验证抓到的两个「同族红线」复盘

① 泳道图 · 「任务类别前缀」在哪些环节真正起作用

横轴=机制流水线的五个环节;纵轴=四类参与物。红格=旧版在此失效(静默漏管);绿格=本棒修复后生效;黄格=已知边界(诚实标注)。
环节 → ① 派活命名 ② 归属判定 ③ 主会话解析 ④ 投递 ⑤ 展示/收尾 主会话 协作会话 / 协作棒 自动唤醒任务 协作程序 / 看板 管类别清单、派活、收口 干活的棒 只当闹钟 机械判定、投递、渲染 标题写类别 主控 · <类别> · <具体> 例:主控 · 唤醒机制线 · … 类别进 sid 集 sid ∈ main_sids 即算本项目 ⛔ 标题无方括号也能认 每类各解析一条 resolve_mains() 最长优先 · 主控优先 收该类的件 按件 line 选主会话 ⛔ 不投给别类别 被标「主会话」 多条都对 命名带类别前缀 [协作]-<类别>-<具体> 标题=自动化名(自动带) ✗ 旧:只认一个 short [短名] 之外的类别全判「否」 ⇒ 看板不列、收尾不算=漏管 ✓ 新:认任一已登记类别 标题含 [<类别>] 即算 ⛔ 未登记的类别仍判否 上报带类别 --report … --line <类别> 件 → 类别,投递据此选路 历史 line 仍是工作区名 照实多显示几行 排期名也要带类别 [协作]-<类别>-唤醒轮A 本棒已改(原缺第 2 级) 不被当主会话 标题含 [协作] ⇒ 排除 这一条旧版已对 只拨钟 goalctl wake 条件判断只在协作程序一处 投到「那一类」的主会话 按件 line 选路 ⛔ 无该类别主会话 ⇒ 降级报告 不抢锁 闹钟不干活 类别是唯一键(一个词,四处同义) goal.topics 的一项 ≡ 标题里的 <类别> ≡ 台账的 line ≡ 分工板的一行 _goal_topics() | _topic_in_title() | _scan_mains() / _scan_ws_mains()(两处同款) 分工板的「行」=任务类别(原=工作区) 承接判据:topic == 线 ∨ cwd_tail == 线 ∨ 标题命中该线台账件 双判据并列 ⇒ 新旧数据都能显示
哪一格红了:「归属判定 · 只认一个 short」 —— 这是本棒修的**根因**。它不是崩溃,是**什么也不说**:那两个类别的会话从此不出现在看板上、 也不算"在跑" ⇒ 收尾确认会**误判可以派下一棒**。
哪几道防线缺席:
① 缺「**类别是一组**」的概念(旧代码把归属键写死成单值);
② 缺「**按类别选主会话**」的选路(旧代码只有"唯一主会话");
③ 缺「**命名规范覆盖自动唤醒任务**」的检查(唤醒轮名缺第 2 级没人拦)。
修好之后补上的三道闸:
① 归属判据吃**类别集合**(传 str 时与旧版逐字一致);
② 投递经 main_for_topic():**已登记类别严格取该类**、未登记才回落默认;
③ 自测加了 **9 条结构断言 + 8 例多类别比对**(含"两处 by_topic 结构必须同款")。
为什么现在才对:本工作区**本来就有 ≥2 条"主控"会话**, 类别名**早就写在标题里**(主控 · 唤醒机制线 · … / [主控]-[机制线]-接续…)。 也就是说"用前缀分任务类别"是**已经在用的习惯**,只是**程序侧没认**。本棒把它接上, 并把"类别清单"做成 goal.json.topics 一个可由主会话随时改的字段。

② 缺口 → 修复 链图 · 旧版是怎么静默漏管的、新版在哪一步拦住

上排=**失效链**(旧版一步步走到"漏管");下排=**修复链**(新版在同样的步子上换成什么判据)。每步都标出**判据**。
失效链(旧版) ① 主会话按类别命名 主控 · 唤醒机制线 · … [协作]-[机制线]-… 判据:用户/主会话习惯 ② 归属判据只认一个 ("[short]") in 标题 short = 单个值 判据:_in_project() ③ 另一类别判「否」 不属于本项目 ⛔ 不报错、不告警 静默 ④ 看板不列它 分工板按 cwd 归线 同工作区 ⇒ 塌成一行 判据:cwd_tail == 线 ⑤ 收尾误判「可以派棒」 --ready-next 说没人跑 其实那类正在跑 ⇒ 同一件事干两遍 修复链(本棒落地) ① 命名规范补全 协作棒/唤醒任务: [协作]-<类别>-<具体> 主会话:主控 · <类别> · <具体> 唤醒轮 A/B 已改名(PAUSED,未启停) ② 归属吃「类别集合」 goal.topics 清单 任一命中即算本项目 ⛔ 缺省回落 [short] 传 str 时与旧版逐字一致 ③ 每类各解析一条主会话 resolve_mains() 最长优先 · 显式主控优先 默认类别才回落 default _scan_mains() 一遍扫描,两处共用 ④ 投递按件的类别选路 main_for_topic() 已登记类别 ⇒ 严格取该类 无该类主会话 ⇒ 降级报告 ⛔ 绝不投给别类别 ⑤ 展示与收尾跟上 分工板行 = 任务类别 收尾排除全部主会话 自测 28/28 +8 例多类别比对 +结构断言 🔴 两排逐格对照:旧版每一步都"看着没错",错的是**②里那个把归属键写死成单值的假设** —— 这也是"静默漏管"这类问题的共同形状:**不崩溃,只是少说一句话**。 已知边界(诚实标注):类别名走**子串匹配**(主会话命名是口语式,无方括号)⇒ 类别名别取太通用的词(如"机制");源码已做"最长优先",根本解法是取具体名。

③ 泳道图 · 一条信息从「产生」到「被人看到」要过五关 —— 两次事故都栽在后两关

横轴=五道关口;纵轴=四个角色。红格=这一关静默吞掉了信息;绿格=本棒修复后重新说话。
① 数据产生 ② 读出来 ③ 判 / 筛 ④ 渲染成图 ⑤ 人眼看到 程序 · 数据源 谁把数据落到盘上 验收:只写了两条 `_说明` 说明行 台账:4 条旧线条目 技能代码 读 + 判定「有没有」 读到字典 ⇒ 非空 (里面有两条说明行) 🔴 判据写成 `if not acc` = 判「字典空不空」 ⇒ 永不成立,不报「未声明」 看板 把状态画成图 读到 6 行 分工数据 (4 类 + 2 条旧线) 🔴 只画前 4 格 = 恰好全是「0 件」的格 ⇒ 那 2 格+4 件整块不见 用户 据此判断要不要再推进 「三路全过」 「件 0 · 完成 0」 两个都读成「没事」 ③ 已改成判「有效项」 空 ⇒ `undeclared` ⛔ 不判完成 ④ 已折叠成「未归类」格 + 图外点名线名与件数 ⛔ 不隐藏、⛔ 不冒充类别 前两关都没问题:数据**确实**落盘了、代码**确实**读到了。 坏在后两关 —— 该说的那句话被一句看着很正常的判断/截断吞掉了。 ⇒ 只查「有没有报错」永远查不出来;必须拿**两处读数对账**。

④ 事故链图 · 两次「读到了却没说」各自怎么坏的 + 本该拦住的防线为何失效

红框=真正的 bug 位;黄框=本该拦住它的那道防线,以及它为什么没拦住。
事故 A · 「验收」被读成「全过」 ① 目标文件里只写了两条 `_说明`/`_更新`(说明行,不是判据) 写的人以为"留个说明",读的人以为"这就是判据表" ② 🔴 状态判据写成 `if not acc` —— 判的是「字典空不空」 字典**非空**(有两条说明行)⇒ 这个条件永不成立 ③ 于是"没有判据"这件事从头到尾没说出口 兜底分支也没触发(它也只认"字典为空") ④ 控制台打出「三路全过」 用户据此认为目标已达成 —— 而实际上一条判据都没有 ⑤ 本该拦住它的防线:单测只造了「字典为空」 ⇒ 用例覆盖不到「字典里只有说明行」这一格 已补 7 项回归用例(三态)+ 看板命令行摘要同症一并收 事故 B · 4 件已完成的活在图上「不存在」 ① 类别清单已迁成"任务类别";台账里仍是 2 条旧工作区线 这 2 条各 2 件 —— 4 件全都已完成 ② 分工数据把旧线**也当"分工位"**排进去 ⇒ 一共 6 行 排序是"类别在前",旧线正好排在第 5、6 位 ③ 🔴 图上只取前 4 格 ⇒ 恰好全是「件 0 · 完成 0」那 4 类 装着 4 件已完成活的那 2 格,被**整块切掉** ④ 图外只说一句「另有 2 个未画」——不说是哪两个 读者猜不到"被藏起来的正是唯一有成果的地方" ⑤ 本该拦住它的防线:截断提示不点名被截掉的东西 ⇒ 提示写了,但信息量为零 ⇒ 等于没说 已改:折叠成「未归类」格照画 + 图外点名线名与件数 共同形状:不崩溃,只是少说一句话 —— 所以"跑一遍没报错 / build 通过 / 测试全绿"都验不出来; 能验出它的只有一条:拿**两处独立读数对账**(台账 4 件 ↔ 图上 0 件;文件里 0 条判据 ↔ 控制台"全过")。