发布:常驻文档按现行形态重写 + 作业规矩/01 先并后删

一、常驻机制文档 references/supervise-persistence.md(整份重写 410→469 行)
- 照抄段由废弃的 start-supervise.ps1 形态,改为现行形态:
  计划任务 collabd-keepalive-<区>(每 5 分钟)→ pythonw.exe → supervise-launch.py → collabd.py --supervise
- 旧 ps1 形态整体降级为「§四 旧形态留痕」(逐条标 🟠,内容一字未删,供读老日志/老进程用)
- 判据订正:LastTaskResult 在长驻运行中是 267009(旧口径「必须 0」属"跑一次就退"时代,已作废);
  BOM 那条随 ps1 形态一并降为历史;另两条仍有效(CODEBUDDY_CONFIG_DIR 空库 / WorkingDirectory 必须是工作区根)
- 删除 assets/start-supervise.ps1.tpl —— SKILL.md、manifest.md、collabd.py、selftest.py 四处早已按「该模板已删除」口径,本次把磁盘与文档对齐

二、references/作业规矩/01 先并后删(用户选定 A 方案:不丢内容 + 只剩一处)
- 判据类并入 references/02-功能优先协作协议.md:
  §3.2 补「规则冲突裁决顺序」「冲突 ≠ 门禁」;§3.3 补回完整语言转换表(原处"已收敛到通用技能"在并包后成了悬空指针);
  §5.3 铁律由五条补到六条 + 接上配套硬红线「只做正向迭代」;新增 §5.5「提报前必答三问 + 回话前自检」
- 排版类并入 references/03-回复排版-核心块.md 的「完整版」段(十四条反模式 / 骨架路由表 / 文案点名主体 / 文档直入主题)
  该段放在 REPLY-CORE 标记之外 ⇒ 每轮注入块逐字未变(实测仍 1172 字符)
- 删除 references/作业规矩/01-协作与提报用户判据.md,并跟改 6 处引用(SKILL.md 第一屏表、作业规矩/00 索引表与两处指针、
  作业规矩/03-多棒接力编排、00 的 frontmatter 变更记录)——含一处二级指针「见 §6 第 0 条」,已改指 03 完整版段

三、判据与卫生
- pitfalls.md:P0-74 去冗余(7107 → 5982 B,重复叙述合并),「沉淀纪律」由 FAIL 1 转绿
- install.py:manifest_files() 补排 logs/ —— 与它自己「运行日志不入表」的口径一致,否则跑一次钩子表就过期
- .gitignore:补 logs/;撤跟踪 logs/_dr_probe.json(钩子输出转储,全包零引用)
- references/manifest.md 用生成器重算:66 份文件,语法失败 0

验收读数:selftest.py rc=0 PASS 99 / FAIL 0(另 1 条报告型不计入);
session-rules-check.py fail 0 / warn 1("此刻无活会话",正常态)/ ok 13;改动文件行尾全 LF。
This commit is contained in:
admin committed 2026-10-07 00:32:47 +08:00
1 parent 9fd120f40b
commit e5dfb6e4ef
14 files changed
+456 -721

No files matched your search

