diff --git a/.gitignore b/.gitignore index 03c0be2..e7d3576 100644 --- a/.gitignore +++ b/.gitignore @@ -75,6 +75,11 @@ roots.env # 运行期目录(session-mechanism/logs 里是钩子日志,不是资产) logs/ tmp/ +# 机制运行时写的**域锁目录**(handoff-guard 的 `.locks`)—— 运行时产物,⛔ 不入库 +# ⚠️ 用 `**/` 兜两种落点:脚本在 `<技能包>/scripts/` 时 ROOT 算成 `<技能包>` ⇒ 是 +# `<技能包>/05-交接单/`;脚本被整体拷到别处时也可能落成 `<技能包>/scripts/05-交接单/`。 +# ⚠️ 与**文档库仓**的同名目录不冲突:那边的 `05-交接单/` 是锁根、**要**入库,本规则只在本仓生效。 +**/05-交接单/ # 宿主写的技能库迁移标记(每次启动可能重写,⛔ 不是内容) .disable_to_model_invocation_migration.json .model_invocation_to_override_migration.json diff --git a/session-mechanism/scripts/collabd.py b/session-mechanism/scripts/collabd.py index da9dcb6..110341f 100644 --- a/session-mechanism/scripts/collabd.py +++ b/session-mechanism/scripts/collabd.py @@ -814,11 +814,17 @@ def _escalate_to_keeper(detail: str = "") -> str: # ⚠️ 旧的 `collabd-supervise-<区>` 若已存在 ⇒ **不在这里删**(清理归 `collabctl` 的 # `SCHED_TASKS` 禁用名单,那块已覆盖)。 _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 = ( "$ErrorActionPreference='Stop';" "$n='%s';" - "if(Get-ScheduledTask -TaskName $n -ErrorAction SilentlyContinue){" - "Unregister-ScheduledTask -TaskName $n -Confirm:$false};" # 🔴 动作=pythonw + 启动器:**零控制台、零 PowerSHell** ⇒ 不闪窗 "$a=New-ScheduledTaskAction -Execute '%s' " "-Argument '\"%s\"' "