nessie

リモートエグゼキューター

エージェントに実際のコンピューターを与えて作業させます。Linux、macOS、Windowsに対応しています。

リモートエグゼキューターとは

Nessieのエージェントにはコンピューターがありません。Nessie内の情報を読み取り、人と話し、ネットワーク越しに接続済みのツールを呼び出すことはできます。しかし、ノートパソコン上のファイルを開いたり、コマンドを実行したり、誰かのログインの背後にしか存在しないページを見たりすることはできません。リモートエグゼキューターは、エージェントに作業用のマシンを与えるための仕組みです。

エグゼキューターは、お使いのコンピューターにインストールする小さなデーモンです。お使いのNessieインスタンスへ外向きにペアリングし、ホストの外に出ることのない鍵によって、自分がどのマシンであるかを証明します。その後は、決められた名前付きの操作の一覧だけを提供し、それ以外は何も提供しません。作業は一つずつ署名付きのコマンドとして届き、結果は上限の定められた構造化された受領情報として返されます。マシンがNessieからの内向きの接続を受け付けることはありません。

エグゼキューターがではないものについて、正確に説明しておきます。多くのリモートアクセスツールは、以下のいずれかに当てはまりますが、エグゼキューターは意図的にそのどれでもありません。SSHはなく、制限のないリモートシェルもなく、既に開いているターミナルマルチプレクサーへの接続もなく、クラウド側の標準入力もなく、一般的なローカルネットワーク用のプロキシもありません。MCPサーバーでもなく、コンテナやクラウド実行環境でもありません。そうしたものはNessieがすでに持っており、役割が異なります。エグゼキューターとは、閉じた操作の一覧を持つ、能力ベースのエンドポイントです。外部に見えるのは、この一覧だけです。

エグゼキューターの所有者

すべてのエグゼキューターは、ちょうど一つのスコープを指定して作成され、そのスコープは後から変更できません。スコープは、誰がエグゼキューターを呼び出せるか、誰が管理できるかを決めます。

スコープ呼び出せる人アクセスを管理する人
プライベート依頼した人と、呼び出されるエージェントの両方が担当者として指定されている必要があります。どちらか一方だけでは足りません。割り当てられた人間の管理者。エージェントはプライベートなエグゼキューターを使うことはできても、管理することはできません。
プロジェクトそのプロジェクトの権限を持つ人だけが、そのプロジェクト内の実行から呼び出せます。組織の管理者、またはプロジェクトのオーナーや管理者
組織組織の利用権限を持つ人組織の管理者

プライベートなエグゼキューターには、必ず有効な人間の管理者が少なくとも一人いる必要があります。最後の一人を直接削除しようとすると失敗します。退職などの手続きで管理者が一人もいなくなる場合は、エグゼキューターが新しい作業の受け付けを停止し、手元の作業を終えてから、自ら失効します。組織のオーナーには、失効のみを行える緊急用の手段があります。これにより、自分では管理していないエグゼキューターを終了させられますが、そのプライベートな管理者一覧、セッション、内容は表示されません。プライベートなアクセス権が、誰かに黙って移されることは決してありません。

エージェントが実際に行えること

操作の種類はコードに固定されており、デプロイごとに設定することはできません。操作は二つに分かれ、どちらに当たるかによって、インストールが必要なものが決まります。ゲストを必要としない操作は、デーモンが自身の作業用ディレクトリから直接提供し、仮想マシンは使いません。残りの操作には、ホスト上のセッションごとのゲストVMが必要です。

