aaif-goose/goose · error

{} recipe file is invalid: {}

Error message

{} recipe file is invalid: {}

What it means

`goose recipe validate <name>` loads the recipe file and runs schema/template validation via validate_recipe_template_from_file. Any schema violation — including prompt placeholders like `{{ name }}` with no matching declared parameter — is wrapped with this message; the placeholder carries the validator's specific finding.

Source

Thrown at crates/goose-cli/src/commands/recipe.rs:14

use anyhow::Result;
use console::style;
use goose::recipe::validate_recipe::validate_recipe_template_from_file;
use std::collections::HashMap;

use crate::recipes::github_recipe::RecipeSource;
use crate::recipes::search_recipe::{list_available_recipes, load_recipe_file};
use goose::recipe_deeplink;

pub fn handle_validate(recipe_name: &str) -> Result<()> {
    // Load and validate the recipe file
    let recipe_file = load_recipe_file(recipe_name)?;
    validate_recipe_template_from_file(&recipe_file).map_err(|err| {
        anyhow::anyhow!(
            "{} recipe file is invalid: {}",
            style("✗").red().bold(),
            err
        )
    })?;
    println!("{} recipe file is valid", style("✓").green().bold());
    Ok(())
}

pub fn handle_deeplink(recipe_name: &str, params: &[String]) -> Result<String> {
    let params_map = parse_params(params)?;
    match generate_deeplink(recipe_name, params_map) {
        Ok((deeplink_url, recipe)) => {
            println!(
                "{} Generated deeplink for: {}",
                style("✓").green().bold(),
                recipe.title
            );

View on GitHub (pinned to 3810898a74)

Solutions

  1. Read the appended validator message — it pinpoints the offending field or placeholder
  2. Fix YAML syntax and required fields per the goose recipe schema (title, description, prompt, instructions, declared parameters)
  3. Diff against a known-good recipe from `goose recipe list` or the repo's tests
  4. Re-run `goose recipe validate` after every edit instead of discovering failures at run time

Example fix

# before (placeholder {{ name }} never declared)
title: "Reviewer"
description: "Reviews code"
prompt: "Review {{ name }} for defects"
instructions: "Be strict."

# after
_title: null is not needed; declare the parameter:_
title: "Reviewer"
description: "Reviews code"
prompt: "Review {{ name }} for defects"
instructions: "Be strict."
parameters:
  - name: name
    type: string
    description: Component to review
    default: src
Defensive patterns

Strategy: validation

Validate before calling

# Validate in the loop, not at run time
goose recipe validate "$RECIPE" || { echo 'fix recipe schema before proceeding' >&2; exit 1; }

Prevention

When it happens

Trigger: Validating a recipe whose YAML is malformed, missing required fields (title/prompt/instructions), or whose prompt template references parameters that are not declared, as exercised by the invalid-recipe test in this file.

Common situations: Hand-edited recipes; recipes copied from blog posts with an outdated schema; goose upgrades tightening validation rules; renamed fields.

Related errors


AI-assisted analysis of aaif-goose/goose@3810898a74 (2026-08-16). Data as JSON: /api/errors/705e5d8d2eaa515b. Report an issue: GitHub.