[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6MDR4QGCTHTK0BYKZYPE2V8":3,"skill-same:01M6MDR4QGCTHTK0BYKZYPE2V8":56},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":14,"categories":15,"keywords":21,"publishedAt":24,"linkOnly":25,"markdownContent":26,"markdownBody":27,"frontMatter":28,"refName":29,"commitSha":30,"skillDirectory":31,"forksCount":32,"repositoryHtmlUrl":33,"repositoryHomepageUrl":6,"ownerHtmlUrl":34,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":35,"install":36,"resources":49},"01M6MDR4QGCTHTK0BYKZYPE2V8","xddp-09-test",null,"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-09-test\u002FSKILL.md",[16],{"categoryNo":17,"categoryName":18,"taxonomyType":19,"taxonomyTypeDesc":20},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[22,23],"test","xddp 09 test","2026-11-10 10:12:30",false,"---\nname: xddp-09-test\ndescription: XDDP フェーズ5: テスト仕様書（TSP）を生成し、AIレビュー→人レビューで品質を確定する。テスト実行は `\u002Fxddp-10-test-run` で行う。「テスト設計して」「テスト仕様書を作って」などで起動する。\nargument-hint: \"[CR番号]\"\n---\n\nYou are orchestrating **XDDP Step 09 (process step 9) — Test Specification**.\n\n> The test specification you produce here defines the release gate. Coverage gaps become production incidents. Orchestrate with rigor — every missed test case is a risk accepted on behalf of every user. Test execution is a separate command (`\u002Fxddp-10-test-run`); this skill stops once the TSP is reviewed and confirmed.\n\n**Arguments:** $ARGUMENTS = [CR_NUMBER] (optional)\n\n---\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002FSKILL.md`, apply \"## CR Resolution\" with $ARGUMENTS → let `CR`, `REST_ARGS`.\nLet `TODAY` = today's date.\n\n(xddp.config.md lookup done in xddp-common\u002FSKILL.md「## CR Resolution」; reuse WORKSPACE_ROOT, XDDP_DIR,\nREPOS_MAP, REPOS_KEYS, IS_MULTI, DOCS_DIR, DOCS, MIN_COVERAGE, TEST_COVERAGE_TARGET, CR_PROFILE.)\nLet `CR_PATH` = `{WORKSPACE_ROOT}\u002F{XDDP_DIR}\u002F{CR}`.\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002FSKILL.md`, apply \"## Resolve Affected Repos\" with:\n  REPOS_KEYS: {REPOS_KEYS}, IS_MULTI: {IS_MULTI}, CR_PATH: {CR_PATH}, FILTER_BY_SPO: false\n→ let `AFFECTED_REPOS`.\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002FSKILL.md`, apply \"## Resolve HAS_CROSS\" with:\n  IS_MULTI: {IS_MULTI}, ARTIFACT_PATH: {CR_PATH}\u002F06_design\u002Fcross\u002FCHD-{CR}-cross.md\n→ let `HAS_CROSS`.\n（本工程は design の cross CHD の有無で cross 処理要否を判断する。CHD は工程6a・7で共通利用するため\n07.code と同じ ARTIFACT_PATH を用いる）\n\n(`TEST_FRAMEWORK`・`TEST_FRAMEWORK_REPOS` は「## CR Resolution」の config バンドルから reuse する。)\n\n## Step 0: Reference Past TSPs and TRSs from DOCS_DIR\n\nFor each `{repo}` in `AFFECTED_REPOS`:\n1. Let `TEST_DIR` = `{DOCS}\u002F{repo}\u002Ftest\u002F`.\n2. If `{TEST_DIR}` exists:\n   a. Read `{DOCS}\u002FAI_INDEX.md` to find past TSP\u002FTRS list for `{repo}`.\n   b. Load up to 3 TSP files related to changed components.\n   c. Load up to 2 TRS files related to changed components\n      （`## 3. NG詳細` セクションのみ参照。目的: 過去に失敗した回帰テストの把握）\n3. Record in TSP \"referenced past test specs\" section.\n\n## Step 0.3: Check Regression Scope\n\n`DEVELOPMENT_MODE` が `new` なら行わない。\nFor each `{repo}` in AFFECTED_REPOS（cross を除く）:\n  Read `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Fregression-status.md`, apply \"## Regression Status\"（CR: {CR}, CR_PATH: {CR_PATH}, REPO: {repo}, MODE: status）→ `STALE`, `RECORDED`, `COCHANGE_STALE`, `COCHANGE_RECORDED`, `COCHANGE_FORMAT_ERROR`.\n  回帰の範囲は `{CR_PATH}\u002F04_specout\u002F{repo}\u002FSPO-{CR}.md` がある repo だけで判定する（`STALE` が true または `RECORDED` が false）。一緒に直す候補は SPO によらず判定する（`COCHANGE_STALE` が true または `COCHANGE_RECORDED` が false）。\nどちらかに当たる repo があれば、それらをまとめて一覧にし、1回だけ尋ねる（当たらない側の行は書かない）:\n  > 次の repo の回帰の範囲（CHD §7 の回帰の行）が、CHD §4・採用した波紋調査・設定より古いか、作られていません: {repo の一覧}\n  > 次の repo の一緒に直す候補（CHD §4・§4.1）が CHD §4・設定より古いか、作られていません: {repo の一覧。`COCHANGE_FORMAT_ERROR` が空でない repo には「（CHD §4.1 の表の書式の誤り: {COCHANGE_FORMAT_ERROR}。先に \u002Fxddp-revise {CR} design で直す）」を添える}\n  > 1. やり直してから TSP を作る（\u002Fxddp-06-design {CR} regression を実行してから \u002Fxddp-09-test {CR} を再実行してください）\n  > 2. このまま TSP を作る\n1 なら終わる（工程9 はまだ進行中にしていない）。\n\n## Step 0.5: Mark In-Progress\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002FSKILL.md`, apply \"## Progress Update\" with:\n  CR_PATH: {CR_PATH}, STEP_NUM: 9, STATE: ? 進行中, DETAIL_STEP: `Step A: TSP生成中`\n（cross行の「レビュー」列を `—` に固定するのは、cross TSP に対する自動AIレビューループが\n存在しないため。6aのcross行は逆に「設計」列を `—` に固定しており、これは6aが「即時生成・\nレビューに時間がかかる」のに対し、9は「生成に時間がかかる・自動レビューが存在しない」という\n非対称な構造のためである）\nIf `IS_MULTI`, append a per-repo progress table for step 9:\n```markdown\n## 工程9 テスト仕様書進捗（リポジトリ別）\n| リポジトリ | 生成 | レビュー | 完了日 |\n|---|---|---|---|\n{for each repo in AFFECTED_REPOS: | {repo} | ⏳ 未着手 | ⏳ 未着手 | - |}\n{if HAS_CROSS: | cross | ⏳ 未着手 | — | - |}\n```\nWrite back.\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Fsnapshot-phase-baseline.md`, apply \"## Snapshot Phase Baseline\" with:\n  CR_PATH: {CR_PATH}, STEP_NUM: 9\n\n## Step A0: Reference Lessons Learned Log\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Fload-lessons-context.md`, apply \"## Load Lessons Context\" with:\n  LESSONS_FILE: {XDDP_DIR}\u002Flessons-learned.md\n  TARGET_TAGS: [#テスト, #不具合, #テスト観点, #見落とし]\n→ let `LESSONS_CONTEXT`.\n\n## Step A: Generate Test Specifications (per repo)\n\n`IS_MULTI` = true（マルチリポジトリ）の場合:\n  Agent ツールで各リポジトリの TSP 生成を**並列呼び出し**する（各リポジトリの CHD・SPO は独立しており、TSP 生成に相互依存がないため並列実行可能。xddp-04-specout の Discovery Phase と同様のパターン）。\n\n`IS_MULTI` = false（シングルリポジトリ）の場合:\n  順次呼び出しでよい。\n\nLet `TEST_TEMPLATE_FILE` = ~\u002F.claude\u002Fskills\u002Fxddp-09-test\u002Ftemplates\u002F09_test-specification-template.md\n（{repo} に依存しないため、本 Step A 内で逐次実行される per-repo 呼び出し・cross 呼び出しの両方からこの1箇所の定義をそのまま参照できる）\n\nLet `WRITER_CALL_SHARED` =\n  CR_NUMBER: {CR}\n  TODAY: {TODAY}\n  MIN_COVERAGE: {MIN_COVERAGE}\n  TEST_COVERAGE_TARGET: {TEST_COVERAGE_TARGET}\n（{repo} に依存しないため、Step A per-repo・Step A cross・Step B FIXER_PARAMS の3箇所から\nこの1箇所の定義をそのまま参照できる。REPO_NAME は呼び出し箇所ごとに値が異なるため\n各呼び出し箇所に個別記述のまま残す）\n\nUpdate per-repo progress table for all repos in `AFFECTED_REPOS` at once: `| {repo} | ? 進行中 | ⏳ 未着手 | - |`\n\nFor each `{repo}` in `AFFECTED_REPOS`:\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Fload-steering-context.md`, apply \"## Load Steering Context\" with:\n  XDDP_DIR: {XDDP_DIR}\n  REPO_NAME: {repo}\n→ let `RULEBOOK_CONTEXT`.\nLet `REPO_TEST_FRAMEWORK` = `TEST_FRAMEWORK_REPOS[{repo}]` if defined, else use `TEST_FRAMEWORK` (default: `auto`).\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Fbuild-tsp-output-file.md`, apply \"## Build TSP Output File\" with:\n  CR_PATH: {CR_PATH}, REPO_NAME: {repo}, CR: {CR}\n→ let `TSP_OUTPUT_FILE`.\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002FSKILL.md`, apply \"## Discover CHD Files\" with:\n  CR_PATH: {CR_PATH}, REPO_NAME: {repo}, CR: {CR}\n→ let `CHD_CONTENT_FILES`.\n\n**Agent tool** `subagent_type=xddp-test-writer-agent`:\n```\n{WRITER_CALL_SHARED を展開}\nREPO_NAME: {repo}\nREPO_PATH: {REPOS_MAP[repo]}\nCHD_FILES: {CHD_CONTENT_FILES}\nCRS_FILE: {CR_PATH}\u002F03_change-requirements\u002FCRS-{CR}.md\n（{CR_PATH}\u002F04_specout\u002F{repo}\u002FSPO-{CR}.md が存在する場合のみ追加）SPO_FILE: {CR_PATH}\u002F04_specout\u002F{repo}\u002FSPO-{CR}.md\nVERIFY_FILE: {CR_PATH}\u002F08_code-review\u002FVERIFY-{CR}-{repo}.md (if exists)\n{TEST_TEMPLATE_FILE を展開}\nOUTPUT_FILE: {TSP_OUTPUT_FILE を展開}\nTEST_FRAMEWORK: {REPO_TEST_FRAMEWORK}\nRULEBOOK_CONTEXT: {RULEBOOK_CONTEXT}\n（Step A0 で LESSONS_CONTEXT が空でない場合のみ追加）LESSONS_CONTEXT: {LESSONS_CONTEXT}\n```\n\n全リポジトリの TSP 生成 Agent 呼び出しの完了を待ってから、対象repo全件をまとめて\n`| {repo} | ✅ 完了 | ⏳ 未着手 | - |` へ一括更新する。\n\nIf `HAS_CROSS`, after all per-repo TSPs are done, generate cross integration test spec:\n\nUpdate per-repo progress table: `| cross | ? 進行中 | — | - |`\n\nRead `{CR_PATH}\u002F06_design\u002Fcross\u002FCHD-{CR}-cross.md`.\n\n**Agent tool** `subagent_type=xddp-test-writer-agent`:\n```\n{WRITER_CALL_SHARED を展開}\nREPO_NAME: cross\nCHD_FILES: [{CR_PATH}\u002F06_design\u002Fcross\u002FCHD-{CR}-cross.md]\nCRS_FILE: {CR_PATH}\u002F03_change-requirements\u002FCRS-{CR}.md\n{TEST_TEMPLATE_FILE を展開}\nOUTPUT_FILE: {CR_PATH}\u002F09_test-spec\u002Fcross\u002FTSP-{CR}-cross.md\nTEST_FRAMEWORK: {TEST_FRAMEWORK}\nTEST_FOCUS: |\n  Focus on integration test cases that verify the inter-repo interface contract:\n  - Each interface in \"インタフェース変更サマリ\" must have at least 1 happy-path TC and 1 error TC.\n  - Verify consumer repos can receive and handle responses from provider repos correctly.\n```\n\nUpdate per-repo progress table: `| cross | ✅ 完了 | — | {TODAY} |`\n\n## Step B: Test Spec Review Loop (up to `REVIEW_MAX_ROUNDS.TSP` rounds)\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002FSKILL.md`, apply \"## Progress Update\" with:\n  CR_PATH: {CR_PATH}, STEP_NUM: 9, STATE: ? 進行中, DETAIL_STEP: `Step B: AIレビュー中`\n\nFor each `{repo}` in `AFFECTED_REPOS`:\n\nUpdate per-repo progress table: `| {repo} | ✅ 完了 | ? 進行中 | - |`\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Fload-steering-context.md`, apply \"## Load Steering Context\" with:\n  XDDP_DIR: {XDDP_DIR}\n  REPO_NAME: {repo}\n→ let `RULEBOOK_CONTEXT`.\nLet `REPO_TEST_FRAMEWORK` = `TEST_FRAMEWORK_REPOS[{repo}]` if defined, else use `TEST_FRAMEWORK` (default: `auto`).\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Fbuild-tsp-output-file.md`, apply \"## Build TSP Output File\" with:\n  CR_PATH: {CR_PATH}, REPO_NAME: {repo}, CR: {CR}\n→ let `TSP_OUTPUT_FILE`.\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002FSKILL.md`, apply \"## Discover CHD Files\" with:\n  CR_PATH: {CR_PATH}, REPO_NAME: {repo}, CR: {CR}\n→ let `CHD_CONTENT_FILES`.\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Freview-loop.md`, apply \"## Review Loop\" with:\n  DOCUMENT_TYPE: TSP\n  CONFIG_KEY: REVIEW_MAX_ROUNDS.TSP\n  TARGET_FILE: {CR_PATH}\u002F09_test-spec\u002F{repo}\u002FTSP-{CR}.md\n  REFERENCE_FILES: [{CHD_CONTENT_FILES を展開}, {CR_PATH}\u002F03_change-requirements\u002FCRS-{CR}.md, （{CR_PATH}\u002F04_specout\u002F{repo}\u002FSPO-{CR}.md が存在する場合のみ追加）{CR_PATH}\u002F04_specout\u002F{repo}\u002FSPO-{CR}.md]\n  REVIEW_OUTPUT_FILE: {CR_PATH}\u002F09_test-spec\u002F{repo}\u002Freview\u002F09_test-spec-review.md\n  FIXER_AGENT: xddp-test-writer-agent\n  FIXER_PARAMS:\n    {WRITER_CALL_SHARED を展開}\n    REPO_NAME: {repo}\n    TEST_FRAMEWORK: {REPO_TEST_FRAMEWORK}\n    RULEBOOK_CONTEXT: {RULEBOOK_CONTEXT}\n    OUTPUT_FILE: {TSP_OUTPUT_FILE を展開}\n    REVIEW_FILE: {CR_PATH}\u002F09_test-spec\u002F{repo}\u002Freview\u002F09_test-spec-review.md\n  PROGRESS_CR_PATH: {CR_PATH}\n  PROGRESS_STEP_NUM: 9\n  METRICS_TARGET: {repo}\n  EXTRA_REVIEWER_PARAMS:\n    MIN_COVERAGE: {MIN_COVERAGE}\n    TEST_COVERAGE_TARGET: {TEST_COVERAGE_TARGET}\n    （`CR_PROFILE` = `quick` の場合のみ追加）QUICK_PROFILE: `true`\n\nUpdate per-repo progress table: `| {repo} | ✅ 完了 | ✅ 完了 | {TODAY} |`\n\n## Step B2: Human Review Gate\n\nBuild `ARTIFACTS_TEXT` by expanding the following (AFFECTED_REPOS\u002FHAS_CROSS are already resolved\nin this skill's scope):\n```\n{for each repo in AFFECTED_REPOS:}\n- {repo}: `{CR_PATH}\u002F09_test-spec\u002F{repo}\u002FTSP-{CR}.md`\n  - AIレビュー: `{CR_PATH}\u002F09_test-spec\u002F{repo}\u002Freview\u002F09_test-spec-review.md`\n{if HAS_CROSS:}\n- cross: `{CR_PATH}\u002F09_test-spec\u002Fcross\u002FTSP-{CR}-cross.md`\n```\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Fhuman-review-gate.md`, apply \"## Human Review Gate\" with:\n  CR_PATH: {CR_PATH}\n  STEP_NUM: 9\n  STEP_LABEL: `Step B2`\n  ARTIFACTS_TEXT: {built above}\n  REVISE_COMMAND: `\u002Fxddp-revise {CR} test`（対象リポジトリを指定）\n→ let `CHANGED`.\n\nIf `CHANGED`:\n- For each `{repo}` in `AFFECTED_REPOS`: Read `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Ffinal-review-pass.md`,\n  apply \"## Final Review Pass\" with:\n    DOCUMENT_TYPE: TSP\n    TARGET_FILE: {CR_PATH}\u002F09_test-spec\u002F{repo}\u002FTSP-{CR}.md\n    REFERENCE_FILES: {Step B と同一}\n    REVIEW_ROUND: (last_round + 1)\n    OUTPUT_FILE: {CR_PATH}\u002F09_test-spec\u002F{repo}\u002Freview\u002F09_test-spec-review.md\n    EXTRA_REVIEWER_PARAMS:\n      MIN_COVERAGE: {MIN_COVERAGE}\n      TEST_COVERAGE_TARGET: {TEST_COVERAGE_TARGET}\n      （`CR_PROFILE` = `quick` の場合のみ追加）QUICK_PROFILE: `true`\n\n## Step C: Mark Test Spec Complete\n\n**状態遷移の注意（必須）:** `step 9`（テスト設計）→ ✅ 完了 は、本 Step C（＝ Step B2 人レビューゲート\n通過後）でのみ付与する。Step B2 を経ずにセッションが中断された場合は `step 9` を ✅ にせず、\n`? レビュー待ち`（Step B2 の Human Review Gate が設定した状態）のまま留めること。\nこれにより後続 `\u002Fxddp-10-test-run` の前提チェック「`step 9` ✅ = 人レビュー確定」が実効を持つ\n（✅ を無条件付与すると人レビュー実施有無に関わらず常に ✅ となり前提チェックが機能しないため）。\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002FSKILL.md`, apply \"## Progress Update\" with:\n  CR_PATH: {CR_PATH}, STEP_NUM: 9, STATE: ✅ 完了, DETAIL_STEP: `-`,\n  ARTIFACT_LINK: `[09_test-spec\u002F](09_test-spec\u002F)`\n次に実行すべきコマンド → `\u002Fxddp-10-test-run {CR}`\n\n## Step D: Report in Japanese\n\nReport:\n- 生成した TSP ファイル一覧（per repo + cross\u002F if applicable）\n- AIレビューのラウンド数・残指摘の有無\n- 次のアクション案内:\n  > ✅ テスト仕様書（TSP）を生成し、AIレビュー→人レビューで確定しました。\n  > - 修正が必要なら `\u002Fxddp-revise {CR} test`\n  > - 問題なければ `\u002Fxddp-10-test-run {CR}` でテストを実行してください。\n","You are orchestrating **XDDP Step 09 (process step 9) — Test Specification**.\n\n> The test specification you produce here defines the release gate. Coverage gaps become production incidents. Orchestrate with rigor — every missed test case is a risk accepted on behalf of every user. Test execution is a separate command (`\u002Fxddp-10-test-run`); this skill stops once the TSP is reviewed and confirmed.\n\n**Arguments:** $ARGUMENTS = [CR_NUMBER] (optional)\n\n---\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002FSKILL.md`, apply \"## CR Resolution\" with $ARGUMENTS → let `CR`, `REST_ARGS`.\nLet `TODAY` = today's date.\n\n(xddp.config.md lookup done in xddp-common\u002FSKILL.md「## CR Resolution」; reuse WORKSPACE_ROOT, XDDP_DIR,\nREPOS_MAP, REPOS_KEYS, IS_MULTI, DOCS_DIR, DOCS, MIN_COVERAGE, TEST_COVERAGE_TARGET, CR_PROFILE.)\nLet `CR_PATH` = `{WORKSPACE_ROOT}\u002F{XDDP_DIR}\u002F{CR}`.\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002FSKILL.md`, apply \"## Resolve Affected Repos\" with:\n  REPOS_KEYS: {REPOS_KEYS}, IS_MULTI: {IS_MULTI}, CR_PATH: {CR_PATH}, FILTER_BY_SPO: false\n→ let `AFFECTED_REPOS`.\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002FSKILL.md`, apply \"## Resolve HAS_CROSS\" with:\n  IS_MULTI: {IS_MULTI}, ARTIFACT_PATH: {CR_PATH}\u002F06_design\u002Fcross\u002FCHD-{CR}-cross.md\n→ let `HAS_CROSS`.\n（本工程は design の cross CHD の有無で cross 処理要否を判断する。CHD は工程6a・7で共通利用するため\n07.code と同じ ARTIFACT_PATH を用いる）\n\n(`TEST_FRAMEWORK`・`TEST_FRAMEWORK_REPOS` は「## CR Resolution」の config バンドルから reuse する。)\n\n## Step 0: Reference Past TSPs and TRSs from DOCS_DIR\n\nFor each `{repo}` in `AFFECTED_REPOS`:\n1. Let `TEST_DIR` = `{DOCS}\u002F{repo}\u002Ftest\u002F`.\n2. If `{TEST_DIR}` exists:\n   a. Read `{DOCS}\u002FAI_INDEX.md` to find past TSP\u002FTRS list for `{repo}`.\n   b. Load up to 3 TSP files related to changed components.\n   c. Load up to 2 TRS files related to changed components\n      （`## 3. NG詳細` セクションのみ参照。目的: 過去に失敗した回帰テストの把握）\n3. Record in TSP \"referenced past test specs\" section.\n\n## Step 0.3: Check Regression Scope\n\n`DEVELOPMENT_MODE` が `new` なら行わない。\nFor each `{repo}` in AFFECTED_REPOS（cross を除く）:\n  Read `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Fregression-status.md`, apply \"## Regression Status\"（CR: {CR}, CR_PATH: {CR_PATH}, REPO: {repo}, MODE: status）→ `STALE`, `RECORDED`, `COCHANGE_STALE`, `COCHANGE_RECORDED`, `COCHANGE_FORMAT_ERROR`.\n  回帰の範囲は `{CR_PATH}\u002F04_specout\u002F{repo}\u002FSPO-{CR}.md` がある repo だけで判定する（`STALE` が true または `RECORDED` が false）。一緒に直す候補は SPO によらず判定する（`COCHANGE_STALE` が true または `COCHANGE_RECORDED` が false）。\nどちらかに当たる repo があれば、それらをまとめて一覧にし、1回だけ尋ねる（当たらない側の行は書かない）:\n  > 次の repo の回帰の範囲（CHD §7 の回帰の行）が、CHD §4・採用した波紋調査・設定より古いか、作られていません: {repo の一覧}\n  > 次の repo の一緒に直す候補（CHD §4・§4.1）が CHD §4・設定より古いか、作られていません: {repo の一覧。`COCHANGE_FORMAT_ERROR` が空でない repo には「（CHD §4.1 の表の書式の誤り: {COCHANGE_FORMAT_ERROR}。先に \u002Fxddp-revise {CR} design で直す）」を添える}\n  > 1. やり直してから TSP を作る（\u002Fxddp-06-design {CR} regression を実行してから \u002Fxddp-09-test {CR} を再実行してください）\n  > 2. このまま TSP を作る\n1 なら終わる（工程9 はまだ進行中にしていない）。\n\n## Step 0.5: Mark In-Progress\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002FSKILL.md`, apply \"## Progress Update\" with:\n  CR_PATH: {CR_PATH}, STEP_NUM: 9, STATE: ? 進行中, DETAIL_STEP: `Step A: TSP生成中`\n（cross行の「レビュー」列を `—` に固定するのは、cross TSP に対する自動AIレビューループが\n存在しないため。6aのcross行は逆に「設計」列を `—` に固定しており、これは6aが「即時生成・\nレビューに時間がかかる」のに対し、9は「生成に時間がかかる・自動レビューが存在しない」という\n非対称な構造のためである）\nIf `IS_MULTI`, append a per-repo progress table for step 9:\n```markdown\n## 工程9 テスト仕様書進捗（リポジトリ別）\n| リポジトリ | 生成 | レビュー | 完了日 |\n|---|---|---|---|\n{for each repo in AFFECTED_REPOS: | {repo} | ⏳ 未着手 | ⏳ 未着手 | - |}\n{if HAS_CROSS: | cross | ⏳ 未着手 | — | - |}\n```\nWrite back.\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Fsnapshot-phase-baseline.md`, apply \"## Snapshot Phase Baseline\" with:\n  CR_PATH: {CR_PATH}, STEP_NUM: 9\n\n## Step A0: Reference Lessons Learned Log\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Fload-lessons-context.md`, apply \"## Load Lessons Context\" with:\n  LESSONS_FILE: {XDDP_DIR}\u002Flessons-learned.md\n  TARGET_TAGS: [#テスト, #不具合, #テスト観点, #見落とし]\n→ let `LESSONS_CONTEXT`.\n\n## Step A: Generate Test Specifications (per repo)\n\n`IS_MULTI` = true（マルチリポジトリ）の場合:\n  Agent ツールで各リポジトリの TSP 生成を**並列呼び出し**する（各リポジトリの CHD・SPO は独立しており、TSP 生成に相互依存がないため並列実行可能。xddp-04-specout の Discovery Phase と同様のパターン）。\n\n`IS_MULTI` = false（シングルリポジトリ）の場合:\n  順次呼び出しでよい。\n\nLet `TEST_TEMPLATE_FILE` = ~\u002F.claude\u002Fskills\u002Fxddp-09-test\u002Ftemplates\u002F09_test-specification-template.md\n（{repo} に依存しないため、本 Step A 内で逐次実行される per-repo 呼び出し・cross 呼び出しの両方からこの1箇所の定義をそのまま参照できる）\n\nLet `WRITER_CALL_SHARED` =\n  CR_NUMBER: {CR}\n  TODAY: {TODAY}\n  MIN_COVERAGE: {MIN_COVERAGE}\n  TEST_COVERAGE_TARGET: {TEST_COVERAGE_TARGET}\n（{repo} に依存しないため、Step A per-repo・Step A cross・Step B FIXER_PARAMS の3箇所から\nこの1箇所の定義をそのまま参照できる。REPO_NAME は呼び出し箇所ごとに値が異なるため\n各呼び出し箇所に個別記述のまま残す）\n\nUpdate per-repo progress table for all repos in `AFFECTED_REPOS` at once: `| {repo} | ? 進行中 | ⏳ 未着手 | - |`\n\nFor each `{repo}` in `AFFECTED_REPOS`:\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Fload-steering-context.md`, apply \"## Load Steering Context\" with:\n  XDDP_DIR: {XDDP_DIR}\n  REPO_NAME: {repo}\n→ let `RULEBOOK_CONTEXT`.\nLet `REPO_TEST_FRAMEWORK` = `TEST_FRAMEWORK_REPOS[{repo}]` if defined, else use `TEST_FRAMEWORK` (default: `auto`).\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Fbuild-tsp-output-file.md`, apply \"## Build TSP Output File\" with:\n  CR_PATH: {CR_PATH}, REPO_NAME: {repo}, CR: {CR}\n→ let `TSP_OUTPUT_FILE`.\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002FSKILL.md`, apply \"## Discover CHD Files\" with:\n  CR_PATH: {CR_PATH}, REPO_NAME: {repo}, CR: {CR}\n→ let `CHD_CONTENT_FILES`.\n\n**Agent tool** `subagent_type=xddp-test-writer-agent`:\n```\n{WRITER_CALL_SHARED を展開}\nREPO_NAME: {repo}\nREPO_PATH: {REPOS_MAP[repo]}\nCHD_FILES: {CHD_CONTENT_FILES}\nCRS_FILE: {CR_PATH}\u002F03_change-requirements\u002FCRS-{CR}.md\n（{CR_PATH}\u002F04_specout\u002F{repo}\u002FSPO-{CR}.md が存在する場合のみ追加）SPO_FILE: {CR_PATH}\u002F04_specout\u002F{repo}\u002FSPO-{CR}.md\nVERIFY_FILE: {CR_PATH}\u002F08_code-review\u002FVERIFY-{CR}-{repo}.md (if exists)\n{TEST_TEMPLATE_FILE を展開}\nOUTPUT_FILE: {TSP_OUTPUT_FILE を展開}\nTEST_FRAMEWORK: {REPO_TEST_FRAMEWORK}\nRULEBOOK_CONTEXT: {RULEBOOK_CONTEXT}\n（Step A0 で LESSONS_CONTEXT が空でない場合のみ追加）LESSONS_CONTEXT: {LESSONS_CONTEXT}\n```\n\n全リポジトリの TSP 生成 Agent 呼び出しの完了を待ってから、対象repo全件をまとめて\n`| {repo} | ✅ 完了 | ⏳ 未着手 | - |` へ一括更新する。\n\nIf `HAS_CROSS`, after all per-repo TSPs are done, generate cross integration test spec:\n\nUpdate per-repo progress table: `| cross | ? 進行中 | — | - |`\n\nRead `{CR_PATH}\u002F06_design\u002Fcross\u002FCHD-{CR}-cross.md`.\n\n**Agent tool** `subagent_type=xddp-test-writer-agent`:\n```\n{WRITER_CALL_SHARED を展開}\nREPO_NAME: cross\nCHD_FILES: [{CR_PATH}\u002F06_design\u002Fcross\u002FCHD-{CR}-cross.md]\nCRS_FILE: {CR_PATH}\u002F03_change-requirements\u002FCRS-{CR}.md\n{TEST_TEMPLATE_FILE を展開}\nOUTPUT_FILE: {CR_PATH}\u002F09_test-spec\u002Fcross\u002FTSP-{CR}-cross.md\nTEST_FRAMEWORK: {TEST_FRAMEWORK}\nTEST_FOCUS: |\n  Focus on integration test cases that verify the inter-repo interface contract:\n  - Each interface in \"インタフェース変更サマリ\" must have at least 1 happy-path TC and 1 error TC.\n  - Verify consumer repos can receive and handle responses from provider repos correctly.\n```\n\nUpdate per-repo progress table: `| cross | ✅ 完了 | — | {TODAY} |`\n\n## Step B: Test Spec Review Loop (up to `REVIEW_MAX_ROUNDS.TSP` rounds)\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002FSKILL.md`, apply \"## Progress Update\" with:\n  CR_PATH: {CR_PATH}, STEP_NUM: 9, STATE: ? 進行中, DETAIL_STEP: `Step B: AIレビュー中`\n\nFor each `{repo}` in `AFFECTED_REPOS`:\n\nUpdate per-repo progress table: `| {repo} | ✅ 完了 | ? 進行中 | - |`\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Fload-steering-context.md`, apply \"## Load Steering Context\" with:\n  XDDP_DIR: {XDDP_DIR}\n  REPO_NAME: {repo}\n→ let `RULEBOOK_CONTEXT`.\nLet `REPO_TEST_FRAMEWORK` = `TEST_FRAMEWORK_REPOS[{repo}]` if defined, else use `TEST_FRAMEWORK` (default: `auto`).\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Fbuild-tsp-output-file.md`, apply \"## Build TSP Output File\" with:\n  CR_PATH: {CR_PATH}, REPO_NAME: {repo}, CR: {CR}\n→ let `TSP_OUTPUT_FILE`.\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002FSKILL.md`, apply \"## Discover CHD Files\" with:\n  CR_PATH: {CR_PATH}, REPO_NAME: {repo}, CR: {CR}\n→ let `CHD_CONTENT_FILES`.\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Freview-loop.md`, apply \"## Review Loop\" with:\n  DOCUMENT_TYPE: TSP\n  CONFIG_KEY: REVIEW_MAX_ROUNDS.TSP\n  TARGET_FILE: {CR_PATH}\u002F09_test-spec\u002F{repo}\u002FTSP-{CR}.md\n  REFERENCE_FILES: [{CHD_CONTENT_FILES を展開}, {CR_PATH}\u002F03_change-requirements\u002FCRS-{CR}.md, （{CR_PATH}\u002F04_specout\u002F{repo}\u002FSPO-{CR}.md が存在する場合のみ追加）{CR_PATH}\u002F04_specout\u002F{repo}\u002FSPO-{CR}.md]\n  REVIEW_OUTPUT_FILE: {CR_PATH}\u002F09_test-spec\u002F{repo}\u002Freview\u002F09_test-spec-review.md\n  FIXER_AGENT: xddp-test-writer-agent\n  FIXER_PARAMS:\n    {WRITER_CALL_SHARED を展開}\n    REPO_NAME: {repo}\n    TEST_FRAMEWORK: {REPO_TEST_FRAMEWORK}\n    RULEBOOK_CONTEXT: {RULEBOOK_CONTEXT}\n    OUTPUT_FILE: {TSP_OUTPUT_FILE を展開}\n    REVIEW_FILE: {CR_PATH}\u002F09_test-spec\u002F{repo}\u002Freview\u002F09_test-spec-review.md\n  PROGRESS_CR_PATH: {CR_PATH}\n  PROGRESS_STEP_NUM: 9\n  METRICS_TARGET: {repo}\n  EXTRA_REVIEWER_PARAMS:\n    MIN_COVERAGE: {MIN_COVERAGE}\n    TEST_COVERAGE_TARGET: {TEST_COVERAGE_TARGET}\n    （`CR_PROFILE` = `quick` の場合のみ追加）QUICK_PROFILE: `true`\n\nUpdate per-repo progress table: `| {repo} | ✅ 完了 | ✅ 完了 | {TODAY} |`\n\n## Step B2: Human Review Gate\n\nBuild `ARTIFACTS_TEXT` by expanding the following (AFFECTED_REPOS\u002FHAS_CROSS are already resolved\nin this skill's scope):\n```\n{for each repo in AFFECTED_REPOS:}\n- {repo}: `{CR_PATH}\u002F09_test-spec\u002F{repo}\u002FTSP-{CR}.md`\n  - AIレビュー: `{CR_PATH}\u002F09_test-spec\u002F{repo}\u002Freview\u002F09_test-spec-review.md`\n{if HAS_CROSS:}\n- cross: `{CR_PATH}\u002F09_test-spec\u002Fcross\u002FTSP-{CR}-cross.md`\n```\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Fhuman-review-gate.md`, apply \"## Human Review Gate\" with:\n  CR_PATH: {CR_PATH}\n  STEP_NUM: 9\n  STEP_LABEL: `Step B2`\n  ARTIFACTS_TEXT: {built above}\n  REVISE_COMMAND: `\u002Fxddp-revise {CR} test`（対象リポジトリを指定）\n→ let `CHANGED`.\n\nIf `CHANGED`:\n- For each `{repo}` in `AFFECTED_REPOS`: Read `~\u002F.claude\u002Fskills\u002Fxddp-common\u002Fprocedures\u002Ffinal-review-pass.md`,\n  apply \"## Final Review Pass\" with:\n    DOCUMENT_TYPE: TSP\n    TARGET_FILE: {CR_PATH}\u002F09_test-spec\u002F{repo}\u002FTSP-{CR}.md\n    REFERENCE_FILES: {Step B と同一}\n    REVIEW_ROUND: (last_round + 1)\n    OUTPUT_FILE: {CR_PATH}\u002F09_test-spec\u002F{repo}\u002Freview\u002F09_test-spec-review.md\n    EXTRA_REVIEWER_PARAMS:\n      MIN_COVERAGE: {MIN_COVERAGE}\n      TEST_COVERAGE_TARGET: {TEST_COVERAGE_TARGET}\n      （`CR_PROFILE` = `quick` の場合のみ追加）QUICK_PROFILE: `true`\n\n## Step C: Mark Test Spec Complete\n\n**状態遷移の注意（必須）:** `step 9`（テスト設計）→ ✅ 完了 は、本 Step C（＝ Step B2 人レビューゲート\n通過後）でのみ付与する。Step B2 を経ずにセッションが中断された場合は `step 9` を ✅ にせず、\n`? レビュー待ち`（Step B2 の Human Review Gate が設定した状態）のまま留めること。\nこれにより後続 `\u002Fxddp-10-test-run` の前提チェック「`step 9` ✅ = 人レビュー確定」が実効を持つ\n（✅ を無条件付与すると人レビュー実施有無に関わらず常に ✅ となり前提チェックが機能しないため）。\n\nRead `~\u002F.claude\u002Fskills\u002Fxddp-common\u002FSKILL.md`, apply \"## Progress Update\" with:\n  CR_PATH: {CR_PATH}, STEP_NUM: 9, STATE: ✅ 完了, DETAIL_STEP: `-`,\n  ARTIFACT_LINK: `[09_test-spec\u002F](09_test-spec\u002F)`\n次に実行すべきコマンド → `\u002Fxddp-10-test-run {CR}`\n\n## Step D: Report in Japanese\n\nReport:\n- 生成した TSP ファイル一覧（per repo + cross\u002F if applicable）\n- AIレビューのラウンド数・残指摘の有無\n- 次のアクション案内:\n  > ✅ テスト仕様書（TSP）を生成し、AIレビュー→人レビューで確定しました。\n  > - 修正が必要なら `\u002Fxddp-revise {CR} test`\n  > - 問題なければ `\u002Fxddp-10-test-run {CR}` でテストを実行してください。\n",{},"main","0719b3a37b134895da55968646acffe58aedce8f","ClaudeCode\u002F.claude\u002Fskills\u002Fxddp-09-test",0,"https:\u002F\u002Fgithub.com\u002Ftsuna44\u002FXddpSettings","https:\u002F\u002Fgithub.com\u002Ftsuna44","2026-11-08 08:45:39",{"source":7,"skillName":5,"commands":37,"prompt":47,"zipAvailable":48},[38,41,44],{"tool":39,"command":40},"npx","npx skills add tsuna44\u002FXddpSettings --skill xddp-09-test",{"tool":42,"command":43},"bunx","bunx skills add tsuna44\u002FXddpSettings --skill xddp-09-test",{"tool":45,"command":46},"pnpm","pnpm dlx skills add tsuna44\u002FXddpSettings --skill xddp-09-test","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Ftsuna44\u002FXddpSettings\u002Fblob\u002Fmain\u002FClaudeCode\u002F.claude\u002Fskills\u002Fxddp-09-test\u002FSKILL.md",true,[50],{"path":51,"resourceType":52,"resourceTypeDesc":53,"sizeBytes":54,"sourceHtmlUrl":55},"templates\u002F09_test-specification-template.md","REFERENCE","参考文档",5961,"https:\u002F\u002Fgithub.com\u002Ftsuna44\u002FXddpSettings\u002Fblob\u002Fmain\u002FClaudeCode\u002F.claude\u002Fskills\u002Fxddp-09-test\u002Ftemplates\u002F09_test-specification-template.md",[57,68,75,83,90,112],{"skillNo":58,"name":59,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":60,"categories":61,"keywords":65,"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",[62],{"categoryNo":63,"categoryName":64,"taxonomyType":19,"taxonomyTypeDesc":20},"01JBSEEDCAT000000000000023","Skill与智能体开发",[66,67],"demo skill","demo",{"skillNo":69,"name":70,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":73,"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",[],[74,67],"demo noname",{"skillNo":76,"name":77,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"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",[],[81,82,67],"demo common","common",{"skillNo":84,"name":85,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":88,"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",[],[89,67],"demo badname",{"skillNo":91,"name":92,"nameZh":6,"description":93,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":94,"categories":95,"keywords":99,"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",[96],{"categoryNo":97,"categoryName":98,"taxonomyType":19,"taxonomyTypeDesc":20},"01JBSEEDCAT000000000000021","资料检索与研究",[100,101,102,103,104,105,106,107,108,109,110,111],"xddp update knowledge","update knowledge","knowledge","update","note","structure","constraint","lesson","glossary","baseline","flow","docs",{"skillNo":113,"name":114,"nameZh":6,"description":115,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":126,"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",[118,121],{"categoryNo":119,"categoryName":120,"taxonomyType":19,"taxonomyTypeDesc":20},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":122,"categoryName":123,"taxonomyType":124,"taxonomyTypeDesc":125},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[127,128,129,130],"sync","xddp sync design","design","生成"]