Skip to content

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