操作内容ゲストVM
file.list, file.readペアリング時に選んだ一つのワークスペースルートの下にあるファイルを、一覧表示して読み取ります。いいえ
file.writeそのワークスペースのコピーオンライトの下書きに書き込みます。実際のルートを書き込み用に開くことは決してありません。いいえ
workspace.review下書きでの変更内容を報告します。相対パスは最大100件までで、種類とバイト数を添え、マニフェストのダイジェストを含みます。ファイルの内容は含みません。いいえ
sandbox.stopその実行が所有するセッションを終了します。いいえ
command.runネットワークに出られないゲスト内で、シェル文字列を使わない引数ベクトルとして一つのコマンドを実行します。このパスのどこにも、シェル文字列はありません。はい
browser.open, browser.observe, browser.actマシンに設定されたオリジンの一覧に従い、ゲスト内でブラウザを操作します。観察では、上限のあるアクセシビリティツリーと、任意の縮小画像を返します。操作は、ナビゲート、クリック、入力、キー押下、スクロールであり、エージェントが直前に観察したノードに対して行われます。セレクター、座標、スクリプトは使いません。はい
coding.launch, coding.observeゲスト内で管理されたCodexセッションを開始し、型付きのライフサイクル状態を読み戻します。ターミナルへのアタッチも、プロンプトを送るチャンネルもありません。エージェントが知れるのは、セッションが実行中かどうかだけで、画面に何が表示されているかは分かりません。はい
workspace.promoteレビュー済みの下書きを実際のワークスペースに反映します。これがホストに書き込む唯一の操作であり、そのためモデルに対しては一切提供されません。いいえ

ゲストを必要としない操作は、ワークスペースバンドルと呼ばれます。ゲストを起動できないホストは、壊れたエグゼキューターではありません。通常どおりペアリングでき、サンドボックスのバックエンドをnoneと報告し、ワークスペースバンドルだけを提供します。Hyper-Vを含まないWindowsのエディションや、/dev/kvmを使えないLinuxマシンは、この状態になります。インターフェースは、わけの分からない失敗にせず、その状態であることを明示します。

ブラウザの作業は、エージェントが自分の判断で開始することは決してありません。通常の単一操作のバインディング経路は、browser.openとbrowser.observeを一律に拒否します。ブラウザの実行は、人がチャンネルから、新しい実行における四つの操作のひとまとまりとして開始します。その後に操作を追加することはできません。管理されたコーディングセッションも同じように扱われます。

コード上には、さらに二つの操作グループがありますが、意図的に利用できなくしてあります。一つ目は、既にログインしているChromeタブを操作するための操作です。完全なローカル実装とネイティブメッセージングの拡張機能はありますが、サーバーが元の会話が非公開であったことと、誰がどの情報を開示したかを記録できることを証明できるまで、コントロールプレーンはこれらを公開しません。この基盤は意図的に機能しない状態にあり、その拡張機能はどちらのインストーラーにも含まれていません。二つ目は、コーディング操作のうちアタッチ、プロンプト送信、割り込み、終了です。これらはスキーマに名前はありますが実装がないため、付与することはできません。

仕組み

接続は常に外向きです

デーモンが外向きに接続するのは、お使いのNessie APIへのHTTPSとWSS接続だけで、ほかには接続しません。Nessieがラップトップへ接続することも、そのアドレスを保持することもありません。カタログ内のどのエンドポイントも、マシンへの通信経路として扱われることはありません。だからこそ、エグゼキューターは自宅のネットワークでも、NATの背後でも、企業のVPN上でも、ポート転送やインバウンドのファイアウォールルールなしに動作します。また、デーモンを停止すると、即座に完全に切断されるのも同じ理由です。

APIのオリジンはHTTPSでなければなりません。唯一の例外は、自分のマシンでNessieを動かしている人のためのループバックアドレスで、専用の環境変数によって有効になります。通常のフラグで、本番オリジンを平文のHTTPに切り替えることはできません。

ペアリングでマシンを証明し、人が確認します

ペアリングは双方向の証明です。権限のある人がNessieでスコープを指定してエグゼキューターを作成すると、Nessieは登録を発行します。これは256ビットのランダムなチャレンジで、NessieはSHA-256の検証子だけを保存します。有効期限は10分で、一度しか使えません。

