tinyhumansai/openhuman · error · anyhow::Error

no pending approval ever registered for request_id '{request

Error message

no pending approval ever registered for request_id '{request_id}'

What it means

Decide-miss disambiguation in approval_decide: the conditional UPDATE matched zero rows and gate.classify_decide_miss reports the never-registered case — no approval request with this request_id was ever parked in this session. Unlike the benign already-decided/expired race at rpc.rs:236, this distinct wording stays a captured Sentry signal (TAURI-RUST-5EH); the faulting input is an unknown or foreign-session request_id.

Source

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

            // "no pending approval found" wording that `expected_error_kind`
            // demotes, while the never-registered arm emits a distinct string
            // that stays a captured Sentry signal.
            return match gate.classify_decide_miss(request_id) {
                DecideMiss::AlreadyResolved => {
                    tracing::warn!(
                        request_id = request_id,
                        "[rpc:approval_decide] no pending approval found (already decided/expired — benign race)"
                    );
                    Err(anyhow!(
                        "no pending approval found for request_id '{request_id}' (already decided or expired)"
                    ))
                }
                DecideMiss::NeverRegistered => {
                    tracing::warn!(
                        request_id = request_id,
                        "[rpc:approval_decide] no pending approval ever registered (genuine lost registration)"
                    );
                    Err(anyhow!(
                        "no pending approval ever registered for request_id '{request_id}'"
                    ))
                }
            };
        }
    };

    let mut logs = vec![format!(
        "[approval] decided request_id={} tool={} decision={}",
        row.request_id,
        row.tool_name,
        decision.as_str()
    )];

    // "Always allow": persist the tool onto the user's `autonomy.auto_approve`
    // allowlist (config save + live-policy reload) so the gate skips prompting
    // for it on future turns — this session and across restarts. Best-effort:
    // `gate.decide` already resolved the current call, so a persistence failure

View on GitHub (pinned to 7491200858)

Solutions

  1. Verify the request_id matches one emitted by a live pending approval in this session.
  2. Re-fetch the pending approvals list; the id may belong to a previous session or different user.
  3. If it recurs, check for dual-core instances or session mismatch between UI and core.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at src/openhuman/security/approval/rpc.rs:245 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/fa4771cf5df81f64. Report an issue: GitHub.