tinyhumansai/openhuman · error

secret ref {} not yet fulfilled

Error message

secret ref {} not yet fulfilled

What it means

resolve_refs found the SecretRef in the map but its value slot is still empty — the user has not yet completed the interactive credential step. The doc comment instructs callers to retry rather than partially apply; last_touched is bumped so the idle TTL resets.

Source

Thrown at src/openhuman/mcp/registry/setup.rs:186

/// Resolve a `{KEY: SecretRef}` map into a `Vec<(KEY, VALUE)>`. Returns
/// `Err(_)` if any ref is unknown or not yet fulfilled — callers should
/// retry rather than partially-apply.
///
/// Touches the `last_touched` on every hit so iterative `test_connection`
/// calls reset the idle TTL.
pub async fn resolve_refs(
    refs: &HashMap<String, SecretRef>,
) -> anyhow::Result<Vec<(String, String)>> {
    let mut guard = map().lock().await;
    let mut out = Vec::with_capacity(refs.len());
    for (key, r) in refs {
        let entry = guard
            .get_mut(r)
            .ok_or_else(|| anyhow::anyhow!("unknown secret ref {}", r.as_str()))?;
        let value = entry
            .value
            .clone()
            .ok_or_else(|| anyhow::anyhow!("secret ref {} not yet fulfilled", r.as_str()))?;
        entry.last_touched = Instant::now();
        out.push((key.clone(), value));
    }
    Ok(out)
}

/// Same as [`resolve_refs`] but also removes the entries from the map on
/// success. Used by `install_and_connect` once the values have been
/// persisted to `mcp_client_env`. On failure the entries are left intact
/// so the agent can retry without re-prompting.
pub async fn consume_refs(
    refs: &HashMap<String, SecretRef>,
) -> anyhow::Result<Vec<(String, String)>> {
    // First pass: resolve. Bail without mutation if any ref is missing.
    let resolved = resolve_refs(refs).await?;
    // Second pass: drop. Bail-out on the first miss is impossible because
    // we just held the resolved values without releasing the lock — but to
    // be honest we *did* release between the two awaits. Recheck.

View on GitHub (pinned to 7491200858)

Solutions

  1. Prompt the user to complete the pending authorization, then retry
  2. Poll resolve_refs until the value is fulfilled (test_connection loops this way)
  3. Abort the setup flow if the user cancels the authorization
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at src/openhuman/mcp/registry/setup.rs:186 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/cf0500a441d78b48. Report an issue: GitHub.