マシン上では、デーモンがEd25519の鍵ペアを生成し、所有者だけがアクセスできるOSの保護された領域に保存します。そして、ネットワーク通信を行う前に、署名済みの正確なリクエストをディスクに書き出します。そのため、応答が失われても、準備済みの同じ鍵で再試行でき、ペアリングが黙って二重に行われることはありません。その後、登録ID、チャレンジ、公開鍵、署名による証明を送信します。Nessieは公開鍵とそのフィンガープリントを保存しますが、秘密鍵は決して保存しません。

次にNessieは、そのフィンガープリントを人に表示し、その人が確認します。この確認と、その後の秘密鍵の所有証明が完了するまで、エグゼキューターはオフラインのままです。ペアリングは、チャットのテキストやターミナルの記録から完了させることはできません。必ずWebまたはデスクトップのインターフェースで、人が明示的に操作する必要があります。

鍵を失ったマシンは、自分のエグゼキューターの記録を取り戻すことはできません。その記録は失効させられ、新しいエグゼキューターとして登録し直すことになります。一方、鍵のローテーションは、古い鍵と新しい鍵の両方で署名された一つのトランザクションとして行われます。

ディスクリプターは、マシン自身についての署名済みの主張です

ペアリング済みのデーモンはディスクリプターを公開します。これは、署名され、単調に改訂される、構造的な事実だけの記述です。サポートする操作スキーマ、リソースとネットワークの上限、プラットフォーム、ローカルポリシーのダイジェストが含まれます。ホストのパスは含まれず、クラウド側に権限を生み出すこともありません。

新しい改訂版は、届いた時点では有効になりません。審査待ちとして保存され、権限のある人が内容を確認して承認するまで、利用可能な操作には影響しません。これにより、機能の更新によって新たな権限が黙って付与されることを防ぎます。新しく通知された操作は、最初は拒否された状態で始まります。

署名が何を証明するかを明確にしておきます。ペアリング済みのエグゼキューターの鍵で署名されたディスクリプターは、その鍵がこの主張を行ったことを証明します。ホストが侵害されていないことを証明するものではありません。インターフェースは、その点を明示することが求められています。

ディスパッチ:候補、バインディング、コマンド、受領情報

エージェントがエグゼキューターを指定することはありません。実行がエグゼキューターを使う前に、Nessieは論理的な操作を、不透明で有効期限の短い利用可能性の候補に解決します。レスポンスにエグゼキューターのIDは含まれません。データベースが保持するのは、ハンドルのダイジェストと、誰のために何のために解決されたかだけです。モデルやクライアントが受け取るのは、選択できるマシンではなく、ハンドルです。

利用可能性は一つのリゾルバーで決まり、API、ワーカー、UI、アシスタントのすべてで同じように使われます。

available(operation, human, agent, immutableRunContext) =
  human may discover executor
  ∩ exact executor-agent-operation grant allows operation
  ∩ stable logical tool grant allows operation
  ∩ scope matches immutable run context
  ∩ executor is online and descriptor is approved
  ∩ local policy permits operation

候補を使用すると、データベースのロックの下でバインディングが作成されます。このとき、上記のすべてのゲートが再確認され、単調増加するフェンスが進められます。ディスパッチでも、改めて確認が行われます。その結果、権限が取り消されたり、ポリシーが狭められたり、エグゼキューターが失効させられたりした場合、その変化が二つのステップの間に起きていれば、作業は後から気づかれるのではなく、その時点で停止します。また、再試行が、実行にバインドされたマシンとは別のマシンに届くことはありません。

コマンド自体は、独自の二つ目のキューではなく、Nessieの通常のキュー・ジョブとツール呼び出しのライフサイクルに乗ります。デーモンは、認証済みの制御チャンネルで作業をポーリングし、Nessieから押し込まれることはありません。コマンドは、次の四つの受領情報だけを経て進みます:

leased → accepted → started → result-acknowledged

すべてのフレームには、コマンドID、実行の由来、バインディングのフェンス、機能のリビジョン、有効期限、冪等性キー、そして引数とペイロードの両方のダイジェストが含まれます。デーモンは、不一致、古いポリシー、リプレイ、すでに完了したコマンドに対する二つ目の結果を拒否します。引数と最終結果は、保存時にAES-256-GCMで暗号化されます。データベースが保持するのは、上限のある暗号文と正規化されたダイジェストで、内容は保持しません。

