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
- Read the appended validator message — it pinpoints the offending field or placeholder
- Fix YAML syntax and required fields per the goose recipe schema (title, description, prompt, instructions, declared parameters)
- Diff against a known-good recipe from `goose recipe list` or the repo's tests
- 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
- Run `goose recipe validate` in CI for every recipe change
- Declare every placeholder used in prompt/instructions as a parameter
- Diff against a known-good recipe when validation messages are unclear
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
- Directory '{}' does not exist
- Failed to parse recipe from file.
- Job name must start with a letter or number and contain only
- --model must be in provider/model form, e.g. anthropic/claud
- --trials must be at least 1
AI-assisted analysis of aaif-goose/goose@3810898a74 (2026-08-16).
Data as JSON: /api/errors/705e5d8d2eaa515b.
Report an issue: GitHub.