zeroclaw-labs/zeroclaw · error

Transition '{name}' not found for {issue_key}. Available: {}

Error message

Transition '{name}' not found for {issue_key}. Available: {}

What it means

Thrown by transition_ticket when resolving a transition by name: the tool fetched the issue's available transitions, case-insensitively matched each name against the requested transition_name, and found no match. The message lists every transition name actually available on the issue, which reflects the issue's current workflow status. This is a client-side resolution failure before any POST is made.

Source

Thrown at crates/zeroclaw-tools/src/jira_tool.rs:774

            (_, Some(name)) if !name.trim().is_empty() => {
                let transitions = self.fetch_transitions(issue_key).await?;
                let needle = name.trim().to_ascii_lowercase();
                let found = transitions.iter().find_map(|t| {
                    let n = t["name"].as_str()?;
                    if n.eq_ignore_ascii_case(&needle) || n.to_ascii_lowercase() == needle {
                        t["id"].as_str().map(String::from)
                    } else {
                        None
                    }
                });
                match found {
                    Some(id) => id,
                    None => {
                        let available: Vec<&str> = transitions
                            .iter()
                            .filter_map(|t| t["name"].as_str())
                            .collect();
                        anyhow::bail!(
                            "Transition '{name}' not found for {issue_key}. Available: {}",
                            available.join(", ")
                        );
                    }
                }
            }
            _ => {
                anyhow::bail!(
                    "transition_ticket requires exactly one of transition_id or transition_name"
                );
            }
        };

        let ver = self.api_version();
        let url = format!(
            "{}/rest/api/{}/issue/{}/transitions",
            self.base_url, ver, issue_key
        );

View on GitHub (pinned to 88bb9c8533)

Solutions

  1. Read the 'Available:' list in the error and re-run with one of those exact names (matching is case-insensitive).
  2. Call list_transitions(issue_key) first and select the id or name dynamically instead of hardcoding.
  3. If the transition should exist, check the issue's current status in Jira — the workflow may not allow this transition from that status.
  4. Prefer transition_id over name for scripted automation, since ids are stable per workflow while names can be renamed.
  5. If projects use different workflows, make the transition name a per-project configuration value.

Example fix

// before
jira.transition_ticket("PROJ-42", None, Some("Done")).await?; // workflow says "Close Issue"

// after
let result = jira.list_transitions("PROJ-42").await?;
// pick from the returned transitions, e.g. the one whose `to_status` is what you want
jira.transition_ticket("PROJ-42", None, Some("Close Issue")).await?;
Defensive patterns

Strategy: validation

Validate before calling

// Fetch transitions first and match the name yourself before calling transition_ticket
let transitions = jira.list_transitions("PROJ-42").await?; // returns {transitions:[{id,name,to_status}]}
let wanted = "done"; // desired target, lowercase
let chosen = transitions.iter().find(|t| {
    t["name"].as_str().map(|n| n.to_ascii_lowercase().contains(wanted)).unwrap_or(false)
});
if chosen.is_none() {
    anyhow::bail!("no transition leads to {wanted}; issue may already be there");
}
let name = chosen.unwrap()["name"].as_str().unwrap();

Try / catch

match jira.transition_ticket("PROJ-42", None, Some(name)).await {
    Ok(_) => {}
    Err(e) if e.to_string().starts_with("Transition '") => {
        // workflow moved on: re-fetch transitions and retry once with a fresh pick
    }
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: Calling transition_ticket with a name like "Done" when the issue's current status only offers e.g. "In Progress", "In Review"; using a workflow-specific name ("Close Issue") from a different workflow scheme; trailing/leading whitespace is trimmed but different wording ("Resolve" vs "Resolved") will not match.

Common situations: Hardcoding transition names from one project's workflow into scripts reused on another project; the issue is already in the target status so the transition no longer applies; Jira Cloud workflows renamed by admins; localized or custom workflow steps (e.g. Jira Service Management queues) that differ from software-project defaults.

Related errors


AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23). Data as JSON: /api/errors/1eda4079802c62e3. Report an issue: GitHub.