確認応答が失われても、Nessieは成功したとはみなしません。そのコマンドは結果不明として記録され、実行は通常の復旧経路に従います。デーモンは、作業を開始する前に届いた各コマンドをローカルのジャーナルに記録しているため、副作用が繰り返されることはありません。後から届いた受領情報によって、この曖昧さが正しく解決されることもあります。

信頼の境界

主体できることできないこと
人エグゼキューターをペアリングし、権限がある場合は管理し、アクセスやポリシーの変更を確認します。マシン自身が拒否しているポリシーを広げることや、現在の権限なしに行動することはできません。
エージェント(パーソナルアシスタントを含む)すでに利用可能な操作を呼び出します。依頼した人のために、アクセス変更の案を準備します。アクセスを管理すること、自分自身を承認すること、マシンを選ぶこと、ローカルポリシーを変更すること、自分で準備した変更を適用することはできません。
Nessieのコントロールプレーン利用可能性を解決し、実行をバインドし、コマンドを割り当て、秘匿化された監査情報を保持します。マシンに接続すること、ローカルポリシーを広げること、ホストの認証情報に到達すること、ターミナルのテキストを認可や結果として扱うことはできません。
エグゼキューターのデーモンローカルポリシーを適用し、外向きにペアリングし、ゲストとゲートウェイを実行し、コマンドを確認応答します。自らのスコープを広げること、古い作業や再送された作業を受け入れること、ホストのワークスペースや認証情報を直接公開すること、生のローカルデータを監査ログに送ることはできません。
ゲストVMとその中のツールコピーオンライトのサンドボックス内で作業し、ゲートウェイを経由してのみネットワークに到達します。ホストのファイルやホストの認証情報に到達すること、直接のネットワークやDNSに到達すること、ホストへの変更を反映することはできません。

エグゼキューターのインストールとペアリング

Mac版のCLIはHomebrewで、MacアプリはHomebrew caskで、Linux版のCLIはAPTまたはDNFで、Windows版のエグゼキューターはWinGetでインストールします。ペアリング済みの各チームには、コンピューター上に保存された個別の権限があります。Nessieはチーム内のアクセスを管理しますが、ローカルのリソースを変更することはできません。

インストールとペアリングのガイドには、正確なコマンド、双方向の8桁コードのフロー、ローカル設定、起動、更新、削除の手順が記載されています。

各プラットフォームの実証状況

三つのゲストサンドボックスの状態は異なり、その違いは重要です。macOSは、動作が確認され、実際に試されているゲスト経路を持つバックエンドです。LinuxのFirecrackerバックエンドとWindowsのHyper-Vバックエンドは、実装済みでホスト側のテストでカバーされています。起動シーケンス、ディスクイメージ、制御と外向き通信の転送、下書きのプロトコルなどが対象です。ただし、このプロジェクトの継続的インテグレーションには、KVMまたはHyper-Vを備えたマシンがまだありません。そのため、ゲストが実機で起動したことはまだありません。ゲストを必要としないワークスペースバンドルは、Windows上で実際の制御ループに対してエンドツーエンドで確認されています。LinuxとWindowsのゲストを使う操作は、お使いのハードウェアで検証するまで未検証として扱ってください。Nessieのペアリング画面にも、同じ趣旨が表示されます。

セキュリティと封じ込め

ワークスペースのルートは一つだけで、そのパスはマシンの外に出ません

ペアリング時には、正規化されたワークスペースのルートを正確に一つ選択します。一つのディレクトリであり、複数のフォルダーの集合ではなく、それらの最も近い共通の親でもありません。Nessieに伝えられるのはルートのベース名だけなので、インターフェース上で境界を認識できます。フルパスは、所有者だけがアクセスできるマシンの状態に留まり、アップロードされることはありません。ルートを変更することは可能ですが、すべてのローカルの下書きとサンドボックスを削除した後に限られます。また、ほかのポリシー変更と同じく、人によるレビューを経る新しいディスクリプターの改訂版が必要になります。親ディレクトリへ黙って広がることは決してありません。

