ssot-check スキル
概要
SSOT(~/projects/obsidian-ssot/)内のファイルと実態(設定ファイル・フォルダ構成・Cron等)を照合し、乖離があれば提案・修正する。
無人モード(auto)
/ssot-check auto または引数に auto が含まれる場合、ユーザー承認をスキップして無人実行する。Cron定期実行専用。呼び出し時にモードを判定し、以降の各フェーズで auto の挙動を適用すること。
auto 時の挙動
- フェーズ2: 承認確認なし。乖離一覧は内部保持のみでユーザーに問わない。
- フェーズ3(修正): 重要度「高」のみ自動修正。「中」「低」は修正しない。
- フェーズ4: commit のみ自動実行(push は ssot-auto-sync
*/30に委譲・git競合の窓口を減らす)。メッセージ:chore: SSOT整合性チェック[auto](高重要度N件修正) - 記録: 修正した「高」と検知のみの「中・低」の全件を
10_DAILY/YYYY-MM-DD.mdに追記。ヘッダーは## SSOT整合性チェック[auto] (HH:MM)形式(セッションログではない)。Edit ツールではなく bash の>>heredoc で追記(複数プロセス・並行セッションによるFile has been modified since read競合を回避)。
auto 時のstate更新(2段階・重複発火抑制)
state は2ファイルに分離(2026-06-26 の 04:39/41/42/43 の4連鎖発火事故対策):
ssot-check-triggered: SessionStart hook(check-ssot-check-staleness.sh)が発火指示時に先行マークする。本スキルでは触らない。後続セッションの同時発火を弾く。ssot-check-last-run: 本スキルが auto 実行完了時に更新する(実行成功日・翌日以降の参照用)。
# auto 実行の完了時(高0件で commit なしの場合でも必ず実行):
date +%Y-%m-%d > ~/.claude/state/ssot-check-last-run
高0件で commit をスキップした場合でも last-run は更新すること(更新忘れが state 古残り→翌セッション再発火の無限ループの原因。04:39実行の再発原因)。
安全装置(auto 時の厳格な制限)
- 「高」でも削除系(リポ消失・フォルダ消失等の記述削除)は自動修正せず検知のみ。誤削除防止。
- commit 前に
git diff --statで変更範囲を確認。5ファイル超 または 100行超の大規模変更時は commit 中止 → 日記に「要手動確認: 変更規模が想定外」と記録して終了。 git push --forceは auto・対話ともに絶対禁止。- 調査で
ghコマンドが失敗(認証切れ等)した場合、その対象はスキップし日記に「要確認」記録。
チェック対象
1. 自動化.md
- settings.json hooks: 全Hookコマンドが
自動化.mdのテーブルに載っているか - Cron:
~/.claude/scheduled_tasks.jsonのCronが自動化.mdのCronテーブルに載っているか - スクリプト:
~/bin/と~/.claude/scripts/のスクリプトが一覧に載っているか - ssot-auto-sync.sh: 実際のスケジュール(
*/5or*/30)を確認
2. repo-index.yaml / リポジトリ索引.md
- last_updated: 古くなっていないか(1週間以上前なら更新)
- total_repos: GitHubの実リポ数と合っているか
- ** visibilidade**: public/private が実際のものか
- 不足リポ: GitHubにあるのにYAMLに載っていないリポはないか
3. MCPツール使い分けガイド.md
- 有効サーバー数: settings.json の mcpServers と合っているか
- 無効化済みリスト: 実際に無効化したサーバーが載っているか
4. 全体マップ_MOC.md
- リポジトリ数:
全XXリポジトリの表示が正しいか - プロジェクト一覧: 01_DECISIONS/ の最新フォルダ構成と合っているか
5. チャーター.md
- 禁止操作:
guard-destructive-commands.shと一致しているか - Tier1参照:
共通ルール/ルール.mdへの参照があるか
フェーズ1: 調査
各対象ファイルを実際に読み込んで乖離を検出する:
# 1. 自動化.md の乖離チェック
# ※ cat は security-guard hook でブロックされるため python 直接読込(auto定期実行で停止防止)
python3 -c "
import json
d = json.load(open('/home/yn4416/.claude/settings.json'))
for event, hooks in d.get('hooks', {}).items():
for h in hooks:
cmd = json.dumps(h, ensure_ascii=False)
print(f'{event}: {cmd[:80]}')
"
# 2. GitHubリポ数確認
gh repo list fukukei23 --limit 50 --json name,visibility --jq '.[] | .name' | wc -l
# 3. 01_DECISIONS プロジェクト一覧
ls /home/yn4416/projects/obsidian-ssot/01_DECISIONS/
# 4. scheduled_tasks.json のCron
cat ~/.claude/scheduled_tasks.json
# 5. settings.json のmcpServers
python3 -c "import json; print(list(json.load(open('/home/yn4416/.claude/settings.json'))['mcpServers'].keys()))"
フェーズ2: 乖離一覧提示
検出した乖離を以下の形式で提示:
📋 SSOT整合性チェック結果
【重要度: 高】← 実態と大きく異なる
- [ ] リポジトリ索引.md: 総リポ数 23→実際の28と不一致
- [ ] MCPガイド: 有効サーバー 12個→実際の4個と不一致
【重要度: 中】← 一部古い
- [ ] 全体マップ_MOC.md: 新規プロジェクト(ssot-guide等)未記載
- [ ] repo-index.yaml: last_updated が9日古い
【重要度: 低】← 軽微
- [ ] チャーター.md: 禁止操作リストが一部古い
修正しますか? [yes/選択/却下]
重要度基準
- 高: ユーザーが見た時に「嘘だろう」と感じるレベル(数・visibility・存在しないフォルダ記載等)
- 中: 若干古い情報(1週間以上の日付違い、追加されたプロジェクト等)
- 低: 説明文の微妙な言い回し変更等
フェーズ3: 修正実行(ユーザー承認後)
修正対象별手順
repo-index.yaml
last_updatedを現在日時に更新total_reposを実際のGitHubリポ数に更新- visibility/privateの不一致を修正
- 不足リポを追加(GitHubに 있는데YAMLにないもの)
- YAML更新後、
リポジトリ索引.mdを再生成
MCPツール使い分けガイド.md
- ヘッダーの「有効サーバー: X個」を actual 値に更新
- 無効化済みセクションに実際に切ったサーバーを追記(再インストール可能な旨を記載)
全体マップ_MOC.md
- リポジトリ数の表示を更新
- 01_DECISIONS/ の最新フォルダ構成を反映
- 新規プロジェクトを追加
チャーター.md
- 禁止操作リストが
guard-destructive-commands.shと一致しているか確認 - 一致していなければ「詳細は
guard-destructive-commands.shを参照」と追記
自動化.md
- settings.json hooks の全コマンドが載っているか確認
- ssot-auto-sync.sh の実際のスケジュールを確認(
*/5or*/30) - 不足分を追記
フェーズ4: git commit(push は auto-sync に委譲)
cd /home/yn4416/projects/obsidian-ssot
# auto 時は安全装置(5ファイル/100行超)で commit 中止判定を先に行うこと
git add -A
git commit -m "update: SSOT整合性チェック(修正対象: XXX)"
# ※ push は行わない。ssot-auto-sync.sh(*/30)が自動 push する(git競合窓口を減らす)
完了報告
✅ SSOT整合性チェック完了
【修正ファイル】
- repo-index.yaml(リポ数・last_updated・visibility 更新)
- リポジトリ索引.md(再生成)
- MCPツール使い分けガイド.md(有効4個に更新)
- 全体マップ_MOC.md(プロジェクト一覧更新)
- チャーター.md(禁止操作参照追加)
🔗 コミット: <hash>
制約
- 修正はユーザー承認後(デフォルト: 全件承認の
yes、選択なら[1,3]形式) - 追加:新リポジトリを作ったら、このスキルで整合性を確認する習慣をつける
- 削除:リポジトリを削除した場合は
自動化.md等から手動削除(自動検知は困难)