All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.11.0 (2026-03-12)
- add production Dockerfile and health endpoint for container deployment (83af4f6)
- add ASYNC240 ignore to ruff.toml (not pyproject.toml) (108009b)
- add github-cli to devcontainer for terminal git auth (a431d8c)
- ci: use PAT for release-please to trigger CI on release PRs (f7c349f)
- resolve CI lint failures and track uv.lock (e601363)
- Validation to prevent ':' character in task and story titles (reserved as ID separator)
- Error logging when corrupted story files with embedded task objects are detected
- BREAKING: Removed legacy fallback that saved embedded task objects in story files
- Story files now strictly require normalized format (task IDs as strings, not embedded objects)
- Refactored
_load_story()and_load_task()to accept explicitplan_idparameter instead of relying on global state - Loading code now rejects and logs errors for corrupted story files with embedded task dictionaries
- CRITICAL: Fixed
'dict' object has no attribute 'split'error when loading corrupted story files - Corrected story file format for
refactor_board_tile_system_for_multi_modal_interactionstory - Prevented future file corruption by removing fallback that could save malformed data
0.10.0 (2025-10-23)
- Major terminology update for clarity and industry alignment
- workflow: approve_task no longer handles TODO → IN_PROGRESS transitions. Use start_task for Gate 1 instead. The approve_current_task() service function still delegates for backward compatibility.
- acceptance criteria in Story (87883e8)
- add CI/CD pipeline, test isolation, and code quality tools (d6ec879)
- align it with the rewrtitten task-centric workflow defined in .cursor/rules/project-management.mdc (8a3665e)
- assisted planning workflow - introduction (e5e3362)
- basic telemetry for key flows: Implemented env-gated counters/timers with sampling; instrumented approve_task and submit_for_review; documented telemetry env vars. (3d42e80)
- cli: Improve tool-layer error handling (409a94c)
- cli: Improve tool-layer error handling (54af7d7)
- cli: Make set_current commands context-aware (f916c82)
- cli: overhaul workflow for clarity and explicit user control (36367df)
- cli: refactor command layer for clarity and predictability (9a70e4b)
- correlation: correlation IDs to mutations: middleware and propagated corr_id into plan/story/task creation logs; each request includes x-correlation-id. (cb65d2c)
- implement planning/execution workflow, agent actions (workflow_status.actions), select_or_create, guardrails, pagination, client-side changelog (9d8e63b)
- integrate task blocker checking into report service (1d6d306)
- plan create prompt (ef8325f)
- reporting: Implement scoped reports (a821719)
- simple browser to see the work items; can be switched off (f6bd822)
- structured io of approve_task and streamlined changelog (b70e298)
- structured JSON logs now emitted for critical actions (create, approve transitions) with fields like event, ids/titles, statuses, and corr_id. Works with correlation middleware for end-to-end tracing. (90cd4cc)
- tasks: Implement proactive blocker detection (4de24e5)
- triage dashboard and backlog view (16f5c0c)
- workflow: Test and refine task execution workflow (04cb2c0)
- main: add return type annotation to main() (acd4261)
- add factory=True to uvicorn.run() to suppress ASGI app factory warning (785a8b0)
- auto-init todo/plan.yaml and ensure dir on save; docs: host.docker.internal SSE url (71a508f)
- ci: ensure CI passes with professional standards (d4f842a)
- ci: fix coverage threshold and twine installation (587c7d4)
- delete_plan not only removes it from the register, but removes the files (3323835)
- enable PENDING_REVIEW → IN_PROGRESS transition for request_pr_changes (a96e1bb)
- improve status rollup to show progress accurately (153b99a)
- license: correct copyright holder to sgrade (58c1d09)
- logging: add type annotation for handlers list (f765296)
- make browse endpoint work even if todo directory does not exist (fb22899)
- missing plan status propagation logic. (d5ef716)
- mypy: fix pre-commit mypy config to use mypy.ini (ee3dc07)
- outputs: add type parameters to generic dict types (def7dd3)
- persistent error executing tool submit_for_review: An execution summary must be provided before submitting for review. (2153582)
- plan_repository: add missing ValidationError import (85d078b)
- plan_service: add type annotations to helper functions (3c7acb6)
- prompt_register: add type annotations and fix handler signature (9e9a47c)
- report_service: handle optional execution_summary properly (42b5cb4)
- resolve mypy strict type checking issues (core services) (eb27ee4)
- server/browser: add type annotations for browse_endpoint (bf832c8)
- server: add complete type annotations for app and browser (ffa4ca1)
- story_tools: add type annotations and fix completion_time check (6e02594)
- task_service: fix type issues with datetime handling (64c2cf5)
- task_tools: add type annotations and fix imports (45ea859)
- telemetry: add type annotations for kwargs and return types (9cf6fd7)
- tools: add type annotations for MCP instance parameters (f51cdae)
- update story was corrupting the list of task IDs in story.md (3326621)
- usage_resources: add type annotation for mcp_instance (e12bef0)
- workflow_prompts: add return type annotation (116bf24)
- logging: convert all logging to lazy % formatting (7ff4f3e)
- add branching strategy and branch protection guidelines (d8f3c99)
- add docs to uv config, fix budges (c3e7951)
- add guardrails to usage guiede agents (7adfc90)
- changelog: add Unreleased section for dev workflow and docs updates (9ce8fff)
- changelog: update with CI fixes and code quality improvements (5ac2961)
- documentation polish (a0a7535)
- documentation polish (96aa11f)
- env-based configuration and documented stdout vs file sink in config_reference.md (1c884c4)
- how to connect to Plan Manager from another computer and related security considerations; minor corrections (c27159d)
- modified task execution workflow; minor tweaks (450eef1)
- polished task execution workflow; removed duplications between project_workflow diagrams and usage_guide (8909b62)
- preparation to streamline project management workflow (f2ef898)
- product maturity in the readme, polished project_workflow and summarized ideas for langgraph-based next step. (fce8fbd)
- release checklist (fd10378)
- remove the quickstart guide for agents (e8fd9b5)
- structure readme links to other docs; cleanup (04c21e7)
- update release process for release-please automation (37bbc98)
- adopt PR-centric workflow terminology (047a4c0)
- workflow: split Gate 1 and Gate 2 approval tools (40398c0)
start_tasktool for Gate 1 (Pre-Execution Approval: TODO → IN_PROGRESS)merge_prconvenience tool (formerlyfinalize_task) for Gate 2 workflow
- BREAKING: Renamed
changelog_entriesfield tochangesin Task model (clearer PR-centric terminology)- Validation function:
validate_changelog_entries→validate_changes - Config variable:
REQUIRE_CHANGELOG_ENTRIES_BEFORE_DONE→REQUIRE_CHANGES_BEFORE_DONE - All error messages updated to use "changes" terminology
- Validation function:
- BREAKING: Renamed tools to match PR workflow terminology
submit_for_review→submit_prapprove_task→approve_prfinalize_task→merge_prrequest_changes→request_pr_changes- ActionType enum values updated (SUBMIT_PR, APPROVE_PR, REQUEST_PR_CHANGES)
- BREAKING: Renamed service functions to match tools
submit_for_code_review→submit_prapprove_current_task_review→approve_pr
- Updated workflow documentation to use "Gate 1" and "Gate 2" terminology consistently
- NextActions now recommend
merge_pras primary action at Gate 2 - Commit message format: removed redundant scope, now uses full task ID in Refs footer, and lowercases first letter of subject line for consistency
- Clarified tool responsibilities:
start_task(Gate 1) vsapprove_pr(Gate 2) - Status rollup logic now correctly shows stories and plans as IN_PROGRESS when work has been done but no task is currently active (e.g., when some tasks are DONE and others are TODO)
- Stories with tasks in PENDING_REVIEW now correctly show as IN_PROGRESS
- CRITICAL: Fixed
request_pr_changesworkflow - now correctly allows PENDING_REVIEW → IN_PROGRESS transition and properly persists review feedback and rework count
- GitHub Actions CI/CD pipeline with automated testing, linting, type checking, and security scanning
- Test isolation infrastructure: all tests run in temporary directories (
/tmp/pytest_plan_manager_*) - Pre-commit hooks for automated code quality checks (ruff, mypy, bandit, pytest)
- Comprehensive unit tests for validation, config, and shared utilities
- Type checking with mypy in strict mode
- Security scanning with bandit
- Dependabot configuration for automated dependency updates
- Dependency review workflow for pull requests
tests/conftest.pywith autouse fixture for complete test isolationpy.typedmarker for PEP 561 compliance- Automatic redirect from localhost:3000 to localhost:3000/browse/ for user convenience
- Test story_tools integration tests
- Codecov integration for test coverage tracking and reporting
- Documentation restructured:
docs/contributing.mdis now the single source of truth for development info README.mdsimplified to user-focused content onlyAGENTS.mdupdated to guide AI agents developing Plan Manager (vs. using it)- Expanded ruff linting rules to 30+ categories with per-file ignores
- Test suite optimized for pre-1.0 project (removed performance benchmarks)
- CI pipeline configured for branch-specific checks (full checks on main/PRs, fast unit tests on develop)
- Fixed hardcoded
'todo'paths to useTODO_DIRfrom config for proper test isolation - Docs: how to connect to Plan Manager from another computer and related security considerations
- MCP Python SDK bumped to 1.17.0
- Migrated all path operations to use
pathlib.Pathinstead ofos.pathfor modern, maintainable code - Test coverage threshold set to 40% (appropriate for pre-1.0, targets critical paths)
- Mypy CI configuration aligned with local
mypy.inisettings (disallow_subclassing_any = False)
- Test isolation: tests no longer create files in real
todo/directory - Hardcoded paths in
paths.pyandstory_service.pynow respectTODO_DIRenvironment variable - Update story was corrupting the list of task IDs in story.md
- CI test job: coverage threshold lowered from 50% to 40% to match current coverage (40.83%)
- CI build job: added dev dependencies installation to ensure twine is available for distribution checks
- CI type-check job: fixed mypy to use
mypy.iniconfig instead of--strictflag for consistency - Pre-commit mypy hook: configured to use
mypy.iniinstead of--strictfor local/CI alignment - Blind exception catching: replaced 31 instances of
except Exceptionwith specific exceptions - Logging performance: converted 28 f-string logging calls to lazy
%formatting - Code quality: fixed 189 total issues across type safety, maintainability, pathlib migration, and code quality
- LICENSE: corrected copyright holder from "Plan Manager" to "sgrade"
- Performance benchmark tests (overkill for pre-1.0 project)
- Duplicate documentation across multiple files
- Unused
__version__from__init__.py(pyproject.toml is now single source of truth)
- Comprehensive input validation and sanitization for all user inputs
- Unit test suite with 63 tests covering validation, telemetry, and domain models
- Centralized validation module with consistent error handling
- Improved telemetry logging (removed debug print statements)
- Consistent, AI-friendly docstrings.
- Polished task workflows.
- MCP Python SDK bumped to 1.16.0
- Default value for status parameter for list tools is empty list instead of None.
- Replaced broad
Exceptioncatches with specific exception types - Enhanced error messages for better user experience
- Improved exception handling in tool layers with proper categorization
- Updated telemetry to use structured logging instead of print statements
- Added input validation to prevent injection attacks
- Sanitized user inputs with length limits and character restrictions
- Enhanced validation for task steps, execution summaries, and feedback
- Simple browser to see the work items; can be switched off.
- Create a shared task ID resolution function and update the tool and service layers to use it.
- Add a local_id to the Task domain model and the TaskOut and TaskListItem schemas.
- Moved the starlette app to server directory.
- Data persistence layer has been successfully migrated to a normalized file structure: plan.yaml simplified, responsibilities shared with other files.
- Remove the quickstart guide for agents. The usage guide for agents is the single document - avoids duplications.
- Separate select current task workflow from other parts of task execution workflow.
- Fast-track path in gate 1 of task execution workflow requires agent to create steps instead of seeding placeholder steps.
- Missing plan status propagation logic.
- Make browse endpoint work even if todo directory does not exist.
- Persistent error executing tool submit_for_review: An execution summary must be provided before submitting for review.
- Triage:
- Create triage dashboard and backlog views: Defined dashboard views (P0/P1, needs‑info, by area) and documented how to access them in triage_guide.md.
- Establish triage labels and P0/P1/P2 criteria: Added performance labeling guidance (use area:performance with type:enhancement unless functional defect) and concrete P1 vs P2 examples.
- Verified triage_guide.md covers monitoring P0/P1, needs‑info, and area views.
- Set up weekly triage routine: Added weekly triage cadence and ownership details to triage_guide.md (schedule, participants, reminders, outcomes, ≤15‑min agenda).
- AGENTS.md - this file guides agents that use the Plan Manager MCP server.
- Correlation: correlation IDs to mutations: middleware and propagated corr_id into plan/story/task creation logs; each request includes x-correlation-id.
- Structure logs for critical actions: Added structured JSON logs for key actions with corr_id, aligned with the correlation middleware.
- Basic telemetry for key flows: Implemented env-gated counters/timers with sampling; insrumented approve_task and submit_for_review; documented telemetry env vars.
- Release Gating and Beta Criteria:
- Define beta gating checklist: Added docs/release_checklist.md with gates, manual QA, logging/telemetry checks, versioning/tagging, and sign‑offs; linked from contributing.md.
- Show execution summary in TaskOut and report: Expose review summaries in UI surfaces.
- Quickstart polish and cross-links: Polished Quickstart wording and added a concise cross‑link to triage_guide.md; kept detailed behavior in usage_guide_agents.md.
- Configuration reference updates: Added docs/config_reference.md with env vars, defaults, and examples (reload, logging, paths, reconnect notes). Linked from contributing and AGENTS.md.
- Unified output for task workflow functions.
- Priority type mismatch at transport vs domain; implemented boundary coercion with clear error messages and updated tool signatures to accept numeric types.
- Task status string vs enum mismatch; updated tool to coerce to Status enum.
- Minor prompt typo fixed ("Create aplan" -> "Create a plan"). Error handling improved in task tools: now raise exceptions instead of returning invalid TaskOuts.
- Assisted planning prompts registered and made context-aware (optional args, use current plan/story/task when omitted).
- FastMCP prompt catalog with dynamic registration via
register_promptsandPROMPT_SPECS. - New prompts:
create_plan(plan with title and description)create_stories(stories with title, description, acceptance_criteria)create_tasks(tasks with title, description)create_steps(PATCH-level steps suitable for changelog bullets)
- Review checklists and usage guide aligned with the documented workflow.
- Acceptance criteria in Story
- Formal way to request changes in task execution workflow
- BREAKING: Flattened MCP tool inputs to simple parameters (no nested payload objects):
- set_current_plan(plan_id?), set_current_story(story_id?), set_current_task(task_id?)
- create_plan(title, description?, priority?), create_story(title, priority?, depends_on?, description?), create_task(story_id, title, priority?, depends_on?, description?)
- get_plan(plan_id?), get_story(story_id?), get_task(story_id?, task_id?)
- update_plan(plan_id, title?, description?, priority?, status?), update_story(story_id, title?, description?, depends_on?, priority?, status?), update_task(story_id, task_id, title?, description?, depends_on?, priority?, status?)
- delete_plan(plan_id), delete_story(story_id), delete_task(story_id, task_id)
- list_plans, list_stories, list_tasks
- task_tools
- Replace usage prompts with MCP server instructions (quickstart) and resource (usage guide)
- Remove inputs schema
- Prompt examples now use valid JSON (no trailing commas; corrected keys:
descriptioninstead ofuser_story).
- Scoped Reporting: The
reportcommand now accepts an optional scope.report planprovides a high-level summary of all stories, while the defaultreportcontinues to show a detailed view of the current story. - Proactive Blocker Detection: The system now automatically updates task statuses to
BLOCKEDorTODObased on the completion of their dependencies. This logic is triggered whenever a task is marked asDONE.
- Interactive
set_currentCommands: Theset_current_plan,set_current_story, andset_current_taskcommands now list available items if called without an ID, guiding the user to make a valid selection. - Improved Error Handling: Added robust
try...exceptblocks to the tool layer (approval_tools.py,task_tools.py) to catch service-level exceptions and return user-friendly, structured error messages.
- Corrected a bug in the
approve_fast_trackservice where it failed to find stories due to incorrect ID handling. - Ensured that
approve_fast_trackuses fully-qualified task IDs when calling underlying services to prevent lookup failures.
- The
approve_tasktool now requires a fully-qualified ID (story_id:task_id) for fast-tracking to prevent ambiguity when multiple tasks share similar local IDs.
- Rename
approvetool toapprove_task - Structured input and output for the task approval tool
- Streamline
changelogfunctionality and hook it to theapprove_tasktool - Integrate the blocker-checking logic directly into the report service.
- Ensure that when a user runs report on a BLOCKED task, they will now see a clear, human-readable list of what needs to be done to unblock it.
- Remove the explain_task_blockers command, simplifying the user-facing API.
preparecommand: New command to instruct the agent to generate the implementationstepsfor a task.get_currentcommand: New command to display the current context (Plan, Story, Task IDs).- Unified Workflow Documentation: Added a new unified workflow diagram and explanation to
docs/project_workflow.mdfor improved clarity.
statuscommand renamed toreport: To better reflect its function as a rich progress summary and avoid ambiguity with theStatusproperty.- Task
implementation_planfield renamed tosteps: For clarity and to avoid confusion with thePlanwork item. - Updated
approvecommand behavior: Theapprovecommand is now more explicit for handling steps review and fast-tracking. - The
delete_plancommand now properly removes the plan's directory and all associated files.
backlogcommand: Removed in favor of more explicitlist_stories,create_story, andlist_taskscommands.select_or_create_plancommand: Removed in favor of the explicitlist_plans,create_plan, andset_current_planworkflow.workflow_statuscommand: Removed as its functionality is now better covered by thereportandget_currentcommands.
- MCP prompts for execution intent and summary, review checklist.
- Break development workflow into planning and execution; related convenience features.
- Implement planning/execution workflow, agent actions (workflow_status.actions), select_or_create, guardrails, pagination, client-side changelog
- Align it with the rewrtitten task-centric workflow defined in
.cursor/rules/project-management.mdc
- Refactor changelog tools to work with remote client.
- Workflow-aligned plan-manager: execution intent, summary, approvals.
- Enforce WorkItem ID generation.
- Basic state management for tracking current plan, story and task.
- Testing with mcp-inspector
- Tweak Dockerfile and devcontainer.json to automate dev environment setup for Python.
- Add testing with mcp-inspector.
- Unify Story/Task CRUD, reduce duplication, and tighten types.
- Structure input and output.
- Refactor list_tasks service and tool for stricter structured output.
- Refactor list_stories service and tool for structured input and output.
- Unify plan management is unified with story and task management.
- Deprecate plan archive - use unified plan management instead.
- Replace implicit imports from plan_manager.domain (init.py) with explicit imports from plan_manager.domain.models to avoid accidental re-exports, reduce surface area, and lower risk of circular imports.
- Uvicorn config: TIMEOUT_GRACEFUL_SHUTDOWN from 2 to 30 and TIMEOUT_KEEP_ALIVE from 2 to 5 to avoid "ERROR - uvicorn.error:414 - Exception in ASGI application".
- Import logging config.
- One empty line in the end of files instead of three.
plan_manager.domain.validationmodule for domain-layer dependency validation.
- Separate domain models from orchestration (services vs. data models).
- Centralize dependency validation and status transitions.
- Encapsulate file mirroring concerns.
- Enable safer plan writes and easier testing.
- Archive tools now use the repository API exclusively:
archive.delete_archived_storyperforms loads/saves viaservices.plan_repository. - Story deletion now also removes the entire story directory (
todo/<story_id>/) best-effort, with guardrails to prevent unsafe deletes. - Refine domain models:
Planvalidator defers dependency validation import to avoid cycles and keep domain layer pure. - Improve typing, docstrings, and logging consistency.
- egacy implementations related to the changed functionality.
- Outdated CLI tools.
- Replace SSE transport by Streamable HTTP.
- Refactor application configuration to follow Twelve-Factor App principles. All settings are now sourced from environment variables with sensible defaults. Command-line arguments have been removed for simplicity.
- Consolidate configuration logic has been into the
plan_manager.configmodule. - Unify the logging system: modules now use a consistent, centrally configured logger that inherits its settings from the main entrypoint.
- Logging now defaults to writing to
stdoutas an event stream, adhering to Twelve-Factor principles. File-based logging is now an opt-in feature for development.
- The
PLAN_MANAGER_ENABLE_FILE_LOGvariable is now set in.devcontainer/devcontainer.jsonto automatically enable file logging for a better development experience. - Add
logs/directory to.gitignoreto prevent log files from being committed.
- Suppress ASGI app factory warning from Uvicorn by adding
factory=Trueto theuvicorn.run()call.
- Split modules into
story_model.py,stories.py,plan.py,archive.pyfor clarity. - Explicit MCP tool registration (stories, plan, archive) from
mcp_server.py. - Clean imports, removed sys.path hacks, and fixed circular imports.
- Lint issues and missing imports; server starts cleanly with autoreload.
create_tasksupportsdetails_contentto initialize the task markdown (remote-friendly).- New unified
update_taskhandler for partial updates (title, notes, depends_on, priority, status).
- CRUD naming alignment:
get_task,create_task,update_task,delete_task. Removed legacyshow_task_handler. - Empty
status/priorityinupdate_taskare treated as “no change” to ease client calls.
- Specialize
update_task_status_handlerandupdate_task_priority_handlerin favor ofupdate_task.
- Development autoreload via
uvicorn --reloadin dev workflow. - CLI flags for reload directories, include/exclude patterns, and timeouts.
- Env flag
PLAN_MANAGER_ENABLE_FILE_LOGto disable file logging in dev.
- Documentation updated for SSE-only configuration and Cursor SSE setup.
- Faster, more predictable shutdown on reload even with long-lived SSE connections open.
- Initial release of Plan Manager.
- MCP server implementation for AI assistant integration.
- Task management with YAML-based storage (
todo/plan.yaml). - Dependency tracking and topological sorting.
- Priority-based task ordering (0-5 scale).
- Task status management (TODO, IN_PROGRESS, DONE, BLOCKED, DEFERRED).
- Archive functionality for completed tasks.
- CLI tools for direct task management:
list_tasks.py- List and filter tasks.show_task.py- Display task details.update_task_status.py- Update task status.
- Comprehensive logging system.
- Pydantic-based data validation.
- SSE transport support for MCP communication.
- Development container configuration.
- Comprehensive documentation and setup instructions.
- Task Management: Create, read, update, delete operations.
- Dependency Management: Define task dependencies with cycle detection.
- Priority System: 6-level priority system (0=highest, 5=lowest, null=no priority).
- Status Tracking: Five status types with validation.
- Archive System: Move completed tasks to archive with detail preservation.
- AI Integration: Full MCP server implementation for AI assistants.
- Data Validation: Robust schema validation using Pydantic models.
- Logging: Comprehensive logging to both files and stderr.
- CLI Interface: Direct command-line access to all functionality.
- Python 3.11+ required.
- Built with FastMCP, Starlette, and Uvicorn.
- YAML-based data storage with backup/archive support.
- Type hints throughout codebase.
- Comprehensive error handling and validation.