用户 10-09 两条令:
①「如果 工作区 项目机制 对应的会话异常 导致未解锁的情况下,可以授权 检查会话自解除孤儿锁」
②「其他类型 阻碍 遇到阻碍修改目标状态 暂停机制 让用户决策,不是有这个规则吗」
起因(contentm_agent 实测):一把域锁的持有者会话被 terminated、锁遗留未释放 ⇒ 目标第 4 步 blocked;
R9 一律禁删锁 ⇒ 检查会话连开 11 棒(约 5 小时)每棒都撞同一面墙、零派活,每 30 分钟一棒。
拆开看是三条腿互相锁死:闸③「队列非空」对一条 blocked 恒真;闸① 2026-10-04 收窄时把
sessions-ended 整条腿摘了出去(置了「阻碍」也照样建);结果检查 prompt 又明写「你没有改目标状态的出口」
⇒ 看得见的没权、有权的(目标检查要队列为空)看不见。
改动
- 新增 scripts/lock/orphan-lock.py:孤儿锁「判定 + 解除」的唯一执行面。
判据查宿主库 sessions.status(只读 SQL):working 一律不动;terminated/error/archived 可解除;
completed 须静默 >=30 分钟;查不到 sid / 库读不到一律不动(fail-closed)。
- collabd.py
· 结果检查 prompt 开「一个」状态出口:--set-life 阻碍 --by "<会话名>" --check-why "<一句现状>"
("为什么"的旗标是 --check-why,不是 --why —— 后者是 --retire 的,写错会被静默忽略);
同时把「写明阻碍」的两个出口钉死:台账 --report ... --state blocked --reason +
NEED-USER.md 里明确喊「需用户介入」。
· 闸① 改两档:queue-empty 原样(非「进行中」不建);sessions-ended「只拦『阻碍』」,
「已完成」仍放行(不把 2026-10-04 修好的病搬回来)。docstring 五道闸 -> 六道闸。
· 两条检查 prompt 都加了孤儿锁判定钩子(判「持有者已退出」才可自解除;判「活着」一律不动)。
- R9 条文加「唯一例外」:工作区 CODEBUDDY.md §3(定义处)、references/rules.md 新增 §10、SKILL.md,
以及技能包与文档库两份 handoff-guard.sh 的「抢域锁失败」提示。
- selftest.py:新增两个用例(孤儿锁 16 项,含「working 不许动」的变异对照;阻碍档 6 项,
含「已完成仍要建」的变异对照),并把写在两处的同一判据收成一处(改一处漏一处的实测教训)。
全套 PASS 108 / FAIL 0。
- references/manifest.md:按「改完包必跑」重算(77 份文件,语法失败 0)。
不在本仓(各自仓内提交):工作区 CODEBUDDY.md、文档库 CODEBUDDY.md 与 07-scripts/handoff-guard.sh。
18 KiB
18 KiB
manifest · 包内文件清单
生成方式:逐文件
compile()/json.loads+ md5 | 最近一次全量重算:2026-10-09 07:22 (清掉 product-planning 下 5 个外部会话遗留的 .bak(包体卫生) ⚠️ 2026-10-05 局部增量:references/pitfalls.md(P0-77 拆条 + P0-73/P0-77 压缩)与scripts/goalctl.py(--switch-goal确认闸 + 旧目标归档)两行的 md5/大小已按当天实测值更新;其余行仍是 10-04 基线。 ⛔ 本表不含install.log(运行日志)与references/manifest.md(自引用,写完即失真)。 ⚠️ provenance 列里的skills/multi-session-collab/…、skills/workbuddy-session-forensics/…已是历史路径 —— 那两个目录 2026-10-01 已移到<工作区>/归档/技能-退役-20261001/(⛔ 不在技能根了)。
文件总数:77 | 语法 / 结构检查失败:0
✅ 已完成 · 2026-10-05 「目标唯一性 + 换目标需确认」(用户口径落地)
用户原话逐字:「一个工作区 同时只能执行一个目标,如果要切换目标,需要用户确认,然后切换和关注检查切换后的目标」
- 改前取证(三条,全实测):① 载体
goal.json本就是单文件 ⇒ 天然满足"同时一个";② 归档零实现 (goalctl.py/collabd.py全文搜goals/零命中 ⇒ 那份归档件是手工造的);③ 确认闸零实现 (declare直接覆盖title,无任何准入判断)。 - 修法(两道闸,均在
goalctl.py::declare()):① 标题变了 ⇒ 默认拒绝(rc=3、零写入), 必须带专用开关--switch-goal(⛔ 不等于--yes:前者=「用户已同意换目标」,后者只是「干跑转真写」, 混用 = 伪造用户授权);② 确认后旧目标整份归档到goals/<旧标题≤40字>__<时间>.json+ 新目标留_前身目标。 - 验收(7 项全过):拒绝 rc=3 /同目标细化 rc=0 不被拦 /归档 32 字段 / 6186 B 且与旧目标同源 / 变异对照(闸短路 ⇒ rc=0,还原 ⇒ rc=3,证判据非恒绿)/真区未污染 /副本 md5 全同。
- ⚠️ 加闸带出的连带缺陷(已一并修):
declare没给--title时回落成工作区名 ⇒ 把"纯细化"误判成 "换目标" ⇒ 修成「没给 ⇒ 保持现有标题」(与--topics/--kpi同规矩)。 - 📂 全文 ⇒
references/pitfalls.mdP0-78;lifecycle那条独立铁律 ⇒ P0-79(从 P0-77 拆出)。
📌 同批完成:pitfalls.md 沉淀纪律转绿(改前既有红,顺手修掉)
- 判据=「单条 > 6 KB 且证据密度 < 4.0 ⇒ 判流水账」。改前基线读数:
P0-737590 B/2.8。 - 修法(两条腿,⛔ 不靠删内容):① 拆条 —— P0-77 里"前缀改造"与"
lifecycle空转"是两个主题, 拆出 P0-79(P0-77 7765→5107 B/P0-79 2141 B);② 删冗余展开(P0-73 验收段的重复读数)7795→约 5.9 KB。 - 结果:沉淀纪律 ✓ 转绿(5 项);自测
PASS 94/FAIL 3→PASS 95/FAIL 2(另 1 条报告型不计入)。 - ⚠️ ⛔ 别为压体量删判据要点 —— 判据自带关键词对账(
MUST表),删了就换一种方式报红。❗原编号 77 → 79,不许再当 77 引用
✅ 已完成 · 2026-10-05 三代术语收敛(本节替代原「待办」)
- 已执行:包内 + 两个工作区副本三方同步,md5 一致(
collabd.py/goalctl.py/board.py/board_ext.py/selftest.py/collabctl.py/guard.py/init_workspace.py/session-rules-check.py/board.html全部 OK)。selftest.py基线 PASS 97 / FAIL 0(报告型 1 条不计入);改名的 5 条@case均能按新名字-k找到。 - ⛔ 三类不动,是判据不是遗漏(下一次改名前照抄):
① 「」引述内容逐字不动(含跨行引述块)—— 引用用户口径只写原话;
② 历史段整段不动 ——
SKILL.md19–27 行代际表、含旧称/旧词/一代/二代/第三代的行、<hN> 历史…段落 (要讲清三代分别叫什么,就必须留着旧名); ③.py里目标检查一律不动 —— 它是检查会话类别名(_CHECK_TAGS/_CHECK_TOPICS、[检查]-[结果检查/目标检查]),并散在字面断言里(CHECK_KINDS["queue-empty"][1] == "目标检查"、rows.append(...)、【目标检查】prompt 头)⇒ 改了直接断判据。 - ⚠️ 一处同改对:
board.py::_ROLE_LABEL["worker"]与board.html的role==='…'是同一处判据的两侧。 - ⚠️ 本条暴露的存量缺陷(已一并修):
selftest.py的期望串原写才建立一轮任务会话,而SKILL.md引述里逐字是才建立一轮执行会话⇒ 该子项改前就是红的(被基线里的 97/0 掩盖)。 - 工具:
tmp/term-apply-v3-20261005.py(dry-run/--apply,写盘前自动备份)+tmp/term-sync-20261005.py。
2026-10-04 新增文件(⛔ 由 manifest 重算登记)
references/01-文档索引.md— 3604 B |md5825999a411e2a4f6b740063f81c01b03scripts/judge_audit.py— 13562 B |md58f14a973fa5709a3b9a60b065dc22d7dscripts/workspace_mirror.py— 17263 B |md560f104b37df3133785abb13f686eea4fassets/design-tokens.css— 6364 B |md50668feb3a4729f1022e579ac0c5d2569
最近改动(⛔ 只记「什么时候改了什么」,不写流水账)
- 2026-10-02 07:0x · 开工第 0 步改名:会话「规划」→ 会话「规则机制」(本轮):
① 用户纠正原话:「就应该是检查清楚 所有会话规则机制 是否配置完整且生效, 不是规划 是 规则」
⇒ 首版体检脚本只查排期那一面,当天实测出的三类失效(钩子注入指向已退役技能名 / 常驻快照写进幽灵目录 /
每轮注入的记忆指针悬空)一条都没覆盖 ⇒ 名字还叫「规划」=第二次「在册 ≠ 生效」。
② 收敛成一个入口:新增
scripts/session-rules-check.py(查 三类十二项:A 钩子在册·路径存在· 注入技能名存在·闸门日志新鲜 | B 每轮注入记忆的技能指针·常驻快照不比权威旧 | C 周期钟·模型可用性·cwds同形·投递心跳·活会话·once从未运行的死排期);旧scripts/session-plan-check.py退役 到<WS>/归档/技能包-旧件-20261002/,能力不回退。 ③ 状态标记改名:session-plan.json→session-rules.json(旧的属过期件,⛔ 别拿来对照)。 ④ 判据收紧:cwds近失配原写成「同父目录 + 字面不同」⇒ 在AIProject/这种多业务线平级目录下 把别的线报成失配(实跑当场 2 条假红)⇒ 改为「同父目录 + 名字去-/_后仍相同」/「同名不同父目录」。 ⑤ 判据自验:⑨⑫ 抽成纯函数 + 合成样本夹具(<WS>/tmp/rules-check-mutate.py)—— 原版 10/0 绿、 四个变异体逐一按预期报红。⚠️ 夹具自己先红两次(期望值写死:漏算样本 + 有序列表比中文名)。 - 2026-10-01 18:5x · 外置根贯通 + 两处真缺陷(本轮):
①
roots.env引导块从 9 份扩到 16 份(补齐 7 个非钩子脚本:board/board_ext/collabd/deliver-gateway-token/goalctl/selftest/stop-collab); ② 盘符字面量清零:配置目录兜底改~/.workbuddy,工作区兜底改DSH_WS_ROOT/cwd, 覆盖网日志 glob 改DSH_OVERLAY_LOG_GLOB(原为死路径 —— 本机E:/dsh-worker-dev不存在); ③ 7 份加输出编码兜底;④roots.env增写CODEBUDDY_CONFIG_DIR; ⑤ 🔴 修「钩子把技能包当工作区」:wb-result-hook.py的_WS_ROOT原按3×dirname(__file__)推, 包内这份推出来=技能包自己 ⇒ 包里长出tmp/supervise-inbox/;改为复用resolve_ws(); ⑥ 🔴 修「重定向 + GBK ⇒ print 抛异常 ⇒ 顶层记 fatal、整轮失败」(本机实测 4 次; 这正是常驻跑不起来的拦路石 —— 常驻必须重定向 stdout); ⑦install.py工作区模板路径纠错(原指scripts/collab/,实际在scripts/); ⑧collabd.pydocstring + 两处活注释改常驻定案(上一轮漏传导); ⑨lock/preflight-lock.sh+hooks/lock-guard-hook.py的盘符字面量清零; ⑩ 新增install.py --manifest(见下条); ⑪ 🔴scripts/selftest.py去掉最后一处项目绝对路径:t_tick_wired原先写死<某工作区>/.workbuddy/tools/wb-result-hook.py⇒ 两处都不对:既违反「技能里只用相对路径」, 又因宿主接线已改指包内那份而恒走"文件不在,跳过" ⇒ 看着绿、其实什么都没验(静默假绿)。 现改按包内相对路径取hooks/wb-result-hook.py,该用例从"跳过"变真检(4 项实跑通过)。 - 2026-10-01 19:0x ·
install.py --manifest:把「重算本表」固化成子命令 (包一改表就过期 ⇒ 以前每轮临时手搓脚本、跑完即删,已因此误判两次)。 只重写表 + 计数行 + 重算时间,⛔ 不碰上方散文;行尾随原文件(本表是 CRLF,写成 LF 会造成一次无声全文件 diff)。 - 🔴 两份同源脚本「有意不一致」(⛔ 别当 bug 去修平):
preflight-lock.sh与lock-guard-hook.py在 技能包与文档库07-scripts/各有一份。包内那份住在技能包里、推不出文档库根 ⇒ 只能走roots.env+(lock-guard-hook.py的)末位字面量兜底;库内那份住在<文档库>/07-scripts/⇒ 按__file__往上两级即文档库根。⇒ 包内有引导块、库内没有,是位置决定的,不是漏改。 - 2026-10-01 18:2x · 瘦身(本轮):
references/collab-detail.md删去原件 YAML 变更流水(约 9.4 KB)+ 加读法索引+ 压缩 §12;references/{manifest,taskgraph,pitfalls}.md去掉过期条目与旧抬头;包内__pycache__/、hooks/bak-*/、tmp/已清。 ⛔ 本轮无机制代码改动。 - 2026-10-01 16:5x:
scripts/hooks/session-log-guard.py新增「硬档就地回收」—— 到 8 MiB 先试一次把本会话logs/<日期>/sdk/conversations/<sid>.log改名(后缀.recycled-<时间戳>,⛔ 不删、⛔ 不以.log结尾故与清扫器不重叠) ⇒ 宿主立刻重建并继续写 ⇒ 会话不必再因撞 10 MiB 而停手;失败则逐字退回原「停手+建接续」口径。 开关DSH_SLG_NO_RECYCLE=1(只关回收、保留叫停)。⚠️ 文档库原件07-scripts/session-log-guard.py已同语义同步。 - 2026-10-01 16:0x:原
multi-session-collab的SKILL.md全文并入references/collab-detail.md(治 8 处悬空引用:§0.05§0.5.2§0.5.4§0.5.5§1.3§1.4a§3§6);清掉 9 处旧技能路径/名的活文本; 两个原技能目录移入<工作区>/归档/技能-退役-20261001/。
逐文件清单
| 包内路径 | 字节 | md5 | 语法检查 |
|---|---|---|---|
SKILL.md |
115645 | fbf34519e32411b5491b94e0e515f667 |
— |
assets/board-launch.py.tpl |
4355 | 7e9dfe1c4845f20dbb89f599d80e167b |
— |
assets/board-render-probe.js |
14398 | a21bd1905b34537436ce778c6bfbc288 |
— |
assets/board.html |
151811 | c597cd7f21543542e9cdbe486c5ccd79 |
— |
assets/design-tokens.css |
6364 | 0668feb3a4729f1022e579ac0c5d2569 |
— |
install.py |
37297 | 55603c2e739e7b531998f5563f15f789 |
ok |
references/00-动手前必过.md |
7181 | 33bc86e442ccd4fcbb930c79c4ad0641 |
— |
references/01-文档索引.md |
4518 | f401dd36b2d30cbc89ac91f9d633b72c |
— |
references/02-功能优先协作协议.md |
35529 | 9122a6715bde02ab549805d69866d1cf |
— |
references/03-回复排版-核心块.md |
7766 | 01277367d560383669ad493538e45587 |
— |
references/04-决策方法论.md |
35566 | eb5bdf8f100beb8eacb9f20b042df86c |
— |
references/99-速查清单.md |
9832 | 5c97728af7cb67e9be9a3e491bdc5fd9 |
— |
references/architecture.md |
119631 | 5fc3b103bb846b6dd903df0b7e736d22 |
— |
references/collab-detail.md |
98805 | 24bd0cfd10da66831f5d12f1716b7ebc |
— |
references/collab.md |
16560 | 97aa751f86d9b4ba8db401b5ec592695 |
— |
references/deploy.md |
16754 | 4e382f7876f31754ec9629925340c2d8 |
— |
references/dsh-decision-method/素材库-A-AI推理.md |
19914 | 89fc178e671c989d9079c1def20591da |
— |
references/dsh-decision-method/素材库-U-用户决策.md |
24597 | 94c9e860148f4265f1e21e5322346f94 |
— |
references/dsh-decision-method/素材库-反例-X.md |
5712 | 8bce93e8c1ce71d17e6d33aa9a2d7724 |
— |
references/forensics.md |
6067 | 1fb6deca9bb05bebe950d4f4e3adf043 |
— |
references/humanizer-en/LICENSE |
1092 | a8440fdde2a535efdd44813bce97df57 |
— |
references/humanizer-en/README.md |
4204 | f3f41dc19ef27b7591422a43140d17fe |
— |
references/humanizer-en/SKILL.md |
39490 | 3fd8d0d4175d1325cc942ce65733719d |
— |
references/humanizer-en/references/always-on-templates.md |
3066 | 1bbcc7aa145f5a8189f35af7f9477769 |
— |
references/humanizer-en/references/patterns.md |
26186 | 830c68f9e07fb6bbee297b7a9004d994 |
— |
references/humanizer-en/references/patterns.zh.md |
14867 | 2c661fde3d84751edc8053eedd36f930 |
— |
references/karpathy-output-ladder/SKILL.md |
5252 | f1e3b07003bbc544db52d32c122e6faf |
— |
references/karpathy-output-ladder/assets/html-template/index.html |
5883 | b95c39d2cd41d8c0f21d4007e7ef3cef |
— |
references/karpathy-output-ladder/references/ladder-workflow.md |
2684 | d49840707d19302d8f61f4e1d7f4ea2e |
— |
references/karpathy-output-ladder/references/ste100.md |
3022 | fdbe3271c21a3c17f326d1e71de33b0d |
— |
references/pitfalls.md |
311254 | d321a71e38dd246b8014b4c9100b12c7 |
— |
references/rules.md |
11695 | 45c197444b94773034af2509443a4cb5 |
— |
references/supervise-persistence.md |
34799 | 6f2a0b10f248ceaad3802188f97ecb74 |
— |
references/taskgraph.md |
3521 | be6c6540be86475bb3430688c2987afc |
— |
references/作业规矩/00-作业总规矩(原 agent-operating-rules).md |
70243 | 80fc5471015b237ee7aacd6976eda6fe |
— |
references/作业规矩/02-工作区纪律.md |
21351 | 1a679fdeb9cca0883a47f619d1aec85d |
— |
references/作业规矩/03-多棒接力编排.md |
13185 | 631b4b7455938b0c3a3a4f6f94d97eed |
— |
references/作业规矩/04-去AI味与说话方式.md |
14059 | 5100e1a26c3477541eafe1c7797d3b3a |
— |
roots.env |
624 | ec38f15f9a4101d69c815aa2cdd7b477 |
— |
scripts/apply-reply-rules.py |
7172 | 551b0ee5bf6c7a9f6b64c1b1d53bd343 |
ok |
scripts/board-launch.py |
2794 | 998a66b9d335ab1863b5b871a527bf4f |
ok |
scripts/board.py |
146111 | d90395d1f1a7c3f94419a33cdf444384 |
ok |
scripts/board_ext.py |
45655 | 2319fb9d2d21bf961e03a42da9a1ad4b |
ok |
scripts/collabctl.py |
34007 | d7769687e92bb878b22cad68e687fa15 |
ok |
scripts/collabd.config.example.json |
1158 | 6655c15c411a84e3ca12fd136dbe2c60 |
ok |
scripts/collabd.py |
442528 | 5906584e34210b37211a414d8a801c0c |
ok |
scripts/deliver-gateway-token.py |
5685 | cbba9648d404ecd2683061e19dbdb24a |
ok |
scripts/deploy_code.py |
5325 | a79cf5e5ffb3e8c60a31b4d0d8845f40 |
ok |
scripts/forensics/proc-parent.py |
2347 | 8cdfff2dbb88303298752c3777da7b20 |
ok |
scripts/goalctl.py |
53820 | c4eb6c020ac102ca3ae7f0463c5d8051 |
ok |
scripts/guard.py |
13653 | 43f4e279896090c6c6c3fcbdb4fa95d6 |
ok |
scripts/hooks/_env.py |
17743 | e08f33d97adb640dc1657c21ae59a2ad |
ok |
scripts/hooks/bash-output-guard.py |
17741 | 3f2fdfa17f66f7fcac42e06853433a26 |
ok |
scripts/hooks/decision-rules-hook.py |
12399 | c521237bada7487aecf5e54ad4d19ace |
ok |
scripts/hooks/lock-guard-hook.py |
20363 | 641457de0297ee7a812ccde57f67dc2b |
ok |
scripts/hooks/prompt-guards.py |
9332 | 0aa1d1fdd2bf5a40cda2e60d7a785534 |
ok |
scripts/hooks/reply-style-guard.py |
13200 | e044f5d3e52ae94775dfba2090e7ae8e |
ok |
scripts/hooks/session-log-guard.py |
24636 | 4dd13b24d541d1afc7b4874dba6bb1eb |
ok |
scripts/hooks/skill-load-guard.py |
30397 | 797cf48886233e452083f7855a84ac7f |
ok |
scripts/hooks/stop-dialog-guard.py |
51240 | 3e0791e42f41c37438601a9d2314dd8e |
ok |
scripts/hooks/supervise-ensure-hook.py |
14308 | dc6f62584a8384baba0a1f2460828013 |
ok |
scripts/hooks/wb-result-hook.py |
37199 | 2d4f694acd031222bf03b98a859b6e90 |
ok |
scripts/init_workspace.py |
24042 | dda53acd24bcc66d509bbdab3ebc0488 |
ok |
scripts/judge_audit.py |
13562 | 8f14a973fa5709a3b9a60b065dc22d7d |
ok |
scripts/keepalive.py |
12265 | b84c753917e0a34cf40800bda953e7a4 |
ok |
scripts/lock/handoff-guard.sh |
35092 | 43f9b2616ea72c422d692653efdd6f7e |
— |
scripts/lock/handoff-status.py |
3923 | 3edb20f9c4021ebe2323478860bf8f6f |
ok |
scripts/lock/op-lock.sh |
4690 | 1a31eda3642e23693a65e1519860c744 |
— |
scripts/lock/orphan-lock.py |
10179 | 3519ac8e0ae7fa3f15190601475e3850 |
ok |
scripts/lock/preflight-lock.sh |
8673 | e985ec1cb853fae4c351cd03b171355d |
— |
scripts/mut_run.py |
13323 | 3bffc12e1e57d5efc743bac55e584b62 |
ok |
scripts/selftest.py |
504129 | 6dc2fb0fc945e8c4822ac3c2029170a0 |
ok |
scripts/session-rules-check.py |
44412 | b2b468992d80421106316eaf451e2477 |
ok |
scripts/stop-collab.py |
10462 | d8043bedd23b52b6642aaf7ec8b8c980 |
ok |
scripts/supervise-launch.py |
2503 | f416a2f197e5524a8859c1d227ba1d05 |
ok |
scripts/wake-session.py |
11011 | 32c6038b541249730f322f933ee287c1 |
ok |
scripts/workspace_mirror.py |
17263 | 60f104b37df3133785abb13f686eea4f |
ok |