Skip to content

Remote reviews and independent notification adapters

Opaque core owns the review challenge, current reviewer eligibility, signed decision and final authorization check. A separately enrolled workstation fetches the full review over pinned TLS and signs the exact challenge. The broker verifies that signature and retains the decision before acknowledging it. Notification adapters cannot approve work or replace the native review ceremony.

The macOS release archives include Opaque Reviewer.app and the standalone reviewer (verified in the published v0.5.0 aarch64-apple-darwin archive, which also carries opaque-approver). The shell installer installs CLI binaries only. The Homebrew formula tracks the latest published release and preserves the included app at $(brew --prefix opaque)/Opaque Reviewer.app without opening or registering it; the release archive also supports manual installation. Its native URL handler accepts opaque references only, queues a bounded set of notices and resolves them against explicitly selected local enrollment. Opening a notice does not approve it. A reviewer chooses to open the full immutable document, confirms review and authenticates natively before an approval is signed. Rejecting native review can submit a signed rejection; dismissing the notice locally sends no decision. See the installation and enrollment guide. The app displays expiry and separates decision acceptance from execution. A missing acknowledgment triggers a read-only receipt lookup, never another POST or an operation retry. Signed/notarized distribution and fresh-user native testing remain distinct from local packaging and inert launcher tests. Native review lasts at most 90 seconds and authentication at most 60 seconds, each bounded by the remaining challenge deadline. An accepted rejection is still a decision acknowledgment, not permission to execute. Retained receipt lookup is for current-authority v2 remote tasks and still requires eligible device/human access; it does not recover authority from an expired or revoked round.

A host can use the public opaque-approval runtime without an enterprise service. RemoteApprovals accepts host-owned reviewer resolution and authority guards; the host keeps revocation checks held through the irreversible ledger transition. The same configured device, principal, required role, authority epoch and exact requester must remain eligible when a decision is accepted and used.

Configuring the current remote reviewer

Workstation enrollment alone does not enable v2 remote tasks. Add these fields to an already provisioned broker's trusted configuration:

[[workstation_approvers]]
name = "Trusted reviewer"
public_key_hex = "<workstation Ed25519 public key>"
principal_id = "<existing enabled human principal ID>"

[remote_approvals]
reviewer_public_key_hex = "<same workstation Ed25519 public key>"
required_role = "operator"
# Optional: omit this field for review without a notification adapter.
notice_token_file = "/absolute/broker-custody/notice.token"

The daemon requires native approval backend, enable_task_grants = true, require_seal = true, enforced isolated custody, an isolated tenant binding, and identity.required = true. The named reviewer must remain enabled, admitted and hold required_role. The task and its child actions must require the single paired_workstation factor. Apply changes through the trusted sealing/startup process. See deployment, identity and policy. Distinct-approver policy remains in force when configured; a second key for the requester does not provide a different human reviewer.

The workstation needs the broker HTTPS origin, its opq-... pairing ID and the full certificate SHA-256 through trusted operator provisioning before enrollment. Startup's shortened certificate fingerprint is insufficient. No current dedicated read-only operator CLI exports this complete enrollment handoff; notices and unverified discovery responses must not become its trust source.

Configuring the optional notice feed

The optional token is a dedicated read credential, not a paired-device token. Its file must be an owned mode-0600 regular file directly inside the same custody directory as the remote decision ledger. Use 32–128 random URL-safe characters, with no whitespace, and distribute it only to the intended adapter through private custody. The broker hashes the credential at startup; credential rotation requires an intentional restart, which cancels unfinished approval rounds. Omitting the token disables the feed while preserving trusted workstation review. Legacy slack configuration is rejected, so a migration cannot silently leave notification delivery enabled inside the broker.

GET /notifications/pending on the existing HTTPS approval server requires the single Authorization: Bearer <notice-token> header. Browser-origin requests are rejected. The response has Cache-Control: no-store and this v1 shape:

{
  "schema_version": 1,
  "broker_id": "opq-example",
  "notices": [
    {
      "approval_id": "00000000-0000-4000-8000-000000000001",
      "broker_id": "opq-example",
      "expires_at": 2000000000
    }
  ]
}

The response contains at most the 64 live workstation rounds and filters each against current reviewer eligibility and expiry. It contains no review text, requester, task details, signing keys or transport credentials. Polling does not consume a round or write delivery status. A notice token cannot fetch workstation review documents or submit decisions. Public wire structs are remote::notices::{ApprovalNotice, PendingNoticeFeed}.

Implementing an adapter

Pin the broker's certificate and identity through a trusted channel before sending credentials. Disable redirects and ambient proxies, bound requests and responses, validate the feed version and broker ID, and never derive endpoints or credentials from notice contents. Use opaque_core::workstation::notice_link to create the opaque reference; only the enrolled approver resolves it against its own pinned broker configuration.

An adapter owns its delivery deduplication, retry budget and transport credentials separately from broker state. Recheck that a notice is still pending immediately before delivery. Cancellation can race a message already in transit; the message still carries no authority, and the workstation/broker check the current review. A delivery failure or unknown outcome must never become an approval or retry of an agent operation. Snapshot or transport availability is not proof of approval.

Core retains the existing decision ledger schema for historical signed receipts. Old notification columns remain inert for compatibility; new rounds do not store transport attempts there. Restart cancels unfinished rounds and cannot resume work from either historical receipts or notification state.

Current remote task approval uses one configured reviewer. It does not authorize MCP invocations, provide approval quorum or imply a completed production pilot.