skills/autopilot-roadmap/SKILL.md
Execute roadmap items iteratively with policy-aware vendor routing and learning feedback
npx skillsauth add jankneumann/agentic-coding-tools autopilot-roadmapInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Execute roadmap items iteratively with policy-aware vendor routing and adaptive reprioritization. Manages the full lifecycle of each roadmap item from planning through completion, writing learning entries and adjusting priorities based on accumulated experience.
<workspace-path> - Path to a roadmap workspace directory containing roadmap.yaml (produced by /plan-roadmap).
Optional flags:
--repo-root <path> - Repository root for schema validation (defaults to auto-detect)--dry-run - Report what would be executed without making changesroadmap.yaml (from /plan-roadmap)skills/roadmap-runtime/scripts/ (models, checkpoint, learning, context)/implement-feature invocationautopilot-roadmap writes checkpoint, roadmap status, learning entries, and may
invoke implementation/validation skills for roadmap items. In local CLI
execution, every mutating run MUST start from a managed worktree unless
--dry-run is set.
Before loading or updating the roadmap workspace, run:
CHANGE_ID="roadmap-<workspace-name>"
eval "$(python3 "<skill-base-dir>/../worktree/scripts/worktree.py" setup "$CHANGE_ID")"
cd "$WORKTREE_PATH"
skills/.venv/bin/python skills/shared/checkout_policy.py require-mutation
--dry-run remains read-only and may run from the shared checkout.
A roadmap workspace path containing:
roadmap.yaml - The roadmap with items, dependencies, policy, and statuscheckpoint.json (optional) - Existing execution state for resumelearnings/ (optional) - Previously written learning entriesfrom orchestrator import execute_roadmap
result = execute_roadmap(workspace=Path(workspace_path), repo_root=Path(repo_root))
If checkpoint.json exists, the orchestrator resumes from the saved position, skipping already-completed items. Otherwise, it creates a fresh checkpoint targeting the first ready item.
The orchestrator queries roadmap.ready_items() to find items whose dependencies are all completed and whose status is approved. Items are processed in priority order (lower number = higher priority).
For each ready item, the SKILL.md prompt layer invokes the existing skill workflow. The orchestrator provides a dispatch_fn callback interface:
result = execute_roadmap(
workspace=workspace,
repo_root=repo_root,
dispatch_fn=my_dispatch, # Called for each item needing implementation
)
The dispatch_fn receives (item_id, phase, context) and returns an outcome string. The SKILL.md layer implements this by invoking /implement-feature, /validate-feature, etc.
On item completion:
skills/roadmap-runtime/scripts/learning.pyreplanner.replan()) to adjust pending itemsOn item failure:
CheckpointManager.fail_item()When a vendor hits rate limits or budget constraints:
policy.py) evaluates the roadmap's policy configurationwait_if_budget_exceeded (wait for limit reset) and switch_if_time_saved (try alternate vendor)max_switch_attempts_per_item guardThe orchestrator continues until:
completed)blocked_all)blocked_all)The execute_roadmap() function returns a summary dict:
{
"completed_count": 3,
"failed_count": 1,
"blocked_count": 2,
"skipped_count": 0,
"status": "completed" | "blocked_all" | "partial",
"policy_decisions": [...]
}
Workspace artifacts updated:
checkpoint.json - Final execution stateroadmap.yaml - Updated item statuseslearnings/<item-id>.md - Per-item learning entrieslearning-log.md - Index of all learning entriesAll data model operations use the shared runtime at skills/roadmap-runtime/scripts/:
models.py - Roadmap, Checkpoint, LearningEntry dataclassescheckpoint.py - CheckpointManager for save/restore/advancelearning.py - Learning entry write/read/compactcontext.py - Bounded context assemblyAutopilot-roadmap must not make direct LLM API calls. All reasoning happens in one of two places:
dispatch_fn callback. orchestrator.execute_roadmap() hands (item_id, phase, context) tuples to the callback; the agent runs /implement-feature / /validate-feature / friends in response. The host agent is the LLM runtime; no external API key is required.replanner.replan() (regex text matching over learning entries), policy.evaluate_policy() (arithmetic/rule-based vendor decisions).Any future work that needs semantic reasoning must be expressed as either (a) a new callback delegated to the host agent, or (b) a new dispatch phase routed through /implement-feature. Reaching for llm_client.py or an SDK like anthropic / openai / google.generativeai inside skills/autopilot-roadmap/scripts/ is out of bounds and enforced by a guard test (skills/tests/autopilot-roadmap/test_host_assisted_invariant.py).
The same principle applies to skills/autopilot/scripts/. The invariant exists because autopilot is typically invoked from a Claude Code session that already has a paid-for model loaded; routing reasoning through a second external API would double-bill and fragment the session's context.
The one intentional exception elsewhere in the codebase is skills/parallel-infrastructure/scripts/review_dispatcher.py (used by parallel-review-plan and parallel-review-implementation), where vendor diversity is the feature — multi-vendor review requires calling different models to get independent findings. That's not host-assistable by construction.
After roadmap execution completes:
/cleanup-feature <change-id>
development
Open the artifacts relevant to a review (OpenSpec proposal, branch changes, or explicit paths) in VS Code, in a curated read-order, in the right worktree.
tools
Render and seed coordinator-owned task status block in OpenSpec tasks.md
testing
User-invocable skill that omits the tail block
tools
Missing several required keys