# SSoT 監査ガイド スキル作成・更新時に必ず実行する SSoT(Single Source of Truth)監査の手順。**この監査を通過するまでスキルを完成扱いにしない。** ## 目次 - SSoT 違反とは - 違反パターンと修正方法 - 監査手順 - 判断に迷うケース - ハードコード・不整合レビュー --- ## SSoT 違反とは **同じ情報が2箇所以上に存在し、片方を更新しても他方が古いまま残るリスクがある状態。** スキルにおける SSoT 違反は2つの場面で発生する: 1. **スキル内部**: SKILL.md と references/ の間で情報が重複 2. **スキル ↔ 外部**: スキルが参照するファイル(スキーマ、設定、コード)の情報をスキル内にコピー --- ## 違反パターンと修正方法 ### パターン1: スキーマ・設定のコピー ```markdown # 違反 ## 出力形式 JSONは以下の構造: - name: string (必須) - age: number (任意) - email: string (必須) # 正解 ## 出力形式 SSoT: `path/to/schema.ts` の型定義を参照 ``` ### パターン2: ルール一覧の転記 ```markdown # 違反 ## バリデーション 以下のルールでチェック: 1. nameは3文字以上 2. emailは@を含む 3. ageは0以上 # 正解 ## バリデーション SSoT: `path/to/validator.ts` のバリデーションルールに従う ``` ### パターン3: SKILL.md と references/ の重複 ```markdown # 違反 SKILL.md に品質チェックリストを書き、references/exemplar.md にも同じリストがある # 正解 チェックリストは exemplar.md のみに記載。SKILL.md は「品質チェック → exemplar.md」と参照 ``` ### パターン4: 他スキルとの重複 ```markdown # 違反 スキルAとスキルBの両方に同じデプロイ手順を記載 # 正解 共通手順を共有リファレンスに置き、両方から参照 ``` --- ## 監査手順 スキルの作成・更新が完了したら、以下の全ステップを実行する。 ### Step 1: 情報ソースの列挙 スキルが参照する外部ファイルを全て列挙する: - スキーマファイル(.ts, .json) - 設定ファイル - 他のスキルの references/ - プロジェクトのドキュメント ### Step 2: スキル内コンテンツの監査 SKILL.md と references/ 内の**各テーブル・リスト・コードブロック**について問う: **「この情報の真のソース(原本)はどこか?」** - **スキル内が原本** → Step 3 へ - **スキル外に原本がある** → 違反。参照に置き換える ### Step 3: 重複の検索 スキル内が原本の情報について、プロジェクト内に同じ情報がないか確認: ```bash grep -r "キーワード" --include="*.md" --include="*.ts" --include="*.json" ``` 重複が見つかったら: - どちらを原本にするか決定 - もう片方を参照に置き換え ### Step 4: スキル内部の重複チェック SKILL.md と references/ の間で同じ情報が書かれていないか確認: - SKILL.md に書いた内容が references/ にもないか - references/ の複数ファイルに同じ情報がないか ### Step 5: 最終確認 以下を全て満たすことを確認: - [ ] スキル内の全テーブル・リストが「このスキルでしか定義されていない情報」のみを含む - [ ] 外部ファイルの情報をスキル内にコピーしていない - [ ] SKILL.md と references/ の間に重複がない - [ ] references/ の複数ファイル間に重複がない --- ## 判断に迷うケース ### 「要約」は許されるか? **原則: 方向性を示す一文は許容。詳細リストのコピーは禁止。** ```markdown # OK: 方向性だけ示して参照 ## 概要 核心原則に基づいてスキルを設計する。 詳細 → references/principles.md # NG: リストのコピー(要約に見せかけた重複) ## 概要 原則: - 洗練: 公式ドキュメントに基づく - 簡潔性: 必要最小限の情報 - SSoT: 情報は1箇所のみ ``` 判断基準: **「参照先が変更された時、この記述も更新が必要か?」** - Yes → SSoT 違反。参照に置き換える - No → 許容 ### テーブルの一部引用は? **禁止。** テーブルの一部でも、元テーブルに行が追加された時に古くなる。 ```markdown # NG: 一部引用 主要なイベント: afterFileEdit, stop(全一覧は references/ を参照) # OK: 参照のみ イベント一覧 → references/events.md ``` ### 「例」としての引用は? **形式の例示は1つだけ許容。内容の列挙は禁止。** ```markdown # OK: 形式を1つだけ示す フロントマターの例: --- name: my-skill description: ... --- 詳細な書き方 → exemplar.md # NG: 複数パターンの列挙(内容のコピー) 良い例: - feat(認証): メールアドレスでのログイン機能を追加 - fix(決済): 税率計算の誤りを修正 悪い例: - バグを修正 - 対応 ``` --- ## ハードコード・不整合レビュー SSoT 監査(上記 Step 1〜5)が「情報のコピー」を検出するのに対し、このレビューは **ハードコードされた詳細** と **暗黙的な依存** を検出する。SSoT 監査を通過したスキルに対して追加で実行する。 ### チェック1: ハードコードされた詳細情報 参照先を読めばわかる**具体的な値・構造・手順**がスキル内に直接書かれていないか確認する。 **検出対象**: - ディレクトリ構造の展開(ツリー表示) - 設定値・パラメータの列挙 - 外部ツールのコマンドオプション一覧 - スキーマのフィールド名・型の網羅的リスト - ファイルパスの詳細な列挙 **判断基準**: 「この詳細が変更されたとき、スキルを手動で更新する必要があるか?」 - Yes → 参照に置き換えるか、方向性のみの記述に変更 - No → 許容 ```markdown # NG: ディレクトリ構造をハードコード ## 出力先 contents/ ├── 講義/ │ └── Nヶ月目/第N回/ │ ├── meta.json │ ├── slides.json │ └── script.md # OK: 参照先を示す ## 出力先 `contents/講義/` 配下に、実際のディレクトリ構造に従って配置する。 ``` ### チェック2: 参照先変更時の不整合リスク スキル内の記述が参照先の内容に**暗黙的に依存**していないか確認する。コピーではないが、参照先の更新により事実と乖離するリスクのある記述を検出する。 **検出対象**: - 参照先の件数に依存する表現(「3つの原則」「5つのステップ」) - 参照先の内容を要約した記述(要約は参照先が変われば古くなる) - 参照先の特定ステップ名・ラベルをインラインで使った記述 **判断基準**: 「参照先のファイルが更新されたとき、この記述はまだ正確か?」 - 不確実 → 参照先に依存しない表現に書き換える - 常に正確 → 許容 ```markdown # NG: 参照先の個数に暗黙的に依存 3つの核心原則に基づいてスキルを設計する。 → 原則が追加・削除されたら不正確になる # OK: 個数に依存しない 核心原則に基づいてスキルを設計する。 詳細 → references/principles.md ``` ### レビュー最終確認 以下を全て満たすことを確認: - [ ] スキル内にディレクトリ構造・スキーマ・設定値のベタ書きがない - [ ] 参照先の件数・名前に依存する表現がない - [ ] 参照先が更新されてもスキル内の記述が正確なままである