ファイル操作は相対パスだけを受け付けます。トラバーサルやシンボリックリンクのすべての要素は拒否し、設定されたルートが今も通常のディレクトリであることを再確認します。ホストのパスを含まない、上限のある構造化された結果を返します。

書き込みはコピーに対して行われ、反映は人だけが行います

エージェントが、あなたのファイルに書き込むことはありません。file.writeは、デーモン自身の状態ディレクトリの下に、実行に紐づいた上限付きのコピーオンライトのツリーを作成します。その実行の以降の読み取りや一覧表示は、その下書きを参照します。コーディングセッションを含むゲスト内の作業も、同じコピーオンライトのスクラッチ領域を使います。

下書きを実際のワークスペースに反映するのは、単一の操作workspace.promoteです。これがシステム内で唯一のホストへの書き込みです。モデルに向けたスキーマは一切ありません。エージェントにも、アシスタントにも、呼び出し元が指定したパスにも、下書きをホストへの書き込みに変えることはできません。代わりに、人がレビュー済みの下書きを開き、反映内容を確認を押し、現在のパスワードを入力して確定します。その後サーバーは、確認済みのレビューダイジェスト、マニフェストのダイジェスト、元の実行、ユーザー、エージェント、認可のリビジョン、操作の付与、有効なローカルポリシーを再確認してから、コマンドを作成します。マシン上では、デーモンがマニフェストを自ら再構築し、ダイジェストが変わっていれば拒否します。そのため、レビュー後の編集が、レビューの承認に便乗することはありません。

反映そのものは、ディスクリプターに基づき、ジャーナルに記録しながら行われます。ネイティブヘルパーが受け取るのは、ワークスペースのルートと下書きで、どちらもパスではなく、既に開かれたディレクトリのディスクリプターとして渡されます。ヘルパーは、シンボリックリンクを辿らない操作ですべてのコンポーネントを検証し、シンボリックリンク、ハードリンク、特殊ファイル、マウントの跨ぎを拒否します。また、全件適用か全件復元かのジャーナルを保持します。そのため、クラッシュが起きても、検証済みのマニフェストを完了させるか、何かが実行される前に元の状態へ戻すかのどちらかになります。

ゲストにはネットワークがなく、外向き通信は強制されます

ある操作がゲストを必要とする場合、それはセッションごとのLinuxマイクロVMで実行されます。ホストのホームディレクトリ、Dockerソケット、SSHエージェント、継承された環境変数はなく、ワークスペースの共有以外のホストマウントもありません。実行可能なランタイムのマウントは読み取り専用で、書き込み可能なワークスペースのマウントは実行を禁止します。そのため、実行されるものは、エージェントが書いたものではなく、検証済みのランタイムペイロードから来ます。ゲストは、ソケットを開く前に権限のないアイデンティティに降格します。ルート所有の共有があれば、特権のあるワークロードを残すのではなく、起動そのものを失敗させます。

最も重要なのは、ゲストにネットワークインターフェースがないことです。Linuxでは、起動シーケンスは意図的にネットワークを設定せず、TAPデバイスも作成されません。Windowsでは、Hyper-Vがデフォルトで追加する仮想ネットワークアダプターを、セットアップ中に削除します。ゲストがマシンの外に出る唯一の経路は、ゲスト内のループバックプロキシです。これは仮想ソケットを通じてホスト上のブリッジにトンネルされ、ブリッジはそのバイト列をデーモン自身のゲートウェイに渡します。このゲートウェイは、オーナーだけがアクセスできるローカルソケットのリスナーで、TCPリスナーも一般的な転送モードもありません。HTTP、CONNECT、WebSocket、リダイレクト、オリジン、ダウンロード、アップロードのポリシーは、このゲートウェイで適用されます。その際、別の実装を作るのではなく、Nessieの既存のピン留めされたフェッチの仕組みを使います。NATブリッジも直接のDNSリゾルバーもありません。代替DNS、生のTCP、QUIC、プロキシの迂回はすべて拒否されます。

