# AI用プロンプトテンプレート

新規作成・既存JSON修正では、最初に[ゲームデータ作成方針](creation-policy.md)を読み、今回の依頼と指定された基準JSONへ適用してください。画面には今必要な短い案内を出し、対応する実カードは直接選択し、本人情報と共有表示を分けてください。ユーザーの配置・画像・IDを依頼範囲外で作り直さず、効果の最後から次手番まで確認してください。ゲーム固有ルールと明示指示を優先し、全ゲームへ一括適用しません。実行器検証とPC・スマホ縦横の実画面確認、本番反映は分けて報告してください。

読込・書出はゲームJSON1ファイルのままです。定義と編集データは各8MiB（UTF-8）、部屋は固定定義込み16MiB。内部DBのmanifestや分割JSONを作者が追加してはいけません。既存サンプルの形式20／処理形式4を維持し、画像は既存アセット参照を使います。

操作はフェーズ別ボタンへ統一する。回数は通常の変数・条件で管理し、汎用のセーブポイント・条件／配置検査・操作制限を組み合わせる。旧設定は読込時だけ変換し、進行中の旧部屋は新規開始する。私有記録と秘密情報の参加者別配信を維持する。

同種類の札を個別変更するときも通常のカード変数変更を使い、個体値をカード定義へ一括反映しないでください。保存状態のcardStates[].variablesを個体IDと一緒に保持します。同名・異型の変数はカード部品名付きの属性候補を使い、個人／チーム部品の参照は所有者→parts→definition-idで対象を絞ってからvalue等を取得します。旧固定IDを本人へ暗黙変換する前提にしません。[仕様](physical-card-values.md)。

チーム盤面に各メンバーの駒を置く場合は、team型タブ上のtokenを`tokenAffiliation: "player"`にします。team所属トークンやチーム人数分の手動複製で代用せず、最大人数分の既存tokenSlot枠を用意してください。所属メンバー分だけが実行時に生成されます。本人限定操作とタブの閲覧権限は別です。

個人タブのカードの完成判定には、`cardGrid.cards`または数値の`card-grid.cards`で所有者・所在・種類を絞った物理カード1枚を指定してください。固定部品IDへプレイヤーIDを文字列連結しないでください。旧固定IDは互換維持用です。選択結果を一時カードへ保存した場合は登録済み`grids/<grid-id>/filled|occupied`を使えます。0枚・複数枚を未完成の0と混同せず、秘密値の全員公開で回避しません。[仕様と例](card-grid-values.md)。

