Skip to content

task_states.yaml

Source: config/task_states.yaml

# Task lifecycle state machine
# See docs/task-system.md for full documentation
#
# Orchestrator loads this at startup and rejects invalid transitions.
# Each transition specifies the trigger and side effects.

states:
  - backlog
  - scheduled
  - in_progress
  - blocked
  - waiting_input
  - done
  - cancelled

initial_state: backlog

transitions:
  - from: backlog
    to: scheduled
    trigger: scheduler_assigns_slot
    side_effects:
      - create_calendar_event
      - set_donna_managed_true

  - from: scheduled
    to: in_progress
    trigger: user_acknowledges_start_or_time_arrives
    side_effects:
      - set_actual_start

  - from: scheduled
    to: backlog
    trigger: user_cancels_scheduled_time
    side_effects:
      - delete_calendar_event
      - increment_reschedule_count

  - from: in_progress
    to: done
    trigger: user_or_agent_reports_completion
    side_effects:
      - set_completed_at
      - update_velocity_metrics

  - from: in_progress
    to: blocked
    trigger: user_or_agent_reports_blocker
    side_effects:
      - update_dependencies
      - log_blocking_reason
      - notify_dependent_tasks

  - from: in_progress
    to: scheduled
    trigger: user_requests_reschedule
    side_effects:
      - assign_new_slot
      - increment_reschedule_count
      - update_calendar_event

  - from: blocked
    to: scheduled
    trigger: blocker_resolved
    side_effects:
      - find_next_available_slot

  - from: blocked
    to: cancelled
    trigger: user_abandons
    side_effects:
      - flag_dependent_tasks

  - from: waiting_input
    to: scheduled
    trigger: user_provides_info
    side_effects:
      - pm_agent_updates_task
      - scheduler_assigns_slot

  - from: waiting_input
    to: cancelled
    trigger: timeout_no_response
    timeout_days: 7
    side_effects:
      - notify_user
      - archive_task

  - from: "*"  # any state
    to: cancelled
    trigger: user_explicitly_cancels
    side_effects:
      - flag_dependent_tasks
      - delete_calendar_event_if_exists

  - from: done
    to: in_progress
    trigger: user_reopens
    side_effects:
      - clear_completed_at

  - from: cancelled
    to: backlog
    trigger: user_reopens_cancelled
    side_effects:
      - clear_cancelled_at

# Invalid transitions (enforced — these will be rejected)
invalid_transitions:
  - from: backlog
    to: done
    reason: "Cannot complete without scheduling. Must go scheduled  in_progress  done."

  - from: cancelled
    to: "*"
    except: [backlog]
    reason: "Must be re-opened to backlog first."

  - from: done
    to: scheduled
    reason: "Must go through in_progress first for reopening."