このゲートウェイが適用するオリジンの一覧は、マシンのオーナーが設定するものです。意図的にアップロードされることはありません。インターフェースは、そのことを、Nessieがオリジンポリシーのエディターであるかのように装うのではなく、そのまま示しています。ブラウザ・エグゼキューターが到達できる先を知りたい場合は、マシンを所有する人に尋ねてください。

認証情報

ホストの認証情報ストアは、どのゲストにも決してマウントされません。キーチェーンも、~/.codexや~/.claudeも、グローバルなCLIトークンも、APIキーを持つ環境変数も含みません。管理されたコーディングセッションに使える唯一のログインは、オーナーだけがアクセスできる認証ファイルです。その内容を読めるのは、オーナーが管理するinitrdビルダーだけです。Nessie、ディスクリプター、ログ、コマンドの引数が読むことは決してありません。そのファイルは一度だけ、ゲスト内のプライベートなホームへ移され、VMと共に破棄されます。そのゲストが到達できるオリジンは一つだけです。

ブラウザ・エグゼキューターは、さらに厳格です。セッションごとに新しいプライベートなブラウザプロファイルを使い、ワークスペースが用意したプロファイルは拒否します。そのため、Cookie、拡張機能、環境に残るログイン状態を持たずに開始します。

生のローカルデータがモデルプロバイダーに届くのは、明示的で上限のある実行の中だけです。Nessieが永続化するのは、秘匿化されたマニフェスト、引数とポリシーのダイジェスト、結果のダイジェスト、構造化されたステータスです。ファイルの内容、ターミナルの出力、ブラウザのDOM、認証情報、認証要素は、データベースの記録、監査ログ、ログ、リアルタイムイベント、エラーレポートに入れることが禁じられています。

オペレーターが付与できる権限と、その取り消し方

エグゼキューターを使う権限は、単一のスイッチではありません。エージェントが操作を呼び出せるのは、その正確なエグゼキューターとその正確な操作に対する付与を持ち、かつ通常の論理ツールポリシーが許可し、かつ実行のスコープが一致し、かつマシン自身のローカルポリシーが許可する場合に限られます。あるエグゼキューターに操作を付与しても、別のエグゼキューターには何も許可されません。また、機能の更新によって権限が広がることもありません。新しい操作は拒否された状態で届くからです。

エージェントのアクセスと共有は、どちらもページ上で即座に有効になります。承認の続きや、パスワードの入力、再認証の手順はありません。エグゼキューターのエージェントタブでは、管理者がエージェントのマシンへのアクセスを直接オンまたはオフにできます。共有では、人に「利用可能」または「管理者」を付与したり、プロジェクトや現在のチームの全員に利用を広げたりできます。方法は同じです。あなた自身のアシスタントとの会話の中でだけ、アシスタントはエージェントのアクセスや担当の変更を代わりに準備できます。共有チャンネル、スケジュールされたジョブ、ほかのエージェントの実行では、この準備はできません。準備された変更は、その会話に確認カードとして投稿されます。カードで「アクセスを許可」を押すまで、何も変わりません。チャットのテキストが確認になることはありません。

次の三つの変更は、確認の瞬間に現在のパスワードを再入力する必要があります。一つ目は、ディスクリプターの改訂版の有効化です。二つ目は、アシスタントが準備した担当の変更のうち、エージェントではなく人にマシンを割り当てるものです。三つ目は、同僚がオーナーとしてコマンドを開始できるようにする常設ポリシー、つまり無人のチケット作業ポリシーです。マシンの切断や削除では、どちらも求められません。停止させる仕組みが、停止対象よりも到達しにくくなってはならないからです。レビュー済みの下書きの反映は、常にパスワードを求めます。監査ログには、操作した人とアシスタントの関与が別々に記録されます。

