@harness-engineering/cli 1.21.0 → 1.23.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.
Files changed (127) hide show
  1. package/dist/agents/skills/claude-code/cleanup-dead-code/skill.yaml +3 -0
  2. package/dist/agents/skills/claude-code/detect-doc-drift/skill.yaml +5 -0
  3. package/dist/agents/skills/claude-code/enforce-architecture/skill.yaml +13 -0
  4. package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +2 -2
  5. package/dist/agents/skills/claude-code/harness-brainstorming/SKILL.md +1 -1
  6. package/dist/agents/skills/claude-code/harness-code-review/skill.yaml +5 -0
  7. package/dist/agents/skills/claude-code/harness-codebase-cleanup/skill.yaml +5 -0
  8. package/dist/agents/skills/claude-code/harness-debugging/skill.yaml +5 -0
  9. package/dist/agents/skills/claude-code/harness-dependency-health/skill.yaml +9 -0
  10. package/dist/agents/skills/claude-code/harness-execution/SKILL.md +1 -1
  11. package/dist/agents/skills/claude-code/harness-hotspot-detector/skill.yaml +9 -0
  12. package/dist/agents/skills/claude-code/harness-integrity/skill.yaml +5 -0
  13. package/dist/agents/skills/claude-code/harness-perf/skill.yaml +3 -0
  14. package/dist/agents/skills/claude-code/harness-refactoring/skill.yaml +9 -0
  15. package/dist/agents/skills/claude-code/harness-roadmap/SKILL.md +5 -5
  16. package/dist/agents/skills/claude-code/harness-roadmap-pilot/SKILL.md +18 -14
  17. package/dist/agents/skills/claude-code/harness-security-scan/skill.yaml +3 -0
  18. package/dist/agents/skills/claude-code/harness-soundness-review/skill.yaml +5 -0
  19. package/dist/agents/skills/claude-code/harness-supply-chain-audit/skill.yaml +3 -0
  20. package/dist/agents/skills/claude-code/harness-tdd/skill.yaml +3 -0
  21. package/dist/agents/skills/codex/cleanup-dead-code/skill.yaml +3 -0
  22. package/dist/agents/skills/codex/detect-doc-drift/skill.yaml +5 -0
  23. package/dist/agents/skills/codex/enforce-architecture/skill.yaml +13 -0
  24. package/dist/agents/skills/codex/harness-autopilot/SKILL.md +2 -2
  25. package/dist/agents/skills/codex/harness-brainstorming/SKILL.md +1 -1
  26. package/dist/agents/skills/codex/harness-code-review/skill.yaml +5 -0
  27. package/dist/agents/skills/codex/harness-codebase-cleanup/skill.yaml +5 -0
  28. package/dist/agents/skills/codex/harness-debugging/skill.yaml +5 -0
  29. package/dist/agents/skills/codex/harness-dependency-health/skill.yaml +9 -0
  30. package/dist/agents/skills/codex/harness-execution/SKILL.md +1 -1
  31. package/dist/agents/skills/codex/harness-hotspot-detector/skill.yaml +9 -0
  32. package/dist/agents/skills/codex/harness-integrity/skill.yaml +5 -0
  33. package/dist/agents/skills/codex/harness-perf/skill.yaml +3 -0
  34. package/dist/agents/skills/codex/harness-refactoring/skill.yaml +9 -0
  35. package/dist/agents/skills/codex/harness-roadmap/SKILL.md +5 -5
  36. package/dist/agents/skills/codex/harness-roadmap-pilot/SKILL.md +18 -14
  37. package/dist/agents/skills/codex/harness-security-scan/skill.yaml +3 -0
  38. package/dist/agents/skills/codex/harness-soundness-review/skill.yaml +5 -0
  39. package/dist/agents/skills/codex/harness-supply-chain-audit/skill.yaml +3 -0
  40. package/dist/agents/skills/codex/harness-tdd/skill.yaml +3 -0
  41. package/dist/agents/skills/cursor/cleanup-dead-code/skill.yaml +3 -0
  42. package/dist/agents/skills/cursor/detect-doc-drift/skill.yaml +5 -0
  43. package/dist/agents/skills/cursor/enforce-architecture/skill.yaml +13 -0
  44. package/dist/agents/skills/cursor/harness-autopilot/SKILL.md +2 -2
  45. package/dist/agents/skills/cursor/harness-brainstorming/SKILL.md +1 -1
  46. package/dist/agents/skills/cursor/harness-code-review/skill.yaml +5 -0
  47. package/dist/agents/skills/cursor/harness-codebase-cleanup/skill.yaml +5 -0
  48. package/dist/agents/skills/cursor/harness-debugging/skill.yaml +5 -0
  49. package/dist/agents/skills/cursor/harness-dependency-health/skill.yaml +9 -0
  50. package/dist/agents/skills/cursor/harness-execution/SKILL.md +1 -1
  51. package/dist/agents/skills/cursor/harness-hotspot-detector/skill.yaml +9 -0
  52. package/dist/agents/skills/cursor/harness-integrity/skill.yaml +5 -0
  53. package/dist/agents/skills/cursor/harness-perf/skill.yaml +3 -0
  54. package/dist/agents/skills/cursor/harness-refactoring/skill.yaml +9 -0
  55. package/dist/agents/skills/cursor/harness-roadmap/SKILL.md +5 -5
  56. package/dist/agents/skills/cursor/harness-roadmap-pilot/SKILL.md +18 -14
  57. package/dist/agents/skills/cursor/harness-security-scan/skill.yaml +3 -0
  58. package/dist/agents/skills/cursor/harness-soundness-review/skill.yaml +5 -0
  59. package/dist/agents/skills/cursor/harness-supply-chain-audit/skill.yaml +3 -0
  60. package/dist/agents/skills/cursor/harness-tdd/skill.yaml +3 -0
  61. package/dist/agents/skills/gemini-cli/cleanup-dead-code/skill.yaml +3 -0
  62. package/dist/agents/skills/gemini-cli/detect-doc-drift/skill.yaml +5 -0
  63. package/dist/agents/skills/gemini-cli/enforce-architecture/skill.yaml +13 -0
  64. package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +2 -2
  65. package/dist/agents/skills/gemini-cli/harness-brainstorming/SKILL.md +1 -1
  66. package/dist/agents/skills/gemini-cli/harness-code-review/skill.yaml +5 -0
  67. package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/skill.yaml +5 -0
  68. package/dist/agents/skills/gemini-cli/harness-debugging/skill.yaml +5 -0
  69. package/dist/agents/skills/gemini-cli/harness-dependency-health/skill.yaml +9 -0
  70. package/dist/agents/skills/gemini-cli/harness-execution/SKILL.md +1 -1
  71. package/dist/agents/skills/gemini-cli/harness-hotspot-detector/skill.yaml +9 -0
  72. package/dist/agents/skills/gemini-cli/harness-integrity/skill.yaml +5 -0
  73. package/dist/agents/skills/gemini-cli/harness-perf/skill.yaml +3 -0
  74. package/dist/agents/skills/gemini-cli/harness-refactoring/skill.yaml +9 -0
  75. package/dist/agents/skills/gemini-cli/harness-roadmap/SKILL.md +5 -5
  76. package/dist/agents/skills/gemini-cli/harness-roadmap-pilot/SKILL.md +18 -14
  77. package/dist/agents/skills/gemini-cli/harness-security-scan/skill.yaml +3 -0
  78. package/dist/agents/skills/gemini-cli/harness-soundness-review/skill.yaml +5 -0
  79. package/dist/agents/skills/gemini-cli/harness-supply-chain-audit/skill.yaml +3 -0
  80. package/dist/agents/skills/gemini-cli/harness-tdd/skill.yaml +3 -0
  81. package/dist/{agents-md-TDTLYAQU.js → agents-md-GLKJSGKT.js} +2 -1
  82. package/dist/{architecture-NANP4XPE.js → architecture-EDSBAGR4.js} +3 -2
  83. package/dist/assess-project-CEDY4JU3.js +9 -0
  84. package/dist/bin/harness-mcp.js +15 -13
  85. package/dist/bin/harness.js +21 -19
  86. package/dist/{check-phase-gate-I4NQOCSU.js → check-phase-gate-N3DTKFCZ.js} +4 -3
  87. package/dist/{chunk-UEKQ5G3V.js → chunk-26AUZBV4.js} +459 -37
  88. package/dist/chunk-2LAEDVOC.js +293 -0
  89. package/dist/{chunk-M6TIO6NF.js → chunk-2PAPHA77.js} +1 -1
  90. package/dist/{dist-U7EAO6T2.js → chunk-5SWE24IG.js} +401 -60
  91. package/dist/{chunk-7G2ZUTZA.js → chunk-A4AI3H3R.js} +26 -3
  92. package/dist/{chunk-HUDEBSR2.js → chunk-AIBAYANF.js} +3 -3
  93. package/dist/{chunk-6GEYPBDU.js → chunk-AKVG4MMZ.js} +9 -9
  94. package/dist/{chunk-SPUK5W4W.js → chunk-ENA4O4WD.js} +2 -2
  95. package/dist/{chunk-SZ5TGZMI.js → chunk-GJRUIXUK.js} +17 -2
  96. package/dist/{chunk-YF5ROTWR.js → chunk-HT4VPPB4.js} +8 -8
  97. package/dist/{chunk-L6LTNZQZ.js → chunk-LIWGCYON.js} +1 -1
  98. package/dist/{chunk-UVJFBKCX.js → chunk-QUKH6QCJ.js} +7 -7
  99. package/dist/{chunk-HKUX2X7O.js → chunk-SE4YPMLH.js} +9 -1
  100. package/dist/{chunk-TMSGI27F.js → chunk-SM22U22L.js} +982 -386
  101. package/dist/{chunk-LRG3B43J.js → chunk-T5QWCVGK.js} +1 -1
  102. package/dist/{chunk-H6LXAH66.js → chunk-TD6MQUV2.js} +1 -1
  103. package/dist/{chunk-WXI5ONCU.js → chunk-TJ6NLLAY.js} +4 -4
  104. package/dist/{chunk-CZZXE6BL.js → chunk-TLDCCPUZ.js} +1 -1
  105. package/dist/{chunk-YZYBQZVL.js → chunk-XDAIFVGC.js} +1539 -587
  106. package/dist/{ci-workflow-Z4IUJBZL.js → ci-workflow-LE3QF4FP.js} +2 -1
  107. package/dist/{create-skill-NDXQSTIK.js → create-skill-U3XCFRZN.js} +2 -2
  108. package/dist/dist-OEXTQQZC.js +92 -0
  109. package/dist/{dist-KV2ICL5X.js → dist-YIKUBJLQ.js} +56 -3
  110. package/dist/{docs-2PCZVSGB.js → docs-F5G7NAFF.js} +4 -3
  111. package/dist/{engine-EOXMI5MD.js → engine-LX5RVGXN.js} +2 -1
  112. package/dist/{entropy-VGXXBIGX.js → entropy-A5Q2USYX.js} +3 -2
  113. package/dist/{feedback-VTSPL3O7.js → feedback-2EU25RIW.js} +1 -1
  114. package/dist/{generate-agent-definitions-QICSCGXB.js → generate-agent-definitions-HNJHO5YQ.js} +2 -1
  115. package/dist/{graph-loader-KMHDQYDT.js → graph-loader-XULF5QF7.js} +1 -1
  116. package/dist/index.d.ts +66 -10
  117. package/dist/index.js +27 -23
  118. package/dist/{loader-7S4FYAPP.js → loader-GWIEW4HM.js} +2 -1
  119. package/dist/{mcp-DF25USTE.js → mcp-ID3LR6JB.js} +15 -13
  120. package/dist/{performance-RV4DUMFI.js → performance-YAY2A6A6.js} +4 -3
  121. package/dist/{review-pipeline-7KQJB4SI.js → review-pipeline-YD4WI3JM.js} +1 -1
  122. package/dist/{runtime-XKOHGGRC.js → runtime-UJ4YO4CA.js} +2 -1
  123. package/dist/{security-NLWTMK3G.js → security-IBSUKMVD.js} +1 -1
  124. package/dist/{skill-executor-XEVDGXUM.js → skill-executor-2BZQLHYN.js} +2 -2
  125. package/dist/{validate-VHFE6J6O.js → validate-NHXWKMCR.js} +3 -2
  126. package/dist/{validate-cross-check-PFRKABCS.js → validate-cross-check-R3GV2MLM.js} +2 -1
  127. package/package.json +4 -4
