アプリ・Webサービス・業務ツールの制作を、証拠分析→確定的な初稿→要件定義→体験設計→機能分解→実装→品質ゲート→リリース判定の手順ゲート制で進めるスキル。質問で要件を埋めるのではなく、依頼文・既存コード・資料・ログから最有力案を選び、動く成果物を先に出して差分で改善する。ユーザーが「アプリを作りたい」「ツールを作って」「〜を自動化したい」「システム化したい」「要件定義」「仕様を決めたい」「UI/UXを設計して」「体験を良くしたい」「機能を洗い出して」「MVPを決めたい」「品質チェック」「リリースしていいか判断して」などと言ったら必ず使用する。外部データの取込・マスタ・締め処理を伴う業務システムでは references/data-lifecycle.md も併用する。新規・既存を問わずアプリの制作・改善・リニューアルで使用する。
run-dev-graph-node
dev-graph artifact を正規 path へ atomic 追加・差分更新したいとき、system-dev-planner の exact 13 phase task package を all-or-none 登録したいときに使う。
インストール方法を見る含まれるファイル(6)
- SKILL.md24.3 KB
- prompts/R0-context.md2.6 KB
- prompts/R1-classify.md2.7 KB
- prompts/R2-preview.md4.0 KB
- prompts/R3-write.md4.6 KB
- prompts/R4-apply-template.md4.4 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-dev-graph-node
Purpose & Output Contract
- 入力: C24 で containment 検証済みの artifact candidate、既存 graph snapshot、または exact-13 package。
- 出力: C02 単一 writer 経由で atomic 登録された typed node/package と revision/digest receipt。
- 完了条件: kind/path/frontmatter/dependency が schema と一致し、package は P01..P13 exact-set のときだけ applied count 13 となる。
全 graph/content write の単一 writer。通常 artifact は issue/task/specification/architecture/document、macro feature は C14 (run-dev-graph-decompose) が宣言した macro contract だけを add の artifact_kind=feature で features/ に登録する。
Classification and write
- C24 resolver で全 read/write realpath の containment を検証する。
- 内容から
artifact_kind/domain/project_id、候補 path、confidence/reason/second candidate を preview する。confidence>=0.80 かつ margin>=0.15 は自動確定し、それ以外だけユーザー確認する。保存先は質問しない。 template-contract.jsonから kind template を選ぶ。architecture は subtype 全件、specification は API 変更時だけ api-contract overlay を合成する。- frontmatter/body/path と graph node を一時領域で構成し
validate-graph-schema.pyを通してから atomic replace する。更新は既存本文を全置換せず、変更 field だけを更新する。不足 section は writer が返すreadiness_fill[]({item, via, key}) のviaとkeyをそのまま使って埋める (placeholder のままの見出しはset_sections、見出しが無い section はappend_sections、API block が無ければadd_api_contracts、feature の projection はmacro_patchの field (key=purposeなど) かnode_patch.depends_on)。placeholder のままとは、section の全行が template の雛形行か placeholder (placeholder_tokens。<は<...>の範囲を指す) だけの行であることを指し、p95 < 300ms・Bearer <token>・未定だが 30 日を上限にするのような本文と<https://…>の autolink は埋まっている扱い、ラベルと placeholder だけの行 (- メモ: <TBD>、理由の無いN/A: <reason>) は placeholder のまま扱いになる。via=null(手で消された subtype block や leaf) は writer に埋める経路が無いので停止して報告する。readiness の項目名 (api-contract・<subtype>:<leaf>・api:<op>:<leaf>) を見出しキーに渡すとreadiness_item_is_not_a_headingで拒否される。物理削除は禁止。
add/update/bind-github/link-github verb は手順 1-4 の実装本体 ../../scripts/build-graph-node.py に委譲する (add|update|bind-github|link-github --repo-root <path> --input <repo 内 JSON> [--dry-run])。skill は R1/R2 の分類結果と section 本文を入力 JSON に整形するだけで、graph・content・receipt を Write/Edit や自作 script で直接書かない。writer は C24 解決、入力の repo 内 containment (相対 --input は repo root 基準)、expected_graph_revision の CAS、register-package と共有する fcntl lock、staging 上の validate-graph-schema.py 再検証、content→graph→immutable receipt の順の atomic commit と失敗時 rollback を一体で持つ。apply では R2 preview の graph_revision_before を expected_graph_revision (整数) に必ず渡す。省略は missing_expected_graph_revision、整数以外は invalid_input、preview 後の変更は graph_revision_conflict で止め、省略できるのは --dry-run だけである。書込み前検証は baseline 差分で判定し、変更した node は finding 0 を要求し、変更していない node の既存 finding は持ち越す。
add:artifacts[]にartifact_kind/slug/title/project_id/domain/tracker_binding/classificationと、kind に応じたartifact_subtypes(architecture は 1 件以上、specification はapi_contractsがあればapiを自動補完) と任意のsections・subtype_sections・api_contracts・depends_onを渡す。形はclassification={reason, candidates:[{artifact_kind, confidence}], decision: auto|user_confirmed}、api_contracts=[{operation, sections:{leaf 見出し: 本文}}]、subtype_sections={subtype: {leaf 見出し: 本文}}。id は<kind prefix>-<slug>、path は kind の正規 root 固定で、保存先は入力に含めない。分類は閾値未達ならdecision=user_confirmedが無い限り拒否する。C14 が宣言した architecture だけはclassification={reason, decision: c14_macro_contract}(candidates 無し) で登録でき、同じ batch の feature のarchitecture_refsが参照していなければinvalid_classificationになる。sectionsの追加キーは単一行・先頭#無し・>無し・120 字以内・secret 無しの見出しだけを受け付ける (invalid_section_key)。既存 feature へ後から architecture を足すときは、その architecture を通常のclassification(candidates 付き) でaddしてから、feature をupdateのmacro_patch.architecture_refsで参照させる。source_lineage.origin_kind=system-spec-harnessを渡した node は、../../scripts/validate-source-lineage.pyと同じ関数でsource_pathの実在とsource_digestの一致を登録前に検査し、解決しなければsource_lineage_unverifiedで拒否する。update:updates[]にgraph_node_idとset_sections(見出し直下の本文だけ置換、祖先 > 見出しで曖昧さを解消。H1 より下のパスを全部書いたキーは完全一致を優先するので、修飾しない名前は同名の H2 を指す)・append_sections(末尾に H2 で追記、同名の H2 があればduplicate_section)・add_subtypes(block は subtype の正規順の位置へ挿入)・add_api_contracts・node_patch・macro_patch(feature のみ) を渡す。id/path/kind/template と外部 authority の field は変更できず、非管理 section のバイト列と contract 外の frontmatter キーは保持する (unmanaged_frontmatter_kept)。writer が生成した section (Subtype architecture・API契約) は、本文が旧状態の生成文と一致するときだけ新状態で再生成し (sections_regenerated)、人手で編集済みならset_sectionsの同時指定が無い限りgenerated_section_divergedで拒否する。feature の projection は update のたびに frontmatter から再投影するので、手で編集した本文も手で消した見出しも次の update で戻る (sections_regenerated。消えた見出しは required 順の位置へ挿入する)。status/closed_at以外の内容変更はevaluation_status=passをstaleに戻す。ただしtracker_binding=githubの node では、GitHub と双方向に同期するtitle/priority/start_date/target_date/iterationの変更も pass を保つ (公開中・active の node は schema 上 pass を外せないので、C03 がこれらを import できるようにする。本文の変更は stale になり、書込み前の検証で拒否される)。graph 上の node に schema/frontmatter の必須キーが欠けていれば、書く前にnode_missing_required_keys(findings[].detailが欠けたキー名) で止める。featureはaddにmacro={purpose, goal, scope_in[], scope_out[], acceptance[], architecture_refs[]}を渡したときだけ登録し、classification は受け付けない (decision はc14_macro_contract固定)。architecture_refsの先は architecture、depends_onの先は feature でなければinvalid_macro_reference。目的・到達状態・スコープ・受入・アーキテクチャ参照・機能間依存は macro の projection なのでsections/set_sections/append_sectionsでは書けず (macro_section_is_projection)、変更はmacro_patch/node_patch.depends_onで行う。macro が無い feature はfeature_requires_c14_macro_contract、parent_feature/feature_package_id/phase_refはregister-packageへ回す。拒否時はapplied_count=0・write_count=0を返す。tracker_bindingは register-package と同じ規則で repo の tracker mode (execution_tracker.mode= beads/github/both) と照合する。noneは binding の値で mode ではなく、常に可。beads/githubは mode が同じかbothのときだけ可 (tracker_binding_not_allowed)、repo-config-defaultは mode が beads/github ならその値に解決し、bothや mode 不明ではtracker_binding_unresolved。github に解決された binding は draft node では schema を満たせないためgithub_binding_requires_confirmed_nodeで拒否するので、github mode の repo ではnoneで登録し、confirm/pass の後にbind-githubで切り替える。bind-github:bindings[]に{graph_node_id, publication_mode?}(issue既定、またはissue_and_projects) を渡し、confirmation_status=confirmed・evaluation_status=pass・readinesscompleteの issue/task をtracker_binding=github(beads_linkage=null、github_publication.modeを issue 系) へ切り替える。frontmatter だけを再生成して本文のバイト列は保持し、evaluation_status=passは変えない。mode が github/both 以外はtracker_binding_not_allowed、未 confirm/pass はgithub_binding_requires_confirmed_node、issue/task 以外はbind_github_requires_issue_or_task、beads に link 済みはbeads_linkage_present、package member はpackage_member_requires_register_packageで拒否し、既に同じ状態なら noop。GitHub への投影はその後 C12 (run-dev-graph-sync) が行う。link-github:links[]に{graph_node_id, issue_linkage?, github_project_linkages?}を渡し、C14 のlinkage_proposalと C03 の同期結果 (field_snapshot・sync_state) をtracker_binding=githubの node に記録する。issue_linkageはgithub.issue_repositoryの Issue だけを受け、別番号への付け替えはissue_linkage_conflict、null は変更なし。project linkage はproject_aliasごとに置き換え、field_snapshotはキーごとに重ね、最初のlinked_atを保つ。未設定 alias はunknown_project_alias、owner/project_number の食い違いはproject_identity_mismatch、別 item への付け替えはproject_item_conflict、github 以外の binding はlink_github_requires_github_bindingで拒否する。linkage は GitHub 側の状態の写しなので、本文・evaluation_status・updated_atを変えず、変化が無ければ noop。C14 は exact-13 package member も投影するので、update/bind-githubと違い package member も受ける (linkage は system-dev-planner が持つ本文・binding・package key に触れない)。member は register-package と同じく graph だけに記録し、artifact file と内容 key を求めない (receipt のgraph_only)。
Exact-13 package gate
register-package verb はこの gate の実装本体 ../../scripts/register-package.py に委譲する (register-package.py register --package <path> --graph <path> --output <path> --receipt <path> [--tracker-mode <mode>] [--config <path>]、事前検査は register-package.py preflight)。tracker mode は --config (既定 .dev-graph/config.json、--repo-root 基準) の execution_tracker.mode (beads/github/both) を読み、build-graph-node と同じ値で binding を解決する。config ファイルが無い、mode が無いか beads/github/both 以外のときは flag があっても進まず exit 2 で拒否する。--tracker-mode は config と同じ値の明示だけを受け付け、食い違う値も exit 2 で拒否する。拒否時の出力は applied_count=0 を持つ。単一 writer は register-package.py が fcntl ロックと receipt の os.link 一回性で保証し、skill 側は入力整形と結果提示に留める。
system-dev-planner の package は P01..P13 exact set、13 node、共通 parent_feature/feature_package_id、同一 package 内だけの DAG、source digest、tracker binding を commit 前に検証する。12/14件、phase 重複/欠落、mixed parent/package、cross-feature edge は applied_count=0 で拒否する。成功 receipt は status/source_digest/expected_count=13/applied_count=13/graph_revision_before/graph_revision_after/node_ids/registered_at を持ち immutable に保存する (schema: ../../schemas/package-registration-receipt.schema.json)。
--dry-run は local/external write 0。失敗時に一部 node を残さない。
Execution-context consumer
C27 の claim saga は register-package.py execution-context --graph <path> --graph-node-id <id> --context-json <json> を内部 consumer として必ず実行する。この入口も C02 単一 writer の lock・graph-node schema 検証・atomic replace を共有し、同一 worktree_id の context を冪等置換する。C27 が receipt を自作・持込みせず、consumer が返す owner=C02/run-dev-graph-node、operation=project_execution_context、status=applied、node/worktree identity 一致を確認してから claim を確定する。
ゴールシーク実行
ゴール (Goal)
通常5 artifactを自動分類し、C14由来featureとsystem-dev-planner由来exact 13 phase tasksをそれぞれの専用契約で正規pathへatomic追加・更新し、graph/frontmatter/body/path/package整合を保つ
目的・背景 (Why)
成果物を単一graphで保持する専用writer。feature由来task batchはsystem-dev-plannerのfeature package契約に従い、P01..P13 exact 13 node、共通parent_feature/feature_package_id、同一package内dependencyを事前検証してall-or-none commitする。tracker bindingも同じtransactionで解決する
完了チェックリスト
- 全 read/write realpath が resolved repo root 内で repository_id が一致する
- classification decision が閾値による自動確定または明示 user confirmation の証跡を持つ
- 通常 artifact の frontmatter/body/path/template metadata が schema と一致する
- package は P01..P13 exact 13、共通 parent/package、内部 DAG を満たし、違反時 applied_count が0である
- 成功 receipt の graph_revision_after と node_ids が commit 後 graph と一致する
ゴールシークループ
frontmatter の goal_seek.engine: inline / fork: subagent / max_loops: 5 を実行契約とする。固定手順は使わず、未達 checklist と担当 prompts/*.md からその周回の操作を都度生成する。各周回で inner criterion を検証し、完了後は outer criterion の live trial/content review を最大 feedback_contract.max_iterations=3 周で評価する。
ゴールシーク配線
- 開始時に C24
resolve-repo-context.py --mode writeの JSON receipt を得て、repo_rootがcontent_roots.repositoryの realpath と一致する場合だけDEV_GRAPH_ROOT=<receipt.repo_root>に固定する。cwd から再解決しない。 - 元のゴールを
$DEV_GRAPH_ROOT/eval-log/run-dev-graph-node-goal-spec.jsonへ、各 checklist の status/evidence を$DEV_GRAPH_ROOT/eval-log/run-dev-graph-node-progress.jsonへ記録する。 - 未達 responsibility を担当する
prompts/<R-id>.mdを読み、Agentで分離 context に fork する。ユーザー判断が必要な境界だけAskUserQuestionを使う。 - 各周回末に
$DEV_GRAPH_ROOT/eval-log/run-dev-graph-node-intermediate.jsonlへoriginal_goal、original_goal_hash、current_goal_snapshot、delta_from_original、merged_directive_for_next、drift_signalを append-only で記録する。次周回は直前のmerged_directive_for_nextを必須入力にする。 - 5周到達時に未達が残れば完了扱いせず、progress と blocker を親へ handoff する。全 checklist と
feedback_contract.criteriaが PASS のときだけ完了する。
ゴールシーク検証
各周回後に次の検査を実行し、中間成果物の欠落・goal drift・hash 不一致を fail-closed にする。
python3 - "$DEV_GRAPH_ROOT/eval-log/run-dev-graph-node-goal-spec.json" "$DEV_GRAPH_ROOT/eval-log/run-dev-graph-node-intermediate.jsonl" <<'PY'
import hashlib, json, sys
goal = json.load(open(sys.argv[1], encoding='utf-8'))
rows = [json.loads(line) for line in open(sys.argv[2], encoding='utf-8') if line.strip()]
required_keys = {'original_goal','original_goal_hash','current_goal_snapshot','delta_from_original','merged_directive_for_next','drift_signal'}
expected = hashlib.sha256(goal['original_goal'].encode('utf-8')).hexdigest()
assert rows, 'intermediate.jsonl is empty'
for row in rows:
assert required_keys <= row.keys(), required_keys - row.keys()
assert row['original_goal'] == goal['original_goal']
assert row['original_goal_hash'] == expected
PY
Criteria acceptance
criteria:IN1:validate-graph-schema.pyの書込み前検証で必須キー欠落が0件である。criteria:OUT1: 通常5 artifactをroutingし、featureはC14 macro contractからのみ登録し、連続更新後もfrontmatter/path整合を保つ。criteria:OUT2: architecture subtypeとspecificationのapi-contract条件を含むkind別必須セクションを欠落0件で適用する。criteria:OUT3: 12/14 task、phase欠落/重複、mixed package、cross-feature edgeはapplied_count=0、正常時はexpected_count=applied_count=13、P01..P13/node exact-set、graph_revision付きreceiptになる。
Gotchas
- graph/content を直接書かず、preview と apply のどちらも C02 単一 writer を通す。
- feature は C14 の macro contract から受け取り、通常 artifact routing で新規生成しない。
- P01..P13 の欠落、重複、混在、cross-feature edge のいずれかがあれば部分登録しない。
- execution context の repository/worktree identity 不一致を上書きで吸収しない。
rollback_incomplete(exit 2、write_count=null) は一部 path が書かれたまま残った状態である。findings[]の各 path をdetail(restore sha256 …またはremove created file) どおり手で戻し、validate-graph-schema.pyが通ってから再実行する。- content commit 後・graph commit 前の crash で本文だけが残ると、再実行は
artifact_path_existsで止まる。graph に node が無い孤児本文であることを確かめて退避してから再実行する。graph を過去 revision へ戻したときのimmutable_receipt_existsは、既存 receipt を消さず graph を最新 revision へ進めてから書く。
レビュー
まだレビューはありません。使ってみた感想をお寄せください。
同じリポジトリのスキル
概要と使いどころ
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 基準で機械検証したいときに使う。