エグゼキューターは、小さく明示的な一連の状態を移行します:

pending_pairing → online ↔ offline
        │             ↓
        └──────────→ draining → revoked
                         ↓
                       error

ヘッダーのComputerメニューから、管理者はライフサイクルの変更を準備します。一時停止、一時停止からの再開、切断、削除のいずれかです。一時停止すると、エグゼキューターはオンラインのままですが、コマンドを受け付けなくなります。切断すると、そのクライアント証明書と、未処理のすべての候補ハンドルが無効になり、取り消すことはできません。切断されたエグゼキューターは、新しいものとして再ペアリングします。削除も同じ効果を持ち、さらにエグゼキューターを一覧から削除します。切断と違って、ペアリング保留中や既に切断済みの状態を含め、エグゼキューターの状態にかかわらず利用できます。一覧から外れる唯一の方法だからです。ドレイン、つまり新しい作業を受け付けずに手元の作業を完了させることは、プロトコル上の実在する第三の状態です。インターフェースはそのような状態のマシンを表示できますが、ここからそれを開始することはできません。開始できるのはAPIへの直接の呼び出しだけです。確認されたアクセス変更、ディスクリプターのレビュー、ライフサイクルの遷移(ドレインを含む)はすべて、デーモンの接続エポックも進めます。そのため、次の制御ポーリング(最大1秒後)は失敗し、再接続する前に稼働中のゲストをすべて停止させます。失効は、マシンが無視してもよい要求ではありません。

エグゼキューターの運用

正常に動作しているかの確認

Nessie自身の判断は、生存確認です。デーモンは署名付きのハートビートを送信します。最後の認証済みの活動から60秒を超えたエグゼキューターは、一覧表示、選択、ディスパッチの前に、オフラインとして永続的にマークされます。オンラインと表示されているエグゼキューターは、直近の1分以内に自身を証明しています。

マシン上にヘルスチェック用のエンドポイントはありません。デーモンは設計上、オペレーター向けのポートを一つも開いていません。macOSとLinuxでは、次のコマンドでCLIに直接確認します:

nessie-executor status                # every paired executor, plus linger state
nessie-executor status <executorId>
systemctl --user status nessie-executor@<executorId>

macOSでは、statusで各チームのlaunchdエージェントの状態が報告されます。systemctlコマンドはLinuxでのみ使えます。Windowsでは、トレイアイコンが一目で分かる答えになり、そのメニューに理由が表示されます。詳細はサービスのログに記録されます。どちらのプラットフォームでも、Nessie内のエグゼキューターの概要タブに、承認済みのプロファイル、データの境界、最後に確認された時刻、審査待ちのローカルポリシー提案が表示されます。

ログ

プラットフォーム保存場所
Linuxjournalctl --user -u nessie-executor@<executorId>。デーモン独自のログファイルは保持していません
Windows%ProgramData%\Nessie Executor\logs\service.log。トレイのログフォルダーを開くから開けます

人が対処できるすべての拒否は、ここに記録されます。署名がないか改ざんされたランタイム、安全に設定できない状態ディレクトリ、起動時に開始しなかったエグゼキューターなどです。ペアリングのチャレンジ、鍵、子プロセスの出力は、ここに記録されることはありません。引き上げるべきログレベルの設定はありません。それより詳しい情報は存在しないからです。

Mac版のCLIは、各チームのサービスログを~/Library/Logs/NessieExecutor/<executorId>.logに書き込みます。

アップグレード

CLIはHomebrew、APT、DNFでアップグレードし、その後、各チームのサービスをdisableとenableの順に実行して再起動します。Windows版のエグゼキューターはWinGetでアップグレードします。Nessie Desktopの直接インストーラーは、署名付きのアプリ内アップデートを提供します。MSIとDebianのインストールは、それぞれのパッケージマネージャーを使います。ペアリングとローカルの権限は、アップグレード後も維持されます。

停止と削除

