zeroclaw-labs/zeroclaw · error

jira.allowed_actions contains unknown action: '{}'. Valid: g

Error message

jira.allowed_actions contains unknown action: '{}'. Valid: get_ticket, search_tickets, comment_ticket, list_projects, myself, list_transitions, transition_ticket, create_ticket

What it means

Config::validate iterates jira.allowed_actions and rejects any entry not in the closed set of eight supported actions: get_ticket, search_tickets, comment_ticket, list_projects, myself, list_transitions, transition_ticket, create_ticket. The list exists to cap what the Jira tool may do, so unknown strings — including actions from newer/older ZeroClaw versions or plain typos — fail validation rather than being ignored. Matching is exact and case-sensitive.

Source

Thrown at crates/zeroclaw-config/src/schema.rs:22089

                    .is_empty()
            {
                anyhow::bail!(
                    "jira.api_token must be set (or JIRA_API_TOKEN env var) when jira.enabled = true"
                );
            }
            let valid_actions = [
                "get_ticket",
                "search_tickets",
                "comment_ticket",
                "list_projects",
                "myself",
                "list_transitions",
                "transition_ticket",
                "create_ticket",
            ];
            for action in &self.jira.allowed_actions {
                if !valid_actions.contains(&action.as_str()) {
                    anyhow::bail!(
                        "jira.allowed_actions contains unknown action: '{}'. \
                         Valid: get_ticket, search_tickets, comment_ticket, list_projects, myself, list_transitions, transition_ticket, create_ticket",
                        action
                    );
                }
            }
        }

        // Nevis IAM — delegate to NevisConfig::validate() for field-level checks
        if let Err(msg) = self.security.nevis.validate() {
            anyhow::bail!("security.nevis: {msg}");
        }

        // Delegate tool global defaults
        if self.delegate.timeout_secs == 0 {
            validation_bail!(
                InvalidNumericRange,
                "delegate.timeout_secs",

View on GitHub (pinned to 88bb9c8533)

Solutions

  1. Correct the entry to one of: get_ticket, search_tickets, comment_ticket, list_projects, myself, list_transitions, transition_ticket, create_ticket (exact lowercase snake_case)
  2. Remove the unsupported action if it is not needed
  3. If the action genuinely should exist, upgrade ZeroClaw — the valid set grows across versions

Example fix

# before
[jira]
enabled = true
allowed_actions = ["get-ticket", "update_ticket"]

# after
[jira]
enabled = true
allowed_actions = ["get_ticket", "transition_ticket"]
Defensive patterns

Strategy: type-guard

Validate before calling

pub const JIRA_ACTIONS: [&str; 8] = [
    "get_ticket", "search_tickets", "comment_ticket", "list_projects",
    "myself", "list_transitions", "transition_ticket", "create_ticket",
];
fn jira_actions_ok(actions: &[String]) -> bool {
    actions.iter().all(|a| JIRA_ACTIONS.contains(&a.as_str()))
}

Type guard

fn is_valid_jira_action(action: &str) -> bool {
    JIRA_ACTIONS.contains(&action)
}

// narrow before save:
let cleaned: Vec<String> = cfg.jira.allowed_actions.iter()
    .filter(|a| is_valid_jira_action(a))
    .cloned().collect();

Try / catch

match cfg.validate() {
    Err(e) if e.to_string().starts_with("jira.allowed_actions") => {
        let bad: Vec<_> = cfg.jira.allowed_actions.iter()
            .filter(|a| !is_valid_jira_action(a)).collect();
        eprintln!("unknown jira actions {bad:?}; valid: {JIRA_ACTIONS:?}");
    }
    other => other?,
}

Prevention

When it happens

Trigger: Writing an action with a typo ("get-ticket", "search_ticket", "CreateTicket"); listing an action that exists in another tool's vocabulary ("delete_ticket", "update_ticket"); downgrading ZeroClaw while keeping a config that uses an action added in the newer version; singular/plural mistakes ("list_project").

Common situations: Config authored against release notes of a different version; hand-merged configs where an action name got mangled; users assuming write actions beyond the eight exist.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


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