tinyhumansai/openhuman · error · anyhow::Error

approval gate is not installed; supervised mode disabled

Error message

approval gate is not installed; supervised mode disabled

What it means

Global-state guard in approval_decide: ApprovalGate::try_global() returns None because the approval gate was never installed in this process (e.g. OPENHUMAN_APPROVAL_GATE=0), yet a decision arrived. There is no pending-approval registry to apply the decision to, so the RPC fails instead of silently succeeding. The faulting condition is gate absence, not a bad request id.

Source

Thrown at src/openhuman/security/approval/rpc.rs:206

}

/// Apply a decision to a pending row. Errors when the request id is
/// unknown / already decided / belongs to a different session.
pub async fn approval_decide(
    request_id: &str,
    decision: ApprovalDecision,
) -> anyhow::Result<RpcOutcome<PendingApproval>> {
    tracing::debug!(
        request_id = request_id,
        decision = decision.as_str(),
        "[rpc:approval_decide] entry"
    );
    let gate = ApprovalGate::try_global().ok_or_else(|| {
        tracing::warn!(
            request_id = request_id,
            "[rpc:approval_decide] gate not installed"
        );
        anyhow!("approval gate is not installed; supervised mode disabled")
    })?;
    let decided = match gate.decide(request_id, decision) {
        Ok(row) => row,
        Err(err) => {
            tracing::error!(
                request_id = request_id,
                error = %err,
                "[rpc:approval_decide] gate decide failed"
            );
            return Err(err);
        }
    };
    let row = match decided {
        Some(row) => row,
        None => {
            // `gate.decide` returned `Ok(None)`: the conditional UPDATE matched
            // 0 rows. Disambiguate the benign already-decided/expired race from
            // a genuine lost registration so only the latter reaches Sentry

View on GitHub (pinned to 7491200858)

Solutions

  1. Enable the approval gate (remove OPENHUMAN_APPROVAL_GATE=0 or set it to 1) and restart the core.
  2. Do not send approval decisions when the gate is disabled; the UI should hide the approval card.
  3. Check startup logs to confirm whether the gate was installed.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at src/openhuman/security/approval/rpc.rs:206 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of tinyhumansai/openhuman@7491200858 (2026-08-17). Data as JSON: /api/errors/5628b48e634a27ba. Report an issue: GitHub.