From harness-claude
Scores and recommends the next highest-impact unblocked roadmap item, then assigns it and transitions to the appropriate next skill.
How this skill is triggered — by the user, by Claude, or both
Slash command
/harness-claude:harness-roadmap-pilotThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> AI-assisted selection of the next highest-impact unblocked roadmap item. Scores candidates, recommends one, assigns it, and transitions to the appropriate next skill.
AI-assisted selection of the next highest-impact unblocked roadmap item. Scores candidates, recommends one, assigns it, and transitions to the appropriate next skill.
Never assign or transition without the human confirming the recommendation first.
Present the ranked candidates, the AI reasoning, and the recommended pick. Wait for explicit confirmation before making any changes.
loadProjectRoadmapMode(projectRoot) from @harness-engineering/core.
file-backed mode (default): check that docs/roadmap.md exists. If missing, error. "No roadmap found at docs/roadmap.md. Run harness-roadmap --create first."file-less mode: docs/roadmap.md is intentionally absent. Synthesize the roadmap from the tracker:
a. loadTrackerClientConfigFromProject(projectRoot) -> createTrackerClient(config) to obtain a RoadmapTrackerClient.
b. client.fetchAll() -> map each TrackedFeature into a RoadmapFeature and group by milestone (or use a single synthetic milestone if the tracker has no milestone field).
c. If the tracker call fails, surface the error verbatim; do not fall back to a file-backed branch.parseRoadmap from @harness-engineering/core. (File-less mode produces the in-memory roadmap directly from step 1.)--user argument if providedgit config user.name or git config user.emailscoreRoadmapCandidatesForMode(roadmap, { currentUser }, config) from @harness-engineering/core (FR-S3). This is the mode-aware wrapper: in file-backed mode it delegates to scoreRoadmapCandidates unchanged; in file-less mode it routes through scoreRoadmapCandidatesFileLess for the D4 priority+createdAt ordering. Always passing through this wrapper keeps the skill mode-agnostic.Present the top 5 candidates:
ROADMAP PILOT -- Candidate Scoring
Top candidates (scored by position 50%, dependents 30%, affinity 20%):
# Feature Milestone Priority Score Breakdown
1. Feature A MVP Release P0 0.85 pos:0.9 dep:0.8 aff:1.0
2. Feature B MVP Release P1 0.72 pos:0.8 dep:0.6 aff:0.5
3. Feature C Q2 Release -- 0.65 pos:0.7 dep:0.5 aff:0.0
4. Feature D Backlog -- 0.40 pos:0.3 dep:0.4 aff:0.0
5. Feature E Backlog -- 0.35 pos:0.2 dep:0.3 aff:0.0
1a. Read STRATEGY.md if present at repo root (strategy-alignment input). Use a Node one-liner that calls validateStrategy from @harness-engineering/core, then (when valid) parseStrategyDoc + asStrategyDoc:
node -e "import('@harness-engineering/core').then(async m => {
const v = await m.validateStrategy(process.cwd());
if (!v.present || !v.valid) { console.log(JSON.stringify({ grounded: false })); return; }
const raw = require('fs').readFileSync('STRATEGY.md', 'utf-8');
console.log(JSON.stringify({ grounded: true, doc: m.asStrategyDoc(m.parseStrategyDoc(raw)) }));
})"
When grounded: true, capture the Target problem, Our approach, and Tracks section bodies. For each top-3 candidate, compute a strategy-alignment score:
+0.5 if the candidate's feature name or spec keywords plausibly advance one of the Tracks (case-insensitive substring or paraphrase match)+0.25 if the candidate's spec Overview cites the Target problem or Our approach verbatim or near-verbatim0 otherwiseThe alignment score is a tiebreaker bonus, NEVER a hard filter:
≤ 0.05 (items score similarly on position × 0.5 + dependents × 0.3 + affinity × 0.2).STRATEGY.md is absent or invalid, skip this step silently; the recommendation proceeds without a strategy tiebreaker.1b. Read the most recent pulse report (if any):
docs/pulse-reports/ and filter to those matching the
regex /^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}\.md$/ (the canonical
YYYY-MM-DD_HH-MM.md pulse-report filename shape). Filtering before
sorting prevents non-conforming files (e.g. README.md, NOTES.md,
partial-timestamp drafts) from corrupting the signal.RECOMMENDATION
I recommend Feature A (MVP Release, P0, score: 0.85).
Reasoning:
- Highest priority (P0) with strong positional signal (first in MVP milestone)
- Unblocks 2 downstream features (Feature X, Feature Y)
- You completed its blocker "Foundation" -- high context affinity
- Spec exists with clear success criteria (12 acceptance tests)
- Estimated effort: medium (8 tasks in the plan)
Alternative: Feature B (P1, score: 0.72) -- consider if Feature A's scope is too large for the current time window.
Proceed with Feature A? (y/n/pick another)
Ask the human in plain text (matching the y/n/pick another example above). Do not elevate this confirmation to an AskUserQuestion tool call — candidate labels and natural header choices ("Pick candidate", etc.) exceed its 12-char header cap and the prompt is rejected as ERR.
Call manage_roadmap with action update to assign the feature:
manage_roadmap({
path: "<project-root>",
action: "update",
feature: "<feature-name>",
assignee: "<currentUser>"
})
Assignee field with assignment history trackingharness.config.jsonDetermine the transition target:
spec field (non-null): transition to harness:autopilotspec: transition to harness:brainstormingPresent the transition to the human via emit_interaction:
emit_interaction({
path: "<project-root>",
type: "transition",
transition: {
completedPhase: "roadmap-pilot",
suggestedNext: "<brainstorming|autopilot>",
reason: "Feature '<name>' assigned and ready for <brainstorming|execution>",
artifacts: ["docs/roadmap.md"],
requiresConfirmation: true,
summary: "Assigned '<name>' to <user>. <Spec exists -- ready for autopilot|No spec -- needs brainstorming first>.",
qualityGate: {
checks: [
{ "name": "roadmap-parsed", "passed": true },
{ "name": "candidate-scored", "passed": true },
{ "name": "human-confirmed", "passed": true },
{ "name": "assignment-written", "passed": true }
],
allPassed: true
}
}
})
Run harness validate.
parseRoadmap / serializeRoadmap -- Parse and write docs/roadmap.md (file-backed mode only). Import from @harness-engineering/core.loadProjectRoadmapMode / loadTrackerClientConfigFromProject / createTrackerClient -- Resolve roadmap.mode and obtain a RoadmapTrackerClient for file-less mode. Import from @harness-engineering/core.scoreRoadmapCandidatesForMode -- Mode-aware scoring entry point. Import from @harness-engineering/core. In file-backed mode delegates to scoreRoadmapCandidates; in file-less mode routes through scoreRoadmapCandidatesFileLess (priority + createdAt sort, FR-S3).scoreRoadmapCandidates -- Underlying file-backed scoring algorithm. Prefer scoreRoadmapCandidatesForMode from the skill; direct callers in file-backed-only code paths can still use this.manage_roadmap update -- Used for assignment. Supports assignee field which delegates to assignFeature internally, handles history tracking, and automatically triggers external sync (GitHub Issues). In file-less mode, manage_roadmap dispatches through the tracker; the skill flow is unchanged.emit_interaction -- Used for the skill transition at the end. Transitions to harness:brainstorming (no spec) or harness:autopilot (spec exists).STRATEGY.md alignment (Phase 2 step 1a) -- When present at repo root and valid, loaded via validateStrategy + parseStrategyDoc + asStrategyDoc from @harness-engineering/core. Applied as a bounded tiebreaker bonus (max +0.75) only when candidates score within 0.05 on the base formula. Boundary: roadmap-pilot READS; harness-strategy WRITES. Never modify STRATEGY.md from this skill.harness validate -- Run after assignment is written.STRATEGY.md is present and valid AND two candidates score within 0.05 on the base formula, the recommendation rationale cites strategy-alignment as the tiebreaker. The bonus never overrides a meaningful base-score difference.STRATEGY.md is absent or invalid, the skill completes without error and no strategy-alignment rationale appears in the output.harness validate passes after all changes| Rationalization | Reality |
|---|---|
| "The top-scored candidate is obviously correct, so I can assign it without asking the human" | The Iron Law: never assign or transition without the human confirming the recommendation first. |
| "Affinity data is not available so the scoring is degraded -- I should just pick the first planned item" | Proceed without affinity scoring by zeroing out the affinity weight. Position and dependents signals still produce meaningful rankings. |
| "The feature has no spec, but I can skip brainstorming and jump straight to planning since the summary is clear enough" | No spec routes to brainstorming, spec exists routes to autopilot. A one-line roadmap summary is not a spec. |
| "STRATEGY.md exists, so I should let it override the top-scored candidate when alignment is clear" | The alignment bonus is bounded (max +0.75) and only fires when base scores are within 0.05. It is a tiebreaker, not a hard filter — a clearly higher-scored item still wins. |
Context: A roadmap with 3 milestones, 8 features. 2 are in-progress, 1 is done, 2 are blocked, 3 are planned/backlog and unblocked. User is @cwarner who completed "Core Library Design".
Phase 1: SCAN
ROADMAP PILOT -- Candidate Scoring
Top candidates:
# Feature Milestone Priority Score Breakdown
1. Graph Connector MVP Release P2 0.78 pos:0.8 dep:0.6 aff:1.0
2. Performance Baselines Q3 Hardening -- 0.45 pos:0.5 dep:0.3 aff:0.0
3. Push Notifications Backlog -- 0.30 pos:0.2 dep:0.2 aff:0.5
Phase 2: RECOMMEND
I recommend Graph Connector (MVP Release, P2, score: 0.78).
Reasoning:
- Only prioritized item among candidates (P2)
- You completed its blocker "Core Library Design" -- maximum affinity bonus
- Unblocks "API Integration" downstream
- Spec exists at docs/changes/graph-connector/proposal.md
Proceed? (y/n/pick another)
Human confirms y.
Phase 4: ASSIGN
manage_roadmap update: Graph Connector assignee -> @cwarner
History: +1 record (assigned, 2026-04-02)
Roadmap updated: docs/roadmap.md
External sync: github:harness-eng/harness#43 assigned (automatic)
Transitioning to harness:autopilot (spec exists)...
docs/roadmap.md does not exist or fails to parse, stop with an error.harness-roadmap --add.harness-roadmap --sync.npx claudepluginhub intense-visions/harness-engineering --plugin harness-claudeUpdates, creates, or reprioritizes product roadmaps using project trackers or user input. Adds items, changes statuses, applies RICE/MoSCoW/ICE prioritization, shifts timelines.
Add prioritized items to a project roadmap with codebase review and duplication check. Use when planning product direction.
Builds a product roadmap from strategy, objectives, and connector data. Supports Shape Up, Scrum, and NOW/NEXT/LATER methodologies.