<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AI駆動開発 | AI開発実践ラボ</title>
	<atom:link href="https://creativecontentlabtokyo.com/category/generative-ai/feed/" rel="self" type="application/rss+xml" />
	<link>https://creativecontentlabtokyo.com</link>
	<description>AIで、作る力を手に入れる。</description>
	<lastBuildDate>Sun, 01 Nov 2026 05:01:42 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.4</generator>
	<item>
		<title>Salesforce開発でAIに任せられる範囲｜設定とコードの線引き</title>
		<link>https://creativecontentlabtokyo.com/ai-salesforce-development-scope/</link>
		
		<dc:creator><![CDATA[セールスフォース標準化推進ラボ]]></dc:creator>
		<pubDate>Sun, 01 Nov 2026 05:01:04 +0000</pubDate>
				<category><![CDATA[AI駆動開発]]></category>
		<category><![CDATA[デリバリーメソッド]]></category>
		<category><![CDATA[Apex]]></category>
		<category><![CDATA[LWC]]></category>
		<category><![CDATA[Salesforce]]></category>
		<category><![CDATA[システム開発]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/ai-salesforce-development-scope/</guid>

					<description><![CDATA[AIに頼むと、設定で済むものまでコードで返ってきます。設定か実装かを先に人が決め、メタデータを揃えて渡し、テストクラスを同時に書かせ、Orgへ入れる前に差分を見る4つの手順と、任せてはいけない3つの判断を整理します。]]></description>
										<content:encoded><![CDATA[<p>Salesforce の開発でAIを使っていて、いちばん多い失敗は実装の誤りではありません。<strong>設定で済むものまで、コードで返ってくる</strong>ことです。</p>
<p>「取引先の与信額を超えたら商談を登録できないようにしたい」と頼むと、トリガが返ってきます。入力規則1つで済む話です。動くので、レビューを通れば残ります。そして残ったコードは、以後ずっとテストクラスと保守の対象になります。</p>
<p>この種の失敗は、AIの性能の問題ではありません。<strong>何をどちらで作るかを、人が決めずに渡している</strong>から起きます。</p>
<h2 id="線引きを人が決めてから渡す">線引きを人が決めてから渡す</h2>
<p>AIに「作って」と頼めば、コードが返ります。コードを書くのが得意だからです。宣言的な設定で足りるかどうかは、<strong>この組織の運用、既存の設定の積み重なり、将来の保守の担い手</strong>で決まる話で、依頼文の中には書かれていません。</p>
<p>だから、渡す前に人が判定します。判定は4つの問いで足ります。</p>
<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<thead>
<tr>
<th>問い</th>
<th>Yes のとき</th>
</tr>
</thead>
<tbody>
<tr>
<td>標準機能でできるか</td>
<td>作らない。設定で済ませる</td>
</tr>
<tr>
<td>宣言的な機能（入力規則・数式・フロー・レポート・権限）で足りるか</td>
<td>コードを書かない</td>
</tr>
<tr>
<td>大量データや複雑な分岐で、制限に当たるか</td>
<td>コードを検討する</td>
</tr>
<tr>
<td>動いたことを、テストで繰り返し確かめられるか</td>
<td>コードを任せてよい</td>
</tr>
</tbody>
</table>
<p>4つ目が決定的です。<strong>Salesforce でAIに任せやすいのは、テストで確かめられる領域</strong>です。逆に、確かめ方が「画面で操作してみる」しかない領域は、任せたあとの検証が人の目視に戻るので、任せる効果が小さくなります。</p>
<h2 id="任せやすいもの任せにくいもの">任せやすいもの／任せにくいもの</h2>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th></th>
<th>任せやすさ</th>
<th>理由</th>
</tr>
</thead>
<tbody>
<tr>
<td>Apex のロジック（サービスクラス・ハンドラ）</td>
<td>◎</td>
<td>テストクラスで確かめられる。誤りが実行時に出る</td>
</tr>
<tr>
<td>SOQL / SOSL の組み立て</td>
<td>◎</td>
<td>結果を見れば正否が分かる。制限の回避も定石がある</td>
</tr>
<tr>
<td>テストクラス</td>
<td>◎</td>
<td>数が多く、形が決まっている。最も費用対効果が高い</td>
</tr>
<tr>
<td>LWC のテンプレートと JavaScript</td>
<td>○</td>
<td>見た目は目視が必要だが、構造は任せられる</td>
</tr>
<tr>
<td>既存コードの読み解き・影響範囲の洗い出し</td>
<td>◎</td>
<td>人が読む時間がいちばん掛かる作業</td>
</tr>
<tr>
<td>フロー（Flow）</td>
<td>△</td>
<td>メタデータが XML で、差分が人に読みにくい。壊れたときの原因が追いにくい</td>
</tr>
<tr>
<td>権限（プロファイル・権限セット）</td>
<td>△</td>
<td>影響範囲が組織全体。誤りが「見えてしまう」事故になる</td>
</tr>
<tr>
<td>共有設定（組織の共有設定・ロール階層・共有ルール）</td>
<td>×</td>
<td>変更の影響が広く、戻すのに時間がかかる。設計判断そのもの</td>
</tr>
<tr>
<td>本番への反映</td>
<td>×</td>
<td>取り消せない</td>
</tr>
</tbody>
</table>
<p><strong>「任せにくい」は「AIが間違える」という意味ではありません。</strong> 間違えたときに気づきにくい、または戻しにくい、という意味です。判断の軸は難しさではなく、<strong>やり直しが効くか</strong>です。</p>
<h2 id="手順">手順</h2>
<h3 id="設定で済むかを先に判定する">① 設定で済むかを先に判定する</h3>
<p>前節の4つの問いを通します。ここで「設定で足りる」と分かったものは、そもそもAIに実装を頼みません。頼むとしても、<strong>設定の手順を書かせる</strong>だけにします。</p>
<p>判定の時点で迷うものは、「両方の案と、それぞれの保守の負担を出して」と頼むのが有効です。<strong>案を選ばせず、比較を作らせて、選ぶのは人がやる</strong>。この形にすると、コードに寄る傾向を打ち消せます。</p>
<h3 id="対象のメタデータを揃えて渡す">② 対象のメタデータを揃えて渡す</h3>
<p>Salesforce は、同じ業務でも組織ごとに項目の参照名が違います。渡さないと、一般的な名前のコードが返ります。<code>Account.CreditLimit__c</code> のつもりで <code>Account.Credit_Limit__c</code> と書かれていると、動かないか、もっと悪い場合は別の項目を更新します。</p>
<p>渡すのは次の4つです。</p>
<ul>
<li>対象オブジェクトと項目の<strong>API 参照名</strong>（型・必須・参照先まで）</li>
<li>既存の似たクラス1本（命名規約・層の分け方・例外の扱いが、説明より確実に伝わる）</li>
<li>関係する<strong>トリガやフローの有無</strong>（二重に更新が走る事故を防ぐ）</li>
<li>想定するデータ量（1件ずつか、一括か）</li>
</ul>
<p>メタデータを集める作業そのものは、組織から取得すれば済みます。項目定義の一覧やメタデータの取り出しは、<a href="https://creativecontentlabtokyo.com/function-list-of-salesforce-workbench-and-explanation-of-how-to-use-it/">Salesforceワークベンチ(workbench)の機能一覧と使い方</a>にまとめた方法で取れます。</p>
<h3 id="テストクラスを一緒に書かせる">③ テストクラスを一緒に書かせる</h3>
<p>Salesforce は、本番へ反映するときにテストの網羅率を求められます。つまり<strong>テストクラスを書かずに済む選択肢がありません</strong>。それなら、実装と同時に書かせます。</p>
<p>このとき条件を2つ付けます。</p>
<blockquote>
<ul>
<li><strong><code>System.assert</code> で結果を確かめること。</strong> 実行が通るだけのテストを書かないこと</li>
<li><strong>一括処理（200件）の場合も通すこと</strong></li>
</ul>
</blockquote>
<p>1つ目を書かないと、網羅率だけを満たす中身の無いテストが返ります。これはあとで不具合を見逃す原因になるだけでなく、<strong>テストがあるという誤った安心を作ります</strong>。</p>
<p>2つ目は Salesforce 固有です。1件で動いて200件で落ちるのは、繰り返しの中で検索や更新を呼んでいるときに起きます。テストを200件で通す決まりにしておくと、実装側も自然とまとめた形になります。</p>
<h3 id="org-へ入れる前に差分を見る">④ Org へ入れる前に、差分を見る</h3>
<p>できたものを、そのまま組織へ反映しません。見るのは<strong>差分</strong>です。</p>
<ul>
<li>変更されるファイルの一覧を先に出す（自分が頼んでいないファイルが入っていないか）</li>
<li>検証のみの反映（実際には適用しない形）で、テストを通す</li>
<li>反映先の組織を<strong>毎回確認する</strong>。接続先が複数あるとき、取り違えはいつでも起こりうる</li>
</ul>
<p>最後の1つは手順というより決まりごとです。<strong>反映先の確認を省いた回だけ事故が起きます。</strong> 確認を人の注意力に任せず、反映の直前に接続先を表示させる形にしておくのが確実です。</p>
<h2 id="任せてはいけないこと">任せてはいけないこと</h2>
<h3 id="共有権限の最終判断">共有・権限の最終判断</h3>
<p>誰がどのレコードを見えるか、という設計は、AIに判断させません。影響範囲が組織全体で、しかも誤りの出方が「エラー」ではなく「見えてしまう」「見えない」という形になります。テストでも気づきにくく、気づくのは業務側から指摘されたときです。</p>
<p>案や比較表を作らせるのは有効です。<strong>決めるのは人</strong>です。</p>
<h3 id="本番への反映">本番への反映</h3>
<p>取り消せない操作は任せません。手順を書かせるのはよく、実行は人がやります。</p>
<p>Salesforce の場合、特に注意するのは<strong>データの投入・更新</strong>です。コードの反映は戻せますが、上書きされたデータは戻りません。実行前にバックアップを取り、<strong>そのバックアップから実際に戻せること</strong>まで確かめます。ファイルができたことと、復元できることは別です。</p>
<h3 id="ガバナ制限api-制限の前提">ガバナ制限・API 制限の前提</h3>
<p>「1回の処理で何件まで」「1日のAPI呼び出しが何回まで」といった前提は、組織の版と契約で変わります。AIは一般的な数字を書きますが、<strong>その組織の実際の上限とは一致しません</strong>。制限に関わる設計は、自分の組織の値を確認してから決めます。</p>
<h2 id="うまくいかないときの原因">うまくいかないときの原因</h2>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td>設定で済むものがコードで返る</td>
<td>判定をせずに「作って」と頼んでいる</td>
<td>4つの問いを先に通す。迷うものは比較表を作らせ、選ぶのは自分がやる</td>
</tr>
<tr>
<td>存在しない項目名のコードが返る</td>
<td>API 参照名を渡していない</td>
<td>項目定義を参照名・型つきで渡す</td>
</tr>
<tr>
<td>1件では動くが一括で落ちる</td>
<td>繰り返しの中で検索・更新を呼んでいる</td>
<td>テストを200件で通す決まりにする</td>
</tr>
<tr>
<td>テストが通るのに不具合が出る</td>
<td>結果を確かめていないテストを受け取っている</td>
<td><code>System.assert</code> を必須にする。網羅率だけを条件にしない</td>
</tr>
<tr>
<td>既存のトリガと二重に更新される</td>
<td>既存の自動処理を伝えていない</td>
<td>対象オブジェクトのトリガ・フローの有無を先に渡す</td>
</tr>
<tr>
<td>書き方が案件の規約に合わない</td>
<td>説明で規約を伝えている</td>
<td>既存の似たクラス1本を見本として渡す</td>
</tr>
</tbody>
</table>
<h2 id="まとめ">まとめ</h2>
<p>Salesforce 開発でAIに任せる順番は、次のとおりです。</p>
<ol type="1">
<li><strong>設定で済むかを人が判定する</strong>（標準機能・宣言的機能・制限・確かめ方の4問）</li>
<li><strong>メタデータを揃えて渡す</strong>（参照名・既存クラス1本・既存の自動処理・データ量）</li>
<li><strong>テストクラスを一緒に書かせる</strong>（<code>System.assert</code> 必須・200件で通す）</li>
<li><strong>組織へ入れる前に差分を見る</strong>（変更ファイルの一覧・検証のみの反映・接続先の確認）</li>
</ol>
<p>任せないのは、<strong>共有と権限の最終判断／本番への反映／制限の前提</strong>の3つです。</p>
<p>AIエディタを使った Salesforce 開発の全体像と用語は<a href="https://creativecontentlabtokyo.com/develop-salesforce-with-vibe-cording-using-ai-editor/">AIエディタを使ったVibe CordingでSalesforceの開発を行う</a>に、実際の開発事例は<a href="https://creativecontentlabtokyo.com/development-use-case-vibe-coding/">AIエディタを使ったVibe codingの実際の開発事例</a>にまとめています。コード生成そのものの様子は<a href="https://creativecontentlabtokyo.com/saleforce-development-using-ai-chatgpt-automatic-code-generation/">AI（ChatGPT）を使ったSalesforce開発（自動コード生成）</a>が参考になります。</p>
<p>複数の作業を同時に走らせる段階に進むなら、<a href="https://creativecontentlabtokyo.com/ai-parallel-development/">複数の作業を同時に走らせる</a>に事故の防ぎ方を含めてまとめています。</p>
<p>自分の組織の構成に合わせてこの流れを通したい方へは、<a href="https://creativecontentlabtokyo.com/training/">AI開発トレーニング</a>で1対1の形でお伝えしています。</p>
<hr />
<p>Salesforce、Apex、SOQL、Lightning Web Components、AppExchange、Trailhead は、Salesforce, Inc. の米国およびその他の国における商標または登録商標です。その他、記載されている会社名・製品名は各社の商標または登録商標です。本記事は Salesforce, Inc. その他いかなる第三者からも、承認、提携、後援を受けたものではありません。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AIの開発作業を複数同時に走らせる方法｜事故を防ぐ設定と管制塔の回し方</title>
		<link>https://creativecontentlabtokyo.com/ai-parallel-development/</link>
		
		<dc:creator><![CDATA[セールスフォース標準化推進ラボ]]></dc:creator>
		<pubDate>Sat, 31 Oct 2026 06:35:21 +0000</pubDate>
				<category><![CDATA[AI駆動開発]]></category>
		<category><![CDATA[デリバリーメソッド]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[worktree]]></category>
		<category><![CDATA[並行開発]]></category>
		<category><![CDATA[生成AI]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/ai-parallel-development/</guid>

					<description><![CDATA[AIに任せる作業を1本ずつ待っていては速くならない。かといって同じフォルダで同時に走らせると壊れる。作業場の分け方、事故を防ぐ設定、レビューが詰まらない回し方を、実際に4本を並行させて起きた失敗込みで解説します。]]></description>
										<content:encoded><![CDATA[<p>AIに作業を任せられるようになると、次に思う。<strong>これを3本、4本と同時に走らせたら、もっと速くなるのではないか。</strong></p>
<p>ところが試してみると、速くならない。許可を求めて止まったタブが並び、答えて回るのが仕事になる。完成したものが積み上がるのに、受け入れが追いつかない。しかも、気づかないうちに<strong>自分が作ったファイルが、別の作業の記録に紛れ込んでいる</strong>。</p>
<p>並行を詰まらせるのは、AIの速さではありません。<strong>起動方式の選び間違い、準備不足、そして人のレビューです。</strong> この記事では、そこを順に潰す手順を書きます。実際に4本を並行させて起きた失敗も、そのまま載せます。</p>
<h2 id="そもそも同時に走らせるとは">そもそも「同時に走らせる」とは</h2>
<p>ここで言う「同時に走らせる」は、1つの大きな仕事を分けて、複数のAIに別々に進めさせることです。分け方は大きく3つあります。</p>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th>方式</th>
<th>中身</th>
<th>向いている仕事</th>
</tr>
</thead>
<tbody>
<tr>
<td>① サブエージェント（裏で動かす）</td>
<td>自分は別の作業を続けられる。ただし<strong>コマンドを実行できない</strong></td>
<td>調査・比較、文書の下書き、レビュー</td>
</tr>
<tr>
<td>② サブエージェント（待ちながら動かす）</td>
<td>終わるまで待つ。許可を求められたら答えられるのでコマンドを実行できる</td>
<td>テストの実行、git 操作を伴う作業</td>
</tr>
<tr>
<td>③ worktree ＋ 別セッション</td>
<td>作業フォルダごと分けた、完全に別の会話。中断・再開ができる</td>
<td>数日かかる実装、複数機能の同時開発</td>
</tr>
</tbody>
</table>
<p>①と②は別の仕組みではなく、同じサブエージェントの実行モードの違いです。別物だと思っていると、切り替えられることに気づけません。</p>
<h3 id="選ぶ決め手は途中で会話が必要か">選ぶ決め手は「途中で会話が必要か」</h3>
<p>作業時間や規模で選ぼうとすると迷います。本当の分かれ目は、次の3つの問いです。</p>
<ol type="1">
<li>設計判断が出てくる、仕様が固まっていないなど、<strong>途中で相談・方向修正が必要か</strong></li>
<li>今日で終わらない、中断して再開するなど、<strong>何日もかけて進めるか</strong></li>
<li>多くのファイルを書き換え、<strong>他の作業と同じファイルを触りうるか</strong></li>
</ol>
<p><strong>どれか1つでも「はい」なら worktree ＋ 別セッション。</strong> すべて「いいえ」ならサブエージェントで足ります。サブエージェントは1回の依頼で完結するので、方向がずれても最後まで走ってから気づくことになります。</p>
<p>迷ったらサブエージェントから始めてください。worktree は作業場の作成・統合・片づけの手間がかかります。「途中で相談したくなった」「今日で終わらない」と分かった時点で切り替えれば、途中まで進んだ内容は新しい作業場へ持っていけます。</p>
<p>選び間違えると、次のことが起きます。</p>
<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<thead>
<tr>
<th>間違い</th>
<th>症状</th>
</tr>
</thead>
<tbody>
<tr>
<td>worktree にすべきものをサブエージェントに投げた</td>
<td>途中で相談できないまま最後まで走り、方向のずれたものが完成する。大量の出力でメインの記憶も圧迫される</td>
</tr>
<tr>
<td>サブエージェントで足りるものを worktree にした</td>
<td>15分の作業に30分の準備がかかる</td>
</tr>
<tr>
<td>worktree を作ったまま放置した</td>
<td>次に間違えてそこで作業する。本流に統合されないまま古くなり、最後に大量の競合を抱える</td>
</tr>
</tbody>
</table>
<h3 id="いちばん多い失敗はコマンドが要る作業を裏で動かすこと">いちばん多い失敗は、コマンドが要る作業を「裏で」動かすこと</h3>
<p>裏で動かすサブエージェントは、許可を尋ねる相手がいないので、コマンドを実行できません。コマンドが要る作業を裏に回すと、<strong>着手する前に止まります。</strong></p>
<p>対処は分業です。ファイルの編集だけをエージェントに任せ、コマンドの実行は自分（メインセッション）が行います。指示の末尾に次の一文を足します。</p>
<pre><code>コマンドの実行はこちら（メインセッション）で行います。
あなたはファイルの作成・編集までを行い、完了報告に
「メインセッションで実行すべきコマンド」を列挙してください。</code></pre>
<h3 id="実装を並行させるなら子セッションが要る">実装を並行させるなら、子セッションが要る</h3>
<p>実装には git の操作やテストの実行が付きものです。裏で動かすエージェントだけでは完結しません。そのため実装を並行させるときは、<strong>メインセッションが子セッション（別タブの Claude Code）を起動し、会話し、統合する</strong>形をとります。「エージェントに全部やらせる」のではなく、「メインが子セッションを操る」。これが、いわゆる全自動の実体です。</p>
<p>このときメインは実装をしません。分解・作業場づくり・起動・連絡・統合・片づけに専念します。以降、このメインを<strong>管制塔</strong>と呼びます。人が手を動かすのは、最初の依頼と、止まったときの判断と、最後の受け入れだけです。</p>
<h2 id="用意するもの">用意するもの</h2>
<p>並行させる前に、次の4つがあるかを確かめます。無いまま始めると、右の列のことが起きます。</p>
<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<thead>
<tr>
<th>用意するもの</th>
<th>無いとどうなるか</th>
</tr>
</thead>
<tbody>
<tr>
<td>許可リスト（よく使うコマンドの事前許可）</td>
<td>子セッションが毎回「実行してよいですか」で止まる。4本なら許可を求める場面は4倍になり、タブを見て回ることが主な作業になる</td>
</tr>
<tr>
<td>禁止リスト（「変更を全部まとめて記録する」操作の禁止）</td>
<td>別のセッションが作業中のファイルまで巻き込まれ、巻き込まれた側は気づく機会がない</td>
</tr>
<tr>
<td>並行運用のルールを書いた CLAUDE.md</td>
<td>同じ指示を毎回説明することになる。2回言ったことは CLAUDE.md に書く</td>
</tr>
<tr>
<td>作業ごとに分けた作業場（worktree）</td>
<td>同じフォルダを2つのセッションが触り、編集の上書きや、ブランチ切り替えによるファイルの入れ替わりが起きる</td>
</tr>
</tbody>
</table>
<p>もう1つ、<strong>担当ファイルの一覧</strong>が要ります。誰がどのファイルを持つかを1つの表にして、全員が同じものを見られるようにします。</p>
<p>なぜ同じフォルダで並行できないのか。フォルダは「いま1つの状態」しか持てないからです。一方のセッションがブランチを切り替えると、フォルダの中身が丸ごと入れ替わり、もう一方が編集していた内容も一緒に消えます。worktree は、1つのリポジトリから作業フォルダだけを複数作る仕組みです。履歴は共有したまま、フォルダごとに別のブランチを開けます。</p>
<p><strong>分けるかどうかの決め方は1つだけです。ファイルを1つでも書くなら作業場を分ける。読むだけなら分けなくてよい。</strong>「レビューするだけ」「調べるだけ」を理由に分けないのは危険です。調べた結果をまとめた文書も、立派な成果物だからです。実際に、「調査だけだから」と分けずに始めたセッションが数百行の調査メモを書き、それが別の作業の記録に紛れ込みました。そのコミットの題名は「デプロイ手順の訂正」で、中身には調査メモが丸ごと入っていました。内容が消えるわけではありませんが、題名と中身が一致しなくなり、あとから「あの変更だけを取り消したい」と思ってもできません。</p>
<h2 id="手順">手順</h2>
<h3 id="手順1-許可リストを整える">手順1　許可リストを整える</h3>
<p>子セッションは、コマンドを実行するたびに許可を求めてきます。答えるまで、その子は止まったままです。よく使うコマンドを許可しておけば、この停止はほぼ無くなります。メインに次のように頼みます。</p>
<pre><code>これから複数の作業を並行させます。
子セッションが毎回「実行してよいですか」で止まらないように、
許可リストを整えてください。

1. このプロジェクトでよく使うコマンドを洗い出す
   （テスト実行 / ビルド / 状態確認 / 差分確認 など）
2. そのうち「読み取りだけ」「元に戻せる」ものを許可リストの候補として挙げる
3. 候補を一覧で見せてから、私が承認したら設定に追加する

次のものは許可リストに入れないでください。
- ファイルやフォルダを消すもの
- 外部へ送信するもの（デプロイ・アップロード・メール送信）
- 本番環境に触れるもの
追加した内容は、あとで見返せるように記録も残してください。</code></pre>
<p><strong>なぜ最初にやるのか。</strong> ここを先に潰しておくと、走らせている間にやることが本当に減るからです。許可リストに入れるのは「読み取りだけ」「元に戻せる」ものに限ります。消す、送る、本番に触れる、は入れません。</p>
<p>禁止リストも、準備としては同じ時点で入れます。独立した節で詳しく書くので、先に手順の続きを進めます。</p>
<h3 id="手順2-claude.md-に並行のルールを書く">手順2　CLAUDE.md に並行のルールを書く</h3>
<p>並行のルールを CLAUDE.md に貼っておくと、毎回同じことを指示せずに済みます。入れる項目は次のとおりです。</p>
<pre><code>## 並行開発のルール

### 所有権を先に決める
- 作業を割る前に「どのファイルを誰が触るか」の表を作り、全員が同じ表を見る
- 表は tasks/ownership.md に置き、変更は管制塔だけが行う
- 所有権は「ファイル」ではなく「そのデータへの書き込みロジック」で切る

### 触ってよい範囲
- 自分の作業場から出ない。他の担当のファイルは読んでよいが、書いてはいけない
- 必要になったら、自分で直さず「こう変えたい」と管制塔へ報告する
- 共有ファイル（設定・共通関数・型定義）は管制塔が持つ

### 報告のしかた
- 区切りごとにコミットする（作業が失われるのを防ぐ／進捗が外から見える）
- 検証が終わっていないものを「終わった」と書かない

### 止まる条件（必ず人に聞くこと）
- 担当ファイルが重なるとき
- 統合で競合が出たとき
- 仕様の解釈が2通り以上あるとき
- 消す・上書きするなど、元に戻せない操作をするとき</code></pre>
<p><strong>なぜか。</strong> 「所有権をファイルではなく書き込みロジックで切る」のは、ファイル単位で分けたつもりでも、同じデータを2か所から更新する構造ができてしまうことがあるからです。そうなると、どちらを正とするかを後から決め直すことになります。</p>
<h3 id="手順3-セッションどうしが連絡できるかを確かめる">手順3　セッションどうしが連絡できるかを確かめる</h3>
<p>管制塔から子セッションへ直接メッセージを送れる環境かどうかを、先に確認します。送れない場合は、あなたが内容を転記することになり、進め方が変わります。次の1行で足ります。</p>
<pre><code>いま起動している Claude Code のセッションを一覧で出せますか。
出せる場合、そのセッションへ直接メッセージを送れるかも教えてください。
できない場合は、その旨だけ答えてください。</code></pre>
<h3 id="手順4-プロンプト1本で回す">手順4　プロンプト1本で回す</h3>
<p>準備ができたら、依頼は1回で済みます。分解・作業場づくり・起動・指示・進捗管理・統合・片づけまで、1本に含めます。要点は次の5つです。</p>
<ol type="1">
<li><strong>分解</strong>　1つ1〜3時間で終わる粒度に割る。担当ファイルが重ならないよう割り当て、一覧を <code>tasks/ownership.md</code> に残す。分解結果は画面に出させるが、承認は待たせない</li>
<li><strong>作業場づくりと起動</strong>　作業ごとに worktree を作り、Git 管理外だが必要な設定ファイルを引き継ぎ、子セッションを起動して最初の指示を渡す</li>
<li><strong>走っている間</strong>　完了したら通知を受ける形にし、子どうしを直接やり取りさせない。指示が誤っていたら、気づいた1本だけでなく全部の作業場へ訂正を配る</li>
<li><strong>完了報告を受けたら</strong>　鵜呑みにせず、履歴と差分を自分で確認してから受け入れる</li>
<li><strong>統合と片づけ</strong>　小さいものから順に統合し、1本統合するごとに残りへ最新を取り込む。最後に統合後の状態で動作確認まで行う</li>
</ol>
<p>子セッションに渡す最初の指示には、必ず次を含めます。何をするか（前提を知らない相手に説明する形で）、触ってよいファイルと触ってはいけないファイル、完了条件、<strong>コミットまで行い push はしないこと</strong>、完了したら何を報告するか。</p>
<p>そして、次の場合は必ず止まって人に聞かせます。</p>
<ul>
<li>担当ファイルが重なってしまう</li>
<li>統合で競合が出た</li>
<li>仕様の解釈が2通り以上ある</li>
<li>消す・上書きするなど、元に戻せない操作をする</li>
</ul>
<p>これ以外は自分の判断で進めさせ、決めたことは理由とセットで1か所に記録させます。<strong>「私の承認は待たなくてよい」を入れるのは、分解のたびに止めると自動化した意味がほぼ無くなるからです。</strong> ただし、分解の結果を画面に出させることだけは残してください。止まらないので手間はゼロですが、あとで問題が起きたときに「どう割り当てたか」を遡れます。これが無いと、原因を追うところからやり直しです。</p>
<p>並行が2〜3本で、領域が明確に分かれ、新規ファイルの追加が中心なら、分解の承認は省略して構いません。逆に、並行が4本以上、同じモジュールを複数が触る、共通部分（設定・共通関数・型定義）に手が入る、といった場面では止めてください。省略するなら、<strong>統合の前に作業場どうしの重なりを検出させる</strong>ことで補います。事前に止めるか事後に見つけるかの違いで、どちらも無いと、競合に気づくのがマージの瞬間になります。両方の作業が終わってからのやり直しです。</p>
<h3 id="手順5-受け入れて統合して片づける">手順5　受け入れて、統合して、片づける</h3>
<p>人がやるのは受け入れの判断です。読む前に、メインに照合させます。</p>
<pre><code>並行して進めた作業を受け入れます。私が読む前に、次を確認して一覧で報告してください。
1. 各作業が完了条件を満たしているか（1つずつ照合して結果を書く）
2. 割り当てたファイル以外を触っていないか（差分で確認する）
3. 作業場どうしで同じファイルを触っていないか
4. 同じ用途のものを別々に作ってしまっていないか
5. 顧客名・パスワードの混入が無いか（機械的に検査する）
6. 私が判断すべき点（作業ごとに3点以内）
「問題ありません」だけの報告はしないでください。
確認した内容を1項目ずつ示してください。</code></pre>
<p>レビューは「読む」のではなく「完了条件に照らす」作業にします。そうしないと、読むたびに気になる点が増えて終わりません。機密の混入は目視ではなく検索で確認します。直すときは全部やり直しではなく、<strong>どこを・なぜ・どう直すか</strong>を指定します。</p>
<p>統合は、変更量が小さいものから順に行います。大きい方を先に入れると、小さい方が大量の競合を抱えるからです。1本統合したら、他の作業場へ最新を取り込みます。ずれが小さいうちに解消するためです。競合が出たら、管制塔のフォルダで直します。子セッションに直させると、同じ箇所を別々に直して、さらに壊れます。統合し終えたら作業場と枝を消します。残すと、次に間違えてそこで作業してしまうからです。</p>
<p>人が手放してはいけないのは3つです。<strong>レビューと受け入れ、競合の解消方針、仕様の解釈が割れたときの決定。</strong> どれもやり直しが効かない判断です。</p>
<h2 id="事故を防ぐ設定-許可リストとセットで禁止リストも入れる">事故を防ぐ設定 — 許可リストとセットで「禁止リスト」も入れる</h2>
<p>許可リストは「止まらないようにする」ためのものでした。これとは別に、並行させるなら必ず入れておきたい禁止があります。<strong>「変更を全部まとめて記録する」操作</strong>です。</p>
<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<thead>
<tr>
<th>操作</th>
<th>並行時に何が起きるか</th>
</tr>
</thead>
<tbody>
<tr>
<td>変更を全部まとめて記録する（<code>git add -A</code> / <code>git add .</code> / <code>git commit -a</code>）</td>
<td>フォルダの中身を丸ごと拾うため、別のセッションが作業中のファイルまで巻き込む。巻き込まれた側は自分で記録していないので、気づく機会がない</td>
</tr>
<tr>
<td>変更したファイルを名指しで記録する（<code>git add ファイル名</code>）</td>
<td>自分が触ったものだけが記録される。<strong>これを既定にする</strong></td>
</tr>
</tbody>
</table>
<p>禁止リストの対象は、<code>git add -A</code>、<code>git add .</code>、<code>git add --all</code>、<code>git commit -a</code> です。書き方の違いで抜けないよう、<strong>表記ゆれもまとめて並べます</strong>。1つでも漏れると、そこから入ってきます。</p>
<p>設定ファイルの書き方は使っているツールによって違うので、自分で書式を調べるより、後述のようにメインへ頼んで入れてもらうのが確実です。</p>
<p>もう1つ入れるのが、<strong>記録する直前に、いま自分がどのブランチに居るかを毎回表示させる</strong>仕組みです。セッションを始めたときの表示は、途中で古くなります。別のセッションがブランチを切り替えると、自分が変えていないのに、居る場所が変わります。「記録したはずの変更が、目的のブランチに無い」という事故は、これで起きます。</p>
<p>メインには、次のように頼みます。</p>
<pre><code>複数のセッションを並行させるので、事故防止の設定を入れてください。

1. 「変更を全部まとめて記録する」操作を禁止リストに入れる
   （git add -A / git add . / git add --all / git commit -a）
   → 記録は必ずファイル名を指定する形にしたい
2. 記録する直前に、いま自分がどのブランチに居るかを
   毎回表示するようにしてください
   → セッションを始めたときの表示は、途中で古くなるため
3. 入れ終わったら、実際に禁止されているかを1回試して確認してください
   （危険のない形で試せる方法があれば、それで確認してください）

設定した内容と、確認した結果を報告してください。</code></pre>
<p>3番を必ず入れてください。設定に書いただけでは、確認になっていません。</p>
<h3 id="なぜルールを書くではなく設定で止めるのか">なぜ「ルールを書く」ではなく「設定で止める」のか</h3>
<p>同じ事故を防ぐために、CLAUDE.md に禁止事項として書いた対策が、<strong>2回とも破られた</strong>ことがあります。2回目は、そのルールを書いた本人（AI）が、ルールを読める状態のまま破りました。</p>
<blockquote>
<p>「なぜそうするか」は CLAUDE.md に、「何を禁止するか」は設定に書く。文章で書いたルールは実行直前に読まれる保証がない。</p>
</blockquote>
<p>CLAUDE.md は、AIが判断するときの理由と背景を伝える場所です。ただ、実行の直前に読み返される保証はありません。実行を止められるのは設定だけです。この2つを混ぜると、片方が効かなくなります。禁止を文章だけで書いて満足しないでください。</p>
<p>なお、禁止リストは<strong>最後の網</strong>です。そもそも作業場を分けていれば、他のセッションのファイルを巻き込む事故は起きません。分ける、禁止する、直前に現在地を見る、の3つを重ねておくと、どれか1つが抜けても事故になりません。</p>
<h2 id="走っている間に見る場所">走っている間に見る場所</h2>
<p>並行しているものを全部追いかける必要はありません。見る場所は5つに絞れます。このうち<strong>1と3だけが、人にしかできません。</strong></p>
<table>
<colgroup>
<col style="width: 25%" />
<col style="width: 25%" />
<col style="width: 25%" />
<col style="width: 25%" />
</colgroup>
<thead>
<tr>
<th>#</th>
<th>見るもの</th>
<th>だれが</th>
<th>放っておくとどうなるか</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>止まって聞いてきたこと（担当の重なり・競合・解釈が2通り・元に戻せない操作）</td>
<td>あなた</td>
<td>推測で進み、完成してから方向違いが分かる</td>
</tr>
<tr>
<td>2</td>
<td>確認待ちの件数（3件を超えたら新しく始めさせない）</td>
<td>メイン</td>
<td>成果物は増えるのに、いつまでも完了しない</td>
</tr>
<tr>
<td>3</td>
<td>許可を求めて止まっているタブ</td>
<td>あなた</td>
<td>作業を抱えたまま静かに止まり続ける</td>
</tr>
<tr>
<td>4</td>
<td>使っている資源の残り（外部サービスの呼び出し回数・容量・同時実行数）</td>
<td>メイン</td>
<td>全部が同時に止まる</td>
</tr>
<tr>
<td>5</td>
<td>担当ファイルの一覧</td>
<td>メイン</td>
<td>重なりに気づくのが統合の瞬間になる</td>
</tr>
</tbody>
</table>
<p>状況は、1日1〜2回、次のようにまとめて出してもらいます。</p>
<pre><code>いまの状況をまとめて出してください。
1. 各作業場の進み具合（コミット数 / まだ保存していない変更の数 / 直近の作業内容）
2. 全体の到達点
3. 作業場の一覧（放置されているものがあれば指摘する）
4. 使っている資源の残り（外部サービスの呼び出し回数・容量など）
5. 私の確認待ちになっているもの
6. 止まっているもの（あれば理由も）
確認待ちが3件を超えていたら、新しい投入を止めて
先に見るべきものから順に出してください。</code></pre>
<p>「まだ保存していない変更の数」を入れているのは、子セッションが長時間コミットせずに書き続けていることがあるからです。そのまま落ちると全部失われます。「区切りでコミットして」と伝えるだけで防げます。</p>
<h3 id="並行数の目安">並行数の目安</h3>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th>指標</th>
<th>目安</th>
<th>崩れたときの症状</th>
</tr>
</thead>
<tbody>
<tr>
<td>同時に動かす数</td>
<td>3〜4本</td>
<td>超えると、分割・統合・衝突の解消に時間を取られる</td>
</tr>
<tr>
<td>レビュー待ち</td>
<td>3件以下</td>
<td>超えたら新しい投入を止める</td>
</tr>
<tr>
<td>投入からレビューまで</td>
<td>その日のうち</td>
<td>翌日以降になると、内容を思い出す時間が上乗せされる</td>
</tr>
</tbody>
</table>
<p>並行数を増やせば速くなる、というのは途中までしか正しくありません。レビューするのは常に自分1人なので、そこが詰まると全体が止まります。<strong>増やすべきは投入数ではなく、片づける速さです。</strong> レビュー待ちが増えたら、新しい投入を止めて片づけを優先してください。</p>
<p>並行してよいかの判定は、「Aが終わっていなくてもBを始められるか？」と問うだけです。始められないなら順番が必要です（データ構造の変更から実装へ、公開から動作確認へ、同じファイルを2人が編集、など）。</p>
<h2 id="本以上を回すときに効いたこと">4本以上を回すときに効いたこと</h2>
<p>2〜3本と4本以上では、必要な仕組みが変わります。実際に4本を並行させて分かったことです。</p>
<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<thead>
<tr>
<th>やったこと</th>
<th>やらないとどうなるか</th>
</tr>
</thead>
<tbody>
<tr>
<td>所有権を1つの表にまとめ、全員に同じものを見せる。初期プロンプトの「触ってよい／いけないファイル」の列挙だけでは足りない</td>
<td>担当の重なりに気づくのがマージの瞬間になり、両方の作業が終わってからやり直しになる</td>
</tr>
<tr>
<td>所有権を「ファイル」ではなく「書き込みロジック」で切る</td>
<td>同じデータを2か所から更新する構造ができ、どちらを正とするかを後から決め直すことになる</td>
</tr>
<tr>
<td>管制塔から各セッションへ直接連絡する手段を用意する</td>
<td>伝達が人の手作業の転記になり、伝え漏れと遅れが積み上がる</td>
</tr>
<tr>
<td>終わったら知らせてもらう（聞きに行かない）</td>
<td>状況確認そのものが管制塔の仕事になり、待ち時間が増える</td>
</tr>
<tr>
<td>報告を鵜呑みにせず、必ず自分で確かめる</td>
<td>誤った前提の上に次の判断を積み上げ、後からまとめて崩れる</td>
</tr>
<tr>
<td>管制塔の指示が誤っていたら、全員へ訂正を配る</td>
<td>他の担当が誤った前提のまま作業を続ける</td>
</tr>
</tbody>
</table>
<h3 id="報告と実物がずれた実例">報告と実物がずれた実例</h3>
<p>実際に4本を回したとき、次のずれが起きました。悪意はなく、自分の手元しか見えていないことが原因です。</p>
<ul>
<li>「コミット8本」と報告されたが、実際は10本だった</li>
<li>「この不具合を直してほしい」と2回報告されたが、すでに直っていた（その担当の手元が古いままだった）</li>
<li>管制塔が「この変更で直るはず」と見立てたが、前提を1つ見落としていて外れた</li>
</ul>
<p>報告を受けたら、履歴と差分を自分で確認してから受け入れる。これが管制塔の中心的な仕事になります。</p>
<h3 id="並行数はレビュー能力だけでは決まらない">並行数は「レビュー能力」だけでは決まらない</h3>
<p>3〜4本という目安は、レビューが詰まる限界から来ています。実際にはもう1つ、環境側の上限があります。外部サービスの1日あたり呼び出し回数、テスト環境の容量、ビルドの同時実行数などです。4本が同時に検証を回すと、1本のときの4倍の速さで上限に達します。実例として、開発用の検証環境が1日の呼び出し上限に達し、<strong>4本すべてが半日止まりました。</strong> 並行を増やす前に、共有している資源の上限を1度確認してください。</p>
<h2 id="うまくいかないときの原因">うまくいかないときの原因</h2>
<p>並行運用で起きる失敗に絞って整理します。</p>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td>着手する前に止まる</td>
<td>コマンド実行が必要な作業を、裏で動かした</td>
<td>待ちながら動かす。または編集だけ任せ、コマンドは自分で実行する</td>
</tr>
<tr>
<td>並行させたのに遅い</td>
<td>順番が必要な作業を同時に動かした</td>
<td>「Aが終わらなくてもBを始められるか」で判定する</td>
</tr>
<tr>
<td>成果物は増えるが完了しない</td>
<td>投入を続けてレビューが詰まった</td>
<td>レビュー待ち3件で投入を止める</td>
</tr>
<tr>
<td>作った文書が、別の作業の記録に紛れ込んでいる</td>
<td>同じ作業フォルダで2つのセッションが動き、片方が変更を全部まとめて記録した</td>
<td>禁止リストで「全部まとめて記録」を止める。書く作業なら必ず作業場を分ける</td>
</tr>
<tr>
<td>記録したはずの変更が、目的のブランチに無い</td>
<td>別のセッションがブランチを切り替えた後だった。始めたときの表示は古くなる</td>
<td>記録の直前に現在地を毎回表示させる。作業場を分ければそもそも起きない</td>
</tr>
<tr>
<td>同じ失敗を2回した。ルールは書いてあった</td>
<td>禁止を文章で書いただけで、実行を止める仕組みが無かった</td>
<td>「なぜ」は CLAUDE.md、「何を禁止するか」は設定に分けて書く</td>
</tr>
<tr>
<td>統合の瞬間に競合が大量に出る</td>
<td>担当ファイルが重なっていた。または作業場を放置して古くした</td>
<td>割り当てを先に決める。1本統合するごとに残りへ最新を取り込む</td>
</tr>
<tr>
<td>全部の作業が同時に止まる</td>
<td>共有している資源（呼び出し上限・容量）が尽きた</td>
<td>並行を増やす前に上限を確認する。残りが少なくなったら全員へ節約を通達する</td>
</tr>
<tr>
<td>報告と実物が食い違う</td>
<td>子セッションは自分の手元しか見えていない</td>
<td>履歴と差分を自分で確認してから受け入れる</td>
</tr>
</tbody>
</table>
<h2 id="最初の1週間の進め方">最初の1週間の進め方</h2>
<p>いきなり並行させないことです。<strong>1件を最後まで通す経験がないと、詰まったときに原因が分かりません。</strong></p>
<table>
<thead>
<tr>
<th>日</th>
<th>やること</th>
</tr>
</thead>
<tbody>
<tr>
<td>1〜2日目</td>
<td>CLAUDE.md を置く（最小構成でよい）。1件だけ任せてみる</td>
</tr>
<tr>
<td>3〜4日目</td>
<td>分解を頼み、依存関係を出させる。2件を並行させる</td>
</tr>
<tr>
<td>5〜6日目</td>
<td>4件まで増やす。レビュー待ちを数え、詰まる感覚をつかむ</td>
</tr>
<tr>
<td>7日目</td>
<td>繰り返した作業を、スキル（手順書）として固定する</td>
</tr>
</tbody>
</table>
<p>並行は3日目以降、スキル化は7日目でよい、という目安です。</p>
<h2 id="チェックリスト">チェックリスト</h2>
<p><strong>並行させるとき</strong></p>
<ul>
<li>このセッションはファイルを書くか。書くなら作業場を分けたか（「調べるだけ」でも成果物は生まれる）</li>
<li>「変更を全部まとめて記録する」操作を禁止リストに入れたか</li>
<li>その禁止が実際に効くかを1回試して確かめたか（設定に書いただけでは確認になっていない）</li>
<li>元のフォルダは管制塔専用にして、そこで作業していないか</li>
<li>レビュー待ちは3件以下か</li>
</ul>
<p><strong>レビューのとき</strong></p>
<ul>
<li>完了条件を1つずつ照合したか</li>
<li>機密の混入を検索で確認したか</li>
<li>直すなら、どこを・なぜ・どう直すかを指定したか</li>
<li>かかった時間を記録したか</li>
</ul>
<h2 id="補足-自分でコマンドを打って並行させる">補足　自分でコマンドを打って並行させる</h2>
<p>ここまでの自動化は、メインセッションが次の手順を代わりに実行しているだけです。うまく動かないときに中身を確かめられるよう、手動の手順を残します。</p>
<pre class="bash"><code># 1. 作業場を作る（main から feature-a という枝を切って、隣に新しいフォルダを作る）
git worktree add ../myproject-feature-a -b feature-a

# 2. その作業場へ移動して、子セッションを起動する
cd ../myproject-feature-a
claude

# 3. 統合する（管制塔のフォルダに戻ってから）
cd ../myproject
git merge feature-a

# 4. 片づける（統合が終わったら作業場と枝を消す）
git worktree remove ../myproject-feature-a
git branch -d feature-a</code></pre>
<p>注意したいのは、<strong>競合を防ぐのは worktree ではなく「割り当て」</strong>だということです。worktree はフォルダを分けるだけで、統合するときの競合は防ぎません。2つの作業場が同じファイルの同じ行を直していれば、マージで必ずぶつかります。子セッションの最初の指示には、触ってよいファイルと触ってはいけないファイルを明示してください。</p>
<pre><code>この作業場（feature-contact-form）で、問い合わせフォームを実装してください。

【触ってよいファイル】
- src/forms/contact.py（新規作成）
- src/forms/__init__.py（1行の追記のみ）
- tests/test_contact.py（新規作成）

【触ってはいけないファイル】
- src/main.py     … 別の作業場が触っています
- config.json     … 管制塔が管理しています
必要になった場合は、自分で編集せず「こう変えたい」と報告してください。

【完了条件】
- テストが通ること
- 上記3ファイル以外に変更が無いこと（git status で確認する）

【完了したら】
1. コミットまで行う（push はしない）
2. 変更したファイルの一覧を報告する
3. 私（管制塔）に伝えるべき点があれば書く</code></pre>
<p>子セッションどうしは会話させません。情報は必ず管制塔を経由させます。直接やり取りさせると、何が決まったのかを管制塔が把握できなくなります。</p>
<h2 id="まとめ">まとめ</h2>
<ul>
<li>同時に走らせる前に、起動方式を選ぶ。決め手は「途中で会話が必要か」。迷ったらサブエージェントから始める</li>
<li>実装を並行させるなら、worktree で作業場を分け、<strong>ファイルを1つでも書くなら分ける</strong></li>
<li>準備は3つ。許可リストを整え、<strong>禁止リストで「全部まとめて記録」を止め</strong>、並行のルールを CLAUDE.md に書く</li>
<li>「なぜ」は CLAUDE.md に、「何を禁止するか」は設定に書く。文章のルールだけでは止まらない</li>
<li>速くなるかどうかは、投入数ではなく片づける速さで決まる。レビュー待ち3件で投入を止める</li>
<li>報告は鵜呑みにしない。履歴と差分を自分で確かめる</li>
</ul>
<p>最初から4本を回す必要はありません。1件を最後まで通し、次に2件を並行させ、禁止リストが実際に効くことを1回試す。ここまで通せば、並行運用の土台はできています。</p>
<p>この記事の進め方を、自分のプロジェクトに合わせて組み立てたい場合は、1on1のトレーニングで一緒に設定しながら進めることもできます。作業場の分け方や禁止リストの入れ方は、実際のリポジトリを見ながらのほうが早く決まります。</p>
<p>内容を知りたい方は<a href="/training/">AI開発トレーニング</a>のページをご覧ください。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>最初の1件を任せるまで｜AIに開発を任せる入門の手順</title>
		<link>https://creativecontentlabtokyo.com/ai-delegation-first-step/</link>
		
		<dc:creator><![CDATA[セールスフォース標準化推進ラボ]]></dc:creator>
		<pubDate>Sat, 31 Oct 2026 06:35:19 +0000</pubDate>
				<category><![CDATA[AI駆動開発]]></category>
		<category><![CDATA[デリバリーメソッド]]></category>
		<category><![CDATA[AIエージェント]]></category>
		<category><![CDATA[入門]]></category>
		<category><![CDATA[業務効率化]]></category>
		<category><![CDATA[生成AI]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/ai-delegation-first-step/</guid>

					<description><![CDATA[AIに仕事を任せたいのに、何から始めればいいか分からない。画面の見方、毎回の説明を省くファイルの置き方、最初の1件の頼み方まで、非エンジニア向けに順を追って解説します。]]></description>
										<content:encoded><![CDATA[<p>AIに仕事を任せるツールを入れてみた。黒い画面が開いた。それで、何を打てばいいのか分からない。</p>
<p>あるいは、試しに「議事録をまとめておいて」と頼んでみたものの、返ってきたものを読み直すうちに「これなら自分でやったほうが早い」と感じた。</p>
<p>どちらも、<strong>ツールの使い方ではなく、最初の1件の選び方と頼み方</strong>でつまずいています。この記事では、画面の見方から、最初の1件を最後まで通すところまでを、順に説明します。</p>
<h2 id="そもそもaiに開発を任せるとは">そもそも「AIに開発を任せる」とは</h2>
<p>ここでいう「任せる」は、質問して答えをもらうこととは違います。<strong>作業そのものを頼む</strong>ことです。</p>
<p>たとえば「打合せの書き起こしを議事録に整えて、決まった場所にファイルとして保存して」と頼む。AIは書き起こしを読み、文書を作り、ファイルとして置くところまで進めます。あなたは、できあがったものを確認して受け取ります。</p>
<p>この記事で使うのは Claude Code というツールです。ターミナル（文字を打って操作する黒い画面）の中で動きます。名前は難しく見えますが、覚える登場人物は4つだけです。これを取り違えると「なぜ動かないのか」が分からなくなります。</p>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th>登場人物</th>
<th>役割</th>
<th>たとえ</th>
</tr>
</thead>
<tbody>
<tr>
<td>メインセッション</td>
<td>あなたが直接話している相手。仕事を分解し、割り振り、結果を受け取る</td>
<td>管制塔。自分では作業しない</td>
</tr>
<tr>
<td>サブエージェント</td>
<td>切り出された仕事を、独立した会話として実行する</td>
<td>作業者。同時に何人も動かせる</td>
</tr>
<tr>
<td>CLAUDE.md</td>
<td>毎回自動で読み込まれる前提・ルールを書いたファイル</td>
<td>就業規則。書けば毎回守られる</td>
</tr>
<tr>
<td>スキル</td>
<td>特定の作業手順をまとめたファイル。呼び出したときだけ読まれる</td>
<td>作業手順書</td>
</tr>
</tbody>
</table>
<p>最初のうちは、<strong>「話し相手がいて、毎回読まれるルール帳（CLAUDE.md）と、必要なときだけ開く手順書（スキル）がある」</strong>と捉えれば十分です。サブエージェントは、最初の1件では使わなくても構いません。</p>
<h2 id="用意するもの">用意するもの</h2>
<p>始める前に、次の3つを手元に置いてください。「無いとどうなるか」も書いておきます。</p>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th>用意するもの</th>
<th>内容</th>
<th>無いとどうなるか</th>
</tr>
</thead>
<tbody>
<tr>
<td>作業用のフォルダ</td>
<td>AIに作業させる場所。ふだん資料を置いているフォルダでよい</td>
<td>AIがどこで作業すべきか分からず、思わぬ場所にファイルが作られる</td>
</tr>
<tr>
<td>任せる題材1件</td>
<td>今日やる予定の作業から1つ。入力になる資料があるもの</td>
<td>何を頼むかを考える時間だけが増え、手が止まる</td>
</tr>
<tr>
<td>入力になる資料</td>
<td>書き起こしのテキスト、元データなど</td>
<td>AIが推測で補うので、内容があてにならなくなる</td>
</tr>
</tbody>
</table>
<p>なお、Claude Code のインストールは済んでいる前提で進めます。</p>
<h2 id="手順">手順</h2>
<h3 id="ステップ1-作業フォルダで起動し画面の見方をつかむ">ステップ1　作業フォルダで起動し、画面の見方をつかむ</h3>
<p>作業したいフォルダへ移動して <code>claude</code> と打つと始まります。</p>
<pre><code>cd C:Users自分の名前Documentsmyproject
claude</code></pre>
<p><strong>なぜそうするか</strong>　AIは、起動したフォルダの中を作業場として扱います。どのフォルダで始めるかが、そのまま作業範囲になります。</p>
<p>画面は、上から順に「入力 → 作業ログ → 返答 → 次の入力」と流れていきます。覚える操作は、まず次の6つだけです。</p>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th>操作</th>
<th>できること</th>
<th>使う場面</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>/</code></td>
<td>コマンドの一覧が出る</td>
<td>まず打ってみると、何ができるか分かる</td>
</tr>
<tr>
<td><code>@</code></td>
<td>ファイル名を指定できる（補完が出る）</td>
<td>「<span class="citation" data-cites="docs/raw.txt">@docs/raw.txt</span> を読んで」のように、対象を正確に伝える</td>
</tr>
<tr>
<td>Esc</td>
<td>実行中の作業を止める</td>
<td>意図と違う方向へ進んでいると気づいたとき。すぐ押してよい</td>
</tr>
<tr>
<td>Shift+Tab</td>
<td>モードを切り替える</td>
<td>「まず計画だけ立てさせる」モードにしたいとき</td>
</tr>
<tr>
<td>上矢印</td>
<td>前に入力した内容を呼び出す</td>
<td>少しだけ直して投げ直したいとき</td>
</tr>
<tr>
<td>Ctrl+C を2回</td>
<td>終了する</td>
<td>作業を終えるとき</td>
</tr>
</tbody>
</table>
<p>最初のうち、いちばん役に立つのは <strong>Esc キー</strong>です。「違う方向に進んでいる」と感じたら、最後まで待たずに止めてください。途中で止めても壊れません。そのまま「いまのは違います。◯◯してください」と伝えれば軌道修正できます。</p>
<p>あわせて、次のコマンドを知っておくと安心です。</p>
<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<thead>
<tr>
<th>コマンド</th>
<th>働き</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>/help</code></td>
<td>使い方の一覧を出す</td>
</tr>
<tr>
<td><code>/clear</code></td>
<td>会話をリセットする（話が長くなって噛み合わなくなったとき）</td>
</tr>
<tr>
<td><code>/model</code></td>
<td>使うモデルを切り替える（速さ重視・品質重視の使い分け）</td>
</tr>
<tr>
<td><code>/config</code></td>
<td>各種設定を変える</td>
</tr>
</tbody>
</table>
<h3 id="ステップ2-ファイル変更の確認は慣れるまで毎回はいで見る">ステップ2　ファイル変更の確認は、慣れるまで毎回「はい」で見る</h3>
<p>AIがファイルを書き換えたりコマンドを実行したりするとき、実行してよいかを確認してきます。内容を見て、許可するかを選びます。</p>
<p><strong>なぜそうするか</strong>　「今後は確認しない」を選ぶと速くなりますが、何をされたか把握できなくなります。最初の1週間は都度確認して、AIが何をしているかを見ておくことをおすすめします。</p>
<p>なお、確認の文言や選択肢はバージョンによって変わります。選び方の考え方だけ押さえてください。</p>
<h3 id="ステップ3-claude.md-を置く">ステップ3　CLAUDE.md を置く</h3>
<p>CLAUDE.md は、作業フォルダの直下に置くテキストファイルです。毎回のセッションで自動的に読み込まれます。「毎回同じ説明をしている」と感じたら、それは CLAUDE.md に書くべき内容です。</p>
<p>最初は、次の最小構成をコピーして、作業フォルダに <code>CLAUDE.md</code> という名前で保存してください。</p>
<pre><code># プロジェクトのルール

## このプロジェクトについて
- 目的: （何を作っているか / 何のための作業場か を1〜2行）
- 使う技術: （例: Python / Excel 生成 / WordPress など）

## 作業の進め方
- 日本語で回答する
- コードのコメントも日本語で書く
- 大きな作業は、着手前に手順を提示して確認を取る
- ファイルを編集する前に、必ず現状を確認する
- 勝手にファイルを削除しない

## 出力のルール
- 作成・更新したファイルは、必ず絶対パス（フルパス）で示す
- 成果物は次の場所に置く
  - 計画・手順書 -&gt; plans/
  - 資料・ドキュメント -&gt; docs/
  - 作業メモ -&gt; tasks/

## 禁止事項
- パスワード・APIキー・顧客名を、共有するファイルに書かない
- 確認なしに外部へ送信しない（メール・API・アップロード）</code></pre>
<p>「目的」と「使う技術」の2行だけ、自分の言葉に書き換えれば使えます。</p>
<p><strong>なぜそうするか</strong>　AIは会話が変わると、前の指示を覚えていません。毎回読ませたいルールをファイルにしておけば、同じ説明を繰り返さずに済みます。</p>
<p>書くべきかの見分け方は、<strong>「2回以上、同じ指示をしたものは書く」</strong>です。逆に、その日限りの指示は書かないでください。ファイルが膨らむと、読まれる密度が下がります。</p>
<p>置き場所は3段階あり、下の階層ほど優先されます。</p>
<table>
<thead>
<tr>
<th>置き場所</th>
<th>効く範囲</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>C:Users自分の名前.claudeCLAUDE.md</code></td>
<td>すべてのプロジェクト共通</td>
</tr>
<tr>
<td><code>作業フォルダ/CLAUDE.md</code></td>
<td>そのプロジェクト全体</td>
</tr>
<tr>
<td><code>作業フォルダ/src/CLAUDE.md</code></td>
<td>そのフォルダ配下だけ</td>
</tr>
</tbody>
</table>
<p>最初は、真ん中の「作業フォルダ直下」だけで十分です。</p>
<h3 id="ステップ4-スキルは23回やってから作る">ステップ4　スキルは、2〜3回やってから作る</h3>
<p>スキルは、特定の作業手順をまとめたファイルです。毎回ゼロから指示を書くと、指示を書く時間そのものが負担になります。繰り返す作業はスキルにしておくと、手順と書式が固定され、出来のばらつきが消えます。</p>
<p>ただし、<strong>最初の1件では作りません。</strong></p>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th>状況</th>
<th>作るもの</th>
<th>理由</th>
</tr>
</thead>
<tbody>
<tr>
<td>同じ成果物を何度も作る（議事録・報告書・見積）</td>
<td>スキル</td>
<td>手順と書式を固定すると、品質のばらつきが消える</td>
</tr>
<tr>
<td>同じ役割を何度も頼む（調査・レビュー・実装）</td>
<td>エージェント</td>
<td>毎回「あなたは調査担当です」から書かずに済む</td>
</tr>
<tr>
<td>まだ何も繰り返していない</td>
<td>どちらも作らない</td>
<td>2〜3回やってみて、型が見えてから作る</td>
</tr>
</tbody>
</table>
<p><strong>なぜそうするか</strong>　はじめから完璧なスキルを作ろうとすると、使わないものができます。2〜3回同じ作業をやって手順が固まってから、ファイルにしてください。そのとき「前回の指示をそのまま貼る」だけで、ほぼ完成します。</p>
<p>作るときも、自分で書く必要はありません。AIに作ってもらうのがいちばん早い方法です。たとえば、次のように頼みます。</p>
<pre><code>いま行った作業を、次回から使い回せるようにスキルにしてください。

対象の作業: （例）打合せの書き起こしから議事録を作る作業

作ってほしいもの:
- スキルのファイル（SKILL.md）を作る
- 先頭の description には、私が実際に打ちそうな言い回しを入れる
  （例:「議事録を作って」「打合せメモをまとめて」）
- 手順・守ること・完了報告の形を書く
- 今回の作業で私が指摘した点は、すべて「守ること」に反映する

作る前に、内容の要点を箇条書きで見せてください。
私が確認してからファイルにしてください。</code></pre>
<p>スキルは <code>C:Users自分の名前.claudeskills名前SKILL.md</code> に置きます。先頭の <code>description</code>（いつ使うかの説明）が曖昧だと、作っても呼ばれません。「議事録を作って」のように、自分が実際に打ちそうな言い回しを入れておくのがコツです。</p>
<p>名前の末尾で種類が分かるようにしておくと、後で整理しやすくなります（スキルは <code>-skill</code>、エージェントは <code>-agent</code>）。数が増えてから直すのは手間なので、1つ目を作るときから付けてください。</p>
<h3 id="ステップ5-最初の1件を5つの要素をそろえて頼む">ステップ5　最初の1件を、5つの要素をそろえて頼む</h3>
<p>いきなり並行させないでください。<strong>1件を最後まで通すのが最短です。</strong></p>
<p>今日やる予定の作業から1件だけ選び、次のテンプレートに当てはめて投げます。</p>
<pre><code>次の作業を任せてください。

【目的】
9月10日の打合せ議事録を、社内共有できる形に整える

【入力】
docs/meeting/2026-09-10-raw.txt（音声書き起こしの生データ）

【成果物】
docs/meeting/2026-09-10.md を1つ作る
 - 見出し構成: 決定事項 / 宿題（担当・期限つき） / 議論の要点 / 次回予定
 - 決定事項は箇条書きで、1項目1行

【制約】
- 発言者の個人名は「営業担当」「開発担当」のように役割名へ置き換える
- 推測で内容を補わない。不明な箇所は「（聞き取り不明）」と書く

【完了条件】
- 上のファイルが作成されている
- 宿題がすべて「担当」と「期限」を持っている

【完了報告に書くこと】
- 作成したファイルの絶対パス
- 判断に迷った箇所（あれば）
- 私が確認すべき点</code></pre>
<p><strong>なぜそうするか</strong>　5つの要素は、どれも「書かないと後で自分が困る」ものです。</p>
<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<thead>
<tr>
<th>要素</th>
<th>書かないとどうなるか</th>
</tr>
</thead>
<tbody>
<tr>
<td>目的</td>
<td>手段が目的化し、頼んでいないものが返る</td>
</tr>
<tr>
<td>成果物の形</td>
<td>粒度がばらつき、他の結果と並べられない</td>
</tr>
<tr>
<td>制約</td>
<td>機密の混入や規約違反を、後から手直しすることになる</td>
</tr>
<tr>
<td>完了条件</td>
<td>「終わったのか」を自分で考える羽目になり、レビューが重くなる</td>
</tr>
<tr>
<td>完了報告の形</td>
<td>報告を読み解く時間が増える</td>
</tr>
</tbody>
</table>
<p>返ってきたら、完了条件に照らして確認します。<strong>レビューに何分かかったかを計っておく</strong>と、次から見積もれるようになります。</p>
<h2 id="任せてはいけないこと最初の1件に限って">任せてはいけないこと（最初の1件に限って）</h2>
<p>何を任せ、何を任せないかの全体像は、<a href="https://creativecontentlabtokyo.com/ai-delegation-what-to-delegate/">AIに何を任せ、何を任せないか</a>で詳しく扱います。ここでは、最初の1件で避けたいことに絞ります。</p>
<ol type="1">
<li><strong>「議事録をまとめておいて」だけで頼まない。</strong> 返ってきたものを読み直すところから始まり、レビューが「自分でやり直す」のと変わらなくなります。ステップ5の5つの要素をそろえてください。</li>
<li><strong>最初から複数件を同時に走らせない。</strong> まず1件を最後まで通して、頼み方とレビューの重さをつかんでからにします。</li>
<li><strong>顧客・社外へのやり取りや、成果物の最終的な受け入れ判断は任せない。</strong> 下書きまではAIに任せても、送る・受け入れるの判断は自分で行います。</li>
</ol>
<h2 id="うまくいかないときの原因">うまくいかないときの原因</h2>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td>頼んでいないものまで作られる</td>
<td>目的が書かれていない。手段が目的化している</td>
<td>「目的」を1行足して頼み直す</td>
</tr>
<tr>
<td>出来が毎回ばらつく</td>
<td>成果物の形（見出し・粒度）を指定していない</td>
<td>「成果物」に見出し構成を書く。同じ作業が2〜3回続いたらスキルにする</td>
</tr>
<tr>
<td>同じ説明を毎回している</td>
<td>CLAUDE.md に書いていない</td>
<td>2回以上した指示を CLAUDE.md に足す</td>
</tr>
<tr>
<td>作ったスキルが呼ばれない</td>
<td><code>description</code> が曖昧</td>
<td>自分が実際に打つ言い回しを <code>description</code> に入れる</td>
</tr>
<tr>
<td>意図と違う方向に進んでいる</td>
<td>指示が伝わっていない</td>
<td>Esc で止めて「いまのは違います。◯◯してください」と伝える</td>
</tr>
<tr>
<td>話が長くなって噛み合わない</td>
<td>会話が長くなりすぎた</td>
<td><code>/clear</code> で会話をリセットして、要点だけ伝え直す</td>
</tr>
<tr>
<td>何をされたか分からなくなった</td>
<td>確認を省略する設定にしている</td>
<td>慣れるまでは都度「はい」で内容を見る</td>
</tr>
</tbody>
</table>
<h2 id="まとめ">まとめ</h2>
<p>最初の1件を任せるまでに、やることは4つです。</p>
<ol type="1">
<li>作業フォルダで <code>claude</code> を起動し、Esc で止められることを知っておく</li>
<li>最初の1週間は、ファイル変更の確認を都度見る</li>
<li>毎回の説明を、CLAUDE.md に書く</li>
<li>目的・入力・成果物・制約・完了条件・報告の形をそろえて、1件だけ頼む</li>
</ol>
<p>スキルやエージェントは、同じ作業を2〜3回やってからで間に合います。先に仕組みを作り込むより、1件を通してレビューにかかる時間を知るほうが、次の一歩が見えます。</p>
<p>自分の仕事に当てはめて進めたいときは、1on1で伴走するAI開発トレーニングもあります。どの作業から任せるか、頼み方をどう型にするかを、実際の題材で一緒に整理します。</p>
<p>内容を知りたい方は<a href="/training/">AI開発トレーニング</a>のページをご覧ください。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AIに何を任せ、何を任せないか｜やり直しが効くかで決める判断基準</title>
		<link>https://creativecontentlabtokyo.com/ai-delegation-what-to-delegate/</link>
		
		<dc:creator><![CDATA[セールスフォース標準化推進ラボ]]></dc:creator>
		<pubDate>Sat, 31 Oct 2026 06:35:16 +0000</pubDate>
				<category><![CDATA[AI駆動開発]]></category>
		<category><![CDATA[デリバリーメソッド]]></category>
		<category><![CDATA[AIエージェント]]></category>
		<category><![CDATA[タスク管理]]></category>
		<category><![CDATA[業務効率化]]></category>
		<category><![CDATA[生成AI]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/ai-delegation-what-to-delegate/</guid>

					<description><![CDATA[AIに仕事を任せたいが、どこまで任せてよいか分からない。難しさではなく「間違えたときにやり直しが効くか」で線を引く判断基準と、任せてはいけない3つの仕事、うまくいかないときの原因を整理します。]]></description>
										<content:encoded><![CDATA[<p>AIに任せられることは増えた。けれど、<strong>どこまで任せてよいのか</strong>の線が引けない。任せすぎて顧客に出す前の文面まで勝手に進んでしまったり、慎重になりすぎて結局ほとんど自分で書いていたりする。</p>
<p>線を引けないのは、判断の軸が「難しいかどうか」になっているからです。軸を変えると、迷いはかなり減ります。この記事では、AIに任せる仕事の範囲を決める基準と、<strong>任せてはいけない仕事</strong>を整理します。</p>
<h2 id="そもそもaiに仕事を任せるとは">そもそも「AIに仕事を任せる」とは</h2>
<p>ここで言う「任せる」は、質問して答えをもらうことではありません。<strong>目的と完了条件を伝え、調査・下書き・実装・テストといった一連の作業をAIに進めてもらい、返ってきた結果を人が受け取る</strong>ことです。</p>
<p>質問と違い、任せた仕事は人の見ていないところで進みます。だからこそ、<strong>何を渡すか</strong>より先に<strong>何を渡さないか</strong>を決めておく必要があります。</p>
<p>判断の境界は「難しさ」ではありません。<strong>間違えたときに、やり直しが効くかどうか</strong>です。難しい実装は任せてかまいません。間違えてもテストで気づき、直せるからです。一方、簡単でも顧客へのメールは任せません。送ってしまえば取り消せないからです。</p>
<h2 id="用意するもの入力">用意するもの（入力）</h2>
<p>任せる前に、次の4つを手元に揃えます。無いまま任せると、右の列のことが起きます。</p>
<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<thead>
<tr>
<th>用意するもの</th>
<th>無いとどうなるか</th>
</tr>
</thead>
<tbody>
<tr>
<td>目的（何のためにやるのか）1行</td>
<td>頼んでいないものが返ってくる。手段だけを指示すると、手段どおりの成果物が返り、目的は外れる</td>
</tr>
<tr>
<td>成果物（何が出来上がればよいか）</td>
<td>返ってきたものが「完成」なのか「途中」なのか分からない</td>
</tr>
<tr>
<td>完了条件（どうなれば終わりか）</td>
<td>作業が終わらない。レビューも終わらない</td>
</tr>
<tr>
<td>確かめ方（読めば分かる、テストが通れば分かる、見本と比べられる）</td>
<td>結果の良し悪しを自分で判断できず、任せた仕事が「信じるしかない結果」になる</td>
</tr>
</tbody>
</table>
<p>指示には、目的・成果物・制約・完了条件・報告形式の5つを書くと抜けが出ません。特に<strong>確かめ方</strong>は、後述の「任せてはいけない仕事」の線引きに直結します。</p>
<h2 id="手順">手順</h2>
<p>判断は3つの問いに答えるだけです。上から順に当てはめます。</p>
<p><strong>ステップ1　間違えたとき、やり直しが効くか確認する</strong> なぜ最初に問うか：取り消せないものは、後からの確認では間に合わないからです。送信済みのメール、顧客への発言、承認は取り消せません。「いいえ」なら自分でやります。</p>
<p><strong>ステップ2　返ってきた結果を、自分で確かめられるか確認する</strong> なぜ次に問うか：確かめられない結果は、受け取った時点で品質が分からないからです。読めば分かる、テストが通れば分かる、のどちらかが成り立つなら任せられます。成り立たないなら、先に確かめ方（受け入れ基準・テスト・見本）を作ります。<strong>それができるまでは任せません。</strong></p>
<p><strong>ステップ3　コマンド実行が必要かで、動かし方を決める</strong> なぜ最後に問うか：任せるかどうかではなく、任せ方の問題だからです。gitやテスト実行、インストールなどコマンドの実行が必要な作業は、待ちながら動かします（前景）。実行が要らない調査や下書きは、裏で動かします（バックグラウンド）。</p>
<p><strong>ステップ4　複数を同時に任せるなら、順番が必要な仕事を見分ける</strong> なぜ確認するか：同時に走らせても、前の結果を待つ仕事は速くならず、衝突するからです。判定は「Aが終わっていなくてもBを始められるか」と問うだけです。始められないなら、順番が必要です。</p>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th></th>
<th>例</th>
<th>理由</th>
</tr>
</thead>
<tbody>
<tr>
<td>並行できる</td>
<td>無関係な複数テーマの調査／別々のファイルの実装／資料・実装・テストの同時読み込み</td>
<td>互いに影響しない</td>
</tr>
<tr>
<td>順番が必要</td>
<td>データ構造の変更から実装へ／公開から動作確認、検証へ／同じファイルを2人が編集</td>
<td>前の結果が次の入力になる。同時にやると衝突する</td>
</tr>
</tbody>
</table>
<p>並行して走らせるときの設定や事故の防ぎ方は、<a href="https://creativecontentlabtokyo.com/ai-parallel-development/">複数を同時に走らせる方法</a>で扱います。</p>
<p>任せてよい仕事の典型は次のとおりです。</p>
<ul>
<li>調査・比較検討</li>
<li>文書やコードの下書き</li>
<li>実装・修正</li>
<li>テスト作成</li>
<li>形式変換・一括置換</li>
<li>図表・スライドの生成</li>
<li>既存コードから仕様書を起こす</li>
</ul>
<h2 id="任せてはいけないこと">任せてはいけないこと</h2>
<p>ここがこの記事の中心です。任せてはいけない仕事は、突き詰めると<strong>3つ</strong>に絞れます。</p>
<h3 id="取り消せないことの実行">1. 取り消せないことの実行</h3>
<p>顧客・上長とのやり取り、見積の対外提示、契約・料金に関わる判断。</p>
<p>これらは「下書きまで」は任せられますが、<strong>出す行為と、出してよいという判断は人が持ちます</strong>。AIの文章が整っているほど、確認せずに出したくなる誘惑が強くなる点に注意が必要です。簡単な仕事に見えても、ステップ1で「いいえ」になります。</p>
<h3 id="受け入れ優先順位最終決定">2. 受け入れ・優先順位・最終決定</h3>
<p>成果物を受け入れるかどうか、何を先にやるか、設計をどう決めるか。</p>
<p>AIは材料と選択肢を出せますが、<strong>何を優先し、どれで行くかは、結果の責任を負う人が決めること</strong>です。ここを任せると、仕事は進んでいるのに、誰も決めていないまま積み上がります。受け入れの判断を飛ばして次を投入し続けると、レビュー待ちが詰まり、成果物は増えるのに完了しない状態になります。</p>
<h3 id="確かめ方がない仕事">3. 確かめ方がない仕事</h3>
<p>読んでも判断できず、テストも見本もない仕事。</p>
<p>難しさや重要度とは関係なく、<strong>確かめられない仕事は任せられない仕事</strong>として扱います。任せるなら、先に受け入れ基準・テスト・見本のどれかを用意します。用意できたなら、その仕事は「条件つきで任せられる」に変わります。</p>
<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<thead>
<tr>
<th>判定</th>
<th>具体例</th>
</tr>
</thead>
<tbody>
<tr>
<td>任せる</td>
<td>調査・比較検討／下書き／実装・修正／テスト作成／形式変換・一括置換／図表・スライド生成／既存コードから仕様書を起こす</td>
</tr>
<tr>
<td>任せない</td>
<td>顧客・上長とのやり取り／成果物の受け入れ判断／優先順位づけ／設計の最終決定／見積の対外提示／契約・料金に関わる判断</td>
</tr>
<tr>
<td>条件つき</td>
<td>確かめ方を先に用意できれば任せてよい。用意できないうちは「任せられない仕事」として扱う</td>
</tr>
</tbody>
</table>
<h2 id="うまくいかないときの原因">うまくいかないときの原因</h2>
<p>任せてうまくいかないときの多くは、AIの能力ではなく、<strong>渡し方か線の引き方</strong>に原因があります。</p>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td>着手する前に止まる</td>
<td>コマンド実行が必要な作業を、裏で動かした</td>
<td>待ちながら動かすか、編集だけ任せてコマンドは自分で実行する</td>
</tr>
<tr>
<td>レビューが終わらない</td>
<td>完了条件を指示していない</td>
<td>指示の5要素（目的・成果物・制約・完了条件・報告形式）を書く</td>
</tr>
<tr>
<td>並行させたのに遅い</td>
<td>順番が必要な作業を同時に動かした</td>
<td>「Aが終わらなくてもBを始められるか」で判定する</td>
</tr>
<tr>
<td>成果物は増えるが完了しない</td>
<td>投入を続けてレビューが詰まった</td>
<td>レビュー待ち3件で投入を止める</td>
</tr>
<tr>
<td>頼んでいないものが返る</td>
<td>目的を書かず、手段だけを指示した</td>
<td>「何のためにやるのか」を1行足す</td>
</tr>
<tr>
<td>毎回同じ説明をしている</td>
<td>ルールが CLAUDE.md に書かれていない</td>
<td>2回言ったことは CLAUDE.md に書く</td>
</tr>
<tr>
<td>作ったスキルが呼ばれない</td>
<td><code>description</code> が抽象的すぎる</td>
<td>自分が実際に打ちそうな言い回しを description に入れる</td>
</tr>
<tr>
<td>同じ作業が何日も先送りされる</td>
<td>1件が大きすぎる／集中力が要る作業を疲れた時間に置いた</td>
<td>30分で着手できる単位に割る。重い作業は頭が動く時間帯へ</td>
</tr>
</tbody>
</table>
<h2 id="まとめ">まとめ</h2>
<ul>
<li>判断の軸は難しさではなく、<strong>間違えたときにやり直しが効くか</strong></li>
<li>任せる前に、<strong>自分で確かめられるか</strong>を確認する。確かめ方が無ければ、先に作る</li>
<li>任せてはいけないのは、<strong>取り消せないことの実行／受け入れ・優先順位・最終決定／確かめ方がない仕事</strong>の3つ</li>
<li>うまくいかないときは、能力ではなく渡し方と線の引き方を見直す</li>
</ul>
<p>線の引き方は、実際に1件任せて、返ってきたものを受け取ってみると体感でつかめます。自分の仕事のどこに線を引くか、どの確かめ方を先に用意するかは、仕事の中身によって変わります。1on1のAI開発トレーニングでは、あなたの実際の業務を題材に、この線引きを一緒に整理しています。</p>
<p>内容を知りたい方は<a href="/training/">AI開発トレーニング</a>のページをご覧ください。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>システム設計書のテンプレート一覧｜基本設計・詳細設計の成果物とExcelサンプル</title>
		<link>https://creativecontentlabtokyo.com/system-design-document-template-list/</link>
		
		<dc:creator><![CDATA[セールスフォース標準化推進ラボ]]></dc:creator>
		<pubDate>Wed, 09 Sep 2026 08:46:14 +0000</pubDate>
				<category><![CDATA[AI駆動開発]]></category>
		<category><![CDATA[デリバリーメソッド]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/system-design-document-template-list/</guid>

					<description><![CDATA[設計工程で作る成果物を、画面・帳票・データモデル・処理・外部連携の種類別に一覧化しました。設計書と定義書と仕様書の違い、一覧と設計書の作る順序、Excelテンプレートの入手先までまとめています。]]></description>
										<content:encoded><![CDATA[<p>「基本設計書を作っておいて」と言われて、まず手が止まる。何を、何冊、どの順で作ればいいのかが決まっていないからです。</p>
<p>しかも呼び方が現場ごとに違います。同じものを画面設計書と呼ぶ会社もあれば、画面定義書、画面仕様書と呼ぶ会社もある。前の現場の言葉が通じません。</p>
<p>この記事では、設計工程で作る成果物を<strong>種類別に並べ、それぞれのExcelテンプレートへの入口をまとめました</strong>。どれから手をつけるかの順序もあわせて示します。</p>
<h2 id="設計工程の成果物は一覧と設計書の2階建てになっている">設計工程の成果物は「一覧」と「設計書」の2階建てになっている</h2>
<p>最初に、全体の構造を押さえておきます。設計工程の成果物は、ほぼ例外なく2階建てです。</p>
<table>
<thead>
<tr>
<th>対象</th>
<th>1階：一覧（数と粒度を決める）</th>
<th>2階：設計書（中身を決める）</th>
</tr>
</thead>
<tbody>
<tr>
<td>画面</td>
<td>画面一覧</td>
<td>画面定義書</td>
</tr>
<tr>
<td>帳票</td>
<td>帳票一覧</td>
<td>帳票設計書</td>
</tr>
<tr>
<td>バッチ処理</td>
<td>バッチ処理一覧</td>
<td>バッチ処理設計書</td>
</tr>
<tr>
<td>外部連携</td>
<td>外部インタフェース一覧</td>
<td>外部インタフェース設計書</td>
</tr>
<tr>
<td>プログラム</td>
<td>プログラム一覧</td>
<td>各処理の設計書</td>
</tr>
</tbody>
</table>
<p><strong>一覧で「いくつあるか」を確定させ、設計書で「中身をどうするか」を決めます。</strong></p>
<p>この順序を逆にすると破綻します。画面定義書を先に書き始めると、書いている途中で「この画面、隣のチームが作っている画面と同じでは」という話が出ます。画面IDが採番されていないので、どちらを残すかの判断もできません。手戻りは設計書1冊まるごとになります。</p>
<p>一覧が先である理由はもう1つあります。<strong>見積もりと進捗管理が一覧の行数を単位にしている</strong>からです。画面が38本あると分かって初めて、工数も進捗率も出せます。設計書から書き始めると、終わりが見えないまま進むことになります。</p>
<h2 id="設計書定義書仕様書はほぼ同じものを指している">設計書・定義書・仕様書は、ほぼ同じものを指している</h2>
<p>呼称の違いは、内容の違いではありません。会社と時代の違いです。</p>
<table>
<thead>
<tr>
<th>呼び方</th>
<th>使われ方</th>
</tr>
</thead>
<tbody>
<tr>
<td>〜設計書</td>
<td>最も一般的。「どう作るか」を書いたもの</td>
</tr>
<tr>
<td>〜定義書</td>
<td>項目や値の定義が中心のときに使われやすい</td>
</tr>
<tr>
<td>〜仕様書</td>
<td>発注側・受入側の視点が入るときに使われやすい</td>
</tr>
</tbody>
</table>
<p>厳密に使い分けている現場もありますが、<strong>多くの現場では同じものを違う名前で呼んでいるだけ</strong>です。テンプレートを探すときは、3つとも試してください。</p>
<p>工程の呼び方も同じです。</p>
<table>
<thead>
<tr>
<th>呼び方</th>
<th>同じ意味で使われる語</th>
<th>決めること</th>
</tr>
</thead>
<tbody>
<tr>
<td>基本設計</td>
<td>外部設計</td>
<td>利用者から見える部分。画面・帳票・連携の仕様</td>
</tr>
<tr>
<td>詳細設計</td>
<td>内部設計</td>
<td>中の作り。処理ロジック・データアクセス</td>
</tr>
</tbody>
</table>
<p>ただし実務では、<strong>1つのExcelブックの中に基本設計と詳細設計の両方が入っている</strong>ことがよくあります。処理概要のシートは基本設計、入出力処理設計のシートは詳細設計、というように混在します。工程で分冊しようとすると、かえって管理が煩雑になります。</p>
<h2 id="画面まわりの設計書">画面まわりの設計書</h2>
<p>利用者が直接触る部分です。設計工程で最も分量が多くなります。</p>
<ul>
<li><strong><a href="https://creativecontentlabtokyo.com/screen-list-excel-template/">画面一覧</a></strong> — 画面IDを採番し、画面の数を確定させます。すべての起点になります</li>
<li><strong><a href="https://creativecontentlabtokyo.com/screen-design-document-excel-template/">画面定義書／画面設計書</a></strong> — 1画面ずつ、レイアウト・画面項目定義・表示条件・入力チェック・入出力処理設計まで書きます</li>
<li><strong><a href="https://creativecontentlabtokyo.com/screen-transition-excel-template/">画面遷移図</a></strong> — 画面同士のつながり。単体では正しく見えても、つないだ瞬間に破綻する経路が見つかります</li>
<li><strong><a href="https://creativecontentlabtokyo.com/basic-design-application-message-difinition-excel-template/">メッセージ設計書</a></strong> — メッセージIDの設定ルールと文言。画面定義書の入力チェックと対になります</li>
<li><strong><a href="https://creativecontentlabtokyo.com/salesforce-select-list-data-type-definition-excel-template/">選択リスト定義書</a></strong> — 選択肢の一覧と値。画面と帳票の両方から参照されます</li>
</ul>
<p>メッセージ設計書は後回しにされがちですが、<strong>分散させると同じ意味の文言が画面ごとに違う</strong>という状態になります。1か所に集めておく価値があります。</p>
<h2 id="帳票まわりの設計書">帳票まわりの設計書</h2>
<ul>
<li><strong><a href="https://creativecontentlabtokyo.com/form-list-excel-template/">帳票一覧</a></strong> — 帳票の数と出力方式を確定させます</li>
<li><strong><a href="https://creativecontentlabtokyo.com/salesforce-form-design-document-excel-template/">帳票設計書／帳票定義書</a></strong> — 出力項目・レイアウト・出力件数と性能まで</li>
</ul>
<p>帳票で問題になるのは、たいてい<strong>件数</strong>です。レイアウトの議論は進むのに、月末に何万件出るのかが最後まで決まらない。性能問題は本番直前に出ます。一覧の段階で件数の欄を埋めておくと、後半が楽になります。</p>
<h2 id="データモデルまわりの設計書">データモデルまわりの設計書</h2>
<ul>
<li><strong><a href="https://creativecontentlabtokyo.com/basic-design-object-definition/">データモデル・オブジェクト設計</a></strong> — 概念データモデルから設計に落とす進め方。オブジェクト定義書のテンプレートもここから辿れます</li>
<li><strong><a href="https://creativecontentlabtokyo.com/salesforce_desgin_crud_matrix_excel_sample_template/">CRUD図／CRUDマトリクス表</a></strong> — 機能とデータの関係。どの機能がどのデータを作り、更新し、消すか</li>
<li><strong><a href="https://creativecontentlabtokyo.com/salesforce_basic_design_program_code_difinition_sample_template/">コード設計書／コード定義書</a></strong> — コード体系と値の定義。区分値をどこで持つか</li>
</ul>
<p>CRUD図は省略されることが多い成果物です。ただし**「このデータは誰が作るのか」が誰も答えられない**状態に気づけるのは、この表だけです。作るなら機能×オブジェクトのレベルまでで十分で、項目レベルまで作ると維持できなくなります。</p>
<h2 id="処理バッチまわりの設計書">処理・バッチまわりの設計書</h2>
<ul>
<li><strong><a href="https://creativecontentlabtokyo.com/program-list-excel-template/">プログラム一覧</a></strong> — 実装対象の数。機能種別ごとの難易度と規模を定義しておくと見積もりに使えます</li>
<li><strong><a href="https://creativecontentlabtokyo.com/apex-batch-process-list-job-schdule-excel-template/">バッチ処理一覧</a></strong> — バッチの数と処理方式</li>
<li><strong><a href="https://creativecontentlabtokyo.com/apex-batch-process-basic-design-excel-template/">バッチ処理設計書</a></strong> — 処理概要・処理フロー図・入出力処理設計</li>
<li><strong><a href="https://creativecontentlabtokyo.com/salesforce-batch-job-time-schedule-template/">ジョブスケジュール</a></strong> — 起動サーバ・サイクル・時刻。バッチ同士の順序と依存</li>
<li><strong><a href="https://creativecontentlabtokyo.com/apex-trigger-detail-process-design-excel-template/">トリガー処理設計書</a></strong> ／ <strong><a href="https://creativecontentlabtokyo.com/salesforce-apex-trigger-program-list-document-template/">トリガー一覧</a></strong> — データ更新をきっかけに動く処理</li>
</ul>
<p>ジョブスケジュールは一覧の一種ですが、<strong>時間軸で見ないと衝突が見つかりません</strong>。処理単体では正しくても、同じ時刻に重い処理が3本走る設計になっていることがあります。</p>
<h2 id="外部連携まわりの設計書">外部連携まわりの設計書</h2>
<ul>
<li><strong><a href="https://creativecontentlabtokyo.com/external-system-integration-interface-list-excel-template/">外部インタフェース一覧／連携全体図</a></strong> — 連携の数と方向。全体図があると相手先との合意が早くなります</li>
<li><strong><a href="https://creativecontentlabtokyo.com/external-system-interface-design-excel-templete/">外部インタフェース設計書</a></strong> — 処理概要・連携処理フロー・データ移送項目</li>
</ul>
<p>外部連携は<strong>相手がいる</strong>ため、自分たちだけでは決められません。設計工程の中で最初に着手すべき領域です。</p>
<h2 id="どこから手をつけるか">どこから手をつけるか</h2>
<p>順序をまとめると、こうなります。</p>
<ol type="1">
<li><strong><a href="https://creativecontentlabtokyo.com/system-function-chart-sample-template/">システム機能一覧</a></strong> で、作るものの全体像を確定させる</li>
<li><strong>各種の一覧</strong>（画面・帳票・バッチ・外部連携・プログラム）で、数と粒度を決める</li>
<li><strong>外部連携の設計書</strong>から着手する（相手との調整に時間がかかるため）</li>
<li><strong>画面・帳票の設計書</strong>を進める</li>
<li><strong>処理・バッチの設計書</strong>とデータモデルを固める</li>
</ol>
<p>一覧がすべて揃った時点で、<strong>設計工程の残作業が行数で見える</strong>ようになります。ここが引けているかどうかで、後半の進め方が変わります。</p>
<h2 id="テンプレートを埋める作業をどう減らすか">テンプレートを埋める作業をどう減らすか</h2>
<p>テンプレートを配っても、埋める作業は残ります。設計工程で時間を食うのは様式を整えることではなく、<strong>項目を1つずつ書いていく作業</strong>です。</p>
<p>この部分は生成AIにかなりの割合を任せられます。ただし任せられる範囲と、任せてはいけない範囲が分かれます。具体的な手順は別の記事にまとめました。</p>
<ul>
<li><a href="https://creativecontentlabtokyo.com/ai-writes-screen-design-document/">画面定義書をAIに書かせる手順</a></li>
<li><a href="https://creativecontentlabtokyo.com/ai-writes-system-function-list/">機能一覧をAIに作らせる手順</a></li>
</ul>
<h2 id="まとめ">まとめ</h2>
<ul>
<li>設計工程の成果物は**「一覧」と「設計書」の2階建て**。一覧で数と粒度を決め、設計書で中身を決める</li>
<li><strong>順序を逆にすると手戻りが設計書1冊単位</strong>になる。見積もりと進捗も一覧の行数が単位</li>
<li>設計書・定義書・仕様書はほぼ同じもの。<strong>基本設計＝外部設計、詳細設計＝内部設計</strong></li>
<li>1つのExcelブックに基本設計と詳細設計が混在するのは普通。工程で分冊しなくてよい</li>
<li>着手順は<strong>機能一覧 → 各一覧 → 外部連携 → 画面・帳票 → 処理・データモデル</strong></li>
</ul>
<p>テンプレートの埋め方や、プロジェクトに合わせた様式の調整を手を動かしながら身につけたい方は、<a href="https://creativecontentlabtokyo.com/training/">AI開発トレーニング</a>で個別にお伝えしています。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>障害の原因分類をAIに整理させる手順｜傾向分析から再発防止までの流れ</title>
		<link>https://creativecontentlabtokyo.com/ai-classifies-defect-root-cause/</link>
		
		<dc:creator><![CDATA[セールスフォース標準化推進ラボ]]></dc:creator>
		<pubDate>Sun, 06 Sep 2026 13:56:31 +0000</pubDate>
				<category><![CDATA[AI駆動開発]]></category>
		<category><![CDATA[デリバリーメソッド]]></category>
		<category><![CDATA[原因分析]]></category>
		<category><![CDATA[品質管理]]></category>
		<category><![CDATA[生成AI]]></category>
		<category><![CDATA[障害管理]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/ai-classifies-defect-root-cause/</guid>

					<description><![CDATA[障害管理表は埋まっているのに、そこから何も出てこない。溜まった障害をAIに分類させ、傾向を出して再発防止の打ち手に変えるまでの手順を、任せてはいけない判断まで含めて解説します。]]></description>
										<content:encoded><![CDATA[<p>障害管理表は毎日更新されている。件数も分類も入っている。それなのに、<strong>そこから何も出てこない</strong>。</p>
<p>品質会議で「今週は15件でした」と報告して終わる。傾向を聞かれても答えられない。テストの終盤になって、同じような不具合が繰り返し出ていたことに気づく——。</p>
<p>原因は、記録していないことではありません。<strong>溜めた記録を分析する工程が、誰の仕事にもなっていない</strong>ことです。この工程は手間がかかるわりに、やらなくても表面上は困りません。だから真っ先に省かれます。</p>
<p>ここは生成AIで大きく変わる領域です。<strong>分類と傾向出しはAIに任せ、人は打ち手を決めることに集中できます。</strong></p>
<p>分析や分類をどこまで任せ、どこから自分で判断するかの基準は<a href="https://creativecontentlabtokyo.com/ai-delegation-what-to-delegate/">AIに何を任せ、何を任せないか</a>でまとめています。</p>
<h2 id="なぜ原因分類は形骸化するのか">なぜ原因分類は形骸化するのか</h2>
<p>形骸化には、はっきりした理由が3つあります。</p>
<p><strong>1. 分類を決めるのが早すぎる</strong> プロジェクト開始時に「こんな分類が必要だろう」と机上で決めます。実際に障害が出始めると当てはまらず、<strong>判断に迷ったものが全部「その他」に流れます</strong>。気づくと半分が「その他」になっています。</p>
<p><strong>2. 登録する人によって基準が違う</strong> 同じ「画面に想定外の値が出る」でも、ある人は「表示不具合」、別の人は「計算誤り」と入れます。<strong>集計しても実態を表さない</strong>ので、誰も見なくなります。</p>
<p><strong>3. 分析する時間が確保されていない</strong> 分類はされていても、集計して傾向を読む人がいません。テスト工程は常に逼迫しているため、この作業は必ず後回しになります。</p>
<p>AIで解けるのは主に1と2です。3は、1と2の手間が減った結果として時間が生まれます。</p>
<h2 id="用意するもの">用意するもの</h2>
<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<thead>
<tr>
<th>入力</th>
<th>具体例</th>
</tr>
</thead>
<tbody>
<tr>
<td>溜まった障害の記録</td>
<td><a href="https://creativecontentlabtokyo.com/failure-bug-report-template/">障害管理表</a>の現物。事象・原因・対応内容の記述があるもの</td>
</tr>
<tr>
<td>分類の定義</td>
<td>現在使っている選択リスト値の一覧。無ければ手順①で作る</td>
</tr>
<tr>
<td>工程の情報</td>
<td>検出工程と、本来検出すべき工程</td>
</tr>
<tr>
<td>参考の観点</td>
<td><a href="https://creativecontentlabtokyo.com/salesforce-design-develop-test-point-of-review/">設計・開発・テストのレビュー観点</a></td>
</tr>
</tbody>
</table>
<p><strong>重要なのは、事象と原因が文章で書かれていること</strong>です。分類コードだけが入っていて記述が空欄の表は、AIに渡しても何も出てきません。逆に、記述さえあれば分類が雑でも整理できます。</p>
<h2 id="手順">手順</h2>
<h3 id="分類の定義を実際の障害から作り直す">① 分類の定義を、実際の障害から作り直す</h3>
<p>机上で決めた分類を捨て、<strong>実際に起きた障害から帰納して作り直します</strong>。</p>
<p>溜まった障害の事象と原因の記述をまとめて渡し、「この障害群を、原因の性質で5〜8種類に分類する定義を作って」と依頼します。件数が偏らないように、と添えると実用的な粒度になります。</p>
<p>出てきた定義を人が確認し、<strong>現場の言葉に直します</strong>。AIは一般的な用語を使いたがりますが、分類はチーム内で通じることが最優先です。</p>
<p>このとき、<a href="https://creativecontentlabtokyo.com/failure-bug-report-template/">障害管理表の設計そのもの</a>で解説しているとおり、<strong>障害分類（起きた事象の種別）と根本原因（なぜ作り込まれたか）は別の列</strong>として分けておきます。混ぜると、この後の分析が成立しません。</p>
<h3 id="溜まった障害を一括で分類させる">② 溜まった障害を一括で分類させる</h3>
<p>定義が固まったら、既存の全件を分類し直します。<strong>ここは完全に機械的な作業</strong>で、AIに任せて問題ありません。</p>
<p>数十件から数百件を一度に渡すと精度が落ちるので、30〜50件ずつに区切って処理します。出力には<strong>分類の根拠を1行で添えさせる</strong>と、後の確認が一気に楽になります。</p>
<p>判断に迷ったものには印を付けさせます。<strong>印が付いたものは、たいてい記述が曖昧な障害</strong>です。分類の問題ではなく、記録の問題として起票者に確認します。</p>
<h3 id="分類の揺れを検出させる">③ 分類の揺れを検出させる</h3>
<p>分類が終わったら、<strong>AI自身に揺れを探させます</strong>。</p>
<p>「同じような事象なのに違う分類になっているものを挙げて」と依頼するだけです。人が目視で探すのは非現実的ですが、機械的な突き合わせなら確実に見つかります。</p>
<p>揺れが多い分類は、<strong>定義そのものが曖昧</strong>というシグナルです。分類名を変えるか、2つに割るかを検討します。</p>
<h3 id="傾向を出させ打ち手の候補まで書かせる">④ 傾向を出させ、打ち手の候補まで書かせる</h3>
<p>ここが本来やりたかった工程です。</p>
<p>分類済みのデータを渡し、次を出させます。</p>
<ul>
<li>分類ごとの件数と、その推移</li>
<li><strong>検出工程と、本来検出すべき工程のずれ</strong>が大きい分類</li>
<li>特定の機能・担当・工程に偏っているもの</li>
<li>それぞれに対して考えられる打ち手の候補</li>
</ul>
<p>2つ目が特に効きます。<strong>「単体テストで見つけるべきだったものが、結合テストで大量に出ている」</strong>という状態が見えれば、打ち手はテストの強化ではなく、単体テストの観点や完了基準の見直しになります。</p>
<p>テストの消化状況とあわせて見るなら<a href="https://creativecontentlabtokyo.com/salesforce-test-progress-management-template/">テスト進捗管理表</a>、単体テストの中身は<a href="https://creativecontentlabtokyo.com/salesforce-test-process-unit-test-excep-template/">単体テスト仕様書兼結果報告書</a>を突き合わせます。</p>
<h2 id="aiに任せてはいけないこと">AIに任せてはいけないこと</h2>
<p><strong>1. 打ち手を決めること</strong></p>
<p>AIは打ち手の候補を出せますが、<strong>どれを実行するかは決められません</strong>。残っている期間、体制、顧客との関係、他機能への影響——これらを踏まえた判断は、プロジェクトの文脈を持っている人にしかできません。</p>
<p>「テストケースを増やす」は正しく見えますが、期間が残っていなければ実行不能です。実行できない打ち手を掲げるくらいなら、<strong>スコープを削る相談を先にする</strong>ほうが誠実です。</p>
<p><strong>2. 個人の評価に使うこと</strong></p>
<p>「この分類の障害は、特定の担当に偏っている」という分析結果は簡単に出ます。<strong>これを人の評価に使った瞬間に、障害の報告が止まります。</strong></p>
<p>障害が報告されなくなったプロジェクトは、品質が良くなったのではなく、見えなくなっただけです。分析結果は<strong>仕組みの問題として扱う</strong>と決めておきます。偏りが出たなら、レビュー体制か引き継ぎの問題として読みます。</p>
<p><strong>3. 事実の確認を省くこと</strong></p>
<p>分類結果は必ずサンプリングして確認します。<strong>AIは、記述が曖昧な障害を、それらしい分類に入れてしまいます</strong>。全件は無理でも、分類ごとに数件ずつ見れば、大きな誤りは検出できます。</p>
<h2 id="分析結果を打ち手に変える">分析結果を打ち手に変える</h2>
<p>傾向が出たら、<strong>打ち手は3種類に整理する</strong>と実行に移しやすくなります。</p>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th>種類</th>
<th>内容</th>
<th>例</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>今すぐ効くもの</strong></td>
<td>現在のテスト工程で対応できる</td>
<td>特定の観点でテストケースを追加する</td>
</tr>
<tr>
<td><strong>横展開するもの</strong></td>
<td>同種の障害が潜んでいる箇所を先回りで点検</td>
<td>同じ設計パターンの機能をまとめて再レビュー</td>
</tr>
<tr>
<td><strong>次から効くもの</strong></td>
<td>工程・基準の見直し</td>
<td>単体テストの完了基準に観点を追加する</td>
</tr>
</tbody>
</table>
<p><strong>2つ目の横展開が、いちばん費用対効果が高い</strong>です。1件の障害から、まだ表面化していない同種の障害を先に潰せます。テストの終盤で同じ不具合が繰り返し出るのは、これをやっていないからです。</p>
<p>打ち手をどう合意し、どう報告するかは<a href="https://creativecontentlabtokyo.com/preparation-of-overall-test-policy-template/">テスト計画書・テスト方針書の書き方</a>にまとめています。レビュー段階で検出した指摘は<a href="https://creativecontentlabtokyo.com/review-note-template/">レビュー指摘表</a>で管理し、実装後に顕在化したものを障害管理表へ引き継ぐと、工程ごとの検出状況が正しく集計できます。</p>
<h2 id="うまくいかないときの原因">うまくいかないときの原因</h2>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td>分類しても傾向が見えない</td>
<td>障害分類と根本原因を1列で扱っている</td>
<td>事象の種別と、なぜ作り込まれたかを分けて持つ</td>
</tr>
<tr>
<td>「その他」が大量に出る</td>
<td>机上で決めた分類のまま</td>
<td>実際の障害から帰納して定義し直す（手順①）</td>
</tr>
<tr>
<td>分類結果が信用できない</td>
<td>記述が空欄の障害が多い</td>
<td>分類の前に、記述を埋める運用を直す</td>
</tr>
<tr>
<td>打ち手が実行されない</td>
<td>実行可能性を検討せずに掲げている</td>
<td>期間と体制を踏まえて3種類に整理する</td>
</tr>
<tr>
<td>報告が上がらなくなった</td>
<td>分析結果を個人の評価に使った</td>
<td>仕組みの問題として扱うと明示し、運用を戻す</td>
</tr>
</tbody>
</table>
<h2 id="まとめ">まとめ</h2>
<ul>
<li>原因分類が形骸化するのは、<strong>分類を決めるのが早すぎる</strong>ことと、<strong>分析する時間が誰の仕事でもない</strong>こと</li>
<li>分類の定義は、<strong>机上で決めず、実際に起きた障害から帰納して作り直す</strong></li>
<li>分類・揺れの検出・傾向出しはAIに任せられる。<strong>数十件ずつ区切り、根拠を1行添えさせる</strong></li>
<li><strong>打ち手を決めること・個人の評価に使うこと・事実確認を省くことは渡さない</strong></li>
<li>打ち手は「今すぐ効く／横展開する／次から効く」の3種類に整理する。<strong>横展開が最も費用対効果が高い</strong></li>
</ul>
<p>分類と集計が自動化されると、品質会議の中身が「件数の報告」から「打ち手の相談」に変わります。もともとそこが目的だったはずです。</p>
<p>実際の進め方を手を動かしながら身につけたい方は、<a href="https://creativecontentlabtokyo.com/training/">AI開発トレーニング</a>で個別にお伝えしています。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>機能一覧をAIに作らせる手順｜ヒアリングメモから見積もりの土台を作る</title>
		<link>https://creativecontentlabtokyo.com/ai-writes-system-function-list/</link>
		
		<dc:creator><![CDATA[セールスフォース標準化推進ラボ]]></dc:creator>
		<pubDate>Sun, 06 Sep 2026 13:50:56 +0000</pubDate>
				<category><![CDATA[AI駆動開発]]></category>
		<category><![CDATA[デリバリーメソッド]]></category>
		<category><![CDATA[機能一覧]]></category>
		<category><![CDATA[生成AI]]></category>
		<category><![CDATA[要件定義]]></category>
		<category><![CDATA[見積もり]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/ai-writes-system-function-list/</guid>

					<description><![CDATA[業務ヒアリングのメモから機能を洗い出し、粒度を揃えて機能一覧にまとめる手順を解説。難易度づけと工数見積もりへの繋げ方、そしてAIに任せてはいけない判定まで整理しています。]]></description>
										<content:encoded><![CDATA[<p>機能一覧は、要件定義フェーズの成果物のなかで<strong>もっとも後工程に影響する表</strong>です。ここに載らなかった機能は見積もりに入らず、体制にも日程にも反映されません。後から出てくると、たいてい揉めます。</p>
<p>それだけ重要なのに、作り方は属人的です。ヒアリングのメモを眺めながら、経験のある人が頭の中で機能に切り分けている、というのが実態ではないでしょうか。</p>
<p>この作業の<strong>洗い出しと粒度そろえの部分は、生成AIにかなり任せられます</strong>。一方で、<strong>任せると見積もりが壊れる判定</strong>もはっきり存在します。この記事では、その境界線を含めて手順をまとめます。</p>
<p>任せる範囲の決め方で迷ったときは、<a href="https://creativecontentlabtokyo.com/ai-delegation-what-to-delegate/">AIに何を任せ、何を任せないか</a>が判断の軸になります。</p>
<h2 id="機能一覧とは見積もりの土台になる表">機能一覧とは｜見積もりの土台になる表</h2>
<p>機能一覧（システム機能一覧）とは、<strong>構築するシステムの機能をすべて並べ、それぞれをどう実現するかまで定義した一覧表</strong>です。単なる機能の目録ではありません。</p>
<p>一覧に持たせる列は、おおむね次のようになります。</p>
<table>
<thead>
<tr>
<th>列</th>
<th>何を書くか</th>
</tr>
</thead>
<tbody>
<tr>
<td>機能ID</td>
<td>一意に特定するための採番</td>
</tr>
<tr>
<td>機能名／機能概要</td>
<td>何をする機能か</td>
</tr>
<tr>
<td>業務分類（大・中・小）</td>
<td>どの業務に属するか</td>
</tr>
<tr>
<td>機能分類</td>
<td>画面・帳票・バッチなどの種別</td>
</tr>
<tr>
<td>実現方法</td>
<td>標準機能の設定か、開発か。具体的にどう実現するか</td>
</tr>
<tr>
<td><strong>難易度</strong></td>
<td><strong>工数見積もりのための区分</strong></td>
</tr>
<tr>
<td>備考</td>
<td>制約事項・前提</td>
</tr>
</tbody>
</table>
<p><strong>この表が「目録」ではなく「見積もりの土台」になるのは、実現方法と難易度の2列があるから</strong>です。この2列が無い機能一覧は、後工程で作り直しになります。</p>
<p>様式は<a href="https://creativecontentlabtokyo.com/system-function-chart-sample-template/">システム機能一覧のテンプレート</a>をそのまま使えます。</p>
<h2 id="用意するもの">用意するもの</h2>
<p>機能一覧は、ゼロから発明するものではありません。<strong>必ず元になる情報があります。</strong></p>
<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<thead>
<tr>
<th>入力</th>
<th>具体例</th>
</tr>
</thead>
<tbody>
<tr>
<td>業務ヒアリングの記録</td>
<td><a href="https://creativecontentlabtokyo.com/hearing-sheet-template/">業務ヒアリングシート</a>の記入結果、議事録</td>
</tr>
<tr>
<td>業務の全体像</td>
<td><a href="https://creativecontentlabtokyo.com/business-function-matrix-excel-template/">業務機能階層図</a>、<a href="https://creativecontentlabtokyo.com/organization-business-structure-difinition-template/">組織図・業務体系図</a></td>
</tr>
<tr>
<td>現行システムの資産</td>
<td>既存の画面・帳票・バッチの一覧</td>
</tr>
<tr>
<td>要求の記録</td>
<td><a href="https://creativecontentlabtokyo.com/requirement_management_template/">要求仕様管理一覧</a></td>
</tr>
<tr>
<td>記入先の様式</td>
<td>使う機能一覧テンプレートの見出し行</td>
</tr>
</tbody>
</table>
<p>このうち<strong>現行システムの画面・帳票・バッチ一覧は、あるなら必ず入れてください</strong>。移行案件では、機能の8割がここから導けます。逆にこれを渡さないと、AIは一般的な業務システムの機能を創作します。</p>
<h2 id="手順">手順</h2>
<h3 id="ヒアリングメモから機能候補を洗い出させる">① ヒアリングメモから機能候補を洗い出させる</h3>
<p>まず、量を出します。<strong>この段階で絞らない</strong>のがコツです。</p>
<p>ヒアリング記録と業務の全体像を渡し、「この業務を実現するために必要なシステム機能を、抜けなく挙げて」と依頼します。重複や粒度のばらつきは、この時点では気にしません。</p>
<p>人が最初から整った一覧を作ろうとすると、<strong>思いつかなかった機能がそのまま抜けます</strong>。AIに大量に出させてから削るほうが、抜けが減ります。</p>
<h3 id="粒度を揃える">② 粒度を揃える</h3>
<p>ここが機能一覧づくりの本丸です。洗い出した候補は、粒度がばらばらになっています。</p>
<p>粒度の基準は、<strong>「見積もれる単位か」</strong>で決めます。</p>
<ul>
<li><strong>粗すぎる</strong>（例：「受注管理」）→ 何人日かかるか誰にも答えられない</li>
<li><strong>細かすぎる</strong>（例：「受注画面の得意先コード入力欄」）→ 一覧が数百行になり、管理そのものが目的化する</li>
<li><strong>ちょうどよい</strong>（例：「受注登録画面」「受注一覧照会画面」「受注確定バッチ」）</li>
</ul>
<p>実務的には<strong>1機能＝1画面／1帳票／1バッチ</strong>を基準にすると、ほぼ破綻しません。「この機能は何画面ぶんか」と問い返せる状態になっていれば、粒度は足りています。</p>
<p>AIには、基準を明示して揃え直させます。「1機能＝1画面・1帳票・1バッチの単位に分割・統合して」と指示すれば、機械的に整います。</p>
<h3 id="機能分類と業務分類を振らせる">③ 機能分類と業務分類を振らせる</h3>
<p>粒度が揃ったら、画面・帳票・バッチの分類と、業務分類（大・中・小）を振ります。<strong>この作業は完全に機械的</strong>なので、そのまま任せて構いません。</p>
<p>業務分類は後で並び替えと集計に使います。ここが揃っていないと、「業務ごとに何機能あるか」が出せず、体制の検討に使えません。</p>
<h3 id="重複と抜けを突き合わせさせる">④ 重複と抜けを突き合わせさせる</h3>
<p>一覧ができたら、<strong>AIに自分の出力を検査させます</strong>。</p>
<ul>
<li>名前は違うが実質同じ機能になっていないか</li>
<li>登録があるのに照会・修正・削除が抜けていないか</li>
<li>帳票を出す機能はあるのに、出力対象データを作る機能が無い、といった不整合はないか</li>
</ul>
<p><strong>登録はあるが一覧照会が抜けている</strong>——これは実際によくある抜けです。人が作った一覧でも頻繁に起きます。機械的な突き合わせは、AIが人より確実に見つけます。</p>
<p>現行システムの一覧があるなら、それとも突き合わせます。「現行にあって新機能一覧に無いもの」を出させると、移行漏れが一度に洗えます。</p>
<h2 id="標準機能で足りるかの判定はaiに任せない">標準機能で足りるかの判定は、AIに任せない</h2>
<p>ここが最も重要な線引きです。</p>
<p>「この機能は、パッケージやプラットフォームの標準設定で実現できるか。それとも開発が必要か」——<strong>この判定をAIに任せると、見積もりが根本から狂います。</strong></p>
<p>理由は3つあります。</p>
<p><strong>1. 製品のバージョンと契約内容に依存する</strong> 同じ機能でも、エディションやライセンス、有効化されているオプションによって、標準で足りるかどうかが変わります。AIは一般論で答えます。</p>
<p><strong>2. 「できる」と「実用に耐える」は違う</strong> 標準機能で形は作れても、件数や同時実行数の条件で使い物にならない、というケースは頻繁にあります。この判断には実際の運用条件が要ります。</p>
<p><strong>3. 間違えたときの損害が大きい</strong> 「標準で足りる」と誤判定した機能は、見積もりから開発工数が抜け落ちます。<strong>設計フェーズの終盤で発覚し、そのまま赤字要因になります。</strong></p>
<p>したがって、実現方法の列は<strong>候補を挙げさせるところまでをAI、判定は人</strong>が持ちます。「標準で実現する場合の方法と、開発する場合の方法を両方挙げて」と依頼し、どちらを採るかは自分で決めます。</p>
<h2 id="難易度と工数見積もりへの繋げ方">難易度と工数見積もりへの繋げ方</h2>
<p>難易度の列は、機能一覧が見積もりに繋がる要です。</p>
<p>難易度は<strong>絶対的な基準ではなく、自社の基準に揃える</strong>ものです。「高・中・低」でも「1〜5」でも構いませんが、<strong>それぞれが何人日相当かを先に決めておきます</strong>。決めずに難易度だけ振っても、合計が出せません。</p>
<p>AIの使い方としては、<strong>基準を渡してから一括で振らせる</strong>のが有効です。</p>
<blockquote>
<p>難易度の定義（低＝◯人日、中＝◯人日、高＝◯人日）を渡したうえで、 「この定義に照らして、各機能の難易度を振って。判断に迷ったものは印を付けて」</p>
</blockquote>
<p><strong>迷ったものに印を付けさせる</strong>のが要点です。全件を人がレビューするのは大変ですが、印の付いたものだけなら現実的に見られます。そして、迷いが出るのはたいてい<strong>要件が固まっていない機能</strong>です。難易度づけは、要件の曖昧さを炙り出す工程でもあります。</p>
<p>標準機能で足りるかの判定結果は、<a href="https://creativecontentlabtokyo.com/system-requirement-fit-gap-analysis-results/">FIT&amp;GAP分析一覧</a>と揃えておくと、後の要件確定がスムーズになります。</p>
<h2 id="うまくいかないときの原因">うまくいかないときの原因</h2>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td>一般的な業務システムの機能が並ぶ</td>
<td>ヒアリング記録を渡していない</td>
<td>議事録やヒアリングシートの実物を渡す</td>
</tr>
<tr>
<td>粒度がばらばらのまま</td>
<td>基準を示していない</td>
<td>「1機能＝1画面・1帳票・1バッチ」と明示する</td>
</tr>
<tr>
<td>数百行になって管理できない</td>
<td>細かく出しすぎ</td>
<td>画面の項目レベルまで割らない。そこは設計書の仕事</td>
</tr>
<tr>
<td>難易度の合計が現実離れする</td>
<td>難易度の定義を渡していない</td>
<td>何人日相当かを先に決めて渡す</td>
</tr>
<tr>
<td>移行漏れが後で出る</td>
<td>現行の資産一覧と突き合わせていない</td>
<td>手順④で必ず突き合わせる</td>
</tr>
</tbody>
</table>
<h2 id="まとめ">まとめ</h2>
<ul>
<li>機能一覧は目録ではなく、<strong>実現方法と難易度の2列があって初めて見積もりの土台になる</strong></li>
<li><strong>洗い出しは絞らず量を出す。</strong> 人が最初から整えようとすると、思いつかなかった機能が抜ける</li>
<li>粒度は<strong>1機能＝1画面・1帳票・1バッチ</strong>を基準にすると破綻しにくい</li>
<li><strong>標準機能で足りるかの判定は人が持つ。</strong> 誤判定は見積もりから工数が抜け落ち、そのまま赤字要因になる</li>
<li>難易度は<strong>定義を先に決めてから振らせ、迷ったものに印を付けさせる</strong>。印はそのまま要件の曖昧さを示す</li>
</ul>
<p>洗い出しと整形をAIに任せられるようになると、空いた時間を<strong>実現方法の判定と、要件の詰め</strong>に回せます。機能一覧の精度を決めているのは、もともとそちらです。</p>
<p>進め方を実際に手を動かしながら身につけたい方は、<a href="https://creativecontentlabtokyo.com/training/">AI開発トレーニング</a>で個別にお伝えしています。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>画面定義書をAIに書かせる手順｜要件メモから設計書を作る流れと限界</title>
		<link>https://creativecontentlabtokyo.com/ai-writes-screen-design-document/</link>
		
		<dc:creator><![CDATA[セールスフォース標準化推進ラボ]]></dc:creator>
		<pubDate>Sun, 06 Sep 2026 12:37:48 +0000</pubDate>
				<category><![CDATA[AI駆動開発]]></category>
		<category><![CDATA[デリバリーメソッド]]></category>
		<category><![CDATA[基本設計]]></category>
		<category><![CDATA[生成AI]]></category>
		<category><![CDATA[画面設計]]></category>
		<category><![CDATA[設計書]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/ai-writes-screen-design-document/</guid>

					<description><![CDATA[テンプレートは手に入れたのに中身が埋まらない。要件メモから画面定義書の項目定義・入力チェック・表示条件をAIに起こさせる手順を、任せてはいけない範囲まで含めて解説します。]]></description>
										<content:encoded><![CDATA[<p>テンプレートはダウンロードした。でも、真っ白なシートを前にして止まっている。</p>
<p>設計書づくりでいちばん時間を食うのは、様式を整えることではありません。<strong>項目を1つずつ埋めていく作業</strong>です。画面定義書なら、項目名・型・桁数・必須有無・初期値・入力チェック・表示条件を、画面の数だけ書くことになります。</p>
<p>この部分は、生成AIにかなりの割合を任せられます。ただし<strong>任せられる範囲と、任せてはいけない範囲がはっきり分かれます</strong>。この記事では、要件メモから画面定義書を起こす具体的な手順と、その境界線をまとめます。</p>
<p>設計書に限らず、どの作業をどこまで任せてよいかで迷うことがあります。判断の軸そのものは<a href="https://creativecontentlabtokyo.com/ai-delegation-what-to-delegate/">AIに何を任せ、何を任せないか</a>で整理しています。</p>
<h2 id="なぜ設計書はaiと相性がいいのか">なぜ設計書はAIと相性がいいのか</h2>
<p>設計書の記述には、<strong>元になる情報が必ずどこかに存在している</strong>という特徴があります。</p>
<p>業務のヒアリングメモ、既存システムの画面、Excelの管理台帳、あるいは口頭で決まった仕様のチャット履歴。設計書を書く作業の大部分は、<strong>ゼロから発明することではなく、散らばっている情報を決まった形式に整えること</strong>です。</p>
<p>そして「散らばった情報を、決まった形式に整える」は、生成AIが最も得意とする作業です。</p>
<p>逆に言えば、<strong>元になる情報が無い状態でAIに投げても、それらしい嘘が返ってくるだけ</strong>です。ここが最初の分岐点になります。</p>
<h2 id="用意するもの">用意するもの</h2>
<p>手順に入る前に、入力を揃えます。ここが揃っていないと、後の工程がすべて空回りします。</p>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th>入力</th>
<th>具体例</th>
<th>無いとどうなるか</th>
</tr>
</thead>
<tbody>
<tr>
<td>業務の説明</td>
<td>誰が、いつ、何のためにこの画面を使うか</td>
<td>項目の要否を判断できない</td>
</tr>
<tr>
<td>扱うデータ</td>
<td>項目名の一覧、既存台帳のヘッダー行</td>
<td>項目が創作される</td>
</tr>
<tr>
<td>画面のたたき台</td>
<td>手描きのラフ、既存画面のキャプチャ</td>
<td>レイアウトが一般論になる</td>
</tr>
<tr>
<td>記入先の様式</td>
<td>使う設計書テンプレートの見出し行</td>
<td>出力形式が毎回変わる</td>
</tr>
</tbody>
</table>
<p>4つ目が意外と重要です。<strong>出力先の様式を先に見せておくと、そのまま貼り付けられる形で返ってきます。</strong> 様式を渡さずに書かせると、整形し直す手間が発生し、時短になりません。</p>
<p>様式は<a href="https://creativecontentlabtokyo.com/screen-design-document-excel-template/">画面定義書のテンプレート</a>をそのまま使えます。</p>
<h2 id="手順">手順</h2>
<h3 id="項目定義を起こさせる">① 項目定義を起こさせる</h3>
<p>最初に作るのは項目定義です。画面に載せる項目を、型・桁数・必須有無・初期値まで含めて一覧にします。</p>
<p>このとき、<strong>業務の説明と扱うデータを一緒に渡す</strong>のが要点です。項目名だけを渡すと、型や桁数は一般的な値で埋められます。「この項目は何のために存在するのか」が分かっていれば、AIは適切な型を選べます。</p>
<p>出てきた一覧は、そのまま採用せず<strong>次の3点だけを人が確認</strong>します。</p>
<ul>
<li><strong>桁数</strong>：業務上の最大値を反映しているか（AIは無難な値を置きたがります）</li>
<li><strong>必須有無</strong>：運用上、空で登録される場面が本当に無いか</li>
<li><strong>初期値</strong>：登録時と更新時で挙動が変わらないか</li>
</ul>
<h3 id="入力チェックと表示条件を詰める">② 入力チェックと表示条件を詰める</h3>
<p>項目が固まったら、チェック仕様と表示条件を書かせます。ここはAIが得意な領域です。</p>
<p>「この項目とこの項目は、どちらか一方が必須」「この区分のときだけ表示する」といった<strong>条件の網羅</strong>は、人が手で書くと必ず漏れます。AIに一度洗い出させてから、不要なものを削るほうが速く、そして漏れません。</p>
<p><strong>足し算より引き算にするのがコツ</strong>です。「考えられるチェックを全部挙げて」と依頼し、そこから落としていきます。</p>
<p>画面に出すメッセージの文言と、選択リストの値は、それぞれ別の資料に切り出しておくと後の変更が楽になります。</p>
<ul>
<li><a href="https://creativecontentlabtokyo.com/basic-design-application-message-difinition-excel-template/">メッセージ設計書のテンプレート</a></li>
<li><a href="https://creativecontentlabtokyo.com/salesforce-select-list-data-type-definition-excel-template/">選択リスト定義書のテンプレート</a></li>
</ul>
<h3 id="画面間の整合を取る">③ 画面間の整合を取る</h3>
<p>1画面ずつ作っていくと、<strong>画面をまたいだところで必ず矛盾が出ます</strong>。同じデータなのに画面Aでは必須、画面Bでは任意。同じ項目名なのに桁数が違う。</p>
<p>ここでのAIの使い方は、書かせることではなく<strong>突き合わせさせること</strong>です。作成済みの複数画面の項目定義をまとめて渡し、「同じ項目で定義が食い違っているものを挙げて」と聞きます。</p>
<p>この用途は、人がやると見落とすがAIは見落とさない、という典型例です。画面全体の構成は<a href="https://creativecontentlabtokyo.com/screen-list-excel-template/">画面一覧</a>、遷移の流れは<a href="https://creativecontentlabtokyo.com/screen-transition-excel-template/">画面遷移図</a>で管理し、そちらとも突き合わせます。</p>
<h3 id="レビュー観点で自己点検させる">④ レビュー観点で自己点検させる</h3>
<p>提出前に、<strong>レビューする側の視点で自分の成果物を点検させます</strong>。</p>
<p>「この設計書をレビューする立場で、指摘すべき点を挙げて」と依頼するだけです。実際のレビューで出る指摘の何割かは、この時点で潰せます。</p>
<p>観点を明示的に渡すと精度が上がります。何を見るべきかは<a href="https://creativecontentlabtokyo.com/salesforce-design-develop-test-point-of-review/">設計・開発・テストのレビュー観点</a>にまとめています。</p>
<h2 id="aiに任せてはいけないところ">AIに任せてはいけないところ</h2>
<p>ここが本題です。<strong>次の3つを渡すと、成果物の価値そのものが失われます。</strong></p>
<h3 id="業務上の判断">1. 業務上の判断</h3>
<p>「この項目は必須にすべきか」は、技術の問題ではなく<strong>業務の問題</strong>です。必須にすれば入力漏れは防げますが、現場が値を持っていない場面があれば運用が止まります。</p>
<p>AIはこの判断を「一般的にはこうです」で埋めてきます。もっともらしく見えるので、そのまま通ってしまうのがいちばん危険です。</p>
<h3 id="決まっていないことを決めること">2. 決まっていないことを決めること</h3>
<p>仕様が固まっていない箇所をAIに投げると、<strong>決まっていないという事実が消えます</strong>。何かが書かれた設計書は「決まったもの」として下流に流れ、実装され、テストで初めて食い違いが露見します。</p>
<p>未決事項は未決事項として残すのが正解です。空欄のままにする、あるいは「要確認」と明記して、決める場に持ち込みます。</p>
<h3 id="最終的な事実確認">3. 最終的な事実確認</h3>
<p>出力された内容が、実際のデータや既存システムの挙動と一致しているか。ここは必ず現物で確認します。</p>
<p><strong>AIは、それらしい嘘を、正しい文章と同じ自信で書きます。</strong> 設計書は下流の全工程の前提になるため、誤りが1つ紛れ込むと、実装とテストの両方をやり直すことになります。</p>
<h2 id="うまくいかないときの原因">うまくいかないときの原因</h2>
<table>
<colgroup>
<col style="width: 33%" />
<col style="width: 33%" />
<col style="width: 33%" />
</colgroup>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td>項目が創作される</td>
<td>元になるデータを渡していない</td>
<td>既存台帳のヘッダー行など、実物を渡す</td>
</tr>
<tr>
<td>出力形式が毎回変わる</td>
<td>様式を見せていない</td>
<td>テンプレートの見出し行を先に渡す</td>
</tr>
<tr>
<td>一般論しか返ってこない</td>
<td>業務の説明が抜けている</td>
<td>誰がいつ何のために使う画面かを書く</td>
</tr>
<tr>
<td>整形し直す手間が大きい</td>
<td>一度に多くを書かせすぎ</td>
<td>1画面ずつ、項目定義→チェック→表示条件の順に分ける</td>
</tr>
<tr>
<td>レビューで大量に指摘される</td>
<td>手順④を飛ばしている</td>
<td>提出前に観点を渡して自己点検させる</td>
</tr>
</tbody>
</table>
<p>いちばん多いのは1番目です。<strong>入力の質が、そのまま出力の質になります。</strong></p>
<h2 id="この作業で何が変わるか">この作業で何が変わるか</h2>
<p>正直に書くと、<strong>AIを使っても設計書づくりが一瞬で終わるわけではありません</strong>。</p>
<p>変わるのは、時間の使い道です。項目を1つずつ書き写す作業と、様式を整える作業がほぼ無くなります。その分を、<strong>業務上の判断と、未決事項を決める場づくり</strong>に回せます。</p>
<p>設計書の品質を決めているのは、もともと後者です。前者に時間を取られて後者が薄くなっていたのが、多くのプロジェクトの実態でした。そこが入れ替わるというのが、この作業のいちばん大きな効果だと考えています。</p>
<h2 id="まとめ">まとめ</h2>
<ul>
<li>設計書は<strong>元になる情報が必ず存在する</strong>ため、生成AIと相性がよい</li>
<li>入力を4つ揃える。<strong>出力先の様式を先に渡す</strong>と、貼り付けられる形で返ってくる</li>
<li>手順は<strong>項目定義 → チェックと表示条件 → 画面間の整合 → 自己点検</strong>の4ステップ</li>
<li><strong>業務上の判断・未決事項の決定・事実確認は人が持つ。</strong> ここを渡すと成果物の価値が消える</li>
<li>変わるのは総時間より<strong>時間の使い道</strong>。書き写す作業が減り、決める作業に回せる</li>
</ul>
<p>実際にどう指示を組み立てるか、どこまで一度に投げるかは、扱うシステムや体制によって変わります。手を動かしながら身につけたい方は、<a href="https://creativecontentlabtokyo.com/training/">AI開発トレーニング</a>で個別にお伝えしています。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AIエディタを使ったVibe CordingでSalesforceの開発を行う【①用語の理解とツールの説明】</title>
		<link>https://creativecontentlabtokyo.com/develop-salesforce-with-vibe-cording-using-ai-editor/</link>
		
		<dc:creator><![CDATA[セールスフォース標準化推進ラボ]]></dc:creator>
		<pubDate>Sun, 22 Jun 2025 05:15:48 +0000</pubDate>
				<category><![CDATA[AI駆動開発]]></category>
		<category><![CDATA[AIエディタ]]></category>
		<category><![CDATA[Claude Code]]></category>
		<category><![CDATA[Cline]]></category>
		<category><![CDATA[Copilot]]></category>
		<category><![CDATA[Salesforce]]></category>
		<category><![CDATA[Vibe coding]]></category>
		<category><![CDATA[VSCode]]></category>
		<category><![CDATA[Windsurf]]></category>
		<category><![CDATA[コーディング]]></category>
		<category><![CDATA[生成AI]]></category>
		<category><![CDATA[開発]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/?p=5506</guid>

					<description><![CDATA[書き方そのものより、どんな仕事に向いているかを先に知りたい場合は、Vibe Coding の実際の開発事例もあわせてご覧ください。 Vibe Codingとは何…]]></description>
										<content:encoded><![CDATA[<p>書き方そのものより、どんな仕事に向いているかを先に知りたい場合は、<a href="/development-use-case-vibe-coding/">Vibe Coding の実際の開発事例</a>もあわせてご覧ください。</p>
<h2 class="text-2xl font-bold mt-1 text-text-100">Vibe Codingとは何か（感覚的・直感的なコーディング手法）</h2>
<p class="whitespace-normal break-words">Vibe Coding（バイブコーディング）とは、従来の詳細な設計書やドキュメントベースの開発から脱却し、開発者の直感と感覚、そしてAIの支援を活用した新しいコーディング手法です。</p>
<p class="whitespace-normal break-words">開発者が「こんな機能を作りたい」という漠然としたアイデアや要求を、AIエディタとの対話を通じて具体的なコードに変換していくため、完璧な設計よりもスピードや柔軟性を重視しており、Salesforceの開発と非常に相性がよい手法となります。</p>
<div class="cclt-compat-kaiwa cclt-compat-kaiwa--left"><div class="cclt-compat-kaiwa__icon"><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/2024/11/schooldays1.jpg" alt="サポーターさん" loading="lazy" /><span class="cclt-compat-kaiwa__name">サポーターさん</span></div><div class="cclt-compat-kaiwa__bubble" style="background-color:#f4f4e3;"><div class="cclt-compat-kaiwa__text">Vibe Codingを使えば、開発が必要な画面や機能も要件定義の段階でプロトタイプをサクッと作ったり、設計書や開発のコーディングのベースを作成して開発を大幅に効率化できます</div></div></div>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">従来のSalesforce開発の課題を解消</h3>
<p>Salesforceの開発では、Javaなどの言語は経験があるが、ApexやLWCは経験がないというメンバーがアサインされることもありますが、Vibe codingを行うことで、Salesforce独自の言語（Apex/LWC/Visualforce/SOQL/SOSL）への対応やガバナ―制限への対応もAIが自動的に対応してくれるため、キャッチアップも用意で、開発効率も大幅にアップすることができます。</p>
<p>作成されたソースコードについて仕様や解説もしてくれるしコメントを入れることができるので、処理内容を把握して、要件と異なるところもすぐに検索して修正することができます。</p>
<p>AIエディタで実現できること</p>
<p><img fetchpriority="high" decoding="async" width="1920" height="1129" class="alignnone wp-image-5521 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-140.jpg" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-140.jpg 1920w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-140-300x176.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-140-1024x602.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-140-768x452.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-140-1536x903.jpg 1536w" sizes="(max-width: 1920px) 100vw, 1920px" /></p>
<h2 class="text-2xl font-bold mt-1 text-text-100">AIエディタとは？</h2>
<p>開発現場で、皆さんが一番利用している生成AIは何でしょうか？実際はコーディング以外の作業もあるのでChatGTPが一番多いかもしれませんね。</p>
<p>コーディングで利用するAI エディター（※1）については、「<span style="color: #0000ff;"><strong>GitHub Copilot</strong></span>」「<span style="color: #0000ff;"><strong>Cline</strong></span>」「<span style="color: #0000ff;"><strong>Cursor</strong></span>」「<span style="color: #0000ff;"><strong>Windsurf</strong></span>」「<span style="color: #0000ff;"><strong>Claude Code</strong></span>」 など数多くのエディタが出てきてますが、それぞれ一長一短があるような印象です。</p>
<p>ちなみに私は、現時点ではClaude Codeが一番のお気に入りです。Salesforceの開発IDEとしてはVisual Studio Codeが一般的になってきてますが、Claude Code はVSCodeの拡張プラグインとして利用することができます。</p>
<p>CursorやWindsurfは、VSCode のフォークエディタの位置づけとなります。</p>
<p>※1.AIエディタとは、AI（人工知能）技術を活用して、文章作成やコード編集などの作業を支援するソフトウェアで、コード補完やエラーチェック、自動生成などの機能を持ちます。</p>
<p>Salesforceの開発ではVSCodeを利用することが多いと思うので、現時点では、VSCodeと相性の良いものを選択するのがいいかもしれません。現在はまだ過渡期なので、特定のエディタというよりは、ChatpGPTやCluade.aiを使ってソースコードを生成して利用するなど組み合わせで進めていくのもよいと思います。</p>
<div class="cclt-compat-kaiwa cclt-compat-kaiwa--left"><div class="cclt-compat-kaiwa__icon"><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/no-img.png" alt="" loading="lazy" /></div><div class="cclt-compat-kaiwa__bubble" style="background-color:#f8f8f8;"><div class="cclt-compat-kaiwa__text">エディタについては、開発者ごとにこだわりが強く表れるので、まずは使ってみて気に入ったものを見つけるところから始めてください</div></div></div>
<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">主要AIエディタの比較</h2>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">比較表</h3>
<table class="bg-bg-100 min-w-full border-separate border-spacing-0 text-sm leading-[1.88888] whitespace-normal">
<thead class="border-b-border-100/50 border-b-[0.5px] text-left">
<tr class="[tbody&gt;&amp;]:odd:bg-bg-500/10">
<th class="text-text-000 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] font-400 px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">項目</th>
<th class="text-text-000 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] font-400 px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">GitHub Copilot</th>
<th class="text-text-000 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] font-400 px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">Cline</th>
<th class="text-text-000 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] font-400 px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">Cursor</th>
<th class="text-text-000 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] font-400 px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">Windsurf</th>
<th class="text-text-000 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] font-400 px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">Claude Code</th>
</tr>
</thead>
<tbody>
<tr class="[tbody&gt;&amp;]:odd:bg-bg-500/10">
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><strong>料金</strong></td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">$10/月</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">無料/有料プラン</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">$20/月</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">$15/月</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">無料（プレビュー）</td>
</tr>
<tr class="[tbody&gt;&amp;]:odd:bg-bg-500/10">
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><strong>統合性</strong></td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">多エディタ対応</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">VS Code専用</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">専用エディタ</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">専用エディタ</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">コマンドライン</td>
</tr>
<tr class="[tbody&gt;&amp;]:odd:bg-bg-500/10">
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><strong>Salesforce対応</strong></td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td>
</tr>
<tr class="[tbody&gt;&amp;]:odd:bg-bg-500/10">
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><strong>コード補完</strong></td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">非常に高精度</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">高精度</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">高精度</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">高精度</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">中程度</td>
</tr>
<tr class="[tbody&gt;&amp;]:odd:bg-bg-500/10">
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><strong>ファイル操作</strong></td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">限定的</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">可能</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">可能</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">可能</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">可能</td>
</tr>
<tr class="[tbody&gt;&amp;]:odd:bg-bg-500/10">
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]"><strong>学習コスト</strong></td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">低</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">中</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">低</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">中</td>
<td class="border-t-border-100/50 [&amp;:not(:first-child)]:-x-[hsla(var(--border-100) / 0.5)] border-t-[0.5px] px-2 [&amp;:not(:first-child)]:border-l-[0.5px]">高</td>
</tr>
</tbody>
</table>
<div class="cclt-compat-cmemo" style="background-color:#ffebee;color:#000000;border:px solid ;"><span class="cclt-compat-cmemo__icon fa fa-file-text-o" style="color:#ef5350;"></span><div class="cclt-compat-cmemo__text">※料金や機能、Salesforceへの対応状況については日々変化しているため、最新の情報を公式HPやドキュメントで確認するようにしてください。</div></div>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">GitHub Copilot の詳細分析</h3>
<p><img decoding="async" width="1373" height="396" class="alignnone wp-image-5513 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138.jpg" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138.jpg 1373w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-300x87.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-1024x295.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-768x222.jpg 768w" sizes="(max-width: 1373px) 100vw, 1373px" /></p>
<p class="whitespace-normal break-words"><strong>概要と特徴</strong> GitHub Copilotは、OpenAIのCodexモデルをベースとしたAIコーディング支援ツールです。GitHub上の膨大なオープンソースコードで訓練されており、多言語に対応しています。Salesforce開発においては、ApexやLightning Web Componentsのコード補完に優れた性能を発揮します。</p>
<p class="whitespace-normal break-words"><strong>Salesforce開発における強み</strong></p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">Apex言語の高精度な補完とコード生成</li>
<li class="whitespace-normal break-words">Lightning Web Componentsのテンプレート自動生成</li>
<li class="whitespace-normal break-words">SOQLクエリの最適化提案</li>
<li class="whitespace-normal break-words">テストクラスの自動生成</li>
<li class="whitespace-normal break-words">Salesforce APIの適切な使用方法提案</li>
</ul>
<div class="cclt-compat-mybutton cclt-compat-mybutton--ref cclt-compat-mybutton--shadow"><a href="https://azure.microsoft.com/ja-jp/products/github/copilot" class="cclt-compat-mybutton__link" style="color:#fff;background-color:#FFD54F;border:1px solid #FFEB3B;border-radius:5px;font-weight:bold;background:linear-gradient(#ffdb69,#FFD54F);" rel="noopener">公式HPはコチラ</a></div>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Cline の詳細分析</h3>
<p class="whitespace-normal break-words"><strong>概要と特徴</strong> ClineはVS Code拡張として動作するAIアシスタントで、ファイル操作やターミナル操作が可能な点が特徴です。Salesforce開発においては、Salesforce CLIとの連携や、複数ファイルにまたがる機能実装に威力を発揮します。</p>
<p class="whitespace-normal break-words"><strong>Salesforce開発における活用方法</strong></p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">Salesforce CLIコマンドの自動実行</li>
<li class="whitespace-normal break-words">プロジェクト構造の自動生成</li>
<li class="whitespace-normal break-words">設定ファイルの一括更新</li>
<li class="whitespace-normal break-words">デプロイメントスクリプトの作成</li>
</ul>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Cursor の詳細分析</h3>
<p><img decoding="async" width="1740" height="603" class="alignnone wp-image-5515 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-1.jpg" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-1.jpg 1740w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-1-300x104.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-1-1024x355.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-1-768x266.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-1-1536x532.jpg 1536w" sizes="(max-width: 1740px) 100vw, 1740px" /></p>
<p class="whitespace-normal break-words"><strong>概要と特徴</strong> CursorはAI機能を内蔵した専用エディタで、自然言語でのコード編集指示が可能です。コードベース全体を理解した上での提案を行うため、Salesforceの複雑なオブジェクト関係を理解した開発が可能になります。</p>
<p class="whitespace-normal break-words"><strong>Salesforce開発における強み</strong></p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">自然言語でのApexクラス生成指示</li>
<li class="whitespace-normal break-words">オブジェクト関係を考慮したコード提案</li>
<li class="whitespace-normal break-words">Lightning Web Componentの統合的な開発支援</li>
<li class="whitespace-normal break-words">プロジェクト全体の一貫性チェック</li>
</ul>
<div class="cclt-compat-mybutton cclt-compat-mybutton--ref cclt-compat-mybutton--shadow"><a href="https://www.cursor.com/ja" class="cclt-compat-mybutton__link" style="color:#fff;background-color:#FFD54F;border:1px solid #FFEB3B;border-radius:5px;font-weight:bold;background:linear-gradient(#ffdb69,#FFD54F);" rel="noopener">公式HPはコチラ</a></div>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Windsurf の詳細分析</h3>
<p><img loading="lazy" decoding="async" width="1706" height="453" class="alignnone wp-image-5516 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-2.jpg" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-2.jpg 1706w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-2-300x80.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-2-1024x272.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-2-768x204.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-2-1536x408.jpg 1536w" sizes="auto, (max-width: 1706px) 100vw, 1706px" /></p>
<p class="whitespace-normal break-words"><strong>概要と特徴</strong> WindsurfはCodeium社が開発したAI統合開発環境で、マルチファイル編集とプロジェクト全体の理解に優れています。Salesforce開発においては、複雑なビジネスプロセスの実装や、大規模プロジェクトの管理に特に有効です。</p>
<p class="whitespace-normal break-words"><strong>Salesforce開発における特徴</strong></p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">複数のApexクラス間の依存関係管理</li>
<li class="whitespace-normal break-words">Lightning Web Componentとバックエンドの連携設計</li>
<li class="whitespace-normal break-words">カスタムオブジェクトとコードの同期的開発</li>
<li class="whitespace-normal break-words">エンタープライズレベルのアーキテクチャ提案</li>
</ul>
<div class="cclt-compat-mybutton cclt-compat-mybutton--ref cclt-compat-mybutton--shadow"><a href="https://windsurf.com/" class="cclt-compat-mybutton__link" style="color:#fff;background-color:#FFD54F;border:1px solid #FFEB3B;border-radius:5px;font-weight:bold;background:linear-gradient(#ffdb69,#FFD54F);" rel="noopener">公式HPはコチラ</a></div>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Claude Code の詳細分析</h3>
<p><img loading="lazy" decoding="async" width="1379" height="475" class="alignnone wp-image-5517 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138.png" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138.png 1379w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-300x103.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-1024x353.png 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-138-768x265.png 768w" sizes="auto, (max-width: 1379px) 100vw, 1379px" /></p>
<p class="whitespace-normal break-words"><strong>概要と特徴</strong> Claude CodeはAnthropic製のコマンドライン型AIツールで、ターミナルから直接Claude AIを活用できます。Salesforce開発においては、複雑なロジック実装や、アーキテクチャレベルの意思決定に強みを発揮します。</p>
<p class="whitespace-normal break-words"><strong>Salesforce開発における活用シーン</strong></p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">複雑なビジネスロジックの設計相談</li>
<li class="whitespace-normal break-words">パフォーマンスチューニング戦略の策定</li>
<li class="whitespace-normal break-words">セキュリティ要件の実装方法検討</li>
<li class="whitespace-normal break-words">大規模データ移行戦略の立案</li>
</ul>
<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">AIエディタとSalesforce開発の相性</h2>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Salesforce特有の開発要素への対応</h3>
<p class="whitespace-normal break-words"><strong>Apex言語の特殊性</strong> ApexはJavaライクな構文を持ちながら、Salesforceプラットフォーム特有の制約とオブジェクトモデルを持っています。AIエディタは、標準的なJavaの知識を持つ開発者でも、Salesforce特有の書き方（sObjectの操作、SOQL埋め込み、ガバナーリミット対応など）を自然に習得できるよう支援します。</p>
<div class="relative group/copy rounded-lg">
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-apex"><span class="token">// AIエディタが提案する効率的なApexコード例</span>
<span class="token">public</span> <span class="token">class</span> <span class="token">ContactProcessor</span> <span class="token">{</span>
    <span class="token">public</span> <span class="token">static</span> <span class="token">void</span> <span class="token">updateContactsByAccount</span><span class="token">(</span><span class="token">Set</span><span class="token">&lt;</span><span class="token">Id</span><span class="token">&gt;</span> accountIds<span class="token">)</span> <span class="token">{</span>
        <span class="token">// バルク処理を意識したSOQL</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">Contact</span><span class="token">&gt;</span> contactsToUpdate <span class="token">=</span> <span class="token sql language-sql">[</span>
                      <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> AccountId</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> LastName 
</span>                      <span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Contact 
</span>                      <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> AccountId </span><span class="token sql language-sql">IN</span><span class="token sql language-sql"> :accountIds
</span>                  <span class="token sql language-sql">]</span><span class="token">;</span>
        
        <span class="token">for</span> <span class="token">(</span><span class="token">Contact</span> contact <span class="token">:</span> contactsToUpdate<span class="token">)</span> <span class="token">{</span>
            <span class="token">// ビジネスロジックをここに記述</span>
            contact<span class="token">.</span>LastModifiedById <span class="token">=</span> UserInfo<span class="token">.</span><span class="token">getUserId</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
        
        <span class="token">// DML操作もバルク処理</span>
        <span class="token">if</span> <span class="token">(</span><span class="token">!</span>contactsToUpdate<span class="token">.</span><span class="token">isEmpty</span><span class="token">(</span><span class="token">)</span><span class="token">)</span> <span class="token">{</span>
            Database<span class="token">.</span><span class="token">update</span><span class="token">(</span>contactsToUpdate<span class="token">,</span> <span class="token">false</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
    <span class="token">}</span>
<span class="token">}</span></code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>Lightning Web Componentsの複雑性</strong> LWCは、HTML、JavaScript、CSSの組み合わせに加え、Salesforce特有のデコレータやワイヤーサービスの理解が必要です。AIエディタは、これらの複雑な連携を自然な形で提案し、モダンなWeb開発の知識をSalesforceプラットフォームに適用できるよう支援します。</p>
<p class="whitespace-normal break-words"><strong>SOQL/SOSLの最適化</strong> データクエリの最適化は、Salesforce開発において極めて重要です。AIエディタは、パフォーマンスを考慮したクエリの作成、適切なインデックス活用、クエリプランの最適化などを支援します。</p>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">AIエディタによる開発効率化のポイント</h3>
<p class="whitespace-normal break-words"><strong>コンテキスト理解の向上</strong> 最新のAIエディタは、単一ファイルではなくプロジェクト全体のコンテキストを理解し、一貫性のあるコード提案を行います。これにより、Salesforceの複雑なオブジェクト関係やビジネスプロセスを考慮した開発が可能になります。</p>
<p class="whitespace-normal break-words"><strong>リアルタイムコード検証</strong> コーディング中にSalesforceのガバナーリミットやセキュリティルールをチェックし、問題のあるコードパターンを事前に警告します。これにより、デバッグ時間の大幅短縮が実現できます。</p>
<p class="whitespace-normal break-words"><strong>自動テストケース生成</strong> Salesforceでは高いテストカバレッジが求められますが、AIエディタは機能的なテストケースを自動生成し、テスト品質の向上と開発時間の短縮を両立させます。</p>
<p><img loading="lazy" decoding="async" width="2474" height="1396" class="alignnone wp-image-5519 size-full" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-139.png" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-139.png 2474w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-139-300x169.png 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-139-1024x578.png 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-139-768x433.png 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-139-1536x867.png 1536w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Pasted-139-2048x1156.png 2048w" sizes="auto, (max-width: 2474px) 100vw, 2474px" /></p>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">コード品質向上への貢献</h3>
<p class="whitespace-normal break-words"><strong>ベストプラクティスの自動適用</strong> AIエディタは、Salesforce開発のベストプラクティス（トリガーパターン、バルク処理、エラーハンドリングなど）を自動的に適用したコードを提案します。経験の浅い開発者でも、高品質なコードを作成できるようになります。</p>
<p class="whitespace-normal break-words"><strong>セキュリティ強化</strong> CRUD権限チェック、SOQL インジェクション対策、適切な共有設定など、セキュリティに関する考慮事項を自動的に組み込んだコードを生成します。</p>
<p class="whitespace-normal break-words"><strong>保守性の向上</strong> 可読性が高く、拡張しやすいコード構造を提案することで、長期的な保守性を向上させます。また、適切なコメントやドキュメンテーションも自動生成されます。</p>
<p class="whitespace-normal break-words">以下のようなコードとコメントが自動生成されるためSalesforce特有の書き方（sObjectの操作、SOQL埋め込み、ガバナーリミット対応など）を自然に習得することができます。</p>
<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">実践的なVibe Coding手法</h2>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">AIエディタを活用した具体的な開発フロー</h3>
<p class="whitespace-normal break-words"><strong>ステップ1: 要件の自然言語化</strong></p>
<p class="whitespace-normal break-words">従来の詳細設計書の代わりに、実現したい機能を自然言語で記述します。この段階では、技術的な詳細よりもビジネス価値に焦点を当てます。</p>
<div class="relative group/copy rounded-lg">
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code>例：「顧客からの問い合わせメールを受信したときに、自動的にケースを作成し、
適切な担当者にアサインし、顧客に自動返信を送信する機能を実装したい」</code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>ステップ2: AIとの対話による要件精緻化</strong></p>
<p class="whitespace-normal break-words">AIエディタとの対話を通じて、曖昧な要件を具体的な技術要件に変換します。</p>
<div class="relative group/copy rounded-lg">
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code>開発者: "メール受信時の自動ケース作成機能を実装したい"
AI: "Email-to-Caseの機能実装ですね。以下の要素が必要です：
1. インバウンドメール処理のApexクラス
2. ケース作成とアサインメントロジック
3. 自動返信のEmailテンプレート
4. エラーハンドリングとログ機能

どの部分から開始しますか？"</code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>ステップ3: 段階的な実装</strong></p>
<p class="whitespace-normal break-words">AIの提案に基づいて、機能を小さな単位に分割して段階的に実装します。</p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">apex</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-apex"><span class="token">// ステップ3-1: 基本的なメール処理クラス</span>
<span class="token">global</span> <span class="token">class</span> <span class="token">EmailToCaseHandler</span> <span class="token">implements</span> <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEmailHandler</span> <span class="token">{</span>
    <span class="token">global</span> <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEmailResult</span> <span class="token">handleInboundEmail</span><span class="token">(</span>
        <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEmail</span> email<span class="token">,</span> 
        <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEnvelope</span> envelope
    <span class="token">)</span> <span class="token">{</span>
        <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEmailResult</span> result <span class="token">=</span> <span class="token">new</span> <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEmailResult</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">try</span> <span class="token">{</span>
            <span class="token">Case</span> newCase <span class="token">=</span> <span class="token">createCaseFromEmail</span><span class="token">(</span>email<span class="token">)</span><span class="token">;</span>
            <span class="token">assignCaseToAgent</span><span class="token">(</span>newCase<span class="token">)</span><span class="token">;</span>
            <span class="token">sendAutoReply</span><span class="token">(</span>email<span class="token">.</span>fromAddress<span class="token">,</span> newCase<span class="token">.</span>CaseNumber<span class="token">)</span><span class="token">;</span>
            result<span class="token">.</span>success <span class="token">=</span> <span class="token">true</span><span class="token">;</span>
        <span class="token">}</span> <span class="token">catch</span> <span class="token">(</span><span class="token">Exception</span> e<span class="token">)</span> <span class="token">{</span>
            <span class="token">logError</span><span class="token">(</span>e<span class="token">,</span> email<span class="token">)</span><span class="token">;</span>
            result<span class="token">.</span>success <span class="token">=</span> <span class="token">false</span><span class="token">;</span>
        <span class="token">}</span>
        
        <span class="token">return</span> result<span class="token">;</span>
    <span class="token">}</span>
<span class="token">}</span></code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>ステップ4: AIによる継続的改善</strong></p>
<p class="whitespace-normal break-words">実装したコードをAIがレビューし、改善提案を行います。</p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">apex</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-apex"><span class="token">// AIが提案する改善版</span>
<span class="token">global</span> <span class="token">class</span> <span class="token">EmailToCaseHandler</span> <span class="token">implements</span> <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEmailHandler</span> <span class="token">{</span>
    <span class="token">// 設定値の外部化</span>
    <span class="token">private</span> <span class="token">static</span> <span class="token">final</span> <span class="token">EmailToCaseSettings__c</span> settings <span class="token">=</span> EmailToCaseSettings__c<span class="token">.</span><span class="token">getInstance</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
    
    <span class="token">global</span> <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEmailResult</span> <span class="token">handleInboundEmail</span><span class="token">(</span>
        <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEmail</span> email<span class="token">,</span> 
        <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEnvelope</span> envelope
    <span class="token">)</span> <span class="token">{</span>
        <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEmailResult</span> result <span class="token">=</span> <span class="token">new</span> <span class="token">Messaging</span><span class="token">.</span><span class="token">InboundEmailResult</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">try</span> <span class="token">{</span>
            <span class="token">// バリデーション追加</span>
            <span class="token">if</span> <span class="token">(</span><span class="token">!</span><span class="token">isValidEmail</span><span class="token">(</span>email<span class="token">)</span><span class="token">)</span> <span class="token">{</span>
                <span class="token">throw</span> <span class="token">new</span> <span class="token">EmailValidationException</span><span class="token">(</span><span class="token">'Invalid email format'</span><span class="token">)</span><span class="token">;</span>
            <span class="token">}</span>
            
            <span class="token">Case</span> newCase <span class="token">=</span> <span class="token">createCaseFromEmail</span><span class="token">(</span>email<span class="token">)</span><span class="token">;</span>
            <span class="token">assignCaseToAgent</span><span class="token">(</span>newCase<span class="token">)</span><span class="token">;</span>
            
            <span class="token">// 非同期での自動返信（ガバナーリミット対策）</span>
            <span class="token">System</span><span class="token">.</span><span class="token">enqueueJob</span><span class="token">(</span><span class="token">new</span> <span class="token">AutoReplyQueueable</span><span class="token">(</span>email<span class="token">.</span>fromAddress<span class="token">,</span> newCase<span class="token">.</span>CaseNumber<span class="token">)</span><span class="token">)</span><span class="token">;</span>
            
            result<span class="token">.</span>success <span class="token">=</span> <span class="token">true</span><span class="token">;</span>
        <span class="token">}</span> <span class="token">catch</span> <span class="token">(</span><span class="token">Exception</span> e<span class="token">)</span> <span class="token">{</span>
            <span class="token">logError</span><span class="token">(</span>e<span class="token">,</span> email<span class="token">)</span><span class="token">;</span>
            result<span class="token">.</span>success <span class="token">=</span> <span class="token">false</span><span class="token">;</span>
            result<span class="token">.</span>message <span class="token">=</span> <span class="token">'Error processing email: '</span> <span class="token">+</span> e<span class="token">.</span><span class="token">getMessage</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
        
        <span class="token">return</span> result<span class="token">;</span>
    <span class="token">}</span>
<span class="token">}</span></code></pre>
</div>
</div>
<h2 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">プロンプトエンジニアリングのコツ</h2>
<p class="whitespace-normal break-words"><strong>効果的なプロンプトの構造</strong></p>
<ol class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal space-y-1.5 pl-7">
<li class="whitespace-normal break-words"><strong>コンテキストの明確化</strong></li>
</ol>
<div class="relative group/copy rounded-lg">
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code>"Salesforceの本番環境で使用する、エンタープライズレベルのApexトリガーを作成してください。
ガバナーリミットとセキュリティを考慮した実装が必要です。"</code></pre>
</div>
</div>
<ol class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal space-y-1.5 pl-7" start="2">
<li class="whitespace-normal break-words"><strong>具体的な制約条件の提示</strong></li>
</ol>
<div class="relative group/copy rounded-lg">
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code>"以下の制約を満たすLightning Web Componentを作成してください：
- 10,000件以上のレコードを効率的に表示
- モバイル対応（レスポンシブデザイン）
- Lightning Design Systemに準拠
- アクセシビリティ要件（WCAG 2.1 AA）を満たす"</code></pre>
</div>
</div>
<ol class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal space-y-1.5 pl-7" start="3">
<li class="whitespace-normal break-words"><strong>期待する出力形式の指定</strong></li>
</ol>
<div class="relative group/copy rounded-lg">
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code>"以下の形式でコードを生成してください：
1. クラス全体のコード
2. 重要な部分の解説コメント
3. 使用方法の例
4. テストクラスの実装
5. 注意点とベストプラクティス"</code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>反復的改善のためのプロンプト例</strong></p>
<div class="relative group/copy rounded-lg">
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code>"先ほど生成したApexクラスを以下の観点で改善してください：
1. パフォーマンス最適化（特にSOQL実行回数の削減）
2. エラーハンドリングの強化
3. ログ出力の改善
4. コードの可読性向上
5. 単体テストカバレッジの向上"</code></pre>
</div>
</div>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">ベストプラクティス</h3>
<p class="whitespace-normal break-words"><strong>1. 段階的な開発アプローチ</strong> 一度に完璧なコードを求めるのではなく、動作する最小限の実装から始めて、段階的に機能を追加していきます。</p>
<p class="whitespace-normal break-words"><strong>2. AIの提案の検証</strong> AIが生成したコードは必ず動作確認を行い、Salesforceの制約やセキュリティ要件を満たしているかチェックします。</p>
<p class="whitespace-normal break-words"><strong>3. チーム知識の共有</strong> 効果的だったプロンプトや手法は、チーム内で共有し、組織全体のVibe Coding能力を向上させます。</p>
<p class="whitespace-normal break-words"><strong>4. 継続的学習</strong> AIエディタの新機能や改善されたプロンプト技術を継続的に学習し、開発手法をアップデートしていきます。</p>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Salesofrceの開発に関するユースケース</h3>
<div class="cclt-compat-card st-no-shadow cclt-compat-card--text"><span class="cclt-compat-card__label" style="background-color:#cccccc;color:#ffffff;">参考</span><a href="https://creativecontentlabtokyo.com/development-use-case-vibe-coding/" class="cclt-compat-card__link"><div class="cclt-compat-card__thumb"><img decoding="async" width="300" height="169" src="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-vibe-coding-ユースケース-300x169.jpg" class="attachment-medium size-medium wp-post-image" alt="" loading="lazy" srcset="https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-vibe-coding-ユースケース-300x169.jpg 300w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-vibe-coding-ユースケース-1024x576.jpg 1024w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-vibe-coding-ユースケース-768x432.jpg 768w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-vibe-coding-ユースケース-1536x864.jpg 1536w, https://creativecontentlabtokyo.com/wp-content/uploads/2025/06/Salesforce-vibe-coding-ユースケース.jpg 1920w" sizes="auto, (max-width: 300px) 100vw, 300px" /></div><div class="cclt-compat-card__body"><div class="cclt-compat-card__title">AIエディタを使ったVibe codingの実際の開発事例（ユースケース）</div><div class="cclt-compat-card__excerpt">ここで挙げた事例を実際に手を動かして進める手順は、AIエディタを使った Vibe…</div><span class="cclt-compat-card__readmore">続きを読む</span></div></a></div>
<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">まとめ</h2>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Vibe Codingがもたらす開発パラダイムの変化</h3>
<p class="whitespace-normal break-words">AIエディタを活用したVibe Codingは、Salesforce開発において従来の課題を大幅に解決し、新しい開発体験を提供しています。詳細な設計書に依存した開発から、直感的で創造的な開発へのシフトが可能になり、開発者はより高次元のビジネス価値創出に集中できるようになります。</p>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">技術トレンドとの統合</h3>
<p class="whitespace-normal break-words"><strong>ローコード・ノーコード開発との融合</strong> AIエディタによるVibe Codingは、Salesforceのローコード・ノーコード機能と相互補完的な関係にあります。Flow Builder、Process Builder、Lightning App Builderなどの宣言的開発ツールとAIエディタを組み合わせることで、より柔軟で強力な開発環境が実現できます。</p>
<p class="whitespace-normal break-words"><strong>DevOpsとの統合</strong> CI/CDパイプライン、自動テスト、デプロイメント自動化などのDevOpsプラクティスとAIエディタを統合することで、コード生成から本番環境への展開まで一貫した自動化が可能になります。</p>
<p class="whitespace-normal break-words"><strong>アジャイル開発手法との親和性</strong> Vibe Codingの反復的で柔軟なアプローチは、アジャイル開発やスクラム手法と非常に相性が良く、スプリント内での迅速な機能開発と改善が可能になります。</p>
<h2 class="whitespace-normal break-words">続き</h2>
<p>本記事では、AIエディタやVibe codingについての用語や概念について説明してきました。AIエディタの種類やそれぞれの特徴についても理解いただけたと思います。</p>
<p>環境構築については、別の記事で紹介したいと思います。</p>
<div class="cclt-compat-kaiwa cclt-compat-kaiwa--left"><div class="cclt-compat-kaiwa__icon"><img decoding="async" src="https://creativecontentlabtokyo.com/wp-content/uploads/2024/11/schooldays1.jpg" alt="サポーターさん" loading="lazy" /><span class="cclt-compat-kaiwa__name">サポーターさん</span></div><div class="cclt-compat-kaiwa__bubble" style="background-color:#f4f4e3;"><div class="cclt-compat-kaiwa__text">実際に環境を構築して、AIエディタを利用できるようにしていきましょう。</div></div></div>
<p>&nbsp;</p>
<h2>関連記事</h2>
<div class="cclt-compat-catgroup"><ul class="cclt-compat-catgroup__list"><li class="cclt-compat-catgroup__item"><a href="https://creativecontentlabtokyo.com/ai-salesforce-development-scope/" class="cclt-compat-catgroup__link"><div class="cclt-compat-catgroup__thumb"><img decoding="async" width="150" height="150" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/11/ai-salesforce-development-scope-eyecatch-150x150.webp" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" /></div><div class="cclt-compat-catgroup__info"><span class="cclt-compat-catgroup__title">Salesforce開発でAIに任せられる範囲｜設定とコードの線引き</span><time class="cclt-compat-catgroup__date" datetime="2026-11-01T14:01:04+09:00">2026年11月1日</time></div></a></li><li class="cclt-compat-catgroup__item"><a href="https://creativecontentlabtokyo.com/ai-parallel-development/" class="cclt-compat-catgroup__link"><div class="cclt-compat-catgroup__thumb"><img decoding="async" width="150" height="150" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/10/ai-parallel-development-eyecatch-1-150x150.webp" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" /></div><div class="cclt-compat-catgroup__info"><span class="cclt-compat-catgroup__title">AIの開発作業を複数同時に走らせる方法｜事故を防ぐ設定と管制塔の回し方</span><time class="cclt-compat-catgroup__date" datetime="2026-10-31T15:35:21+09:00">2026年10月31日</time></div></a></li><li class="cclt-compat-catgroup__item"><a href="https://creativecontentlabtokyo.com/ai-delegation-first-step/" class="cclt-compat-catgroup__link"><div class="cclt-compat-catgroup__thumb"><img decoding="async" width="150" height="150" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/10/ai-delegation-first-step-eyecatch-v2-1-150x150.webp" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" /></div><div class="cclt-compat-catgroup__info"><span class="cclt-compat-catgroup__title">最初の1件を任せるまで｜AIに開発を任せる入門の手順</span><time class="cclt-compat-catgroup__date" datetime="2026-10-31T15:35:19+09:00">2026年10月31日</time></div></a></li><li class="cclt-compat-catgroup__item"><a href="https://creativecontentlabtokyo.com/ai-delegation-what-to-delegate/" class="cclt-compat-catgroup__link"><div class="cclt-compat-catgroup__thumb"><img decoding="async" width="150" height="150" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/10/ai-delegation-what-to-delegate-eyecatch-1-150x150.webp" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" /></div><div class="cclt-compat-catgroup__info"><span class="cclt-compat-catgroup__title">AIに何を任せ、何を任せないか｜やり直しが効くかで決める判断基準</span><time class="cclt-compat-catgroup__date" datetime="2026-10-31T15:35:16+09:00">2026年10月31日</time></div></a></li><li class="cclt-compat-catgroup__item"><a href="https://creativecontentlabtokyo.com/system-design-document-template-list/" class="cclt-compat-catgroup__link"><div class="cclt-compat-catgroup__thumb"><img decoding="async" width="150" height="150" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/09/design-docs-hub-eyecatch-1-150x150.webp" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" /></div><div class="cclt-compat-catgroup__info"><span class="cclt-compat-catgroup__title">システム設計書のテンプレート一覧｜基本設計・詳細設計の成果物とExcelサンプル</span><time class="cclt-compat-catgroup__date" datetime="2026-09-09T17:46:14+09:00">2026年9月9日</time></div></a></li></ul></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AIエディタを使ったVibe codingの実際の開発事例（ユースケース）</title>
		<link>https://creativecontentlabtokyo.com/development-use-case-vibe-coding/</link>
		
		<dc:creator><![CDATA[セールスフォース標準化推進ラボ]]></dc:creator>
		<pubDate>Sun, 22 Jun 2025 05:14:11 +0000</pubDate>
				<category><![CDATA[AI駆動開発]]></category>
		<category><![CDATA[AIエディタ]]></category>
		<category><![CDATA[Apex]]></category>
		<category><![CDATA[LWC]]></category>
		<category><![CDATA[Vibe coding]]></category>
		<category><![CDATA[コーディング]]></category>
		<category><![CDATA[ユースケース]]></category>
		<category><![CDATA[生成AI]]></category>
		<guid isPermaLink="false">https://creativecontentlabtokyo.com/?p=5524</guid>

					<description><![CDATA[ここで挙げた事例を実際に手を動かして進める手順は、AIエディタを使った Vibe Coding での開発手順でまとめています。 AIエディタを使ったVibe c…]]></description>
										<content:encoded><![CDATA[<p>ここで挙げた事例を実際に手を動かして進める手順は、<a href="/develop-salesforce-with-vibe-cording-using-ai-editor/">AIエディタを使った Vibe Coding での開発手順</a>でまとめています。</p>
<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">AIエディタを使ったVibe codingの実際の開発事例（ユースケース）</h2>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Lightning Web Componentの開発例</h3>
<p class="whitespace-normal break-words"><strong>要件：顧客管理ダッシュボードの作成</strong></p>
<p class="whitespace-normal break-words">自然言語での要求：</p>
<div class="relative group/copy rounded-lg">
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code>"取引先の情報を表示し、関連する商談と取引先責任者を
タブ形式で切り替えて表示できるダッシュボードコンポーネントを作成したい。
リアルタイムでデータを更新し、Excel出力機能も必要。"</code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>AIエディタによる段階的実装</strong></p>
<p class="whitespace-normal break-words"><strong>ステップ1: 基本構造の生成</strong></p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">html</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-html"><span class="token">&lt;!-- accountDashboard.html --&gt;</span>
<span class="token">&lt;</span><span class="token">template</span><span class="token">&gt;</span>
    <span class="token">&lt;</span><span class="token">lightning-card</span> <span class="token">title</span><span class="token">=</span><span class="token">"</span><span class="token">顧客管理ダッシュボード</span><span class="token">"</span> <span class="token">icon-name</span><span class="token">=</span><span class="token">"</span><span class="token">standard:account</span><span class="token">"</span><span class="token">&gt;</span>
        <span class="token">&lt;</span><span class="token">div</span> <span class="token">slot</span><span class="token">=</span><span class="token">"</span><span class="token">actions</span><span class="token">"</span><span class="token">&gt;</span>
            <span class="token">&lt;</span><span class="token">lightning-button</span> 
                <span class="token">label</span><span class="token">=</span><span class="token">"</span><span class="token">Excel出力</span><span class="token">"</span> 
                <span class="token special-attr">onclick</span><span class="token special-attr">=</span><span class="token special-attr javascript language-javascript">{</span><span class="token special-attr javascript language-javascript">exportToExcel</span><span class="token special-attr javascript language-javascript">}</span>
                <span class="token">variant</span><span class="token">=</span><span class="token">"</span><span class="token">brand</span><span class="token">"</span><span class="token">&gt;</span>
            <span class="token">&lt;/</span><span class="token">lightning-button</span><span class="token">&gt;</span>
        <span class="token">&lt;/</span><span class="token">div</span><span class="token">&gt;</span>
        
        <span class="token">&lt;</span><span class="token">lightning-tabset</span><span class="token">&gt;</span>
            <span class="token">&lt;</span><span class="token">lightning-tab</span> <span class="token">label</span><span class="token">=</span><span class="token">"</span><span class="token">取引先情報</span><span class="token">"</span> <span class="token">value</span><span class="token">=</span><span class="token">"</span><span class="token">account</span><span class="token">"</span><span class="token">&gt;</span>
                <span class="token">&lt;</span><span class="token">c-account-detail</span> <span class="token">account-id</span><span class="token">=</span><span class="token">{accountId}</span><span class="token">&gt;</span><span class="token">&lt;/</span><span class="token">c-account-detail</span><span class="token">&gt;</span>
            <span class="token">&lt;/</span><span class="token">lightning-tab</span><span class="token">&gt;</span>
            
            <span class="token">&lt;</span><span class="token">lightning-tab</span> <span class="token">label</span><span class="token">=</span><span class="token">"</span><span class="token">商談</span><span class="token">"</span> <span class="token">value</span><span class="token">=</span><span class="token">"</span><span class="token">opportunities</span><span class="token">"</span><span class="token">&gt;</span>
                <span class="token">&lt;</span><span class="token">c-opportunity-list</span> <span class="token">account-id</span><span class="token">=</span><span class="token">{accountId}</span><span class="token">&gt;</span><span class="token">&lt;/</span><span class="token">c-opportunity-list</span><span class="token">&gt;</span>
            <span class="token">&lt;/</span><span class="token">lightning-tab</span><span class="token">&gt;</span>
            
            <span class="token">&lt;</span><span class="token">lightning-tab</span> <span class="token">label</span><span class="token">=</span><span class="token">"</span><span class="token">取引先責任者</span><span class="token">"</span> <span class="token">value</span><span class="token">=</span><span class="token">"</span><span class="token">contacts</span><span class="token">"</span><span class="token">&gt;</span>
                <span class="token">&lt;</span><span class="token">c-contact-list</span> <span class="token">account-id</span><span class="token">=</span><span class="token">{accountId}</span><span class="token">&gt;</span><span class="token">&lt;/</span><span class="token">c-contact-list</span><span class="token">&gt;</span>
            <span class="token">&lt;/</span><span class="token">lightning-tab</span><span class="token">&gt;</span>
        <span class="token">&lt;/</span><span class="token">lightning-tabset</span><span class="token">&gt;</span>
    <span class="token">&lt;/</span><span class="token">lightning-card</span><span class="token">&gt;</span>
<span class="token">&lt;/</span><span class="token">template</span><span class="token">&gt;</span></code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>ステップ2: JavaScriptコントローラーの実装</strong></p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">javascript</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-javascript"><span class="token">// accountDashboard.js</span>
<span class="token module">import</span> <span class="token imports">{</span> <span class="token imports maybe-class-name">LightningElement</span><span class="token imports">,</span><span class="token imports"> api</span><span class="token imports">,</span><span class="token imports"> wire</span><span class="token imports">,</span><span class="token imports"> track </span><span class="token imports">}</span> <span class="token module">from</span> <span class="token">'lwc'</span><span class="token">;</span>
<span class="token module">import</span> <span class="token imports">{</span><span class="token imports"> refreshApex </span><span class="token imports">}</span> <span class="token module">from</span> <span class="token">'@salesforce/apex'</span><span class="token">;</span>
<span class="token module">import</span> <span class="token imports">getAccountData</span> <span class="token module">from</span> <span class="token">'@salesforce/apex/AccountDashboardController.getAccountData'</span><span class="token">;</span>
<span class="token module">import</span> <span class="token imports">exportAccountData</span> <span class="token module">from</span> <span class="token">'@salesforce/apex/AccountDashboardController.exportAccountData'</span><span class="token">;</span>
<span class="token module">import</span> <span class="token imports">{</span> <span class="token imports maybe-class-name">ShowToastEvent</span> <span class="token imports">}</span> <span class="token module">from</span> <span class="token">'lightning/platformShowToastEvent'</span><span class="token">;</span>

<span class="token module">export</span> <span class="token module">default</span> <span class="token">class</span> <span class="token">AccountDashboard</span> <span class="token">extends</span> <span class="token">LightningElement</span> <span class="token">{</span>
    @api accountId<span class="token">;</span>
    @track accountData<span class="token">;</span>
    wiredAccountData<span class="token">;</span>

    @<span class="token">wire</span><span class="token">(</span>getAccountData<span class="token">,</span> <span class="token">{</span> <span class="token literal-property">accountId</span><span class="token">:</span> <span class="token">'$accountId'</span> <span class="token">}</span><span class="token">)</span>
    <span class="token">wireAccountData</span><span class="token">(</span><span class="token parameter">result</span><span class="token">)</span> <span class="token">{</span>
        <span class="token">this</span><span class="token">.</span><span class="token property-access">wiredAccountData</span> <span class="token">=</span> result<span class="token">;</span>
        <span class="token control-flow">if</span> <span class="token">(</span>result<span class="token">.</span><span class="token property-access">data</span><span class="token">)</span> <span class="token">{</span>
            <span class="token">this</span><span class="token">.</span><span class="token property-access">accountData</span> <span class="token">=</span> result<span class="token">.</span><span class="token property-access">data</span><span class="token">;</span>
        <span class="token">}</span> <span class="token control-flow">else</span> <span class="token control-flow">if</span> <span class="token">(</span>result<span class="token">.</span><span class="token property-access">error</span><span class="token">)</span> <span class="token">{</span>
            <span class="token">this</span><span class="token">.</span><span class="token method property-access">showToast</span><span class="token">(</span><span class="token">'エラー'</span><span class="token">,</span> result<span class="token">.</span><span class="token property-access">error</span><span class="token">.</span><span class="token property-access">body</span><span class="token">.</span><span class="token property-access">message</span><span class="token">,</span> <span class="token">'error'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
    <span class="token">}</span>

    <span class="token">async</span> <span class="token">handleRefresh</span><span class="token">(</span><span class="token">)</span> <span class="token">{</span>
        <span class="token control-flow">try</span> <span class="token">{</span>
            <span class="token control-flow">await</span> <span class="token">refreshApex</span><span class="token">(</span><span class="token">this</span><span class="token">.</span><span class="token property-access">wiredAccountData</span><span class="token">)</span><span class="token">;</span>
            <span class="token">this</span><span class="token">.</span><span class="token method property-access">showToast</span><span class="token">(</span><span class="token">'成功'</span><span class="token">,</span> <span class="token">'データが更新されました'</span><span class="token">,</span> <span class="token">'success'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span> <span class="token control-flow">catch</span> <span class="token">(</span>error<span class="token">)</span> <span class="token">{</span>
            <span class="token">this</span><span class="token">.</span><span class="token method property-access">showToast</span><span class="token">(</span><span class="token">'エラー'</span><span class="token">,</span> <span class="token">'データの更新に失敗しました'</span><span class="token">,</span> <span class="token">'error'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
    <span class="token">}</span>

    <span class="token">async</span> <span class="token">exportToExcel</span><span class="token">(</span><span class="token">)</span> <span class="token">{</span>
        <span class="token control-flow">try</span> <span class="token">{</span>
            <span class="token">const</span> result <span class="token">=</span> <span class="token control-flow">await</span> <span class="token">exportAccountData</span><span class="token">(</span><span class="token">{</span> <span class="token literal-property">accountId</span><span class="token">:</span> <span class="token">this</span><span class="token">.</span><span class="token property-access">accountId</span> <span class="token">}</span><span class="token">)</span><span class="token">;</span>
            <span class="token">// ファイルダウンロード処理</span>
            <span class="token">const</span> link <span class="token">=</span> <span class="token dom">document</span><span class="token">.</span><span class="token method property-access">createElement</span><span class="token">(</span><span class="token">'a'</span><span class="token">)</span><span class="token">;</span>
            link<span class="token">.</span><span class="token property-access">href</span> <span class="token">=</span> <span class="token">'data:application/vnd.ms-excel;base64,'</span> <span class="token">+</span> result<span class="token">;</span>
            link<span class="token">.</span><span class="token property-access">download</span> <span class="token">=</span> <span class="token template-string template-punctuation">`</span><span class="token template-string">account_</span><span class="token template-string interpolation">${</span><span class="token template-string interpolation">this</span><span class="token template-string interpolation">.</span><span class="token template-string interpolation property-access">accountId</span><span class="token template-string interpolation">}</span><span class="token template-string">_data.xlsx</span><span class="token template-string template-punctuation">`</span><span class="token">;</span>
            link<span class="token">.</span><span class="token method property-access">click</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
            
            <span class="token">this</span><span class="token">.</span><span class="token method property-access">showToast</span><span class="token">(</span><span class="token">'成功'</span><span class="token">,</span> <span class="token">'Excelファイルをダウンロードしました'</span><span class="token">,</span> <span class="token">'success'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span> <span class="token control-flow">catch</span> <span class="token">(</span>error<span class="token">)</span> <span class="token">{</span>
            <span class="token">this</span><span class="token">.</span><span class="token method property-access">showToast</span><span class="token">(</span><span class="token">'エラー'</span><span class="token">,</span> <span class="token">'Excel出力に失敗しました'</span><span class="token">,</span> <span class="token">'error'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
    <span class="token">}</span>

    <span class="token">showToast</span><span class="token">(</span><span class="token parameter">title</span><span class="token parameter">,</span><span class="token parameter"> message</span><span class="token parameter">,</span><span class="token parameter"> variant</span><span class="token">)</span> <span class="token">{</span>
        <span class="token">this</span><span class="token">.</span><span class="token method property-access">dispatchEvent</span><span class="token">(</span><span class="token">new</span> <span class="token">ShowToastEvent</span><span class="token">(</span><span class="token">{</span>
            <span class="token literal-property">title</span><span class="token">:</span> title<span class="token">,</span>
            <span class="token literal-property">message</span><span class="token">:</span> message<span class="token">,</span>
            <span class="token literal-property">variant</span><span class="token">:</span> variant
        <span class="token">}</span><span class="token">)</span><span class="token">)</span><span class="token">;</span>
    <span class="token">}</span>
<span class="token">}</span></code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>ステップ3: Apexコントローラーの実装</strong></p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">apex</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-apex"><span class="token">public</span> <span class="token">with sharing</span> <span class="token">class</span> <span class="token">AccountDashboardController</span> <span class="token">{</span>
    
    <span class="token annotation">@AuraEnabled</span><span class="token">(</span>cacheable<span class="token">=</span><span class="token">true</span><span class="token">)</span>
    <span class="token">public</span> <span class="token">static</span> <span class="token">AccountDataWrapper</span> <span class="token">getAccountData</span><span class="token">(</span><span class="token">Id</span> accountId<span class="token">)</span> <span class="token">{</span>
        <span class="token">try</span> <span class="token">{</span>
            <span class="token">if</span> <span class="token">(</span><span class="token">!</span>Schema<span class="token">.</span>sObjectType<span class="token">.</span>Account<span class="token">.</span><span class="token">isAccessible</span><span class="token">(</span><span class="token">)</span><span class="token">)</span> <span class="token">{</span>
                <span class="token">throw</span> <span class="token">new</span> <span class="token">AuraHandledException</span><span class="token">(</span><span class="token">'取引先への読み取り権限がありません'</span><span class="token">)</span><span class="token">;</span>
            <span class="token">}</span>

            <span class="token">Account</span> account <span class="token">=</span> <span class="token sql language-sql">[</span>
                <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Name</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> BillingAddress</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Phone</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Website</span><span class="token sql language-sql">,</span> 
<span class="token sql language-sql">                       AnnualRevenue</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> NumberOfEmployees</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Industry
</span>                <span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Account 
</span>                <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">=</span><span class="token sql language-sql"> :accountId 
</span>                <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">1</span>
            <span class="token sql language-sql">]</span><span class="token">;</span>

            <span class="token">List</span><span class="token">&lt;</span><span class="token">Opportunity</span><span class="token">&gt;</span> opportunities <span class="token">=</span> <span class="token sql language-sql">[</span>
                <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Name</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> StageName</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Amount</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> CloseDate
</span>                <span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Opportunity 
</span>                <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> AccountId </span><span class="token sql language-sql">=</span><span class="token sql language-sql"> :accountId 
</span>                <span class="token sql language-sql">ORDER</span> <span class="token sql language-sql">BY</span><span class="token sql language-sql"> CloseDate </span><span class="token sql language-sql">DESC</span>
                <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">10</span>
            <span class="token sql language-sql">]</span><span class="token">;</span>

            <span class="token">List</span><span class="token">&lt;</span><span class="token">Contact</span><span class="token">&gt;</span> contacts <span class="token">=</span> <span class="token sql language-sql">[</span>
                <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Name</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Email</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Phone</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Title
</span>                <span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Contact 
</span>                <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> AccountId </span><span class="token sql language-sql">=</span><span class="token sql language-sql"> :accountId 
</span>                <span class="token sql language-sql">ORDER</span> <span class="token sql language-sql">BY</span><span class="token sql language-sql"> LastModifiedDate </span><span class="token sql language-sql">DESC</span>
                <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">20</span>
            <span class="token sql language-sql">]</span><span class="token">;</span>

            <span class="token">return</span> <span class="token">new</span> <span class="token">AccountDataWrapper</span><span class="token">(</span>account<span class="token">,</span> opportunities<span class="token">,</span> contacts<span class="token">)</span><span class="token">;</span>
            
        <span class="token">}</span> <span class="token">catch</span> <span class="token">(</span><span class="token">Exception</span> e<span class="token">)</span> <span class="token">{</span>
            <span class="token">throw</span> <span class="token">new</span> <span class="token">AuraHandledException</span><span class="token">(</span><span class="token">'データの取得に失敗しました: '</span> <span class="token">+</span> e<span class="token">.</span><span class="token">getMessage</span><span class="token">(</span><span class="token">)</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
    <span class="token">}</span>

    <span class="token annotation">@AuraEnabled</span>
    <span class="token">public</span> <span class="token">static</span> <span class="token">String</span> <span class="token">exportAccountData</span><span class="token">(</span><span class="token">Id</span> accountId<span class="token">)</span> <span class="token">{</span>
        <span class="token">try</span> <span class="token">{</span>
            <span class="token">AccountDataWrapper</span> data <span class="token">=</span> <span class="token">getAccountData</span><span class="token">(</span>accountId<span class="token">)</span><span class="token">;</span>
            
            <span class="token">// Excel生成ロジック（簡略化）</span>
            <span class="token">String</span> csvData <span class="token">=</span> <span class="token">generateCSVData</span><span class="token">(</span>data<span class="token">)</span><span class="token">;</span>
            <span class="token">return</span> EncodingUtil<span class="token">.</span><span class="token">base64Encode</span><span class="token">(</span><span class="token">Blob</span><span class="token">.</span><span class="token">valueOf</span><span class="token">(</span>csvData<span class="token">)</span><span class="token">)</span><span class="token">;</span>
            
        <span class="token">}</span> <span class="token">catch</span> <span class="token">(</span><span class="token">Exception</span> e<span class="token">)</span> <span class="token">{</span>
            <span class="token">throw</span> <span class="token">new</span> <span class="token">AuraHandledException</span><span class="token">(</span><span class="token">'Excel出力に失敗しました: '</span> <span class="token">+</span> e<span class="token">.</span><span class="token">getMessage</span><span class="token">(</span><span class="token">)</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
    <span class="token">}</span>

    <span class="token">private</span> <span class="token">static</span> <span class="token">String</span> <span class="token">generateCSVData</span><span class="token">(</span><span class="token">AccountDataWrapper</span> data<span class="token">)</span> <span class="token">{</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">String</span><span class="token">&gt;</span> csvLines <span class="token">=</span> <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">String</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// ヘッダー</span>
        csvLines<span class="token">.</span><span class="token">add</span><span class="token">(</span><span class="token">'タイプ,名前,ステージ/タイトル,金額/メール,完了日/電話'</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 取引先データ</span>
        csvLines<span class="token">.</span><span class="token">add</span><span class="token">(</span><span class="token">String</span><span class="token">.</span><span class="token">format</span><span class="token">(</span><span class="token">'取引先,{0},{1},{2},{3}'</span><span class="token">,</span> 
            <span class="token">new</span> <span class="token">String</span><span class="token">[</span><span class="token">]</span><span class="token">{</span>
                data<span class="token">.</span>account<span class="token">.</span>Name<span class="token">,</span>
                data<span class="token">.</span>account<span class="token">.</span>Industry<span class="token">,</span>
                <span class="token">String</span><span class="token">.</span><span class="token">valueOf</span><span class="token">(</span>data<span class="token">.</span>account<span class="token">.</span>AnnualRevenue<span class="token">)</span><span class="token">,</span>
                data<span class="token">.</span>account<span class="token">.</span>Phone
            <span class="token">}</span><span class="token">)</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 商談データ</span>
        <span class="token">for</span> <span class="token">(</span><span class="token">Opportunity</span> opp <span class="token">:</span> data<span class="token">.</span>opportunities<span class="token">)</span> <span class="token">{</span>
            csvLines<span class="token">.</span><span class="token">add</span><span class="token">(</span><span class="token">String</span><span class="token">.</span><span class="token">format</span><span class="token">(</span><span class="token">'商談,{0},{1},{2},{3}'</span><span class="token">,</span> 
                <span class="token">new</span> <span class="token">String</span><span class="token">[</span><span class="token">]</span><span class="token">{</span>
                    opp<span class="token">.</span>Name<span class="token">,</span>
                    opp<span class="token">.</span>StageName<span class="token">,</span>
                    <span class="token">String</span><span class="token">.</span><span class="token">valueOf</span><span class="token">(</span>opp<span class="token">.</span>Amount<span class="token">)</span><span class="token">,</span>
                    <span class="token">String</span><span class="token">.</span><span class="token">valueOf</span><span class="token">(</span>opp<span class="token">.</span>CloseDate<span class="token">)</span>
                <span class="token">}</span><span class="token">)</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
        
        <span class="token">return</span> <span class="token">String</span><span class="token">.</span><span class="token">join</span><span class="token">(</span>csvLines<span class="token">,</span> <span class="token">'n'</span><span class="token">)</span><span class="token">;</span>
    <span class="token">}</span>

    <span class="token">public</span> <span class="token">class</span> <span class="token">AccountDataWrapper</span> <span class="token">{</span>
        <span class="token annotation">@AuraEnabled</span> <span class="token">public</span> <span class="token">Account</span> account <span class="token">{</span> <span class="token">get</span><span class="token">;</span> <span class="token">set</span><span class="token">;</span> <span class="token">}</span>
        <span class="token annotation">@AuraEnabled</span> <span class="token">public</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Opportunity</span><span class="token">&gt;</span> opportunities <span class="token">{</span> <span class="token">get</span><span class="token">;</span> <span class="token">set</span><span class="token">;</span> <span class="token">}</span>
        <span class="token annotation">@AuraEnabled</span> <span class="token">public</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Contact</span><span class="token">&gt;</span> contacts <span class="token">{</span> <span class="token">get</span><span class="token">;</span> <span class="token">set</span><span class="token">;</span> <span class="token">}</span>
        
        <span class="token">public</span> <span class="token">AccountDataWrapper</span><span class="token">(</span><span class="token">Account</span> acc<span class="token">,</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Opportunity</span><span class="token">&gt;</span> opps<span class="token">,</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Contact</span><span class="token">&gt;</span> cons<span class="token">)</span> <span class="token">{</span>
            <span class="token">this</span><span class="token">.</span>account <span class="token">=</span> acc<span class="token">;</span>
            <span class="token">this</span><span class="token">.</span>opportunities <span class="token">=</span> opps<span class="token">;</span>
            <span class="token">this</span><span class="token">.</span>contacts <span class="token">=</span> cons<span class="token">;</span>
        <span class="token">}</span>
    <span class="token">}</span>
<span class="token">}</span></code></pre>
</div>
</div>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">Apex クラスの実装例</h3>
<p class="whitespace-normal break-words"><strong>要件：複雑な承認プロセスの自動化</strong></p>
<p class="whitespace-normal break-words">自然言語での要求：</p>
<div class="relative group/copy rounded-lg">
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code>"商談の金額に応じて、異なる承認者ルートを自動設定し、
承認状況をリアルタイムで追跡できるシステムを実装したい。
承認者の不在時は代理承認者に自動エスカレーションする機能も必要。"</code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>AIエディタによる実装</strong></p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">apex</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-apex"><span class="token">public</span> <span class="token">class</span> <span class="token">OpportunityApprovalManager</span> <span class="token">{</span>
    
    <span class="token">// 承認ルール設定</span>
    <span class="token">private</span> <span class="token">static</span> <span class="token">final</span> <span class="token">Map</span><span class="token">&lt;</span><span class="token">Decimal</span><span class="token">,</span> <span class="token">String</span><span class="token">&gt;</span> APPROVAL_RULES <span class="token">=</span> <span class="token">new</span> <span class="token">Map</span><span class="token">&lt;</span><span class="token">Decimal</span><span class="token">,</span> <span class="token">String</span><span class="token">&gt;</span><span class="token">{</span>
        <span class="token">100000</span> <span class="token">=</span><span class="token">&gt;</span> <span class="token">'MANAGER_APPROVAL'</span><span class="token">,</span>
        <span class="token">500000</span> <span class="token">=</span><span class="token">&gt;</span> <span class="token">'DIRECTOR_APPROVAL'</span><span class="token">,</span>
        <span class="token">1000000</span> <span class="token">=</span><span class="token">&gt;</span> <span class="token">'VP_APPROVAL'</span><span class="token">,</span>
        <span class="token">5000000</span> <span class="token">=</span><span class="token">&gt;</span> <span class="token">'EXECUTIVE_APPROVAL'</span>
    <span class="token">}</span><span class="token">;</span>
    
    <span class="token annotation">@InvocableMethod</span><span class="token">(</span>label<span class="token">=</span><span class="token">'承認プロセス開始'</span><span class="token">)</span>
    <span class="token">public</span> <span class="token">static</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">ApprovalResult</span><span class="token">&gt;</span> <span class="token">initiateApprovalProcess</span><span class="token">(</span><span class="token">List</span><span class="token">&lt;</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span> requests<span class="token">)</span> <span class="token">{</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">ApprovalResult</span><span class="token">&gt;</span> results <span class="token">=</span> <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">ApprovalResult</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">for</span> <span class="token">(</span><span class="token">ApprovalRequest</span> request <span class="token">:</span> requests<span class="token">)</span> <span class="token">{</span>
            <span class="token">try</span> <span class="token">{</span>
                <span class="token">ApprovalResult</span> result <span class="token">=</span> <span class="token">processOpportunityApproval</span><span class="token">(</span>request<span class="token">.</span>opportunityId<span class="token">)</span><span class="token">;</span>
                results<span class="token">.</span><span class="token">add</span><span class="token">(</span>result<span class="token">)</span><span class="token">;</span>
            <span class="token">}</span> <span class="token">catch</span> <span class="token">(</span><span class="token">Exception</span> e<span class="token">)</span> <span class="token">{</span>
                <span class="token">ApprovalResult</span> errorResult <span class="token">=</span> <span class="token">new</span> <span class="token">ApprovalResult</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
                errorResult<span class="token">.</span>success <span class="token">=</span> <span class="token">false</span><span class="token">;</span>
                errorResult<span class="token">.</span>message <span class="token">=</span> <span class="token">'エラー: '</span> <span class="token">+</span> e<span class="token">.</span><span class="token">getMessage</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
                errorResult<span class="token">.</span>opportunityId <span class="token">=</span> request<span class="token">.</span>opportunityId<span class="token">;</span>
                results<span class="token">.</span><span class="token">add</span><span class="token">(</span>errorResult<span class="token">)</span><span class="token">;</span>
            <span class="token">}</span>
        <span class="token">}</span>
        
        <span class="token">return</span> results<span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token">private</span> <span class="token">static</span> <span class="token">ApprovalResult</span> <span class="token">processOpportunityApproval</span><span class="token">(</span><span class="token">Id</span> opportunityId<span class="token">)</span> <span class="token">{</span>
        <span class="token">// 商談データの取得</span>
        <span class="token">Opportunity</span> opp <span class="token">=</span> <span class="token sql language-sql">[</span>
            <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Name</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Amount</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> OwnerId</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> StageName</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Account</span><span class="token sql language-sql">.</span><span class="token sql language-sql">OwnerId
</span>            <span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Opportunity 
</span>            <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">=</span><span class="token sql language-sql"> :opportunityId 
</span>            <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">1</span>
        <span class="token sql language-sql">]</span><span class="token">;</span>
        
        <span class="token">// 承認レベルの決定</span>
        <span class="token">String</span> approvalLevel <span class="token">=</span> <span class="token">determineApprovalLevel</span><span class="token">(</span>opp<span class="token">.</span>Amount<span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 承認者の特定</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">Id</span><span class="token">&gt;</span> approvers <span class="token">=</span> <span class="token">getApprovers</span><span class="token">(</span>opp<span class="token">,</span> approvalLevel<span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 承認プロセスの作成</span>
        <span class="token">Approval</span><span class="token">.</span><span class="token">ProcessSubmitRequest</span> req <span class="token">=</span> <span class="token">new</span> <span class="token">Approval</span><span class="token">.</span><span class="token">ProcessSubmitRequest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        req<span class="token">.</span><span class="token">setComments</span><span class="token">(</span><span class="token">'システムによる自動承認申請'</span><span class="token">)</span><span class="token">;</span>
        req<span class="token">.</span><span class="token">setObjectId</span><span class="token">(</span>opportunityId<span class="token">)</span><span class="token">;</span>
        req<span class="token">.</span><span class="token">setSubmitterId</span><span class="token">(</span>UserInfo<span class="token">.</span><span class="token">getUserId</span><span class="token">(</span><span class="token">)</span><span class="token">)</span><span class="token">;</span>
        req<span class="token">.</span><span class="token">setProcessDefinitionNameOrId</span><span class="token">(</span><span class="token">'OpportunityApprovalProcess'</span><span class="token">)</span><span class="token">;</span>
        req<span class="token">.</span><span class="token">setSkipEntryCriteria</span><span class="token">(</span><span class="token">false</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 承認申請の実行</span>
        <span class="token">Approval</span><span class="token">.</span><span class="token">ProcessResult</span> result <span class="token">=</span> Approval<span class="token">.</span><span class="token">process</span><span class="token">(</span>req<span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 結果の作成</span>
        <span class="token">ApprovalResult</span> approvalResult <span class="token">=</span> <span class="token">new</span> <span class="token">ApprovalResult</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        approvalResult<span class="token">.</span>success <span class="token">=</span> result<span class="token">.</span><span class="token">isSuccess</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        approvalResult<span class="token">.</span>opportunityId <span class="token">=</span> opportunityId<span class="token">;</span>
        approvalResult<span class="token">.</span>processInstanceId <span class="token">=</span> result<span class="token">.</span><span class="token">getInstanceId</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        approvalResult<span class="token">.</span>message <span class="token">=</span> result<span class="token">.</span><span class="token">isSuccess</span><span class="token">(</span><span class="token">)</span> <span class="token">?</span> 
            <span class="token">'承認プロセスが開始されました'</span> <span class="token">:</span> 
            <span class="token">'承認プロセスの開始に失敗しました: '</span> <span class="token">+</span> <span class="token">String</span><span class="token">.</span><span class="token">join</span><span class="token">(</span>result<span class="token">.</span><span class="token">getErrors</span><span class="token">(</span><span class="token">)</span><span class="token">,</span> <span class="token">', '</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 承認状況の追跡レコード作成</span>
        <span class="token">createApprovalTracking</span><span class="token">(</span>opp<span class="token">,</span> approvers<span class="token">,</span> result<span class="token">.</span><span class="token">getInstanceId</span><span class="token">(</span><span class="token">)</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">return</span> approvalResult<span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token">private</span> <span class="token">static</span> <span class="token">String</span> <span class="token">determineApprovalLevel</span><span class="token">(</span><span class="token">Decimal</span> amount<span class="token">)</span> <span class="token">{</span>
        <span class="token">if</span> <span class="token">(</span>amount <span class="token">==</span> <span class="token">null</span><span class="token">)</span> <span class="token">return</span> <span class="token">'MANAGER_APPROVAL'</span><span class="token">;</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">Decimal</span><span class="token">&gt;</span> thresholds <span class="token">=</span> <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Decimal</span><span class="token">&gt;</span><span class="token">(</span>APPROVAL_RULES<span class="token">.</span><span class="token">keySet</span><span class="token">(</span><span class="token">)</span><span class="token">)</span><span class="token">;</span>
        thresholds<span class="token">.</span><span class="token">sort</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">for</span> <span class="token">(</span><span class="token">Decimal</span> threshold <span class="token">:</span> thresholds<span class="token">)</span> <span class="token">{</span>
            <span class="token">if</span> <span class="token">(</span>amount <span class="token">&lt;=</span> threshold<span class="token">)</span> <span class="token">{</span>
                <span class="token">return</span> APPROVAL_RULES<span class="token">.</span><span class="token">get</span><span class="token">(</span>threshold<span class="token">)</span><span class="token">;</span>
            <span class="token">}</span>
        <span class="token">}</span>
        
        <span class="token">return</span> <span class="token">'EXECUTIVE_APPROVAL'</span><span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token">private</span> <span class="token">static</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Id</span><span class="token">&gt;</span> <span class="token">getApprovers</span><span class="token">(</span><span class="token">Opportunity</span> opp<span class="token">,</span> <span class="token">String</span> approvalLevel<span class="token">)</span> <span class="token">{</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">Id</span><span class="token">&gt;</span> approvers <span class="token">=</span> <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Id</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// ユーザーの役職情報を取得</span>
        <span class="token">User</span> owner <span class="token">=</span> <span class="token sql language-sql">[</span>
            <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> ManagerId</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> UserRole</span><span class="token sql language-sql">.</span><span class="token sql language-sql">Name</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Department
</span>            <span class="token sql language-sql">FROM</span> <span class="token sql language-sql">User</span> 
            <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">=</span><span class="token sql language-sql"> :opp</span><span class="token sql language-sql">.</span><span class="token sql language-sql">OwnerId 
</span>            <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">1</span>
        <span class="token sql language-sql">]</span><span class="token">;</span>
        
        <span class="token">switch</span> <span class="token">on</span> approvalLevel <span class="token">{</span>
            <span class="token">when</span> <span class="token">'MANAGER_APPROVAL'</span> <span class="token">{</span>
                <span class="token">if</span> <span class="token">(</span>owner<span class="token">.</span>ManagerId <span class="token">!=</span> <span class="token">null</span><span class="token">)</span> <span class="token">{</span>
                    approvers<span class="token">.</span><span class="token">add</span><span class="token">(</span>owner<span class="token">.</span>ManagerId<span class="token">)</span><span class="token">;</span>
                <span class="token">}</span>
            <span class="token">}</span>
            <span class="token">when</span> <span class="token">'DIRECTOR_APPROVAL'</span> <span class="token">{</span>
                <span class="token">// 部門ディレクターを検索</span>
                <span class="token">List</span><span class="token">&lt;</span><span class="token">User</span><span class="token">&gt;</span> directors <span class="token">=</span> <span class="token sql language-sql">[</span>
                    <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">FROM</span> <span class="token sql language-sql">User</span> 
                    <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> UserRole</span><span class="token sql language-sql">.</span><span class="token sql language-sql">Name </span><span class="token sql language-sql">LIKE</span> <span class="token sql language-sql">'%Director%'</span> 
                    <span class="token sql language-sql">AND</span><span class="token sql language-sql"> Department </span><span class="token sql language-sql">=</span><span class="token sql language-sql"> :owner</span><span class="token sql language-sql">.</span><span class="token sql language-sql">Department 
</span>                    <span class="token sql language-sql">AND</span><span class="token sql language-sql"> IsActive </span><span class="token sql language-sql">=</span> <span class="token sql language-sql">true</span>
                    <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">3</span>
                <span class="token sql language-sql">]</span><span class="token">;</span>
                <span class="token">for</span> <span class="token">(</span><span class="token">User</span> director <span class="token">:</span> directors<span class="token">)</span> <span class="token">{</span>
                    approvers<span class="token">.</span><span class="token">add</span><span class="token">(</span>director<span class="token">.</span>Id<span class="token">)</span><span class="token">;</span>
                <span class="token">}</span>
            <span class="token">}</span>
            <span class="token">when</span> <span class="token">'VP_APPROVAL'</span> <span class="token">{</span>
                <span class="token">// VP以上の役職者を検索</span>
                <span class="token">List</span><span class="token">&lt;</span><span class="token">User</span><span class="token">&gt;</span> vps <span class="token">=</span> <span class="token sql language-sql">[</span>
                    <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">FROM</span> <span class="token sql language-sql">User</span> 
                    <span class="token sql language-sql">WHERE</span> <span class="token sql language-sql">(</span><span class="token sql language-sql">UserRole</span><span class="token sql language-sql">.</span><span class="token sql language-sql">Name </span><span class="token sql language-sql">LIKE</span> <span class="token sql language-sql">'%VP%'</span> <span class="token sql language-sql">OR</span><span class="token sql language-sql"> UserRole</span><span class="token sql language-sql">.</span><span class="token sql language-sql">Name </span><span class="token sql language-sql">LIKE</span> <span class="token sql language-sql">'%Vice President%'</span><span class="token sql language-sql">)</span>
                    <span class="token sql language-sql">AND</span><span class="token sql language-sql"> IsActive </span><span class="token sql language-sql">=</span> <span class="token sql language-sql">true</span>
                    <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">5</span>
                <span class="token sql language-sql">]</span><span class="token">;</span>
                <span class="token">for</span> <span class="token">(</span><span class="token">User</span> vp <span class="token">:</span> vps<span class="token">)</span> <span class="token">{</span>
                    approvers<span class="token">.</span><span class="token">add</span><span class="token">(</span>vp<span class="token">.</span>Id<span class="token">)</span><span class="token">;</span>
                <span class="token">}</span>
            <span class="token">}</span>
            <span class="token">when</span> <span class="token">'EXECUTIVE_APPROVAL'</span> <span class="token">{</span>
                <span class="token">// 役員クラスを検索</span>
                <span class="token">List</span><span class="token">&lt;</span><span class="token">User</span><span class="token">&gt;</span> executives <span class="token">=</span> <span class="token sql language-sql">[</span>
                    <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">FROM</span> <span class="token sql language-sql">User</span> 
                    <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> UserRole</span><span class="token sql language-sql">.</span><span class="token sql language-sql">Name </span><span class="token sql language-sql">LIKE</span> <span class="token sql language-sql">'%Executive%'</span> 
                    <span class="token sql language-sql">OR</span><span class="token sql language-sql"> UserRole</span><span class="token sql language-sql">.</span><span class="token sql language-sql">Name </span><span class="token sql language-sql">LIKE</span> <span class="token sql language-sql">'%CEO%'</span>
                    <span class="token sql language-sql">OR</span><span class="token sql language-sql"> UserRole</span><span class="token sql language-sql">.</span><span class="token sql language-sql">Name </span><span class="token sql language-sql">LIKE</span> <span class="token sql language-sql">'%President%'</span>
                    <span class="token sql language-sql">AND</span><span class="token sql language-sql"> IsActive </span><span class="token sql language-sql">=</span> <span class="token sql language-sql">true</span>
                    <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">5</span>
                <span class="token sql language-sql">]</span><span class="token">;</span>
                <span class="token">for</span> <span class="token">(</span><span class="token">User</span> exec <span class="token">:</span> executives<span class="token">)</span> <span class="token">{</span>
                    approvers<span class="token">.</span><span class="token">add</span><span class="token">(</span>exec<span class="token">.</span>Id<span class="token">)</span><span class="token">;</span>
                <span class="token">}</span>
            <span class="token">}</span>
        <span class="token">}</span>
        
        <span class="token">return</span> approvers<span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token">private</span> <span class="token">static</span> <span class="token">void</span> <span class="token">createApprovalTracking</span><span class="token">(</span><span class="token">Opportunity</span> opp<span class="token">,</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Id</span><span class="token">&gt;</span> approvers<span class="token">,</span> <span class="token">Id</span> processInstanceId<span class="token">)</span> <span class="token">{</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">ApprovalTracking__c</span><span class="token">&gt;</span> trackingRecords <span class="token">=</span> <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">ApprovalTracking__c</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">for</span> <span class="token">(</span><span class="token">Id</span> approverId <span class="token">:</span> approvers<span class="token">)</span> <span class="token">{</span>
            <span class="token">ApprovalTracking__c</span> tracking <span class="token">=</span> <span class="token">new</span> <span class="token">ApprovalTracking__c</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
            tracking<span class="token">.</span>Opportunity__c <span class="token">=</span> opp<span class="token">.</span>Id<span class="token">;</span>
            tracking<span class="token">.</span>Approver__c <span class="token">=</span> approverId<span class="token">;</span>
            tracking<span class="token">.</span>ProcessInstanceId__c <span class="token">=</span> processInstanceId<span class="token">;</span>
            tracking<span class="token">.</span>Status__c <span class="token">=</span> <span class="token">'Pending'</span><span class="token">;</span>
            tracking<span class="token">.</span>CreatedDate__c <span class="token">=</span> <span class="token">System</span><span class="token">.</span><span class="token">now</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
            trackingRecords<span class="token">.</span><span class="token">add</span><span class="token">(</span>tracking<span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
        
        <span class="token">if</span> <span class="token">(</span><span class="token">!</span>trackingRecords<span class="token">.</span><span class="token">isEmpty</span><span class="token">(</span><span class="token">)</span><span class="token">)</span> <span class="token">{</span>
            <span class="token">insert</span> trackingRecords<span class="token">;</span>
        <span class="token">}</span>
    <span class="token">}</span>
    
    <span class="token">// 代理承認者への自動エスカレーション</span>
    <span class="token annotation">@future</span>
    <span class="token">public</span> <span class="token">static</span> <span class="token">void</span> <span class="token">checkForEscalation</span><span class="token">(</span><span class="token">Set</span><span class="token">&lt;</span><span class="token">Id</span><span class="token">&gt;</span> processInstanceIds<span class="token">)</span> <span class="token">{</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">ProcessInstance</span><span class="token">&gt;</span> processes <span class="token">=</span> <span class="token sql language-sql">[</span>
            <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span> <span class="token sql language-sql">Status</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> CreatedDate</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> TargetObjectId
</span>            <span class="token sql language-sql">FROM</span><span class="token sql language-sql"> ProcessInstance 
</span>            <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">IN</span><span class="token sql language-sql"> :processInstanceIds
</span>            <span class="token sql language-sql">AND</span> <span class="token sql language-sql">Status</span> <span class="token sql language-sql">=</span> <span class="token sql language-sql">'Pending'</span>
        <span class="token sql language-sql">]</span><span class="token">;</span>
        
        <span class="token">for</span> <span class="token">(</span><span class="token">ProcessInstance</span> process <span class="token">:</span> processes<span class="token">)</span> <span class="token">{</span>
            <span class="token">// 24時間経過した場合のエスカレーション</span>
            <span class="token">if</span> <span class="token">(</span>process<span class="token">.</span>CreatedDate<span class="token">.</span><span class="token">addHours</span><span class="token">(</span><span class="token">24</span><span class="token">)</span> <span class="token">&lt;</span> <span class="token">System</span><span class="token">.</span><span class="token">now</span><span class="token">(</span><span class="token">)</span><span class="token">)</span> <span class="token">{</span>
                <span class="token">escalateToDelegate</span><span class="token">(</span>process<span class="token">.</span>Id<span class="token">)</span><span class="token">;</span>
            <span class="token">}</span>
        <span class="token">}</span>
    <span class="token">}</span>
    
    <span class="token">private</span> <span class="token">static</span> <span class="token">void</span> <span class="token">escalateToDelegate</span><span class="token">(</span><span class="token">Id</span> processInstanceId<span class="token">)</span> <span class="token">{</span>
        <span class="token">// 現在の承認者を取得</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">ProcessInstanceWorkitem</span><span class="token">&gt;</span> workitems <span class="token">=</span> <span class="token sql language-sql">[</span>
            <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> ActorId</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> ProcessInstanceId
</span>            <span class="token sql language-sql">FROM</span><span class="token sql language-sql"> ProcessInstanceWorkitem 
</span>            <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> ProcessInstanceId </span><span class="token sql language-sql">=</span><span class="token sql language-sql"> :processInstanceId
</span>        <span class="token sql language-sql">]</span><span class="token">;</span>
        
        <span class="token">for</span> <span class="token">(</span><span class="token">ProcessInstanceWorkitem</span> workitem <span class="token">:</span> workitems<span class="token">)</span> <span class="token">{</span>
            <span class="token">// 代理承認者を検索</span>
            <span class="token">List</span><span class="token">&lt;</span><span class="token">User</span><span class="token">&gt;</span> delegates <span class="token">=</span> <span class="token sql language-sql">[</span>
                <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">FROM</span> <span class="token sql language-sql">User</span> 
                <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> ManagerId </span><span class="token sql language-sql">=</span><span class="token sql language-sql"> :workitem</span><span class="token sql language-sql">.</span><span class="token sql language-sql">ActorId 
</span>                <span class="token sql language-sql">AND</span><span class="token sql language-sql"> IsActive </span><span class="token sql language-sql">=</span> <span class="token sql language-sql">true</span>
                <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">1</span>
            <span class="token sql language-sql">]</span><span class="token">;</span>
            
            <span class="token">if</span> <span class="token">(</span><span class="token">!</span>delegates<span class="token">.</span><span class="token">isEmpty</span><span class="token">(</span><span class="token">)</span><span class="token">)</span> <span class="token">{</span>
                <span class="token">// 代理承認者に再アサイン</span>
                <span class="token">Approval</span><span class="token">.</span><span class="token">ProcessWorkitemRequest</span> req <span class="token">=</span> <span class="token">new</span> <span class="token">Approval</span><span class="token">.</span><span class="token">ProcessWorkitemRequest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
                req<span class="token">.</span><span class="token">setComments</span><span class="token">(</span><span class="token">'自動エスカレーション: 代理承認者へのアサイン'</span><span class="token">)</span><span class="token">;</span>
                req<span class="token">.</span><span class="token">setAction</span><span class="token">(</span><span class="token">'Reassign'</span><span class="token">)</span><span class="token">;</span>
                req<span class="token">.</span><span class="token">setWorkitemId</span><span class="token">(</span>workitem<span class="token">.</span>Id<span class="token">)</span><span class="token">;</span>
                req<span class="token">.</span><span class="token">setNewActorIds</span><span class="token">(</span><span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Id</span><span class="token">&gt;</span><span class="token">{</span>delegates<span class="token">[</span><span class="token">0</span><span class="token">]</span><span class="token">.</span>Id<span class="token">}</span><span class="token">)</span><span class="token">;</span>
                
                Approval<span class="token">.</span><span class="token">process</span><span class="token">(</span>req<span class="token">)</span><span class="token">;</span>
            <span class="token">}</span>
        <span class="token">}</span>
    <span class="token">}</span>
    
    <span class="token">// データクラス</span>
    <span class="token">public</span> <span class="token">class</span> <span class="token">ApprovalRequest</span> <span class="token">{</span>
        <span class="token annotation">@InvocableVariable</span><span class="token">(</span>required<span class="token">=</span><span class="token">true</span><span class="token">)</span>
        <span class="token">public</span> <span class="token">Id</span> opportunityId<span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token">public</span> <span class="token">class</span> <span class="token">ApprovalResult</span> <span class="token">{</span>
        <span class="token annotation">@InvocableVariable</span>
        <span class="token">public</span> <span class="token">Boolean</span> success<span class="token">;</span>
        <span class="token annotation">@InvocableVariable</span>
        <span class="token">public</span> <span class="token">String</span> message<span class="token">;</span>
        <span class="token annotation">@InvocableVariable</span>
        <span class="token">public</span> <span class="token">Id</span> opportunityId<span class="token">;</span>
        <span class="token annotation">@InvocableVariable</span>
        <span class="token">public</span> <span class="token">Id</span> processInstanceId<span class="token">;</span>
    <span class="token">}</span>
<span class="token">}</span></code></pre>
</div>
</div>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">テストコードの自動生成</h3>
<p class="whitespace-normal break-words"><strong>AIエディタによるテストクラスの生成</strong></p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">apex</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-apex"><span class="token annotation">@isTest</span>
<span class="token">public</span> <span class="token">class</span> <span class="token">OpportunityApprovalManagerTest</span> <span class="token">{</span>
    
    <span class="token annotation">@TestSetup</span>
    <span class="token">static</span> <span class="token">void</span> <span class="token">setupTestData</span><span class="token">(</span><span class="token">)</span> <span class="token">{</span>
        <span class="token">// テスト用のユーザー作成</span>
        <span class="token">Profile</span> profile <span class="token">=</span> <span class="token sql language-sql">[</span><span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Profile </span><span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Name </span><span class="token sql language-sql">=</span> <span class="token sql language-sql">'Standard User'</span> <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">1</span><span class="token sql language-sql">]</span><span class="token">;</span>
        
        <span class="token">User</span> manager <span class="token">=</span> <span class="token">new</span> <span class="token">User</span><span class="token">(</span>
            FirstName <span class="token">=</span> <span class="token">'Test'</span><span class="token">,</span>
            LastName <span class="token">=</span> <span class="token">'Manager'</span><span class="token">,</span>
            Email <span class="token">=</span> <span class="token">'testmanager@example.com'</span><span class="token">,</span>
            Username <span class="token">=</span> <span class="token">'testmanager@example.com.test'</span><span class="token">,</span>
            Alias <span class="token">=</span> <span class="token">'tmgr'</span><span class="token">,</span>
            ProfileId <span class="token">=</span> profile<span class="token">.</span>Id<span class="token">,</span>
            TimeZoneSidKey <span class="token">=</span> <span class="token">'Asia/Tokyo'</span><span class="token">,</span>
            LocaleSidKey <span class="token">=</span> <span class="token">'ja_JP'</span><span class="token">,</span>
            EmailEncodingKey <span class="token">=</span> <span class="token">'UTF-8'</span><span class="token">,</span>
            LanguageLocaleKey <span class="token">=</span> <span class="token">'ja'</span>
        <span class="token">)</span><span class="token">;</span>
        <span class="token">insert</span> manager<span class="token">;</span>
        
        <span class="token">User</span> salesUser <span class="token">=</span> <span class="token">new</span> <span class="token">User</span><span class="token">(</span>
            FirstName <span class="token">=</span> <span class="token">'Test'</span><span class="token">,</span>
            LastName <span class="token">=</span> <span class="token">'Sales'</span><span class="token">,</span>
            Email <span class="token">=</span> <span class="token">'testsales@example.com'</span><span class="token">,</span>
            Username <span class="token">=</span> <span class="token">'testsales@example.com.test'</span><span class="token">,</span>
            Alias <span class="token">=</span> <span class="token">'tsales'</span><span class="token">,</span>
            ProfileId <span class="token">=</span> profile<span class="token">.</span>Id<span class="token">,</span>
            ManagerId <span class="token">=</span> manager<span class="token">.</span>Id<span class="token">,</span>
            TimeZoneSidKey <span class="token">=</span> <span class="token">'Asia/Tokyo'</span><span class="token">,</span>
            LocaleSidKey <span class="token">=</span> <span class="token">'ja_JP'</span><span class="token">,</span>
            EmailEncodingKey <span class="token">=</span> <span class="token">'UTF-8'</span><span class="token">,</span>
            LanguageLocaleKey <span class="token">=</span> <span class="token">'ja'</span>
        <span class="token">)</span><span class="token">;</span>
        <span class="token">insert</span> salesUser<span class="token">;</span>
        
        <span class="token">// テスト用の取引先作成</span>
        <span class="token">Account</span> testAccount <span class="token">=</span> <span class="token">new</span> <span class="token">Account</span><span class="token">(</span>
            Name <span class="token">=</span> <span class="token">'テスト取引先'</span><span class="token">,</span>
            OwnerId <span class="token">=</span> salesUser<span class="token">.</span>Id
        <span class="token">)</span><span class="token">;</span>
        <span class="token">insert</span> testAccount<span class="token">;</span>
        
        <span class="token">// テスト用の商談作成</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">Opportunity</span><span class="token">&gt;</span> opportunities <span class="token">=</span> <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Opportunity</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 小額商談（マネージャー承認）</span>
        opportunities<span class="token">.</span><span class="token">add</span><span class="token">(</span><span class="token">new</span> <span class="token">Opportunity</span><span class="token">(</span>
            Name <span class="token">=</span> <span class="token">'テスト商談 - 小額'</span><span class="token">,</span>
            AccountId <span class="token">=</span> testAccount<span class="token">.</span>Id<span class="token">,</span>
            Amount <span class="token">=</span> <span class="token">50000</span><span class="token">,</span>
            CloseDate <span class="token">=</span> <span class="token">Date</span><span class="token">.</span><span class="token">today</span><span class="token">(</span><span class="token">)</span><span class="token">.</span><span class="token">addDays</span><span class="token">(</span><span class="token">30</span><span class="token">)</span><span class="token">,</span>
            StageName <span class="token">=</span> <span class="token">'Prospecting'</span><span class="token">,</span>
            OwnerId <span class="token">=</span> salesUser<span class="token">.</span>Id
        <span class="token">)</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 中額商談（ディレクター承認）</span>
        opportunities<span class="token">.</span><span class="token">add</span><span class="token">(</span><span class="token">new</span> <span class="token">Opportunity</span><span class="token">(</span>
            Name <span class="token">=</span> <span class="token">'テスト商談 - 中額'</span><span class="token">,</span>
            AccountId <span class="token">=</span> testAccount<span class="token">.</span>Id<span class="token">,</span>
            Amount <span class="token">=</span> <span class="token">300000</span><span class="token">,</span>
            CloseDate <span class="token">=</span> <span class="token">Date</span><span class="token">.</span><span class="token">today</span><span class="token">(</span><span class="token">)</span><span class="token">.</span><span class="token">addDays</span><span class="token">(</span><span class="token">30</span><span class="token">)</span><span class="token">,</span>
            StageName <span class="token">=</span> <span class="token">'Prospecting'</span><span class="token">,</span>
            OwnerId <span class="token">=</span> salesUser<span class="token">.</span>Id
        <span class="token">)</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 高額商談（VP承認）</span>
        opportunities<span class="token">.</span><span class="token">add</span><span class="token">(</span><span class="token">new</span> <span class="token">Opportunity</span><span class="token">(</span>
            Name <span class="token">=</span> <span class="token">'テスト商談 - 高額'</span><span class="token">,</span>
            AccountId <span class="token">=</span> testAccount<span class="token">.</span>Id<span class="token">,</span>
            Amount <span class="token">=</span> <span class="token">800000</span><span class="token">,</span>
            CloseDate <span class="token">=</span> <span class="token">Date</span><span class="token">.</span><span class="token">today</span><span class="token">(</span><span class="token">)</span><span class="token">.</span><span class="token">addDays</span><span class="token">(</span><span class="token">30</span><span class="token">)</span><span class="token">,</span>
            StageName <span class="token">=</span> <span class="token">'Prospecting'</span><span class="token">,</span>
            OwnerId <span class="token">=</span> salesUser<span class="token">.</span>Id
        <span class="token">)</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">insert</span> opportunities<span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token annotation">@isTest</span>
    <span class="token">static</span> <span class="token">void</span> <span class="token">testManagerApprovalProcess</span><span class="token">(</span><span class="token">)</span> <span class="token">{</span>
        <span class="token">Opportunity</span> smallOpp <span class="token">=</span> <span class="token sql language-sql">[</span>
            <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Opportunity 
</span>            <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Name </span><span class="token sql language-sql">=</span> <span class="token sql language-sql">'テスト商談 - 小額'</span> 
            <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">1</span>
        <span class="token sql language-sql">]</span><span class="token">;</span>
        
        Test<span class="token">.</span><span class="token">startTest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span> requests <span class="token">=</span> 
            <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        <span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span> request <span class="token">=</span> 
            <span class="token">new</span> <span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        request<span class="token">.</span>opportunityId <span class="token">=</span> smallOpp<span class="token">.</span>Id<span class="token">;</span>
        requests<span class="token">.</span><span class="token">add</span><span class="token">(</span>request<span class="token">)</span><span class="token">;</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalResult</span><span class="token">&gt;</span> results <span class="token">=</span> 
            OpportunityApprovalManager<span class="token">.</span><span class="token">initiateApprovalProcess</span><span class="token">(</span>requests<span class="token">)</span><span class="token">;</span>
        
        Test<span class="token">.</span><span class="token">stopTest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 結果の検証</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertEquals</span><span class="token">(</span><span class="token">1</span><span class="token">,</span> results<span class="token">.</span><span class="token">size</span><span class="token">(</span><span class="token">)</span><span class="token">,</span> <span class="token">'結果が1件返されること'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertEquals</span><span class="token">(</span><span class="token">true</span><span class="token">,</span> results<span class="token">[</span><span class="token">0</span><span class="token">]</span><span class="token">.</span>success<span class="token">,</span> <span class="token">'承認プロセスが成功すること'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertEquals</span><span class="token">(</span>smallOpp<span class="token">.</span>Id<span class="token">,</span> results<span class="token">[</span><span class="token">0</span><span class="token">]</span><span class="token">.</span>opportunityId<span class="token">,</span> <span class="token">'商談IDが正しく設定されること'</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 追跡レコードの確認</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">ApprovalTracking__c</span><span class="token">&gt;</span> trackings <span class="token">=</span> <span class="token sql language-sql">[</span>
            <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Status__c 
</span>            <span class="token sql language-sql">FROM</span><span class="token sql language-sql"> ApprovalTracking__c 
</span>            <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Opportunity__c </span><span class="token sql language-sql">=</span><span class="token sql language-sql"> :smallOpp</span><span class="token sql language-sql">.</span><span class="token sql language-sql">Id
</span>        <span class="token sql language-sql">]</span><span class="token">;</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertNotEquals</span><span class="token">(</span><span class="token">0</span><span class="token">,</span> trackings<span class="token">.</span><span class="token">size</span><span class="token">(</span><span class="token">)</span><span class="token">,</span> <span class="token">'追跡レコードが作成されること'</span><span class="token">)</span><span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token annotation">@isTest</span>
    <span class="token">static</span> <span class="token">void</span> <span class="token">testDirectorApprovalProcess</span><span class="token">(</span><span class="token">)</span> <span class="token">{</span>
        <span class="token">Opportunity</span> mediumOpp <span class="token">=</span> <span class="token sql language-sql">[</span>
            <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Opportunity 
</span>            <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Name </span><span class="token sql language-sql">=</span> <span class="token sql language-sql">'テスト商談 - 中額'</span> 
            <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">1</span>
        <span class="token sql language-sql">]</span><span class="token">;</span>
        
        Test<span class="token">.</span><span class="token">startTest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span> requests <span class="token">=</span> 
            <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        <span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span> request <span class="token">=</span> 
            <span class="token">new</span> <span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        request<span class="token">.</span>opportunityId <span class="token">=</span> mediumOpp<span class="token">.</span>Id<span class="token">;</span>
        requests<span class="token">.</span><span class="token">add</span><span class="token">(</span>request<span class="token">)</span><span class="token">;</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalResult</span><span class="token">&gt;</span> results <span class="token">=</span> 
            OpportunityApprovalManager<span class="token">.</span><span class="token">initiateApprovalProcess</span><span class="token">(</span>requests<span class="token">)</span><span class="token">;</span>
        
        Test<span class="token">.</span><span class="token">stopTest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 結果の検証</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertEquals</span><span class="token">(</span><span class="token">1</span><span class="token">,</span> results<span class="token">.</span><span class="token">size</span><span class="token">(</span><span class="token">)</span><span class="token">,</span> <span class="token">'結果が1件返されること'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertEquals</span><span class="token">(</span>mediumOpp<span class="token">.</span>Id<span class="token">,</span> results<span class="token">[</span><span class="token">0</span><span class="token">]</span><span class="token">.</span>opportunityId<span class="token">,</span> <span class="token">'商談IDが正しく設定されること'</span><span class="token">)</span><span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token annotation">@isTest</span>
    <span class="token">static</span> <span class="token">void</span> <span class="token">testVPApprovalProcess</span><span class="token">(</span><span class="token">)</span> <span class="token">{</span>
        <span class="token">Opportunity</span> largeOpp <span class="token">=</span> <span class="token sql language-sql">[</span>
            <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Opportunity 
</span>            <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Name </span><span class="token sql language-sql">=</span> <span class="token sql language-sql">'テスト商談 - 高額'</span> 
            <span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">1</span>
        <span class="token sql language-sql">]</span><span class="token">;</span>
        
        Test<span class="token">.</span><span class="token">startTest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span> requests <span class="token">=</span> 
            <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        <span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span> request <span class="token">=</span> 
            <span class="token">new</span> <span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        request<span class="token">.</span>opportunityId <span class="token">=</span> largeOpp<span class="token">.</span>Id<span class="token">;</span>
        requests<span class="token">.</span><span class="token">add</span><span class="token">(</span>request<span class="token">)</span><span class="token">;</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalResult</span><span class="token">&gt;</span> results <span class="token">=</span> 
            OpportunityApprovalManager<span class="token">.</span><span class="token">initiateApprovalProcess</span><span class="token">(</span>requests<span class="token">)</span><span class="token">;</span>
        
        Test<span class="token">.</span><span class="token">stopTest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// 結果の検証</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertEquals</span><span class="token">(</span><span class="token">1</span><span class="token">,</span> results<span class="token">.</span><span class="token">size</span><span class="token">(</span><span class="token">)</span><span class="token">,</span> <span class="token">'結果が1件返されること'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertEquals</span><span class="token">(</span>largeOpp<span class="token">.</span>Id<span class="token">,</span> results<span class="token">[</span><span class="token">0</span><span class="token">]</span><span class="token">.</span>opportunityId<span class="token">,</span> <span class="token">'商談IDが正しく設定されること'</span><span class="token">)</span><span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token annotation">@isTest</span>
    <span class="token">static</span> <span class="token">void</span> <span class="token">testErrorHandling</span><span class="token">(</span><span class="token">)</span> <span class="token">{</span>
        Test<span class="token">.</span><span class="token">startTest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span> requests <span class="token">=</span> 
            <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        <span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span> request <span class="token">=</span> 
            <span class="token">new</span> <span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        request<span class="token">.</span>opportunityId <span class="token">=</span> <span class="token">null</span><span class="token">;</span> <span class="token">// 不正なID</span>
        requests<span class="token">.</span><span class="token">add</span><span class="token">(</span>request<span class="token">)</span><span class="token">;</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalResult</span><span class="token">&gt;</span> results <span class="token">=</span> 
            OpportunityApprovalManager<span class="token">.</span><span class="token">initiateApprovalProcess</span><span class="token">(</span>requests<span class="token">)</span><span class="token">;</span>
        
        Test<span class="token">.</span><span class="token">stopTest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// エラーハンドリングの検証</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertEquals</span><span class="token">(</span><span class="token">1</span><span class="token">,</span> results<span class="token">.</span><span class="token">size</span><span class="token">(</span><span class="token">)</span><span class="token">,</span> <span class="token">'結果が1件返されること'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertEquals</span><span class="token">(</span><span class="token">false</span><span class="token">,</span> results<span class="token">[</span><span class="token">0</span><span class="token">]</span><span class="token">.</span>success<span class="token">,</span> <span class="token">'エラーが正しく処理されること'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assert</span><span class="token">(</span>results<span class="token">[</span><span class="token">0</span><span class="token">]</span><span class="token">.</span>message<span class="token">.</span><span class="token">contains</span><span class="token">(</span><span class="token">'エラー'</span><span class="token">)</span><span class="token">,</span> <span class="token">'エラーメッセージが設定されること'</span><span class="token">)</span><span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token annotation">@isTest</span>
    <span class="token">static</span> <span class="token">void</span> <span class="token">testBulkProcessing</span><span class="token">(</span><span class="token">)</span> <span class="token">{</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">Opportunity</span><span class="token">&gt;</span> allOpps <span class="token">=</span> <span class="token sql language-sql">[</span><span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Opportunity</span><span class="token sql language-sql">]</span><span class="token">;</span>
        
        Test<span class="token">.</span><span class="token">startTest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span> requests <span class="token">=</span> 
            <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">for</span> <span class="token">(</span><span class="token">Opportunity</span> opp <span class="token">:</span> allOpps<span class="token">)</span> <span class="token">{</span>
            <span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span> request <span class="token">=</span> 
                <span class="token">new</span> <span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalRequest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
            request<span class="token">.</span>opportunityId <span class="token">=</span> opp<span class="token">.</span>Id<span class="token">;</span>
            requests<span class="token">.</span><span class="token">add</span><span class="token">(</span>request<span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
        
        <span class="token">List</span><span class="token">&lt;</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalResult</span><span class="token">&gt;</span> results <span class="token">=</span> 
            OpportunityApprovalManager<span class="token">.</span><span class="token">initiateApprovalProcess</span><span class="token">(</span>requests<span class="token">)</span><span class="token">;</span>
        
        Test<span class="token">.</span><span class="token">stopTest</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// バルク処理の検証</span>
        <span class="token">System</span><span class="token">.</span><span class="token">assertEquals</span><span class="token">(</span>allOpps<span class="token">.</span><span class="token">size</span><span class="token">(</span><span class="token">)</span><span class="token">,</span> results<span class="token">.</span><span class="token">size</span><span class="token">(</span><span class="token">)</span><span class="token">,</span> <span class="token">'全ての商談が処理されること'</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">for</span> <span class="token">(</span><span class="token">OpportunityApprovalManager</span><span class="token">.</span><span class="token">ApprovalResult</span> result <span class="token">:</span> results<span class="token">)</span> <span class="token">{</span>
            <span class="token">System</span><span class="token">.</span><span class="token">assertNotEquals</span><span class="token">(</span><span class="token">null</span><span class="token">,</span> result<span class="token">.</span>opportunityId<span class="token">,</span> <span class="token">'商談IDが設定されること'</span><span class="token">)</span><span class="token">;</span>
        <span class="token">}</span>
    <span class="token">}</span>
<span class="token">}</span></code></pre>
</div>
</div>
<h2 class="text-xl font-bold text-text-100 mt-1 -mb-0.5">6. 注意点と課題</h2>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">セキュリティ考慮事項</h3>
<p class="whitespace-normal break-words"><strong>AIエディタ使用時のセキュリティリスク</strong></p>
<p class="whitespace-normal break-words"><strong>1. 機密情報の漏洩リスク</strong> AIエディタにコードを送信する際、顧客情報や機密データが含まれる可能性があります。以下の対策が必要です：</p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">実際の顧客データを含むコードをAIエディタに送信しない</li>
<li class="whitespace-normal break-words">テストデータやサンプルデータを使用してコード生成を行う</li>
<li class="whitespace-normal break-words">社内のデータ分類ポリシーに従った利用ガイドラインの策定</li>
<li class="whitespace-normal break-words">AIエディタの利用ログの監査と定期的なレビュー</li>
</ul>
<p class="whitespace-normal break-words"><strong>2. 生成されたコードのセキュリティ脆弱性</strong> AIが生成したコードには、セキュリティ上の問題が含まれる可能性があります：</p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">apex</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-apex"><span class="token">// 危険な例：SQLインジェクション脆弱性</span>
<span class="token">public</span> <span class="token">static</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Account</span><span class="token">&gt;</span> <span class="token">searchAccounts</span><span class="token">(</span><span class="token">String</span> searchTerm<span class="token">)</span> <span class="token">{</span>
    <span class="token">// AIが生成した危険なコード例</span>
    <span class="token">String</span> query <span class="token">=</span> <span class="token">'SELECT Id, Name FROM Account WHERE Name LIKE '%'</span> <span class="token">+</span> searchTerm <span class="token">+</span> <span class="token">'%''</span><span class="token">;</span>
    <span class="token">return</span> Database<span class="token">.</span><span class="token">query</span><span class="token">(</span>query<span class="token">)</span><span class="token">;</span> <span class="token">// SQLインジェクション脆弱性</span>
<span class="token">}</span>

<span class="token">// 安全な実装例</span>
<span class="token">public</span> <span class="token">static</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Account</span><span class="token">&gt;</span> <span class="token">searchAccountsSafe</span><span class="token">(</span><span class="token">String</span> searchTerm<span class="token">)</span> <span class="token">{</span>
    <span class="token">String</span> safeSearchTerm <span class="token">=</span> <span class="token">'%'</span> <span class="token">+</span> <span class="token">String</span><span class="token">.</span><span class="token">escapeSingleQuotes</span><span class="token">(</span>searchTerm<span class="token">)</span> <span class="token">+</span> <span class="token">'%'</span><span class="token">;</span>
    <span class="token">return</span> <span class="token sql language-sql">[</span><span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Name </span><span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Account </span><span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Name </span><span class="token sql language-sql">LIKE</span><span class="token sql language-sql"> :safeSearchTerm</span><span class="token sql language-sql">]</span><span class="token">;</span>
<span class="token">}</span></code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>3. 権限とアクセス制御</strong> AIが生成するコードが適切な権限チェックを含んでいるか確認が必要です：</p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">apex</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-apex"><span class="token">// 権限チェックを含む安全なコード例</span>
<span class="token">public</span> <span class="token">static</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Account</span><span class="token">&gt;</span> <span class="token">getAccounts</span><span class="token">(</span><span class="token">)</span> <span class="token">{</span>
    <span class="token">// オブジェクトレベルの権限チェック</span>
    <span class="token">if</span> <span class="token">(</span><span class="token">!</span>Schema<span class="token">.</span>sObjectType<span class="token">.</span>Account<span class="token">.</span><span class="token">isAccessible</span><span class="token">(</span><span class="token">)</span><span class="token">)</span> <span class="token">{</span>
        <span class="token">throw</span> <span class="token">new</span> <span class="token">AuraHandledException</span><span class="token">(</span><span class="token">'取引先への読み取り権限がありません'</span><span class="token">)</span><span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token">// フィールドレベルの権限チェック</span>
    <span class="token">if</span> <span class="token">(</span><span class="token">!</span>Schema<span class="token">.</span>sObjectType<span class="token">.</span>Account<span class="token">.</span>fields<span class="token">.</span>Name<span class="token">.</span><span class="token">isAccessible</span><span class="token">(</span><span class="token">)</span><span class="token">)</span> <span class="token">{</span>
        <span class="token">throw</span> <span class="token">new</span> <span class="token">AuraHandledException</span><span class="token">(</span><span class="token">'取引先名フィールドへの読み取り権限がありません'</span><span class="token">)</span><span class="token">;</span>
    <span class="token">}</span>
    
    <span class="token">return</span> <span class="token sql language-sql">[</span><span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Name </span><span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Account </span><span class="token sql language-sql">WITH</span><span class="token sql language-sql"> SECURITY_ENFORCED </span><span class="token sql language-sql">LIMIT</span> <span class="token sql language-sql">100</span><span class="token sql language-sql">]</span><span class="token">;</span>
<span class="token">}</span></code></pre>
</div>
</div>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">コード品質の担保方法</h3>
<p class="whitespace-normal break-words"><strong>1. AIによるコード生成後の必須チェック項目</strong></p>
<p class="whitespace-normal break-words"><strong>Salesforce固有の制約チェック</strong></p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">ガバナーリミット（SOQL実行回数、DML操作回数、ヒープサイズなど）への対応</li>
<li class="whitespace-normal break-words">バルク処理の実装</li>
<li class="whitespace-normal break-words">適切な例外処理の実装</li>
<li class="whitespace-normal break-words">トランザクション管理の考慮</li>
</ul>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">apex</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-apex"><span class="token">// 良い例：ガバナーリミットを考慮したコード</span>
<span class="token">public</span> <span class="token">class</span> <span class="token">ContactProcessor</span> <span class="token">{</span>
    <span class="token">public</span> <span class="token">static</span> <span class="token">void</span> <span class="token">processContacts</span><span class="token">(</span><span class="token">List</span><span class="token">&lt;</span><span class="token">Contact</span><span class="token">&gt;</span> contacts<span class="token">)</span> <span class="token">{</span>
        <span class="token">List</span><span class="token">&lt;</span><span class="token">Contact</span><span class="token">&gt;</span> contactsToUpdate <span class="token">=</span> <span class="token">new</span> <span class="token">List</span><span class="token">&lt;</span><span class="token">Contact</span><span class="token">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">// バルク処理でSOQL実行回数を最小化</span>
        <span class="token">Map</span><span class="token">&lt;</span><span class="token">Id</span><span class="token">,</span><span class="token"> Account</span><span class="token">&gt;</span> accountMap <span class="token">=</span> <span class="token">new</span> <span class="token">Map</span><span class="token">&lt;</span><span class="token">Id</span><span class="token">,</span><span class="token"> Account</span><span class="token">&gt;</span><span class="token">(</span><span class="token sql language-sql">[</span>
            <span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> Id</span><span class="token sql language-sql">,</span><span class="token sql language-sql"> Industry 
</span>            <span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Account 
</span>            <span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">IN</span> <span class="token sql language-sql">(</span><span class="token sql language-sql">SELECT</span><span class="token sql language-sql"> AccountId </span><span class="token sql language-sql">FROM</span><span class="token sql language-sql"> Contact </span><span class="token sql language-sql">WHERE</span><span class="token sql language-sql"> Id </span><span class="token sql language-sql">IN</span><span class="token sql language-sql"> :contacts</span><span class="token sql language-sql">)</span>
        <span class="token sql language-sql">]</span><span class="token">)</span><span class="token">;</span>
        
        <span class="token">for</span> <span class="token">(</span><span class="token">Contact</span> contact <span class="token">:</span> contacts<span class="token">)</span> <span class="token">{</span>
            <span class="token">if</span> <span class="token">(</span>accountMap<span class="token">.</span><span class="token">containsKey</span><span class="token">(</span>contact<span class="token">.</span>AccountId<span class="token">)</span><span class="token">)</span> <span class="token">{</span>
                contact<span class="token">.</span>Industry__c <span class="token">=</span> accountMap<span class="token">.</span><span class="token">get</span><span class="token">(</span>contact<span class="token">.</span>AccountId<span class="token">)</span><span class="token">.</span>Industry<span class="token">;</span>
                contactsToUpdate<span class="token">.</span><span class="token">add</span><span class="token">(</span>contact<span class="token">)</span><span class="token">;</span>
            <span class="token">}</span>
        <span class="token">}</span>
        
        <span class="token">// バルクDML操作</span>
        <span class="token">if</span> <span class="token">(</span><span class="token">!</span>contactsToUpdate<span class="token">.</span><span class="token">isEmpty</span><span class="token">(</span><span class="token">)</span><span class="token">)</span> <span class="token">{</span>
            <span class="token">try</span> <span class="token">{</span>
                Database<span class="token">.</span><span class="token">update</span><span class="token">(</span>contactsToUpdate<span class="token">,</span> <span class="token">false</span><span class="token">)</span><span class="token">;</span>
            <span class="token">}</span> <span class="token">catch</span> <span class="token">(</span><span class="token">DmlException</span> e<span class="token">)</span> <span class="token">{</span>
                <span class="token">System</span><span class="token">.</span><span class="token">debug</span><span class="token">(</span><span class="token">'DML Error: '</span> <span class="token">+</span> e<span class="token">.</span><span class="token">getMessage</span><span class="token">(</span><span class="token">)</span><span class="token">)</span><span class="token">;</span>
                <span class="token">// 適切なエラーハンドリング</span>
            <span class="token">}</span>
        <span class="token">}</span>
    <span class="token">}</span>
<span class="token">}</span></code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>2. 静的コード解析ツールの活用</strong></p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">PMD for Salesforce</li>
<li class="whitespace-normal break-words">SonarQube Salesforce Plugin</li>
<li class="whitespace-normal break-words">Salesforce Code Analyzer</li>
</ul>
<p class="whitespace-normal break-words"><strong>3. コードレビュープロセスの強化</strong> AIが生成したコードについては、特に以下の観点でのレビューを強化：</p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">ビジネスロジックの正確性</li>
<li class="whitespace-normal break-words">パフォーマンスの最適化</li>
<li class="whitespace-normal break-words">セキュリティ要件の満足</li>
<li class="whitespace-normal break-words">保守性とテスタビリティ</li>
</ul>
<h3 class="text-lg font-bold text-text-100 mt-1 -mb-1.5">チーム開発での運用ポイント</h3>
<p class="whitespace-normal break-words"><strong>1. AIエディタ利用のガイドライン策定</strong></p>
<p class="whitespace-normal break-words"><strong>利用ルールの明文化</strong></p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">markdown</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-markdown"><span class="token">##</span><span class="token"> AIエディタ利用ガイドライン</span>

<span class="token">###</span><span class="token"> 基本方針</span>
<span class="token">1.</span> 本番データを含むコードをAIエディタに送信しない
<span class="token">2.</span> 生成されたコードは必ず動作確認とセキュリティチェックを行う
<span class="token">3.</span> AIの提案をそのまま採用せず、チームの規約に合わせて調整する

<span class="token">###</span><span class="token"> 利用可能な範囲</span>
<span class="token">-</span> ボイラープレートコードの生成
<span class="token">-</span> テストコードの初期実装
<span class="token">-</span> リファクタリングの提案
<span class="token">-</span> ドキュメンテーションの作成

<span class="token">###</span><span class="token"> 利用禁止事項</span>
<span class="token">-</span> 本番環境の機密データを含むコードの送信
<span class="token">-</span> 未検証のコードの直接的な本番環境への適用
<span class="token">-</span> ライセンスが不明なコードの利用</code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>2. 品質基準の統一</strong></p>
<p class="whitespace-normal break-words"><strong>コード品質チェックリスト</strong></p>
<ul class="contains-task-list">
<li class="task-list-item"><input disabled="disabled" type="checkbox" /> Salesforceガバナーリミットへの対応</li>
<li class="task-list-item"><input disabled="disabled" type="checkbox" /> 適切な例外処理の実装</li>
<li class="task-list-item"><input disabled="disabled" type="checkbox" /> セキュリティ要件の満足</li>
<li class="task-list-item"><input disabled="disabled" type="checkbox" /> テストカバレッジ75%以上</li>
<li class="task-list-item"><input disabled="disabled" type="checkbox" /> コメントとドキュメンテーションの充実</li>
<li class="task-list-item"><input disabled="disabled" type="checkbox" /> チームのコーディング規約への準拠</li>
</ul>
<p class="whitespace-normal break-words"><strong>3. 知識共有とベストプラクティスの蓄積</strong></p>
<p class="whitespace-normal break-words"><strong>効果的なプロンプトの共有</strong> チーム内で効果的だったプロンプトや手法を共有し、組織全体のVibe Coding能力を向上させます。</p>
<div class="relative group/copy rounded-lg">
<div class="text-text-500 text-xs p-3.5 pb-0">markdown</div>
<div class="">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed"><code class="language-markdown"><span class="token">##</span><span class="token"> 有効なプロンプト例集</span>

<span class="token">###</span><span class="token"> Apexクラス生成</span>
「Salesforceのガバナーリミットを考慮し、バルク処理に対応した
[機能名]のApexクラスを作成してください。エラーハンドリングと
ログ出力も含めて実装してください。」

<span class="token">###</span><span class="token"> テストクラス生成</span>
「先ほど作成したApexクラスに対して、以下の条件を満たす
テストクラスを作成してください：
<span class="token">-</span> 正常系・異常系の両方をテスト
<span class="token">-</span> バルク処理のテスト
<span class="token">-</span> 75%以上のカバレッジ確保」</code></pre>
</div>
</div>
<p class="whitespace-normal break-words"><strong>4. 継続的な改善プロセス</strong></p>
<p class="whitespace-normal break-words"><strong>定期的な振り返り</strong></p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">月次でのAIエディタ利用状況のレビュー</li>
<li class="whitespace-normal break-words">問題点や改善点の特定と対策の検討</li>
<li class="whitespace-normal break-words">新機能や新しい手法の評価と導入検討</li>
</ul>
<p class="whitespace-normal break-words"><strong>メトリクスの計測</strong></p>
<ul class="[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7">
<li class="whitespace-normal break-words">開発速度の向上度</li>
<li class="whitespace-normal break-words">コード品質の指標（バグ発生率、レビュー指摘事項数）</li>
<li class="whitespace-normal break-words">開発者の満足度</li>
<li class="whitespace-normal break-words">学習コストの変化</li>
</ul>
<h2>関連記事</h2>
<div class="cclt-compat-catgroup"><ul class="cclt-compat-catgroup__list"><li class="cclt-compat-catgroup__item"><a href="https://creativecontentlabtokyo.com/ai-salesforce-development-scope/" class="cclt-compat-catgroup__link"><div class="cclt-compat-catgroup__thumb"><img decoding="async" width="150" height="150" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/11/ai-salesforce-development-scope-eyecatch-150x150.webp" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" /></div><div class="cclt-compat-catgroup__info"><span class="cclt-compat-catgroup__title">Salesforce開発でAIに任せられる範囲｜設定とコードの線引き</span><time class="cclt-compat-catgroup__date" datetime="2026-11-01T14:01:04+09:00">2026年11月1日</time></div></a></li><li class="cclt-compat-catgroup__item"><a href="https://creativecontentlabtokyo.com/ai-parallel-development/" class="cclt-compat-catgroup__link"><div class="cclt-compat-catgroup__thumb"><img decoding="async" width="150" height="150" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/10/ai-parallel-development-eyecatch-1-150x150.webp" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" /></div><div class="cclt-compat-catgroup__info"><span class="cclt-compat-catgroup__title">AIの開発作業を複数同時に走らせる方法｜事故を防ぐ設定と管制塔の回し方</span><time class="cclt-compat-catgroup__date" datetime="2026-10-31T15:35:21+09:00">2026年10月31日</time></div></a></li><li class="cclt-compat-catgroup__item"><a href="https://creativecontentlabtokyo.com/ai-delegation-first-step/" class="cclt-compat-catgroup__link"><div class="cclt-compat-catgroup__thumb"><img decoding="async" width="150" height="150" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/10/ai-delegation-first-step-eyecatch-v2-1-150x150.webp" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" /></div><div class="cclt-compat-catgroup__info"><span class="cclt-compat-catgroup__title">最初の1件を任せるまで｜AIに開発を任せる入門の手順</span><time class="cclt-compat-catgroup__date" datetime="2026-10-31T15:35:19+09:00">2026年10月31日</time></div></a></li><li class="cclt-compat-catgroup__item"><a href="https://creativecontentlabtokyo.com/ai-delegation-what-to-delegate/" class="cclt-compat-catgroup__link"><div class="cclt-compat-catgroup__thumb"><img decoding="async" width="150" height="150" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/10/ai-delegation-what-to-delegate-eyecatch-1-150x150.webp" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" /></div><div class="cclt-compat-catgroup__info"><span class="cclt-compat-catgroup__title">AIに何を任せ、何を任せないか｜やり直しが効くかで決める判断基準</span><time class="cclt-compat-catgroup__date" datetime="2026-10-31T15:35:16+09:00">2026年10月31日</time></div></a></li><li class="cclt-compat-catgroup__item"><a href="https://creativecontentlabtokyo.com/system-design-document-template-list/" class="cclt-compat-catgroup__link"><div class="cclt-compat-catgroup__thumb"><img decoding="async" width="150" height="150" src="https://creativecontentlabtokyo.com/wp-content/uploads/2026/09/design-docs-hub-eyecatch-1-150x150.webp" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" /></div><div class="cclt-compat-catgroup__info"><span class="cclt-compat-catgroup__title">システム設計書のテンプレート一覧｜基本設計・詳細設計の成果物とExcelサンプル</span><time class="cclt-compat-catgroup__date" datetime="2026-09-09T17:46:14+09:00">2026年9月9日</time></div></a></li></ul></div>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
