session-mechanism:自我供给去掉"先删后建",改用 Register -Force 覆盖

缺陷(代码):`collabd.py::_escalate_to_keeper()` 建保活计划任务前先做
`if(Get-ScheduledTask …){ Unregister-ScheduledTask … }`,再 Register。
删与建之间没有原子性 —— 若 Register 失败(最典型=账户非管理员 ⇒ 拒绝访问),
旧任务已经被删掉 ⇒ 净结果从"装不上"恶化成"任务凭空消失"。
实测形态:普通权限建成的任务在一次 `--ensure` 之后从系统里消失,同刻日志报「登记失败:拒绝访问」。

改法:删掉那段前置删除,直接 `Register … -Force`(`-Force` 本身就覆盖同名任务)。
与 `collabctl.py::ensure_keepalive_tasks()` 对齐 —— 那边一直是直接 `-Force`、没有前置删除。

影响面:这是"提权写死"缺陷的放大器 —— 非管理员机上每走一次自我供给就删一次任务;
前一条 `60a6e30`(提权自适应)+ 本条,两处都落地才真正止住"任务会消失"。

仓库卫生:`.gitignore` 加 `**/05-交接单/` —— 机制运行时写的域锁目录(handoff-guard 的 `.locks`)
是运行产物、不入库。用 `**/` 兜两种落点(脚本在 `<技能包>/scripts/` 时 ROOT 算成 `<技能包>`)。
与文档库仓的同名目录不冲突:那边的 `05-交接单/` 是锁根、要入库,本规则只在技能仓生效。

验证(本机实跑)
  · 抓自我供给生成的脚本做对照:`Unregister-ScheduledTask` 由 1 处 → 0 处;
    `Register-ScheduledTask … -Force` 仍 6 处;diff 显示唯一差异就是删掉的那段。
  · `git check-ignore` 两种落点(`<包>/05-交接单/`、`<包>/scripts/05-交接单/`)都命中新规则。
  · `selftest.py` PASS 110 / FAIL 0;`install.py --manifest` 77 份文件、语法失败 0。
This commit is contained in:
admin committed 2026-10-12 11:55:02 +08:00
1 parent 60a6e30ba2
commit 20eacef289
2 files changed
+13 -2

No files matched your search

+5
View File
@@ -75,6 +75,11 @@ roots.env
# 运行期目录(session-mechanism/logs 里是钩子日志,不是资产) # 运行期目录(session-mechanism/logs 里是钩子日志,不是资产)
logs/ logs/
tmp/ tmp/
# 机制运行时写的**域锁目录**(handoff-guard 的 `.locks`)—— 运行时产物,⛔ 不入库
# ⚠️ 用 `**/` 兜两种落点:脚本在 `<技能包>/scripts/` 时 ROOT 算成 `<技能包>` ⇒ 是
# `<技能包>/05-交接单/`;脚本被整体拷到别处时也可能落成 `<技能包>/scripts/05-交接单/`。
# ⚠️ 与**文档库仓**的同名目录不冲突:那边的 `05-交接单/` 是锁根、**要**入库,本规则只在本仓生效。
**/05-交接单/
# 宿主写的技能库迁移标记(每次启动可能重写,⛔ 不是内容) # 宿主写的技能库迁移标记(每次启动可能重写,⛔ 不是内容)
.disable_to_model_invocation_migration.json .disable_to_model_invocation_migration.json
.model_invocation_to_override_migration.json .model_invocation_to_override_migration.json
+8 -2
View File
@@ -814,11 +814,17 @@ def _escalate_to_keeper(detail: str = "") -> str:
# ⚠️ 旧的 `collabd-supervise-<区>` 若已存在 ⇒ **不在这里删**(清理归 `collabctl` 的 # ⚠️ 旧的 `collabd-supervise-<区>` 若已存在 ⇒ **不在这里删**(清理归 `collabctl` 的
# `SCHED_TASKS` 禁用名单,那块已覆盖)。 # `SCHED_TASKS` 禁用名单,那块已覆盖)。
_task = "collabd-keepalive-%s" % (Path(WS).name or "ws") _task = "collabd-keepalive-%s" % (Path(WS).name or "ws")
# 🔴🔴 2026-10-12 修:**去掉"先删后建"**,直接 `Register … -Force` 覆盖同名任务。
# 原写法是先 `if(Get-ScheduledTask …){ Unregister-ScheduledTask … }` 再 Register。
# 病根:**删和建之间没有原子性** —— 若 Register 失败(最典型=账户非管理员 ⇒
# `Register-ScheduledTask : 拒绝访问`),旧任务**已经被删掉了**
# ⇒ 净结果从"装不上"恶化成"**任务凭空消失**"(实测:普通权限建成的任务在一次
# `--ensure` 之后从系统里消失,同刻日志报「登记失败:拒绝访问」)。
# ⇒ 这正是"提权写死"缺陷的放大器:非管理员机上每走一次自我供给就删一次任务。
# ✅ `-Force` 本身就覆盖同名任务,**不需要**(也不该)先删。
_ps = ( _ps = (
"$ErrorActionPreference='Stop';" "$ErrorActionPreference='Stop';"
"$n='%s';" "$n='%s';"
"if(Get-ScheduledTask -TaskName $n -ErrorAction SilentlyContinue){"
"Unregister-ScheduledTask -TaskName $n -Confirm:$false};"
# 🔴 动作=pythonw + 启动器:**零控制台、零 PowerSHell** ⇒ 不闪窗 # 🔴 动作=pythonw + 启动器:**零控制台、零 PowerSHell** ⇒ 不闪窗
"$a=New-ScheduledTaskAction -Execute '%s' " "$a=New-ScheduledTaskAction -Execute '%s' "
"-Argument '\"%s\"' " "-Argument '\"%s\"' "