@harness-engineering/cli 1.16.0 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/skills/claude-code/harness-roadmap-pilot/SKILL.md +204 -0
- package/dist/agents/skills/claude-code/harness-roadmap-pilot/skill.yaml +52 -0
- package/dist/agents/skills/codex/harness-roadmap-pilot/SKILL.md +204 -0
- package/dist/agents/skills/codex/harness-roadmap-pilot/skill.yaml +52 -0
- package/dist/agents/skills/cursor/harness-roadmap-pilot/SKILL.md +204 -0
- package/dist/agents/skills/cursor/harness-roadmap-pilot/skill.yaml +52 -0
- package/dist/agents/skills/gemini-cli/harness-roadmap-pilot/SKILL.md +204 -0
- package/dist/agents/skills/gemini-cli/harness-roadmap-pilot/skill.yaml +52 -0
- package/dist/agents/skills/package.json +5 -5
- package/dist/{agents-md-VYDFPIRW.js → agents-md-DUYNKHJZ.js} +1 -1
- package/dist/{architecture-K5HSRBGB.js → architecture-UBO5KKUV.js} +2 -2
- package/dist/bin/harness-mcp.js +12 -12
- package/dist/bin/harness.js +15 -15
- package/dist/{check-phase-gate-5AS6SXL6.js → check-phase-gate-OSHN2AEL.js} +3 -3
- package/dist/{chunk-JOP2NDNB.js → chunk-2DMIQ35P.js} +151 -79
- package/dist/{chunk-TF6ZLHJV.js → chunk-5FM64G6D.js} +2 -2
- package/dist/{chunk-5ZXHMCPL.js → chunk-ABQUCXRE.js} +2 -1
- package/dist/{chunk-AV6KMDO5.js → chunk-APNPXLB2.js} +4 -4
- package/dist/{chunk-FTMXDOR6.js → chunk-CZZXE6BL.js} +1 -1
- package/dist/{chunk-SFRGPAK6.js → chunk-GWXP3JVA.js} +3 -3
- package/dist/{chunk-SHYWICGA.js → chunk-OA3MOZGG.js} +22 -22
- package/dist/{chunk-RWZPHW4H.js → chunk-OHZVGIPE.js} +9 -9
- package/dist/{chunk-C7DTKLPW.js → chunk-QSRRBNLY.js} +8 -8
- package/dist/{chunk-QDF7COPQ.js → chunk-TG7IUJ3J.js} +1 -1
- package/dist/{chunk-DNDBFIZN.js → chunk-TZIHFNEG.js} +7 -7
- package/dist/{chunk-ZJMU7MEV.js → chunk-UX3JHYEA.js} +1 -1
- package/dist/{chunk-ALFKNAZW.js → chunk-VF23UTNB.js} +545 -36
- package/dist/{chunk-7MJAPE3Z.js → chunk-YLN34N65.js} +1 -0
- package/dist/{chunk-OCDDCGDE.js → chunk-ZA2I7S3E.js} +20 -1
- package/dist/{ci-workflow-CRWU723U.js → ci-workflow-FJZMNZPT.js} +1 -1
- package/dist/{dist-4LPXJYVZ.js → dist-MF5BK5AD.js} +19 -1
- package/dist/{dist-B26DFXMP.js → dist-U7EAO6T2.js} +110 -60
- package/dist/{docs-4JRHTLUZ.js → docs-WZHW4N4P.js} +3 -3
- package/dist/{engine-3G3VIM6L.js → engine-VS6ZJ2VZ.js} +2 -2
- package/dist/{entropy-G6CZ2A6P.js → entropy-FCIGJIIT.js} +2 -2
- package/dist/{feedback-QYKQ65HB.js → feedback-O3FYTZIE.js} +1 -1
- package/dist/{generate-agent-definitions-SAAOAPT4.js → generate-agent-definitions-EYG263XD.js} +1 -1
- package/dist/{graph-loader-2M2HXDQI.js → graph-loader-KMHDQYDT.js} +1 -1
- package/dist/index.d.ts +62 -3
- package/dist/index.js +15 -15
- package/dist/{loader-VCOK3PF7.js → loader-B4XWX4K6.js} +1 -1
- package/dist/{mcp-YENEPHBW.js → mcp-DVVUODN7.js} +12 -12
- package/dist/{performance-UBCFI2UP.js → performance-NMJDV6HF.js} +3 -3
- package/dist/{review-pipeline-IQAVCWAX.js → review-pipeline-MSEJWTKM.js} +1 -1
- package/dist/{runtime-PYFFIESU.js → runtime-YHVLJNPG.js} +1 -1
- package/dist/{security-ZDADTPYW.js → security-HTDKKGMX.js} +1 -1
- package/dist/{validate-VRTUHALQ.js → validate-SPSTH2YW.js} +2 -2
- package/dist/{validate-cross-check-4Y6NHNK3.js → validate-cross-check-YTDWIMFI.js} +1 -1
- package/package.json +20 -21
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
# Harness Roadmap Pilot
|
|
2
|
+
|
|
3
|
+
> AI-assisted selection of the next highest-impact unblocked roadmap item. Scores candidates, recommends one, assigns it, and transitions to the appropriate next skill.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
- When the team or individual needs to pick the next item to work on from the roadmap
|
|
8
|
+
- When there are multiple unblocked items and prioritization guidance is needed
|
|
9
|
+
- After completing a feature and looking for the next highest-impact work
|
|
10
|
+
- NOT when the roadmap does not exist (direct user to harness-roadmap --create)
|
|
11
|
+
- NOT when the user already knows what to work on (use harness-brainstorming or harness-autopilot directly)
|
|
12
|
+
|
|
13
|
+
## Process
|
|
14
|
+
|
|
15
|
+
### Iron Law
|
|
16
|
+
|
|
17
|
+
**Never assign or transition without the human confirming the recommendation first.**
|
|
18
|
+
|
|
19
|
+
Present the ranked candidates, the AI reasoning, and the recommended pick. Wait for explicit confirmation before making any changes.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
### Phase 1: SCAN -- Score Candidates
|
|
24
|
+
|
|
25
|
+
1. Check if `docs/roadmap.md` exists.
|
|
26
|
+
- If missing: error. "No roadmap found at docs/roadmap.md. Run harness-roadmap --create first."
|
|
27
|
+
2. Parse the roadmap using `parseRoadmap` from `@harness-engineering/core`.
|
|
28
|
+
3. Determine the current user:
|
|
29
|
+
- Use the `--user` argument if provided
|
|
30
|
+
- Otherwise, attempt to detect from git config: `git config user.name` or `git config user.email`
|
|
31
|
+
- If neither available, proceed without affinity scoring
|
|
32
|
+
4. Call `scoreRoadmapCandidates(roadmap, { currentUser })` from `@harness-engineering/core`.
|
|
33
|
+
5. If no candidates: inform the human. "No unblocked planned or backlog items found. All items are either in-progress, done, blocked, or the roadmap is empty."
|
|
34
|
+
|
|
35
|
+
Present the top 5 candidates:
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
ROADMAP PILOT -- Candidate Scoring
|
|
39
|
+
|
|
40
|
+
Top candidates (scored by position 50%, dependents 30%, affinity 20%):
|
|
41
|
+
|
|
42
|
+
# Feature Milestone Priority Score Breakdown
|
|
43
|
+
1. Feature A MVP Release P0 0.85 pos:0.9 dep:0.8 aff:1.0
|
|
44
|
+
2. Feature B MVP Release P1 0.72 pos:0.8 dep:0.6 aff:0.5
|
|
45
|
+
3. Feature C Q2 Release -- 0.65 pos:0.7 dep:0.5 aff:0.0
|
|
46
|
+
4. Feature D Backlog -- 0.40 pos:0.3 dep:0.4 aff:0.0
|
|
47
|
+
5. Feature E Backlog -- 0.35 pos:0.2 dep:0.3 aff:0.0
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Phase 2: RECOMMEND -- AI-Assisted Analysis
|
|
51
|
+
|
|
52
|
+
1. For the top 3 candidates, read their spec files (if they exist):
|
|
53
|
+
- Read the spec's Overview and Goals section
|
|
54
|
+
- Read the spec's Success Criteria section
|
|
55
|
+
- Assess effort and impact from the spec content
|
|
56
|
+
|
|
57
|
+
2. Provide a recommendation with reasoning:
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
RECOMMENDATION
|
|
61
|
+
|
|
62
|
+
I recommend Feature A (MVP Release, P0, score: 0.85).
|
|
63
|
+
|
|
64
|
+
Reasoning:
|
|
65
|
+
- Highest priority (P0) with strong positional signal (first in MVP milestone)
|
|
66
|
+
- Unblocks 2 downstream features (Feature X, Feature Y)
|
|
67
|
+
- You completed its blocker "Foundation" -- high context affinity
|
|
68
|
+
- Spec exists with clear success criteria (12 acceptance tests)
|
|
69
|
+
- Estimated effort: medium (8 tasks in the plan)
|
|
70
|
+
|
|
71
|
+
Alternative: Feature B (P1, score: 0.72) -- consider if Feature A's scope is too large for the current time window.
|
|
72
|
+
|
|
73
|
+
Proceed with Feature A? (y/n/pick another)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Phase 3: CONFIRM -- Human Decision
|
|
77
|
+
|
|
78
|
+
1. Wait for human confirmation.
|
|
79
|
+
- If **yes**: proceed to Phase 4.
|
|
80
|
+
- If **pick another**: ask which candidate number, then proceed with that pick.
|
|
81
|
+
- If **no**: stop. No changes made.
|
|
82
|
+
|
|
83
|
+
### Phase 4: ASSIGN -- Execute Assignment and Transition
|
|
84
|
+
|
|
85
|
+
1. Call `assignFeature(roadmap, feature, currentUser, todayDate)` from `@harness-engineering/core`.
|
|
86
|
+
- This updates the feature's `Assignee` field
|
|
87
|
+
- Appends `assigned` record to assignment history (and `unassigned` for previous assignee if reassignment)
|
|
88
|
+
|
|
89
|
+
2. Serialize and write the updated roadmap to `docs/roadmap.md`.
|
|
90
|
+
|
|
91
|
+
3. If tracker config exists in `harness.config.json`, sync the assignment:
|
|
92
|
+
- Call the external tracker's `assignTicket` to push the assignment
|
|
93
|
+
- Log result but do not block on failure
|
|
94
|
+
|
|
95
|
+
4. Determine the transition target:
|
|
96
|
+
- If the feature has a `spec` field (non-null): transition to `harness:autopilot`
|
|
97
|
+
- If the feature has no `spec`: transition to `harness:brainstorming`
|
|
98
|
+
|
|
99
|
+
5. Present the transition to the human via `emit_interaction`:
|
|
100
|
+
|
|
101
|
+
```json
|
|
102
|
+
emit_interaction({
|
|
103
|
+
path: "<project-root>",
|
|
104
|
+
type: "transition",
|
|
105
|
+
transition: {
|
|
106
|
+
completedPhase: "roadmap-pilot",
|
|
107
|
+
suggestedNext: "<brainstorming|autopilot>",
|
|
108
|
+
reason: "Feature '<name>' assigned and ready for <brainstorming|execution>",
|
|
109
|
+
artifacts: ["docs/roadmap.md"],
|
|
110
|
+
requiresConfirmation: true,
|
|
111
|
+
summary: "Assigned '<name>' to <user>. <Spec exists -- ready for autopilot|No spec -- needs brainstorming first>.",
|
|
112
|
+
qualityGate: {
|
|
113
|
+
checks: [
|
|
114
|
+
{ "name": "roadmap-parsed", "passed": true },
|
|
115
|
+
{ "name": "candidate-scored", "passed": true },
|
|
116
|
+
{ "name": "human-confirmed", "passed": true },
|
|
117
|
+
{ "name": "assignment-written", "passed": true }
|
|
118
|
+
],
|
|
119
|
+
allPassed: true
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
})
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
6. Run `harness validate`.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Harness Integration
|
|
130
|
+
|
|
131
|
+
- **`parseRoadmap` / `serializeRoadmap`** -- Parse and write `docs/roadmap.md`. Import from `@harness-engineering/core`.
|
|
132
|
+
- **`scoreRoadmapCandidates`** -- Core scoring algorithm. Import from `@harness-engineering/core`. Takes a `Roadmap` and optional `PilotScoringOptions` (currentUser for affinity).
|
|
133
|
+
- **`assignFeature`** -- Assignment with history tracking. Import from `@harness-engineering/core`. Handles new assignment and reassignment (unassigned + assigned records).
|
|
134
|
+
- **`emit_interaction`** -- Used for the skill transition at the end. Transitions to `harness:brainstorming` (no spec) or `harness:autopilot` (spec exists).
|
|
135
|
+
- **`harness validate`** -- Run after assignment is written.
|
|
136
|
+
- **External sync** -- If `harness.config.json` has tracker config, use `fullSync` or direct `assignTicket` to push assignment to external service.
|
|
137
|
+
|
|
138
|
+
## Success Criteria
|
|
139
|
+
|
|
140
|
+
1. Roadmap is parsed and unblocked planned/backlog items are scored
|
|
141
|
+
2. Scoring uses two-tier sort: explicit priority first, then weighted score
|
|
142
|
+
3. AI reads top candidates' specs and provides recommendation with reasoning
|
|
143
|
+
4. Human confirms before any changes are made
|
|
144
|
+
5. Assignment updates feature field, appends history records, and syncs externally
|
|
145
|
+
6. Reassignment produces two history records (unassigned + assigned)
|
|
146
|
+
7. Transition routes to brainstorming (no spec) or autopilot (spec exists)
|
|
147
|
+
8. `harness validate` passes after all changes
|
|
148
|
+
|
|
149
|
+
## Examples
|
|
150
|
+
|
|
151
|
+
### Example: Pick Next Item from a Multi-Milestone Roadmap
|
|
152
|
+
|
|
153
|
+
**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".
|
|
154
|
+
|
|
155
|
+
**Phase 1: SCAN**
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
ROADMAP PILOT -- Candidate Scoring
|
|
159
|
+
|
|
160
|
+
Top candidates:
|
|
161
|
+
# Feature Milestone Priority Score Breakdown
|
|
162
|
+
1. Graph Connector MVP Release P2 0.78 pos:0.8 dep:0.6 aff:1.0
|
|
163
|
+
2. Performance Baselines Q3 Hardening -- 0.45 pos:0.5 dep:0.3 aff:0.0
|
|
164
|
+
3. Push Notifications Backlog -- 0.30 pos:0.2 dep:0.2 aff:0.5
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**Phase 2: RECOMMEND**
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
I recommend Graph Connector (MVP Release, P2, score: 0.78).
|
|
171
|
+
|
|
172
|
+
Reasoning:
|
|
173
|
+
- Only prioritized item among candidates (P2)
|
|
174
|
+
- You completed its blocker "Core Library Design" -- maximum affinity bonus
|
|
175
|
+
- Unblocks "API Integration" downstream
|
|
176
|
+
- Spec exists at docs/changes/graph-connector/proposal.md
|
|
177
|
+
|
|
178
|
+
Proceed? (y/n/pick another)
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Human confirms **y**.
|
|
182
|
+
|
|
183
|
+
**Phase 4: ASSIGN**
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
Assigned: Graph Connector -> @cwarner
|
|
187
|
+
History: +1 record (assigned, 2026-04-02)
|
|
188
|
+
Roadmap updated: docs/roadmap.md
|
|
189
|
+
External sync: github:harness-eng/harness#43 assigned
|
|
190
|
+
|
|
191
|
+
Transitioning to harness:autopilot (spec exists)...
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Gates
|
|
195
|
+
|
|
196
|
+
- **No assignment without human confirmation.** The CONFIRM phase must complete with explicit approval. Never auto-assign.
|
|
197
|
+
- **No transition without assignment.** The skill must write the assignment before transitioning to the next skill.
|
|
198
|
+
- **No scoring without a parsed roadmap.** If `docs/roadmap.md` does not exist or fails to parse, stop with an error.
|
|
199
|
+
|
|
200
|
+
## Escalation
|
|
201
|
+
|
|
202
|
+
- **When no unblocked candidates exist:** Inform the human. Suggest reviewing blocked items to see if blockers can be resolved, or adding new features via `harness-roadmap --add`.
|
|
203
|
+
- **When affinity data is unavailable:** Proceed without affinity scoring (weight falls to 0 for all candidates). Note this in the output.
|
|
204
|
+
- **When external sync fails:** Log the error, complete the local assignment, and note that external sync can be retried with `harness-roadmap --sync`.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
name: harness-roadmap-pilot
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
description: AI-assisted selection of the next highest-impact roadmap item with scoring, assignment, and skill transition
|
|
4
|
+
cognitive_mode: constructive-architect
|
|
5
|
+
triggers:
|
|
6
|
+
- manual
|
|
7
|
+
platforms:
|
|
8
|
+
- claude-code
|
|
9
|
+
- gemini-cli
|
|
10
|
+
tools:
|
|
11
|
+
- Bash
|
|
12
|
+
- Read
|
|
13
|
+
- Write
|
|
14
|
+
- Edit
|
|
15
|
+
- Glob
|
|
16
|
+
- Grep
|
|
17
|
+
- emit_interaction
|
|
18
|
+
cli:
|
|
19
|
+
command: harness skill run harness-roadmap-pilot
|
|
20
|
+
args:
|
|
21
|
+
- name: path
|
|
22
|
+
description: Project root path
|
|
23
|
+
required: false
|
|
24
|
+
- name: user
|
|
25
|
+
description: "Current user identifier (e.g., @cwarner) for affinity matching"
|
|
26
|
+
required: false
|
|
27
|
+
mcp:
|
|
28
|
+
tool: run_skill
|
|
29
|
+
input:
|
|
30
|
+
skill: harness-roadmap-pilot
|
|
31
|
+
path: string
|
|
32
|
+
type: rigid
|
|
33
|
+
tier: 2
|
|
34
|
+
phases:
|
|
35
|
+
- name: scan
|
|
36
|
+
description: Parse roadmap, filter unblocked candidates, compute scores
|
|
37
|
+
required: true
|
|
38
|
+
- name: recommend
|
|
39
|
+
description: AI reads top candidates specs and provides recommendation
|
|
40
|
+
required: true
|
|
41
|
+
- name: confirm
|
|
42
|
+
description: Present recommendation to human for approval
|
|
43
|
+
required: true
|
|
44
|
+
- name: assign
|
|
45
|
+
description: Update assignee, history, sync external, transition to next skill
|
|
46
|
+
required: true
|
|
47
|
+
state:
|
|
48
|
+
persistent: false
|
|
49
|
+
depends_on:
|
|
50
|
+
- harness-brainstorming
|
|
51
|
+
- harness-autopilot
|
|
52
|
+
- harness-roadmap
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
# Harness Roadmap Pilot
|
|
2
|
+
|
|
3
|
+
> AI-assisted selection of the next highest-impact unblocked roadmap item. Scores candidates, recommends one, assigns it, and transitions to the appropriate next skill.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
- When the team or individual needs to pick the next item to work on from the roadmap
|
|
8
|
+
- When there are multiple unblocked items and prioritization guidance is needed
|
|
9
|
+
- After completing a feature and looking for the next highest-impact work
|
|
10
|
+
- NOT when the roadmap does not exist (direct user to harness-roadmap --create)
|
|
11
|
+
- NOT when the user already knows what to work on (use harness-brainstorming or harness-autopilot directly)
|
|
12
|
+
|
|
13
|
+
## Process
|
|
14
|
+
|
|
15
|
+
### Iron Law
|
|
16
|
+
|
|
17
|
+
**Never assign or transition without the human confirming the recommendation first.**
|
|
18
|
+
|
|
19
|
+
Present the ranked candidates, the AI reasoning, and the recommended pick. Wait for explicit confirmation before making any changes.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
### Phase 1: SCAN -- Score Candidates
|
|
24
|
+
|
|
25
|
+
1. Check if `docs/roadmap.md` exists.
|
|
26
|
+
- If missing: error. "No roadmap found at docs/roadmap.md. Run harness-roadmap --create first."
|
|
27
|
+
2. Parse the roadmap using `parseRoadmap` from `@harness-engineering/core`.
|
|
28
|
+
3. Determine the current user:
|
|
29
|
+
- Use the `--user` argument if provided
|
|
30
|
+
- Otherwise, attempt to detect from git config: `git config user.name` or `git config user.email`
|
|
31
|
+
- If neither available, proceed without affinity scoring
|
|
32
|
+
4. Call `scoreRoadmapCandidates(roadmap, { currentUser })` from `@harness-engineering/core`.
|
|
33
|
+
5. If no candidates: inform the human. "No unblocked planned or backlog items found. All items are either in-progress, done, blocked, or the roadmap is empty."
|
|
34
|
+
|
|
35
|
+
Present the top 5 candidates:
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
ROADMAP PILOT -- Candidate Scoring
|
|
39
|
+
|
|
40
|
+
Top candidates (scored by position 50%, dependents 30%, affinity 20%):
|
|
41
|
+
|
|
42
|
+
# Feature Milestone Priority Score Breakdown
|
|
43
|
+
1. Feature A MVP Release P0 0.85 pos:0.9 dep:0.8 aff:1.0
|
|
44
|
+
2. Feature B MVP Release P1 0.72 pos:0.8 dep:0.6 aff:0.5
|
|
45
|
+
3. Feature C Q2 Release -- 0.65 pos:0.7 dep:0.5 aff:0.0
|
|
46
|
+
4. Feature D Backlog -- 0.40 pos:0.3 dep:0.4 aff:0.0
|
|
47
|
+
5. Feature E Backlog -- 0.35 pos:0.2 dep:0.3 aff:0.0
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Phase 2: RECOMMEND -- AI-Assisted Analysis
|
|
51
|
+
|
|
52
|
+
1. For the top 3 candidates, read their spec files (if they exist):
|
|
53
|
+
- Read the spec's Overview and Goals section
|
|
54
|
+
- Read the spec's Success Criteria section
|
|
55
|
+
- Assess effort and impact from the spec content
|
|
56
|
+
|
|
57
|
+
2. Provide a recommendation with reasoning:
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
RECOMMENDATION
|
|
61
|
+
|
|
62
|
+
I recommend Feature A (MVP Release, P0, score: 0.85).
|
|
63
|
+
|
|
64
|
+
Reasoning:
|
|
65
|
+
- Highest priority (P0) with strong positional signal (first in MVP milestone)
|
|
66
|
+
- Unblocks 2 downstream features (Feature X, Feature Y)
|
|
67
|
+
- You completed its blocker "Foundation" -- high context affinity
|
|
68
|
+
- Spec exists with clear success criteria (12 acceptance tests)
|
|
69
|
+
- Estimated effort: medium (8 tasks in the plan)
|
|
70
|
+
|
|
71
|
+
Alternative: Feature B (P1, score: 0.72) -- consider if Feature A's scope is too large for the current time window.
|
|
72
|
+
|
|
73
|
+
Proceed with Feature A? (y/n/pick another)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Phase 3: CONFIRM -- Human Decision
|
|
77
|
+
|
|
78
|
+
1. Wait for human confirmation.
|
|
79
|
+
- If **yes**: proceed to Phase 4.
|
|
80
|
+
- If **pick another**: ask which candidate number, then proceed with that pick.
|
|
81
|
+
- If **no**: stop. No changes made.
|
|
82
|
+
|
|
83
|
+
### Phase 4: ASSIGN -- Execute Assignment and Transition
|
|
84
|
+
|
|
85
|
+
1. Call `assignFeature(roadmap, feature, currentUser, todayDate)` from `@harness-engineering/core`.
|
|
86
|
+
- This updates the feature's `Assignee` field
|
|
87
|
+
- Appends `assigned` record to assignment history (and `unassigned` for previous assignee if reassignment)
|
|
88
|
+
|
|
89
|
+
2. Serialize and write the updated roadmap to `docs/roadmap.md`.
|
|
90
|
+
|
|
91
|
+
3. If tracker config exists in `harness.config.json`, sync the assignment:
|
|
92
|
+
- Call the external tracker's `assignTicket` to push the assignment
|
|
93
|
+
- Log result but do not block on failure
|
|
94
|
+
|
|
95
|
+
4. Determine the transition target:
|
|
96
|
+
- If the feature has a `spec` field (non-null): transition to `harness:autopilot`
|
|
97
|
+
- If the feature has no `spec`: transition to `harness:brainstorming`
|
|
98
|
+
|
|
99
|
+
5. Present the transition to the human via `emit_interaction`:
|
|
100
|
+
|
|
101
|
+
```json
|
|
102
|
+
emit_interaction({
|
|
103
|
+
path: "<project-root>",
|
|
104
|
+
type: "transition",
|
|
105
|
+
transition: {
|
|
106
|
+
completedPhase: "roadmap-pilot",
|
|
107
|
+
suggestedNext: "<brainstorming|autopilot>",
|
|
108
|
+
reason: "Feature '<name>' assigned and ready for <brainstorming|execution>",
|
|
109
|
+
artifacts: ["docs/roadmap.md"],
|
|
110
|
+
requiresConfirmation: true,
|
|
111
|
+
summary: "Assigned '<name>' to <user>. <Spec exists -- ready for autopilot|No spec -- needs brainstorming first>.",
|
|
112
|
+
qualityGate: {
|
|
113
|
+
checks: [
|
|
114
|
+
{ "name": "roadmap-parsed", "passed": true },
|
|
115
|
+
{ "name": "candidate-scored", "passed": true },
|
|
116
|
+
{ "name": "human-confirmed", "passed": true },
|
|
117
|
+
{ "name": "assignment-written", "passed": true }
|
|
118
|
+
],
|
|
119
|
+
allPassed: true
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
})
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
6. Run `harness validate`.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Harness Integration
|
|
130
|
+
|
|
131
|
+
- **`parseRoadmap` / `serializeRoadmap`** -- Parse and write `docs/roadmap.md`. Import from `@harness-engineering/core`.
|
|
132
|
+
- **`scoreRoadmapCandidates`** -- Core scoring algorithm. Import from `@harness-engineering/core`. Takes a `Roadmap` and optional `PilotScoringOptions` (currentUser for affinity).
|
|
133
|
+
- **`assignFeature`** -- Assignment with history tracking. Import from `@harness-engineering/core`. Handles new assignment and reassignment (unassigned + assigned records).
|
|
134
|
+
- **`emit_interaction`** -- Used for the skill transition at the end. Transitions to `harness:brainstorming` (no spec) or `harness:autopilot` (spec exists).
|
|
135
|
+
- **`harness validate`** -- Run after assignment is written.
|
|
136
|
+
- **External sync** -- If `harness.config.json` has tracker config, use `fullSync` or direct `assignTicket` to push assignment to external service.
|
|
137
|
+
|
|
138
|
+
## Success Criteria
|
|
139
|
+
|
|
140
|
+
1. Roadmap is parsed and unblocked planned/backlog items are scored
|
|
141
|
+
2. Scoring uses two-tier sort: explicit priority first, then weighted score
|
|
142
|
+
3. AI reads top candidates' specs and provides recommendation with reasoning
|
|
143
|
+
4. Human confirms before any changes are made
|
|
144
|
+
5. Assignment updates feature field, appends history records, and syncs externally
|
|
145
|
+
6. Reassignment produces two history records (unassigned + assigned)
|
|
146
|
+
7. Transition routes to brainstorming (no spec) or autopilot (spec exists)
|
|
147
|
+
8. `harness validate` passes after all changes
|
|
148
|
+
|
|
149
|
+
## Examples
|
|
150
|
+
|
|
151
|
+
### Example: Pick Next Item from a Multi-Milestone Roadmap
|
|
152
|
+
|
|
153
|
+
**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".
|
|
154
|
+
|
|
155
|
+
**Phase 1: SCAN**
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
ROADMAP PILOT -- Candidate Scoring
|
|
159
|
+
|
|
160
|
+
Top candidates:
|
|
161
|
+
# Feature Milestone Priority Score Breakdown
|
|
162
|
+
1. Graph Connector MVP Release P2 0.78 pos:0.8 dep:0.6 aff:1.0
|
|
163
|
+
2. Performance Baselines Q3 Hardening -- 0.45 pos:0.5 dep:0.3 aff:0.0
|
|
164
|
+
3. Push Notifications Backlog -- 0.30 pos:0.2 dep:0.2 aff:0.5
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**Phase 2: RECOMMEND**
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
I recommend Graph Connector (MVP Release, P2, score: 0.78).
|
|
171
|
+
|
|
172
|
+
Reasoning:
|
|
173
|
+
- Only prioritized item among candidates (P2)
|
|
174
|
+
- You completed its blocker "Core Library Design" -- maximum affinity bonus
|
|
175
|
+
- Unblocks "API Integration" downstream
|
|
176
|
+
- Spec exists at docs/changes/graph-connector/proposal.md
|
|
177
|
+
|
|
178
|
+
Proceed? (y/n/pick another)
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Human confirms **y**.
|
|
182
|
+
|
|
183
|
+
**Phase 4: ASSIGN**
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
Assigned: Graph Connector -> @cwarner
|
|
187
|
+
History: +1 record (assigned, 2026-04-02)
|
|
188
|
+
Roadmap updated: docs/roadmap.md
|
|
189
|
+
External sync: github:harness-eng/harness#43 assigned
|
|
190
|
+
|
|
191
|
+
Transitioning to harness:autopilot (spec exists)...
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Gates
|
|
195
|
+
|
|
196
|
+
- **No assignment without human confirmation.** The CONFIRM phase must complete with explicit approval. Never auto-assign.
|
|
197
|
+
- **No transition without assignment.** The skill must write the assignment before transitioning to the next skill.
|
|
198
|
+
- **No scoring without a parsed roadmap.** If `docs/roadmap.md` does not exist or fails to parse, stop with an error.
|
|
199
|
+
|
|
200
|
+
## Escalation
|
|
201
|
+
|
|
202
|
+
- **When no unblocked candidates exist:** Inform the human. Suggest reviewing blocked items to see if blockers can be resolved, or adding new features via `harness-roadmap --add`.
|
|
203
|
+
- **When affinity data is unavailable:** Proceed without affinity scoring (weight falls to 0 for all candidates). Note this in the output.
|
|
204
|
+
- **When external sync fails:** Log the error, complete the local assignment, and note that external sync can be retried with `harness-roadmap --sync`.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
name: harness-roadmap-pilot
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
description: AI-assisted selection of the next highest-impact roadmap item with scoring, assignment, and skill transition
|
|
4
|
+
cognitive_mode: constructive-architect
|
|
5
|
+
triggers:
|
|
6
|
+
- manual
|
|
7
|
+
platforms:
|
|
8
|
+
- claude-code
|
|
9
|
+
- gemini-cli
|
|
10
|
+
tools:
|
|
11
|
+
- Bash
|
|
12
|
+
- Read
|
|
13
|
+
- Write
|
|
14
|
+
- Edit
|
|
15
|
+
- Glob
|
|
16
|
+
- Grep
|
|
17
|
+
- emit_interaction
|
|
18
|
+
cli:
|
|
19
|
+
command: harness skill run harness-roadmap-pilot
|
|
20
|
+
args:
|
|
21
|
+
- name: path
|
|
22
|
+
description: Project root path
|
|
23
|
+
required: false
|
|
24
|
+
- name: user
|
|
25
|
+
description: "Current user identifier (e.g., @cwarner) for affinity matching"
|
|
26
|
+
required: false
|
|
27
|
+
mcp:
|
|
28
|
+
tool: run_skill
|
|
29
|
+
input:
|
|
30
|
+
skill: harness-roadmap-pilot
|
|
31
|
+
path: string
|
|
32
|
+
type: rigid
|
|
33
|
+
tier: 2
|
|
34
|
+
phases:
|
|
35
|
+
- name: scan
|
|
36
|
+
description: Parse roadmap, filter unblocked candidates, compute scores
|
|
37
|
+
required: true
|
|
38
|
+
- name: recommend
|
|
39
|
+
description: AI reads top candidates specs and provides recommendation
|
|
40
|
+
required: true
|
|
41
|
+
- name: confirm
|
|
42
|
+
description: Present recommendation to human for approval
|
|
43
|
+
required: true
|
|
44
|
+
- name: assign
|
|
45
|
+
description: Update assignee, history, sync external, transition to next skill
|
|
46
|
+
required: true
|
|
47
|
+
state:
|
|
48
|
+
persistent: false
|
|
49
|
+
depends_on:
|
|
50
|
+
- harness-brainstorming
|
|
51
|
+
- harness-autopilot
|
|
52
|
+
- harness-roadmap
|