Skip to main content
Version: 0.0.5

Canonical format reference

The on-disk format of a canonical agent. This is the reference companion to the Canonical store concept page.

:::note Schema authority The exact agent.yaml schema is owned by internal/canonical and derived from the research team's common-agent-definition.schema.json. The fields below are the frozen contract vocabulary (CanonicalAgent in internal/contract). Use the generated schema for exact keys/types/defaults once published; anything beyond this set is tracked internally. :::

Directory layout​

.graft/agents/<name>/
├─ agent.yaml # canonical fields (provider-neutral)
├─ instructions.md # body / system prompt
└─ .meta.json # per-provider source hash + last commit hash

agent.yaml fields​

KeyTypeDescription
namestringAgent identifier. Not overridable via providerOverrides.
descriptionstringShort description. Must be non-empty before sync runs.
modelstringDefault model id.
toolsstring[]Allowed tools.
mcpstring[]MCP server references.
permissionsmap<string,string>Permission settings.
providerOverridesmap<provider, map>Per-provider values with no canonical home. Restored verbatim when serializing back to that provider.

The agent body (system prompt) lives in instructions.md, not in agent.yaml.

providerOverrides rules​

providerOverrides lets you set provider-specific fields that the canonical model does not have a home for. The key must be a recognized provider id.

  • name is excluded: the serialization layer enforces this — a providerOverrides[p]["name"] entry produces a warning and is silently dropped, never written.
  • Unknown provider key → error: an unrecognized key under providerOverrides blocks sync. graft uses Levenshtein distance to suggest the nearest valid provider id ("did you mean ...?").
  • Field validation → warning: override values are checked against the provider's catalog schema. Unrecognized fields produce a warning (never blocking), since catalog schemas may be incomplete.

Per-provider model override​

Use graft agent model to set or clear a per-provider model override without editing agent.yaml by hand:

graft agent model reviewer --provider claude-code --model claude-opus-4
graft agent model reviewer --provider claude-code --clear

This writes providerOverrides.claude-code.model in agent.yaml.

.meta.json​

Tracks per-provider content hashes used for change detection and drift classification. See Change detection for the full hash architecture.

Example​

# .graft/agents/reviewer/agent.yaml
name: reviewer
description: Reviews diffs for correctness and style.
model: claude-sonnet-4
tools:
- read
- grep
mcp: []
permissions:
edit: deny
providerOverrides:
claude-code:
color: blue # provider-specific, no canonical home; preserved on round-trip
codex:
model: o4-mini # per-provider model override
<!-- .graft/agents/reviewer/instructions.md -->
You are a code reviewer. Focus on correctness first, then style.