メインコンテンツまでスキップ

ハードウェアテストの所有権

テスト期限は失敗と判定する期限であり、DMA 所有者を強制終了してよいという許可ではありません。保護付きハードウェア検証では DevKit 上の tools/hardware_test_supervisor.py を使用します。常駐スーパーバイザーが実際のアクセラレータープロセスを所有し、CTest、SSH、Python クライアントは報告用の接続のみを所有します。

保護付き検証を選択する​

標準 CI は CTest と性能サブプロセスを直接実行するため、スーパーバイザーやソケットは不要です。必須カバレッジの検証は引き続き、選択されたテストの欠落、無効化、スキップ、失敗を拒否します。以下は明示的に選択する検証モードであり、標準 CI の前提条件ではありません。

NEAT_GUARDED_HARDWARE_TESTS=ON で Core をビルドするか、CMake に SIMANEAT_GUARDED_HARDWARE_TESTS=ON を指定します。ネイティブ CTest ターゲットは報告用プロキシになります。テスト引数、環境、ラベル、リソースロック、既存の TIMEOUT プロパティは変わりません。インストールされる extras にも同じスーパーバイザークライアントが含まれます。SIMA_HARDWARE_SUPERVISOR_SOCKET を設定すると、性能マトリクスも同じ保護付き検証モードになります。ソケットが空、利用不可、または要求が拒否された場合は実行が失敗し、直接実行に切り替わることはありません。DevKit 上で通常の性能サブプロセスを実行する場合は、この変数を未設定にしてください。

特権を持つ検証所有者が、新しい非公開の使い捨て状態フォルダーと設定を用意します。スーパーバイザーは過去の実行許可/fail-stop フォルダーを拒否します。設定では次の値を固定します。

  • identity: admission_id、boot_id、cohort_sha256、lease_pid、lease_start_ticks、observer_id。
  • state_dir、そのディレクトリ内の socket、および supervisor_sha256。
  • checker: root 所有の正確な読み取り専用チェッカーの command、実行ファイルの sha256、リソースを使用しないプローブの timeout_sec。
  • executables: 通常ファイルの絶対パスと SHA256 識別値、正確な arguments、deadline_sec、保護された required_env 値。承認済みのコマンド/期限の組み合わせが複数ある場合は variants に記録します。

deadline_sec: null は元のテストにタイムアウトがない場合にのみ使用します。CTest プロキシは承認された正確な期限を要求し、マトリクスは従来どおり 180 秒の期限を要求します。ローダー注入を拒否し、標準のランタイム/プラグインパスと数値オラクル設定を required_env で固定してください。

チェッカーには --phase launch|active|retired --owner-json PATH が渡されます。schema: 1、status: "ready"、固定された正確な identity、checked_at_epoch を含む最新の JSON を返す必要があります。アクセラレーター処理の起動やハードウェアの変更を行ってはいけません。

所有者レコードは PID、開始 tick、ブート ID、セッション ID、実行 ID、要求全体の SHA256 を関連付けます。exec を許可する前に、スーパーバイザーは所有権を永続化し、リソースを使用しない子プロセスが起動バリアで待機している間に、実行許可とクライアントの生存を再確認します。実行中のループはセッションのメンバーを記録し、識別情報と有効な実行許可を検証し、永続ログに終了未確認/隔離状態がないか調べます。

実際に非負の終了コードで終了すると、exit.json に所有者、戻りコード、期限、要求ハッシュ、観測した完了時刻が関連付けられます。retired チェッカーは次を追加する必要があります。

  • retirement.proven: true。
  • kind: "authoritative-driver-retirement" または "reviewed-graceful-exit"。
  • 空でない証拠 token。
  • scope: "whole-owner-process-tree-and-dma"。
  • owner: 正確な所有者レコード。

チェッカーの実装では、レビュー済みの実行/転送完了契約、実際の所有権/子孫プロセス確認、最新の障害監視、現在のドライバー/ファームウェア/コホート識別情報を用いて、この証明を裏付ける必要があります。サンプリング時のジョブ数ゼロ、プロセス終了、経過時間、正常な SSH 接続だけでは証明になりません。純粋な CPU フィクスチャには、個別にレビューされた安全な終了契約を使用できます。架空のドライバー証拠を作らないでください。

タイムアウトと復旧​

スーパーバイザーは、タイムアウト、切断、キャンセル、終了不明、監視失敗を理由に TERM/KILL を送信しません。取り消せない fail-stop 状態を確定し、所有者と永続ログを保持して、以後の起動を拒否します。マトリクスは ENV_BROKEN / ENV_TIMEOUT を保持し、残りのシナリオを未実行として記録します。合格や許容されたスキップを捏造することはありません。遅れて届いた出力でタイムアウトを取り消すこともできません。自然終了し、完全な終了が確認された数値テストの失敗は、所有権不明と混同せず、失敗したケースとして残ります。

出力ファイルの完了条件は、リソースの終了を意味しません。アプリケーションへの任意の停止要求には、承認された正確な完了条件/引数の組み合わせと、固定されたハンドラー/ドレインのレビュー記録が必要です。許可されるのは明示的にレビューされた SIGTERM 要求だけです。これはクリーンアップ操作ではなく、SIGKILL にエスカレートすることもありません。受け入れには、実際の終了と、権威ある情報による終了確認が引き続き必要です。

remoteproc の停止、ドライバーのアンロード/アンバインド、借用バッファーの削除、不確実な所有者の強制終了は行わないでください。デバイスの既存の保護された復旧手順を使用します。復旧後は新しい実行許可を確立し、古い許可を再開しないでください。一時的なファームウェア試験の後は、元のファームウェア、サービス、復旧ポリシーを復元して検証します。

クライアントと証拠​

Python クライアントは run_owned(command, cwd, env, deadline_sec, evidence_dir, socket_path, completion=None, graceful_stop=None) を使用します。CLI は run-json --request FILE --result FILE --socket PATH に対応します。結果には completed、timeout、fail_stop、refused の状態、所有者識別情報、実際の戻りコード、終了証明、永続的な stdout/stderr パスが含まれます。クライアントの終了で実際のハードウェア子プロセスを強制終了することはできません。デーモンはターゲット上で独立して実行し、セッションのクリーンアップ対象になる SSH フォアグラウンドプロセスとして実行してはいけません。

ハードウェア実行許可を得る前に、安全なネイティブホストテストを実行してください。検証レポートでは、このレビュー済み安全ハーネスでワークロード/オラクル/期限を変更せずに実行した結果と、未変更の旧ハーネスや実際のホスト型 CI ワークフローを実行した結果を区別する必要があります。

Python 3.13 以降では、PyNeat メタデータは NumPy >=2.1,<3 を選択し、古い Python では >=1.24,<2 を選択します。メタデータの解決だけでは ndarray の数値的な同等性は証明されません。その Python/NumPy コホートを検証済みとする前に、インストール済みターゲット上で dtype、ストライド、コピー/ゼロコピー、ライフタイムのテストを実行してください。