@@ -32,3 +32,6 @@ state:
32
32
  persistent: false
33
33
  files: []
34
34
  depends_on: []
35
+ addresses:
36
+ - signal: dead-code
37
+ hard: true
@@ -29,3 +29,8 @@ state:
29
29
  persistent: false
30
30
  files: []
31
31
  depends_on: []
32
+ addresses:
33
+ - signal: doc-gaps
34
+ weight: 0.7
35
+ - signal: drift
36
+ weight: 0.5
@@ -33,3 +33,16 @@ state:
33
33
  persistent: false
34
34
  files: []
35
35
  depends_on: []
36
+ addresses:
37
+ - signal: circular-deps
38
+ hard: true
39
+ - signal: layer-violations
40
+ hard: true
41
+ - signal: high-coupling
42
+ metric: fanOut
43
+ threshold: 20
44
+ weight: 0.8
45
+ - signal: high-coupling
46
+ metric: couplingRatio
47
+ threshold: 0.7
48
+ weight: 0.6
@@ -531,7 +531,7 @@ INIT → ASSESS → PLAN → APPROVE_PLAN → EXECUTE → VERIFY → REVIEW →
531
531
 
532
532
  4. **Clear scratchpad for this phase.** Call `clearScratchpad({ session: sessionSlug, phase: phaseName, projectPath: projectPath })` to delete ephemeral research files for the completed phase. This frees disk space and prevents stale scratchpad data from leaking into future phases.
