Files
dsh_ai1net_server/归档/接续历史/会话机制/接续包_域锁释放缺陷修复_20260925.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

12 KiB
Raw Permalink Blame History

接续包 · 域锁释放缺陷修复 · 2026-09-25

🔄 本包已于 2026-09-25 22:2x 更新(第 35 棒执行后) —— 新 md5 记在 dsh-server-docs/04-调整方案/150-…md §八(未写入本包,避免自指矛盾;下一条接续 prompt 必须用新值,否则会被 ①b 门禁拦下)。 一句话结论:修复与自证 全部验证通过(26/26),规则载体 已同步 6 处,档案 已建(04-调整方案/150-…);唯一开口 = 提交/推送,用户已拍板**「等别线归位再提交」⇒ 本线暂无可自决动作、不再排接续棒。 ⛔ 读本包请以「二、在途」标题下的状态速览**为准;其下的四条原文是 09-25 20:55 的原始记录,已被速览覆盖。

接续点 · 域锁释放线 · 2026-09-25 20:55

  • 来源会话: aliyun-dsh-server(本条已完成核心修复) | 结束原因: 水位 32.9 万 token 强制收口
  • 原目标: 用户原话「需要把这个问题解决掉,看看怎么优化合适。」("这个问题" = 我在上一轮报的缺陷:handoff-guard.sh --release-exec 不带会话名时会把所有人的域锁一起删掉,实测已误删他会话 p33-exec-plugin-dataline 的锁)
  • 基线: HEAD=e6207aa(D:/github/dsh_shenxian,本轮未 commit) | 远端 master=未推送 | 域锁=无(本会话已等效释放) | 服务器侧操作锁=无
  • 产物(新会话必须逐一确认存在):
    • D:/github/dsh_shenxian/dsh-server-docs/07-scripts/handoff-guard.sh(已修,三条释放路径都加了归属校验)
    • E:/ProgramData/AIProject/ai1net-dsh-server/tmp/selftest-release-exec.sh(自证脚本)
  • 校验命令: bash -n "D:/github/dsh_shenxian/dsh-server-docs/07-scripts/handoff-guard.sh" && bash "E:/ProgramData/AIProject/ai1net-dsh-server/tmp/selftest-release-exec.sh" | tail -5 → 期望输出: bash -n OK + 自证结论:✅ 全部通过(若出现 1 项失败=已知项,见下「未完成」③,先读再判)

