Files
dsh_ai1net_server/CODEBUDDY.md
T

334 lines
41 KiB
Markdown
Raw Normal View History

# DSH 平台项目 — 项目指令(每次会话自动加载)
> 🔴 **当前结论(先读 · 最后更新 2026-09-30 05:56)**
> · **文档记录规则**(用户 09-30 定):**最新结论放最前** · 历史**倒序** · 只留最近 5 轮(**教训/用户定案原话/实测读数**三类**豁免**)· 超出的**归档**(⛔ 不删)⇒ 规范 `agent-operating-rules §1.7a`;归档落 `$WS/归档/`,**按类别分**(索引见 `$WS/归档/README-索引.md`)。
> · **协作机制**:唯一权威 ⇒ `~/.workbuddy/skills/session-mechanism/references/architecture.md`(其头部有「当前结论」节);⛔ `交付物/` 里 4 份"多会话协同"平行件 **2026-09-30 已退役**,⛔ 不作用判据。
> · **取现状**:⛔ 不拿旧文档/旧实测单当现状 —— **先按 mtime 取最新那份**(`agent-operating-rules §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)。
- 🔴 **上抛 / 待拍板内容必须自包含(发送前就按规范写)**:⛔ **作用域 = 一切「要用户拿主意」的输出**(提问 · 末尾待拍板清单 · 候选 · 表格盘点 —— 换形态不豁免)。四要素:① **问题** —— 一句话说清要决定什么(⛔ 不用指代)② **说明** —— 为什么要你定("影响谁 / 断多久 / 花多少钱")③ 每候选写**优点 + 缺点**,末行给**倾向** ④ 一轮一问;⛔ 不出现包名 / 路径 / 变量名 / 类名(详 A6)。
**📐 回复排版(🔴 2026-10-01 用户定稿 · 本条覆盖旧版;六轮迭代后定下,照抄即可,⛔ 别自己另发明)**
- **骨架**:`# 大类`(**已完成** / **待处理任务**)分节 → `## 任务名` 分事 → 每件事写两段:**当前状态** + **待处理事项**。
🔴 **大类标题必须比任务名大一号**(2026-10-01 用户加)—— 大类别用**一级标题 `#`**、字号最大;任务名用**二级标题 `##`**;⛔ 不许大类与任务名同号(同为 `##` ⇒ 层级压平、看不出哪几件事属于同一个大类)。
- **当前状态**:每条一个**圆点**(`- `),**用一句陈述句说重点**;复杂情况、依据、细节放**句末圆括号**里。
- **待处理事项**:用**序号**(`1、2、3、`,不是 `1.`);每条写完整句子,可以不止一句。
- **附件**:本板块若有文件要展示或引用,写在**该板块最末**一行(`附件:<路径>`)。
- **大类顺序**:**已完成的大类放最前**,`待处理任务` 放**最后**。
- **三禁**:⛔ **表格**(=省略讲理,人要来回跳读)|⛔ **长散文**(不是写小说,整篇不分段=没版式)|⛔ **碎标签堆叠**(`- ` 碎片 + 加粗小标题 + `⇒` 串句)。
- 🔴 **强遵循(2026-10-02 · 机制保障见 `agent-operating-rules` 技能)**:本节=**每轮硬约束**,命中三禁任一条 ⇒ 该条回复**作废重写**。机器可读副本由技能注入在下方标记块;**每轮注入**由钩子 `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 <你的域>/`
(以下 = 入口内部实现,逐字保留供排查对照;**语义未变**)
1. **跑状态**:`"$PY" "$WS/state.py"`(`--online` 加远端基线)—— 🔴 **跑完之前不许 Glob/Grep 全库摸底**(1 次调用顶十几轮探索)
2. **判可锁定范围**:`bash $DOC\07-scripts/preflight-lock.sh "<会话名>" <目标文件...>` —— 【D】未归类或【E】机制层非空 ⇒ **rc=1 拒开工**
3. **抢锁**(是"抢"不是"看"):`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 加,**同日按用户意见修正 —— 去掉了自造的去抖协议**):本棒做完后,**顺手**做这一步(⛔ **不是"去叫一个监管会话"**,不产生任何新会话):
1. **抢域锁当单例**(**既有工具,⛔ 不要自造 `mkdir`/flag**):`--claim-exec "<会话名>" --domains ai1net-dsh-server/`
⇒ **抢不到 ⇒ 什么都不做**(说明已有人在推进)—— **这就是天然去抖**。
2. 抢到则:**读** `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. **接续会话** —— 把某条链/某一线的**下一棒接上**(含 §1.5 D⑤ 收尾自判、把断掉的链续上)
2. **给其他会话安排任务** —— 派活
🆕 **第 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 分钟**纯空等**(用户当场追问「为什么要等这么久」)。
**三条阈值,命中任一即触发**:
1. **上下文用量** —— 本会话上下文 **≥ 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 ⇒ 只当**中途提示**(可开始留意,⛔ 不必交接)。
2. 🔴 **会话诊断日志(两档 · 主阈值)** —— `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` §十一)
⚠️ 换算参考(**仅参考 · ⛔ 不作判据**):正常干活会话日志约 2~3 MB / 20 分钟 ⇒ 5 MiB ≈ 35~40 分钟的量。
3. 🔴 **工具调用次数(两档 · 与日志同源 · 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`。
**触发后四步(顺序固定)**:
1. ⛔ **不在原会话里继续硬撑**(硬撑只会触发上下文压缩、或把日志写爆);
2. **先落盘交接材料**:结论 + 遗留 + 下一步 ⇒ `.workbuddy/memory/<日期>.md` 追加一节,或写接续包;
3. **开接续会话**:走 `automation_update`(🔴 **自动化是唯一能开新会话的通道**,钩子开不了);
属 §F 白名单「接续会话」⇒ **免确认**;prompt 必须**自包含**(新会话看不到本对话),第 0 步写「跑 `state.py`」;
4. **在本会话明确告知用户**"已交接,请到新会话继续",并**释放锁**(⛔ 带锁结束 = 把所有人挡在门外)。
⚠️ **触发时机**:以**用户下一条消息到达时判定**为准(钩子 `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 实测口径 · 与本节同源)
> **为什么单列**:日志是**主阈值**,但"知道该交接"≠"知道怎么别涨那么快"。每条都有本机实测支撑。
1. **⛔ 分母不许估** —— 报任何"每次 / 每分"系数前,**分子分母都要量出来**。
(2026-10-01 我拿"估的调用次数"当分母,把一个系数报大了 3 倍 ⇒ 实测 166 次,我估的约 50 次。)
2. 🔴 **压调用次数是唯一直接杠杆** —— 日志 ≈ **调用次数 × 37 KB**(实测 144 帧/次 × 249 B)。
本机实测:某会话 **8 分钟跑 166 次(≈20 次/分)就写掉 6.2 MB**(参考会话 10.5 次/分 ⇒ 慢一半)。
手法:**合并命令一次取多个读数**|大输出 `> tmp/x.txt` 后只读关键行(⛔ 不 `cat` 大文件)|
⛔ 不 `ls -laR`|同一文件**一次读完**|让脚本内部聚合、只 `print` 摘要。
3. ⛔ **别用"挂钟时间"估算余量** —— 实测:活跃 **630 KB/分** ↔ 空闲 34 分钟 **0 行**(日志只跟"工具在跑"走)。
4. ⛔ **不许动生产日志一字节**(不改 / 不删 / **不重命名**)—— 它由宿主进程持有;
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 那句「或确认接管后人工删锁」**不构成授权**)。**抢不到锁唯一合规 = 停手 + 报告用户**(**处置权只属用户本人**) |
| **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`/`dirname` not 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)。
<!-- BEGIN reply-core (generated by agent-operating-rules/scripts/apply-reply-rules.py · 勿手改块内;要改口径改技能里那份再重跑本脚本) -->
<!-- REPLY-CORE:BEGIN (由 agent-operating-rules 技能生成 · 与技能内那份同源) -->
- **骨架**:拆两层 —— `#` 大类别(已完成/待处理任务)→ `##` 具体事项。每件事先写「当前状态」(每条一个圆点,用**一句陈述句**说重点,依据与细节放**句末圆括号**),再写「待处理事项」(用序号 `1、2、3、`,每条可不止一句)。
- **层级与顺序**:大类标题必须比任务名大一号;**已完成的大类放最前**,待处理放最后;附件写在**所属板块最末一行**;⛔ 不出四级标题。
- **首屏**:开头 3 行内先给判定(✅/⚠️/❌ + 一句),细节放后面。
- **三禁**(⛔ 任一命中 = 该条回复**作废、重写后再发**):**表格** / **长散文** / **碎标签堆叠**。
- **并列内容竖排**:多个候选、多项并列各占一段、逐条编号;⛔ 不横排、⛔ 不挤进一段、⛔ 不塞成表格的列。
- **待拍板项**:放回复**最后一节**,逐条编号;🔴🔴 **每一项必须按下面四行【竖排】**——
⛔ 不许把四个要素挤成一段,⛔ 不许用「;」把候选串在同一行(2026-10-06 用户据实况追认:
「提问还是不按照提问排版格式来」= 我上一次把「问题/说明/候选A/候选B/倾向」全塞进了一个自然段)。
形如:
`1、` **问题**:一句话说清要决定什么(⛔ 不用「这个/它/上述」这类指代)。
` ` **说明**:为什么要你定(影响谁/断多久/花多少钱/有无不可逆)。
` ` **候选 A**:优点…/缺点… —— **B、C 各占独立一行**,⛔ 不横排、⛔ 不挤进同一段。
` ` **倾向**:我选哪个 + 一句理由。
- 🔴🔴 **「变相征询」同样禁止**(2026-10-06 用户据实况追认):凡是**要用户拿主意**的事 ——
包括「**先只报不动**」「**等你发话**」「我倾向 X,你看呢」这类**不带选项的待定清单** ——
**一律按上一条写成「待拍板项」**(问题 + 说明 + **各候选的优点与缺点** + 倾向)。
⛔ 不许用一句"倾向"或"等你发话"**顶替**选项;⛔ 也不许把「没写选项的清单」当成"只是汇报"蒙过去。
反过来:**已自决**的事写成陈述句(「我选了什么,可推翻」),⛔ 不要混进待拍板清单里充数。
- ⛔ **不用征询句收尾**(「要我…吗/请确认/你看怎么办」);能自决策的直接做完,只留一句"我选了什么(可推翻)"。
- ⚠️ 若**本工作区另有更新的定稿**(环境文件里有更细的排版节)⇒ **以那份为准**,本块是通用形态。
<!-- REPLY-CORE:END -->