#!/usr/bin/env bash # skill-deploy-drift-guard.sh — SessionStart:全機載入的那套 skill 跟它的正本對不上時,講出來 # # 為什麼存在(2026-08-16 查出來的實況): # `arcrun-kbdb-guardrails` 這套 skill 有兩份—— # 正本 arcrun_harness/.claude/skills/arcrun-kbdb-guardrails/ 有版控 # 產物 ~/.claude/skills/arcrun-kbdb-guardrails/ **全機每個專案真正載入的是這份** # 它們已經分家過一次,而且不是「一份新一份舊」:各自有對方沒有的東西。 # 家目錄那份長出了一整層 D91 影子表防守,**從來沒進過 git**——差一點就在同步時被蓋掉。 # 反方向也發生過:kbdb guard 的誤擋 bug 修好過,但修在別的拷貝上, # 於是它透過這份沒同步的產物又長回來(Leo/InkStoneCo#23,同一個形狀第 7 次)。 # # 🔑 這支 hook 的用途不是同步,是**讓「它們又不一樣了」這件事有人知道**。 # 同步是 `arcrun_harness/scripts/skill-deploy.sh` 的事,判斷也在那支裡; # 本檔**刻意只是一層殼**:沒有自己的邏輯,就沒有自己的漂移。 # # 三條設計約束: # 1. 沒事不出聲——乾淨時完全靜音,才不會被當成背景雜訊而被無視。 # 2. 從不擋人——SessionStart 一律 exit 0,這是通知,不是閘。 # 3. 環境不在就安靜退場——沒有 harness repo(雲端 session、別台機器)不該報錯。 # # ⚠️ 已知範圍限制:本 hook 掛在 InkStoneCo 的 SessionStart,所以只有「在 InkStoneCo 開 # session」時會檢查。那份 skill 是全機載入的,在別的專案裡編輯它一樣會漂,只是要等 # 下次有人開 InkStoneCo 才會被指出來。之所以先這樣,是因為改 ~/.claude/settings.json # 等於動全機共用框架——那是要 leo 點頭的事,不是這支腳本自己能決定的。 set -uo pipefail DEPLOY_SH="${CLAUDE_PROJECT_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}/arcrun_harness/scripts/skill-deploy.sh" # 環境不在 → 安靜退場(約束 3) [ -f "$DEPLOY_SH" ] || exit 0 OUT="$(bash "$DEPLOY_SH" check 2>&1)" && exit 0 # 乾淨 → 一個字都不印(約束 1) # 走到這裡代表有漂移。SessionStart 用 stdout 把訊息帶進脈絡。 cat <