+29 -39
View File
@@ -1131,7 +1131,7 @@ os.environ["DSH_COLLAB_WS"] = <TEST_WS>
⇒ **一次都没触发过**,界面却显示 ACTIVE。**判"真会触发"要看
`schedule_type='recurring'` ∧ `next_run_at` 非空**。
**三个秒退坑**(详 ⇒ `supervise-persistence.md`):
**三个秒退坑**(详 ⇒ `supervise-persistence.md`;⚠️ ③ 随 `.ps1` 形态 2026-10-06 整套废弃,⛔ 仅存历史):
① 不设 `CODEBUDDY_CONFIG_DIR` ⇒ 退回读 **0 字节空库** ⇒ `no such table: sessions`
⇒ 闸二永久失效 ⇒ **检查会话永远建不出来**(**看着在跑,其实在瞎报**)
⇒ ✅ 正解用机制自带配置项 **`host_db`**(它本就优先于环境变量);
@@ -1818,8 +1818,10 @@ PID 72088 in_job=True 在作业对象内 ← 🔴 决定性:还在作
**口径边界(⛔ 别搞反)**:本现象**不是故障**。`supervise-persistence.md` 口径明写:
常态=「调用技能完成目标时起后台任务 + 检查程序」,**会话一收工就断,断了自己会补**
(实测补起延迟 1~2 分钟)。⭐ **只有「目标做完还要继续跑」才需要计划任务那一层** ——
且那层**是可选,⛔ 不许当欠项摊**(用户 2026-10-04 当场订正过)。
(实测补起延迟 1~2 分钟)。⭐ **只有「目标做完还要继续跑」才需要计划任务那一层**。
🟠 本行原写「那层**是可选,⛔ 不许当欠项摊**」(2026-10-04 订正)——**已被 2026-10-05 用户拍板推翻**:
计划任务现在是**既定形态**(`collabd-keepalive-<区>` 每 5 分钟兜底,开关 `collabctl.py on|off`)。
⚠️ 两句话不矛盾:**日常不必操心**(机制自己装),但它**是既定形态**,⛔ 不是"可有可无的选项"。
---
@@ -2469,8 +2471,8 @@ INBOX = '…\ai1net-dsh-server\tmp\supervise-inbox'
PowerShell 是**控制台程序** ⇒ 每次触发都分配 `conhost.exe` ⇒ **闪一下**。
- 🔴 **为什么"反复"闪**:该任务触发器 `-AtLogOn` + `RestartCount 999 / RestartInterval 1min`
⇒ **起来就不会安静**。
- 🔴 **触发链**:宿主钩子 `supervise-ensure-hook.py`(每次 `UserPromptSubmit`)→
`collabd.py --ensure` → **就地起失败** → `_escalate_to_keeper()` → 建/启旧任务 → 闪窗。
- 🔴 **触发链**:钩子 `supervise-ensure-hook.py`(每次 `UserPromptSubmit`)→ `collabd.py --ensure`
→ **就地起失败** → `_escalate_to_keeper()` → 建/启旧任务 → 闪窗。
实测日志逐字:`常驻自我供给(计划任务):✅ 已建本区计划任务 collabd-supervise-ai1net-dsh-server`。
### 三、✅ 修法(收敛成**同一个形态**,⛔ 不留第二套)
@@ -2493,50 +2495,38 @@ INBOX = '…\ai1net-dsh-server\tmp\supervise-inbox'
### 三·补、🔴 2026-10-06 二次收口(第一次只改了动作,没改名字、也没扫旁路)
**三个漏网**(本轮实测抓到,`selftest` 探针一度只扫 `collabd.py` ⇒ 全都没报警):
**三个漏网**(本轮实测抓到;探针当时只扫 `collabd.py` ⇒ 全没报警):
1、**任务名两套并存** —— 见上面第 3 条的订正。现已统一 `collabd-keepalive-<区>`;
触发形态也对齐(`-AtLogOn` → **每 5 分钟重复触发**;去掉 `RestartCount 999/1min` ——
每 5 分钟重复本身就提供重拉,每分钟重启是多余抖动)。本区遗留的旧名任务已 `Disable`。
2、**`init_workspace.py` 是第二个建任务者** —— 自带 `_register_keeper_task()` + `_keeper_task_state()`,
动作写 `powershell.exe -File start-supervise.ps1`、还要铺 `assets/start-supervise.ps1.tpl`、
自检里有 `_ps_check()`(验 ps1 语法)。**整份删掉**(含 `--with-keeper` / `--no-task` 两个开关),
改为只检查 `supervise-launch.py` 在位并指向唯一入口 `collabctl.py`。
⛔ **建任务只许有一处实现** = `collabctl.py`(受 `supervise.switch` 总电闸管辖);
自己建就绕过开关,是"第二条起法"。模板文件一并删除。
3、**守形态的探针打偏** —— `t_keeper_legacy_ps1_form_gone` 原来只 `read_text("collabd.py")`。
✅ 已扩成扫**全族**(`collabd.py` / `init_workspace.py` / `collabctl.py`),并新增两条判据:
「**任务名口径唯一**」、「`init_workspace.py` 旧形态死代码已清」。
1、**任务名两套并存**(见上条第 3 项订正)⇒ 已统一 `collabd-keepalive-<区>`,
触发形态同步对齐(`-AtLogOn` → **每 5 分钟重复触发**;去掉 `RestartCount 999/1min`)。
2、**`init_workspace.py` 是第二个建任务者** —— 自带 `_register_keeper_task()`/`_keeper_task_state()`/
`_ps_check()`(验 ps1 语法),还铺 `assets/start-supervise.ps1.tpl`。**整份删掉**
(含 `--with-keeper`/`--no-task` 开关),改为只检查 `supervise-launch.py` 在位。
⛔ **建任务只许有一处实现** = `collabctl.py`(受总电闸 `supervise.switch` 管辖);
自己建就绕过开关,就是"第二条起法"。
3、**守形态的探针打偏** —— `t_keeper_legacy_ps1_form_gone` 原来只读 `collabd.py`。
✅ 已扩成扫**全族**(`collabd.py`/`init_workspace.py`/`collabctl.py`),并新增两条判据:
「**任务名口径唯一**」「旧形态死代码已清」。
⚠️ **探针本身的坑**:新增的"任务名唯一"判据**扫文本**,第一版**误红** ——
它命中了 `collabctl.py` 里 `SCHED_TASKS = [...]` 那段(那是**故意**列旧名去禁用的)。
⇒ 必须先 `re.sub` 剥掉该块再扫。**这是本项目第三次踩"判据扫到自己的否定句"**
(前两次:查"PRD 有没有视觉词"命中免责声明、查"有没有六份旧产出"命中 PRD 里的禁令文本)。
⚠️ **另一条我自己的操作坑**:用 python 脚本读写 `init_workspace.py` / `collabd.py` 后,
行尾从**纯 LF 被转成纯 CRLF**(技能包其余 7 个同族文件都是 LF)—— 已用 `write_bytes` 还原为 LF。
⇒ **凡用脚本改技能源码,改完要核行尾**(否则 diff 里整个文件显示为"全改",审不出真改动)。
⚠️ **探针自己的坑**:新判据"任务名唯一"**扫文本** ⇒ 第一版**误红**,命中了 `collabctl.py` 里
`SCHED_TASKS = [...]`(那是**故意**列旧名去禁用的)⇒ 必修 `re.sub` 剥掉该块再扫。
**本项目第三次踩"判据扫到自己的否定句"**(前两次:查 PRD 视觉词命中免责声明、查六份旧产出命中禁令文本)。
⚠️ **另一个操作坑**:脚本读写这两个 `.py` 后行尾由**纯 LF 变纯 CRLF**(同族其余 7 个都是 LF)⇒ 已还原。
**凡用脚本改技能源码,改完必核行尾**(否则整个文件显示为"全改",审不出真改动)。
### 四、✅ 验收(2026-10-05 12:42 实测)
- 跑一次 `_escalate_to_keeper()` ⇒ 回读任务动作:
```
EXE=E:\ProgramData\.workbuddy\binaries\python\versions\3.13.12\pythonw.exe
ARG="E:\ProgramData\AIProject\ai1net-dsh-server\.workbuddy\collab\supervise-launch.py"
WD=E:\ProgramData\AIProject\ai1net-dsh-server
```
⇒ **不再是 `powershell.exe`**(grep `New-ScheduledTaskAction -Execute 'powershell.exe'` ⇒ **0 命中**)。
- 回读任务动作:`EXE=…\pythonw.exe`/`ARG=…/.workbuddy/collab/supervise-launch.py`/`WD=<工作区根>`
⇒ **不再是 `powershell.exe`**(`grep "New-ScheduledTaskAction -Execute 'powershell.exe'"` ⇒ **0 命中**)。
- **零 PowerShell 看守残留**:`Get-CimInstance` 筛 `powershell.exe` 且命令行含 `start-superv` ⇒ **空**。
- **三常驻全部 `ppid=3924`(调度器)**,且**三个都是启动器形态**:
· `48372` `<ai1net>/…/supervise-launch.py`|· `61956` `<vibe>/…/supervise-launch.py`|· `63684` `<技能>/…/board-launch.py`
- **三常驻全部 `ppid=3924`(调度器)且都是启动器形态**:`48372` ai1net/`61956` vibe/`63684` 看板
⇒ 父链断在调度器 ⟹ **真常驻**;形态统一 ⟹ **不会再长出第二套起法**。
### 五、⛔ 教训(一句话)
### 五、⛔ 教训
**"改了主路径" ≠ "把旁路也改了"** —— 上一轮把常驻主体收敛成"启动器形态",却漏了这个**自我供给旁路**;
它平时不吭声,**只在你最不希望的时候闪你一下**(还带着 `RestartCount 999`)。
⇒ **凡"同一种东西有第二条起法",收口时必须 `grep` 全文找一遍**(本次判据 = 全文搜 `New-ScheduledTaskAction` 与 `.ps1`)。
**"改了主路径" ≠ "把旁路也改了"** —— 漏掉的那条**自我供给旁路**平时不吭声,专挑你在用时闪一下。
⇒ **凡"同一种东西有第二条起法",收口时必须全文搜一遍**(判据=`grep New-ScheduledTaskAction` 与 `\.ps1`)。
---