停止は、デーモン自身が管理する正常な経路であり、強制終了ではありません。デーモンは終了シグナルを受け取り、すべてのゲストセッションを停止し、そのリースを解放して終了します。Linuxでは、ユニットは10秒の後片付けの予算に対して15秒待機し、強制終了のような捕捉不能なkillには決して段階的に移行しません。後片付けの途中で殺されたデーモンは、マイクロVMやワークスペースのオーバーレイを、後始末するプロセスのないまま残してしまうからです。そのため、停止が完了しないときは、systemctl --user statusで見える状態になり、黙って止まることはありません。強制終了するかどうかは、人が明示的に判断する事項です。

Linuxのパッケージを削除するには:

nessie-executor disable <executorId>   # stops and disables the service
sudo apt remove nessie-executor
loginctl disable-linger                # only if your user manager should stop running at boot too

Windowsでは、msiexec /xがサービス、そのレジストリエントリ、トレイのスタートアップ項目を停止して削除します。どちらのプラットフォームでも、ペアリング済みの状態は意図的に残されます。Linuxでは~/.local/state/nessie-executor/、Windowsでは%ProgramData%\Nessie Executorです。ペアリングは、マシンの鍵と署名済みのポリシー改訂版からなるもので、プログラムをアンインストールしても、それらを破棄する要求にはなりません。再インストールすると、それらは元の場所で見つかります。ペアリングを忘れさせるには、ディレクトリを手動で削除します。反対側からエグゼキューターを終了させるには、Nessieでエグゼキューターを失効させてください。

Windowsのトレイとデスクトップのコンパニオンは、どちらもこのコンピューターのペアリングを忘れるを第一級の操作として提供しています。ローカルのデーモンを停止し、マシンの鍵とフォルダーの選択を削除し、ネイティブの確認を一度行った後に、ローカルの下書きのコピーを完全に削除します。一方で、サーバー側のエグゼキューターと監査履歴は、オーナーが残すか失効させるかを選べるように残されます。

よくある障害

症状意味
エグゼキューターはペアリングできるが、ファイル操作しか提供しないホストが使用可能なサンドボックスのバックエンドを報告しませんでした。Linuxでは、/dev/kvmを読み書きできるか、kvmグループに入っているかを確認してください。グループに追加した後は、一度ログアウトして再度ログインしてください。Windowsでは、そのエディションにHyper-Vが含まれていません。これは設定ではなく、エディションの違いです。
エグゼキューターの操作がまったく表示されないビルドが、想定された発行元から検証可能な形で発行されたものではありません。Linuxでは、ランタイムがルート所有で、グループや全員に対する書き込みビットがないことが必要です。WindowsとmacOSでは、署名がビルドに固定された発行元またはチームと一致しなければなりません。いずれの場合も、コントロールを隠すのではなく、理由を言葉で示し、対処法を明示して拒否します。
サービスは動作しているが、デーモンを起動せず、すべてのコマンドを拒否するパッケージ化の後に、インストールの内容が差し替えられています。これは意図された動作です。改ざんされたインストールは、消えてしまうのではなく、その理由を応答します。サービスが停止していると、トレイが誤った対処法を示してしまうためです。
実行が不明な結果で終わる最終的な確認応答が失われました。Nessieは、受け取っていない結果を報告することはありません。コマンドは不明とマークされ、実行は復旧経路をたどり、副作用は繰り返されません。デーモンからの後の受領情報によって、解決されることもあります。
昨日は動作していた操作が、今日は拒否されるバインディングとディスパッチの間にゲートが変わりました。チェックは各段階で繰り返されます。付与の取り消し、審査待ちのディスクリプターの改訂版、狭められたローカルポリシー、実行に合わなくなったスコープ、失効などが対象です。拒否の理由には、どれが該当したかが示されます。
エージェントがブラウザを要求し、利用できないと言われるブラウザとコーディングの作業は、人がチャンネルから、新しい実行のひとまとまりのバンドルとして開始します。通常のバインディング経路は、設計上それらを拒否します。また、すでに別の処理を行っている実行に、ブラウザ操作を追加することはできません。