[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6MDTX7S802386PM35ZRYK1V":3,"skill-same:01M6MDTX7S802386PM35ZRYK1V":51},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":24,"linkOnly":25,"markdownContent":26,"markdownBody":27,"frontMatter":28,"refName":30,"commitSha":31,"skillDirectory":32,"forksCount":33,"repositoryHtmlUrl":34,"repositoryHomepageUrl":6,"ownerHtmlUrl":35,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":36,"install":37,"resources":50},"01M6MDTX7S802386PM35ZRYK1V","xddp-survey",null,"CR 非依存で母体コードを調査し「現状仕様」を文書化する。調査後に (a) 調査のみ (b) knowledge へ昇格 (c) specs へ昇格 を人が選択する。CR を1本も回していない母体から仕様書を起こす場合に使用する。 「母体を調査して」「コードの仕様を調べて」「baseline を起こして」などで起動する。","tsuna44\u002FXddpSettings","tsuna44","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F84987382?v=4","01M6JWX5PY45PD3W2131F7VMF4","01M6JWX5VFK80TQBJJY8SHAE4N",1,"MIT","https:\u002F\u002Fgithub.com\u002Ftsuna44\u002FXddpSettings\u002Fblob\u002Fmain\u002FClaudeCode\u002F.claude\u002Fskills\u002Fxddp-survey\u002FSKILL.md",[],[18,19,20,21,22,23],"survey","xddp survey","promote","baseline","knowledge","module","2026-11-10 10:12:30",false,"---\nname: xddp-survey\ndescription: CR 非依存で母体コードを調査し「現状仕様」を文書化する。調査後に (a) 調査のみ (b) knowledge へ昇格\n  (c) specs へ昇格 を人が選択する。CR を1本も回していない母体から仕様書を起こす場合に使用する。\n  「母体を調査して」「コードの仕様を調べて」「baseline を起こして」などで起動する。\nargument-hint: \"[repo名] [module {モジュール名}... | topic {シード}... | promote]\"\n---\n\nYou are executing **XDDP Survey — CR 非依存の母体調査**.\n\n> 本スキルは CR 非依存のため CR 解決行（xddp-common の \"## CR Resolution\"）は不要。\n\n**Arguments:** $ARGUMENTS\n- 無引数 → リポジトリ・スコープ種別・対象を対話で確認する\n- `{repo}` → スコープ種別を尋ね、候補を提示して人が選択する\n- `{repo} module {module}...` → 指定モジュールを調査する（複数可）\n- `{repo} module all` → 全モジュール。確認ゲートでトークン量の警告を出したうえで実行する\n- `{repo} topic {seed}...` → シード（識別子・ファイルパス・キーワード）起点でモジュール横断調査する\n- `{repo} promote` → **調査を行わず昇格のみ実行する。** `{XDDP_DIR}\u002Fsurvey\u002F{repo}\u002F**` の既存 SURVEY\n  成果物を列挙して人に選択させ、Step 0.5 → Step 4.5 へ直行する（Step 1〜4 をスキップ）\n\n`cross` は `REPOS:` の予約名であり調査対象にできない。指定された場合はエラーで停止する。\n\n---\n\n### Step 0: Parse arguments, locate xddp.config.md\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002FSKILL.md`, apply \"## Load Config\"\n→ let `WORKSPACE_ROOT`, `DOCS_DIR`, `DOCS`, `REPOS_MAP`, `REPOS_KEYS`, `IS_MULTI`,\n  `EXCLUDE_PATTERNS`, `INCLUDE_EXTENSIONS`, `SPECOUT_DIAGRAM_LEVEL`, `SPECOUT_SEQUENCE_LEVELS`\n  （他の戻り値は本スキルでは未使用）.\n\nLet `TODAY` = today's date (YYYY-MM-DD).\n\n**Resolve target repo (`REPO_NAME`):**\n- 第1引数が `REPOS_KEYS` のいずれかと完全一致 → `REPO_NAME` = その値。`REPO_PATH` = `REPOS_MAP[REPO_NAME]`\n- 第1引数が `cross` → エラー「`cross` は予約名のため調査対象にできません」を報告して停止する\n- 第1引数が一致しない、または無指定 → 対話でリポジトリを選択させる（`REPOS_KEYS` が1件のみの場合は自動確定して報告する）\n\n**Resolve mode (`MODE`):**\n- 残り引数の先頭が `promote` → `MODE = promote`\n- 残り引数の先頭が `module` → `MODE = module`。以降のトークンを `MODULE_ARGS` とする\n- 残り引数の先頭が `topic` → `MODE = topic`。以降のトークンを `SEED_ARGS` とする\n- 残り引数が空 → 対話で `module`\u002F`topic` を選択させ、対象を確認して `MODULE_ARGS`\u002F`SEED_ARGS` を確定する\n\n#### Step 0.5（`MODE = promote` の場合のみ）: 既存 SURVEY の選択\n\n`{WORKSPACE_ROOT}\u002F{XDDP_DIR}\u002Fsurvey\u002F{REPO_NAME}\u002F**\u002FSURVEY-*.md` を Glob で列挙し、番号付きリストで\n人に選択させる（複数選択可）。1件も無い場合はその旨を報告して停止する。\n\n選択された各ファイルについて、パスから以下を復元する:\n- `SURVEY_FILE` = 選択されたファイルパス\n- `SCOPE_KIND` = パスに `\u002Fmodule\u002F` を含む場合 `module`、`\u002Ftopic\u002F` を含む場合 `topic`\n- `SCOPE_NAME` \u002F `MODULE_KEBAB`（module のときのみ）= 親ディレクトリ名\n- `TOPIC_SLUG`（topic のときのみ）= ファイル名の `SURVEY-` 接頭辞・`.md` 拡張子を除いた部分\n\nこれを Step 4 完了時点の状態とみなし、選択された各ファイルについて Step 4.5 以降を1件ずつ実行する\n（Step 1〜4 は実行しない）。\n\n---\n\n### Step 1: スコープ種別・対象の確定\n\n`MODE = promote` の場合はこの Step 全体をスキップする（Step 0.5 で完了済み）。\n\nLet `CATALOG_FILE` = `{DOCS}\u002F{REPO_NAME}\u002Fmodule-catalog.md`。\n\n存在すれば Read し `CATALOG_AVAILABLE = true` とする。存在しなければ次の警告を表示し、\n`CATALOG_AVAILABLE = false` として**停止せず**続行する（module-catalog 不在時の縮退動作）:\n\n> ⚠️ `{CATALOG_FILE}` が見つかりません。`\u002Fxddp-codemap {REPO_NAME}` の実行を推奨しますが、\n> 縮退モードで調査を続行します（網羅性が劣る可能性があります）。\n\n**`MODE = module` の場合:**\n- `MODULE_ARGS` が `all` → 全モジュールを対象とする。トークン量（対象ファイル数から概算）の警告を表示し、\n  続行確認を得る\n- それ以外 → `MODULE_ARGS` の各要素を対象モジュール名 `TARGET_MODULES` とする\n- `CATALOG_AVAILABLE = true` の場合: `module-catalog.md`「## 2. モジュール一覧」と照合する\n- `CATALOG_AVAILABLE = false` の場合: リポジトリ直下の第1〜2階層ディレクトリを Glob で列挙し、\n  `TARGET_MODULES` の各名称と一致するものをモジュール候補とする。\n  **`TARGET_MODULES` の各要素について、ディレクトリ候補が1件でも一致すれば `DIR_MATCHED[module] = true`、\n  1件も一致しなければエラーにせず `DIR_MATCHED[module] = false` として記録し、Step 2 のファイル名一致\n  フォールバックに解決を委ねる。** `DIR_MATCHED` は `TARGET_MODULES` の各要素をキーとする\n  真偽値マップであり、`module {m1} {m2}...` のように複数モジュールを同時指定した場合も要素ごとに\n  独立して判定・保持する。\n\n**`MODE = topic` の場合:** `SEED_ARGS` をそのまま `SEEDS` とする（Step 2 で処理）。\n\n---\n\n### Step 2: 調査対象ファイル集合の確定・MODULE_KEBAB \u002F TOPIC_SLUG の導出\n\n`MODE = promote` の場合はこの Step をスキップする。\n\n#### module スコープ\n\n`TARGET_MODULES` の各モジュールについて:\n- `CATALOG_AVAILABLE = true`: `module-catalog.md` の当該モジュール定義（主要ファイル・ディレクトリ）から\n  `TARGET_FILES` を確定する\n- `CATALOG_AVAILABLE = false`: 以下の優先順位で `TARGET_FILES` を確定する（縮退モードのモジュール解決）。\n\n  1. **ディレクトリ一致（既存の挙動）:** Step 1 で `DIR_MATCHED[module] = true` の場合、そのモジュール\n     ディレクトリを Glob で列挙し `TARGET_FILES` とする。\n  2. **ファイル名一致フォールバック（`DIR_MATCHED[module] = false` の要素のみ）:** リポジトリ直下から\n     第1〜2階層まで `EXCLUDE_PATTERNS` \u002F `INCLUDE_EXTENSIONS` を適用してファイルを Glob で列挙し、\n     ファイル名（拡張子を除く）を `NORMALIZE()` した値が、モジュール名を同じ規則で `NORMALIZE()`\n     した値と一致するファイルを探す。\n\n     **`NORMALIZE(s)` の定義（下記 `MODULE_KEBAB` 導出ルール項番1「ディレクトリ一致で解決した場合」が\n     使うケバブ化規則——パス区切り `\u002F` の置換とキャメルケース分割の両方——をそのまま流用する）:**\n     1. パス区切り `\u002F` をハイフンに置換する（`MODULE_KEBAB` 導出ルール項番1前半と同一。\n        例: `src\u002Fauth` → `src-auth`）\n     2. キャメルケースをハイフン区切りへ分割し小文字化する（同項番1後半と同一。\n        例: `SensorReader` → `sensor-reader`）\n     3. `_` を `-` に統一する\n     4. 連続するハイフンを1個に畳み込む\n\n     モジュール名側（CLI 引数）・ファイル名側（拡張子を除いたステム）の双方にこの同一関数を適用して\n     比較する。\n     - **一致1件:** そのファイル単体を「1ファイルモジュール」として `TARGET_FILES` に採用する。\n     - **一致複数件**（同名ファイルが複数ディレクトリ・拡張子に存在）: 候補をすべて Step 3\n       の確認ゲートに列挙し、人に絞り込みを求める。絞り込まれなかった場合は候補全件を\n       `TARGET_FILES` として採用し、その旨を確認ゲートの注記に明記する。\n     - **一致0件:** そのモジュール要素の調査を打ち切り、次のメッセージを表示する\n       （他のモジュール要素の処理は継続する）:\n       > ⚠️ モジュール `{name}` はディレクトリにもファイルにも一致しませんでした。\n       > `\u002Fxddp-codemap {REPO_NAME}` を実行してカタログを整備するか、`topic {識別子}` スコープで\n       > 直接シンボル起点の調査を行ってください。\n\n**`MODULE_KEBAB` の導出（各モジュールについて）:**\n1. **ディレクトリ一致で解決した場合（既存の挙動）:** パス区切り `\u002F` をハイフンに置換する\n   （`src\u002Fauth` → `src-auth`）。残りをケバブケースに変換する（キャメル → ハイフン区切り小文字。\n   `AuthService` → `auth-service`）。\n2. **ファイル名一致フォールバックで解決した場合:** マッチング時に既に算出済みの `NORMALIZE()`\n   （上記で定義した関数。パス区切り置換・キャメルケース分割に加え、アンダースコア `_` をハイフン `-`\n   に統一するステップ3を含む）の結果を、そのまま `MODULE_KEBAB` として採用する\n   （`sensor_reader.py` → `sensor-reader`、`SensorReader.java` → `sensor-reader`）。\n   項番1（ディレクトリ一致）のケバブ化規則はアンダースコア変換を明示していないため、項番1の規則を\n   流用するのではなく `NORMALIZE()` を直接使うことで、Python 等のスネークケースファイル名で一貫した\n   結果を保証する。\n3. いずれの場合も、予約名（`overview` \u002F `cross` \u002F `system`）と一致する場合は `mod-{module-kebab}` に\n   自動変換する（既存の挙動と同一）。\n\n#### topic スコープ\n\n1. 各シードについて `Grep` で定義箇所と参照箇所を収集する。`EXCLUDE_PATTERNS` \u002F `INCLUDE_EXTENSIONS` を適用する\n2. `CATALOG_AVAILABLE = true` の場合、`module-catalog.md`「## 3. シンボル索引」でシードを引き、\n   索引が示すファイルを集合に加える\n3. 得られたファイル集合を `TARGET_FILES` とする\n\n**探索深さは 1 hop 固定とする。** シードの直接の定義元・参照元までを対象とし、さらに追う必要がある場合は\n人が追加シードを与えて再実行する（多段の波及展開は工程4a（specout）の役割であり、survey では担わない）。\n件数の自動閾値は設けない（Step 3 で全件提示して人が承認する）。\n\n**`TOPIC_SLUG` の導出:**\n各シードを次の規則で個別にスラグ化する:「スペース・`\u002F`・`_` をいずれもハイフンに変換し小文字化する。\n連続するハイフンは1個に畳み込む」（例: `g_state` → `g-state`）。\n**複数シード指定時:** 各シードを上記規則で個別にスラグ化した後、**アルファベット順にソートしてから\n`--`（ハイフン2連）で連結する**（例: シード `foo`・`g_state` → `foo--g-state`）。指定順ではなくソート順を\n用いるため、シードの列挙順序が異なっても同一の `TOPIC_SLUG` になる。\n\n**再調査時の扱い:** 同一 `MODULE_KEBAB`（module）\u002F `TOPIC_SLUG`（topic）の SURVEY 成果物が既に存在する\n場合は上書きする（過去分が必要な場合は人が事前に退避する）。\n\n---\n\n### Step 3（確認ゲート）: 対象ファイル一覧・出力先・想定トークン規模の確認\n\n`MODE = promote` の場合はこの Step をスキップする。\n\n**`SURVEY_FILE` の出力先:**\n| スコープ | 出力先 |\n|---|---|\n| module | `{WORKSPACE_ROOT}\u002F{XDDP_DIR}\u002Fsurvey\u002F{REPO_NAME}\u002Fmodule\u002F{MODULE_KEBAB}\u002FSURVEY-{MODULE_KEBAB}.md` |\n| topic | `{WORKSPACE_ROOT}\u002F{XDDP_DIR}\u002Fsurvey\u002F{REPO_NAME}\u002Ftopic\u002FSURVEY-{TOPIC_SLUG}.md` |\n\n対象（module: モジュールごと、topic: 1件）を**一括して**次の内容で提示する:\n\n> **調査対象確認**\n> | # | スコープ | 解決方法 | 対象ファイル数 | 出力先 |\n> |---|---|---|---|---|\n> | 1 | {module: {module名} \u002F topic: {SEEDS}} | {module-catalog ／ ディレクトリ一致 ／ ファイル名一致フォールバック（縮退） ／ —（topic）} | {N} | {SURVEY_FILE} |\n>\n> 対象ファイル一覧: {TARGET_FILES を対象ごとに列挙}\n> {ファイル名一致で複数候補が絞り込まれず全件採用した場合のみ、該当モジュールごとに1行}⚠️ モジュール `{module名}` は同名ファイルが複数見つかったため候補全件を対象にしています。絞り込む場合は「対象を絞り込む」を選択してください。\n> 想定トークン規模: 目安 {対象ファイルの合計行数から概算}\n>\n> このまま調査を実行しますか？ [はい \u002F いいえ \u002F 対象を絞り込む]\n\n**「解決方法」列の値:** `CATALOG_AVAILABLE = true` で解決した行は `module-catalog`、`CATALOG_AVAILABLE = false`\nかつ Step 1 で `DIR_MATCHED[module] = true` の行は `ディレクトリ一致`、`DIR_MATCHED[module] = false` から\nファイル名一致で解決した行は `ファイル名一致フォールバック（縮退）`、topic スコープの行は `—（topic）` を表示する。\n`CATALOG_AVAILABLE = true` 時のモジュール解決ロジック自体（Step 2 参照）は、この表示列の追加以外変更しない。\n\n**承認前は一切書き込まない。** 承認後、Step 4 へ進む。「対象を絞り込む」の場合は Step 2 に戻る。\n\n---\n\n### Step 4: xddp-survey-agent の起動（調査の完了点）\n\n`MODE = promote` の場合はこの Step をスキップする（Step 0.5 で選択した既存 SURVEY を使う）。\n\n対象（module スコープは対象モジュールごとに1回、topic スコープは1回）ごとに **Agent tool**\n`subagent_type=xddp-survey-agent`:\n```\nREPO_NAME: {REPO_NAME}\nREPO_PATH: {REPO_PATH}\nSCOPE_KIND: module|topic\nSCOPE_NAME: {module名 または SEEDS の列挙}\nMODULE_KEBAB: {module スコープのときのみ}\nTARGET_FILES: {Step 2 で確定した当該対象のファイル一覧}\nDOCS: {DOCS}\nMODULE_CATALOG_FILE: {CATALOG_FILE（不在時は空文字列）}\nOUTPUT_FILE: {Step 3 で確定した SURVEY_FILE}\nTODAY: {TODAY}\nSPECOUT_DIAGRAM_LEVEL: {SPECOUT_DIAGRAM_LEVEL}\nSPECOUT_SEQUENCE_LEVELS: {SPECOUT_SEQUENCE_LEVELS}\n```\n\n**ここが「調査」の完了点である。** 以降の Step 4.5〜8 は昇格の選択に応じてのみ実行する。\n\n---\n\n### Step 4.5（昇格ゲート）\n\n対象（module: モジュールごと、topic: 1件。`MODE = promote` の場合は Step 0.5 で選択した各ファイル）\nごとに次を提示する:\n\n> **調査が完了しました:** `{SURVEY_FILE}`\n>\n> この結果をどう扱いますか？\n> (a) 調査のみで終了（`{XDDP_DIR}\u002Fsurvey\u002F` に残す。baseline は変更しない）\n> (b) knowledge へ昇格（`{DOCS}\u002F{REPO_NAME}\u002Fknowledge\u002Fcode-knowledge\u002F` へ登録）\n> (c) specs へ昇格（`{DOCS}\u002F{REPO_NAME}\u002Fspecs\u002F{module}\u002F` へ登録）{`SCOPE_KIND: topic` の場合は\n>     「— topic スコープのため選択不可」を付記し選択肢から外す}\n\n(a) を選んだ場合: 何もせず Step 9 へ進む（SURVEY 成果物は `{XDDP_DIR}\u002Fsurvey\u002F` に残る）。\n(b) を選んだ場合: Step 5 へ進む。(c) を選んだ場合: Step 6 へ進む。\n\n---\n\n### Step 5（(b) を選んだ場合）: knowledge への昇格\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-rules\u002Fcode-knowledge-boundary.md`, apply \"## 宛先ルーティング表\"\n  → let `KNOWLEDGE_ROUTING`, and \"## 知見の置き場所（MODULE）\" → let `KNOWLEDGE_PLACE`.\n\n**SURVEY 節 → knowledge 昇格の対応と昇格条件:**\n| SURVEY 節（04_specout-module-template.md 由来） | 昇格条件 | 適用軸 | 昇格先 |\n|---|---|---|---|\n| 2.4 定数・列挙値一覧 \u002F 2.5 グローバル変数一覧 | モジュール横断で参照・変更されるもののみ | 軸2 | `_constants\u002F{DOMAIN}-constants.md` |\n| 2.5 グローバル変数の更新元・参照元 | モジュール横断の識別子のみ | 軸2 | `_flows\u002F{DOMAIN}-{VAR_NAME}-callgraph.md` |\n| 2.6 制約・前提条件 | 常に | 軸1 | `{MODULE}\u002Fconstraints.md`（`{MODULE}` は `KNOWLEDGE_PLACE`。項目ごとに決める） |\n| 4.2 データ型関連図 \u002F 4.3 データ構造 | 落とし穴・注意点の記述が伴う場合のみ | 軸1 | `_structures\u002F{DOMAIN}-relations.md` |\n| 2.1 処理フロー \u002F 4.5 モジュール内シーケンス図 | 複数モジュールにまたがるフローのみ | 軸2 | `_flows\u002F{DOMAIN}-{FLOW_NAME}-sequence.md` |\n\n上記の**昇格条件を満たす節のみ**を選択候補として人に提示し（条件を満たさない節はそもそも候補に出さない）、\n「どの節を昇格するか」（`SELECTED_SECTIONS` — 候補からの部分選択。人が今回は省略したい節を外せる）と\nドメイン名（`DOMAIN`）を確定させる。module スコープの survey は単一モジュールが対象のため、軸2に該当する\n項目は少ない（「module スコープで昇格対象がゼロ件」は正常。軸2の主な供給源は topic スコープ）。\n\n**`MODULE_FALLBACK`（パスの無い制約の置き場所）の決定**（`MODE = promote` でも同じ。`SURVEY_FILE` から決める）:\n- module スコープ: `SURVEY_FILE` の「## 1. モジュール概要」の「ディレクトリ」欄の値を1件の対象として、`KNOWLEDGE_PLACE` に従い\n  引用符付きのヒアドキュメントで stdin に渡して Run via Bash:\n  ```\n  PY=$(command -v python3 || command -v python) && \"$PY\" ~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fscripts\u002Fknowledge_place.py place --repo-root {REPO_PATH} --workspace-root {WORKSPACE_ROOT} \u003C\u003C'EOF'\n  [{\"id\": \"survey-dir\", \"targets\": [\"{「ディレクトリ」欄の値}\"]}]\n  EOF\n  ```\n  返った `module` を `MODULE_FALLBACK` にする。ただし、値が `.`・`.\u002F`・空・プレースホルダーのまま・読めない場合、\n  または `module` が `_root` の場合は `_general` にする。\n  終了コードが 0 以外なら `MODULE_FALLBACK` を `_general` にし、その旨を Step 9 で示す。\n- topic スコープ: `_general`（2.6 由来の constraints.md 昇格は module スコープのみで発生する）。\n\n**Agent tool** `subagent_type=xddp-survey-promote-agent`:\n```\nREPO_NAME: {REPO_NAME}\nREPO_PATH: {REPO_PATH}\nWORKSPACE_ROOT: {WORKSPACE_ROOT}\nSURVEY_FILE: {SURVEY_FILE}\nSELECTED_SECTIONS: {SELECTED_SECTIONS}\nDOMAIN: {DOMAIN}\nMODULE_FALLBACK: {MODULE_FALLBACK}\nDOCS: {DOCS}\nTODAY: {TODAY}\n```\n\nエージェントの返答の「置き場所の確認が要る制約」を Let `PLACE_NOTES` とし、Step 9 で示す。\n\n**AI_INDEX.md の作り直し:** Run via Bash（調べた repo だけでなく全 repo を渡す）:\n`PY=$(command -v python3 || command -v python) && \"$PY\" ~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fscripts\u002Fai_index.py build --docs {DOCS} --repos-keys {REPOS_KEYS をカンマ区切り} {IS_MULTI の場合のみ}--is-multi`\n失敗したら Let `AI_INDEX_ERROR` = stderr の1行目（昇格は取り消さない）。\n\n完了後 Step 9 へ進む。`specs\u002F` は変更しない。\n\n---\n\n### Step 6（(c) を選んだ場合）: specs への昇格・衝突判定\n\n**冒頭で対象の全モジュールの衝突判定をまとめて実行する。** モジュールごとに\n`{WORKSPACE_ROOT}\u002F{XDDP_DIR}\u002Flatest-specs\u002F{REPO_NAME}\u002F{MODULE_KEBAB}\u002Fspec.md` の frontmatter `source` を\n確認する。\n\n| 既存 `source` | 動作 |\n|---|---|\n| なし（ファイル自体が不在） | 新規生成 |\n| `survey` | 上書き再生成する |\n| `spo` | 既定はスキップ。全対象モジュールの判定完了後、`spo` 衝突モジュールが1件以上あれば下記の\n  一括確認を1回だけ行う |\n\n`spo` 衝突モジュールが1件以上ある場合、その全件を**1回の確認でまとめて**提示する\n（モジュールごとに個別のダイアログを複数回出さない。「なし」「`survey`」は自動判定のみで人に問わない）:\n\n> 以下のモジュールは CR で検証済みの仕様（`source: spo`）が既に存在します。\n> | モジュール |\n> |---|\n> | {module} |\n>\n> 全上書きしますか？（survey の内容で置き換えます。CR 検証済みの内容は失われます） [スキップ \u002F 全上書き]\n\n「スキップ」を選んだモジュールは以降のループから除外する（既存 `spec.md` は一切変更しない）。\n\n対象モジュールごとに **Agent tool** `subagent_type=xddp-specs-mod-agent`（**1モジュール1回**）:\n```\nCR_NUMBER: SURVEY-{TODAY}\nCR_PATH: （空文字列）\nXDDP_DIR: {XDDP_DIR}\nREPO_NAME: {REPO_NAME}\nREPO_PATH: {REPO_PATH}\nDOCS: {DOCS}\nTODAY: {TODAY}\nSURVEY_MODE: true\nSURVEY_FILE: {当該モジュールの SURVEY_FILE}\nMODULE_SCOPE: [{MODULE_KEBAB}]\nMODULE_KEBAB: {MODULE_KEBAB}\nOUTPUT_FILE: {WORKSPACE_ROOT}\u002F{XDDP_DIR}\u002Fsurvey\u002F{REPO_NAME}\u002Fmodule\u002F{MODULE_KEBAB}\u002FPENDING-MOD-SURVEY-{TODAY}.md\n```\n\n---\n\n### Step 7（(c) のみ）: レビュー ＋ インライン自動修正（最大1サイクル）\n\nStep 6 で生成・更新した `latest-specs\u002F{REPO_NAME}\u002F{MODULE_KEBAB}\u002F` 配下の全ファイルを `TARGET_FILES` とする。\nStep 8② で `architecture.md` を新規作成・追記した場合はそれも `TARGET_FILES` に含める。\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Finvoke-reviewer.md`, apply \"## Invoke Reviewer\" with:\n```\nDOCUMENT_TYPE: SPEC\nTARGET_FILES: {上記ファイル一覧}\nREFERENCE_FILES: [{対象モジュールの SURVEY_FILE を列挙}]\nREVIEW_ROUND: 1\nOUTPUT_FILE: {WORKSPACE_ROOT}\u002F{XDDP_DIR}\u002Fsurvey\u002F{REPO_NAME}\u002Freview\u002FSPEC-SURVEY-{TODAY}.md\n```\n\nRead `{OUTPUT_FILE}`。?（自動修正対象カテゴリ: Mermaid 図の構文エラー・フロントマター必須キーの漏れ・\n変更履歴エントリの形式不備・気づきメモセクションの有無）があれば、スキル自身が直接該当ファイルを編集して\n修正する（最大1回。工程11 Step REV と同一方式）。修正後、`REVIEW_ROUND: 2` で `apply \"## Invoke Reviewer\"`\nを再実行し `{OUTPUT_FILE}` を上書きする。それ以外の指摘（?。SPO 内容との矛盾等）は本スキルでは自動修正せず、\nStep 8 の人レビューゲートに委ねる。\n\n**`REVIEW_MAX_ROUNDS.SPEC` \u002F `FIX_STRATEGY.SPEC` は使用しない**（修正サイクルは常に最大1回固定）。\n\n---\n\n### Step 8（(c) のみ）: 人レビューゲート・DOCS への昇格\n\n人に `{OUTPUT_FILE}` の確認を促し、承認を待つ。承認前は DOCS 側に一切書き込まない。\n\n承認後、以下を実行する:\n\n**① spec コピー（今回生成・更新したモジュールのみ）:**\n```\nFor each {module} in （Step 6 で生成・更新したモジュール一覧）:\n  Copy {WORKSPACE_ROOT}\u002F{XDDP_DIR}\u002Flatest-specs\u002F{REPO_NAME}\u002F{module}\u002F\n    → {DOCS}\u002F{REPO_NAME}\u002Fspecs\u002F{module}\u002F\n```\nこのコピーでは `overview\u002F` および他モジュールには一切触れない（`architecture.md` への追記は②で別途行う）。\n\n**② `latest-specs\u002F{REPO_NAME}\u002Foverview\u002Farchitecture.md` への追記（追記のみ）:**\nLet `ARCH_FILE` = `{WORKSPACE_ROOT}\u002F{XDDP_DIR}\u002Flatest-specs\u002F{REPO_NAME}\u002Foverview\u002Farchitecture.md`。\n- `ARCH_FILE` が存在しない場合: `~\u002F.claude\u002Fskills\u002Fxddp-11-specs\u002Ftemplates\u002F11_overview-architecture-template.md`\n  から新規作成し、対象モジュールのエントリのみを記載する（`overview\u002F` ディレクトリも併せて作成する）。\n  **このテンプレートを正本とし、セクション構成・テーブル列構成を再定義してはならない。**\n- `ARCH_FILE` が存在する場合: 「## 3. モジュール一覧」テーブルに今回対象モジュールの行が無ければ追記する\n  （既に存在する場合はスキップ）。「## 2. アーキテクチャ図（コンポーネント図）」に今回モジュールのノードが\n  無い場合はノードのみ追加する。**他モジュールのエントリの更新・削除・並べ替え、図の全体再生成は禁止。**\n\n**③ AI_INDEX.md の作り直し:**\n- `{DOCS}` ディレクトリが存在しない場合: 作り直しをスキップし、次の警告を表示する（`{DOCS}` の\n  初回作成は `xddp-01-init` が担うため survey は作成しない）:\n  > ⚠️ `{DOCS}` が存在しないため AI_INDEX.md の更新をスキップしました。`\u002Fxddp-01-init` の実行後に\n  > `\u002Fxddp-survey {REPO_NAME} promote` を再実行してください。\n- それ以外: Run via Bash（調べた repo だけでなく全 repo を渡す）:\n  `PY=$(command -v python3 || command -v python) && \"$PY\" ~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fscripts\u002Fai_index.py build --docs {DOCS} --repos-keys {REPOS_KEYS をカンマ区切り} {IS_MULTI の場合のみ}--is-multi`\n  失敗したら Let `AI_INDEX_ERROR` = stderr の1行目（①・② は取り消さない）。\n\nStep 9 のサマリーに①〜③それぞれの結果（実施／スキップ／新規作成）を明示する。\n\n---\n\n### Step 9: 結果サマリー\n\nTell the user（日本語）:\n\n> **母体調査が完了しました**\n>\n> | 項目 | 内容 |\n> |---|---|\n> | リポジトリ | {REPO_NAME} |\n> | スコープ | {SCOPE_KIND}: {SCOPE_NAME} |\n> | 調査結果 | `{SURVEY_FILE}` |\n> | 選択 | (a) 調査のみ ／ (b) knowledge 昇格 ／ (c) specs 昇格 |\n> {選択に応じた出力先・Step 8 ①〜③ の結果を記載}\n> {(b) の場合: **置き場所の確認が要る制約:** {PLACE_NOTES と、MODULE_FALLBACK の決定で置き場所のスクリプトが失敗した旨, or \"なし\"}}\n> {AI_INDEX_ERROR がある場合: ⚠️ AI_INDEX.md の作り直しに失敗しました（{AI_INDEX_ERROR}）。昇格は済んでいます。`ai_index.py build` を再実行してください}\n>\n> **`{XDDP_DIR}\u002Fsurvey\u002F` の扱い:** SURVEY 成果物は人が任意に削除してください。ツール側では自動削除しません\n> （CR フォルダと異なりクローズ契機を持たないため。`xddp-close` は `survey\u002F` を参照しません）。VCS 管理の\n> 要否はプロジェクト判断です。\n>\n> **次のステップ:**\n> - 追加調査する場合: `\u002Fxddp-survey {REPO_NAME} module {module}` または `topic {seed}` を再実行してください\n> - 保留中の SURVEY 成果物を後から昇格する場合: `\u002Fxddp-survey {REPO_NAME} promote` を実行してください\n\nprogress.md は CR 非依存のため更新しない。\n\n---\n> **保守メモ:** このファイルを変更した場合は、`README.md`（スキル一覧テーブル）、`CLAUDE.md`\n> （ステップ番号体系テーブル）も合わせて更新すること。\n","You are executing **XDDP Survey — CR 非依存の母体調査**.\n\n> 本スキルは CR 非依存のため CR 解決行（xddp-common の \"## CR Resolution\"）は不要。\n\n**Arguments:** $ARGUMENTS\n- 無引数 → リポジトリ・スコープ種別・対象を対話で確認する\n- `{repo}` → スコープ種別を尋ね、候補を提示して人が選択する\n- `{repo} module {module}...` → 指定モジュールを調査する（複数可）\n- `{repo} module all` → 全モジュール。確認ゲートでトークン量の警告を出したうえで実行する\n- `{repo} topic {seed}...` → シード（識別子・ファイルパス・キーワード）起点でモジュール横断調査する\n- `{repo} promote` → **調査を行わず昇格のみ実行する。** `{XDDP_DIR}\u002Fsurvey\u002F{repo}\u002F**` の既存 SURVEY\n  成果物を列挙して人に選択させ、Step 0.5 → Step 4.5 へ直行する（Step 1〜4 をスキップ）\n\n`cross` は `REPOS:` の予約名であり調査対象にできない。指定された場合はエラーで停止する。\n\n---\n\n### Step 0: Parse arguments, locate xddp.config.md\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002FSKILL.md`, apply \"## Load Config\"\n→ let `WORKSPACE_ROOT`, `DOCS_DIR`, `DOCS`, `REPOS_MAP`, `REPOS_KEYS`, `IS_MULTI`,\n  `EXCLUDE_PATTERNS`, `INCLUDE_EXTENSIONS`, `SPECOUT_DIAGRAM_LEVEL`, `SPECOUT_SEQUENCE_LEVELS`\n  （他の戻り値は本スキルでは未使用）.\n\nLet `TODAY` = today's date (YYYY-MM-DD).\n\n**Resolve target repo (`REPO_NAME`):**\n- 第1引数が `REPOS_KEYS` のいずれかと完全一致 → `REPO_NAME` = その値。`REPO_PATH` = `REPOS_MAP[REPO_NAME]`\n- 第1引数が `cross` → エラー「`cross` は予約名のため調査対象にできません」を報告して停止する\n- 第1引数が一致しない、または無指定 → 対話でリポジトリを選択させる（`REPOS_KEYS` が1件のみの場合は自動確定して報告する）\n\n**Resolve mode (`MODE`):**\n- 残り引数の先頭が `promote` → `MODE = promote`\n- 残り引数の先頭が `module` → `MODE = module`。以降のトークンを `MODULE_ARGS` とする\n- 残り引数の先頭が `topic` → `MODE = topic`。以降のトークンを `SEED_ARGS` とする\n- 残り引数が空 → 対話で `module`\u002F`topic` を選択させ、対象を確認して `MODULE_ARGS`\u002F`SEED_ARGS` を確定する\n\n#### Step 0.5（`MODE = promote` の場合のみ）: 既存 SURVEY の選択\n\n`{WORKSPACE_ROOT}\u002F{XDDP_DIR}\u002Fsurvey\u002F{REPO_NAME}\u002F**\u002FSURVEY-*.md` を Glob で列挙し、番号付きリストで\n人に選択させる（複数選択可）。1件も無い場合はその旨を報告して停止する。\n\n選択された各ファイルについて、パスから以下を復元する:\n- `SURVEY_FILE` = 選択されたファイルパス\n- `SCOPE_KIND` = パスに `\u002Fmodule\u002F` を含む場合 `module`、`\u002Ftopic\u002F` を含む場合 `topic`\n- `SCOPE_NAME` \u002F `MODULE_KEBAB`（module のときのみ）= 親ディレクトリ名\n- `TOPIC_SLUG`（topic のときのみ）= ファイル名の `SURVEY-` 接頭辞・`.md` 拡張子を除いた部分\n\nこれを Step 4 完了時点の状態とみなし、選択された各ファイルについて Step 4.5 以降を1件ずつ実行する\n（Step 1〜4 は実行しない）。\n\n---\n\n### Step 1: スコープ種別・対象の確定\n\n`MODE = promote` の場合はこの Step 全体をスキップする（Step 0.5 で完了済み）。\n\nLet `CATALOG_FILE` = `{DOCS}\u002F{REPO_NAME}\u002Fmodule-catalog.md`。\n\n存在すれば Read し `CATALOG_AVAILABLE = true` とする。存在しなければ次の警告を表示し、\n`CATALOG_AVAILABLE = false` として**停止せず**続行する（module-catalog 不在時の縮退動作）:\n\n> ⚠️ `{CATALOG_FILE}` が見つかりません。`\u002Fxddp-codemap {REPO_NAME}` の実行を推奨しますが、\n> 縮退モードで調査を続行します（網羅性が劣る可能性があります）。\n\n**`MODE = module` の場合:**\n- `MODULE_ARGS` が `all` → 全モジュールを対象とする。トークン量（対象ファイル数から概算）の警告を表示し、\n  続行確認を得る\n- それ以外 → `MODULE_ARGS` の各要素を対象モジュール名 `TARGET_MODULES` とする\n- `CATALOG_AVAILABLE = true` の場合: `module-catalog.md`「## 2. モジュール一覧」と照合する\n- `CATALOG_AVAILABLE = false` の場合: リポジトリ直下の第1〜2階層ディレクトリを Glob で列挙し、\n  `TARGET_MODULES` の各名称と一致するものをモジュール候補とする。\n  **`TARGET_MODULES` の各要素について、ディレクトリ候補が1件でも一致すれば `DIR_MATCHED[module] = true`、\n  1件も一致しなければエラーにせず `DIR_MATCHED[module] = false` として記録し、Step 2 のファイル名一致\n  フォールバックに解決を委ねる。** `DIR_MATCHED` は `TARGET_MODULES` の各要素をキーとする\n  真偽値マップであり、`module {m1} {m2}...` のように複数モジュールを同時指定した場合も要素ごとに\n  独立して判定・保持する。\n\n**`MODE = topic` の場合:** `SEED_ARGS` をそのまま `SEEDS` とする（Step 2 で処理）。\n\n---\n\n### Step 2: 調査対象ファイル集合の確定・MODULE_KEBAB \u002F TOPIC_SLUG の導出\n\n`MODE = promote` の場合はこの Step をスキップする。\n\n#### module スコープ\n\n`TARGET_MODULES` の各モジュールについて:\n- `CATALOG_AVAILABLE = true`: `module-catalog.md` の当該モジュール定義（主要ファイル・ディレクトリ）から\n  `TARGET_FILES` を確定する\n- `CATALOG_AVAILABLE = false`: 以下の優先順位で `TARGET_FILES` を確定する（縮退モードのモジュール解決）。\n\n  1. **ディレクトリ一致（既存の挙動）:** Step 1 で `DIR_MATCHED[module] = true` の場合、そのモジュール\n     ディレクトリを Glob で列挙し `TARGET_FILES` とする。\n  2. **ファイル名一致フォールバック（`DIR_MATCHED[module] = false` の要素のみ）:** リポジトリ直下から\n     第1〜2階層まで `EXCLUDE_PATTERNS` \u002F `INCLUDE_EXTENSIONS` を適用してファイルを Glob で列挙し、\n     ファイル名（拡張子を除く）を `NORMALIZE()` した値が、モジュール名を同じ規則で `NORMALIZE()`\n     した値と一致するファイルを探す。\n\n     **`NORMALIZE(s)` の定義（下記 `MODULE_KEBAB` 導出ルール項番1「ディレクトリ一致で解決した場合」が\n     使うケバブ化規則——パス区切り `\u002F` の置換とキャメルケース分割の両方——をそのまま流用する）:**\n     1. パス区切り `\u002F` をハイフンに置換する（`MODULE_KEBAB` 導出ルール項番1前半と同一。\n        例: `src\u002Fauth` → `src-auth`）\n     2. キャメルケースをハイフン区切りへ分割し小文字化する（同項番1後半と同一。\n        例: `SensorReader` → `sensor-reader`）\n     3. `_` を `-` に統一する\n     4. 連続するハイフンを1個に畳み込む\n\n     モジュール名側（CLI 引数）・ファイル名側（拡張子を除いたステム）の双方にこの同一関数を適用して\n     比較する。\n     - **一致1件:** そのファイル単体を「1ファイルモジュール」として `TARGET_FILES` に採用する。\n     - **一致複数件**（同名ファイルが複数ディレクトリ・拡張子に存在）: 候補をすべて Step 3\n       の確認ゲートに列挙し、人に絞り込みを求める。絞り込まれなかった場合は候補全件を\n       `TARGET_FILES` として採用し、その旨を確認ゲートの注記に明記する。\n     - **一致0件:** そのモジュール要素の調査を打ち切り、次のメッセージを表示する\n       （他のモジュール要素の処理は継続する）:\n       > ⚠️ モジュール `{name}` はディレクトリにもファイルにも一致しませんでした。\n       > `\u002Fxddp-codemap {REPO_NAME}` を実行してカタログを整備するか、`topic {識別子}` スコープで\n       > 直接シンボル起点の調査を行ってください。\n\n**`MODULE_KEBAB` の導出（各モジュールについて）:**\n1. **ディレクトリ一致で解決した場合（既存の挙動）:** パス区切り `\u002F` をハイフンに置換する\n   （`src\u002Fauth` → `src-auth`）。残りをケバブケースに変換する（キャメル → ハイフン区切り小文字。\n   `AuthService` → `auth-service`）。\n2. **ファイル名一致フォールバックで解決した場合:** マッチング時に既に算出済みの `NORMALIZE()`\n   （上記で定義した関数。パス区切り置換・キャメルケース分割に加え、アンダースコア `_` をハイフン `-`\n   に統一するステップ3を含む）の結果を、そのまま `MODULE_KEBAB` として採用する\n   （`sensor_reader.py` → `sensor-reader`、`SensorReader.java` → `sensor-reader`）。\n   項番1（ディレクトリ一致）のケバブ化規則はアンダースコア変換を明示していないため、項番1の規則を\n   流用するのではなく `NORMALIZE()` を直接使うことで、Python 等のスネークケースファイル名で一貫した\n   結果を保証する。\n3. いずれの場合も、予約名（`overview` \u002F `cross` \u002F `system`）と一致する場合は `mod-{module-kebab}` に\n   自動変換する（既存の挙動と同一）。\n\n#### topic スコープ\n\n1. 各シードについて `Grep` で定義箇所と参照箇所を収集する。`EXCLUDE_PATTERNS` \u002F `INCLUDE_EXTENSIONS` を適用する\n2. `CATALOG_AVAILABLE = true` の場合、`module-catalog.md`「## 3. シンボル索引」でシードを引き、\n   索引が示すファイルを集合に加える\n3. 得られたファイル集合を `TARGET_FILES` とする\n\n**探索深さは 1 hop 固定とする。** シードの直接の定義元・参照元までを対象とし、さらに追う必要がある場合は\n人が追加シードを与えて再実行する（多段の波及展開は工程4a（specout）の役割であり、survey では担わない）。\n件数の自動閾値は設けない（Step 3 で全件提示して人が承認する）。\n\n**`TOPIC_SLUG` の導出:**\n各シードを次の規則で個別にスラグ化する:「スペース・`\u002F`・`_` をいずれもハイフンに変換し小文字化する。\n連続するハイフンは1個に畳み込む」（例: `g_state` → `g-state`）。\n**複数シード指定時:** 各シードを上記規則で個別にスラグ化した後、**アルファベット順にソートしてから\n`--`（ハイフン2連）で連結する**（例: シード `foo`・`g_state` → `foo--g-state`）。指定順ではなくソート順を\n用いるため、シードの列挙順序が異なっても同一の `TOPIC_SLUG` になる。\n\n**再調査時の扱い:** 同一 `MODULE_KEBAB`（module）\u002F `TOPIC_SLUG`（topic）の SURVEY 成果物が既に存在する\n場合は上書きする（過去分が必要な場合は人が事前に退避する）。\n\n---\n\n### Step 3（確認ゲート）: 対象ファイル一覧・出力先・想定トークン規模の確認\n\n`MODE = promote` の場合はこの Step をスキップする。\n\n**`SURVEY_FILE` の出力先:**\n| スコープ | 出力先 |\n|---|---|\n| module | `{WORKSPACE_ROOT}\u002F{XDDP_DIR}\u002Fsurvey\u002F{REPO_NAME}\u002Fmodule\u002F{MODULE_KEBAB}\u002FSURVEY-{MODULE_KEBAB}.md` |\n| topic | `{WORKSPACE_ROOT}\u002F{XDDP_DIR}\u002Fsurvey\u002F{REPO_NAME}\u002Ftopic\u002FSURVEY-{TOPIC_SLUG}.md` |\n\n対象（module: モジュールごと、topic: 1件）を**一括して**次の内容で提示する:\n\n> **調査対象確認**\n> | # | スコープ | 解決方法 | 対象ファイル数 | 出力先 |\n> |---|---|---|---|---|\n> | 1 | {module: {module名} \u002F topic: {SEEDS}} | {module-catalog ／ ディレクトリ一致 ／ ファイル名一致フォールバック（縮退） ／ —（topic）} | {N} | {SURVEY_FILE} |\n>\n> 対象ファイル一覧: {TARGET_FILES を対象ごとに列挙}\n> {ファイル名一致で複数候補が絞り込まれず全件採用した場合のみ、該当モジュールごとに1行}⚠️ モジュール `{module名}` は同名ファイルが複数見つかったため候補全件を対象にしています。絞り込む場合は「対象を絞り込む」を選択してください。\n> 想定トークン規模: 目安 {対象ファイルの合計行数から概算}\n>\n> このまま調査を実行しますか？ [はい \u002F いいえ \u002F 対象を絞り込む]\n\n**「解決方法」列の値:** `CATALOG_AVAILABLE = true` で解決した行は `module-catalog`、`CATALOG_AVAILABLE = false`\nかつ Step 1 で `DIR_MATCHED[module] = true` の行は `ディレクトリ一致`、`DIR_MATCHED[module] = false` から\nファイル名一致で解決した行は `ファイル名一致フォールバック（縮退）`、topic スコープの行は `—（topic）` を表示する。\n`CATALOG_AVAILABLE = true` 時のモジュール解決ロジック自体（Step 2 参照）は、この表示列の追加以外変更しない。\n\n**承認前は一切書き込まない。** 承認後、Step 4 へ進む。「対象を絞り込む」の場合は Step 2 に戻る。\n\n---\n\n### Step 4: xddp-survey-agent の起動（調査の完了点）\n\n`MODE = promote` の場合はこの Step をスキップする（Step 0.5 で選択した既存 SURVEY を使う）。\n\n対象（module スコープは対象モジュールごとに1回、topic スコープは1回）ごとに **Agent tool**\n`subagent_type=xddp-survey-agent`:\n```\nREPO_NAME: {REPO_NAME}\nREPO_PATH: {REPO_PATH}\nSCOPE_KIND: module|topic\nSCOPE_NAME: {module名 または SEEDS の列挙}\nMODULE_KEBAB: {module スコープのときのみ}\nTARGET_FILES: {Step 2 で確定した当該対象のファイル一覧}\nDOCS: {DOCS}\nMODULE_CATALOG_FILE: {CATALOG_FILE（不在時は空文字列）}\nOUTPUT_FILE: {Step 3 で確定した SURVEY_FILE}\nTODAY: {TODAY}\nSPECOUT_DIAGRAM_LEVEL: {SPECOUT_DIAGRAM_LEVEL}\nSPECOUT_SEQUENCE_LEVELS: {SPECOUT_SEQUENCE_LEVELS}\n```\n\n**ここが「調査」の完了点である。** 以降の Step 4.5〜8 は昇格の選択に応じてのみ実行する。\n\n---\n\n### Step 4.5（昇格ゲート）\n\n対象（module: モジュールごと、topic: 1件。`MODE = promote` の場合は Step 0.5 で選択した各ファイル）\nごとに次を提示する:\n\n> **調査が完了しました:** `{SURVEY_FILE}`\n>\n> この結果をどう扱いますか？\n> (a) 調査のみで終了（`{XDDP_DIR}\u002Fsurvey\u002F` に残す。baseline は変更しない）\n> (b) knowledge へ昇格（`{DOCS}\u002F{REPO_NAME}\u002Fknowledge\u002Fcode-knowledge\u002F` へ登録）\n> (c) specs へ昇格（`{DOCS}\u002F{REPO_NAME}\u002Fspecs\u002F{module}\u002F` へ登録）{`SCOPE_KIND: topic` の場合は\n>     「— topic スコープのため選択不可」を付記し選択肢から外す}\n\n(a) を選んだ場合: 何もせず Step 9 へ進む（SURVEY 成果物は `{XDDP_DIR}\u002Fsurvey\u002F` に残る）。\n(b) を選んだ場合: Step 5 へ進む。(c) を選んだ場合: Step 6 へ進む。\n\n---\n\n### Step 5（(b) を選んだ場合）: knowledge への昇格\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-rules\u002Fcode-knowledge-boundary.md`, apply \"## 宛先ルーティング表\"\n  → let `KNOWLEDGE_ROUTING`, and \"## 知見の置き場所（MODULE）\" → let `KNOWLEDGE_PLACE`.\n\n**SURVEY 節 → knowledge 昇格の対応と昇格条件:**\n| SURVEY 節（04_specout-module-template.md 由来） | 昇格条件 | 適用軸 | 昇格先 |\n|---|---|---|---|\n| 2.4 定数・列挙値一覧 \u002F 2.5 グローバル変数一覧 | モジュール横断で参照・変更されるもののみ | 軸2 | `_constants\u002F{DOMAIN}-constants.md` |\n| 2.5 グローバル変数の更新元・参照元 | モジュール横断の識別子のみ | 軸2 | `_flows\u002F{DOMAIN}-{VAR_NAME}-callgraph.md` |\n| 2.6 制約・前提条件 | 常に | 軸1 | `{MODULE}\u002Fconstraints.md`（`{MODULE}` は `KNOWLEDGE_PLACE`。項目ごとに決める） |\n| 4.2 データ型関連図 \u002F 4.3 データ構造 | 落とし穴・注意点の記述が伴う場合のみ | 軸1 | `_structures\u002F{DOMAIN}-relations.md` |\n| 2.1 処理フロー \u002F 4.5 モジュール内シーケンス図 | 複数モジュールにまたがるフローのみ | 軸2 | `_flows\u002F{DOMAIN}-{FLOW_NAME}-sequence.md` |\n\n上記の**昇格条件を満たす節のみ**を選択候補として人に提示し（条件を満たさない節はそもそも候補に出さない）、\n「どの節を昇格するか」（`SELECTED_SECTIONS` — 候補からの部分選択。人が今回は省略したい節を外せる）と\nドメイン名（`DOMAIN`）を確定させる。module スコープの survey は単一モジュールが対象のため、軸2に該当する\n項目は少ない（「module スコープで昇格対象がゼロ件」は正常。軸2の主な供給源は topic スコープ）。\n\n**`MODULE_FALLBACK`（パスの無い制約の置き場所）の決定**（`MODE = promote` でも同じ。`SURVEY_FILE` から決める）:\n- module スコープ: `SURVEY_FILE` の「## 1. モジュール概要」の「ディレクトリ」欄の値を1件の対象として、`KNOWLEDGE_PLACE` に従い\n  引用符付きのヒアドキュメントで stdin に渡して Run via Bash:\n  ```\n  PY=$(command -v python3 || command -v python) && \"$PY\" ~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fscripts\u002Fknowledge_place.py place --repo-root {REPO_PATH} --workspace-root {WORKSPACE_ROOT} \u003C\u003C'EOF'\n  [{\"id\": \"survey-dir\", \"targets\": [\"{「ディレクトリ」欄の値}\"]}]\n  EOF\n  ```\n  返った `module` を `MODULE_FALLBACK` にする。ただし、値が `.`・`.\u002F`・空・プレースホルダーのまま・読めない場合、\n  または `module` が `_root` の場合は `_general` にする。\n  終了コードが 0 以外なら `MODULE_FALLBACK` を `_general` にし、その旨を Step 9 で示す。\n- topic スコープ: `_general`（2.6 由来の constraints.md 昇格は module スコープのみで発生する）。\n\n**Agent tool** `subagent_type=xddp-survey-promote-agent`:\n```\nREPO_NAME: {REPO_NAME}\nREPO_PATH: {REPO_PATH}\nWORKSPACE_ROOT: {WORKSPACE_ROOT}\nSURVEY_FILE: {SURVEY_FILE}\nSELECTED_SECTIONS: {SELECTED_SECTIONS}\nDOMAIN: {DOMAIN}\nMODULE_FALLBACK: {MODULE_FALLBACK}\nDOCS: {DOCS}\nTODAY: {TODAY}\n```\n\nエージェントの返答の「置き場所の確認が要る制約」を Let `PLACE_NOTES` とし、Step 9 で示す。\n\n**AI_INDEX.md の作り直し:** Run via Bash（調べた repo だけでなく全 repo を渡す）:\n`PY=$(command -v python3 || command -v python) && \"$PY\" ~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fscripts\u002Fai_index.py build --docs {DOCS} --repos-keys {REPOS_KEYS をカンマ区切り} {IS_MULTI の場合のみ}--is-multi`\n失敗したら Let `AI_INDEX_ERROR` = stderr の1行目（昇格は取り消さない）。\n\n完了後 Step 9 へ進む。`specs\u002F` は変更しない。\n\n---\n\n### Step 6（(c) を選んだ場合）: specs への昇格・衝突判定\n\n**冒頭で対象の全モジュールの衝突判定をまとめて実行する。** モジュールごとに\n`{WORKSPACE_ROOT}\u002F{XDDP_DIR}\u002Flatest-specs\u002F{REPO_NAME}\u002F{MODULE_KEBAB}\u002Fspec.md` の frontmatter `source` を\n確認する。\n\n| 既存 `source` | 動作 |\n|---|---|\n| なし（ファイル自体が不在） | 新規生成 |\n| `survey` | 上書き再生成する |\n| `spo` | 既定はスキップ。全対象モジュールの判定完了後、`spo` 衝突モジュールが1件以上あれば下記の\n  一括確認を1回だけ行う |\n\n`spo` 衝突モジュールが1件以上ある場合、その全件を**1回の確認でまとめて**提示する\n（モジュールごとに個別のダイアログを複数回出さない。「なし」「`survey`」は自動判定のみで人に問わない）:\n\n> 以下のモジュールは CR で検証済みの仕様（`source: spo`）が既に存在します。\n> | モジュール |\n> |---|\n> | {module} |\n>\n> 全上書きしますか？（survey の内容で置き換えます。CR 検証済みの内容は失われます） [スキップ \u002F 全上書き]\n\n「スキップ」を選んだモジュールは以降のループから除外する（既存 `spec.md` は一切変更しない）。\n\n対象モジュールごとに **Agent tool** `subagent_type=xddp-specs-mod-agent`（**1モジュール1回**）:\n```\nCR_NUMBER: SURVEY-{TODAY}\nCR_PATH: （空文字列）\nXDDP_DIR: {XDDP_DIR}\nREPO_NAME: {REPO_NAME}\nREPO_PATH: {REPO_PATH}\nDOCS: {DOCS}\nTODAY: {TODAY}\nSURVEY_MODE: true\nSURVEY_FILE: {当該モジュールの SURVEY_FILE}\nMODULE_SCOPE: [{MODULE_KEBAB}]\nMODULE_KEBAB: {MODULE_KEBAB}\nOUTPUT_FILE: {WORKSPACE_ROOT}\u002F{XDDP_DIR}\u002Fsurvey\u002F{REPO_NAME}\u002Fmodule\u002F{MODULE_KEBAB}\u002FPENDING-MOD-SURVEY-{TODAY}.md\n```\n\n---\n\n### Step 7（(c) のみ）: レビュー ＋ インライン自動修正（最大1サイクル）\n\nStep 6 で生成・更新した `latest-specs\u002F{REPO_NAME}\u002F{MODULE_KEBAB}\u002F` 配下の全ファイルを `TARGET_FILES` とする。\nStep 8② で `architecture.md` を新規作成・追記した場合はそれも `TARGET_FILES` に含める。\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Finvoke-reviewer.md`, apply \"## Invoke Reviewer\" with:\n```\nDOCUMENT_TYPE: SPEC\nTARGET_FILES: {上記ファイル一覧}\nREFERENCE_FILES: [{対象モジュールの SURVEY_FILE を列挙}]\nREVIEW_ROUND: 1\nOUTPUT_FILE: {WORKSPACE_ROOT}\u002F{XDDP_DIR}\u002Fsurvey\u002F{REPO_NAME}\u002Freview\u002FSPEC-SURVEY-{TODAY}.md\n```\n\nRead `{OUTPUT_FILE}`。?（自動修正対象カテゴリ: Mermaid 図の構文エラー・フロントマター必須キーの漏れ・\n変更履歴エントリの形式不備・気づきメモセクションの有無）があれば、スキル自身が直接該当ファイルを編集して\n修正する（最大1回。工程11 Step REV と同一方式）。修正後、`REVIEW_ROUND: 2` で `apply \"## Invoke Reviewer\"`\nを再実行し `{OUTPUT_FILE}` を上書きする。それ以外の指摘（?。SPO 内容との矛盾等）は本スキルでは自動修正せず、\nStep 8 の人レビューゲートに委ねる。\n\n**`REVIEW_MAX_ROUNDS.SPEC` \u002F `FIX_STRATEGY.SPEC` は使用しない**（修正サイクルは常に最大1回固定）。\n\n---\n\n### Step 8（(c) のみ）: 人レビューゲート・DOCS への昇格\n\n人に `{OUTPUT_FILE}` の確認を促し、承認を待つ。承認前は DOCS 側に一切書き込まない。\n\n承認後、以下を実行する:\n\n**① spec コピー（今回生成・更新したモジュールのみ）:**\n```\nFor each {module} in （Step 6 で生成・更新したモジュール一覧）:\n  Copy {WORKSPACE_ROOT}\u002F{XDDP_DIR}\u002Flatest-specs\u002F{REPO_NAME}\u002F{module}\u002F\n    → {DOCS}\u002F{REPO_NAME}\u002Fspecs\u002F{module}\u002F\n```\nこのコピーでは `overview\u002F` および他モジュールには一切触れない（`architecture.md` への追記は②で別途行う）。\n\n**② `latest-specs\u002F{REPO_NAME}\u002Foverview\u002Farchitecture.md` への追記（追記のみ）:**\nLet `ARCH_FILE` = `{WORKSPACE_ROOT}\u002F{XDDP_DIR}\u002Flatest-specs\u002F{REPO_NAME}\u002Foverview\u002Farchitecture.md`。\n- `ARCH_FILE` が存在しない場合: `~\u002F.claude\u002Fskills\u002Fxddp-11-specs\u002Ftemplates\u002F11_overview-architecture-template.md`\n  から新規作成し、対象モジュールのエントリのみを記載する（`overview\u002F` ディレクトリも併せて作成する）。\n  **このテンプレートを正本とし、セクション構成・テーブル列構成を再定義してはならない。**\n- `ARCH_FILE` が存在する場合: 「## 3. モジュール一覧」テーブルに今回対象モジュールの行が無ければ追記する\n  （既に存在する場合はスキップ）。「## 2. アーキテクチャ図（コンポーネント図）」に今回モジュールのノードが\n  無い場合はノードのみ追加する。**他モジュールのエントリの更新・削除・並べ替え、図の全体再生成は禁止。**\n\n**③ AI_INDEX.md の作り直し:**\n- `{DOCS}` ディレクトリが存在しない場合: 作り直しをスキップし、次の警告を表示する（`{DOCS}` の\n  初回作成は `xddp-01-init` が担うため survey は作成しない）:\n  > ⚠️ `{DOCS}` が存在しないため AI_INDEX.md の更新をスキップしました。`\u002Fxddp-01-init` の実行後に\n  > `\u002Fxddp-survey {REPO_NAME} promote` を再実行してください。\n- それ以外: Run via Bash（調べた repo だけでなく全 repo を渡す）:\n  `PY=$(command -v python3 || command -v python) && \"$PY\" ~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fscripts\u002Fai_index.py build --docs {DOCS} --repos-keys {REPOS_KEYS をカンマ区切り} {IS_MULTI の場合のみ}--is-multi`\n  失敗したら Let `AI_INDEX_ERROR` = stderr の1行目（①・② は取り消さない）。\n\nStep 9 のサマリーに①〜③それぞれの結果（実施／スキップ／新規作成）を明示する。\n\n---\n\n### Step 9: 結果サマリー\n\nTell the user（日本語）:\n\n> **母体調査が完了しました**\n>\n> | 項目 | 内容 |\n> |---|---|\n> | リポジトリ | {REPO_NAME} |\n> | スコープ | {SCOPE_KIND}: {SCOPE_NAME} |\n> | 調査結果 | `{SURVEY_FILE}` |\n> | 選択 | (a) 調査のみ ／ (b) knowledge 昇格 ／ (c) specs 昇格 |\n> {選択に応じた出力先・Step 8 ①〜③ の結果を記載}\n> {(b) の場合: **置き場所の確認が要る制約:** {PLACE_NOTES と、MODULE_FALLBACK の決定で置き場所のスクリプトが失敗した旨, or \"なし\"}}\n> {AI_INDEX_ERROR がある場合: ⚠️ AI_INDEX.md の作り直しに失敗しました（{AI_INDEX_ERROR}）。昇格は済んでいます。`ai_index.py build` を再実行してください}\n>\n> **`{XDDP_DIR}\u002Fsurvey\u002F` の扱い:** SURVEY 成果物は人が任意に削除してください。ツール側では自動削除しません\n> （CR フォルダと異なりクローズ契機を持たないため。`xddp-close` は `survey\u002F` を参照しません）。VCS 管理の\n> 要否はプロジェクト判断です。\n>\n> **次のステップ:**\n> - 追加調査する場合: `\u002Fxddp-survey {REPO_NAME} module {module}` または `topic {seed}` を再実行してください\n> - 保留中の SURVEY 成果物を後から昇格する場合: `\u002Fxddp-survey {REPO_NAME} promote` を実行してください\n\nprogress.md は CR 非依存のため更新しない。\n\n---\n> **保守メモ:** このファイルを変更した場合は、`README.md`（スキル一覧テーブル）、`CLAUDE.md`\n> （ステップ番号体系テーブル）も合わせて更新すること。\n",{"name":5,"description":7,"argument-hint":29},"[repo名] [module {モジュール名}... | topic {シード}... | promote]","main","042a4ff56d7618af83f802295e7a38c851e78da2","ClaudeCode\u002F.claude\u002Fskills\u002Fxddp-survey",0,"https:\u002F\u002Fgithub.com\u002Ftsuna44\u002FXddpSettings","https:\u002F\u002Fgithub.com\u002Ftsuna44","2026-11-08 08:45:39",{"source":8,"skillName":5,"commands":38,"prompt":48,"zipAvailable":49},[39,42,45],{"tool":40,"command":41},"npx","npx skills add tsuna44\u002FXddpSettings --skill xddp-survey",{"tool":43,"command":44},"bunx","bunx skills add tsuna44\u002FXddpSettings --skill xddp-survey",{"tool":46,"command":47},"pnpm","pnpm dlx skills add tsuna44\u002FXddpSettings --skill xddp-survey","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Ftsuna44\u002FXddpSettings\u002Fblob\u002Fmain\u002FClaudeCode\u002F.claude\u002Fskills\u002Fxddp-survey\u002FSKILL.md",true,[],[52,65,72,80,87,107],{"skillNo":53,"name":54,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":55,"categories":56,"keywords":62,"publishedAt":24},"01M6MDVNN0ZX8D5KABK9G0067Z","demo.skill","https:\u002F\u002Fgithub.com\u002Ftsuna44\u002FXddpSettings\u002Fblob\u002Fmain\u002Ftools\u002Fharness\u002Ftests\u002Ffixtures\u002Fbadrepo\u002FClaudeCode\u002F.claude\u002Fskills\u002Fdemo.skill\u002FSKILL.md",[57],{"categoryNo":58,"categoryName":59,"taxonomyType":60,"taxonomyTypeDesc":61},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[63,64],"demo skill","demo",{"skillNo":66,"name":67,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":68,"categories":69,"keywords":70,"publishedAt":24},"01M6MDVK20HAJYBMXM7VX50A3J","demo.noname","https:\u002F\u002Fgithub.com\u002Ftsuna44\u002FXddpSettings\u002Fblob\u002Fmain\u002Ftools\u002Fharness\u002Ftests\u002Ffixtures\u002Fbadrepo\u002FClaudeCode\u002F.claude\u002Fskills\u002Fdemo.noname\u002FSKILL.md",[],[71,64],"demo noname",{"skillNo":73,"name":74,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":24},"01M6MDVFS20532JT4V7WT779XH","demo.common","https:\u002F\u002Fgithub.com\u002Ftsuna44\u002FXddpSettings\u002Fblob\u002Fmain\u002Ftools\u002Fharness\u002Ftests\u002Ffixtures\u002Fbadrepo\u002FClaudeCode\u002F.claude\u002Fskills\u002Fdemo.common\u002FSKILL.md",[],[78,79,64],"demo common","common",{"skillNo":81,"name":82,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":85,"publishedAt":24},"01M6MDVCV2JFN66NJTFG1CCJS1","demo.badname","https:\u002F\u002Fgithub.com\u002Ftsuna44\u002FXddpSettings\u002Fblob\u002Fmain\u002Ftools\u002Fharness\u002Ftests\u002Ffixtures\u002Fbadrepo\u002FClaudeCode\u002F.claude\u002Fskills\u002Fdemo.badname\u002FSKILL.md",[],[86,64],"demo badname",{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":96,"publishedAt":24},"01M6MDV7CHGZGPXR0MQ44VC4C1","xddp-update-knowledge","任意のタイミングで baseline_docs\u002F の knowledge ディレクトリに知識を追加・更新する。CR 非依存。対話形式と引数形式に対応。「知識を登録して」「callgraph を記録して」「メモを保存して」などで起動する。","https:\u002F\u002Fgithub.com\u002Ftsuna44\u002FXddpSettings\u002Fblob\u002Fmain\u002FClaudeCode\u002F.claude\u002Fskills\u002Fxddp-update-knowledge\u002FSKILL.md",[93],{"categoryNo":94,"categoryName":95,"taxonomyType":60,"taxonomyTypeDesc":61},"01JBSEEDCAT000000000000021","资料检索与研究",[97,98,22,99,100,101,102,103,104,21,105,106],"xddp update knowledge","update knowledge","update","note","structure","constraint","lesson","glossary","flow","docs",{"skillNo":108,"name":109,"nameZh":6,"description":110,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":121,"publishedAt":24},"01M6MDV2Q1Z02WAN4CZ2WVFZ27","xddp-sync-design","コードから DSN を再生成してリビジョンとして記録し、AIレビュー→人承認を実施する。「設計を同期して」「DSN を更新して」などで起動する。","https:\u002F\u002Fgithub.com\u002Ftsuna44\u002FXddpSettings\u002Fblob\u002Fmain\u002FClaudeCode\u002F.claude\u002Fskills\u002Fxddp-sync-design\u002FSKILL.md",[113,116],{"categoryNo":114,"categoryName":115,"taxonomyType":60,"taxonomyTypeDesc":61},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":117,"categoryName":118,"taxonomyType":119,"taxonomyTypeDesc":120},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[122,123,124,125],"sync","xddp sync design","design","生成"]