AI 与维护者接手 Playbook

July 7, 2026 · View on GitHub

相关文档:

本文是给后续维护者和 AI Coding Agent 的接手手册。它不是 README,也不是完整开发指南;它的目标是防止没看懂架构就改代码、把不同权限链路混在一起、把用户上下文问题误判成权限问题、把 ProbeHost 问题误判成普通菜单开关问题,或者把第三方软件异常随意归因到本项目。

1. 接手前必须先读什么

任务类型必读文档重点确认
普通右键菜单 Bugdeveloper-guide.mdregistry-model.mdprocess-and-privilege-flows.mdshell verb 还是 shellex handler;状态来自注册表还是 ContextMenuStateStore;是否涉及 Registry Write Protection。
Win11 新菜单 Bugwindows11-context-menu.mdprocess-and-privilege-flows.mdblocked list 写到 HKLM 还是 HKEY_USERS\<SID>;snapshot 是否带 frontend userContext。
ShellNew / SendTo / WinX Bugspecial-menus.mdprocess-and-privilege-flows.md是否需要 SID、ProfilePath、LocalAppData/RoamingAppData;不要走普通菜单 catalog。
服务安装 / 开机启动 Bugprocess-and-privilege-flows.mddeveloper-guide.mdtroubleshooting.md是服务生命周期还是运行时操作;是否应走 UAC bootstrapper;是否需要 --user-sid
TrayHost / 前端启动 Bugprocess-and-privilege-flows.mddeveloper-guide.md是否是链路 C;SessionId、WTS token、用户桌面是否正确。
Restart Explorer Bugprocess-and-privilege-flows.mdtroubleshooting.md是否拿到前端用户 SessionId;是否只处理同 Session 的 explorer.exe
Deep Analysis / ProbeHost Bugdeep-analysis-probehost.mdbuild-and-release.mdProbeHost 架构、依赖、request/result、stderr、失败是否属于预期限制。
全局搜索 Bugdeveloper-guide.mdtroubleshooting.md当前候选池只覆盖传统右键菜单分类和 Win11;跳转后是否消费 pending filter。
构建 / 发布 Bugbuild-and-release.mddeep-analysis-probehost.mdnative ProbeHost 多架构目录、MSBuild/C++ toolchain、installer/portable 参数。
UI / 主题 / 本地化 Bugdeveloper-guide.mdtroubleshooting.mdFrontendSettingsServiceFrontendThemeServiceLocalizationService 的启动顺序和设置路径。
新增 Featuredeveloper-guide.mdprocess-and-privilege-flows.md,再读对应专题先选正确链路和模块,再决定是否新增 PipeCommand、服务逻辑或前端页面。

2. 排查 Bug 的第一原则:先判定链路

分析任何 Bug 前,先回答这些问题:

  1. 这个 Bug 涉及哪个进程?
  2. 这个 Bug 走哪条链路?
  3. 是否需要用户 SID?
  4. 是否需要 SessionId?
  5. 是否涉及注册表写入?
  6. 是否涉及第三方 Shell Extension?
  7. 是否涉及 UAC bootstrapper?
  8. 是否只是 UI / 前端状态问题?

不要一上来就改代码。不要一上来就归因到“拦截功能”或“权限不够”。本项目中“权限”“用户 SID”“用户 hive”“SessionId”“桌面位置”是不同概念,错误归类通常会导致改错模块。

3. 四条链路速查

链路用途不适合做什么最常见误用
链路 A:Frontend -> Backend Pipe -> Service普通 runtime 操作:传统菜单开关、Win11 blocked list、SpecialMenu、AutoStart 运行时读写、Restart Explorer。不适合安装/卸载服务,不负责弹 UAC。忘记解析 frontend userContext,导致用户级注册表写到错误 hive。
链路 B:Frontend -> UAC Bootstrapper服务安装、修复、卸载、停止、设置服务启动模式。不适合普通菜单开关、Win11 禁用、SpecialMenu 修改。把 elevated process 当成长期运行后端,或用它自己的 HKCU 当用户 hive。
链路 C:Service -> User Session Process后端服务在交互式用户 Session 中启动 TrayHost / Frontend。不适合注册表修改。从服务 Session 直接显示 UI,或只看 SID 不看 SessionId。
链路 D:Frontend -> ProbeHostDeep Analysis 隔离探测第三方 Shell Extension。不适合写注册表、执行菜单命令、提权。把 ProbeHost crash 当成普通菜单开关失败。

