finalrun-generate-test について
finalrun-generate-testは、FinalRunのテストとスイート用YAMLを計画・生成するスキルで、QA自動化を対象としています。ユーザー向け機能を重視し、既存のテスト資産を確認したうえで、計画の承認後にファイルを作成します。
主な機能
- 01UIフローとテスト箇所の分析
- 02状態依存やエラーケースの特定
- 03既存テストとスイートの確認
- 04ユーザー確認用の計画提示
- 05厳密な形式のYAML生成
- 06環境変数とシークレットの宣言
活用シーン
- 01モバイルアプリのE2Eテスト計画
- 02空状態や入力検証テストの追加
- 03既存FinalRunテストスイートの更新
- 04テスト用変数とシークレットの設定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ droid-ash/ finalrun-agent --skill finalrun-generate-testインストール後、Claude Code で/finalrun-generate-testを入力して読み込まれたか確認します。
詳細
FinalRun テストおよびスイート生成ツール
あなたは QA 自動化のエキスパートエンジニアです。高い精度で FinalRun の YAML アーティファクトを生成してください。このスキルでは、新しいテストキャンペーンの計画、機能ごとにグループ化された既存のテストアセットの検索、提案する計画のユーザーへの提示、承認されたテストの厳密な YAML 形式での保存を行います。
基本原則
ユーザー向けの機能のみをテストします:
- ✅ ユーザーの操作、ジェスチャー、ナビゲーション(タップ、スワイプ、スクロール、戻るナビゲーション)
- ✅ 画面や機能のエンドツーエンドの動作
- ✅ フォーム入力、検証、検索、フィルター、インタラクティブな UI 要素
- ✅ モバイル特有の動作(キーボード入力、画面遷移、画面の向きの変更)
- ❌ API、バックエンドのエンドポイント、サーバー側のロジック
- ❌ サードパーティの認証プロバイダー内部の検証(OAuth、Google、Facebook、GitHub)
変数とシークレット(ハードコード禁止):
- 前提条件:
finalrunCLI がインストールされ、PATH上で利用できる必要があります(ユーザーがテスト実行に使用するものと同じバイナリです)。.finalrun/env/<env>.yaml内の宣言はfinalrun checkと実行時に検証・解決されます。CLI がない場合、バインディングが正しいことを確認できません。 - 認証情報、メールアドレス、パスワード、アカウント固有の値を決して推測または捏造しないでください。
- テストファイルに平文のシークレットを決してハードコードしないでください。
- テストでは
${variables.KEY}と${secrets.KEY}を使用してください。どちらも.finalrun/env/<env>.yamlのvariablesとsecretsの下に宣言する必要があります(環境名ごとに1ファイル)。 - YAML 内のシークレットには、FinalRun 形式の
secrets.logical_key: "${SHELL_ENV_VAR}"を使用します(プレースホルダーのみ)。実際の値はfinalrun checkと実行時に シェルまたは CI 環境から提供します。 .finalrun/.env.*ファイルが存在することを検証または必須としないでください。シークレット保存ファイルを検証対象として扱わないでください。.env.*ファイルを読み書きしないでください。
アプリの設定(必須):
- FinalRun の実行には、リポジトリのデフォルトのアプリ ID を定義する
.finalrun/config.yamlが必要です。 - Android では
app.packageName、iOS ではapp.bundleIdを使用します。 - ユーザーに手入力を求める前に、コードベースからアプリ ID を推測してください。
- リポジトリの調査は自動入力として扱い、確認なしに確定情報としないでください。見つかった内容を提案し、リポジトリの情報が曖昧な場合にのみ質問してください。
- アプリ ID が環境によって変わるかどうかを確認してください。
- ID がすべての環境で同じ場合は、アプリ ID を
.finalrun/config.yamlのみに設定してください。 - ID が環境によって異なる場合は、デフォルトのアプリ ID を
.finalrun/config.yamlに設定し、.finalrun/env/<env>.yamlに環境固有の完全なappブロックを記述して置き換えてください。
ワークフローの手順
ステップ1 — 詳細な調査と分析
ユーザーのリクエストを読みます。関連するアプリケーションのソースコードを読み、テストが必要なユーザー向け機能、UI 要素、検証ポイントを十分に理解します。
Step 1A — リポジトリからアプリの識別情報(名前、バンドル ID、パッケージ名)を推定する
コードベースのファイルを調べ、可能であれば識別情報を推定します。リポジトリが Android、iOS、クロスプラットフォームのいずれを対象としているか判断します。複数の識別子が見つかった場合は、最適な候補を提示し、どれが正しいかユーザーに確認します。リポジトリの構成から環境ごとに異なるアプリ識別子を使用していることが明らかな場合は、環境ごとの推定値を提示し、ユーザーに確認します。
- 推定ルール:
- 1 つの識別子がリポジトリのデフォルトであることが明らかな場合は、
.finalrun/config.yamlに記述します。 - 環境固有の識別子を明確に推定できる場合は、デフォルトを
.finalrun/config.yamlに残し、異なる値のみを.finalrun/env/<env>.yamlに記述します。 - 新しい環境名を作る前に、
.finalrun/env/*.yamlにある既存の環境名を再利用します。
- 1 つの識別子がリポジトリのデフォルトであることが明らかな場合は、
- ガードレール:
- より適切な情報源がない場合を除き、Android の
namespaceをアプリのパッケージ名として扱わないでください。 - すべてのフレーバーから環境名を自動的に推定しないでください。
free/paidはdev/staging/prodと同じではありません。 - 既存の
.finalrun/config.yamlのアプリブロックを黙って上書きしないでください。変更案を先に提示します。 - 複数のアプリモジュール/ターゲットが候補になる場合、または識別子を確実に特定できない場合に限り、ユーザーに確認します。
- より適切な情報源がない場合を除き、Android の
Step 1B — エッジケースと状態の分析
ステップ 1 で正常系の機能を理解したら、ソースコードを体系的に確認し、テスト対象としてユーザーが指定した UI に影響する状態依存のフローと空またはエラーの状態を探します。目的は、テスト可能なエッジケースを洗い出し、ステップ 4 で正常系とあわせて提案することです。
状態依存のフロー: 以前の状態によって UI の表示が異なる箇所を特定します。条件付きレンダリング、ルートガード、表示内容を変えるデータチェックのコードを確認します。
- 認証ゲート — 画面の表示にログインが必要ですか?セッションの有効期限が切れた場合や、ログアウト中の場合、ユーザーには何が表示されますか?認証チェック、ログインへのリダイレクト、ゲストモードへのフォールバックを探します。
- 初回起動時と再訪時 — 一度だけ表示されるオンボーディングフロー、チュートリアルのオーバーレイ、ウェルカム画面はありますか?
hasSeenOnboarding、isFirstLaunchなど、保存された設定を示すフラグを探します。 - 権限に依存する UI — 必要な権限(カメラ、位置情報、連絡先)が拒否されたとき、この機能は制限されたり、フォールバックが表示されたりしますか?UI の分岐に使われる権限チェックの結果を探します。
- フィーチャーフラグ/A-B テスト — この機能はオフにできるフラグで制御されていますか?該当する場合は、無条件にテストするものではなく、ユーザーが把握しておく必要のある前提条件として記載します。
空の状態とエラー状態: UI がデータなし、または失敗時に処理する箇所をすべて特定します。見落とされがちなため、これらは優先度の高いテスト対象です。
- 空のコレクション — リスト、フィード、カート、検索結果が 0 件の場合、画面には何が表示されますか?空状態のイラスト、「結果がありません」というメッセージ、「最初の項目を追加」などの行動喚起を探します。
- 検索結果がない場合 — 検索/フィルター UI には、デフォルトの空リストとは異なる空状態が表示されますか?
- フォームのバリデーションエラー — ユーザーが無効な入力を送信したとき、どうなりますか?フィールド内のエラー、概要バナー、無効化された送信ボタン、トーストメッセージを探します。コードで強制される各バリデーションルール(必須フィールド、形式チェック、最小/最大文字数、パスワードの不一致)を特定します。
- 境界値の入力 — コードで文字数制限、数値範囲、使用できない文字が定められていますか?これらはテスト可能です。最大文字数の入力を行い、切り詰められるか拒否されるかを確認します。
調査結果の扱い:
- エッジケースのテストを自動的に生成しないでください。候補としてまとめます。
- ステップ 4(プランの提案)では、見つかったエッジケースをメインのテスト計画とあわせて**「特定したエッジケース」**セクションに提示します。カテゴリ(状態依存、空の状態、バリデーションエラーなど)ごとに分類します。
- どのエッジケースを含めるかはユーザーに選んでもらいます。対象範囲外、または優先度が低いものもあります。
- 選択した各エッジケースのテストでは、同じセットアップと冪等なクリーンアップのルールに従う必要があります。セットアップでは、エッジケースに必要な特定の状態にアプリを強制的に設定します(例:空の状態をテストするためにすべての項目を削除する、権限拒否時のフローをテストするために権限を取り消す)。
Step 2 — 環境プロファイル(テストで ${variables.*} または ${secrets.*} を使用する場合、または環境ごとにアプリの ID が異なる場合は必須です)
- 確認:
.finalrun/config.yamlと、存在する場合は.finalrun/env/*.yamlを読み込み、既存のアプリ設定とバインディングキーを再利用します。 - ひな形の作成: フォルダーが存在しないか空の場合、環境固有のバインディングまたは環境固有のアプリのオーバーライドがテストで必要な場合に限り、ユーザーが必要とする環境ファイルを作成します(
dev、staging、prodなど、必要な名前を確認してください)。 - アプリの設定:
.finalrun/config.yamlにデフォルトのリポジトリアプリ ID が設定されていることを確認します。- コードベースから明らかな場合は、手動入力よりもリポジトリから特定したアプリ ID を優先します。
- リポジトリの構成から判断できない場合に限り、アプリ識別子が環境ごとに変わるかどうかを確認します。
- 変わる場合は、
.finalrun/env/<env>.yamlに環境固有のappオーバーライドのみを追加します。 - 変わらない場合は、アプリ ID を
.finalrun/config.yamlのみに設定します。
- YAML でバインディングを宣言する:
- テストで使用するシークレットではない値には
variables.*を追加します。 secrets.*は"${ENV_VAR}"のプレースホルダーとして追加します(安定したENV_VAR名を選び、ユーザーが設定する必要のある環境変数を明記してください)。
- テストで使用するシークレットではない値には
- 更新する環境ファイル: ユーザーに確認してください。 デフォルトでは、ユーザーが一部の環境のみを希望する場合を除き、すべての環境の設定を揃えるため、
.finalrun/env/*.yamlのすべてに同じキーを追加することを推奨します。 - 許可される環境ファイルの形式:
.finalrun/env/<env>.yamlには、app、variables、secretsのいずれか、またはそれらを組み合わせて記述できます。
生成される設定の推奨形式:
どの環境でも同じパッケージ:
app:
name: ExampleApp
packageName: com.example.app
bundleId: com.example.app
環境ごとに異なるパッケージ:
app:
name: ExampleApp
packageName: com.example.app
bundleId: com.example.app
app:
packageName: com.example.app.staging
bundleId: com.example.app.staging
Step 3 — 計画とフォルダーの確認
テストコードを作成する前に、重複を避け、機能ごとのグループ分けに従うため、必ず既存のテストディレクトリを確認してください。
-
.finalrun/tests/ディレクトリを確認します。テストは、機能名に対応するサブフォルダー(例:.finalrun/tests/<feature-name>/)にグループ分けされています。 -
現在のリクエストに関連する機能フォルダーを探します。
- 関連する機能フォルダーが存在する場合: その中の YAML ファイルを確認します。
- 関連するテストがすでに存在する場合は、既存ファイルの更新を計画します。
- 関連するテストが存在しない場合は、このフォルダー内に新しい
.yamlファイルを作成するよう計画します。
- 関連する機能フォルダーが存在しない場合: 新しい機能フォルダー(例:
.finalrun/tests/<new_feature_name>/)を作成するよう計画します。 - 関連する可能性のある機能フォルダーが複数ある場合: 作業を中断し、主要な機能としてどのフォルダーを使うかユーザーに確認します。
- 関連する機能フォルダーが存在する場合: その中の YAML ファイルを確認します。
-
.finalrun/suites/内のテストスイートについても、同様の手順を繰り返します。スイートファイルは概念上、機能フォルダーに対応させ、通常は.finalrun/suites/<feature-name>.yamlとします。既存のスイートを更新して新しいテストを含めるか、該当するものがなければ新しいスイートを作成します。
ステップ 4 — 計画の提案とレビュー
提案するテスト変更をユーザーに提示し、検証してもらいます。
- ファイルを更新するのか、作成するのかを明記します。
- 変更する予定の対象パスを正確に列挙します。
- 使用する予定の セットアップと冪等なクリーンアップ の方針を詳しく説明します(以下を参照)。
- セットアップのチェックリスト: テストで使用するすべての
${variables.*}と${secrets.*}を列挙し、.finalrun/env/*.yamlに追加する対応するエントリーを確認します(シークレットの行は${ENV_VAR}のみ)。 - 有効なアプリのチェックリスト: 変更の対象となる各環境/プラットフォームについて、FinalRun が使用すべきアプリ識別子を明記します。
- 推定内容のチェックリスト: リポジトリから推定したアプリ識別子、その根拠となったファイル、ユーザーによる確認がまだ必要かどうかを明記します。
- 特定したエッジケース: ステップ 1B で見つかったエッジケースを、状態に依存するフロー、空の状態、検証エラーのカテゴリー別に提示します。それぞれのシナリオと、検証する UI の動作を簡潔に記述します。テスト計画に含めるものをユーザーに選択してもらいます。
注意
ユーザーが提案した計画を明示的に承認し、質問に回答するまで、最終的なテスト/スイートの.yamlは絶対に作成しないでください。
ステップ 5 — FinalRun アーティファクトの生成
承認後、厳密な FinalRun YAML 構文に従って、テストとスイートを生成または更新します。
- 変数とシークレットの宣言: テストで
${variables.*}または${secrets.*}を参照する場合は、同じ変更セット内で対応する.finalrun/env/*.yamlファイルを作成または更新します(ユーザーの選択に応じて、すべての環境ファイルまたは一部の環境ファイルを対象とします)。
ステップ 6 — 検証
信頼できる情報源: finalrun check を実行します(複数の環境ファイルがある場合は、--suite または適切なセレクターと --env を指定します)。このコマンドはワークスペースを検証し、バインディングを解決して、不足している環境変数や未知のキーを検出します。
- バインディングの正しさを確認する際、場当たり的な grep のみを頼りにしないでください。受け入れ基準には
finalrun checkの結果を使用します。 - 編集後の検証と修正の一連の手順については、このスキルの最後にある「次のステップ」に従ってください。
技術仕様:テスト
許可されるアクションの語彙
setup または steps に記述するすべてのステップは、実行時エージェントが実行できるアクションに対応している必要があります。以下の自然言語の動詞を使用し、このリストにないアクションを作らないでください。
| ステップで使用する動詞 | 実行時アクション | UI の対象が必要ですか? |
|---|---|---|
| Tap / クリック | tap | はい(どの要素か) |
| 長押し | long_press | はい |
| Type / テキストを入力 | input_text | はい(どのフィールドか) |
| Swipe / スクロール | swipe | はい(領域と方向) |
| 戻る | navigate_back | いいえ |
| ホーム画面に移動 | navigate_home | いいえ |
| デバイスを回転 | rotate | いいえ |
| キーボードを非表示にする | hide_keyboard | いいえ |
| URL/ディープリンクを開く | deep_link | いいえ |
| 位置情報を設定 | set_location | はい(座標) |
| 待機 | wait | いいえ |
| Verify / 確認 | 視覚的なアサーション(エージェントが画面を調べる) | はい(確認する内容) |
「Verify」ステップは、デバイスのアクションではない唯一の例外です。現在の画面を目視で調べ、条件が満たされていることを確認するようエージェントに指示します。クリーンアップが機能したことを確認するには
setupで、中間状態を確認するにはフロー中のstepsで使用してください。
セットアップと冪等なクリーンアップのルール
重要
すべてのセットアップとクリーンアップのフローは冪等でなければなりません。 セットアップ手順を書く前に、アプリの以前の状態にかかわらずテストが正常に実行できることを確認する必要があります。前回の実行でデータが変更されている場合(項目が追加された、設定が有効になったなど)、このセットアップフローでまずクリーンアップする必要があります。
クリーンアップは冗長ではありません。 クリーンアップの手順がテストフローと同じ画面への移動を含む場合でも、必ず記載する必要があります。
| テストで検証する内容 | セットアップとクリーンアップのフローで必ず行うこと |
|---|---|
| 項目の追加 | 項目が存在するか確認し、まず削除/取り除く。 |
| 項目の削除 | 項目が存在するか確認し、存在しない場合はまず追加/作成する。 |
| トグルの有効化 | すでにオンの場合は、まずトグルを無効にする。 |
| 移動/並べ替え | まずリストが既知のデフォルト状態になっていることを確認する。 |
セットアップ手順には検証を含める必要があります。 クリーンアップ操作を実行した後、クリーンアップが成功したことを確認する「Verify」ステップを追加してから、次に進みます。クリーンアップに失敗した場合、メインの手順で誤解を招く失敗が起きるのではなく、セットアップの段階で早期にテストを失敗させる必要があります。
例 — 検証を含むセットアップ:
setup:
- "Navigate to the Shopping List screen"
- "If the item 'Milk' is visible, swipe left on it and tap Delete"
- "Verify that 'Milk' is no longer visible on the Shopping List screen"
良いテストフローの作成
- 具体的にする:実際の UI ラベルや認識しやすいコントロール(例:Settings 画面、Settings ボタン)を参照します。
- 画面上のコントロールを明確に示す:Save ボタンや Home 画面など、平易な表現を使用します。
- 変数:「
${variables.search_term}を検索フィールドに入力する」のような構文を使用します。 - 冪等性を優先する:テストがすでに実行され、一度失敗したものと想定し、セットアップフローでその状態を解消する必要があります。
- 許可されたアクションのみを使用する:各ステップは、上記の許可されたアクションの語彙表のアクションに対応している必要があります。このリストにないアクションが必要となる手順は記述しないでください。
- ステップ内の中間状態を検証する:複数ステップのフローで、後続の処理が先行するアクションの成功に依存する場合(例:確認画面をチェックする前にフォームを送信する場合)、その間に中間状態を確認する「Verify」ステップを追加します。
expected_stateは最終画面用にする:中間チェックをexpected_stateに記述しないでください。中間状態の検証には、steps内に「Verify」ステップを記述します。- 一時的な UI(トースト、スナックバー、一時的なバナー)の検証を避ける:短時間だけ表示されるメッセージは、通常 2~5 秒で自動的に消えるため、エージェントによる検証ステップとタイミングが競合します。
stepsやexpected_stateでこれらを検証しないでください。代わりに、持続する結果(更新されたリスト、バッジ数、遷移先の画面、変更されたフィールド値)を検証します。
位置コンテキストと検証
ランタイムエージェントは位置の厳密性を適用します。ステップで UI 要素の場所が指定されている場合、エージェントはその場所を厳密な条件として扱います。要素が説明された位置で見つからない場合、テストは失敗します。エージェントが別の場所を探したり、別の要素で代用したりすることはありません。
要素の位置がテストの一部である場合は、位置コンテキストを使用します: テストで、特定の UI 要素がレイアウト内の特定の場所に存在することを検証する場合は、位置を含めてください。位置を限定する表現には、画面領域(左上、右下)、コンテナへの言及(ツールバー内、ヘッダー内、ナビゲーションバー内)、相対位置(左側、右側、下、下部付近)、順序を示す位置(最初、最後)があります。
# Position matters — the test is verifying layout
steps:
- Tap the hamburger menu icon in the top-left corner of the toolbar
expected_state:
- The navigation drawer is open and visible on the left side of the screen
要素が存在することだけが重要な場合は、位置を省略します: 要素の表示位置を確認する必要がない場合は、ステップを一般的な記述にしてください。エージェントがスクロールして要素を探します。
# Position doesn't matter — just find and tap it
steps:
- Tap the Delete button
重要なアクションの前に、明示的な「Verify」ステップを追加します: アクションが特定の UI 要素の存在を前提とする場合(特に、位置を限定する表現がある要素の場合)は、その前に「Verify」ステップを追加してください。これにより、検証時に要素が見つからないことを検出でき、アクションのステップで原因が分かりにくいグラウンディングエラーが発生するのを防げます。
steps:
- Verify the hamburger menu icon is visible in the top-left corner of the toolbar
- Tap the hamburger menu icon in the top-left corner of the toolbar
レイアウトが重要な場合は、expected_state で位置を示す表現を使用します:
エージェントは空間的な記述を文字どおりに照合します。「左側に表示されている」は、ボトムシートには一致しません。「ドロワーの上部」は、下部にある項目には一致しません。
# Good — spatially precise
expected_state:
- The navigation drawer is open and visible on the left side of the screen
- The profile avatar is visible at the top of the drawer
# Bad — vague, could match unintended elements
expected_state:
- The navigation drawer is open
- The profile avatar is visible
厳密な YAML の書式
- インデントの深さは正確に 2 スペースにしてください。
- 文字列値に特殊文字(例:
:,#)が含まれる場合は、引用符で囲んでください。 - リストにはフラットなリストのみを使用してください(厳密に必要な場合を除き、複雑なネスト構造のリストは使用しないでください)。
- ディスクにファイルを保存する際、ファイルの内容を Markdown のコードフェンスで囲まないでください。ファイルの拡張子は
.yamlにしてください。
テストファイルのテンプレート(.finalrun/tests/<feature-name>/<file>.yaml)
すべてのテスト仕様ファイルは、次のスキーマに厳密に従う必要があります:
name: <snake_case_name>
description: <One or two sentences describing what the test validates.>
setup:
- <string>
steps:
- <string>
expected_state:
- <string>
3 フェーズの実行モデル: ランタイムでは、エージェントはテストを 3 つのフェーズで順番に実行します:Setup(クリーンな状態を準備)→ Steps(ユーザージャーニーを実行)→ Expected State(最終画面を検証)。3 つのフェーズすべてに合格した場合にのみ、テストは成功します。
各キーに関するガイドライン:
- name: 短く一意な識別子です。
- description: ユーザージャーニーの概要です。
- setup: 冪等性のルールに従い、クリーンな開始状態を保証するための実行可能なステップです。クリーンアップ操作の後には「Verify」ステップを含め、アプリが想定された開始状態にあることを確認してください。各ステップでは、許可されたアクションの語彙からアクションを使用してください。
- steps: ユーザー操作を時系列順に並べたリストです。各ステップでは、対象の画面、ボタン、フィールド、またはコントロールを直接指定してください。各ステップでは、許可されたアクションの語彙からアクションを使用してください。フロー中の中間的な UI 状態を確認するため、インラインの「Verify」ステップを含めることもできます。
- expected_state: すべてのステップ完了後に想定される UI の状態です。ここに記述するのは実行するアクションではなく、エージェントが最終画面に照らして確認する真偽条件です。すべての条件が満たされればテストは合格し、いずれかの条件が満たされなければテストは失敗します。ここにナビゲーションや操作の指示を含めないでください。
スイートファイルのテンプレート(.finalrun/suites/<feature-name>.yaml)
スイートはテスト仕様を論理的にグループ化します。ある機能のテストを定義する場合は、それらをまとめるスイートが必要です。すべてのスイートファイルは、次のスキーマに厳密に従う必要があります:
name: <feature_suite_name>
description: <One or two sentences describes what the suite covers.>
tests:
- .finalrun/tests/<feature-name>/<file>.yaml
次のステップ
テスト仕様、スイートマニフェスト、必要に応じて環境ファイルを作成または更新した後:
- 変更した範囲に対して
finalrun checkを実行します。 スイートを検証する場合は.finalrun/suites内の--suite <path>を使うか、位置引数のセレクター(.finalrun/tests/内の YAML パス、ディレクトリ、グロブ)を渡します。ワークスペースに.finalrun/env/*.yamlファイルが複数あり、CLI で選択が必要な場合、または特定の名前付きプロファイルを検証する場合は、--env <name>を渡します。 finalrun checkが失敗した場合は、 コマンドの出力を正しい情報として扱います。よくある修正箇所:.finalrun/env/<env>.yamlにvariables.*/secrets.*の不足または誤記がある(環境名ごとに1つのファイルを用意します。たとえばdev.yamlとし、シェル変数名にはしません)、仕様内の参照が宣言済みのキーと一致していない、または必須のsecrets.*の値がシェル/CI 環境にエクスポートされていない(YAML 内のプレースホルダーは"${SHELL_ENV_VAR}"のままにしてください。シークレットを平文でコミットしないでください)。- 環境ファイルを編集する際は、このスキルのルールを適用します。 Variables & secrets および Step 2 — Environment bindings に従ってください(キーを再利用し、シークレット用のプレースホルダーを追加し、ユーザーが一貫性を求める場合は環境ファイル間でキーを揃えます)。
- 成功するまで
finalrun checkを再実行します。 エラーが仕様の構造またはパスを指している場合は、該当する YAML ファイルを修正して、再度チェックします。
finalrun が PATH にない場合は、チェックの出力を信頼する前に、インストール方法を解決するか、絶対パスで実行してください。