アプリ・Webサービス・業務ツールの制作を、証拠分析→確定的な初稿→要件定義→体験設計→機能分解→実装→品質ゲート→リリース判定の手順ゲート制で進めるスキル。質問で要件を埋めるのではなく、依頼文・既存コード・資料・ログから最有力案を選び、動く成果物を先に出して差分で改善する。ユーザーが「アプリを作りたい」「ツールを作って」「〜を自動化したい」「システム化したい」「要件定義」「仕様を決めたい」「UI/UXを設計して」「体験を良くしたい」「機能を洗い出して」「MVPを決めたい」「品質チェック」「リリースしていいか判断して」などと言ったら必ず使用する。外部データの取込・マスタ・締め処理を伴う業務システムでは references/data-lifecycle.md も併用する。新規・既存を問わずアプリの制作・改善・リニューアルで使用する。
run-spec-drift-triage
spec-drift issue が起票され diff トリアージが必要なとき、C11 が再構成した issue 単位の完全 diff を hunk 化し name/type/required/enum/semantics 各軸の影響を before/after/evidence 付きで判定して triage-report を出したいときに使う。
含まれるファイル(5)
- SKILL.md17.1 KB
- prompts/R1-elicit.md7.4 KB
- prompts/R2-parse.md6.1 KB
- prompts/R3-triage.md7.8 KB
- references/resource-map.yaml1.5 KB
SKILL.md(原文)
インストールする前に、エージェントに与えられる指示の中身を確認できます。
Pre-choice usable artifact execution
Purpose & Output Contractの最小の実成果物をmain contextで作成する。effect別のparse/open・secret・irreversible・corrupt guardだけを実行し、現物path・digest・開き方を提示してからaccept-as-is/light/standard/detailedを記録する。accept-as-isはその場でhandoff完了とし、後続sectionを実行しない。
Post-choice selected improvement execution
以下の既存workflow・goal-seek・評価・修正sectionはlight/standard/detailedが記録されてsemantic_evaluator_startedへ遷移した場合だけ実行する。release/exhaustiveは別の明示eventを必要とする。
run-spec-drift-triage
Runtime root contract
runtime_root_policy: host-skill-pathを適用する。- Claude Codeでは
CLAUDE_PLUGIN_ROOTをplugin rootとして使用する。 - Codexではホストが提示したこの
SKILL.mdのabsolute pathから、plugin manifestを持つ祖先を上方探索して論理PLUGIN_ROOTを解決する。 cwdからplugin rootを推測せず、literal placeholderをshellへ渡さない。各shell invocation内で解決済みabsolute pathをPLUGIN_ROOTに設定する。prompts/配下はこのowner Skill契約を継承する。
検知済み spec-drift issue の影響トリアージを行う run skill。C11 (
aggregate-issue-diffs.py) がローカル git から再構成した issue 単位の全未triage完全 diff を、C08 (parse-spec-diff.py) で hunk 化し C09 (map-field-impact.py) で影響候補へ写像したうえで、name/type/required/enum/semantics 各軸の影響を before/after/evidence 付きで判定し、triage-reportschema 準拠の JSON を emit する。提案・適用 (C02)・独立判定 (C03) はやらない。
Purpose & Output Contract
目的 (goal): C11 が再構成した issue 単位の全未triage完全 diff を hunk 単位で構造化し、artifact kind/path と name/type/required/enum/semantics 各軸への影響を before/after/evidence 付きで判定したトリアージレポートを生成した状態にする。
背景 (purpose_background): spec-drift issue の影響判定 (step2) が人手依存であり、spec-diff-history.md の 80 行 preview だけでは Issue #17 の 945 行完全差分を判定できない。C11 の commit pair 再構成と C09 の 4 軸 + semantics 写像により、取りこぼしと判断ブレを防ぐ。
入力 (境界・厳守):
--issue NUMBER— 対象 GitHub issue 番号。--events FILE— gh issue metadata / comment timestamps とspec-diff-history.md見出し (索引としてのみ使用) から組み立てたイベント表。実 diff はローカル git commit pair から復元する (network=false)。- 入力の正体は「C11 がローカル git から再構成した全未triage完全 diff」。検知・issue 起票は既存 workflow (
update-yaml-spec.yml/ref-yaml-spec-fetcher) の責務であり、本 skill は行わない。
出力:
$CLAUDE_PROJECT_DIR/.spec-drift/<issue>/triage-report.json—../../schemas/triage-report.schema.json準拠。issue/base_commit/source_commit/diff_sha256/complete/impacts[](artifact_kind/artifact_path/axis/before/after/impacted/evidence) を持つ。- 完了レポート (日本語、JSON キー・CLI 引数・軸名は英語)。
完了条件: C11 出力が complete=true かつ commit pair / digest を伴い、C08/C09 の必須キー欠落 0 件 (IN1) で、triage-report が schema 準拠かつ 4 軸 + semantics の判定が fixture matrix に対し threshold 内 (OUT1) を満たす。
やらないこと (boundary):
- 完全性 (
complete=true) を証明できない入力は判定しない (fail-closed)。truncated preview / digest 不一致 / commit 欠落は triage せず理由付きで停止する。 - 更新提案・実適用は C02 (
run-rubric-sync) の責務。 - 生 diff からの独立再導出・照合は C03 (
spec-impact-verifier) の責務。本 skill の出力は C03 が独立に照合する対象であって、自ら再判定はしない。 - commit / PR / issue close は行わない。
決定論段 (Bash) と意味判断 (LLM) の二層分離
再現性が要る変換は 3 つの決定論 script が担い、LLM は意味判断のみ (軸判定の妥当性確認・レポート組み立て) に限定する。写像規則は ../../references/field-impact-map の SSOT を C09 が読むだけで、LLM はこれを hardcode・改変しない。
| 段 | 実体 | 役割 | fail-closed 条件 |
|---|---|---|---|
| C11 集約 | python3 ${PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT}}/scripts/aggregate-issue-diffs.py --issue N --events FILE | issue 単位の未triage全 diff を完全 commit diff として時系列集約 | 欠落 / 曖昧照合 / shallow clone / digest 不一致 (exit≠0) |
| C08 hunk化 | python3 ${PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT}}/scripts/parse-spec-diff.py --stdin | C11 stdout を verbatim で受け untriaged_entries を選別し unified hunk 単位へ構造化 (commit pair / digest 継承) | complete=false / digest 不一致 / commit pair 混在 (exit2)、入力形状不正・JSON parse 失敗 (exit1) |
| C09 写像 | python3 ${PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT}}/scripts/map-field-impact.py --stdin | hunk から artifact kind/path と 4 軸+semantics の before/after/evidence 候補へ写像 | 必須キー欠落 / 写像表不備 (exit≠0) |
LLM が担うのは、C09 の影響候補が実 hunk 証拠と整合するかの軸判定の妥当性確認と、schema 準拠の triage-report への組み立てのみ。base_commit / source_commit / diff_sha256 / complete は C11 が算出した provenance をそのまま転記し、LLM が再計算しない (C03 verdict と一致必須のため)。
End-to-End Flow (責務プロンプト正本 = prompts/*.md)
[R1 elicit] gh issue metadata/comment + spec-diff-history 見出し(索引) → events FILE
→ aggregate-issue-diffs.py --issue N --events FILE
→ entries / untriaged_entries / source_provenance (complete=true, base/source/digest)
─[complete 証明できなければ fail-closed で停止]─▶
[R2 parse] untriaged 完全 diff → parse-spec-diff.py --stdin → hunks JSON (commit pair/digest 継承)
→ map-field-impact.py --stdin → 影響候補 (artifact kind/path, 4軸+semantics, before/after/evidence)
─[必須キー欠落 0 件が IN1]─▶
[R3 triage] LLM: 各軸判定を hunk 証拠と照合し妥当性確認 → triage-report 組み立て
→ $CLAUDE_PROJECT_DIR/.spec-drift/<issue>/triage-report.json
- R1-elicit (
prompts/R1-elicit.md): 対象 issue を確定し、events FILE を組み立て、aggregate-issue-diffs.pyで未triage 全 diff 集合を集約する。complete=trueと commit pair / digest を確認できないときは判定に進まず停止する。 - R2-parse (
prompts/R2-parse.md): 集約 diff をparse-spec-diff.py --stdinで hunk 化し、map-field-impact.py --stdinで影響フィールド候補へ写像する。exit2 (complete=false/ digest 不一致) は fail-closed。 - R3-triage (
prompts/R3-triage.md): C09 候補の各軸 (name/type/required/enum/semantics) を hunk 証拠と照合し、impactedと before/after/evidence を確定して schema 準拠のtriage-report.jsonを emit する。
Key Rules
- 完全性優先 / fail-closed:
complete=trueかつ digest 一致を証明できない入力は判定しない。truncated preview は必ず fail-closed。 - provenance 転記:
base_commit/source_commit/diff_sha256/completeは C11 出力を verbatim 転記し、LLM が再計算・改変しない。 - 写像非 hardcode: diff→フィールド写像は C09 が
references/field-impact-mapを読むだけ。LLM は写像規則を prompt に埋め込まない (guardian 自身の drift 源化を防ぐ)。 - 軸網羅: name / type / required / enum / semantics の 5 軸を各 hunk で評価する。
impacted=falseの軸も evidence 付きで列挙してよい (schema 許容)。 - 境界厳守: 提案・適用 (C02)・独立判定 (C03)・issue close はしない。出力はトリアージまで。
- 単一 writer:
.spec-drift/<issue>/triage-report.jsonへの書込は本 skill のみ。上書き前に既存内容と issue/digest 整合を確認する。 - 日本語成果物: レポート本文は日本語。JSON キー・CLI 引数・軸名 (name/type/required/enum/semantics) は英語。
Feedback Contract (with-feedback-contract / with-goal-seek)
- IN1 (inner, script): C11 出力が
complete=trueで commit pair / digest を持ち、C08/C09 出力のname/type/required/enum/semantics・before/after/evidence必須キー欠落が 0 件。検証は 3 決定論 script の exit code (C11≠0 / C08 exit2 / C09≠0 で不成立) で機械判定する。 - OUT1 (outer, test): Issue #17 完全 commit pair と source-category fixture matrix に対し 4 軸 + semantics の誤検出 / 見逃しが threshold 内で、truncated preview 入力は fail-closed になる。
- goal-seek (engine=inline, fork=inline, max_loops=5): IN1 / OUT1 を満たすまで、events 再構成・軸判定の妥当性確認・レポート組み立てを main context で反復改善する。決定論 script の fail-closed gate と下流の独立 C03 verdict が自己肯定バイアスを抑える。max_loops=5 で未収束なら residual findings 付きで停止する。
ゴールシーク実行
ゴール (Goal)
IN1/OUT1 を満たす schema 準拠 triage-report が、完全 diff と provenance を保ったまま生成された状態。
目的・背景 (Why)
意味判断を反復しても、対象 diff と当初ゴールがすり替わらないように、決定論 gate と不変アンカーで周回を拘束する。
完了チェックリスト
- C11/C08/C09 が完全性・digest・必須キーを exit0 で検証した
- triage-report が 5 軸と evidence を網羅し IN1/OUT1 が PASS した
ゴールシークループ
post-choice のみ main context で未達項目を1つ選び、決定論検査→必要最小限の意味判断→再検査を行う。同じ blocker が残る場合だけ次周回へ進み、5周で停止する。
ゴールシーク配線
goal-spec.json の original_goal を初回に SHA-256 化し progress の original_goal_hash へ固定する。各周回は intermediate JSONL へ original_goal/current_goal_snapshot/delta_from_original/merged_directive_for_next/drift_signal を append し、次周回は直前の merged_directive_for_next を必須入力とする。
ゴールシーク検証
post-choice 周回の各回末に、次の共通 validator で intermediate.jsonl の required_keys、非空 original_goal、全行不変性、original_goal_hash == hashlib.sha256(original_goal) を fail-closed 検証する。accept-as-is では周回しない。
python3 "${PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT}}/scripts/validate-inline-goal-seek-anchor.py" \
"${CLAUDE_PROJECT_DIR:?caller project root is required}/eval-log/run-spec-drift-triage-progress.json" \
"${CLAUDE_PROJECT_DIR}/eval-log/run-spec-drift-triage-intermediate.jsonl"
Gotchas
- preview を diff と誤認しない:
spec-diff-history.mdの 80 行 preview はイベント日時の索引にのみ使う。実 diff は必ず C11 が commit pair から復元したものを使う。 - triage 済みを再集約しない: 集約対象は
entries(issue の全 diff 履歴) ではなくuntriaged_entries(未処理のみ)。C08 は C11 stdout を verbatim で受け取り untriaged_entries を自ら選別するため、再ラップも最新 1 件固定も不要 (entriesを渡すと triage 済みまで再集約する)。 - digest を跨いで混ぜない: triage-report は
base_commit/source_commit/diff_sha256を各 1 個しか持てない (単一 digest 契約・C03 verdict と一致必須)。積層できるのは 1 commit pair 内の複数ファイル・複数 hunk までで、untriaged が複数 commit pair に跨る入力は C08 が集約せず fail-closed (exit2) する。同一 commit pair が履歴に重複しても C08 が dedup するので二重計上しない。 - 複数 commit pair の issue は分割する: 出力先
.spec-drift/<issue>/triage-report.jsonは issue 単位で 1 本 (単一 writer)。1 issue に複数 commit pair の未triage変更が溜まった場合、同じパスへ上書きすると先の triage 証跡を失うため、issue を commit pair 単位へ分割してから triage する (C10 も--triage-report単数 + digest 一致必須のため、1 issue = 1 commit pair が close 可能な形)。 - impacted の根拠必須:
impacted=trueもfalseもevidence(hunk 抜粋・行番号) を空にしない (schemaminLength:1)。 - context 予算: SKILL.md / 各 prompt は簡潔に保つ。
references/resource-map.yamlを最初に読み、必要ファイルのみ open する。
Additional Resources
references/resource-map.yaml を最初に読む。主要参照:
../../scripts/aggregate-issue-diffs.py(C11) — issue 単位の完全 diff 集約。--issue NUMBER --events FILE../../scripts/parse-spec-diff.py(C08) — 集約 diff の hunk 化。--stdin../../scripts/map-field-impact.py(C09) — hunk→4 軸+semantics 影響候補写像。--stdin../../references/field-impact-map— C09 が読む diff→フィールド写像表 (read-only / 本 skill は改変しない)../../schemas/triage-report.schema.json— 出力契約スキーマprompts/R1-elicit.md/prompts/R2-parse.md/prompts/R3-triage.md— R1/R2/R3 責務別プロンプト (7 層)- 消費先: C03 (
spec-impact-verifier) が独立照合 / C10 (check-triage-complete.py)・C07 (guard-spec-drift-close.py) close gate が消費
レビュー
まだレビューはありません。使ってみた感想をお寄せください。
同じリポジトリのスキル
概要と使いどころ
Webアプリの準備→要件定義→設計→実装→公開→品質ゲートを実行する内部オーケストレーター。Claude Codeの /build-app /improve-app、Codexの $build-app / $improve-app から明示的に委譲された場合、custom agent起動時、または利用者が $app-orchestrator を明示した場合だけ使用する。一般のアプリ相談から暗黙起動しない。
run-extract-blueprint が生成した章別ブループリントの忠実性を独立 context で評価したいとき、事実/推測区別と粒度と被覆を検証し draft_hash に束縛した PASS/FAIL verdict をローカル品質ゲート (C01 の周回内の受入判定・差し戻し) へ渡したいときに使う。
確認点で利用者が見る深さを選んだあと打ち合わせ資料を作り手とは別の目で確かめたいとき、正確さ・言葉・見た目・シンプルさの指摘を資料の編集なしで受け取りたいときに使う。
生成した handout 資料が初心者に伝わるか読みやすさレビューを依頼したいとき、独立 context のレビュアーから指摘と根拠つきの verdict を回収したいときに使う。
Notion ページを描画する直前に粒度を検証したいとき、info-collector-agent ページと同等の section 充足度を section_canonical_map 基準で機械検証したいときに使う。