533
533
 
534
- 5. **Sync roadmap.** If `docs/roadmap.md` exists, call `manage_roadmap` with action `sync` and `apply: true`. This reflects the just-completed phase in the roadmap (e.g., updating the feature from `planned` to `in-progress`). If `manage_roadmap` is unavailable, fall back to direct file manipulation using `syncRoadmap()` from core. Skip silently if no roadmap exists. Do not use `force_sync: true` — the human-always-wins rule applies.
534
+ 5. **Sync roadmap.** If `docs/roadmap.md` exists, call `manage_roadmap` with action `sync` and `apply: true`. This reflects the just-completed phase in the roadmap (e.g., updating the feature from `planned` to `in-progress`). If `manage_roadmap` is unavailable, fall back to direct file manipulation using `syncRoadmap()` from core and warn: "External sync skipped (MCP unavailable). Run `manage_roadmap sync` when MCP is restored to push changes to GitHub." Skip silently if no roadmap exists. Do not use `force_sync: true` — the human-always-wins rule applies.
535
535
 
536
536
  6. **Write session summary.** Update the session summary to reflect the completed phase:
537
537
 
@@ -671,7 +671,7 @@ INIT → ASSESS → PLAN → APPROVE_PLAN → EXECUTE → VERIFY → REVIEW →
671
671
 
672
672
  6. **Check if pruning is needed.** Call `countLearningEntries(projectPath)`. If the count exceeds 30, suggest: "Global learnings.md has {count} entries (threshold: 30). Run `harness learnings prune` to analyze patterns and archive old entries."
673
673
 
674
- 7. **Update roadmap to done.** If `docs/roadmap.md` exists and the current spec maps to a roadmap feature, call `manage_roadmap` with action `update` to set the feature status to `done`. Derive the feature name from the spec title (H1 heading) or the session's `handoff.json` `summary` field. If `manage_roadmap` is unavailable, fall back to direct file manipulation using `updateFeature()` from core. Skip silently if no roadmap exists or if the feature is not found. Do not use `force_sync: true`.
674
+ 7. **Update roadmap to done.** If `docs/roadmap.md` exists and the current spec maps to a roadmap feature, call `manage_roadmap` with action `update` to set the feature status to `done`. Derive the feature name from the spec title (H1 heading) or the session's `handoff.json` `summary` field. If `manage_roadmap` is unavailable, fall back to direct file manipulation using `updateFeature()` from core and warn: "External sync skipped (MCP unavailable). Run `manage_roadmap sync` when MCP is restored to push changes to GitHub." Skip silently if no roadmap exists or if the feature is not found. Do not use `force_sync: true`.
675
675
 
676
676
  8. **Write final session summary.** Update the session summary to reflect completion:
677
677
 
@@ -161,7 +161,7 @@ These keywords flow into the `handoff.json` `contextKeywords` field when the spe
161
161
  - Call `manage_roadmap` with action `add`, `status: "planned"`, `milestone: "Current Work"`, and the spec path. Include a one-line summary from the spec overview.
162
162
  - If the feature already exists in the roadmap (duplicate name), skip silently — the feature was likely added manually or by a prior brainstorming session.
163
163
  - Log: `"Added '<feature-name>' to roadmap as planned"` (informational, not a prompt).
164
- - If `manage_roadmap` is unavailable, fall back to direct file manipulation using `parseRoadmap`/`serializeRoadmap` from core to read, modify, and write `docs/roadmap.md`.
164
+ - If `manage_roadmap` is unavailable, fall back to direct file manipulation using `parseRoadmap`/`serializeRoadmap` from core to read, modify, and write `docs/roadmap.md`. Warn: "External sync skipped (MCP unavailable). Run `manage_roadmap sync` when MCP is restored to push changes to GitHub."
165
165
  - If no roadmap exists, skip this step silently.