4. 故障归因纪律

如果用户报告“某个第三方软件 / 驱动 / 安装器异常”,不能直接归因到 ContextMenuMgr。必须先找证据。

需要确认的问题为什么
当时 ContextMenuMgr 是否在运行没运行时通常不能直接归因。
Backend Service 是否在运行普通前端退出不代表后端退出。
Registry Write Protection 是否开启只有开启相关保护才可能影响第三方写菜单。
ShellNew ACL Lock 是否开启它只影响新建菜单排序相关 key,不是全局注册表。
日志中是否有对应时间点的操作没有时间线证据不能乱归因。
是否有 Access Denied / UnauthorizedAccessException没有拒绝证据不能直接说是权限拦截。
受影响的注册表路径是否属于项目保护范围不在范围内一般不能归因。
关闭保护 / 停止服务后是否可复现用 A/B 验证排除误判。
第三方安装器自身日志怎么说很多失败和本项目无关。

没有日志证据、注册表路径证据、功能开启状态证据时,不要把第三方软件或驱动安装异常归因到 ContextMenuMgr。

例如第三方驱动安装异常,不应默认认为是右键菜单新增项拦截导致。除非能证明安装器正在写入本项目保护的右键菜单相关注册表路径,并且被 Registry Write Protection 或 ACL deny 拒绝,否则它更可能是安装器自身、系统环境、安全软件、驱动残留或其它原因。

5. Feature 开发前的选择表

想加的功能应优先放在哪层不应该放在哪层原因
新普通菜单操作后端服务 + Backend Pipe + ContextMenuRegistryCatalogUAC bootstrapper、前端直接写注册表普通 runtime 操作应走链路 A,由服务执行高权限写入。
新 Win11 菜单操作Windows11ContextMenuCatalog / Windows11BlocksService + Backend Pipe传统 shell / shellex 开关逻辑Win11 新菜单靠 blocked list 和 userContext。
新 SpecialMenu 操作SpecialMenuService + Backend PipeContextMenuRegistryCatalogShellNew / SendTo / WinX 有独立模型和用户上下文要求。
新服务管理操作BackendServiceManager + BackendServiceBootstrapper普通 runtime pipe handler服务生命周期才需要链路 B 和 UAC。
新托盘功能TrayHost 或服务到用户 Session 链路后端服务直接显示 UI托盘是每用户 UI,必须在交互式 Session。
新开机启动行为AutoStartService、bootstrapper、FrontendAutostartLauncher只写 Run key 或只改服务启动模式开机启动同时涉及服务启动模式和用户级 policy。
新全局搜索字段ContextMenuGlobalSearchService 和目标页面 filter每次输入访问后端搜索应使用本地候选池,刷新由 snapshot/通知驱动。
新 Deep Analysis 能力ContextMenuDeepAnalysisService + ProbeHost前端或后端直接加载第三方 DLLShell Extension 运行时探测必须隔离。
新构建产物build.ps1Scripts/Build.Common.psm1Build-Target.ps1手工复制发布文件构建产物要保持 CI、installer、portable 一致。
新 UI 设置项前端设置服务,必要时通过 Backend Pipe 同步后端绕过设置服务或直接写高权限注册表设置要有本地持久化、服务同步和错误处理。

6. Bug 排查模板

## Bug 排查记录

### 现象

### 影响范围

### 涉及功能

### 初步判定链路