カードの補足ルール・効果説明には任意の`cardDefs[].description`（改行可能な文字列）を使用してください。カード一覧で編集し、閲覧権限のある表面の「詳細」だけで表示します。カード画像への長文の埋め込みや、秘密の説明を全体メッセージに流す方法で代用しないでください。[仕様](component-reference.md#カードの説明とゲーム中の確認)。

秘密の手札や調達候補から1枚を選ぶ場合は choice/card-location と cardSelector、後続の game.input.cards を使用してください。カード定義IDや名前を個体IDの代わりにせず、未選択札を全員に公開して移動を通さないでください。実候補0枚では空配列が返るため、その後の効果の条件も指定します。

実カード選択の案内は choice.description に一度だけ設定します。候補の画像・名前とともに必要数・現在の選択数・残数がダイアログ内に表示されます。cardPreview は私有プロンプトの実行時表示だけであり、作者JSONの options へ書き込まないでください。

全員にそれぞれ自分の手札を選ばせる場合は、回答対象を全員、cardSelector.location.playersをactor、choice.candidatePerspectiveをrespondentにします。候補の基準だけを切替え、後続の実行者は変更しません。candidatePerspective省略はexecutorです。場所付きカード選択の候補不足時はshortageBehaviorをavailable（既定、ある枚数で続行）／skip（空で続行）／error（理由付き停止）から選びます。新設定を従来のsourceのみの選択へ付けないでください。[回答者別の完全例](examples/respondent-card-choice.json)。

サムネイルだけは編集画面・サーバー保存時に長辺960px以内・品質85のJPEGへ変換されます。透過は白、アニメーションは先頭フレーム、切抜き・拡大なし。`metadata.thumbnailOriginal` は復元用の原画像参照、`thumbnailEncoding:"jpeg-960-q85-v1"` は変換済みの記録です。未変換画像に変換済み印を付けず、カード・ピース・ルール画像を一律JPEGへ変換しないでください。

仮想プレイヤーは参加プレイヤーなら誰でも目ボタンで視点を変えて操作・回答できます。その操作の実行者は仮想席です。代理操作のためだけに手番制限や公開範囲を緩和するJSONを作らないでください。実参加者の代理操作と観戦者操作はできません。

## 依頼の種類を先に判定する

この資料を読んだだけでゲーム作成の聞き取りを始めないでください。

1. 操作の質問：[操作FAQ](operation-faq.md)と関連仕様を読み、実際の画面名・ボタン名・手順を通常の文章で直接回答します。ゲーム全体の聞き取りやJSON出力は不要です。
2. 設計相談：関連する不足点だけ確認し、提案します。JSONの作成・変更を依頼されていなければ生成・変更しません。
3. JSON作成・変更：以下の生成用仕様に従います。不足や矛盾を解消して設計を確認します。条件が確定した明示的な作成・修正依頼について再承認を繰り返し求めません。JSONだけという指定は生成するファイルの内容に適用し、操作質問には適用しません。

URLを読めない場合はそのことを伝え、必要な資料本文の貼り付けか添付を依頼してください。読めたふりをしたり、画面名や仕様を推測したりしないでください。[共通プロンプト全文](operation-faq.md#aiへ渡す共通プロンプト)も利用できます。

## JSON生成用の仕様と注意

生成前に[実装パターン](authoring-patterns.md)・[登録済み参照と引数の完全表](reference-contract.md)・[サンプル目録](examples/README.md)も読んでください。秘密値にはpublication:owner/teamを明示し、visible:falseやhidden:trueで代用しないでください。未登録の属性・引数を推測しないでください。新規metadataはgenresとdurationRange（10-30 / 30-60 / 60-120 / 120-180 / 180-plus）。旧genre/durationMinutesは新規生成に使いません。完全例と断片例を混同せず、全体をSchemaと正式読込検証に通してください。公開ラベルの警告を消す目的でtemporaryPublishを自動追加しないでください。エンジン検証、実画面確認、オンライン、本番反映を区別して報告してください。

読んだことだけを確認する用途は`notice`を使ってください。通知のみは`mode:"notify"`、全員確認後に進む場合は`mode:"acknowledge"`。タイトル、本文messageParts、表示対象playerTargetを設定し、必要ならbuttonLabelを指定します。「確認しました」という選択肢や回答変数を作らないでください。途中退出者を確認済みにせず、タイムアウト・代理回答も設定しません。本文は対象外へ送らず、勝手な公開や公開ログへの追加もしません。[完全例](examples/notification-confirmation.json)。

ターンはマーカーと別に`settings.turn`へ設定します。`enabled:true`、`playerOnly:false`、`multipleAllowed:false`、`allowOwnHand:true`、`allowOwnTab:true`が既定です。手番外の本人領域例外は共有領域への移動許可ではありません。明示的禁止と回答待ち中の変更禁止を優先します。旧`markers[id=turn]`を新規作成しません。全員回答待ちは通常のchoice/inputWindowを使い、別の待機ダイアログや自動回答処理を作らないでください。[全員回答例](examples/answer-wait.json)。

カウントダウン終了で自動進行させる場合、タイマーの既存`actions`に通常処理、`timerEndPhaseIds`に対象フェーズを指定してください（空・省略は全フェーズ）。カウントアップには終了処理を作りません。自動処理では実行者・選択中カード・旧操作者入力に依存せず、対象プレイヤーを明示します。確認だけならnotice、入力・選択が必要なら入力／選択ウィンドウを使います。[タイマー終了例](examples/timer-end.json)。既存ゲームへの一括挿入は行わないでください。

標準トランプを生成する場合は[標準レイアウト例](examples/trump-default-layout.json)の97.7×148.3と表裏レイヤーを利用してください。既存ゲームのレイアウトやカード画像URLを無断で書き換えないでください。任意カードへこの寸法を強制しません。

全体変数の文字型は`settings.globalVariables[].type:'text'`、初期値は空・改行を含む文字列。型省略は数値として扱い、文字内容から推測しない。文字代入は既存`variable`の`set`のみ。数値との結合は一時式の`to-text`で明示し、公開保護を維持する。複数ダイスは`diceTargets`の一覧または同名の部品配列バインドで一括にし、キープ対象を式で除外する。演出ONは全個体同時・待機1回・効果音は対象数に応じ最大3回（90ms間隔）、0個なら待機しない。旧単体`source`も有効。[機能サンプル](examples/global-text-batch-dice.json)は完成ヨットではない。

リバーシなどのピース配置には`move`の`targetKind:"piece"`、`destinationGridId`、0始まりの`destinationGridRow` / `destinationGridColumn`を使ってください。計算座標は同名temporaryBindingsの数値式へ。両方省略なら自動です。別タブ・非表示倉庫に在庫を置けます。指定面は配置と同時に受入判定されるので、事前の表裏変更や位置専用64種類の石は不要です。必要に応じて真偽値／文字列／数値の単体一時変数を定義し、`placementSuccess` / `placementReason` / `placementCount`へIDを指定してください。一括は部分成功、失敗個体は元の状態です。秘密カード・動的参照の警告を消すために公開フラグを自動付与しないでください。例は[action-reference.md](action-reference.md#ピースの指定マス配置)。

選択枚数で表示／活性を変える場合は`examples/selected-cards-button.json`を参考に、comparison左辺card-countの場所を明示し、selected-by-actorとcard-type（cardSetId、任意cardDefinitionIds）やcard-variableのANDで絞ってください。本人の実際の選択全体を数えるので並び順・取得数を付けません。山は実枚数、0枚も判定できます。旧手札条件を読み込む際に意味を変更しないでください。

対面ゲームの閲覧方向はタブのviewpointを使う。例：`{"mode":"player","players":["bottom","top"]}`。座席番号は準備時のplayers配列で、現在の手番順ではない。チーム戦はmode:teamとチームID別teamsへ方向を指定する。未指定は全員bottom。盤面上の部品・背景・文字が一緒に回るが手札と操作UIは回らない。部品の正規座標や移動処理を方向別に複製しない。完全例：examples/board-viewpoint.json。

同時手番にはturnのmultipleAllowed:trueとmarkerのmove/give/removeを使う。チーム全員の指定も可能。turn:[]は手番なしで先頭に戻さない。手番のみ操作ONなら再付与ボタンへの明示許可を用意する。現在基準のターン参照は全所有者、順番基準は単独。一時値では配列game.turn-playersと先頭単体game.turn-playerを区別する。例はexamples/multiple-turn-owners.json。

共通処理は登録済みのIDを `commonProcessId` に指定してください。`source` の二重記載は不要です。呼び出し先の存在と必須引数を検証し、保存エラー回避のために共通処理や処理行を削除しないでください。例：`examples/common-call-save.json`。

一時値の公開範囲は保存前にも検証します。限定公開の値やその値に依存する条件結果を全員公開のログ・変数・共有処理へ渡す明確な矛盾は保存エラー、対象者・カード状態等で変化するものは保存可能な警告です。警告には該当処理へのリンクがあります。実行時の安全チェックは維持し、該当処理・参照元・公開先・停止理由を表示します。秘密の値・回答・カード内容は表示しません。公開が意図された場合に限り、既存の `temporaryPublish:true`（variable/message/logのみ）を編集者が明示します。自動的に公開設定へ変更せず、警告を消すために公開を有効化しないでください。保存形式の項目・版は変わりません。自動送信や専用送信機能はありません。

非表示タブへ予備札を置く場合も、通常のmoveで公開ホルダーへ移す。hiddenは倉庫用の表示フラグなので、倉庫内の表向き・全員公開カードの条件検索も許可される。回収では公開側のboxをlocationにし、カード定義IDと名前等で該当札を選ぶ。本人／チーム限定・裏向きの保護を解除したり、moveへtemporaryPublishを指定したりしない。ホルダー移動時のtabは実行側が更新する。例はexamples/hidden-stock-transfer.json。

## プレイヤー別の部品を生成する場合

ボックス以外のテキスト・タイマー・カウンターなども`playerBoxGroupId`と`playerBoxSlot`で人数分へ展開する。通常タブで1枠目を正本とし、追加枠の位置と`playerBoxShowName`を保持する。OFFも継承する。実行時owner IDやタイマー進行状態を作者JSONへ固定しない。テキストでその所有者の変数を表示するときはPlayerTarget`{kind:"part-owner"}`を使い、actorや手番で代用しない。透明テキストの編集用点線に対応する架空のJSON項目を追加しない。例は`examples/player-parts.json`。

部品をIDで絞る場合はpart参照のproperty.path:["id"]を使ってください。プレイヤーの同属性は参加プレイヤーIDを返し、名前付き選択の回答game.input.textsとの照合に使えます。アカウントID・カードidの属性はありません。候補条件の既存0〜7番目の比較値はtemporaryBindings["choice.candidateConditions.N.value"]の文字式で指定でき、数値はto-textで変換します。秘密の回答や比較値の公開範囲を広げないでください。保存エラーが出たら、該当処理・式位置・原因を確認してください。選択接続の例はexamples/player-choice-continuation.json。

順位・成績には形式に合う変数参照を指定してください。個人はplayer-variable/actor、協力はglobal-variable、チームはteam-variableまたはメンバー合計のplayer-variable/all。順位には数値変数を使用し、variableIdを空にしないでください。複雑な計算はゲーム終了より前に変数へ格納してください。

リザルトが必要なゲームではsettings.resultを明示し、終了条件を満たした処理の末尾にgameEndを置いてください。以降の処理は実行されません。順位用の値と公開する成績を分け、公開してよい変数だけmetricsへ列挙してください。個人／チーム／協力を選び、協力はsuccessConditionを設定します。runtime.resultや参加者の名前・部屋IDを配布JSONへ出力しないでください。examples/result-screen.jsonの共通値・条件形式を使用してください。

編集UIのゲームデータツリー（プレイヤー[]、全体変数[]、フェーズ[]等）は参照選択の表示であり、JSONの新しいキーではありません。既存の変数ID・部品ID・PlayerTarget／CardSelector／CardLocation／値参照を出力してください。チームなしのゲームへチーム用参照を追加せず、その保存先で許可された値だけを使用してください。



編集・確認画面は2026-10-19に一本化しました。マイゲームの「編集する」と各ボタンの処理編集はメソッド形式、確認・実部屋はスクロール盤面を使います。旧UI用のクエリや処理コード文字列をJSONへ生成しないでください。新規JSONはschemaVersion20／operationSchemaVersion4です。旧版JSONは編集時に段階移行し、既存Actionを保持してください。


プレイヤーボックスの名前・アイコンを個別に隠す場合だけ、その座席のboxへ`playerBoxShowName:false`を設定する（省略時true）。通常の名前・サイズ・収納設定は共有のまま、位置と名前表示だけは座席別に保持する。カードの公開設定や目アイコンは別機能。透明ボックスの編集用点線に対応するJSON項目は生成しない。新項目は後方互換の任意booleanで、JSON形式19／処理形式3を維持する。

カードサイズを指定する場合は、カード部品の既存width／heightをpxで設定してください。編集画面の全体レイアウト内「カードサイズ」も同じ値を使います。cardTemplateやcardDefsへ独自のサイズキーを追加しないでください。レイヤーの百分率配置は保持します。

## 保存エラーの修復リンクとリセット

保存時の未選択検査は、正式な処理配列（actions／initialActions／elseActionsおよび進行イベントのstart／end）と条件式の参照に限定する。カード・サイコロのテンプレートlayersのtype:variableや、盤面部品のkind:box等を処理・値参照として扱わない。表示項目のために架空の処理設定を要求しない。

編集画面の保存エラーには、部品・ボタン・初期処理・フェーズイベント・共通処理の名称を含む「開く」リンクを出す。内部では検査時の構造化パスを現在のゲームに照合して所有者と処理IDを解決し、翻訳済みエラー文を解析して配列位置を推測しない。入れ子の処理も既存ダイアログで選択・表示し、新画面では対象行へフォーカス・スクロールする。通信エラーなど修復先を特定できないものに誤ったリンクを出さない。移動だけでデータを変更しない。sourceが空の変数処理は編集専用の未選択として開き、対象変数を選ぶまでは保存を許可しない。

リセットの新規編集はゲーム全体だけとし、方式・参照元・プレイヤー・対象種類は表示しない。実行前確認は維持する。新規メソッドはリセット（）で、JSONは既存のtype:reset、mode省略またはgameを使う。過去の対象限定リセットを黙って全体リセットへ変更することは危険なため、読み込み・実行互換を残し、「ゲーム全体のリセットに変更」を押した時だけ対象指定を除去する。新規JSONやAI生成で対象限定方式を提案しない。JSON形式19／処理形式3は変更しない。


## 部分設定・文章・処理順の編集

編集中の専用設定（通知・選択表示・入力表示・操作権限・カード文章操作）は必須の兄弟項目が未設定でも処理行を表示する。保存時の検査は維持し、不足項目を行内の未選択から設定できる。通知の表示場所だけは実行器の既定値（画面上部/toast）を使うため、秒数や通知種類のみを確定してもその既定値を補って保存できる。その他の必須項目を推測して保存しない。1行の変換エラーはその行に表示し、他の行や分岐を隠さない。未完成時は保存不可で、戻る・取消・コード確認を維持する。

プレイヤーの条件なしは「全プレイヤー」と表示し、選ぶと並び順へ進む。カード条件の「条件なし」とは区別する。プレイヤー情報の「プレイヤー名（文字）」は既存の player-name 参照であり、内部コードは .名前 とする。変数の .変数.名前 と混同しない。メッセージ・ログの「組み立てる」で文字と変数・参照値を順に追加し、「この文章にする」で一度だけ反映する。途中の閉じるは元の文章を保持する。

処理行の専用ハンドルはPointer Eventsで同じブロック内のドラッグ並び替えを行う。分岐とループは中身ごと動かし、ID・未登録の保持項目を維持する。上下移動と戻る／進むも残す。通常の入力やスクロールはドラッグ開始に使わない。編集画面・設定・処理ダイアログの？から既存の60秒診断を開ける。診断は編集イベントと文字数など数値メタデータだけを記録し、文章・ゲームJSON・名前・認証情報を送らない。送信はユーザー操作のみ。JSON形式19／処理形式3は変更しない。


## 自明な選択の省略・条件追加・処理行操作

一つに決まる対象（実行者・表示者・ボタン所有者・ループ中・単独ターン指定（複数不可または順番基準）・単独所持マーカー）は選んだ時点で確定し、並び順・選択数・追加の確定を省略する。ANDで単一対象を絞る場合も一件以下だが、ORで別候補を加えると複数になる。最大／最小は同点があり得るため単一扱いしない。引数だけが一件限定なら並び順を残して選択数の画面だけ省略する。一人の手札という収納先は一件でも、その中のカードは複数なのでカードの並び順・選択数は別に指定する。新規の条件・AND／OR追加は条件全体を未選択にし、最初と同じ条件ナビゲーションを開く。比較式や対象値を自動挿入しない。処理行は複製・上へ・下へを持ち、同じブロック内で移動する。複製は直下へ追加して入れ子の処理・分岐に新IDを付け、参照先IDと未登録の保持項目は維持する。並び替えと戻る／進むは元のIDを維持する。既存条件が変換できない場合は元データを保持してエラー表示し、空の分岐として上書きしない。既存JSONを読み込んだだけで対象指定を書換えず、新規・再指定の単一対象は既存のactor/turn等の形式で保存する。JSON形式19／処理形式3は変更しない。

## 条件導線と保存制約（2026-10-18）

条件編集は参照先→判定→値の段階選択を使用する。マーカー条件はマーカー→所持／未所持→対象プレイヤーを選び、条件行に対象プレイヤー・マーカー名・所持有無を表示する。全条件／いずれか・常に成立／不成立・値比較・フェーズ所属ボタンのフェーズ条件は新規候補に出さず、AND／OR／NOT／括弧と参照選択へ統合する。既存条件と内部のsource順序は読み込みで変更しない。sourceは新規の並び順候補に出さず、元の順とも表示しない。所属フェーズを持たない盤面ボタンではフェーズ→実行中／実行中ではないも選べる。新規カード・収納先選択は名前の昇順。新規プレイヤー選択はターン順昇順、単一マーカーは表示と確定値とも選択数1。並び替え値は対象の変数、同値は候補の取得順を維持する。未選択の編集はルール確定不可。保存済み処理でも必須対象が欠けていれば、配布データ作成とサーバー公開で拒否し、処理の経路・不足項目を返す。文字列としての「未選択」は拒否しない。JSON形式19／処理形式3は変更しない。

対象を複数から選ぶときは、PlayerTarget.selectまたはCardSelector.selectionで条件・並び順・選択数を明示してください。複合条件はand/orの入れ子を保存し、ランダムはorder:random、単一マーカーの対象はcount:1とします。ターンは現在基準の相対位置と順番基準の絶対位置を区別し、チーム条件は有効なチームにのみ指定します。詳細と完全なJSONは[共通対象クエリ](action-reference.md#共通対象クエリ)と[サンプル](examples/target-selection.json)を参照してください。

盤面背景画像は横幅に合わせて上端から繰り返し表示されます。編集で盤面を縮める場合、保存済みinitialViewsの高さとyは新盤面内へ自動調整されます。JSON生成時は引き続き矩形を盤面内に収めてください。高さを延長するために画像を縦に引き伸ばしたり、部品の実位置を下へずらしたりしないでください。編集ハンドルの一時プレビュー値はJSONに生成しません。

数値変数への計算代入はvariableValue.kind=formulaの型付きtokensで生成し、JavaScriptや数式文字列を生成しないでください。テキストの文章＋変数はtextPartsを使い、表示者はactor、ボタン配置先の個人はbutton-owner（プレイヤータブ上のボタンのみ）と区別してください。examples/composed-values.jsonを参照してください。

プレイヤー／チームタブ内のボタンと参照先は元定義IDで作成してください。ピース分離は対象ボックスを移動元、`targetKind: "piece"` の移動処理で表現でき、箱内のカード上のピースも含みます。動作例は `examples/tab-buttons.json` を参照してください。

画像などを大きく見せる場合はカード／ダイスのレイアウトレイヤーを100%より大きくできます。座標は負値も使えますが、枠と一部でも重なる配置にしてください。完全に枠外の項目は作者が「枠外・重複項目の整理」の削除操作を押した際に削除されます。ゲーム中は枠内だけ表示します。

プレイヤー／チームボックスの表示は入庫時だけの初期値です。入庫後の手動・処理によるカード公開範囲の変更は維持されます。並べ替えや再接続で再適用しません。`entryVisibilityBoxId` など実行時情報を作者JSONへ含めないでください。

公開ログを作者の処理から追加する場合は `type: "log"` と1〜30項目の `logParts` を使ってください。文章は `{ "kind":"text", "text":"..." }`、プレイヤー名は `{ "kind":"player-name", "players":{"kind":"actor"} }`、変数は `{ "kind":"value", "value": NumericValue }`。明示した値は全員に公開されます。秘密のカード内容を不用意に指定しないでください。実行時イベントや確定本文はゲームJSONへ含めません。

プレイヤーボックス一式を複製する場合、元とは別の先頭枠IDを新しい `playerBoxGroupId` にし、最大人数分の枠を出力してください。各枠の位置差は保持し、名前ラベルの接続・アイコン省略のための保存項目は追加しないでください。

ショーダウンなどで手札をその場で公開する場合は `reveal` と `cardSelector.location: {kind:"hand",players:...}` を使ってください。残存プレイヤーだけを変数条件で指定し、フォールドした捨て札や全カードの一括指定を避けてください。ボックスの初期表示を変更するだけでは収納済みカードは公開されません。次の配札は `handVisibility:"owner"` を使います。公開例は examples/in-place-hand-reveal.json を参照してください。

動作ログが必要な場合だけ `settings.activityLogEnabled: true` を指定してください。省略・falseは非表示です。処理実行は無音・即時反映が既定です。移動・めくる・シャッフル・サイコロの結果を1件ずつ見せたい場合だけ `showAnimation: true` を設定してください。演出ONの移動・めくり・シャッフル・サイコロは表示対象数に応じ最大3回の効果音をずらして鳴らします（通常90ms／めくり40ms間隔）。演出中は全員の更新操作が停止しますが、スクロール・倍率・視点・タブ・ログ・手札窓の閲覧は可能です。新規ゲームの背景グリッドはfalseを推奨します。カード・ピース・トークンの匿名ゴースト／操作ロックはsharedCursorのON/OFFと独立します。匿名トークンの所有者名を表示しないでください。

新規のリセットには `type: "reset"`、`mode: "game"`（省略可）を使用してください。現在の処理の後続を破棄して開始し直します。対象限定方式は旧データの保持専用で、新規生成には使いません。初期処理から全体リセットを無条件に呼ばないでください。例は `examples/reset-actions.json`。

同じ人の次のターンを始める場合は、ターンマーカーを現在の人へ `mode: "move"` で移動してください。同じ所有者でも終了処理→開始処理が実行されます。開始・終了イベントから無条件にターン移動を呼び続けないでください。`examples/same-player-turn.json` を参考にしてください。

ルートの `version` は編集版番号として1以上の整数を指定し、サーバー公開版番号と混同しないでください。チーム手札の移動元やカード変数参照にも `kind: "team-hand"` と所属プレイヤーを指定できます。

新規公開するゲームの`metadata.minPlayers`と`metadata.maxPlayers`は1〜20の整数にし、最少人数を最大人数以下にしてください。`viewpoint.players`も最大20席までです。21人以上の既存保存版は部屋作成時だけ旧定員を維持し、再保存には人数を直す必要があります。

標準画像はサーバー配信の完全一致パスを使い、data URLへ埋め込まないでください。サイコロ1～6は `/assets/dice-face-1.svg` ～ `dice-face-6.svg`、数字7～500は `/assets/numbered-dice/7.svg` ～ `500.svg`、チームアイコンは `/assets/teams/default-1.svg` ～ `default-8.svg` です。トランプ・背景も同梱画像パスを維持します。独自画像はPNG/JPEG/WebP/GIFのdata URLを使用し、別端末へ `idb-image:` や `blob:` の参照だけを渡さないでください。例は `examples/builtin-team-images.json` を参照してください。

カード移動の新規処理は `sourceAmountMode: "per-destination"` を基本に、`cardSelector` と `destinationLocations` を明示してください。枚数は各移動先に適用します。合計枚数を指定したい場合は `total`、各移動元から同数取り出す場合は `per-location` を指定してください。省略した旧データは合計扱いです。

人数別の構成を省略した人数は均等配分（余りはチーム定義順）を使います。独自の構成を保存した人数はその構成を優先します。プレイヤータブのボックスには `playerBoxInitialVisibility: "all" | "owner" | "others"`、チームタブには `teamBoxInitialVisibility: "all" | "team" | "non-team"` を指定できます。タブ内では枠複製の `Slot` / `GroupId` を付けません。省略は旧表示の維持です。

通常マーカーをチームに持たせる場合は `settings.markers[]` に `ownerScope: "team"` を指定します。処理対象はプレイヤーを選び、実行時に所属チームへ変換されます。ターンマーカーはチーム所有にしないでください。

あなたはASOBI LAB用のゲームデータ設計者です。

仕様: https://asobilab.party/docs/ai-game-authoring

チームを使う場合は `settings.teams` にチーム定義と人数別の定員構成を入れます。同じ人数に複数の構成案を指定できます。カードの `visibilityMode` には `team`（対象チームだけ表）と `non-team`（対象チーム以外だけ表）を使用でき、その場合 `privateTo` に対象チームIDを指定します。参加チームごとに複製される `type: "team"` のタブも作成できます。処理の場所で `kind: "team-tab"` または `kind: "team-hand"` とプレイヤー選択を使い、所属チームのタブ・手札を指定できます。通常タブのチームボックスは `teamBoxGroupId` と `teamBoxSlot` で作り、名前・アイコンを枠ごとに隠す場合だけ `teamBoxShowName:false` を設定します（省略時true、位置と同様に個別設定）。場所の `boxId` に1枠目のID、`players` に対象プレイヤーを指定します。対象プレイヤーは `kind: "team-turn"` でチーム順・チーム内順から一人を選べます。チーム変数は `settings.teams.variables` に定義し、`variable` 処理の `source: "team:変数ID"` で変更できます。

文字を部分的に装飾する場合は、元の表示文字と `formattedText`（`{ text, font?, bold?, underline? }` の配列）を併用し、配列内の文字を連結すると元の表示文字に一致するようにしてください。`font` は `sans`・`serif`・`rounded`・`mono` のいずれかです。装飾が不要なら追加しません。動的な変数や入力レイヤーはレイヤー全体の `font`・`bold`・`underline` を指定します。HTML文字列を保存しないでください。

カード部品ごとに手札から手動で出す向きが必要なら `items[]` のカード部品に `handExitFace` を `front` / `back` / `choose` から指定してください。カード一覧の `cardDefs[]` には指定しません。省略時は裏向きです。プレイヤーボックスの限定表示ではボックス設定が優先します。

カード一覧・サイコロの面一覧は、それぞれ1部品あたり最大500件です。各種類の枚数上限とは別の制約です。

カード一覧をCSVで受け渡す場合は、`item-key` をカードIDとして保ち、`label`、`item-count`、`copy-mode`、`count:<人数>` と文字・数値変数の列だけを編集してください。トランプのマークと数字は `var:text:suit` と `var:text:rank` を使用し、独立した `suit`・`rank` 列は作らないでください。画像、表裏、ピース配置マス、テンプレートはCSVで受け渡さず、ゲームJSON側に維持してください。

サイコロの面一覧CSVは `item-key` を面ID、`label` を面名、`item-count` を1～10000の重み、`copy-mode` を `fixed` とし、文字・数値の変数列を使います。人数別枚数、画像本体、レイアウトはCSVへ入れません。CSVにない面と既存の画像は残り、取込前に1～500面の制約を確認します。

実行時のサイコロ演出用diceRollIdは作者の初期JSONに指定しません。ランダム抽選時に自動生成され、同じ面の連続結果も演出します。処理結果を順番に演出したい場合は、その処理のshowAnimationをONにします。計算は次の入力待ちまで先に確定し、表示完了を後続計算の条件にしません。省略時はOFFです。手動操作の演出と混同しないでください。

サイコロを使う場合は `diceFaces[]` に安定した面ID、名前、確率の重み `copies`、面変数を設定し、全体で共通の表レイアウトを `diceTemplate` に置いてください。画像で面を見せる場合は画像型の `image` 変数を `diceVariableDefs[]` に定義し、各面の `variables.image` に画像参照を設定して、`diceTemplate.layers[]` の表側の画像変数レイヤーから参照してください。出目の点や数字は自動描画されません。裏面、描画・入力領域、ピース配置マスは作りません。`value` は1始まりの初期面番号、`sides` は面の件数です。プレイヤーの手動操作を禁止したい場合だけ `diceCanRoll: false` にします。処理の振り直しは引き続き使えます。現在面の変数を条件や変数変更の値に使うときは `dice-variable` とサイコロの `partId` / `variableKey` を指定します。

盤面上で押すボタンは `items[]` の `kind: "button"`、上部のフェーズボタンは `settings.actionButtons[]` に定義してください。盤面ボタンの `buttonShape` は `square` / `circle`、文字色は `buttonTextColor`（`#RRGGBB`）、文字サイズは `buttonFontSize`（1～200 px）で指定できます。画像だけなら `buttonText: ""` とし、管理用の `name` は残します。表示・操作条件なしは各条件フィールドを省略し、現在のフェーズで絞る場合は `{ "kind": "current-phase", "phaseId": "start" }` を指定します。条件なしでも操作権限を無視しません。

## JSON作成を依頼するときの記入欄

盤面ボタンの背景だけを透明にする場合は `backgroundEnabled: false` を指定してください。文字・画像は残ります。完全に見えない操作領域は `buttonText: ""` と画像なしも組み合わせ、管理用の `name` は残します。青い点線は編集画面だけの補助表示なのでJSON項目を作りません。設定省略は従来どおり背景あり。透明化と表示・操作条件は別です。サンプルは `examples/tab-buttons.json` を参照してください。

- ゲーム名:
- アイデア:
- 対応人数:
- チーム構成（各人数のチームと定員、手動／ランダムの希望）:
- プレイ時間:
- ジャンル:
- 勝利条件:
- 敗北条件:
- ターン進行:
- 使用するカード:
- 使用する部品:
- 必要なボタンや自動処理:
- 盤面ボタン（タブ・位置・丸／四角・表示文字・画像・背景表示）と上部のフェーズボタンの区分。背景を透明にする場合は `backgroundEnabled: false`、文字・画像は別設定、編集専用の青い点線は保存しない:
- ボタンの表示・操作条件（選択中の手札／手札全体、カード種類／カード変数、文字／数値）:
- フェーズごとの上部メッセージと表示対象:
- 選択ウィンドウの候補・変数条件:
- その他:

作成依頼に必要な不足や矛盾だけを確認し、合意した設計と依頼範囲でJSONを生成してください。仕様に存在する部品と処理だけを使い、ID参照、初期配置、スマホの安全領域を自己検証してください。JSONファイルの内容には説明文やコードフェンスを含めないでください。未実施の実画面確認を確認済みにしないでください。

最新版の `schemaVersion: 20` と `operationSchemaVersion: 4` を指定してください。通常処理に統合した一時変数は通常の変数変更と配列繰り返しで構成し、通常処理の引数参照にはtemporaryBindingsを使います。部屋の実行方式は作者JSONでは指定せず、サーバーが新規作成またはホストの明示移行で管理します。タブ背景は `wood` / `mat` / `custom` / `none` と `landscape` / `square` / `portrait` の組み合わせで指定します。木目・マットはサイズに合った内蔵JPGを使い、旧PNGのURLは生成しないでください。

ボックスのシャッフルボタンを使う場合、`boxShufflePosition` は枠外の `outside-top` / `outside-right` / `outside-left` / `outside-bottom` から選び、枠内位置は生成しないでください。
カードやピースに合わせたボックス寸法を指定する場合は、参照幅+10（左右各5px）、参照高さ+10（上下各5px）を `width` / `height` に書いてください。これは編集画面のサイズ合わせと同じ計算で、参照先を保持する設定ではありません。

プレイヤー変数に表示用画像を指定する場合は `visible: true` とし、`image` は実際に利用可能な画像参照だけを使ってください。`visible: false` の変数に画像は含めません。ターンの新規設定は `settings.turn.enabled` で手番の有無を指定します。旧 `settings.markers[id=turn]` と `orderEnabled` は読込互換のみです。手番なしでは手番参照の条件・処理を作らないでください。`multipleAllowed: true` なら複数所有できますが、一人を参照する処理は最初の所有者を使います。画像や別の開始順設定は付けず、所有者はプレイヤー枠のハイライトとして扱ってください。

`variable` 処理は変更先の型に合わせて `variableValue` を設定します。文字プレイヤー変数への代入は `mode: "set"` と `fixed-text`、同型の `player-variable`、または1枚に絞った `card-variable` を使い、加減算しません。手札カード変数なら `cards.location: { "kind": "hand", "players": { "kind": "actor" } }` とカード条件を指定します。変更先プレイヤーの手札を読む場合は `actor` の代わりに `assignment-target` を指定し、複数の変更先なら各人の手札を個別に参照します。手札の枚数だけなら `hand-count` を使います。手札の公開状態はカードごとの `visibilityMode` で設定します。人数別のプレイヤーボックスは通常タブにのみ配置し、プレイヤータブのボックスには `playerBoxSlot` を指定しないでください。人数別のボックスには人数分の部品を設定し、1人目を共通設定の正本とします。2人目以降は `id`、`playerBoxSlot`、`x`、`y` だけを個別に設定し、名前・サイズ・形・その他の設定は1人目と一致させてください。

プレイヤーボックスをカード・ピースの場所または移動先に使う場合、人数分の部品IDから席を直接選ばず、`{ "kind": "box", "boxId": "1人目の共通部品ID", "players": { "kind": "actor" } }` のようにボックス群と対象プレイヤーを分けて指定してください。複数のボックス群はそれぞれ別の `boxId` です。通常のボックスには `players` を指定しません。

上部メッセージは任意の式文字列にせず、`settings.phaseMessages[].parts` の文章と参照項目を並べて作ってください。選択ウィンドウの変数条件も `candidateConditions` の構造化データで指定し、コードやHTMLを埋め込まないでください。タイマーを描画・入力中にも見せたい場合はタイマー部品に `timerShowDuringCardEdit: true` を指定してください。

観戦者を除く参加人数は標準の読み取り専用値です。数値の参照元・条件には `{ "kind": "participant-count" }`、旧式の処理量・条件式には `{ "kind": "participantCount" }` を使い、人数別変数の表を複製して作らないでください。上部メッセージにも `{ "kind": "participant-count" }` を置けます。変更先には指定しないでください。

初期処理の完了後、フェーズ1（`start`）の開始処理は自動で1回実行されます。初期処理に同じ開始処理を重複して記述しないでください。初期処理で別のフェーズへ移動する設計なら、移動先の開始処理を使ってください。

手札内の並べ替えだけを許可する場合は `hands` の `view` と `move` を許可し、`hand-in` と `hand-out` を禁止します。手札から盤面へ出すには `hand-out`、盤面から手札へ入れるには `hand-in`、別プレイヤーへ渡すには両方が必要です。`select` は複数選択用で、単一カードのドラッグには不要です。

ボタン条件で手札全体を調べる場合は `hand-card` / `hand-card-variable`、選択中のカードだけを調べる場合は `selected-hand-card` / `selected-hand-variable` を使い分けてください。文字変数の比較は `comparisonValueKind: "text"` と `textValue` を指定し、数値に変換しないでください。`in-right` は空でない左辺文字列が右辺文字列に含まれる従来の部分文字列判定です。複数候補のどれかと等しいか調べる場合は `one-of` を使い、`comparison` 条件では `right` と `rightValues`、`button-state` 条件では `value` / `textValue` と `comparisonValues` に候補を合計20件まで指定してください。

手札に複数種類のカードがあるか調べる場合は、`selected-hand-card` または `hand-card` に `cardDefinitionIds: ["カードID1", "カードID2"]` を指定してください。`cardPresence: "has"` はいずれか1種類がある場合、`"not"` はどれもない場合に成立します。単一の旧 `cardDefinitionId` も読み込めますが、新規データには `cardDefinitionIds` を使ってください。

## 盤面高さと初期表示

任意の幅・高さが必要な場合だけbackground.width / background.height（各100〜10000pxの整数）を設定してください。省略した軸はsizeの既定寸法です。横幅はJSON指定です。既存データの寸法を勝手に変換しないでください。任意のinitialViews.desktop/portraitは論理pxの矩形{x,y,width,height}で、全体が盤面内、幅・高さ20以上です。スマホ横はdesktopを利用します。未指定の場合は従来表示です。ゲーム内操作・処理座標とカメラ座標は混同しません。例: examples/board-initial-view.json。

## トークンを含むゲーム

プレイヤー・チーム・所属なしの丸型駒にはkind: tokenを使用してください。所属、匿名表示、共通直径、各枠の初期位置、手動移動権限を明示し、制作データへtokenOwnerIdを入れないでください。所属付きは通常タブ、任意画像はfrontに設定します。操作列ではtype: tokenで対象プレイヤー／チームの駒を移動できます。詳細はcomponent-reference.md、action-reference.md、examples/player-team-tokens.jsonを参照してください。

盤面の表示既定: スマホ縦の未設定範囲は左上・全幅×100px、PC・スマホ横は盤面全体。明示範囲を優先し、全体指定は全体フィット。新規タブは950×500px、既存サイズ・初期表示は保持。表示範囲と手札スクロールは処理の座標や権限を変更しません。


## プレイヤー参照の対象指定（2026-10-17）

プレイヤーの手札枚数・変数を参照するときは、実行者、ボタン配置先、ターン順などの対象を確認し、Expr hand/playerのplayersに指定してください。省略は既存の条件全体の対象／処理対象の意味を維持します。選択中カードの本人スコープは変更しません。[JSON仕様](game-data-spec.md#プレイヤー参照の対象指定2026-10-17)・[サンプル](examples/player-value-targets.json)を利用してください。

文字列を数値へ変換せず比較してください。条件分岐で複合条件が必要なら元の比較を残し、branches[].conditionModeとadditionalConditionsを指定してください（examples/compound-branch.json参照）。既存の単一条件を意味なく変換しないでください。

進行処理の組み方は[公開実装パターン](authoring-patterns.md#タイマー確認終局)を参照。phaseは同一sourceでも終了→開始を実行。messageParts（LogMessagePart配列）は実行時に解決し、messageConfig.severityはerror/warning/message。PlayerTarget.player-variableのoperator=max/minは数値の同点全員を返す。loopはmode=count/while/playersとbranches[0].actions、loopBreakで最内ループを終了、loop-playerで対象を参照する。実行中のruntimeLoopState/runtimeLoopFramesは作者JSONに保存しない。最大1000反復・10000ステップ・100フェーズ移動で停止する。旧データは変換不要、新操作を旧クライアントで実行する互換性は保証しない。

正式な編集UIはメソッド形式の項目編集とコード編集です。旧編集UIは提供しません。既存JSON仕様は変更しません。旧URLのruleEditor・メソッド文字列・編集中のカーソルや追加先をゲームJSONに含めないでください。


行内編集で表示する「全プレイヤー.手札.カード（変数.pont > 3）」をJSON文字列として出力しないでください。既存CardSelector／CardLocationで対象と条件を表現してください。shuffle／sortの条件allは各収納先の中の順序を変更し、別手札を混ぜません。カード移動はmoveに統合し、sourceAmountModeを明示してください。例はexamples/inline-target-editing.json。


編集画面の赤い［未選択］は編集中だけの表示です。ゲームJSONへ未選択という文字・値・フィールドを出力しないでください。対象・回数・値を指定してから既存の型へ変換します。既存の省略値とJSON Schemaの既定値は変更しません。繰り返しは従来のloop.mode=count／while／playersとcount・condition・playerTargetを使います。例と生成プロンプトのJSON形式、schemaVersion19／operationSchemaVersion3は維持します。
通常処理の入れ子と型付き式は独立に深さ64までです（ルート0）。深い処理の中でも式は0から数え、横並びを深さに加算しません。ノード20000・実行10000ステップ・全ループ1000回・概算2MBは維持するため、大規模な役判定は処理量も見積もってください。値オブジェクト深さとプロパティパス長は別途12です。例はexamples/integrated-temporary-actions.json。

## 一時変数を使う場合
専用プログラムを生成しないでください。通常のvariableのsource:temporary:<ID>、temporaryDefinition、temporaryValueと、通常のloopのmode:array／arrayを使用します。共通処理の受取先はcommonCall.temporaryResultです。コード文字列はJSONに入れません。例はexamples/integrated-temporary-actions.json、型・権限・スコープはaction-reference.mdに従います。

配列の更新は通常variableのtemporaryValueへarray式を代入します。appendはotherに同じ型の単体、concatは同型配列、replaceはindexと単体other、removeはindex、clearは空配列を返します。型付き配列のMAX/MINはkeyの数値を集計して数値を返し、対象要素そのものを返しません。

収納済みカードの公開変更はreveal.modeとcardSelectorを使用。owner／others／team／non-teamではplayerTargetに基準プレイヤーを1人指定し、チームなしでteam方式を作らない。カードへの入力文はcardTextChange.messagePartsで文字・変数・計算値を組み合わせる。描画生成は要求しない。

テキストはnameに処理から識別しやすい部品名、textContentに固定表示文を指定する。動的表示はtextParts、書式はformattedText。必要ならtextOutline:true、textOutlineColor:#ffffff、textOutlineWidth:1等で文字の輪郭を設定（0.5〜5px）。部品名と表示文字を混同しない。

showAnimationは表示順を指定する。オンラインは次の入力・選択・確認待ちまたは終了まで一括計算し、最終状態と演出列を1回で確定する。演出が計算や一時変数の戻り値を遅らせる前提にしない。最終的に本人が見られる結果は演出前に受信してよいが、他人の秘密の公開許可ではない。演出列を作者JSONへ生成しない。確認モードも端末内の正本へ処理を先に確定し、演出は表示だけを後から再生する。
チームが独立して手番を進める場合は、settings.turn.multipleAllowed:trueにし、marker操作(source:turn)のturnTeamIdに登録チームIDを指定する。省略は全体、チーム指定は他チームを変更しない。次・前・差分はチーム内順、初回は順番基準0番に明示付与する。全解除後も実行状態の位置から再開するが、除去中の操作許可は作者が別途設定する。turnPositionsやruntimeTurnTeamIdは生成JSONへ書かない。examples/independent-team-turns.jsonを参照。
カードの強さ順に整列させる場合はカード定義自体を並べ替えず、sort.cardSortKeysに変数名・number/text・ascending/descendingを優先順で指定する。基準なしは既存のカード定義順。秘密値から公開順序を導く処理は自動許可されない。選択してボタンで出す手札はcanMove:falseでもよく、選択は既存select権限で制御する。仕様と完全例はaction-reference.mdおよびexamples/card-variable-sort.jsonを参照する。

## プロジェクトL専用設定

操作はフェーズ別ボタンへ統一する。回数は通常の変数・条件で管理し、汎用のセーブポイント・条件／配置検査・操作制限を組み合わせる。旧設定は読込時だけ変換し、進行中の旧部屋は新規開始する。私有記録と秘密情報の参加者別配信を維持する。
## 行動回数や取り消しを設計する場合

操作はフェーズ別ボタンへ統一する。回数は通常の変数・条件で管理し、汎用のセーブポイント・条件／配置検査・操作制限を組み合わせる。旧設定は読込時だけ変換し、進行中の旧部屋は新規開始する。私有記録と秘密情報の参加者別配信を維持する。

部品のrotationを省略する場合は0度として扱う。警告を減らす目的で秘密値の公開を許可しない。カードの選択枚数・公開された不透明IDと、カードの種類・変数などの面属性を区別し、必要な公開だけ明示する。

公開範囲の警告は外部JSONの「読込」と「サーバーに保存」で検査します。同じ参照元と理由は1件にまとめ、公開先と該当箇所を展開できます。JSON読込の「全文をコピー」には全箇所を含めます。編集中・ドラッグ後の自動検査は行いません。警告だけなら読込・保存は可能です。実行時も現在の対象と秘密情報の公開範囲を検査します。

カードの公開と得点更新を一緒に行う場合は[得点更新と手札公開の例](examples/score-and-reveal.json)と[適用条件](authoring-patterns.md#秘密情報を安全に扱う)に従ってください。公開対象を確定できない場合は先に公開し、公開後のカードから得点を計算してください。


実カードを手札・ホルダー・盤面で直接選択する場合は、場所付きカード選択に `choice.display:"surface"` を指定します。複数枚を選んで上部バーで一度に確定できます。ピース・独自候補には使えません。省略時は従来の一覧表示です。サーバーの候補・枚数・公開範囲・継続処理の検査は同じです。詳細は [カード個体の選択](physical-card-values.md) を参照してください。

参加者の配色を指定する場合はsettings.playerColors.colors（最大20、開始時プレイヤー順、#RRGGBB）と既存teams[].colorを使う。自動設定はplayerColors.automatic／teams.automaticColors、どちらも省略false。ONでも手動色を保持し、人数・手番順・権限の設定を色から変更しない。[配色例](examples/participant-colors.json)。

ホルダーの表示位置は `holderHorizontalAlign: left|center|right` と `holderVerticalAlign: top|center|bottom` で指定します。省略は中央。収納先・カード順・公開範囲を配置目的で変更しないでください。例はexamples/holder-alignment.json。

チームタブ内の本人の `tokenAffiliation:"player"` トークンは、同じ所属チームタブ内での手動移動に限り自動モード・手番外でも利用できます。カード権限を流用せず `tokens:move` で判定し、明示的な禁止と `canMove:false` / `tokenMovement:"none"`、所有者限定、回答待ち・終了・秘密情報の制限は維持します。一般のチームタブ操作や他人・チーム所属の駒、別タブへの移動には手番例外を広げません。追加JSON項目・個別変換は不要です。例は `examples/player-team-tokens.json`。
# 山札の先頭選択

裏向きの山札を選ばせる場合はchoiceのActionへtopOnly:trueを指定し、choice.sourceKind:card-location、choice.display:surface、cardSelector.condition.kind:allを使う。cardSelector.selectionとchoice.candidateConditionsは併用不可。先頭1枚だけを裏面で表示し、game.input.cardsは不透明な個体参照を返す。表の属性は通常の権限検査を維持する。旧基盤では未対応。

選択待ちも戻したい場合は、同じ処理内でセーブポイントを作成してから回答者の人数や実行者に依存せず選択・入力・確認へ進めます。候補や案内を再記述する必要はありません。復元時は回答要求IDを更新し、新しい秘密情報を見た後は戻せません。[仕様](phase-savepoints.md)、[最小例](examples/savepoint-choice.json)。

表示順：演出の有無にかかわらず、カード移動・変数表示・手番・ボタン・タブ・通知等は元の処理順に表示します。演出なしは先行演出の後に無音で即時反映します。連続する待ち時間0の変更は同じ描画境界へまとめます。選択・入力・確認画面は先行表示の完了後に操作可能になり、回答時間もその時点から確保します。確認画面とオンラインで共通です。JSON形式20／4と既定値は変更しません。

共通処理は一覧の分かりやすい名前と安定したIDを定義し、commonCall.commonProcessIdで指定します。名前表示のためにIDを変えたり、参照切れを先頭定義で補ったりしないでください。

拡大して読ませる処理には `showCard` を使い、実カード1枚と対象者を指定してください。任意の説明メッセージは `messageParts` または固定文 `message` へ入れます。自動で公開・確認待ちにはならないため、必要な場合は別途 `reveal`・通知確認を組み合わせます。[例](examples/card-inspection.json)。

画像はPNG・JPEG・WebP・GIFを埋め込み、作者のSVGは使わないでください。tokenの移動演出はshowAnimation:true。JSON読込のエラー一覧を解消し、Schema・正式実行器・実画面の確認を区別してください。

## 所有カードをいつでも確認する場合

`settings.cardInventory` と個人ボックスの定義IDを使い、名前・枚数・説明だけを本人向けに集計してください。山札の複製や順序公開、閲覧用のカード移動で代用しないでください。手番外にも開閉でき、閉じると同じ画面へ戻ります。一時確認では移動前に元の所有者をカード変数へ記録します。設定省略の既存ゲームへ一括適用しません。[仕様](game-data-spec.md#本人の所有カード内訳)・[例](examples/card-inventory.json)。

## ホルダーと所有者の表示

ホルダーの重ね表示は1列のみで使用する。行優先では重ね表示と切替のUIは出ないため、重ね表示を前提とするゲームは1列を指定する。旧JSONの値は保持され、版の変更や移行は不要。所有者・目・チーム画像のC方式表示は基盤が行い、専用のJSON項目やゲーム固有コードを追加しない。
カードの変数値を条件や集計で参照する場合、対応する`variableDefs`の型も定義する。実行中だけ使う数値フラグも、値の初期化・公開とは分けて宣言する。権限対象の操作ボタンには盤面とフェーズボタンの実在IDを使い、一時値による移動先を固定の仮IDへ置き換えて保存しない。

カウンターを処理専用の表示にする場合は、対象部品に `counterControlsEnabled:false` を指定してください。＋／−が非表示になり手動操作を禁止しますが、counter処理の加減算・代入は可能です。省略はONなので既存データの意味を維持してください。
