- 变更规模:新增 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/ 知识文件,按口径入库)
44 KiB
DSH 平台项目 — 项目指令(每次会话自动加载)
🔴 当前结论(先读 · 最后更新 2026-09-30 05:56) · 文档记录规则(用户 09-30 定):最新结论放最前 · 历史倒序 · 只留最近 5 轮(教训/用户定案原话/实测读数三类豁免)· 超出的归档(⛔ 不删)⇒ 规范
session-mechanism(内references/作业规矩/00-作业总规矩…md)§1.7a;归档落$WS/归档/,按类别分(索引见$WS/归档/README-索引.md)。 · 协作机制:唯一权威 ⇒~/.workbuddy/skills/session-mechanism/references/architecture.md(其头部有「当前结论」节);⛔交付物/里 4 份"多会话协同"平行件 2026-09-30 已退役,⛔ 不作用判据。 · 取现状:⛔ 不拿旧文档/旧实测单当现状 —— 先按 mtime 取最新那份(同上技能 §1.7b);⛔ 也不拿"任务图节点 done"当"判据通过"。
🔧 PY=
E:/ProgramData/.workbuddy/binaries/python/versions/3.13.12/python.exe| WS=E:/ProgramData/AIProject/ai1net-dsh-server| DOC=D:\github\dsh_shenxian\dsh-server-docs| 脚本目录 =$DOC\07-scripts。 📎 【详】=$WS/docs/规则与载体/规则详解_红线与实证_20260924.md(各条解释段 / 历史 / 实证 / 命令全文,章节 §A–§H);⛔ 冲突以本文件为准。 ⚠️ 章节顺序按注入优先级排(🔴 DSH 侧按maxBytes预算注入,默认 65,536 B,不是「只取前 8,000 字符」;超限时先丢整份宽泛文件、再截断最具体文件)⇒ 实体章排前 · 指针章排末尾(清单见下)。
⛔ 动作前必须执行的三条:① 先跑状态(1 次调用顶十几轮探索)"$PY" "$WS/state.py"(--online 加远端基线)—— 跑完之前不许 Glob/Grep 全库摸底|② 改文件之前先"抢"锁(不是"检查")bash $DOC\07-scripts/handoff-guard.sh --claim-exec "<会话名>" —— 抢到之前不要动文件,抢不到 = 停手(判据 ⇒ §6)|③ 推送前 bash scripts/docs-sync-check.sh(对账)+ PUSH=1 bash "$DOC\07-scripts/handoff-guard.sh"(幽灵文件硬判定)。
⛔ 分层判定标准
不看会致「违规 / 事故」⇒ 必须实体;只是"更慢更绕" ⇒ 可只给指针。必须实体:头部 · 本文 · §1 · §3(红线全表)· §4 · §5 · §6。可只给指针(2026-09-24 用户拍板:§7 §8 转引用):§2 · §7 · §8 · §9(卫生 + 目录规范合并章)—— 背景知识 / 环境命令 / 事故详解 / 档案模板 / 历史方案。 加载序:DSH 全局
AGENTS.md($DSH_HOME/AGENTS.md)→ 本文件 →.codebuddy/rules/*.md→ 文档库。🔴 改本文件下一请求即生效(⛔ 不必重启;只有 hook / profile / preset 才需完全重启)。两层冲突的裁决 ⇒ 全局AGENTS.md§11(含两条例外:DSH 宿主机制判据不可被本层覆盖;两套锁各管各的域)。
1. 提问判据(唯一一条)
只问「超过现有判断方法边界」的问题。(用户原话)
-
边界内 ⇒ 自决,不要问:技术选型 / 实现路径 / 命名与数据结构 / 调参 / 部署与同步 / 排查方法 / 版本依赖 / 兼容降级 / 方案取舍 / 文档技术内容。「部署上线」属此项 ⇒ 做完即上线,不要问;生产变更直接做、只需动手前一句话说明(判据 ⇒ R8;详 A1/A2)。
-
边界外 ⇒ 必须问:① 业务目标与优先级 ② 花钱与资源承诺 ③ 对外承诺 ④ 需用户提供的凭据或审批 ⑤ 无客观优劣的偏好 ⑥ 影响面超出本平台 ⑦ 红线门禁 ⑧ 判不准。
-
🔴 讨论技术不谈法规:⛔ 不引条文当论据 / 不提合规风险 / 不写进方案与验收判据;只在你问起、或对象就是"对外承诺 / 资质 / 合同"时才谈(详 A3)。
-
判据:有没有客观可判的优劣?有 ⇒ 自决,没有 ⇒ 问。上抛门槛 = 存在真取舍:候选只有优点或只有缺点 ⇒ 自己拍掉;各有优劣才上抛,且逐项写优点 + 缺点(详 A4)。
-
⛔ 不许捆包:要问红线只问那一句;技术方案自己定好、当已定项陈述。
-
⛔ 禁用征询句收尾(「要我…吗 / 请确认 / 你看怎么办」)⇒ 按三问重判(真门禁?已定的事又问?真取舍?),没命中就删掉、自己做完(详 A5)。
-
🔴 上抛 / 待拍板内容必须自包含(发送前就按规范写):⛔ 作用域 = 一切「要用户拿主意」的输出(提问 · 末尾待拍板清单 · 候选 · 表格盘点 —— 换形态不豁免)。四要素:① 问题 —— 一句话说清要决定什么(⛔ 不用指代)② 说明 —— 为什么要你定("影响谁 / 断多久 / 花多少钱")③ 每候选写优点 + 缺点,末行给倾向 ④ 一轮一问;🔴🔴 决定对象必须点名(要撤哪份文件 / 要改哪个技能 / 推哪个仓 / 动哪台机器 —— 少了它用户就没法回答);⛔ 只把只服务实现的内部细节(函数名 / 变量名 / 行号 / sha / 表名字段名 / 内部编号「R5 红线」这类)下沉「技术附录」。🔑 一句判据:少了这个标识,用户还能不能决定 —— 不能 ⇒ 必须写进正文,能 ⇒ 必须删(2026-10-09 实测:把要撤的文件抽象成「那两份」⇒ 用户回「不说具体 我怎么知道」⇒ 该条作废)(详 A6)。 📐 回复排版(🔴 2026-10-01 用户定稿 · 本条覆盖旧版;六轮迭代后定下,照抄即可,⛔ 别自己另发明)
-
骨架:
# 大类(已完成 / 待处理任务)分节 →## 任务名分事 → 每件事写两段:当前状态 + 待处理事项。 🔴 大类标题必须比任务名大一号(2026-10-01 用户加)—— 大类别用一级标题#、字号最大;任务名用二级标题##;⛔ 不许大类与任务名同号(同为##⇒ 层级压平、看不出哪几件事属于同一个大类)。 -
当前状态:每条一个圆点(
-),用一句陈述句说重点;复杂情况、依据、细节放句末圆括号里。 -
待处理事项:用序号(
1、2、3、,不是1.);每条写完整句子,可以不止一句。 -
附件:本板块若有文件要展示或引用,写在该板块最末一行(
附件:<路径>)。 -
大类顺序:已完成的大类放最前,
待处理任务放最后。 -
三禁:⛔ 表格(=省略讲理,人要来回跳读)|⛔ 长散文(不是写小说,整篇不分段=没版式)|⛔ 碎标签堆叠(
-碎片 + 加粗小标题 +⇒串句)。 -
🔴 强遵循(2026-10-02 · 机制保障见
session-mechanism技能(内references/作业规矩/)):本节=每轮硬约束,命中三禁任一条 ⇒ 该条回复作废重写。机器可读副本由技能注入在下方标记块;每轮注入由钩子reply-style-guard.py承担;本环境侧另有逐字探针(resident-rules.py --check)。 -
🔴 用户原话(五条 · 每次纠正改一版,合起来才是完整口径): ①「为什么回复的内容 那么人机 把我都看抑郁了,禁止用表格,全部用文字排版」 ②「不是只用句子就行了 要排版 不是让你写小说」 ③「排版不清晰,要有大标题小标题 小标题 多项要段落排版」+「段落还有序号」 ④「当前状态:内容如果有多条情况 按无序段落排版」+「圆点符号 无序段落每个段落前要加」+「当前状态 每个段落用 一句陈述句说重点,有复杂情况可以放在末尾()中」 ⑤「如果有对应附件需要展示或引用 放在对应板块 最后」 ⑥「已完成 待处理任务 这些大类别 用更大字体标题」(2026-10-01 12:12)
-
⚠️ 本条只管「给人读的回复」;注释/日志/解析用字段不受限(给程序读的随便)。
-
🎯 要解决问题,不将就妥协(降级 / 延期 / 静默兜底都不算解决);🟢 只做正向迭代(= R11)(详 A8)。
-
🔀 冲突裁决序:① R8 → ② §1 边界内自决清单 → ③ 其余红线(R5 / R7 / R9 / R10 永远硬约束);⛔ 冲突 ≠ 门禁。上抛前必答三问:对象是我们自己的资源吗?查证过关键不确定点吗?第一名明显更优吗?任一"是" ⇒ 自决(详 A9)。
1.5 项目开发 · 任务执行关键步骤(🔴 每次会话必须遵循 · 跳步=违规)
🔴 每个会话、每个任务都按本顺序走;⛔ 不准跳步、⛔ 不准"边做边想"。 📖 全文(逐阶段动作、命令、判据)⇒
$WS/交付物/项目开发-任务执行关键步骤-20260929.md(本节省 = 实体精要,冲突以本文为准)
A 开工三件(🔴 首选=一行入口 · 下列原三步=入口内部实现,⛔ 不必手敲)
🔴 首选(把原三步合进 1 次调用,2026-10-01 起):
"$PY" "$WS/scripts/dsh.py" open "<会话名>" <目标文件...>
⇒ 入口内部依次跑:① state.py ② preflight-lock.sh ③ handoff-guard.sh --claim-exec … --domains ai1net-dsh-server/
⇒ ⚠️ 必须带目标文件(不带 ⇒ 入口跳过第②步 preflight);入口 rc≠0 ⇒ 停手 + 报告(R9)
🔴 两条例外(入口做不到 ⇒ 手动):
· 目标文件命中 【E】机制层(CODEBUDDY.md / 钩子 / 技能文件等全平台共用的)⇒ 必须独占:bash $DOC\07-scripts/handoff-guard.sh --claim-exec "<会话名>"(⛔ 不带 --domains);抢不到 ⇒ 停手
· 工作域不是 ai1net-dsh-server/ ⇒ 手敲 --domains <你的域>/
(以下 = 入口内部实现,逐字保留供排查对照;语义未变)
- 跑状态:
"$PY" "$WS/state.py"(--online加远端基线)—— 🔴 跑完之前不许 Glob/Grep 全库摸底(1 次调用顶十几轮探索) - 判可锁定范围:
bash $DOC\07-scripts/preflight-lock.sh "<会话名>" <目标文件...>—— 【D】未归类或【E】机制层非空 ⇒ rc=1 拒开工 - 抢锁(是"抢"不是"看"):
bash $DOC\07-scripts/handoff-guard.sh --claim-exec "<会话名>" [--domains <域>]—— ⛔ 不带--domains= 退化为独占(机制层必走)|抢不到 ⇒ 停手 + 报告(R9) 🔴 默认一律带--domains <本工作区域>/(如ai1net-dsh-server/);⛔ 别图省事省略 —— 省略 ⇒ 全局独占 ⇒ 别人连域锁都抢不了(2026-09-29 实测:482f3cd4/9368300d两次中途停手,皆因我持了全局独占锁)。 ⇒ 只有真正"全平台共用"的改动(config/crypto/isolation/ 锁与钩子本身)才用独占。
B 六阶段(先 → 后 · 每个阶段只列"卡门禁"的那几步)
| 阶段 | 关键动作 |
|---|---|
| 0 需求识别 | ① 开工前置检查(先看可用技能列表 ⇒ 有对应立刻 Skill(...);再看本机/项目已有资产;装任何东西前自问「已有的能否满足」)② 环境盘点 ③ 分清「方案请求」vs「直接执行」 ④ 关键分叉用选项表 |
| 1 调研 | ① 🔴 报障第一步:先拿真实失败请求(journalctl grep 4xx/5xx,别猜)② 只读官方包定位机制(⛔ 不写官方主程序)③ 实测 > 推断 ④ 双端 md5 对账 |
| 2 规划 | ① 方案对比表(≥2 项 + 利弊 + 建议)② 🔴 红线 R1–R11 逐条自查 ③ 影响评估(命中 R5 另附「权限影响评估」)④ 04-调整方案/ 原子占号建档 |
| 3 开发 | ① 小步:读一条 → 改一条 → 验一条 ② 覆盖前先备份 bak-<功能>-<日期>/ ③ npm run build(零报错)→ systemctl restart dshs ④ 本机直连验证 |
| 4 验证 | ① 用例必须同时覆盖「有请求体」与「无请求体」(只测 POST 会漏掉 GET/SSE)② 浏览器只用 browser-harness,第一步 list_tabs()(不是你开的浏览器 ⇒ 立刻停手)③ 🔴 交付前必问「出厂了吗」 |
| 5 归档清理 | ① 交付门禁(见 C)② 四件套(顺序固定):docs-audit → docs-index-stats --write → docs-manifest → docs-sync-check ③ 三层沉淀:治本(skill/档案)/失误(append-only 教训)/记忆(AGENTS.md 或工作区规则)④ 改技能时本机 → 服务器单向推 + md5 双端一致 |
C 交付门禁(阶段 5 §0 · 逐层自问三句)
「这次改的是哪一层?这一层的生效链路是什么?最后一步走了吗、在用户可见面验了吗?」 ⛔ 四条"自我安慰"一条都不算交付:本机改完了 / build 通过了 / 本地打包完成 / 已 commit 了。
D 收尾五件(缺一不算完成)
🔴 首选=一行入口(只合并 ①+清单提醒,2026-10-01 起):"$PY" "$WS/scripts/dsh.py" close "<会话名>"
⇒ 入口内部:--release → --release-exec "<会话名>",并打出 ②③④ 的清单提醒(⚠️ 提醒 ≠ 代做:②~⑤ 仍须本会话逐条做完)
① 反序释放锁(入口内部实现):--release → --release-exec "<会话名>";⛔ 不带名 ⇒ 拒释放 ② 台账 / 档案 ③ 提交边界(未明确要求 ⇒ 不 commit/push;只 add 自己改的;⛔ tmp//中间产物/会话交接单 不入库)④ 收口清本棒 tmp/
⑤ 🔴 【收尾自判】(2026-09-29 加,同日按用户意见修正 —— 去掉了自造的去抖协议):本棒做完后,顺手做这一步(⛔ 不是"去叫一个监管会话",不产生任何新会话):
- 抢域锁当单例(既有工具,⛔ 不要自造
mkdir/flag):--claim-exec "<会话名>" --domains ai1net-dsh-server/⇒ 抢不到 ⇒ 什么都不做(说明已有人在推进)—— 这就是天然去抖。 - 抢到则:读
automation_runs(宿主已把各线结论写好)+tmp/supervise-inbox/advance.md⇒ 判「我这条线」还有没有缺口 ⇒ 有则写下一行automations(= 派下一棒)⇒ 释放锁。 🔴 为什么这样才对:你(这个会话)本来就在跑,多花 30 秒判定即可 —— 零额外角色、零额外会话。 旧设计"每线收尾各叫一次监管"会起 N 个会话互抢锁(2026-09-29 实测到"抢锁失败停手"),已作废。 🔴 全局收敛(V1–V7 全过)/ 线停滞重派 ⇒ 交给心跳(时钟由常驻投递提供)判 —— ⛔ 不再用宿主排期当钟(2026-10-01 废弃);⛔ 不必在这里做。 🔴 为什么不能靠钩子:钩子开不了新会话(自动化才是唯一通道)。派活模板 ⇒交付物/多会话协同机制-定稿-20260929.md §4.1|顶层设计 ⇒交付物/多会话协同-顶层设计-20260929.md
🔴 结束语必须对锁状态负责(写明"已释放",或点名锁在谁手上 + 原因 + 下一步)。
E 常驻的精确边界(⛔ 别一刀切)
- 🔴 先记定案:「协作与投递一直运行(常驻)」(09-29 定案,2026-10-01 用户再确认;理由「可能不是所有队列都是钩子产生的」) ⇒ ⛔ 不得拿"进程数 0→1"去否它;⛔ 「自动任务当闹钟」方案 2026-10-01 已废弃。载体 ⇒ 见末条。
- ⛔ 禁的是「会干活的会话自己起后台任务」:输出会反复唤醒宿主会话 ⇒ 会话永不空闲 ⇒ 用户看到"卡死"(已复现 6 次); 且它会压制该会话的 idle 钩子(实测压 6h20m)⇒ 一切"钩子驱动的唤醒/监管"被无声掐死。
- ✅ 独立进程不在禁令内:在独立窗口 / 计划任务里跑、输出不接回任何会话 ⇒ 不唤醒宿主 ⇒ 是项目明列的正确用法。
- 🔴 但独立进程有一道过不去的坎:它不是 WorkBuddy 的后代 ⇒ 读不到
CODEBUDDY_GATEWAY_PASSWORD⇒ 不能用网关派活(同 G-C)。 ⇒ 独立进程只能做只读判定 / 告警;派活仍须由能拿口令的一方(会话/自动化)完成。 - ⇒ 🔴 想要"能投递的常驻",本机唯一可行 = 专用容器会话 + 宿主后台任务 +
stdout全重定向到文件 (detached活不过工具调用边界;schtasks被黑名单硬拦)。要加别的常驻,仍先过交付物/多会话协同-顶层设计-20260929.md §7判据(是"更早发现"还是"更早推进"?后者它做不到)。
F 🔴 新建自动化 = 白名单 + 确认制(2026-09-29 用户明令)
只有两类可以不经确认直接建:
- 接续会话 —— 把某条链/某一线的下一棒接上(含 §1.5 D⑤ 收尾自判、把断掉的链续上)
- 给其他会话安排任务 —— 派活
🆕 第 3 类(2026-10-01 用户明令):开工建齐「唤醒 + 按分工类别的协作 + 跟进」三类会话
用户原话:「开始会话完成需求的时候,主会话需要创建 唤醒会话 以及根据分工类别 创建 协作会话 和 跟进会话呢 不然整个机制跑不起来」
- 它属于"用户当场点名的动作" ⇒ ⛔ 不算 §F 要防的「自行创建」。
- 🔴 三条硬约束(细则 ⇒ 技能
session-mechanism的architecture.md §2.3.0d): ① 只有自动化能开新会话 ⇒ "建会话"=登记一条自动化,⛔ 不是自己 spawn; ② 标题必须[角色]-[类别]-<具体>,第 2 级带方括号、值取goal.json的topics—— ⛔ 用short⇒parse_session_name()认不回 ⇒ 会话静默漏管(§2.3.2 表 ④ 实测踩过); ③ "还没建"是正常态(唤醒会话随需求确定时才建),但一旦开工就必须建齐,看板上如实显示成灰 ○。 - ⚠️ 只建这三类 —— ⛔ 别顺手再加监管轮/巡检/定期体检(§F 底部那条反面教材就是这么来的)。
- ⚠️ 建齐 ≠ 机制跑起来:投递链(常驻投递)与主会话可响应另算(见 §1 常驻定案)。
🆕 第 4 类(2026-10-02 用户明令):缺会话 ⇒ 自动拉起
用户原话(逐字):「是用户说 使用协作会话方式 完成目标 或 继续完成目标」(触发面) + 前一句:「应该是…如果没有 相关会话就自动拉起」
- 触发:用户说上面那两句(等价说法「继续执行」也认)或队列堵住(投递报
follow-not-live/no-follow-session)。 - 动作:先查齐备度 ⇒ 缺 ⇒ 就建排期把它拉起来,⛔ 不许把"你去开一条会话"甩给用户
(旧行为=写
NEED-USER.md喊人开会话,本条取代它)。 - 判据 + 现成参数:
python <技能包>/scripts/collabd.py --gap [--json](只读)。硬缺=跟进/协作会话没有活着的; 唤醒会话算"软缺"(用户定性「随需求确定时才创建」⇒ ⛔ 不算硬缺,否则红多必聋)。 - 🔴 建排期只能由「会话」做(脚本写
automations表=双红线)⇒ "自动"的全部通路= 钩子把缺口注入会话(wb-result-hook.py::maybe_inject_session_gap(),UserPromptSubmit零 token)⇒ 会话用automation_update建。 - ⚠️ 只建"缺的那三类会话",⛔ 别顺手加监管轮/巡检/体检。细则 ⇒ 技能
session-mechanism的architecture.md §2.3.0g。 - 🔴🔴 跟进会话=全局唯一席位,⛔ 不按类别各建一条(2026-10-02 13:5x 用户订正,逐字:「跟进会话只创建一个, 跟进的内容来自 协作会话执行完成 后 把 待核对状态 写入 协作队列,上报给那个 固定的 跟进会话处理」) ⇒ 一个工作区从头到尾只应有 1 条跟进会话;协作/唤醒仍按类别各一条。协作会话收尾=把待核对状态 写进协作队列 ⇒ 交给那固定的一条跟进会话核对并上报,⛔ 不是再开一条跟进会话。
⇒ 其余一切用途(监管轮/巡检/检查点/定期体检/观测/清理/日报…)必须先取得用户确认,⛔ 不得自行创建。
🔴 执行方法:建之前先自问「这属于「接续会话」或「派活」吗?」
- 是 ⇒ 直接建(一句话把"为什么属于这两类"写进名字或报告)
- 否 ⇒ 先把方案+理由报给用户,等确认(⛔ 不许先建后报)
⚠️ 反面教材(2026-09-29 我犯的):为"定期检查"自行加了 5 个密集检查点 + 心跳 + 交代轮 ⇒ 用户:「啥都用自动任务」。 ⇒ 判据:看见自己"用建自动化来回应需求"时 ⇒ 先走本白名单;答不上就报给用户。 ✅ 删冗余/清理不属"新建" ⇒ 可直接做(但要在报告里说明删了什么)。
G 🔴 阈值到达 ⇒ 自动开接续会话(2026-10-01 用户定则 · 固化)
用户原话:「到达阈值后 继续对话自动创建接续会话处理」
🔴 时机(2026-10-01 用户补定 · 与阈值同等硬): 用户原话:「在任务处理的最后 在判断创建会话的事, 不允许在任务中途处理」 一句判据:「建会话」是收尾动作,⛔ 不是中途动作 —— 只有手头这件事做到头 (做完,或达成停手条件:撞阈值 / 受阻 / 需用户拍板)时,才判「要不要开接续会话 / 协作会话」; ⛔ 任务进行中一律不许碰它:不许中途建、不许中途改它的排期、⛔ 更不许中途"为它腾时间"。 ⚠️ 反面教训(2026-10-01 实测):会话开到一半就把接续会话排到 30 分钟之后「给自己腾地方」, 结果任务提前做完 + 本会话又撞日志上限 ⇒ 那 30 分钟纯空等(用户当场追问「为什么要等这么久」)。
三条阈值,命中任一即触发:
- 上下文用量 —— 本会话上下文 ≥ 220,000 token(🔴 用户 2026-10-01 改值,原 36,000 作废)。 用户原话:「上下文取值 220K,另一个会话在解决 日志写入过快的问题」。 🔴 为什么放到 220 K(而不再是 36 K):宿主的历史是追加式全量重发(一次工具调用的输出永久留在历史里、每轮重发) ⇒ 越晚换会话单轮代价越高,但换得越勤则重启开销越多 —— 原 36 K 之所以定得极小,是因为日志先撞 (日志 ≈375 KB/分 ⇒ 28 分钟撞 10 MiB,比上下文早 19 分钟);🔴 该瓶颈现已由另一条线专治「日志写入过快」 ⇒ 本线不再按日志反推小阈值,改按"少交接"取向定 220 K。 ⚠️ 宿主在 120 K 会告警 —— 该点低于 220 K ⇒ 只当中途提示(可开始留意,⛔ 不必交接)。
- 🔴 会话诊断日志(两档 · 主阈值) ——
logs/<日期>/sdk/conversations/<本会话 id>.log的字节数 (os.path.getsize即可,⛔ 不 grep 内容 ⇒ 否则判定本身拖慢会话): 软档 ≥ 5 MiB ⇒ 开始写交接材料;硬档 ≥ 8 MiB ⇒ 立刻停手 + 按本节建接续会话。 🔴 2026-10-01 用户拍板升格(用户原话:「B方案」)—— 本档由"安全兜底"升为主阈值,⛔ 不再是"日后再议"。 🔴 为什么硬档是 8 MiB 而不是 10:宿主上限 10 MiB,须留交接余量;实测一次交接烧 ≈1.9 MiB ⇒ 8 MiB 已是下限,⛔ 不得再往上调(调到 9 以上 ⇒ 交接材料写不完就撞顶)。 🔴 与collabd.py的 9.5 MiB「已哑」拦截线是两回事:那道只管"哑了不许再投",这道管"该交接了"。 🔴 宿主对单会话诊断日志有 10 MiB 硬上限,撞上即拒写(EPERM)⇒ 界面静默哑掉; 而协作程序过去对它的投递仍记ok:true(假绿) ⇒ 通知全落空而无人知晓。 (2026-10-01 实测坐实 + 已修:collabd.py增_deaf_sids()两道闸,见memory/2026-10-01.md§十一) ⚠️ 换算参考(仅参考 · ⛔ 不作判据):正常干活会话日志约 23 MB / 20 分钟 ⇒ 5 MiB ≈ 3540 分钟的量。 - 🔴 工具调用次数(两档 · 与日志同源 · 2026-10-01 用户拍板「B方案」一并采纳) ——
本会话累计工具调用:软档 ≥ 200 次 ⇒ 开始收尾;硬档 ≥ 250 次 ⇒ 停手建接续会话。
🔴 为什么它比 token 更准:日志量 ∝ 调用次数(实测 152 帧 × 244 B ≈ 37 KB/次)⇒
10 MiB ÷ 37 KB ≈ 283 次= 一个会话的物理寿命(实测撞顶会话 264 次 ⇒ 吻合)⇒ 250 次已留余量。 ⚠️ 与档 2 互为冗余:调用的"次数失控"(同一条命令爆几十次)与"单次输出过大"两条路都能被兜住。 📂 阈值设计全过程 ⇒memory/2026-10-01.md§二十四 / §二十七 / §二十九;接续包 ⇒接续包_日志事前叫停_20261001.md §4。
触发后四步(顺序固定):
- ⛔ 不在原会话里继续硬撑(硬撑只会触发上下文压缩、或把日志写爆);
- 先落盘交接材料:结论 + 遗留 + 下一步 ⇒
.workbuddy/memory/<日期>.md追加一节,或写接续包; - 开接续会话:走
automation_update(🔴 自动化是唯一能开新会话的通道,钩子开不了); 属 §F 白名单「接续会话」⇒ 免确认;prompt 必须自包含(新会话看不到本对话),第 0 步写「跑state.py」; - 在本会话明确告知用户"已交接,请到新会话继续",并释放锁(⛔ 带锁结束 = 把所有人挡在门外)。
⚠️ 触发时机:以用户下一条消息到达时判定为准(钩子 UserPromptSubmit 本就会注入机械摘要 ⇒ 顺手带上"本会话已到阈值"即可)。
🔴 钩子侧自动检测= ✅ 已落地(2026-10-01)—— 载体 07-scripts/session-log-guard.py,
挂 PostToolUse + UserPromptSubmit(宿主支持 PostToolUse,配置在 CODEBUDDY_CONFIG_DIR/settings.json);
只判 os.path.getsize 的字节数,⛔ 不 grep 日志内容(否则判定本身拖慢会话);同会话同档只报一次
(状态落 tmp/,临时文件 + os.replace,⛔ 不用文件锁)。⇒ 软/硬档到达时你会收到一条注入提醒
(🟡 / 🔴,出现在工具结果里)—— 看到即照本节第 1–4 步办,⛔ 别当背景噪音忽略。
🔴 ⛔ 不许为此建"定时轮询式自动化" —— 那属 §F 白名单外的用途,须先报用户。
G·1 🔴 压日志增长的四条硬纪律(2026-10-01 实测口径 · 与本节同源)
为什么单列:日志是主阈值,但"知道该交接"≠"知道怎么别涨那么快"。每条都有本机实测支撑。
- ⛔ 分母不许估 —— 报任何"每次 / 每分"系数前,分子分母都要量出来。 (2026-10-01 我拿"估的调用次数"当分母,把一个系数报大了 3 倍 ⇒ 实测 166 次,我估的约 50 次。)
- 🔴 压调用次数是唯一直接杠杆 —— 日志 ≈ 调用次数 × 37 KB(实测 144 帧/次 × 249 B)。
本机实测:某会话 8 分钟跑 166 次(≈20 次/分)就写掉 6.2 MB(参考会话 10.5 次/分 ⇒ 慢一半)。
手法:合并命令一次取多个读数|大输出
> tmp/x.txt后只读关键行(⛔ 不cat大文件)| ⛔ 不ls -laR|同一文件一次读完|让脚本内部聚合、只print摘要。 - ⛔ 别用"挂钟时间"估算余量 —— 实测:活跃 630 KB/分 ↔ 空闲 34 分钟 0 行(日志只跟"工具在跑"走)。
- ⛔ 不许动生产日志一字节(不改 / 不删 / 不重命名)—— 它由宿主进程持有; Windows 上重命名会被占用挡住,且轮转是否发生由宿主决定(⛔ 不改官方主程序 ⇒ 属上报项)。
3. 红线 R1–R11(任一条命中 ⇒ 先停手;效率论证不构成豁免)
| # | 禁令 / 判据 |
|---|---|
| R1 | 不自动升级 dsh —— 升级须走独立"测试 → 评估 → 修复"流程 |
| R2 | 不改官方 dsh 主程序与缓存 —— @deepseek-ai/dsh 零改动;扩展只走 profile 层官方插件机制 |
| R3 | client bundle 禁 exports.default —— 只导出 apply + inject |
| R4 | 不用真实账号测登录 —— 用临时 session(mksess.cjs 直插),用完即删 |
| R5 | 权限只准收窄 —— 凡扩大(新挂载 / 放开遮蔽 / 暴露平台目录或 env / 放宽 nft / 提档位)⇒ 先出「权限影响评估」并取得确认 |
| R6 | 先查已有资产再动手 —— 可用技能 → 本机 / 项目已有技能与记忆 → "本机已有的能否满足" |
| R7 | 禁未经确认的批量 / 全仓写入 —— 只做被明确要求的事;额外发现先报告后动手;禁全库遍历·通配符改写 / 批量权限·换行符改动 / cp -r 覆盖 / git add -A;>10 文件 ⇒ 先出清单 + 确认;本机不是沙箱(scp 会传导到生产) |
| R7-边界 | R7 只管「不是我的 lane」:我 lane 内细节(部署 / 重启 / 改配置 / 跑自己的脚本 / 改自己的插件)⇒ 直接做,⛔ 别拿 R7 挡箭牌去问;别人的 / 归属不明 ⇒ 只报告、不动手。🔑 判据看归属,不看"是不是平台组件" |
| R8 | 生产变更:47.77.182.89 是开发环境服务器 ⇒ 重启 / 停 scope / drain / 改配额·env / nginx·nft 直接做。两条自律:动手前一句话说明在动什么 + 不可逆操作(删数据 / 迁 DB / 清目录)先报清单 |
| R9 | ⛔⛔ 禁止「人工删锁 / 接管」 —— 不得删 交接单/.exec-lock / .doing-*、不得以「持有者疑似已死 / 卡住」为由单方面接管;锁只能由持有者自己释放(guard 那句「或确认接管后人工删锁」不构成授权)。抢不到锁唯一合规 = 停手 + 报告用户(处置权只属用户本人)。🔴 唯一例外(用户 2026-10-09 明令授权):「如果 工作区 项目机制 对应的会话异常 导致未解锁的情况下,可以授权 检查会话自解除孤儿锁」—— 判据不再靠猜, sessions 表查持有者真身状态:只有 terminated/error/archived,或 completed 且已静默 ≥30 分钟 ⇒ 判孤儿锁可解除;working ⇒ 一律不动(R9 原样)。✅ 唯一执行面=session-mechanism/scripts/lock/orphan-lock.py(⛔ 别自己写删锁命令);⛔ 该例外只给检查会话、只覆盖这一种情形 |
| R10 | ⛔ 绝不以 root(或非该实例 uid)运行 / 触碰用户实例的东西 —— ① 验证 / 冒烟 / 探针必须以该 uid 运行或进 bwrap 沙箱,⛔ 禁 root 直跑 profile ② 确需 root ⇒ 收尾必 find <home> -user root -exec chown <uid>:<uid> {} + ③ 实例起不来先看属主 / EACCES,别先怀疑 OOM |
| R11 | ⛔ 只做正向迭代 —— 判据(十维:目标 / 方向 / 架构 / 功能 / 性能 / 安全 / 交互 / UI / 便利性 / 扩展性):是否让任一维净变差?命中 ⇒ 立即停下复盘:写清劣化在哪维、代价多大 → 找保住正向收益的做法 → 拿不出 ⇒ 立即停止、只报告。⛔ 禁三种伪装:说成"必要代价" / "后续再优化" / 藏进交付不写 |
R5 / R7-边界 / R8 / R9 / R10 / R11 的解释段 · 事故全过程 · 用户原话 ⇒ 【详】§B-1…§B-5。
4. 提交边界
未明确要求 ⇒ 不 commit / 不 push / 不同步仓库;用户说了才做,且只 add 自己改的文件。⛔ 三类禁止入库(2026-09-21 用户明令):tmp/ |中间产物(_tmp_seq*/、_中间产物*/)|$DOC\05-交接单/ 下的会话交接单。
- ⛔ 别用
git status判"交接单要不要提交"(被 ignore ⇒ 不出现,属预期行为);确需入库只能显式git add -f并说明理由。⚠️ 已跟踪的05-交接单/README.md、archive/**不受影响。 - ✅ 落点与入库解耦:交接单照旧写
05-交接单/(8 段模板不变)只是不进 Git;中间产物一律留tmp/内。🔴 提交前自查git diff --cached --name-only出现三类中任一 ⇒ 立即git reset。
5. 规划与执行分离
规划会话只产出交接单($DOC\05-交接单/,8 段必填:目标 / 只读前置 / 范围 / 决策点 / 步骤 / 验收 / 回滚 / 回报格式),不 ssh、不改码、不重启、不 scp;落地交另一个执行会话(不读其上下文)。
6. 并发纪律(多会话并行是常态 · 命令与实证全文【详】§C)
- 共享文件只用 Edit 精确片段替换(失败 = 天然冲突检测),禁整文件 Write 覆盖。并行度按「冲突域是否重叠」定:域不重叠 ⇒ 可真并行;⚠️ 机制层(
config·crypto·isolation·index·scripts·CODEBUDDY.md·锁与钩子本身)必须独占。 - 🔒 开工门禁:先跑
bash $DOC\07-scripts\preflight-lock.sh "<会话名>" <目标文件...>判可锁定范围。【A】可独立锁 /【B】秒级独占 /【E】机制层 /【C】共享 /【D】未归类。⛔ 【D】或【E】非空 ⇒rc=1拒开工(D = 先归类再动;E = 机制层全平台共用 ⇒ 仅当确认无其他会话在跑才可独占开工)。 - 三把锁 + 两把秒级锁(全文【详】§C):域锁(默认)
--claim-exec "<会话名>" --domains <域键>,域键 =<锚点段>/<下一段>、多个用逗号|不带--domains⇒ 退化独占(机制层必走)|--claim|服务器侧op-lock.sh claim;秒级--claim-skeleton(改机制层 / 领迁移号)、--claim-publish(commit / push / scp / build)。完工一律反序释放(先--release,最后--release-exec "<会话名>"—— ⛔ 不带会话名 ⇒ 拒绝释放)。🔴 域键判据 shell 与 hook 两侧必须逐字一致(_ANCHOR_SEGS⇄_DOMAIN_SEGS),⛔ 改一侧 ⇒ 域锁静默失效(假绿)。 - 🔍 抢锁必须"校验结果"不能"看输出":① 检查退出码(不接管道)② 复读
.locks/<会话名>/DOMAINS或.exec-lock/OWNER并断言是自己的。⛔ 用| grep截尾 = grep 吃掉退出码,也吃掉"抢不到"。⚠️rc=1两因分清:域冲突(停手)vs.gate占用(重试)。⚠️ 「无锁」=「你快去抢」;⛔ 抢不到就是终点 ⇒ 处置见 R9(等释放或报告用户)。 - ✅ 锁只约束「写」不约束「读」(读文档 / 读码 / 只读命令随时可做);⚠️ 会改本地状态的命令不算"读"(
git fetch/checkout/stash/reset/switch)⇒ 要持锁。🔓 释放时机 = 交付闭环走完(台账 → 四件套 → commit → 推送 + 对账 → 归档),不是"改完就放"(释放一律带会话名:--release-exec "<会话名>",⛔ 不带名 ⇒ 拒绝释放);要等用户拍板 ⇒ 先释放再等。🔒 锁的生命周期 = 任务的生命周期,⛔ 禁"抢到锁、做一半、不解锁就结束回合"。结束语必须对锁状态负责(写明"已释放",或点名锁仍在谁手上 + 原因 + 下一步)。 - 推送前复跑对账:「仅本地」里有不在你清单的文件 ⇒ 立刻停手(幽灵文件);基线数字必须带取数时间 + 复核命令。
settings.json的hooks段 = 多会话共享 ⇒ 只能 Edit 增删条目,禁整段覆盖(覆盖顶层键 = 静默抹掉别人的钩子);用户级MEMORY.md同理。⚠️ hook =「会话启动时快照」(对在跑的会话无效 ⇒ 须完全重启,关窗 ≠ 退出);⚠️ 脚本路径失配 = fail-closed(Write/Edit 全被拒)⇒ 迁移 / 改名后第一件事 = 核对 hooks 绝对路径;兜底 钩子不拦 Bash。
7. 环境要点(反复踩过 —— 加完就删旧的 · 全文【详】§D)
⚠️ 本机 bash 的 PATH 常丢(
ls/grep/dirnamenot found、rc=127)⇒ 每条命令都要前置 PATH 导出(PortableGit/versions/1.2.0下的usr/bin+mingw64/bin——mingw64/bin不能少,git.exe只在那里;⛔ 别把/c/Windows/System32放前面);🔴 调用间不共享 shell 状态(命令全文 ⇒ 【详】§D)。 ⚠️ 其余六条(转 LF / Node 22 / 禁py_compile/ pnpm / 会话取证 / 推送核验)⇒ 全文【详】§D。
8. 会导致事故的实测事实(6 条速查 · 详解 ⇒ 【详】§E)
🔴 速查(详情 + 后果 ⇒ 【详】§E):① 权限档位只在开会话时播种 ② 插件「禁用」= 真卸载 ③ 配额 384 MiB / V8 堆按宿主算 ④ 业务插件只走门户候选池 ⑤ home 写文件走
UserFs⑥ PG 身份键 =id。
2. 触发词 ⇒ 去查($DOC\…;全表【详】§F)
- 现状 / 该读哪篇 →
$DOC\BRIEF.md;覆盖网络线入口 = 根接续入口_覆盖网络线_20260916.md - UI / 前端 →
$DOC\01-规范\06-工作台UI规范.md(强制基线;client bundle 启动时加载 ⇒ 改完必重启) - "我做完了吗" →
dsh-workflow→references/dsh-change-workflow阶段 5 §0 交付门禁(⛔ 改完 / build 过 / 已 commit 都不算交付) - 新建档案 →
$DOC\05-交接单/README.md §二(先原子占号)|功能怎么改的 →$DOC\调整方案/<NN>-<主题>.md|部署 / 构建 / 回滚 →$DOC\DEPLOY-本部署.md - 待办 →
$DOC\01-规范\03-路线图与待办.md §二/$DOC\05-交接单/README.md §一|服务器文件 = 基线? →git hash-object - 功能 / 方案决策 → 技能
dsh-decision(references/00-决策方法论.md= 原dsh-decision-method;references/01-功能优先协作协议.md= 原dsh-feature-first);⚠️ 点名「决策方法」⇒ 立即Skill(...),⛔ 不凭记忆 - 「是否已实现 / 能不能」 →
dsh-decision→references/01-功能优先协作协议.md §5.1 结论骨架|落地改造 →dsh-workflow(references/dsh-change-workflow) - 排下一棒 →
dsh-workflow→references/dsh-auto-handoff-chain §3.1.1(收口 + 3~4 分钟;每线一个)|复盘决策 →scripts/extract-user-voice.py
⚠️ 技能加载由模型判相关性,不能保证 ⇒ "动作前必须生效"的规则必须写在本文件里。
9. 工作区卫生 / 目录规范(全文 ⇒ 【详】§G + §H)
- 🔴 收口必清本棒 tmp(收尾四件套 + 第 ⑤ 件);
tmp/留 7 天,超期进归档/tmp-<日期>/;⛔ 不新建「待清理」类目录(二值:归档 or 删除);⛔ 不留脚本副本;入库口径 ⇒ §4。 - 🔴 两条硬判据:①
接续入口_*.md必须在工作区根(移走 ⇒ 新会话第一个信号就错 = 事故级)② 根目录不许新增散落文件、不许移走白名单内的东西(白名单 / 落点 / 命名 ⇒ 【详】§H)。
- 骨架:
# 大类别(已完成/待处理任务)→## 具体事项→ 每件事写两段:当前状态:+待处理事项:。 - 🔴 这两个小标题各占一行、每件事只写一次;⛔ 不许在每条圆点前面都加「当前状态:」(2026-10-07 用户点破:那样满屏都是前缀)。
当前状态:下面每条一个圆点(-),每条一句陈述句说重点,依据与细节放句末圆括号;待处理事项:下面用序号1、2、3、。- 层级与顺序:大类标题必须比任务名大一号;已完成的大类放最前,待处理放最后;附件写在所属板块最末一行;⛔ 不出四级标题。
- 首屏:开头 3 行内先给判定(✅/⚠️/❌ + 一句),细节放后面。
- 三禁(⛔ 任一命中 = 该条回复作废、重写后再发):表格 / 长散文 / 碎标签堆叠。
- 并列内容竖排:多个候选、多项并列各占一段、逐条编号;⛔ 不横排、⛔ 不挤进一段、⛔ 不塞成表格的列。
- 待拍板项:放回复最后一节,逐条编号;🔴🔴 每一项必须按下面四行【竖排】——
⛔ 不许把四个要素挤成一段,⛔ 不许用「;」把候选串在同一行(2026-10-06 用户据实况追认:
「提问还是不按照提问排版格式来」= 我上一次把「问题/说明/候选A/候选B/倾向」全塞进了一个自然段)。
形如:
1、问题:一句话说清要决定什么(⛔ 不用「这个/它/上述」这类指代)。说明:为什么要你定(影响谁/断多久/花多少钱/有无不可逆)。候选 A:优点…/缺点… —— B、C 各占独立一行,⛔ 不横排、⛔ 不挤进同一段。倾向:我选哪个 + 一句理由。 🔴🔴 决定对象要点名到具体 —— 写清是哪份文件 / 哪个技能 / 推哪个仓 / 动哪台机器: 🔑 判据=少了这个标识,用户还能不能决定 —— 不能 ⇒ 必须写进正文;能 ⇒ 删掉, 连同只服务实现的细节(函数名 / 变量名 / 行号 / sha / 表名字段名 / 内部编号)一起下沉「技术附录」。 (避坑依据 2026-10-09:把要撤的文件名省成「那两份」⇒ 用户回「不说具体 我怎么知道」,该条报废。) - 🔴🔴 一律用肯定表述(2026-10-09 用户令):写或改技能与规则文件时 —— 本块 · 技能描述 · 钩子文案 · 用途/范围段 —— 都写**「要什么、怎么做」**(例:「要点名到具体是哪份文件」); 新建、生成时同样适用(⛔ 不只管"修改")。 ✅ 例外:以「经验沉淀」或「红线/避坑」为目的的技能与规则(踩坑记录 · 红线清单 · 反例库) 可以写负向 —— 写法=先写正向目标,再把踩过的坑放括号里当依据。
- 🔴🔴 「变相征询」同样禁止(2026-10-06 用户据实况追认):凡是要用户拿主意的事 —— 包括「先只报不动」「等你发话」「我倾向 X,你看呢」这类不带选项的待定清单 —— 一律按上一条写成「待拍板项」(问题 + 说明 + 各候选的优点与缺点 + 倾向)。 ⛔ 不许用一句"倾向"或"等你发话"顶替选项;⛔ 也不许把「没写选项的清单」当成"只是汇报"蒙过去。 反过来:已自决的事写成陈述句(「我选了什么,可推翻」),⛔ 不要混进待拍板清单里充数。
- ⛔ 不用征询句收尾(「要我…吗/请确认/你看怎么办」);能自决策的直接做完,只留一句"我选了什么(可推翻)"。
- ⚠️ 若本工作区另有更新的定稿(环境文件里有更细的排版节)⇒ 以那份为准,本块是通用形态。