166
166
 
167
167
  7. **Write handoff and suggest transition.** After the human approves the spec:
@@ -50,3 +50,8 @@ state:
50
50
  persistent: false
51
51
  files: []
52
52
  depends_on: []
53
+ addresses:
54
+ - signal: high-complexity
55
+ weight: 0.5
56
+ - signal: high-coupling
57
+ weight: 0.4
@@ -63,3 +63,8 @@ depends_on:
63
63
  - cleanup-dead-code
64
64
  - enforce-architecture
65
65
  - harness-hotspot-detector
66
+ addresses:
67
+ - signal: dead-code
68
+ weight: 0.8
69
+ - signal: drift
70
+ weight: 0.6
@@ -46,3 +46,8 @@ state:
46
46
  files:
47
47
  - .harness/debug/
48
48
  depends_on: []
49
+ addresses:
50
+ - signal: perf-regression
51
+ weight: 0.5
52
+ - signal: anomaly-outlier
53
+ weight: 0.6
@@ -40,3 +40,12 @@ state:
40
40
  persistent: false
41
41
  files: []
42
42
  depends_on: []
43
+ addresses:
44
+ - signal: high-coupling
45
+ metric: fanOut
46
+ threshold: 15
47
+ weight: 0.7
48
+ - signal: anomaly-outlier
49
+ weight: 0.6
50
+ - signal: articulation-point
51
+ weight: 0.5
@@ -293,7 +293,7 @@ Skipping this step means subsequent graph queries (impact analysis, dependency h
293
293
 
294
294
  This overwrites any previous summary for this session. The index.md is updated automatically.
295
295
 
296
- 6. **Sync roadmap (mandatory when present).** If `docs/roadmap.md` exists, call `manage_roadmap` with action `sync` and `apply: true` to update linked feature statuses from the just-completed execution state. Do not use `force_sync: true` — the human-always-wins rule applies. If `manage_roadmap` is unavailable, fall back to direct file manipulation using `syncRoadmap()` from core. If no roadmap exists, skip silently.
296
+ 6. **Sync roadmap (mandatory when present).** If `docs/roadmap.md` exists, call `manage_roadmap` with action `sync` and `apply: true` to update linked feature statuses from the just-completed execution state. Do not use `force_sync: true` — the human-always-wins rule applies. If `manage_roadmap` is unavailable, fall back to direct file manipulation using `syncRoadmap()` from core and warn: "External sync skipped (MCP unavailable). Run `manage_roadmap sync` when MCP is restored to push changes to GitHub." If no roadmap exists, skip silently.
297
297
 
298
298
  7. **Learnings are append-only.** Never edit or delete previous learnings. They are a chronological record.
299
299
 
@@ -43,3 +43,12 @@ state:
43
43
  persistent: false
44
44
  files: []
45
45
  depends_on: []
46
+ addresses:
47
+ - signal: high-complexity
48
+ metric: cyclomaticComplexity
49
+ threshold: 20
50
+ weight: 0.9
51
+ - signal: anomaly-outlier
52
+ weight: 0.7
53
+ - signal: articulation-point
54
+ weight: 0.8
@@ -46,3 +46,8 @@ state:
46
46
  depends_on:
47
47
  - harness-verify
48
48
  - harness-code-review
49
+ addresses:
50
+ - signal: drift
51
+ weight: 0.7
52
+ - signal: dead-code
53
+ weight: 0.5
@@ -49,3 +49,6 @@ state:
49
49
  files: []
50
50
  depends_on:
51
51
  - harness-verify
52
+ addresses:
53
+ - signal: perf-regression
54
+ weight: 0.8
@@ -32,3 +32,12 @@ state:
32
32
  persistent: false
33
33
  files: []
34
34
  depends_on: []
35
+ addresses:
36
+ - signal: high-complexity
37
+ metric: cyclomaticComplexity
38
+ threshold: 15
39
+ weight: 0.8
40
+ - signal: high-coupling
41
+ metric: couplingRatio
42
+ threshold: 0.5
43
+ weight: 0.6
@@ -92,7 +92,7 @@ Unmatched plans: N (flag for review)
92
92
  - One H2 section per milestone
93
93
  - One H3 section per feature with 5 fields: `Status`, `Spec`, `Summary`, `Blockers`, `Plan`
94
94
 
95
- 2. Write via `manage_roadmap` MCP tool if available. If MCP is unavailable, write directly using the roadmap markdown format:
95
+ 2. Write via `manage_roadmap` MCP tool if available. If MCP is unavailable, write directly using the roadmap markdown format and warn: "External sync skipped (MCP unavailable). Run `manage_roadmap sync` when MCP is restored to push changes to GitHub."
96
96
 
97
97
  ```markdown
98
98
  ---
@@ -173,7 +173,7 @@ Wait for confirmation before proceeding.
173
173
 
174
174
  #### Phase 3: WRITE -- Add Feature to Roadmap
175
175
 
176
- 1. Add via `manage_roadmap add` MCP tool if available. If MCP is unavailable, parse the roadmap, add the feature to the specified milestone, and serialize back.
176
+ 1. Add via `manage_roadmap add` MCP tool if available. If MCP is unavailable, parse the roadmap, add the feature to the specified milestone, and serialize back. Warn: "External sync skipped (MCP unavailable). Run `manage_roadmap sync` when MCP is restored to push changes to GitHub."
177
177
  2. If the milestone is `[NEW]`: create the milestone section, then add the feature.
178
178
  3. Write to `docs/roadmap.md`.
179
179
 
@@ -276,7 +276,7 @@ Wait for confirmation before proceeding.
276
276
 
277
277
  #### Phase 3: WRITE -- Apply Changes
278
278
 
279
- 1. Apply via `manage_roadmap sync` MCP tool if available, or via `manage_roadmap update` for each changed feature. If MCP is unavailable, parse the roadmap, update statuses, and serialize back.
279
+ 1. Apply via `manage_roadmap sync` MCP tool if available, or via `manage_roadmap update` for each changed feature. If MCP is unavailable, parse the roadmap, update statuses, and serialize back. Warn: "External sync skipped (MCP unavailable). Run `manage_roadmap sync` when MCP is restored to push changes to GitHub."
280
280
  2. Update `last_synced` timestamp in frontmatter.
281
281
  3. Write to `docs/roadmap.md`.
282
282
 
@@ -378,7 +378,7 @@ Choice?
378
378
  ```
379
379
 
380
380
  2. Wait for confirmation before writing.
381
- 3. Apply all changes via `manage_roadmap update` / `manage_roadmap remove` MCP tool calls, or direct file manipulation if MCP is unavailable.
381
+ 3. Apply all changes via `manage_roadmap update` / `manage_roadmap remove` MCP tool calls, or direct file manipulation if MCP is unavailable. If falling back to direct manipulation, warn: "External sync skipped (MCP unavailable). Run `manage_roadmap sync` when MCP is restored to push changes to GitHub."
382
382
  4. Update `last_manual_edit` timestamp in frontmatter (since this is a human-driven edit).
383
383
  5. Write to `docs/roadmap.md`.
384
384
 
@@ -592,4 +592,4 @@ These are hard stops. Violating any gate means the process has broken down.
592
592
 
593
593
  - **When no specs or plans are found during `--create`:** Suggest creating a minimal roadmap with just a Backlog milestone containing features described verbally by the human. Alternatively, suggest running `harness:brainstorming` first to generate specs that can then be discovered by `--create`.
594
594
  - **When the roadmap file is malformed and cannot be parsed:** Report the specific parse error with line numbers if available. Suggest manual inspection of `docs/roadmap.md` or recreation with `--create` (after backing up the existing file).
595
- - **When MCP tool is unavailable:** Fall back to direct file manipulation via Read/Write tools using the roadmap markdown format. The core `parseRoadmap`/`serializeRoadmap` functions handle the format. Report the fallback to the human: "MCP tool unavailable, using direct file operations."
595
+ - **When MCP tool is unavailable:** Fall back to direct file manipulation via Read/Write tools using the roadmap markdown format. The core `parseRoadmap`/`serializeRoadmap` functions handle the format. Report the fallback to the human: "MCP tool unavailable, using direct file operations. External sync skipped — run `manage_roadmap sync` when MCP is restored to push changes to GitHub."
@@ -82,21 +82,26 @@ Proceed with Feature A? (y/n/pick another)
82
82
 
83
83
  ### Phase 4: ASSIGN -- Execute Assignment and Transition
84
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)
85
+ 1. Call `manage_roadmap` with action `update` to assign the feature:
88
86
 
89
- 2. Serialize and write the updated roadmap to `docs/roadmap.md`.
87
+ ```json
88
+ manage_roadmap({
89
+ path: "<project-root>",
90
+ action: "update",
91
+ feature: "<feature-name>",
92
+ assignee: "<currentUser>"
93
+ })
94
+ ```
90
95
 
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
96
+ - This updates the feature's `Assignee` field with assignment history tracking
97
+ - Automatically triggers external sync (GitHub Issues) if tracker config exists in `harness.config.json`
98
+ - External sync is fire-and-forget — errors are logged but do not block the assignment
94
99
 
95
- 4. Determine the transition target:
100
+ 2. Determine the transition target:
96
101
  - If the feature has a `spec` field (non-null): transition to `harness:autopilot`
97
102
  - If the feature has no `spec`: transition to `harness:brainstorming`
98
103
 
99
- 5. Present the transition to the human via `emit_interaction`:
104
+ 3. Present the transition to the human via `emit_interaction`:
100
105
 
101
106
  ```json
102
107
  emit_interaction({
@@ -122,7 +127,7 @@ Proceed with Feature A? (y/n/pick another)
122
127
  })
123
128
  ```
124
129
 
125
- 6. Run `harness validate`.
130
+ 4. Run `harness validate`.
126
131
 
127
132
  ---
128
133
 
@@ -130,10 +135,9 @@ Proceed with Feature A? (y/n/pick another)
130
135
 
131
136
  - **`parseRoadmap` / `serializeRoadmap`** -- Parse and write `docs/roadmap.md`. Import from `@harness-engineering/core`.
132
137
  - **`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).
138
+ - **`manage_roadmap update`** -- Used for assignment. Supports `assignee` field which delegates to `assignFeature` internally, handles history tracking, and automatically triggers external sync (GitHub Issues).
134
139
  - **`emit_interaction`** -- Used for the skill transition at the end. Transitions to `harness:brainstorming` (no spec) or `harness:autopilot` (spec exists).
135
140
  - **`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
141
 
138
142
  ## Success Criteria
139
143
 
@@ -183,10 +187,10 @@ Human confirms **y**.
183
187
  **Phase 4: ASSIGN**
184
188
 
185
189
  ```
186
- Assigned: Graph Connector -> @cwarner
190
+ manage_roadmap update: Graph Connector assignee -> @cwarner
187
191
  History: +1 record (assigned, 2026-04-02)
188
192
  Roadmap updated: docs/roadmap.md
189
- External sync: github:harness-eng/harness#43 assigned
193
+ External sync: github:harness-eng/harness#43 assigned (automatic)
190
194
 
191
195
  Transitioning to harness:autopilot (spec exists)...
192
196
  ```
@@ -40,3 +40,6 @@ state:
40
40
  persistent: false
41
41
  files: []
42
42
  depends_on: []
43
+ addresses:
44
+ - signal: security-findings
45
+ hard: true
@@ -47,3 +47,8 @@ state:
47
47
  persistent: false
48
48
  files: []
49
49
  depends_on: []
50
+ addresses:
51
+ - signal: layer-violations
52
+ weight: 0.6
53
+ - signal: circular-deps
54
+ weight: 0.5
@@ -49,3 +49,6 @@ state:
49
49
  files: []
