task_types.yaml¶
Source: config/task_types.yaml
# Task type registry
# See docs/task-system.md for full documentation
#
# Each task type specifies:
# - prompt_template: path to externalized prompt (Jinja2 or markdown)
# - output_schema: JSON schema for structured LLM output
# - model: model alias from donna_models.yaml
# - tools: list of tools the model may request for this task type
# (Production shadow monitoring is configured under routing.<task>.shadow in
# donna_models.yaml, not here — see spec_v3.md §4.4.)
task_types:
parse_task:
description: "Extract structured task fields from natural language"
model: parser
prompt_template: prompts/parse_task.md
output_schema: schemas/task_parse_output.json
tools: []
classify_priority:
description: "Assign priority 1-5 based on content and context"
model: parser
prompt_template: prompts/classify_priority.md
output_schema: schemas/priority_output.json
tools: [task_db_read]
generate_digest:
description: "Generate morning digest in Donna persona"
model: parser
prompt_template: prompts/morning_digest.md
output_schema: schemas/digest_output.json
tools: [calendar_read, task_db_read, cost_summary]
prep_research:
description: "Research and compile prep materials for a flagged task"
model: reasoner
prompt_template: prompts/prep_research.md
output_schema: schemas/prep_output.json
tools: [web_search, email_read, notes_read, fs_read]
dedup_check:
description: "Determine if two tasks are the same, related, or different"
model: parser
prompt_template: prompts/dedup_check.md
output_schema: schemas/dedup_output.json
tools: []
task_decompose:
description: "Break a complex task into subtasks with dependencies"
model: reasoner
prompt_template: prompts/task_decompose.md
output_schema: schemas/decompose_output.json
tools: [task_db_read]
extract_preferences:
description: "Extract learned preference rules from correction history"
model: reasoner
prompt_template: prompts/extract_preferences.md
output_schema: schemas/extract_preferences_output.json
tools: []
generate_nudge:
description: "Generate a contextual nudge message in Donna persona"
model: local_parser
prompt_template: prompts/generate_nudge.md
output_schema: schemas/nudge_output.json
tools: []
generate_reminder:
description: "Generate a pre-task reminder message in Donna persona"
model: local_parser
prompt_template: prompts/generate_reminder.md
output_schema: schemas/reminder_output.json
tools: []
challenge_task:
description: "Evaluate task quality and generate follow-up questions"
model: local_parser
prompt_template: prompts/challenge_task.md
# F-W3-H: schema points at challenger_parse.json (the Wave 3 unified
# intent + capability parse shape). ChallengerAgent.execute's legacy
# {needs_clarification, questions, reasoning} output reads the raw
# LLM response directly and does not run through validate_output, so
# this swap does not affect that path.
output_schema: schemas/challenger_parse.json
tools: []
generate_weekly_digest:
description: "Generate weekly efficiency report in Donna persona"
model: local_parser
prompt_template: prompts/weekly_digest.md
output_schema: schemas/weekly_digest_output.json
tools: []
classify_chat_intent:
description: "Classify user chat message intent"
model: local_parser
prompt_template: prompts/chat/classify_intent.md
output_schema: schemas/chat_intent_output.json
tools: []
chat_respond:
description: "Generate chat response based on intent and context"
model: local_parser
prompt_template: prompts/chat/chat_respond.md
output_schema: schemas/chat_respond_output.json
tools: []
chat_summarize:
description: "Summarize a chat session on close or expiry"
model: local_parser
prompt_template: prompts/chat/chat_summarize.md
output_schema: schemas/chat_summarize_output.json
tools: []
chat_escalation:
description: "Chat response via Claude when local LLM cannot answer"
model: parser
prompt_template: prompts/chat/chat_respond.md
output_schema: schemas/chat_respond_output.json
tools: []
# Slice 20 — when this task is over-budget, the manual handoff is a
# text-only round trip via dashboard. Spec §5.2 / §6.2.
manual_escalation:
mode: chat
# Slice 20 — Ollama-rendered summary for the chat-mode Discord
# notification. Output schema is intentionally tight so a malformed
# local-LLM response surfaces as an exception that the prompt builder
# catches and replaces with a deterministic fallback (§10.2 row 3).
escalation_summary:
description: "Summarize an escalation prompt for the Discord notification"
model: local_parser
prompt_template: prompts/escalation/summarize.md
output_schema: schemas/escalation_summary_output.json
tools: []
triage_failure:
description: "Decide how to handle a skill runtime failure"
model: local_parser
prompt_template: ""
output_schema: ""
tools: []
reply_intent:
description: "Classify user reply intent and propose actions"
model: local_parser
prompt_template: prompts/reply_intent.md
output_schema: schemas/reply_intent_output.json
tools: []
skill_equivalence_judge:
description: "Compare two skill outputs for semantic equivalence during shadow sampling"
model: reasoner
prompt_template: prompts/skill_equivalence_judge.md
output_schema: schemas/skill_equivalence_output.json
tools: []
skill_auto_draft:
description: "Claude generates a skill YAML + fixtures for a candidate capability"
model: reasoner
prompt_template: prompts/skill_auto_draft.md
output_schema: schemas/skill_auto_draft_output.json
tools: []
# Slice 21 — over-budget manual handoff routes to Claude Code on
# the user's host. Realizes docs/superpowers/specs/manual-escalation.md
# §5.3 / §6.2. {name} is substituted from the originating entity
# (skill_candidate_report.capability_name) at gate-fire time.
manual_escalation:
mode: claude_code
# Skills are filesystem-rooted directories under skills/<name>/
# (skill.yaml + steps/*.md + schemas/*.json) — see
# docs/domain/skill-system.md and src/donna/skills/loader.py.
# Fixtures live under fixtures/<name>/case*.json. The "/**"
# suffix is a recursive prefix match enforced by DiffValidator.
target_paths:
skill: "skills/{name}/**"
fixtures: "fixtures/{name}/**"
# Reference module the user is expected to mimic structurally —
# an existing simple capability seeded into the repo.
reference_module: "skills/parse_task/skill.yaml"
forbidden_patterns:
- "import anthropic" # Skills must not bypass donna.llm
- "DONNA_API_KEY" # No raw secret references
- "value=True" # vault.read() must NOT request raw value
skill_evolution:
description: "Claude regenerates a degraded skill with divergence case studies + correction log"
model: reasoner
prompt_template: prompts/skill_evolution.md
output_schema: schemas/skill_evolution_output.json
tools: []
# Slice 21 — manual handoff for evolution edits in-place under the
# existing skill directory. {name} resolves to the existing
# skill.capability_name from the originating_entity_id row.
manual_escalation:
mode: claude_code
target_paths:
skill: "skills/{name}/**"
fixtures: "fixtures/{name}/**"
reference_module: "skills/{name}/skill.yaml"
forbidden_patterns:
- "import anthropic"
# Slice 22 — tool builds. Reuses the slice-21 claude_code protocol
# with the extra §10.5 lint gates enforced by ManualValidationRouter._validate_tool.
# {name} substitution resolves to the tool name from the originating
# tool_request row (originating_entity_type='tool_request').
tool_request_fulfillment:
description: "Manual tool build initiated from a tool_request gap (slice 22)"
model: reasoner
prompt_template: prompts/escalation/tool_build.md
output_schema: schemas/escalation_submission.json
tools: []
manual_escalation:
mode: claude_code
target_paths:
tool: "src/donna/skills/tools/{name}.py"
tool_test: "tests/skills/tools/test_{name}.py"
agents_config: "config/agents.yaml"
skills_config: "config/skills.yaml"
task_types_config: "config/task_types.yaml"
reference_module: "src/donna/skills/tools/{name}.py"
forbidden_patterns:
- "import anthropic"
- "DONNA_API_KEY"
claude_novelty:
description: "Claude judges no-capability-match messages and emits execution-ready intent + skill reuse verdict"
model: reasoner
prompt_template: prompts/claude_novelty.md
output_schema: schemas/claude_novelty.json
tools: []
# Slice 15 — template-driven vault writes
draft_meeting_note:
description: "Draft a meeting-note scaffold from calendar + memory context"
model: reasoner
prompt_template: prompts/skills/draft_meeting_note.md.j2
output_schema: schemas/draft_meeting_note.json
tools: []
# Slice 16 — cadence-driven template writes
draft_daily_reflection:
description: "Draft an end-of-day reflection from today's meetings, tasks, and chats"
model: reasoner
prompt_template: prompts/skills/draft_daily_reflection.md.j2
output_schema: schemas/draft_daily_reflection.json
tools: []
draft_weekly_review:
description: "Draft a weekly self-review from the week's meetings, commitments, and tasks"
model: reasoner
prompt_template: prompts/skills/draft_weekly_review.md.j2
output_schema: schemas/draft_weekly_review.json
tools: []
draft_person_profile:
description: "Draft or refresh a People/{name}.md profile from cross-source context"
model: reasoner
prompt_template: prompts/skills/draft_person_profile.md.j2
output_schema: schemas/draft_person_profile.json
tools: []
extract_commitments:
description: "Extract commitments (speech-act classification) from today's chats and task mutations"
model: reasoner
prompt_template: prompts/skills/extract_commitments.md.j2
output_schema: schemas/extract_commitments.json
tools: []
# Schema versioning: output schemas use semantic versioning
# e.g., task_parse_output_v2.json
# Orchestrator handles both old and new formats during transitions