# 読み込み前の検証

条件・対象プレイヤー・カード検索の参照式は、保存時と実行時で同じ深さ64／式ノード20000の制限を使います。深すぎる検索は「0枚」へ置き換えず停止理由を表示します。配列の繰り返し内の条件分岐・入力待ち後でも、現在要素と位置の参照範囲は維持されます。回数ループは位置だけ参照でき、配列要素はありません。これらは保存形式の追加項目ではなく、Schema合格後の意味検証にも適用される制約です。

場所付きカード選択では、選んだ個体だけの移動、同名の複数札、偽造・古い回答、候補不足と0枚、他人の非公開札を候補にできないこと、秘密回答を公開の移動へ流せないことを実行器で検査します。game.input.cards は通常入力や別の choice の後では利用できません。作者JSONの runtimeTemporaryInputCards は拒否します。

## 公開資料自身の回帰検査

`pnpm test:authoring-docs` で[サンプル目録](examples/README.md)の全例を検査します。完全な文書は公開JSON Schemaと正式のvalidateCurrentGameDocumentの両方を通し、断片は使い道を明記して対応するSchema部分へ渡します。参照型・bindingの公開表は実装登録表と完全比較し、公開資料から存在しない例や内部設計書へ依存しないことを検査します。型・参照・公開範囲の保存前検査と、実行状態に依存する安全検査は別で、Schemaの合格だけでは代替できません。

metadataの現行必須項目はdescription/minPlayers/maxPlayers/genres/durationRangeです。durationRangeは180-plusまでの登録済み値を使います。公開範囲のpublicationと一覧のvisibleは独立です。[手順と境界](authoring-patterns.md#完成時の検証)を確認してください。

noticeはモード・タイトル・表示対象・本文を検証する。選択肢・入力設定・messageConfigは混在させない。本文は文字・値・プレイヤー名、または型付き一時値。秘密値を対象外へ渡すことは許可しない。確認の要求ID・本人資格・固定の確認値・重複・古い要求をサーバーで再検証し、切断・退出・期限で代理確認しない。

カード選択枚数条件は場所・カードセットの参照と比較値を検証する。card-typeのcardSetIdは必須、cardDefinitionIds指定時は非空・最大1000・重複なし。UI枚数は0以上の整数。オンラインで他人の手札・見られない盤面・生の内部IDを選択として申告しても拒否する。読み取り結果は実行許可そのものではなく、実行時にも再検証する。

turnの`multipleAllowed:true`と複数player対象を許可します。removeは単独マーカーでも有効です。空の所有者配列は手番なしとして維持し、開始順先頭へ戻しません。一時値`game.turn-players`はplayer配列として検証し、既存の単体`game.turn-player`と混同しないでください。

共通処理の対象設定有無は処理検証・保存前チェックで共通判定を使用します。`commonProcessId` が設定済みなら旧 `source` がなくても保存可能です。空・未登録の参照や必須引数の不足は引き続き拒否します。例：`examples/common-call-save.json`。

タブの `hidden:true` だけでは一時値を限定公開と判定しません。倉庫内の公開カードの検索・移動は許可し、本人／チーム限定・裏向きや変数の公開範囲に由来する制限を引き続き検証します。

一時値の公開範囲は保存前にも検証します。限定公開の値やその値に依存する条件結果を全員公開のログ・変数・共有処理へ渡す明確な矛盾は保存エラー、対象者・カード状態等で変化するものは保存可能な警告です。警告には該当処理へのリンクがあります。実行時の安全チェックは維持し、該当処理・参照元・公開先・停止理由を表示します。秘密の値・回答・カード内容は表示しません。公開が意図された場合に限り、既存の `temporaryPublish:true`（variable/message/logのみ）を編集者が明示します。自動的に公開設定へ変更せず、警告を消すために公開を有効化しないでください。保存形式の項目・版は変わりません。自動送信や専用送信機能はありません。

フェーズ上部メッセージはフェーズID・表示対象・参照IDを確認し、文章は各500文字以下、項目は最大30件にします。文章内のHTMLや式は実行しません。

選択ウィンドウの変数条件は最大8件です。対象の変数ID・キーが存在すること、候補に変数がない場合は除外されることを確認してください。ボックスの回答はカードでなくボックスIDです。描画・入力画面でも時間を見せるタイマーは `timerShowDuringCardEdit: true` を指定します。

エラーは必須フィールド不足、ID重複、存在しないID参照、未対応処理、不正画像、ルール20ページ超過です。

警告は盤面端の安全領域外、小さすぎる操作部品、カードと置き場の大きさの差、部品の大きな重なり、山札と捨て札の距離です。

警告は読み込みを妨げません。編集画面で調整し、確認モードでPC・スマホ縦・スマホ横を確認してください。

条件分岐の組合せは `branches[].conditionMode`（and／or、省略and）と `additionalConditions`（最大4件のCommonCondition）を使用する。元のleft/operator/right等は第一条件として維持し、分岐間は上から最初の成立を実行する。追加なしは旧形式と同じ。追加条件の深さ免除は不可。操作条件のプレイヤー文字比較はcomparisonValueKind="text"とtextValueを明示し、数値はvalue（旧形式は数値のまま）。固定テキストは候補に限定しない。内部IDを名称へ書き換えず、UI表示だけ名称を解決する。例: 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フェーズ移動で停止する。旧データは変換不要、新操作を旧クライアントで実行する互換性は保証しない。

外部JSONの「読込」は、元の画像形式、公開Schema、処理の設定・参照・公開範囲を検証し、エラーを場所と理由の一覧で表示します。エラーがあるファイルは取り込まず、編集中のゲームを保持します。警告だけのファイルは読み込めます。「全文をコピー」で表示上限を超えた診断も含めてコピーでき、ブラウザがコピーを拒否した場合は全文の選択欄を表示します。作者のSVG・外部画像URL・一時画像参照は使用できません。PNG・JPEG・WebP・GIFを埋め込んでください。正式な組込み画像の参照は既存の例外です。保存済み下書きを修復するために開く操作とは区別します。

同じ公開範囲の警告は参照元と理由でまとめます。展開と全文コピーには各箇所と公開先が残ります。[得点更新と公開を一体で反映する条件](authoring-patterns.md#秘密情報を安全に扱う)を満たす場合は、そのカード参照の警告を出しません。


### 任意の盤面横幅

`background.width` は整数100〜10000。ルートとタブ双方で検証し、initialViewsもその横幅内に収めます。省略時の寸法維持、保存・再読込、高さ編集後の幅保持を確認します。形式20／処理形式4を維持し、自動移行でwidthを挿入しません。