50
50
  depends_on:
51
51
  - harness-security-scan
52
+ addresses:
53
+ - signal: security-findings
54
+ weight: 0.6
@@ -47,3 +47,6 @@ state:
47
47
  files: []
48
48
  depends_on:
49
49
  - harness-verification
50
+ addresses:
51
+ - signal: low-coverage
52
+ weight: 0.9
@@ -32,3 +32,6 @@ state:
32
32
  persistent: false
33
33
  files: []
34
34
  depends_on: []
35
+ addresses:
36
+ - signal: dead-code
37
+ hard: true
@@ -29,3 +29,8 @@ state:
29
29
  persistent: false
30
30
  files: []
31
31
  depends_on: []
32
+ addresses:
33
+ - signal: doc-gaps
34
+ weight: 0.7
35
+ - signal: drift
36
+ weight: 0.5
@@ -33,3 +33,16 @@ state:
33
33
  persistent: false
34
34
  files: []
35
35
  depends_on: []
36
+ addresses:
37
+ - signal: circular-deps
38
+ hard: true
39
+ - signal: layer-violations
40
+ hard: true
41
+ - signal: high-coupling
42
+ metric: fanOut
43
+ threshold: 20
44
+ weight: 0.8
45
+ - signal: high-coupling
46
+ metric: couplingRatio
47
+ threshold: 0.7
48
+ weight: 0.6
@@ -531,7 +531,7 @@ INIT → ASSESS → PLAN → APPROVE_PLAN → EXECUTE → VERIFY → REVIEW →
531
531
 
532
532
  4. **Clear scratchpad for this phase.** Call `clearScratchpad({ session: sessionSlug, phase: phaseName, projectPath: projectPath })` to delete ephemeral research files for the completed phase. This frees disk space and prevents stale scratchpad data from leaking into future phases.
533
533
 
534
- 5. **Sync roadmap.** If `docs/roadmap.md` exists, call `manage_roadmap` with action `sync` and `apply: true`. This reflects the just-completed phase in the roadmap (e.g., updating the feature from `planned` to `in-progress`). If `manage_roadmap` is unavailable, fall back to direct file manipulation using `syncRoadmap()` from core. Skip silently if no roadmap exists. Do not use `force_sync: true` — the human-always-wins rule applies.
534
+ 5. **Sync roadmap.** If `docs/roadmap.md` exists, call `manage_roadmap` with action `sync` and `apply: true`. This reflects the just-completed phase in the roadmap (e.g., updating the feature from `planned` to `in-progress`). If `manage_roadmap` is unavailable, fall back to direct file manipulation using `syncRoadmap()` from core and warn: "External sync skipped (MCP unavailable). Run `manage_roadmap sync` when MCP is restored to push changes to GitHub." Skip silently if no roadmap exists. Do not use `force_sync: true` — the human-always-wins rule applies.
535
535
 
536
536
  6. **Write session summary.** Update the session summary to reflect the completed phase:
537
537
 
@@ -671,7 +671,7 @@ INIT → ASSESS → PLAN → APPROVE_PLAN → EXECUTE → VERIFY → REVIEW →
671
671
 
672
672
  6. **Check if pruning is needed.** Call `countLearningEntries(projectPath)`. If the count exceeds 30, suggest: "Global learnings.md has {count} entries (threshold: 30). Run `harness learnings prune` to analyze patterns and archive old entries."
673
673
 
674
- 7. **Update roadmap to done.** If `docs/roadmap.md` exists and the current spec maps to a roadmap feature, call `manage_roadmap` with action `update` to set the feature status to `done`. Derive the feature name from the spec title (H1 heading) or the session's `handoff.json` `summary` field. If `manage_roadmap` is unavailable, fall back to direct file manipulation using `updateFeature()` from core. Skip silently if no roadmap exists or if the feature is not found. Do not use `force_sync: true`.
674
+ 7. **Update roadmap to done.** If `docs/roadmap.md` exists and the current spec maps to a roadmap feature, call `manage_roadmap` with action `update` to set the feature status to `done`. Derive the feature name from the spec title (H1 heading) or the session's `handoff.json` `summary` field. If `manage_roadmap` is unavailable, fall back to direct file manipulation using `updateFeature()` from core and warn: "External sync skipped (MCP unavailable). Run `manage_roadmap sync` when MCP is restored to push changes to GitHub." Skip silently if no roadmap exists or if the feature is not found. Do not use `force_sync: true`.
675
675
 
676
676
  8. **Write final session summary.** Update the session summary to reflect completion:
677
677
 
@@ -161,7 +161,7 @@ These keywords flow into the `handoff.json` `contextKeywords` field when the spe
161
161
  - Call `manage_roadmap` with action `add`, `status: "planned"`, `milestone: "Current Work"`, and the spec path. Include a one-line summary from the spec overview.
162
162
  - If the feature already exists in the roadmap (duplicate name), skip silently — the feature was likely added manually or by a prior brainstorming session.
163
163
  - Log: `"Added '<feature-name>' to roadmap as planned"` (informational, not a prompt).
164
- - If `manage_roadmap` is unavailable, fall back to direct file manipulation using `parseRoadmap`/`serializeRoadmap` from core to read, modify, and write `docs/roadmap.md`.
164
+ - If `manage_roadmap` is unavailable, fall back to direct file manipulation using `parseRoadmap`/`serializeRoadmap` from core to read, modify, and write `docs/roadmap.md`. Warn: "External sync skipped (MCP unavailable). Run `manage_roadmap sync` when MCP is restored to push changes to GitHub."
165
165
  - If no roadmap exists, skip this step silently.
166
166
 
167
167
  7. **Write handoff and suggest transition.** After the human approves the spec:
@@ -50,3 +50,8 @@ state:
50
50
  persistent: false
51
51
  files: []
52
52
  depends_on: []
