Files
dsh_ai1net_server/交付物/投递链路-错名修复与跟进长活-20261002.md
admin c1b5e4d966 chore(工作区): 全量入库 + 补齐 .gitignore(以工作区为准)
- 变更规模:新增 514 / 修改 62 / 重命名 155 / 删除 4(归档重组与文档轮次)
- .gitignore 修:`归档/**/db-cwd归一-备份-*/` —— 原规则写绝对层级(归档/db-cwd归一-…),
  目录搬进 归档/配置与备份/ 后**静默失效**,43 MB 的 DB 备份又变成未跟踪
- .gitignore 补:嵌套 git 内部数据(归档/内嵌git-20261008/、归档/skills-git-旧线-20261007/dotgit-原样移出/)
- .gitignore 补:运行态与部署副本(.workbuddy/collab/、.workbuddy/tools/、.workbuddy/.load-pending、.workbuddy/tmp-*)
- .gitignore 补:备份件(*.bak-*)
- 未跟踪文件从 2190 降到 890(其余为 归档/ 归档件与 .workbuddy/memory/ 知识文件,按口径入库)
2026-10-10 23:13:22 +08:00

7.1 KiB
Raw Permalink Blame History

投递链路 · 错名修复 与「跟进会话长活」口径落地(复核单)

  • 线名:多会话协作机制 · 投递链路(「投不进跟进会话」)
  • 本棒:会话名 投递链路真因修复 | 2026-10-02 10:0x–10:3x
  • 上游:接续包_投递链路真因_20261002.md(md5 fe714700f43a9ad3c9f6de6ef3c1fd6a,开工前重算一致 ✅)
  • 锁:改机制层 ⇒ 全程持全局独占锁,收口已释放(--release-exec 回执「已释放全局执行锁」)

一、结论

  1. P1① 已修 —— 投递「错名」:_deliver_str 把 follow_for_topic() 已经算准的 why 丢掉了, 把「有跟进会话、只是都不在跑」记成 no-follow-session(字面与事实相反)。 ⇒ 已改为透传 why,follow-not-live 与 no-follow-session 分开记档;喊用户文案同步分档。⛔ 只改可读性,未改行为。
  2. P1② 已落地(文档层) —— 按用户 2026-10-02 09:59 口径更正:那条「⛔ 禁止把长跑服务放进会话后台任务」 属过度泛化;真因是跟进当时跑在主会话上、与用户发消息抢占轮次,而解法本来就是把它独立成一条会话。 ⇒ 跟进独立之后,它自己挂长活载体不再影响用户 ⇒ 允许,「跟进会话长期活着」=默认形态已写入唯一权威文档。

二、P1① 改了什么(collabd.py)

项 内容
落点 ~/.workbuddy/skills/session-mechanism/scripts/collabd.py,原 _deliver_str 的 if g is None: 分支
改法 _why = _rft.get("why") ⇒ info["skipped"] = _why;加兜底(值不在两个已知档时按 _want 是否为空回退)⇒ ⛔ 不制造新档位
文案 按 why 分档;no-follow-session 再分「一条 [跟进] 都没有」与「有 N 条、但都不属这个类别」(旧文案对第二种会撒谎)
改前依赖核查 board.py 零命中(仅 board.html 注释提函数名)|goalctl.py:581-583 两值都已登记(⛔ 无未登记值风险)|selftest.py:1006 断言两串仍在源码里 ⇒ 不破

自证:selftest.py ⇒ PASS 47 / FAIL 0(新增 1 例)。 新增钉死用例:selftest.py::投递:错名修复 —— why 透传…(4 项)—— 临时替 follow_for_topic/need_user + 补网关口令过 no-token 闸,构造「有候选·都不活」与「真·无候选」两种前提。 🔴 反证(防恒真假绿):把修复临时回退成硬编码 ⇒ 该用例变红(PASS 46 / FAIL 1)⇒ 已还原并复跑回绿,TEMP-FALSIFY 残留 0。

只读现场取证(tmp/_why_probe_20261002.py,⛔ 不取锁、不投递)—— 今天这条路径仍复现:

