zeroclaw-labs/zeroclaw · error

create_ticket requires a non-empty summary

Error message

create_ticket requires a non-empty summary

What it means

Client-side guard in create_ticket: after the project key passes validation, the summary argument is checked with trim() and the call aborts before any HTTP request if it is empty or whitespace-only. Jira itself requires a summary, so the tool rejects the request early. This is purely an input-validation error.

Source

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

                .into(),
            error: None,
        })
    }

    #[allow(clippy::too_many_arguments)]
    async fn create_ticket(
        &self,
        project_key: &str,
        issue_type: &str,
        summary: &str,
        description: Option<&str>,
        assignee: Option<&str>,
        labels: Option<&[String]>,
        parent_key: Option<&str>,
    ) -> anyhow::Result<ToolResult> {
        validate_project_key(project_key)?;
        if summary.trim().is_empty() {
            anyhow::bail!("create_ticket requires a non-empty summary");
        }
        if issue_type.trim().is_empty() {
            anyhow::bail!("create_ticket requires a non-empty issue_type");
        }
        if let Some(parent) = parent_key {
            validate_issue_key(parent)?;
        }

        let mut fields = serde_json::Map::new();
        fields.insert("project".into(), json!({ "key": project_key }));
        fields.insert("issuetype".into(), json!({ "name": issue_type }));
        fields.insert("summary".into(), json!(summary));

        if let Some(desc) = description {
            let value = if self.is_cloud() {
                build_adf(desc, &HashMap::new())
            } else {
                json!(desc)

View on GitHub (pinned to 88bb9c8533)

Solutions

  1. Supply a non-empty summary (any non-whitespace text works; Jira truncates display but accepts long summaries).
  2. Trim user input and fall back to a generated default like "Untitled" when the source field is blank.
  3. Validate required fields in your own layer before invoking the tool (see defense below).

Example fix

// before
jira.create_ticket("PROJ", "Bug", "   ", None, None, None, None).await?; // -> error

// after
let summary = user_title.trim();
let summary = if summary.is_empty() { format!("Automated report {}", chrono_today()) } else { summary };
jira.create_ticket("PROJ", "Bug", &summary, None, None, None, None).await?;
Defensive patterns

Strategy: validation

Validate before calling

let summary = raw_summary.trim();
assert!(!summary.is_empty(), "summary required");
jira.create_ticket("PROJ", "Task", summary, None, None, None, None).await?;

Prevention

When it happens

Trigger: Calling create_ticket with summary="" or summary=" "; a tool-caller/LLM omitting the summary field and the wrapper defaulting it to an empty string; templates that substitute an empty variable (e.g. missing bug title) into the summary.

Common situations: Agent-generated ticket payloads where the model left the summary out; form handling that passes uninitialized strings; CI scripts creating tickets from commit messages when the message is blank.

Understand the failure class

Background: "Missing required field" and "field is required" errors: why libraries reject payloads that omit mandatory fields — this error's family across 20 libraries.

Related errors


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