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
- 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)
- Remove the unsupported action if it is not needed
- 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
- Restrict UI/script inputs to a dropdown of the eight valid action ids
- After upgrading ZeroClaw, re-validate configs that list actions — new versions may add or rename entries
- Use exact snake_case; a lint rule (or grep in CI) for `allowed_actions = [` catches hand edits
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
- Edge TTS binary_path must be one of {:?}, got: {raw_path}
- tunnel.pinggy.region must be one of: us, eu, ap, br, au (or
- jira.base_url must not be empty when jira.enabled = true
- jira.api_token must be set (or JIRA_API_TOKEN env var) when
- Destination {} is not in allowed list
AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23).
Data as JSON: /api/errors/bb48f2d75c34c444.
Report an issue: GitHub.