53
+ addresses:
54
+ - signal: high-complexity
55
+ weight: 0.5
56
+ - signal: high-coupling
57
+ weight: 0.4
@@ -63,3 +63,8 @@ depends_on:
63
63
  - cleanup-dead-code
64
64
  - enforce-architecture
65
65
  - harness-hotspot-detector
66
+ addresses:
67
+ - signal: dead-code
68
+ weight: 0.8
69
+ - signal: drift
70
+ weight: 0.6
@@ -46,3 +46,8 @@ state:
46
46
  files:
47
47
  - .harness/debug/
48
48
  depends_on: []
49
+ addresses:
50
+ - signal: perf-regression
51
+ weight: 0.5
52
+ - signal: anomaly-outlier
53
+ weight: 0.6
@@ -40,3 +40,12 @@ state:
40
40
  persistent: false
41
41
  files: []
42
42
  depends_on: []
43
+ addresses:
44
+ - signal: high-coupling
45
+ metric: fanOut
46
+ threshold: 15
47
+ weight: 0.7
48
+ - signal: anomaly-outlier
49
+ weight: 0.6
50
+ - signal: articulation-point
51
+ weight: 0.5
@@ -293,7 +293,7 @@ Skipping this step means subsequent graph queries (impact analysis, dependency h
293
293
 
294
294
  This overwrites any previous summary for this session. The index.md is updated automatically.
295
295
 
296
- 6. **Sync roadmap (mandatory when present).** If `docs/roadmap.md` exists, call `manage_roadmap` with action `sync` and `apply: true` to update linked feature statuses from the just-completed execution state. Do not use `force_sync: true` — the human-always-wins rule applies. If `manage_roadmap` is unavailable, fall back to direct file manipulation using `syncRoadmap()` from core. If no roadmap exists, skip silently.
296
+ 6. **Sync roadmap (mandatory when present).** If `docs/roadmap.md` exists, call `manage_roadmap` with action `sync` and `apply: true` to update linked feature statuses from the just-completed execution state. Do not use `force_sync: true` — the human-always-wins rule applies. If `manage_roadmap` is unavailable, fall back to direct file manipulation using `syncRoadmap()` from core and warn: "External sync skipped (MCP unavailable). Run `manage_roadmap sync` when MCP is restored to push changes to GitHub." If no roadmap exists, skip silently.
297
297
 
298
298
  7. **Learnings are append-only.** Never edit or delete previous learnings. They are a chronological record.
299
299
 
@@ -43,3 +43,12 @@ state:
43
43
  persistent: false
44
44
  files: []
45
45
  depends_on: []
46
+ addresses:
47
+ - signal: high-complexity
48
+ metric: cyclomaticComplexity
49
+ threshold: 20
50
+ weight: 0.9
51
+ - signal: anomaly-outlier
52
+ weight: 0.7
53
+ - signal: articulation-point
54
+ weight: 0.8
@@ -46,3 +46,8 @@ state:
46
46
  depends_on:
47
47
  - harness-verify
48
48
  - harness-code-review
49
+ addresses:
50
+ - signal: drift
51
+ weight: 0.7
52
+ - signal: dead-code
53
+ weight: 0.5
@@ -49,3 +49,6 @@ state:
49
49
  files: []
50
50
  depends_on:
51
51
  - harness-verify
52
+ addresses:
53
+ - signal: perf-regression
54
+ weight: 0.8
@@ -32,3 +32,12 @@ state:
32
32
  persistent: false
33
33
  files: []
34
34
  depends_on: []
35
+ addresses:
36
+ - signal: high-complexity
37
+ metric: cyclomaticComplexity
38
+ threshold: 15
39
+ weight: 0.8
40
+ - signal: high-coupling
41
+ metric: couplingRatio
42
+ threshold: 0.5
43
+ weight: 0.6
@@ -92,7 +92,7 @@ Unmatched plans: N (flag for review)
92
92
  - One H2 section per milestone
93
93
  - One H3 section per feature with 5 fields: `Status`, `Spec`, `Summary`, `Blockers`, `Plan`
94
94
 
95
- 2. Write via `manage_roadmap` MCP tool if available. If MCP is unavailable, write directly using the roadmap markdown format:
95
+ 2. Write via `manage_roadmap` MCP tool if available. If MCP is unavailable, write directly using the roadmap markdown format and warn: "External sync skipped (MCP unavailable). Run `manage_roadmap sync` when MCP is restored to push changes to GitHub."
96
96
 
97
97
  ```markdown
98
98
  ---
@@ -173,7 +173,7 @@ Wait for confirmation before proceeding.
173
173
 
174
174
  #### Phase 3: WRITE -- Add Feature to Roadmap
175
175
 
176
- 1. Add via `manage_roadmap add` MCP tool if available. If MCP is unavailable, parse the roadmap, add the feature to the specified milestone, and serialize back.
176
+ 1. Add via `manage_roadmap add` MCP tool if available. If MCP is unavailable, parse the roadmap, add the feature to the specified milestone, and serialize back. Warn: "External sync skipped (MCP unavailable). Run `manage_roadmap sync` when MCP is restored to push changes to GitHub."
177
177
  2. If the milestone is `[NEW]`: create the milestone section, then add the feature.
178
178
  3. Write to `docs/roadmap.md`.
179
179
 
@@ -276,7 +276,7 @@ Wait for confirmation before proceeding.
276
276
 
277
277
  #### Phase 3: WRITE -- Apply Changes
278
278
 
279
- 1. Apply via `manage_roadmap sync` MCP tool if available, or via `manage_roadmap update` for each changed feature. If MCP is unavailable, parse the roadmap, update statuses, and serialize back.
279
+ 1. Apply via `manage_roadmap sync` MCP tool if available, or via `manage_roadmap update` for each changed feature. If MCP is unavailable, parse the roadmap, update statuses, and serialize back. Warn: "External sync skipped (MCP unavailable). Run `manage_roadmap sync` when MCP is restored to push changes to GitHub."
280
280
  2. Update `last_synced` timestamp in frontmatter.
281
281
  3. Write to `docs/roadmap.md`.
282
282
 
@@ -378,7 +378,7 @@ Choice?
378
378
  ```
379
379
 
380
380
  2. Wait for confirmation before writing.
381
- 3. Apply all changes via `manage_roadmap update` / `manage_roadmap remove` MCP tool calls, or direct file manipulation if MCP is unavailable.
381
+ 3. Apply all changes via `manage_roadmap update` / `manage_roadmap remove` MCP tool calls, or direct file manipulation if MCP is unavailable. If falling back to direct manipulation, warn: "External sync skipped (MCP unavailable). Run `manage_roadmap sync` when MCP is restored to push changes to GitHub."
382
382
  4. Update `last_manual_edit` timestamp in frontmatter (since this is a human-driven edit).
383
383
  5. Write to `docs/roadmap.md`.
384
384
 
@@ -592,4 +592,4 @@ These are hard stops. Violating any gate means the process has broken down.
592
592
 
593
593
  - **When no specs or plans are found during `--create`:** Suggest creating a minimal roadmap with just a Backlog milestone containing features described verbally by the human. Alternatively, suggest running `harness:brainstorming` first to generate specs that can then be discovered by `--create`.
594
594
  - **When the roadmap file is malformed and cannot be parsed:** Report the specific parse error with line numbers if available. Suggest manual inspection of `docs/roadmap.md` or recreation with `--create` (after backing up the existing file).
595
- - **When MCP tool is unavailable:** Fall back to direct file manipulation via Read/Write tools using the roadmap markdown format. The core `parseRoadmap`/`serializeRoadmap` functions handle the format. Report the fallback to the human: "MCP tool unavailable, using direct file operations."
595
+ - **When MCP tool is unavailable:** Fall back to direct file manipulation via Read/Write tools using the roadmap markdown format. The core `parseRoadmap`/`serializeRoadmap` functions handle the format. Report the fallback to the human: "MCP tool unavailable, using direct file operations. External sync skipped — run `manage_roadmap sync` when MCP is restored to push changes to GitHub."
@@ -82,21 +82,26 @@ Proceed with Feature A? (y/n/pick another)
82
82
 
83
83
  ### Phase 4: ASSIGN -- Execute Assignment and Transition
84
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)
85
+ 1. Call `manage_roadmap` with action `update` to assign the feature:
88
86
 