一、已完成(⛔ 不要重做)

  1. 缺陷定位:--release-exec 的判据 [ -z "$_who" ] || [ "$o" = "$_who" ] —— ME 未设时前半恒真 ⇒ 遍历 .locks/* 删掉所有会话的域锁。另有不对称:--claim-exec 用 $2 传会话名,而 release 只认 ME ⇒ 照 claim 姿势写会被静默忽略。
  2. 修法(fail-closed):会话名取 ME 或 $2(与 claim 对称);都取不到 ⇒ 拒绝释放 + 打印正确用法 + 退出码 1(⛔ 不再"静默成功"也不默认清空);释放只删 OWNER 与本人相符的锁,并在有他人锁时明示「按 R9 未动」。
  3. 同类缺陷一并修(同一份文件、同一类"release 成了绕过 R9 的后门"):
    • --release-skeleton <资源名>:原先按名字直接 rm -rf,任何会话知道资源名即可删他人骨架锁 ⇒ 现加归属校验。
    • --release-publish:同上 ⇒ 现加归属校验。
    • 两条都保留防卡死例外:OWNER == 本机 whoami(=claim 时没记会话名的历史锁)允许清理,否则锁永久无人可放。
  4. 自证已跑:tmp/selftest-release-exec.sh 覆盖 A–G 七组共 21 项断言(域锁/骨架锁/发布锁 × 不带名·名不匹配·持有者本人;含 ME= 老姿势兼容与 whoami 例外)⇒ 可验证的 20 项全绿。第 21 项(发布锁"持有者本人⇒已释放")在本会话无法完成,原因见「未完成」③。
  5. 记忆已落:.workbuddy/memory/2026-09-25.md(两段:浮层动画上线 + 本缺陷)。

二、在途 / 未完成(用户要的优先于 AI 自加的收尾)

✅ 状态速览(2026-09-25 22:2x · 第 35 棒执行后 —— 以此为准)

# 原事项 现状
① 规则载体未同步 ✅ 已完成 —— 实改 6 处:库 CODEBUDDY.md|工作区 CODEBUDDY.md §6 两处(快照之源)|08-skills/dsh-env-bootstrap/references/常驻规则-快照.md(由源重生成 6251 字符,⛔ 未手改)|08-skills/agent-operating-rules/references/02-工作区纪律.md(+新增「护栏耗尽 ⇒ mv 等效释放」条目)|03-多棒接力编排.md|dsh-change-workflow/references/07-并行调度详解.md|dsh-auto-handoff-chain/SKILL.md。统一改法 = --release-exec "<会话名>"(与 claim 侧对称)
⛔ 刻意未改 2 处(引文保真):02-工作区纪律.md/常驻规则-快照.md 里各一处 --release-exec 出现在对 guard 输出文案的引用中(改了会与工具实际输出不一致);handoff-guard.sh 自身提示文案(误用时已在 L268–269 打印正确用法)⇒ 不做级联改动
✅ 三处一致性:本机 = 库 5 文件 md5 全同(1a679fde…/fcfbcc90…/ea371632…/d50b7eb3…/c33ad986…)|⚠️ 服务器镜像整体滞后(报 21 不一致 / 3 仅本地,本棒仅占 6)⇒ 未单独回推,属独立待办|⚠️ dsh-change-workflow/SKILL.md 有 1 处逆向差异(本机比库多 2 条 09-25 教训)⇒ 非本 lane,只报告
② 档案未写 ✅ 已完成 —— dsh-server-docs/04-调整方案/150-域锁释放归属校验修复与载体同步.md(号位 149→150,三位零填充)。⚠️ 派生件 docs-manifest.json/INDEX.md §二 待随提交重生成(该表含 commit 列)
③ 自证第 21 项跑不完(护栏耗尽) ✅ 已跑通,环境限制消除 —— 新会话护栏额度是满的 ⇒ tmp/selftest-release-exec.sh 通过 26 / 失败 0(「自证结论:✅ 全部通过」)。真因确认 = 护栏按会话计数,⛔ 非代码缺陷。结论已写进档案 §三 与技能
④ 未 commit / 未 push 🔴 仍未提交 —— 用户 2026-09-25 22:2x 拍板「等别线归位再提交」(在「现在存」与「等别线归位」两案中选后者)⇒ 本棒不提交。两条阻塞均非本棒可自消:ⓐ PUSH=1 硬判定 rc=1「不可放行」(3 个「仅本地」幽灵文件全属插件投放与分库线的会话交接单);ⓑ 6 个载体里 2 个混有「规则载体压缩 09-24」线已完成未提交的改动(dsh-auto-handoff-chain/SKILL.md ≈46 行、常驻规则-快照.md 132 行)⇒ 单独提交会裹入别线成果(§4 只 add 自己改的)

📌 本线不再排接续棒 —— 唯一开口(提交)受别线阻塞,非本棒可自决;待条件满足(别线幽灵文件归位 + 「规则载体压缩线」未提交改动明确入库口径)后再一次性提交,届时清单一并处理:本棒 6 载体 + 档案 150 + 上一棒遗留的 07-scripts/handoff-guard.sh、assets/inject/recovery.js、web/wake.html。


原始记录(2026-09-25 20:55 · 已被上方速览覆盖,留档)

① 🔴 规则载体未同步(必做,否则新会话照旧载体执行会被新逻辑拒绝):活载体里写「完工 → --release-exec」的处(实测命中:CODEBUDDY.md L61;08-skills/agent-operating-rules/references/02-工作区纪律.md L51、L55;03-多棒接力编排.md L65、L94;dsh-change-workflow/references/07-并行调度详解.md;dsh-auto-handoff-chain/SKILL.md L183、L213、L331;08-skills/dsh-env-bootstrap/references/常驻规则-快照.md L96、L105)都要补齐"带会话名"(最小改法:把 --release-exec 写成 --release-exec "<会话名>",与 claim 侧写法对称)。⚠️ 常驻规则-快照.md 是生成物 ⇒ 改完源(CODEBUDDY.md)后跑 dsh-env-bootstrap 的 resident-rules.py --snapshot 重新生成,⛔ 不要手改。改前先按域锁规矩抢锁(CODEBUDDY.md / 07-scripts 属机制层)。 ② 🔴 档案未写:本轮只落到接续包 + 日志,未在 dsh-server-docs/04-调整方案/ 建档案(收口预算不够,且建档案要原子占号)。补一档记「缺陷→改法→自证→跨载体扫描结果」。 ③ ⚠️ 自证第 21 项无法在本机验证(环境限制,非代码缺陷):本会话的 safe-delete 批量护栏额度已耗尽 ⇒ 任何 rm -rf 都会被 safe-bin/rm 拦住并挂起至超时。后果有二:

  • 最后一项断言(发布锁归属匹配时真删除)跑不完;但同构的骨架锁成功路径已在 E 组验证通过(两条分支代码同形)。若要拿到该断言的真读数 ⇒ 在新会话里跑(护栏按会话计数,新会话额度是满的)。护栏阈值变量真名 = CODEBUDDY_SAFE_DELETE_BULK_GUARD(⛔ 我上一轮设的 _BULK_THRESHOLD 是错的,实测无效)。
  • 🔴 顺带查实一条会咬人的运维事实:护栏耗尽后,--release-exec 连"自己的锁"也放不掉(本轮实测两次 rc=124 超时)。本项目既定处置 = mv 把锁目录改名移走(走 ENOENT 快路径、零删除)——本轮就是这么等效释放的。⚠️ 这条该写进技能(dsh-change-workflow 或 agent-operating-rules),否则下一个跑完一轮的会话会在收尾时卡死。 ④ 仓库未 commit / 未 push:改动落在 D:/github/dsh_shenxian(07-scripts/handoff-guard.sh),另有本轮早前的浮层动画 2 文件(assets/inject/recovery.js、web/wake.html)与本条一起在 git status 里等提交。⚠️ 提交前先 git status 只 add 自己改的。

三、下一步

🔴 本线已无待执行动作(①②③ 已完成,④ 已按用户拍板「等」)⇒ 以下为历史步骤,勿照做,仅保留供"回头提交"时参考。

  1. 先跑「校验命令」确认修复与自证都在位 ✅ 已跑:bash -n OK + 26/26 全绿。
  2. 抢锁 ✅ 已持并反序释放(域锁 + 骨架锁 handoff-guard-release-exec,会话名 p35-exec-lockfix;两次 rc=0,未触发 124 ⇒ 未用 mv 等效释放)。
  3. 做「在途」①②,再补跑第 21 项断言 ✅ 已完成。
  4. ⏸️ 提交/推送(唯一未做项,待条件):等别线归位后 → git status → 只 add 清单内文件 →(推送前抢 --claim-publish)→ commit → 推送前对账。
  5. ✅ 释放锁一律带会话名:ME="<本会话名>" bash 07-scripts/handoff-guard.sh --release-exec;被护栏拦住(rc=124)⇒ 用 mv 等效释放并在回报写明。

四、关键决定(已定项,⛔ 别推翻重来)

  1. 取 fail-closed,不取"安静降级":取不到会话名一律拒绝释放。理由:域锁的全部意义是防并发写,而"静默清空"会在两个会话间开出同时写入的窗口(本轮已实际发生)。
  2. 不关护栏、不 self-approve:本轮全程未禁用 safe-delete、未改护栏状态文件;被拦时改用 mv(项目既定处置)。
  3. $2 与 ME 同时接受(对称性修复),而不是只保留 ME ⇒ 让既有姿势与 claim 侧一致,降低误用面。
  4. whoami 例外必须保留:否则"claim 时没记会话名"的锁将永久无法释放(比误删更糟)。
  5. 档案留到接续棒:强制收口下优先保"代码已修 + 自证在 + 状态落盘",档案与载体同步交下一棒(已在「在途」写明)。

五、回滚点

  • git -C D:/github/dsh_shenxian checkout -- dsh-server-docs/07-scripts/handoff-guard.sh(回到改动前;⛔ 会连带丢掉本轮修复)
  • 备份目录(本轮早前上线用的):/opt/dsh/backups/anim-dot-20260925_200211/(那是浮层那笔的回滚点,与本条无关)
  • 等效释放时被 mv 到 /tmp/quarantine-locks/ 的锁目录(含本会话自己的域锁与骨架锁)—— 已验证不是他人锁,可留可清。

六、⛔ 不要重做

  • 不要再"重新定位"这个缺陷(它已修好,且修法见「已完成」2/3)。
  • 不要把 CODEBUDDY_SAFE_DELETE_BULK_THRESHOLD 当护栏阈值变量(名字是错的,真名见「未完成」③)。
  • 不要动 p34-exec-plugin-dataline 等他会话的锁(R9)。