{
  "$schema": "https://bestaiskill.com/schemas/agent-install/2.json",
  "skill": "git-safety-net",
  "built": "2026-10-26",
  "control_level": 4,
  "control_level_label": "L4 高权限",
  "capabilities": [
    "execute_command",
    "install_deps",
    "network",
    "write_file"
  ],
  "required_controls": {
    "agent": [
      "sandbox_recommended",
      "graded_authorization"
    ],
    "admin": [
      "approval_process",
      "rollback_support",
      "full_audit"
    ]
  },
  "evidence": [
    {
      "file": "scripts/",
      "summary": "Executes local scripts or commands: `git-safety-net/scripts/git_find_all_checkouts.sh` — Read-only: `find` + read-only Git queries (`status`, `rev-list`)"
    },
    {
      "file": "scripts/ 或 SKILL.md",
      "summary": "Declares dynamic installation of external language package dependencies"
    },
    {
      "file": "网络端点",
      "summary": "Declares external network access: Inbound/Outbound: `git fetch \"$REMOTE\" --prune` (`git-safety-net/scripts/git_loss_audit.sh`)"
    },
    {
      "file": "本地工作目录",
      "summary": "File I/O and artifact output: Out-of-repo backups: `git_export_before_drop.sh` defaults to `$HOME/.git-backups/<YYYY-MM-DD>-<repo>/`"
    }
  ],
  "verification": {
    "method": "第二遍独立重读 + 反查（不沿用第一遍结论，改从『找反例』角度切入）：① 对 6 个脚本逐个做『真正执行 vs 注释/heredoc 文本』区分，用 grep 逐条反查 fetch/ls-remote/push/curl/wget/ssh 的实际调用点；② 全目录 glob（含隐藏文件）核对文件清单，确认无未在任务清单中的脚本/二进制/混淆内容；③ 逆查『非破坏性』声明：搜 rm -rf、branch -D、reset --hard、stash drop、worktree remove、update-ref -d、gc 的出现位置并判断是执行还是注释/提示；④ 逆查『外部资源』：git/uv/sha256sum/tar/stat/lsof/find 的真实调用点，确认 uv 与 lsof 只在文档层出现；⑤ 夸大检查：把 SKILL.md 关于 merge-tree『sound 而非启发式』、『脚本非破坏性』、『备份能保住未跟踪文件吗』等声明与脚本代码逐条比对；⑥ 交叉核对 README 的能力清单与 SKILL.md/脚本实际实现是否一致；⑦ 交叉核对 evals.json 断言的纪律条款是否在 SKILL.md/references 中有对应条文。所有引用均以 Python 逐条 `in` 校验过原文（见 second_pass）。",
    "second_pass": [
      {
        "item": "external_deps 逐条反查调用点：git 系列命令",
        "status": "ok",
        "detail": "在 6 个脚本里逐条确认 git 子命令的真实执行点（fetch/worktree list/fsck --dangling/stash list/bundle create+verify/list-heads/reflog/for-each-ref/update-ref/check-attr/submodule status/cat-file/rev-list）。全部为执行路径上的真实调用，非注释。"
      },
      {
        "item": "external_deps：uv 与 lsof 是否真在脚本里",
        "status": "ok",
        "detail": "两者都不在脚本中执行：`uv run python -m unittest discover -s tests -p 'test_*.py'` 只出现在 SKILL.md § Maintainer verification（维护者本地跑测试）；lsof 只出现在 references/merge_verification.md 的退役 READ-DO 序列（macOS 探测进程占用）。已按『文档层工具』而非『运行时依赖』归类。"
      },
      {
        "item": "网络调用面是否存在遗漏（隐藏脚本/混淆内容）",
        "status": "ok",
        "detail": "glob 全量（hidden=true, gitignore=false）显示该 skill 目录仅 17 个文件：SKILL.md、3 个 references、6 个 scripts、6 个 tests、evals/evals.json、agents/openai.yaml，无可执行二进制、无压缩/混淆内容。全目录 grep curl/wget/gh/nc/python -c 零命中；唯一 https:// 出现在 find_all_checkouts 的 URL 归一化注释示例里。"
      },
      {
        "item": "反例排查：git_find_all_checkouts.sh 号称不联网，但脚本里有 `git fetch --all --prune`",
        "status": "ok",
        "detail": "该行（第 317 行）位于 `cat <<'FRESHNESS'` heredoc 内，是打印给用户看的建议，不在执行路径上；脚本头部 `# NON-DESTRUCTIVE: runs only \\`find\\` plus read-only Git queries` 与代码一致（唯一外部命令是 find 与只读 git 查询）。不构成 discrepancy，因此改为标注为『文本指导』。"
      },
      {
        "item": "反查『脚本非破坏性』是否属实（是否有删除/改写仓库对象）",
        "status": "ok",
        "detail": "对 rm -rf / branch -D / reset --hard / stash drop / worktree remove / update-ref -d / gc 全目录扫描：脚本内仅两处相关文本——preserve_danglers 的 `rm -f \"$OUT\"`（删除自己刚写失败的 patch 文件）与 loss_audit 的提示字符串 `never use 'git worktree remove --force'`。所有真正的破坏性命令（`git update-ref -d`、`git worktree remove`、`--force-with-lease` 等）只出现在 SKILL.md/references 供人执行的步骤中。"
      },
      {
        "item": "『写操作面』核对：备份到底写到哪里、是否会覆盖既有数据",
        "status": "ok",
        "detail": "export 脚本默认写 $HOME/.git-backups/<date>-<repo> 并可 --out 覆盖；preserve_danglers 的 --patch-dir 先绝对化再 mkdir -p；prepare_clone_retirement 强制 `[ ! -e \"$OUT\" ]`（拒绝已存在目录）、要求绝对路径、并 `case \"$OUT/\" in \"$CLONE/\"*|\"$SURVIVOR/\"*) die ...` 拒绝把备份放进被退役/保留的仓库内。三处均与 SKILL.md『备份放仓库外』一致。"
      },
      {
        "item": "凭证/全局配置读取面反查",
        "status": "ok",
        "detail": "全目录 grep --global / .gitconfig / credential / HOME 的结果：脚本内只有 export 的 `$HOME/.git-backups/...` 默认输出路径；`git config --global` 只出现在两处 references 中作为给用户的建议命令。prepare_clone_retirement 读取仓库私有配置时显式用 `git config --file <config> --no-includes`（不吞并用户全局配置）。无 token/env 读取。"
      },
      {
        "item": "实现原理是否夸大：『内容级判定是 sound 而非启发式』",
        "status": "ok",
        "detail": "与脚本逐行比对成立：脚本先 `git merge-base --is-ancestor` 判 ancestor，再 `git merge-tree --write-tree <base> <branch>` 比较结果树与 base 树；MT_RC>=128（git<2.38）时明确退回 NEEDS REVIEW 而非猜 MERGED。声明与实现一致，未夸大。"
      },
      {
        "item": "实现原理是否夸大：『独立 clone 退役不会丢任何东西』",
        "status": "discrepancy",
        "detail": "不是无限保证，而是有明确拒绝清单的『要么证明，要么拒答』：脚本对 promisor/partial clone、Git LFS 或 annex 对象库、tracked content filter、config 的 include.path/hooksPath 间接层、浅克隆、本地 submodule、linked worktree、clone 独有不可达对象一律 `unsafe` 退出，要求单独审计。因此它保证的是『在它能解析的范围内自包含』，LFS/annex 字节与外部内容管线仍需人工处理——SKILL.md 与 merge_verification.md 也照此表述（未夸大，但使用者容易忽略拒绝清单的含义）。"
      },
      {
        "item": "文件清单全量核对（glob vs 任务描述）",
        "status": "ok",
        "detail": "实际 17 个文件，与任务描述一致（SKILL.md 750 行/58KB；scripts 6 个；tests 6 个；references 3 个；evals/evals.json；agents/openai.yaml）。无多余目录（无 assets/templates/bin）。"
      },
      {
        "item": "evals.json 断言是否有对应纪律条款（评估与正文一致性）",
        "status": "ok",
        "detail": "抽查 3 条：eval#1 空 `--contains` → SKILL.md Mode C/规则 5；eval#4 `--is-ancestor` 退出码 → SKILL.md troubleshooting『A push or merge command lost its receipt』段；eval#6 autostash → references/prevention_practices.md 『A foreign commit adopted onto your branch』段第 4 条。均有正文对应，非孤立评分项。"
      },
      {
        "item": "README 能力清单与实现是否一致（跨文件交叉核对）",
        "status": "ok",
        "detail": "README 的 9 条 key features（reflog/fsck 恢复、审计全 worktree、pin refs/dangling-backup、内容级合并判定、worktree 退役 + all-refs bundle、对抗式多 agent 验证、外部 commit 检测、push/merge 落地判定、预防习惯）逐条在 SKILL.md 或脚本中找到对应实现；README『无第三方包；当前远端状态需要网络，离线审计用缓存 refs』与脚本的 fetch 降级逻辑一致。"
      },
      {
        "item": "SKILL.md/脚本中引用的『真实事故』叙事（440 行未跟踪工作、1128 行 renderer、24 文件 staged-deletion 窗口等）",
        "status": "unlocatable",
        "detail": "这些是作者自述的历史事件，仓库内没有对应的 issue/日志/附件可作为证据；只能确认它们被写进脚本注释与 references，无法独立复核数字本身。按纪律标记为无法定位，不作为可验证事实。"
      },
      {
        "item": "脚本自身的运行时依赖是否被完整声明（bash 版本、coreutils/BSD 差异、sha256sum 可用性）",
        "status": "ok",
        "detail": "prepare_clone_retirement 在缺 sha256sum/shasum 时 die；find_all_checkouts 的 file_mtime 对 BSD/GNU stat 差异做了整数校验后回退；所有脚本 `set -euo pipefail`（find_all_checkouts 为 `set -uo pipefail` 以容忍非零返回）——依赖声明与容错处理一致。"
      }
    ],
    "level": 1,
    "level_label": "V1 已固定",
    "commit": "d5c4678cb5d4fd6acc9c922690df035dbd33d247",
    "sha256": "b2b944f8a078459b51a69a8e5a1030dd2d7e8e990eab26b537455d38ff82d40d",
    "reviewed_by": null,
    "reviewed_at": null
  },
  "assessed_at": "2026-10-25",
  "method_version": "2.0",
  "mirror": {
    "archive": "https://skillpub.pages.dev/r2/v/2026-09-15/git-safety-net.tar.gz",
    "sha256": "b2b944f8a078459b51a69a8e5a1030dd2d7e8e990eab26b537455d38ff82d40d",
    "commit": "d5c4678cb5d4fd6acc9c922690df035dbd33d247"
  },
  "original": {
    "github": "https://github.com/daymade/claude-code-skills/tree/main/git-safety-net",
    "path": "git-safety-net",
    "commit": "d5c4678cb5d4fd6acc9c922690df035dbd33d247"
  }
}