_goal_topics()  = ['会话协作自检','机制排查与修复']
_scan_follows() = sids=6  by_topic=['会话协作自检','机制排查与修复']
_live_sids()    = 2 条
topic='会话协作自检'   -> sid=- why='follow-not-live' cand=['57f58ecf'] all=6
topic='机制排查与修复' -> sid=- why='follow-not-live' cand=['6ab1463e'] all=6
topic=''              -> sid=- why='follow-not-live' cand=['57f58ecf'] all=6

⇒ 这三个 follow-not-live 修复前都会被错记成 no-follow-session —— 与接续包 §1 的六层判读链完全吻合。


三、P1② 落地了什么(references/architecture.md,协作机制唯一权威)

用户原话(逐字):「那是因为之前跟进就是跑在主会话的,用户发消息和跟进一起处理会卡,所以才把跟进独立成一个会话专门处理」

  • ⚠️ 一处纠偏:接续包写「改文档库 02-架构设计/ 定稿」——实查 D:\github\dsh_shenxian\dsh-server-docs\02-架构设计\ 只有 3 份(README/分库与权威存储/覆盖网络),没有协作机制定稿 ⇒ 真正的权威是技能内的 references/architecture.md,改动落在这里。
# 改动 位置
① 「当前结论」节加一行(跟进会话长期活着 = 默认形态) 表内(原第④类那行之后)
② 原那条禁令收窄对象:禁区=「用户会在上面发消息的那条会话(主会话)」,⛔ 不是「会话后台任务」这个形态本身 原 :142
③ 新增 §2.3.0e:默认形态 + 载体优先级表(常驻程序 > 会话后台任务)+ 后台任务两个已知代价 + 与 --supervise 的分工表 新节
④ §4 那条禁令同步收窄(⛔ 防「同一事实两处打架」) 原 §4「第四种」

顺手纠正同行一处过时表述:「第④类=尚未落地(全库零命中)」⇒ 改为「✅ 解析层已落地([跟进]⇒role='follow')」。

新判据(一句):「谁把跟进会话带回来」= 自动化(只有它能开会话);「谁叫醒它、谁投给它」= 常驻投递。两者 ⛔ 不可互替 ⇒ 那条"带回来"的排期必须一直在册。 后台任务两个代价(已写明):① 该会话自己的 idle 钩子被静默压制(实测被僵尸任务压 6h20m、零日志)② 会话结束即被宿主回收(历次 8/12/20 分钟)。


四、⛔ 未处置(下一棒 / 待拍板)

# 项 状态
P2③ tmp/supervise-inbox/ 下 goal.json/queue.json 等被批量清空的来源(_collabd.log 零清理记录 ⇒ 外部动作)⇒ 建议给删除动作加留痕 ⛔ 未做
P2④ S6 排期 prompt 仍写「每条都有周期性自动化作时钟」=旧口径(今已改常驻承担) ⛔ 未做
P2⑤ 会话堆积:automations 只新建不复用 ⇒ 每轮堆一条(用户 10-02 已抱怨);曾列两方向(取消独立跟进角色/允许协作程序直插 automations 行=双红线) 🔴 待用户拍板,⛔ 不擅改
新发现 references/rules.md:44、collab-detail.md:788、pitfalls.md P1(613) 仍带同款过度泛化的"别用会话后台任务"表述(与本次修订后口径不一致)⇒ 属教训记录,按规矩应加状态块指向 §2.3.0e、⛔ 不改正文 ⛔ 留给下一棒
记忆 .workbuddy/memory/MEMORY.md 7,988 字符(上限 7,650)⇒ 本棒只做净减 5(原 7,993),🔴 仍超上限,需后续腾挪 ⚠️ 已知

五、收尾自判 ⇒ 已派下一棒

tmp/supervise-inbox/advance.md:「可派 S5」+「S7 在等 S5」;任务图 S5=todo、 S6/S8/S9=done、S7 唯一阻塞项就是 S5 ⇒ 收尾自判判定有缺口,已写一行 automations:

  • 下一棒:[协作]-[机制排查与修复]-S5 修主会话可响应
  • id:3872e203-18b9-4a28-8ff8-7b488345c997(只来自工具返回值)
  • 排期:一次性 · 收口 + 4 分钟(2026-10-02T10:31)|工作区 E:/ProgramData/AIProject/ai1net-dsh-server
  • 节点:S5「修:主会话可响应」(验收 V2;现状 --tick 恒判 target-deaf)⇒ 完成后派 S7(全量验收 V1–V7)