89
- 2. Serialize and write the updated roadmap to `docs/roadmap.md`.
87
+ ```json
88
+ manage_roadmap({
89
+ path: "<project-root>",
90
+ action: "update",
91
+ feature: "<feature-name>",
92
+ assignee: "<currentUser>"
93
+ })
94
+ ```
90
95
 
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
96
+ - This updates the feature's `Assignee` field with assignment history tracking
97
+ - Automatically triggers external sync (GitHub Issues) if tracker config exists in `harness.config.json`
98
+ - External sync is fire-and-forget — errors are logged but do not block the assignment
94
99
 
95
- 4. Determine the transition target:
100
+ 2. Determine the transition target:
96
101
  - If the feature has a `spec` field (non-null): transition to `harness:autopilot`
97
102
  - If the feature has no `spec`: transition to `harness:brainstorming`
98
103
 
99
- 5. Present the transition to the human via `emit_interaction`:
104
+ 3. Present the transition to the human via `emit_interaction`:
100
105
 
101
106
  ```json
102
107
  emit_interaction({
@@ -122,7 +127,7 @@ Proceed with Feature A? (y/n/pick another)
122
127
  })
123
128
  ```
124
129
 
125
- 6. Run `harness validate`.
130
+ 4. Run `harness validate`.
126
131
 
127
132
  ---
128
133
 
@@ -130,10 +135,9 @@ Proceed with Feature A? (y/n/pick another)
130
135
 
131
136
  - **`parseRoadmap` / `serializeRoadmap`** -- Parse and write `docs/roadmap.md`. Import from `@harness-engineering/core`.
132
137
  - **`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).
138
+ - **`manage_roadmap update`** -- Used for assignment. Supports `assignee` field which delegates to `assignFeature` internally, handles history tracking, and automatically triggers external sync (GitHub Issues).
134
139
  - **`emit_interaction`** -- Used for the skill transition at the end. Transitions to `harness:brainstorming` (no spec) or `harness:autopilot` (spec exists).
135
140
  - **`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
141
 
138
142
  ## Success Criteria
139
143
 
@@ -183,10 +187,10 @@ Human confirms **y**.
183
187
  **Phase 4: ASSIGN**
184
188
 
185
189
  ```
186
- Assigned: Graph Connector -> @cwarner
190
+ manage_roadmap update: Graph Connector assignee -> @cwarner
187
191
  History: +1 record (assigned, 2026-04-02)
188
192
  Roadmap updated: docs/roadmap.md
189
- External sync: github:harness-eng/harness#43 assigned
193
+ External sync: github:harness-eng/harness#43 assigned (automatic)
190
194
 
191
195
  Transitioning to harness:autopilot (spec exists)...
192
196
  ```
@@ -40,3 +40,6 @@ state:
40
40
  persistent: false
41
41
  files: []
42
42
  depends_on: []
43
+ addresses:
44
+ - signal: security-findings
45
+ hard: true
@@ -47,3 +47,8 @@ state:
47
47
  persistent: false
48
48
  files: []
49
49
  depends_on: []
50
+ addresses:
51
+ - signal: layer-violations
52
+ weight: 0.6
53
+ - signal: circular-deps
54
+ weight: 0.5
@@ -49,3 +49,6 @@ state:
49
49
  files: []
50
50
  depends_on:
51
51
  - harness-security-scan
52
+ addresses:
53
+ - signal: security-findings
54
+ weight: 0.6
@@ -47,3 +47,6 @@ state:
47
47
  files: []
48
48
  depends_on:
49
49
  - harness-verification
50
+ addresses:
51
+ - signal: low-coverage
52
+ weight: 0.9