- [ ] 链路 A:Frontend -> Backend Pipe -> Service
- [ ] 链路 B:Frontend -> UAC Bootstrapper
- [ ] 链路 C:Service -> User Session Process
- [ ] 链路 D:Frontend -> ProbeHost
- [ ] 纯前端 UI
- [ ] 构建 / 发布

### 是否需要用户 SID

### 是否需要 SessionId

### 相关日志

### 相关注册表路径 / 文件路径

### 已排除的原因

### 当前最可能原因

### 修改计划

### 验证步骤

7. 改代码前检查清单

  • 我已经确认这属于哪条链路
  • 我已经确认是否需要 userContext
  • 我没有使用服务 HKCU 当用户 HKCU
  • 我没有把 UAC bootstrapper 用作普通 runtime backend
  • 我没有从服务 Session 直接启动 UI
  • 我没有在前端 / 后端直接加载 Shell Extension DLL
  • 我没有绕过 Registry Write Protection preflight
  • 我没有把 ShellNew ACL Lock 和 Registry Write Protection 混在一起
  • 我已经查过相关日志
  • 我已经写出手动验证步骤

8. 常见错误归因示例

例 1:Win11 禁用后刷新丢失

错误归因: “前端刷新把状态覆盖了。”

正确方向: 先查 Win11 snapshot 是否带 frontend userContext,blocked list 是否写到正确 HKEY_USERS\<SID>

例 2:开机启动不生效

错误归因: “Run key 没写。”

正确方向: 先查服务启动模式、StartWithWindows policy、BackendServiceBootstrapper--user-sidFrontendAutostartLauncher 是否能找到交互式 Session。

例 3:ShellNew 解锁失败

错误归因: “权限不够。”

正确方向: 先查 ShellNew order key ACL、WorldSid deny rule、是否用正确 SID 打开 HKEY_USERS。ShellNew lock/unlock 不再走 take ownership fallback;如果 ACL 已损坏到 ChangePermissions 无法修改,应外部修复。

例 4:Deep Analysis 失败

错误归因: “菜单项坏了。”

正确方向: 先查 ProbeHost 架构、依赖、SpecificHandler 是否支持、Shell Extension 是否需要 Explorer 聚合环境。失败通常不影响普通菜单开关。

例 5:第三方驱动 / 安装器异常

错误归因: “右键菜单拦截导致安装失败。”

正确方向: 先确认 Registry Write Protection 是否开启、是否有本项目日志、是否有 Access Denied、目标路径是否属于右键菜单保护范围。没有证据不要归因。

9. 给 AI Coding Agent 的硬性要求

  • 回答前必须先判断链路。
  • 修改前必须先说清楚要改哪些文件、为什么是这些文件。
  • 遇到用户上下文问题时必须区分 SID、HKCU、HKEY_USERS、SessionId。
  • 遇到第三方软件异常时必须先找证据,不准直接归因。
  • 遇到 ProbeHost 问题时不准改普通菜单开关逻辑。
  • 遇到 Win11 状态问题时必须检查 userContext。
  • 遇到 SpecialMenu 问题时必须检查 SpecialMenuService,不要先改 ContextMenuRegistryCatalog
  • 遇到服务安装问题时必须检查 BackendServiceManager / BackendServiceBootstrapper,不要先改 NamedPipeBackendServer
  • 服务卸载、强力修复和 install-or-repair 的 stale service 恢复必须共用 bootstrapper 的容错移除路径;停止失败只能作为警告记录,不能阻止后续 SCM 删除请求。
  • 遇到 UI 启动 / TrayHost 问题时必须检查 FrontendAutostartLauncher / WTS 链路。
  • 如果不确定,应该输出“当前证据不足”,不要编造原因。

10. 什么时候需要更新文档

  • 新增 PipeCommand
  • 新增 SpecialMenuKind
  • 修改 Registry Write Protection
  • 修改 ShellNew ACL Lock
  • 修改 Win11 blocked list
  • 修改 AutoStart
  • 修改 TrayHost 启动
  • 修改 ProbeHost 架构选择
  • 修改 build/release
  • 修改 RuntimePaths
  • 修改全局搜索范围