Workflow: Add a New Skill¶
Recipe for adding a new skill end-to-end: DSL, schema, fixtures, tests, wiring. Nothing outside this recipe needs editing — the system is config-driven.
Realizes: the config-over-code principle
(spec_v3.md §1.3).
Checklist¶
-
Write the output schema. Add
schemas/<skill>_output.json. It will appear automatically under Schemas on the next build. -
Define the skill. Add
skills/<skill>.yamlwithname,version,model_alias,steps, andoutput_schema: <skill>_output.json. -
Register the model alias (if new) in
config/donna_models.yaml. -
Add fixtures. Under
fixtures/<skill>/tierN/add input/expected pairs. Tier gates:- tier1 ≥ 0.90 (baseline)
- tier2 ≥ 0.85 (nuance)
- tier3 ≥ 0.75 (complexity)
- tier4 ≥ 0.60 (adversarial)
-
Wire intent. If the skill should be invoked by user input, add routing in
donna.orchestratoror the relevant chat intent handler. -
Write tests. Under
tests/unit/skills/cover:- step execution with a mocked
ModelRouter - schema-validation failure path
- tool authorization denial path
- step execution with a mocked
-
Run the eval.
-
Document. Add a brief page under Domain → Skill System if the skill introduces a new subsystem behavior.
Where the Code Lives¶
| Layer | Module |
|---|---|
| DSL loading & validation | donna.skills.validation |
| Execution | donna.skills.executor |
| Tool dispatch | donna.skills.tool_dispatch |
| Triage agent | donna.skills |
Don't¶
- Don't call the Anthropic or Ollama SDK directly — route through
ModelRouter. - Don't hand-roll tool execution — let
ToolDispatcherdo it. - Don't add
print()— usestructlog. - Don't bypass schema validation.