Skip to content

Release v0.6.11: route non-MCP remote tasklist providers correctly#98

Merged
wittekin merged 1 commit into
mainfrom
release/v0.6.11
Apr 26, 2026
Merged

Release v0.6.11: route non-MCP remote tasklist providers correctly#98
wittekin merged 1 commit into
mainfrom
release/v0.6.11

Conversation

@wittekin
Copy link
Copy Markdown
Owner

Summary

Fixes three orchestrator code paths that special-cased MCPTasklistProvider and silently fell through to local-file behavior for every other provider — broke the beads backend introduced in v0.6.10 (and would break any future non-MCP remote provider). Also fixes a docstring/config mismatch in beads.py.

Bugs fixed

  • has_remaining_tasks() ignored non-MCP providers (orchestrator.py ~L845). With beads, millstone reported NO MORE TASKS even when bd ready showed open issues.
  • Preflight required a local stub .millstone/tasklist.md for non-MCP providers (orchestrator.py ~L1573). Beads users had to touch a stub file.
  • Task selection routed through the local file (or the unfiltered list_tasks() fallback) (orchestrator.py ~L3905, L3963). Result: builder got blocked tasks; reviewer halted with TASK_IMPOSSIBLE. Now prefers provider.list_ready_tasks() when the provider implements ReadyAwareTasklistProvider (beads); falls back to status-filtered list_tasks() for MCP/legacy.
  • Beads docstring config example showed [millstone] table (beads.py) but load_config() only reads top-level keys — the previous example was silently ignored. Updated to flat top-level form.

The fixes invert the dispatch: FileTasklistProvider is the only special case, every other provider is routed to its own methods.

New tests

tests/unit/test_remote_provider_routing.py — 6 regression tests covering all three bugs and the protocol wiring.

Verification

  • Repro from the bug report: millstone --max-tasks 1 --dry-run now succeeds against a beads-only repo with no stub file.
  • Full suite: 2125 passed, 2 skipped (was 2119 + 6 new regressions).
  • ruff check, ruff format, mypy, vulture, pre-commit local CI subset all green.

Test plan

  • Bug 1 regression test (has_remaining_tasks queries provider for beads)
  • Bug 2 regression test (selection uses list_ready_tasks to skip blocked)
  • Bug 3 regression test (preflight does not require local file for beads)
  • File-provider preserved (still requires local tasklist)
  • Full suite passes
  • Lint / format / type / vulture clean
  • CI green on this PR

🤖 Generated with Claude Code

Three orchestrator code paths special-cased MCPTasklistProvider and silently
fell through to the local-file path for every other provider, breaking the
beads backend (added in v0.6.10) and any future non-MCP remote provider.

Fixes:
- has_remaining_tasks() now queries any non-file provider directly instead of
  reading the local tasklist file. Beads users no longer see "NO MORE TASKS"
  while bd ready shows open work.
- preflight_checks() no longer requires .millstone/tasklist.md for remote
  backends. Only FileTasklistProvider needs the local file.
- Task selection prefers provider.list_ready_tasks() when the provider
  implements ReadyAwareTasklistProvider (beads), so blocked tasks are skipped
  instead of being shipped to the builder and bouncing as TASK_IMPOSSIBLE.

Also: corrected the BeadsTasklistProvider / BeadsOpportunityProvider docstring
config example to show flat top-level TOML keys (load_config() reads the top
level only — the previous [millstone] table example was silently ignored).

Adds tests/unit/test_remote_provider_routing.py with 6 regression tests.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@codecov-commenter
Copy link
Copy Markdown

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

❌ Patch coverage is 82.60870% with 4 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/millstone/runtime/orchestrator.py 82.60% 2 Missing and 2 partials ⚠️

📢 Thoughts on this report? Let us know!

@wittekin wittekin merged commit 9f0d0a6 into main Apr 26, 2026
16 checks passed
@wittekin wittekin deleted the release/v0.6.11 branch April 26, 2026 23:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants