name: smart_sprint_planner version: "1.1.0" display_name: "Smart Sprint Planner" description: > A real-world OpenEnv environment for agile sprint planning and dynamic replanning. Agents convert planning context into practical task assignments across a software team, balancing deadlines, skill fit, capacity, dependencies, and mid-sprint disruptions. author: "Sprint Planning Team" license: "MIT" tasks: - task_id: easy name: "Static Sprint Planning" difficulty: easy baseline_expected_score: 0.833 - task_id: medium name: "Single Disruption Replanning" difficulty: medium baseline_expected_score: 0.734 - task_id: hard name: "Multi-Disruption Dynamic Planning" difficulty: hard baseline_expected_score: 0.761 tags: - openenv - agile - sprint-planning - scheduling - task-assignment - dynamic-replanning - rl-environment sdk: docker hardware: cpu-basic base_image: "ghcr.io/meta-pytorch/openenv-base:latest" endpoints: reset: "/reset" step: "/step" state: "/state" tasks: "/tasks" grader: "/grade" health: "/health" spec: openenv_version: "0.3.0" gymnasium_compatible: true max_episodes_per_session: 50 session_timeout_seconds: 3600 tasks: - id: easy name: "Static Sprint Planning" difficulty: easy max_steps: 10 baseline_score: 0.833 grader_type: programmatic - id: medium name: "Single Disruption Replanning" difficulty: medium max_steps: 15 baseline_score: 0.734 grader_type: programmatic - id: hard name: "Multi-Disruption Dynamic Planning" difficulty: hard max_steps: 20 baseline_score: 0.761 grader_type: programmatic observation_space: type: structured schema: "Observation" contains: meeting_text: "str - planning transcript or transcribed meeting audio" extracted_items: "list[ExtractedItem] - structured planning items extracted from the meeting" jira_tickets: "list[Task] - active sprint backlog tickets" developers: "list[Developer] - available engineers with capacity and specialties" completed_task_ids: "list[str] - completed ticket ids" sprint_day: "int - current day within the simulated sprint" metrics: "SprintMetrics - reward and disruption statistics" difficulty: "Difficulty - active task difficulty" recent_events: "list[SprintEvent] - disruption events applied this step" pending_events: "list[SprintEvent] - scheduled future disruptions" action_space: type: discrete_typed schema: "Action" action_types: - task_assignment reward_function: type: dense range: [-0.5, 2.5] signals: on_time_completion: +0.50 skill_match: +0.20 high_priority: +0.10 disruption_adaptation: +0.25 invalid_assignment: -0.10 blocked_assignment: -0.40 over_capacity_assignment: -0.20 data: scenario_sources: - dataset.json - dataset_hard_extra.json - dataset_hard_extra2.json - built_in_fallbacks synthetic_data: true realism: high baseline: model: "Qwen/Qwen2.5-72B-Instruct" api_compatible: "openai" temperature: 0.1 max_tokens: 500 seeds: [42] expected_scores: easy: 0.833 medium: 0.734 hard: 0.761 overall_mean: 0.776 api_key_env_var: "HF_TOKEN" script: "inference.py" infrastructure: dockerfile: "Dockerfile" port: 7860 build_command: "docker build -t smart-sprint-planner ." run_command: "docker run -p 7860:7860 smart-sprint-planner" framework: fastapi server: uvicorn workers: 1 startup_command: "uvicorn server.app:app --host 0.0.0.0 --port 7860" session_backend: in_memory env_vars: required: - API_BASE_URL - MODEL_NAME - HF_TOKEN optional: - API_KEY dependencies: - fastapi - uvicorn - pydantic - numpy - openai - tenacity