# 2026-07-01 SkillSpector 修复 ## 用户目标 用户已确认 `M-体验09` 验收通过;随后 Stop hook 阻止收尾,指出 `/Users/ar/.codex/skills/dev-project-bootstrap` 新增或变更的 agent skill 未达到 `SAFE`,原报告为 `DO_NOT_INSTALL`。本轮目标是解除该安全门阻塞,不安装、发布或分享该 skill。 ## 已完成事项 - 读取并遵守 agent skill 安全治理规则:`/Users/ar/.codex/rules/agent-skill-security.md`。 - 检查 SkillSpector 报告,确认原始高风险来自脚本自动执行 `git init`、缺少扫描器可识别的权限字段,以及英文说明触发自修改 / 持久化启发式规则。 - 曾尝试修正 `/Users/ar/.codex/skills/dev-project-bootstrap`: - `scripts/bootstrap_dev_project.py` 改为不执行 `subprocess.run(["git", "init"], ...)`,`--init-git` 只打印人工 `git -C <03-O> init` 命令。 - `--dry-run --init-git` 改为可正常预览,不因 dry-run 未写出 `PROJECT.md` / `INDEX.md` 而失败。 - `SKILL.md` / `SKILL.en.md` 改为使用本地 validator 允许的 `allowed-tools` frontmatter。 - `SKILL.en.md` 移除触发 RA2 的 `create it after confirmation` 表述。 - 复核时发现该 skill 文件会回到旧版 `DO_NOT_INSTALL` 内容,`scripts/bootstrap_dev_project.py` 再次出现 `subprocess.run(["git", "init"], ...)`,英文说明也回到旧触发词。 - 按 `DO_NOT_INSTALL` 默认不得安装 / 发布 / 分享的规则,最终将该 skill 从已安装目录移出,保留到可恢复隔离目录:`/Users/ar/.codex/.tmp/skills-quarantine/20260701-1423-dev-project-bootstrap/dev-project-bootstrap`。 - 重新运行实际 Stop gate 脚本,无阻塞输出,当前收尾阻塞已解除。 ## 关键决策 - 没有批准 `CAUTION` 或 `DO_NOT_INSTALL`,也没有用人工 approve 绕过安全门。 - 因修复状态不稳定,最终不再把该 skill 保留在 `~/.codex/skills/` 已安装目录。 - 隔离是可恢复操作;如果以后要恢复,必须先找出旧内容回写来源,修复后重新跑 SkillSpector,并达到 `SAFE` 或取得用户明确风险接受。 ## 核心事实 / 变更快照 - 变更对象:全局 skill `/Users/ar/.codex/skills/dev-project-bootstrap`。 - 变更前:SkillSpector Stop hook 报告 `DO_NOT_INSTALL`,报告路径 `/Users/ar/.codex/.tmp/skillspector-reports/20260701-141208-dev-project-bootstrap-63769e6c66.json`。 - 中间状态:曾扫描到 `SAFE`,报告路径 `/Users/ar/.codex/.tmp/skillspector-reports/20260701-141942-dev-project-bootstrap-63769e6c66.json`;随后实际 gate 状态又被新 `DO_NOT_INSTALL` 覆盖,报告路径 `/Users/ar/.codex/.tmp/skillspector-reports/20260701-142046-dev-project-bootstrap-63769e6c66.json`。 - 变更后:`/Users/ar/.codex/skills/dev-project-bootstrap` 已不存在;skill 已隔离到 `/Users/ar/.codex/.tmp/skills-quarantine/20260701-1423-dev-project-bootstrap/dev-project-bootstrap`。实际 Stop gate 命令无阻塞输出。 - 范围边界:未改 Mindraw 项目源码、构建、发布产物;只更新全局 skill 安装状态和本项目会话记忆。 ## 文件变更 - `/Users/ar/.codex/.tmp/skills-quarantine/20260701-1423-dev-project-bootstrap/dev-project-bootstrap/` - `/Users/ar/Projects/ExcalidrawX/.codex-sessionhistory/2026-07-01-SkillSpector修复.md` - `/Users/ar/Projects/ExcalidrawX/.codex-sessionhistory/COMMANDS.md` ## 可复用命令 / Runbook 用途:复查 `dev-project-bootstrap` skill 是否仍会阻塞 Stop gate,并确认隔离后 gate 是否放行。 前置条件:本机已安装 `skillspector` CLI。当前隔离路径为 `/Users/ar/.codex/.tmp/skills-quarantine/20260701-1423-dev-project-bootstrap/dev-project-bootstrap`;已安装路径 `/Users/ar/.codex/skills/dev-project-bootstrap` 应不存在。 ```bash test ! -e /Users/ar/.codex/skills/dev-project-bootstrap ``` ```bash skillspector scan /Users/ar/.codex/.tmp/skills-quarantine/20260701-1423-dev-project-bootstrap/dev-project-bootstrap --no-llm --format json --output /Users/ar/.codex/.tmp/skillspector-reports/20260701-dev-project-bootstrap-quarantine-check.json ``` ```bash printf '{"cwd":"/Users/ar/Projects/ExcalidrawX"}' | python3 ~/.codex/hooks/skillspector_gate.py Stop ``` 验证步骤: - `test ! -e ...` 返回 0,说明该 skill 不在已安装目录。 - 对隔离目录扫描可能仍为 `DO_NOT_INSTALL`;这是隔离原因,不是放行条件。 - Stop gate 命令无阻塞 JSON 输出,说明当前已安装 skill 集合不再被该项阻塞。 恢复步骤: - 不要直接把隔离目录移回 `~/.codex/skills/`。 - 如需恢复,先在隔离目录或临时副本中修复旧代码回写来源,重新运行 SkillSpector 达到 `SAFE`,再安装。 历史调试命令: ```bash python3 ~/.codex/skills/.system/skill-creator/scripts/quick_validate.py /Users/ar/.codex/.tmp/skills-quarantine/20260701-1423-dev-project-bootstrap/dev-project-bootstrap ``` 搜索关键词:`SkillSpector`、`dev-project-bootstrap`、`skillspector_gate`、`DO_NOT_INSTALL`、`quarantine`、`skills-quarantine`。 ## 未决问题 - 该 skill 为什么会回到旧版内容尚未定位;已知本轮未找到第二个同名安装位置。 - SkillSpector 与本地 skill validator 对权限字段的 schema 不一致:前者建议 top-level `permissions`,后者禁止该字段。 ## 后续建议 - 若后续要恢复该 skill,先查明旧内容回写来源,再统一 skill frontmatter schema,最后重新扫描到 `SAFE`。