meta.yml Schema & Required Fields
eva beginner 5 min read
ELI5
meta.yml is the shipping label on the prompt box: a few mandatory boxes (id, title, version, dates), some optional notes for the postman (tags, notes), and a description-shaped barcode that decides whether Anthropic’s skill scanner will even pick the box up.
Technical Deep Dive
Required vs. Optional
bin/eva:49 declares the seven REQUIRED_META keys; absence or blank value fails eva doctor:
| Field | Required | Notes |
|---|---|---|
id | yes | Must equal directory name (bin/eva:346-347) |
title | yes | Human-readable |
summary | yes | One-liner; falls back as skill description |
status | yes | One of draft/tested/ready (VALID_STATUS, line 50) |
version | yes | semver-ish |
created, updated | yes | ISO date; eva edit/eva promote bump updated |
tags | optional | Free list; reserve pattern:* for the Anthropic taxonomy |
model | optional | Tunes a default judge/source model |
inputs | optional | List of {name, required}; cross-checked against {{vars}} in prompt.xml |
description | optional | Skill-grade [WHAT] + [WHEN] + [capabilities]; ≤ 1024 chars, no </> |
triggers | optional | Positive user phrasings for the skill judge |
not_for | optional | Negative-scope phrases |
notes | optional | Failure-mode logbook; the highest-leverage field per author intent |
promotion | optional | Per-prompt overrides for min_uses / require_eval |
Class Diagram
classDiagram class Meta { +id : string +title : string +summary : string +status : draft|tested|ready +version : string +created : date +updated : date +tags : string[] +model : string +description : string +triggers : string[] +not_for : string[] +inputs : Input[] +promotion : PromotionGates +notes : string } class Input { +name; +required } class PromotionGates { +min_uses; +require_eval } Meta --> "0..*" Input Meta --> PromotionGatesCross-Validation
eva doctor (bin/eva:362-369) parses {{var}} placeholders out of prompt.xml and reconciles against meta.inputs:
- A
{{var}}not declared ininputs→prompt.xml references undeclared var. - A declared
inputs[].required: truenot referenced inprompt.xml→declared input '<name>' (required) not referenced.
description is additionally shape-checked by _check_skill_export_shape (bin/eva:287-326): forbids </>, caps at 1024 chars, warns if no “use when” trigger clause.
Key Terms
- REQUIRED_META → the seven-tuple at
bin/eva:49checked unconditionally bycmd_doctor. - inputs[] → declared template variables;
required: truemeans doctor must see{{name}}inprompt.xml. - promotion — optional overrides for the lifecycle gates; see eva-003.
Q&A
Q: Which seven fields does eva doctor flag as required?
A: id, title, summary, status, version, created, updated — REQUIRED_META at bin/eva:49.
Q: What is the maximum length of meta.description for skill export?
A: 1024 characters (SKILL_DESCRIPTION_MAX, bin/eva:281); above that, doctor fails the prompt.
Q: Which two characters are forbidden inside meta.description?
A: < and > — they break Anthropic skill frontmatter (bin/eva:304-305).
Examples
Minimal meta.yml that passes eva doctor:
id: hellotitle: Greetersummary: Generate a friendly greeting.status: draftversion: 0.1.0created: 2026-05-05updated: 2026-05-05inputs: - {name: name, required: true}neighbors on the map
- Promotion Lifecycle Gates promoting a prompt from draft to tested
- Skill Export Pipeline exporting a ready prompt as an Anthropic skill
- PostgreSQL Database Schema (ORM Models) understanding the planned database schema
- Operations & Versions Schema writing a new sync query