Files
dsh_ai1net_server/交付物/补回三个闸门-20260930.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

69 lines
6.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 补回三个闸门 + 闸门体检两处修复(2026-09-30)
> 用户指令原话:「**A**」(=「另外三个闸门(锁纪律 / 技能加载 / 输出限流)**一并补回**」)
> 配套:`交付物/接续机制未运行的根因与强化-20260930.md`(上一棒:只补回了接续机制的触发源)
> 本棒持**全局独占锁**(`补回三闸门-6ecf6d98`),收尾已释放。
## §0 一句话结论
三个闸门**已补回并逐条端到端跑通**(⛔ 不是"配置改完了");顺手修掉**两处让闸门体检自己瞎掉的缺陷**——
其中一处正是本轮开场那条【门禁自检】假警报的来源:它拿 **4 天前**的陈旧日志报"最近 4 次 Bash 有 4 次被拦"。
## §1 补回了什么(对照 09-24 备用配置逐字复原)
| 事件 | matcher | 脚本 | 作用 |
|---|---|---|---|
| `PreToolUse` | `Write\|Edit` | `lock-guard-hook.py` | 无锁不许改文档库 / 代码库 |
| `PreToolUse` | `Bash\|Read` | `bash-output-guard.py` | 拦下会灌爆上下文的读命令 |
| `SessionStart` | `startup\|resume` | `lock-guard-hook.py` | 开工即告知锁状态 |
| `UserPromptSubmit` | (无) | `skill-load-guard.py` | 用户点名方法 ⇒ 强制加载技能 |
复原依据:`归档/文档整理/dsh-server-docs-微调-20260924/settings.json.bak`(mtime 09-24 06:01)——**唯一**保存了完整注册表的副本。
现状:`state.py` 显示 `✅ 关键闸门在册 | PreToolUse×4 SessionEnd×2 SessionStart×2 UserPromptSubmit×4`(12 条,`exists=True` 全绿)。
备份:`settings.json.bak-restore3gates-20260930-1840`。
## §2 端到端验证(⛔ 判据只认"真的跑出了一轮")
| 闸门 | 验证方式 | 读数 |
|---|---|---|
| lock-guard-hook | **我自己的 Edit / Write 真实触发** | `lock-hook.log` 18:40:25 `PreToolUse|tool=Edit`、18:40:31 `tool=Write`;18:40:24 `SessionStart 旧全局锁被占 owner=补回三闸门-6ecf6d98` |
| bash-output-guard | **我自己的 Bash 真实触发** + 直喂超阈值文件 | `bash-guard.log` 18:40:34 / 18:40:46;喂 **3.6 MB** 文件 ⇒ `permissionDecision: deny` + 给出 `offset/limit`、`grep -n|head` 等价写法;喂 4.6 KB 文件 ⇒ 放行 |
| skill-load-guard | 直喂「点名方法」载荷 | 产出 `additionalContext`:强制先 `Skill(dsh-decision-method)` |
| stop-dialog-guard(上一棒) | 真实用户发言触发 | `stop-dialog-guard.log` 18:38:05 / 18:38:14 |
⇒ `state.py` 新增一行把它们一次说清:
```
· 各闸门日志最后一行:收口=2026-09-30 18:38 技能=2026-09-30 18:41 限流=2026-09-30 18:42 锁=2026-09-30 18:42
```
**四条日志全是今天** = 四条闸门全活。**「日志最后一行时间」= 该闸门最后一次真被调用的时刻**,这是以后一眼看出"谁掉线了"的判据。
## §3 顺手修的两处(都属"让闸门体检别再瞎")
| # | 缺陷 | 症状 | 修法 | 验证 |
|---|---|---|---|---|
| 1 | `stop-dialog-guard.py::path_health()` 读 `WORKBUDDY_CONFIG_DIR` / `~/.workbuddy` | 本机真根是 `CODEBUDDY_CONFIG_DIR=E:\ProgramData\.workbuddy` ⇒ 读到不存在的文件 ⇒ 异常被吞 ⇒ **路径自检恒静默**(上一棒实测) | 优先认 `CODEBUDDY_CONFIG_DIR`,再回退旧变量(服务器上未设 ⇒ 行为不变) | 反向单测:喂一份"指向不存在脚本"的配置 ⇒ 正确报出 `🚨【路径自检】…不存在 ⇒ 机制可能已静默失效` |
| 2 | `guard_health()` 按"最后 40 条 DENY"统计、**不看时间** | 拿 **09-26**(且指向已改名的旧工作区 `aliyun-dsh-server`)的 4 条 DENY,每轮报「最近 4 次 Bash 里有 4 次被拦」⇒ 把「闸门已停用」伪装成「闸门在乱拦」 | 加 `_fresh()`:只认**近 24h** 的行;取不到时间 ⇒ 不报 | 单测:09-26 行 ⇒ False、今日行 ⇒ True、无时间前缀 ⇒ False;`guard_health()` 现返回 `''`(假警报消失) |
⇒ 🔴 **结论:不需要**把 `bash-guard-mode` 写成 `off`。本轮开场那条【门禁自检】**不是规则太严,是体检工具拿了陈旧日志**。
(`stop-dialog-guard.py` 已备份 `tmp/_bak-stop-dialog-guard-20260930-1845.py`,原 md5 `5fe59a4200893a240dc96dbeff6de029`。)
## §4 顺带纠正的三条过时注记(文档库 `07-scripts/` 内)
1. `skill-load-guard.py` 安装示例里推荐 `"<python>" -S -E "<stop-dialog-guard.py>"` —— **`-E` 是禁止项**(屏蔽 `PYTHONUTF8` ⇒ 含中文 payload 静默解析失败)。已删 `-E`,并写明 `-S` 可选。
2. 两份脚本都写"**装完必须完全重启 WorkBuddy**" —— **已不成立**:2026-09-30 实测 18:32 改配置、18:38 起就在真实用户发言上热生效;`PreToolUse` 同理。已改为"热生效,但仍须喂模拟载荷自证"。
3. `bash-output-guard.py` 安装示例 matcher 只写 `Bash` —— 但脚本有**两条**规则(`cat`>200 KB 走 Bash、`Read`>400 KB 走 Read 工具)⇒ 只挂 `Bash` 会让 Read 那条**静默失效**。已改为 `Bash|Read` 并注明原因。
## §5 未动 / 待拍板
- ⛔ **未改** `resolve_main` 的前缀判据缺陷 A/B(机制层,另开一棒)。
- ⚠️ **机制仍指向休眠中的 `67dfd365`**:下次投递会报「主会话不在活会话里」并**拒投(loud)**。回退=把它的标题改掉。
- ⚠️ `stop-collab.py::_gw_port()` 会把 `20090`(设备接入垫片)误认成网关(真网关 56975)—— 上一棒遗留,建议另开一棒。
- ⚠️ 本会话已 **660+ 次工具调用** ⇒ 按预算纪律**本轮收口后开新会话**。
## §6 出处
- 注册表复原依据:`归档/文档整理/dsh-server-docs-微调-20260924/settings.json.bak`(09-24 06:01)
- 备份:`E:/ProgramData/.workbuddy/settings.json.bak-restore3gates-20260930-1840`
- 自测脚本(可复跑):`tmp/_gates_dump.py`、`tmp/_gates_selftest.py`、`tmp/_gates_selftest2.py`、`tmp/_guard_health_test.py`、`tmp/_path_health_test.py`
- 脚本:`D:/github/dsh_shenxian/dsh-server-docs/07-scripts/{lock-guard-hook,bash-output-guard,skill-load-guard,stop-dialog-guard}.py`