アプリ・Webサービス・業務ツールの制作を、証拠分析→確定的な初稿→要件定義→体験設計→機能分解→実装→品質ゲート→リリース判定の手順ゲート制で進めるスキル。質問で要件を埋めるのではなく、依頼文・既存コード・資料・ログから最有力案を選び、動く成果物を先に出して差分で改善する。ユーザーが「アプリを作りたい」「ツールを作って」「〜を自動化したい」「システム化したい」「要件定義」「仕様を決めたい」「UI/UXを設計して」「体験を良くしたい」「機能を洗い出して」「MVPを決めたい」「品質チェック」「リリースしていいか判断して」などと言ったら必ず使用する。外部データの取込・マスタ・締め処理を伴う業務システムでは references/data-lifecycle.md も併用する。新規・既存を問わずアプリの制作・改善・リニューアルで使用する。
run-ubm-journal
日次ジャーナルを作りたいとき、今日やったことを会話で振り返りながら Obsidian の Daily へ構造化したファイルを生成・再生成したいときに使う。
含まれるファイル(9)
- SKILL.md20.9 KB
- assets/golden-sample.md14.0 KB
- references/daily-habits.json5.2 KB
- references/interview-map.md9.8 KB
- references/output-format.md7.4 KB
- references/principle-checklist.md7.3 KB
- references/resource-map.yaml2.0 KB
- scripts/build-journal-context.py46.9 KB
- scripts/validate-journal-output.py34.4 KB
SKILL.md(原文)
インストールする前に、エージェントに与えられる指示の中身を確認できます。
Pre-choice usable artifact execution
Purpose & Output Contractの最小の実成果物またはremote mutation previewをmain contextで作成する。effect別のparse/open・secret・irreversible・corrupt guardだけを実行し、現物path・digest・開き方またはpreview receiptを提示してからaccept-as-is/light/standard/detailedを記録する。accept-as-isはmutationを実行せずhandoff完了とし、後続sectionを実行しない。
Post-choice selected improvement execution
以下の既存workflow・goal-seek・評価・修正sectionおよびexternal mutation safety wrapperはlight/standard/detailedが記録されてsemantic_evaluator_startedへ遷移した場合だけ実行する。actual mutationはcanonical preview→hook-confirm→authorize→execute wrapperだけを通し、release/exhaustiveは別の明示eventを必要とする。
Canonical external mutation receipt flow (mandatory)
Never execute the external mutation argv directly. Replace every angle-bracket placeholder with the reviewed value from this run; the central CLI fails closed on missing/invalid values.
Resolve the guard plugin root once, before preview. An installed plugin cannot reach a sibling
plugin as <plugin root>/.., so never guess that path:
python3 "${PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT}}/scripts/extract-plugin-root.py" skill-governance-adapters
Use the printed absolute path as <GUARD_PLUGIN_ROOT> in preview, authorize and execute
(other Bash is blocked while the confirmation is pending, so do not resolve it again).
If the resolver exits non-zero, stop without any external mutation and tell the user to install
the skill-governance-adapters plugin.
python3 "<GUARD_PLUGIN_ROOT>/scripts/build-external-mutation-guard.py" preview --project-root "$PWD" --entrypoint-ref "plugin:<PLUGIN_NAME>/skills/<SKILL_NAME>/SKILL.md" --target-scope "<TARGET_SCOPE>" --diff-summary "<DIFF_SUMMARY>" --side-effect-summary "<SIDE_EFFECT_SUMMARY>" --command-json '<MUTATION_ARGV_JSON>'
Present that official preview output to the user. Only the exact user reply printed by preview
may trigger the registered hook-confirm producer. Then use the two returned receipt paths:
python3 "<GUARD_PLUGIN_ROOT>/scripts/build-external-mutation-guard.py" authorize --project-root "$PWD" --preview-receipt "<PREVIEW_RECEIPT_PATH>" --confirmation-receipt "<CONFIRMATION_RECEIPT_PATH>"
python3 "<GUARD_PLUGIN_ROOT>/scripts/build-external-mutation-guard.py" execute --project-root "$PWD" --authorization-receipt "<AUTHORIZATION_RECEIPT_PATH>" --command-json '<MUTATION_ARGV_JSON>'
Do not use an auto-approval flag or invoke the mutation command outside this receipt flow.
<!-- /external-mutation-guard-cli:v1 -->run-ubm-journal
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契約を継承する。
その日の振り返りを会話で行い、$UBM_VAULT_ROOT/02_Configs/Daily/{YYYY-MM-DD}.md へ構造化された
日次ジャーナルを生成する。チェックリストを読み上げるのではなく、「今日は何をやりましたか」から
自然に会話を進め、返ってきた話をジャーナルの各セクションへ振り分ける。
Purpose & Output Contract
- ゴール: 対象日のジャーナル1件が
references/output-format.mdの骨格で生成され、validate-journal-output.pyが PASS した状態。 - 出力契約:
02_Configs/Daily/{YYYY-MM-DD}.md1ファイル + バリデーション結果(PASS/FAIL)。 - 境界: 入力=前回ジャーナル / 最新の週報・月報・期報 / 対話回答。出力=日次ジャーナル1件のみ。
週報・月報・期報そのものの更新は
run-ubm-goal-settingへ委譲する(このスキルは読むだけ)。 - フォーマットは器であって目的ではない: テンプレートの穴埋めではなく、その日やったことを 構造的にまとめることが目的。分類見出しはその日の実態に合わせて命名してよい。
End-to-End Flow
| Phase | 責務 | 実行体 |
|---|---|---|
| Phase0-resolve | 対象日を確定し build-journal-context.py で番号・目標4階層・週報引き継ぎ・warnings を取得 | 本 skill(Bash) |
| Phase1-open | 「今日は何をやりましたか」で対話を開き、事実を出しきる | 本 skill |
| Phase2-deepen | 気づき・うまくいかなかったこと・時間の使い方・お金の動きを掘る | 本 skill |
| Phase3-fill | 埋まっていない枠(感謝・禁止事項・タスク)と未確認の固定習慣を、週報の呼び水を使って補う | 本 skill |
| Phase4-compose | 収集内容を骨格へ整形し Markdown を組み立てる | journal-composer(Task) |
| Phase5-validate | validate-journal-output.py で検証、違反があれば最大3回修正して保存 | journal-composer + script |
所要時間目安: 5〜10分。
Phase0: 文脈解決(必ず最初に実行する)
python3 "${PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT}}/skills/run-ubm-journal/scripts/build-journal-context.py" \
--vault-root "$UBM_VAULT_ROOT" --date "{YYYY-MM-DD}"
- 対象日は引数
$ARGUMENTSがあればそれ、無ければ 今日(ファイル日付=見出し日付=振り返る日)。 journal_numberをそのまま使う。番号を自分で数えない・推測しない。warningsは対話の切り口として使う(例: 1年目標の期間満了、期報の期間ズレ、当日タスク未検出)。existing_file.write_modeを必ず先に見る。ジャーナルは Write で全置換されるため、 ここを飛ばすと利用者の既存ファイルが消える。new: そのまま新規作成して進む。regenerate: 同じ日のジャーナルを作り直す。番号を維持し、更新であることを伝えてから進む。blocked: Write せず停止する。 対象ファイルに別日の内容が入っている。 どうするか(別名で作る/既存を退避する/中止する)を必ずユーザーへ確認してから動く。
Phase1-3: 対話
references/interview-map.md の問い→セクション対応表に沿って進める。
- 開き方: 「今日は何をやりましたか?」。列挙が出たら、時間をかけた順・人が関わった順に掘る。
- 翌日以降の視点: 「昨日やったことで気づいたことはありますか?」で効果性の材料を取る。
- 週報の呼び水:
weekly_report.day_tasksを「今日はこれが入っていましたが、どうなりましたか?」 の形で提示する。丸ごと転記はしない。 - 固定習慣(毎日必須): Phase0 の
daily_habits(6項目: Gridノート / 23時就寝 / ストレッチ / 計画外の動画視聴 / ジャーナル / SNS投稿)は毎回必ず確認する。ただし頭から順に読み上げず、 Phase1-2 で自然に出た項目は拾って済ませ、Phase3 で残った分だけを2〜3問に束ねて聞く。 達成/未達のどちらであれ痕跡を残す。ただし H01 が見るのは各習慣のsearch_scopesが 指すセクションの中だけなので、interview-map.mdの「落とす先」列のセクションへ書く (本文のどこかにあればよい、ではない)。痕跡ゼロは Phase5 で H01 違反になる。 - 週次習慣目標: 週報の習慣目標4群は独立セクションにせず、会話から達成状況を推し量って
行動・時間・お金の各ジャーナルへ事実として織り込む(
references/interview-map.md参照)。 - 目標セクションだけは自動: 1年/3ヶ月/1ヶ月/1週間目標と残日数は Phase0 の結果をそのまま使い、
ユーザーに確認を求めない。ただし
warningsに期間ズレ・満了があるときだけ確認する。
Phase4-5: 整形と検証
journal-composerサブエージェントへ Phase0 の context JSON、対話内容、親が host-skill-path から解決した absolutePLUGIN_ROOTを渡し、Phase4の整形から Phase5の保存・検証・最大3回修復までを一つの write scope で所有させる。親は対話、保存可否、入力スナップショットを所有し、保存済みpathとvalidator receiptだけを受け取る。Task 内でPLUGIN_ROOTが未指定または absolute でなければ fail-closed で停止する。journal-composerは保存後に必ず次を検証し、親へ path と最終 validator receipt を返す。親は同じファイルを再編集せず、receipt の exit 0 と対象 path / expected 値の一致で完了を判定する:
python3 "${PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT}}/skills/run-ubm-journal/scripts/validate-journal-output.py" \
--file "$UBM_VAULT_ROOT/02_Configs/Daily/{YYYY-MM-DD}.md" \
--expected-number {journal_number} --expected-date {YYYY-MM-DD}
- FAIL なら
journal-composerが違反コードに従って修正し、最大3回まで再検証する。3回で収束しなければ違反を残したまま 完了扱いにせず、残件をユーザーへ報告する。
ゴールシーク実行
goal_seek.engine: inline / fork: inline とし、ユーザー対話と保存可否はmain contextが所有する。journal-composer は Phase4-5 の単一 writer/validator を Task で担い、親は receipt で完了を判定する。最大3周で未達なら残件を open_issues と handoff に記録し、完了扱いにしない。
親の 1 周回の実体は Phase1-3 の対話へ戻って不足を埋め、journal-composer を Phase4-5 へ再委譲することである。周回の発火条件は「保存された journal が original_goal に対して不足している」とmain contextが判断した場合に限る (例: 事実・数値・固有名詞の取りこぼし、当日の意思決定が言語化されていない)。周回ごとに intermediate.jsonl へ 1 行 append し iteration を進める。
composer 内の最大3回は同じMarkdownに対する機械違反の修復であり、親のgoal-seek周回とは別である。機械違反は対話で埋められない種類の失敗なので、composerが3回で収束しなければ親がPhase4を自動再起動せず、周回を消費しないままその時点で停止し、違反コードをユーザーへ報告する。
ゴールシーク配線
original_goal と対象日を progress に固定し、各反復を run-ubm-journal-intermediate.jsonl へ append する。各行は iteration/original_goal/current_goal_snapshot/delta_from_original/merged_directive_for_next/drift_signal を持ち、journal path / validator receipt は結果の観測値として併記する。次回は直前の merged_directive_for_next を必須入力とする。
ゴールシーク検証
共通 validator の検査範囲は intermediate.jsonl の required_keys、非空・全行不変 original_goal、original_goal_hash == hashlib.sha256(original_goal) である。journal本文・番号・日付は Phase5 の validate-journal-output.py、保存pathとreceiptの対応は親の完了判定が担い、共通validatorがそれらも検査すると扱わない。
python3 "${PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT}}/scripts/validate-inline-goal-seek-anchor.py" \
"${CLAUDE_PROJECT_DIR:?caller project root is required}/eval-log/ubm-goal-setting/run-ubm-journal/goal-seek-progress.json" \
"${CLAUDE_PROJECT_DIR}/eval-log/ubm-goal-setting/run-ubm-journal/run-ubm-journal-intermediate.jsonl"
Key Rules
- 番号は決定論:
journal_numberはスクリプト値のみ。同日再生成時は番号を維持する。 - 日付3点一致: ファイル名の日付・見出しの日付・振り返る対象日は常に同じ。
- 数値は半角: 「25万円」ではなく
250,000。件数・日数・時刻も具体値で書く。 - 精神論を書かない: 「頑張る」「意識する」は打ち手として不可 → 誰に・何を・いつまで・何件 へ。
- 要約しすぎない: ユーザーが出した固有名詞・数値・時刻・相手の発言はそのまま残す。 1項目1事実に分解し、冗長な言い回しだけを削る。
- 3小節を混ぜない: 「現状を確認する」に評価や改善案を書かない。事実/解釈/打ち手を分離する。
- 継承値は書き換えない: 人生の究極目的・フェーズ別課題チェックシート・原理原則チェックシートは 前回から引き継ぎ、ユーザーが変更を申し出た項目だけ更新する。
- 原理原則チェックシートは毎回出す:
# 原理原則 チェックシート(11 設問)は省略・要約・抜粋をしない。 前回ジャーナルの状態をそのまま写し、対話で変化があったチェック状態だけを更新する。 前回に本ブロックが無ければreferences/principle-checklist.mdのテンプレートを未チェックで書き出す。 対話(Phase1-3)では読み上げない。11 設問を聞き取りに足すとジャーナル対話が倍の長さになって 毎日の運用が続かない。Phase4 の生成時に器として出すだけで要求は満たされる。
Gotchas
- 保存先の書込許可:
ubm-write-path-guardhook は vault 配下で02_Configs/Daily/を許可済み。02_Configs/の他のパスへは書けない(fail-closed)。 UBM_VAULT_ROOT未設定: Phase0 が exit 2 になる。vault パスをユーザーに確認してから再実行する。 Phase0 の exit 2 は「引数不正・vault 解決不能・Daily 不在・daily-habits.json 破損」の総称なので、 stderr の 1 行目を必ず読んでから対処すること。- 週報が当日を含まない: 週をまたいだ直後は直近週報を参照する(
covers_target: falseの warning)。 1週間目標の残日数は0日(期間終了・次週分の週報は未作成)と書く。 - 1年目標の対応レポートは存在しない: 前回ジャーナルからの継承のみ。満了していたら対話で確認する。
- フェーズ別課題チェックシートは本文の外:
## 【お金のジャーナル】の後、レベル1見出しとして置く。 - チェックシート2種を取り違えない:
# フェーズ別 課題チェックシート(0→1 / 1→10 / 10→100)と# 原理原則 チェックシート(11 設問)は別ブロックで、どちらも- [ ]の塊なので見た目では区別できない。 順序は必ずフェーズ別 → 原理原則(ファイル末尾)。原理原則の本文に水平線---を入れると、 翌日の継承がそこで打ち切られて以降の設問が静かに消える。
Additional Resources
- scripts:
scripts/build-journal-context.py(番号・目標・週報引き継ぎの決定論解決)/scripts/validate-journal-output.py(保存前バリデーション)。 - references:
references/resource-map.yaml(どの Phase でどれを開くかの索引。迷ったら最初に見る)/references/output-format.md(骨格の正本)/references/interview-map.md(問い→セクション対応)/references/daily-habits.json(毎日固定の習慣6項目の正本。項目を増減するときはここだけを編集し、keywordsとsearch_scopes(H01 が検査するセクション)を必ず併記する。search_scopesを 書き忘れた習慣は検査不能として H02 違反になる)/references/principle-checklist.md(# 原理原則 チェックシート11 設問の正本テンプレートと出力規則。 設問を増減するときはこのファイルとvalidate-journal-output.pyのPRINCIPLE_SECTIONSを同時に直す)。 - assets:
assets/golden-sample.md(バリデータ PASS の見本 / Few-shot)。 - agents:
journal-composer(plugin 直下agents/)。
レビュー
まだレビューはありません。使ってみた感想をお寄せください。
同じリポジトリのスキル
概要と使いどころ
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 基準で機械検証したいときに使う。