A real-world Task Manager environment where an AI agent must add, prioritize, and complete tasks while respecting deadlines and dependency constraints. The environment cycles through three meaningfully distinct difficulty levels -- each demanding progressively more sophisticated planning.
This environment targets real-world utility: the kind of task scheduling problems that users, productivity apps, and organizational tools deal with every day.
Difficulty Levels
Level
Goal
Key Constraints
Easy
Add 2-3 tasks, then list them
None -- basic task CRUD
Medium
Add 4 tasks with priorities & deadlines; complete all High-priority before deadline
Deadline enforcement, priority management
Hard
Add 5 tasks with priorities, deadlines, AND dependencies; complete in valid topological order
TaskManagerAction(
command = "add", # "add" | "complete" | "list"
title = "Fix critical bug", # required for add / complete
priority = "High", # "Low" | "Normal" | "High" (default: "Normal")
deadline = "2026-04-15", # ISO-8601 date (optional; relevant in Medium & Hard)
depends_on= ["Reproduce bug"] # list of prerequisite task titles (Hard only)
)
Commands
Command
Description
add
Create a new task. Returns error if title already exists or dependency is unresolved.
complete
Mark a task as done. Checks deadline & dependency constraints and applies penalties.
list
Display all current tasks with status, priority, deadline, and dependency info.
Observation Space
TaskManagerObservation(
success = True, # whether the last action succeeded
message = "Task 'Fix bug' added", # status message or error description
tasks = [...], # full task list snapshot
violations = [...], # list of rule violations this episode
reward = 0.45, # cumulative partial reward (0.0-1.0)
done = False, # True when episode goal is achieved
metadata = {
"difficulty": "Hard",
"step": 7,
"tasks_added": 5,
"tasks_completed": 3,
"deadline_misses": 0,
"dependency_violations": 0
}
)
Task Object Fields
Field
Type
Description
title
str
Task name
priority
str
"Low" / "Normal" / "High"
deadline
str
ISO-8601 date or "none"
depends_on
list[str]
Prerequisite task titles
completed
bool
Whether the task is done
deadline_missed
bool
True if completed after deadline
dependency_violation
bool
True if completed before all prerequisites
Reward Function
Easy Mode
Event
Reward
Each task added (up to 3)
+0.15
Calling list
+0.20
Goal: >=2 tasks added + list called
1.0
Medium Mode
Event
Reward
Each task added (up to 4)
+0.15
Each task with explicit non-Normal priority
+0.10
Each High-priority task completed on time
+0.20
Deadline missed
-0.25
Goal: 4 tasks, >=2 High, all High completed on time
1.0
Hard Mode
Event
Reward
Each task added (up to 5)
+0.15
Each task with non-Normal priority
+0.10
Each task completed without any violation
+0.25
Perfect run bonus (all done, zero violations)
+0.10
Dependency violation
-0.30
Deadline missed
-0.25
Goal: 5 tasks, >=2 High, all completed, zero violations
1.0
Quick Start
# Install dependencies
uv sync# Start the server
uvicorn server.app:app --host 127.0.0.1 --port 8000
# In another terminal, run the inference demo
python inference.py
obs = env.reset() # cycles to Hard
env.step(TaskManagerAction(command="add", title="Reproduce bug", priority="High", deadline="2026-04-15"))
env.step(TaskManagerAction(command="add", title="Write tests", priority="Normal", deadline="2026-04-16"))
env.step(TaskManagerAction(command="add", title="Write fix", priority="High", deadline="2026-04-18",
depends_on=["Reproduce bug"]))
env.step(TaskManagerAction(command="add", title="Code review", priority="Normal", deadline="2026-04-20",
depends_on=["Write fix", "Write tests"]))
env.step(TaskManagerAction(command="add", title="Deploy", priority="Low", deadline="2026-04-22",
depends_on=["Code review"]))
# Complete in valid topological order
env.step(TaskManagerAction(command="complete", title="Reproduce bug")) # no deps
env.step(TaskManagerAction(command="complete", title="Write tests")) # no deps
env.step(TaskManagerAction(command="complete", title="Write fix")) # dep met
env.step(TaskManagerAction(command="complete", title="Code review")) # deps met
obs = env.step(TaskManagerAction(command="complete", title="Deploy")) # done=True, reward=1.0 + bonus
Environment Design Rationale
Why these three levels?
Easy establishes baseline task CRUD competency -- can the agent perform basic operations?
Medium adds time pressure and priority trade-offs -- a realistic proxy for real project management.
Hard requires multi-step planning with constraint satisfaction -- approximates real dependency scheduling (e.g., CI/CD pipelines, project Gantt charts).
Why partial rewards?
Smooth, dense reward signals (+0.15 per task, +0.10 per priority, etc.) enable reinforcement learning agents to make meaningful progress even without solving the full episode. This is superior to sparse reward environments where only terminal success counts.
Why penalties?
Deadline misses (-0.25) discourage agents from completing tasks arbitrarily late.
Dependency violations (-0.30) teach agents that order matters -- a fundamental property of real-world task graphs.