@opengsd/gsd-core 1.12.0 → 1.13.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 (286) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.opencode/plugins/gsd-core.js +12 -0
  4. package/agents/gsd-executor.md +63 -35
  5. package/agents/gsd-plan-checker.md +76 -57
  6. package/agents/gsd-planner.md +14 -0
  7. package/agents/gsd-ui-checker.md +19 -3
  8. package/agents/gsd-ui-researcher.md +29 -0
  9. package/agents/gsd-verifier.md +23 -1
  10. package/bin/install.js +239 -67
  11. package/commands/gsd/execute-phase.md +1 -1
  12. package/commands/gsd/ns-workflow.md +2 -1
  13. package/commands/gsd/phase.md +1 -1
  14. package/commands/gsd/quick-batch.md +105 -0
  15. package/commands/gsd/surface.md +18 -8
  16. package/gsd-core/bin/gsd-tools.cjs +195 -50
  17. package/gsd-core/bin/lib/capability-activation.cjs +27 -0
  18. package/gsd-core/bin/lib/capability-registry.cjs +514 -114
  19. package/gsd-core/bin/lib/capability-state.cjs +7 -1
  20. package/gsd-core/bin/lib/capability-validator.cjs +120 -4
  21. package/gsd-core/bin/lib/capability-writer.cjs +14 -4
  22. package/gsd-core/bin/lib/check-command-router.cjs +85 -2
  23. package/gsd-core/bin/lib/claude-orchestration.cjs +10 -25
  24. package/gsd-core/bin/lib/clusters.cjs +1 -0
  25. package/gsd-core/bin/lib/command-aliases.cjs +16 -0
  26. package/gsd-core/bin/lib/commands.cjs +337 -13
  27. package/gsd-core/bin/lib/config-loader.cjs +3 -0
  28. package/gsd-core/bin/lib/core-utils.cjs +34 -7
  29. package/gsd-core/bin/lib/decisions.cjs +213 -1
  30. package/gsd-core/bin/lib/edge-probe.cjs +14 -1
  31. package/gsd-core/bin/lib/file-overlap-partitioner.cjs +74 -0
  32. package/gsd-core/bin/lib/frontmatter.cjs +137 -23
  33. package/gsd-core/bin/lib/gap-checker.cjs +22 -13
  34. package/gsd-core/bin/lib/git-base-branch.cjs +10 -2
  35. package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +8 -2
  36. package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +54 -11
  37. package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +75 -22
  38. package/gsd-core/bin/lib/host-integration.cjs +57 -5
  39. package/gsd-core/bin/lib/init-command-router.cjs +14 -0
  40. package/gsd-core/bin/lib/init.cjs +132 -15
  41. package/gsd-core/bin/lib/install-engine.cjs +184 -12
  42. package/gsd-core/bin/lib/install-model-override-resolver.cjs +45 -0
  43. package/gsd-core/bin/lib/install-profiles.cjs +22 -14
  44. package/gsd-core/bin/lib/installer-migration-report.cjs +1 -0
  45. package/gsd-core/bin/lib/io.cjs +35 -0
  46. package/gsd-core/bin/lib/loop-resolver.cjs +14 -8
  47. package/gsd-core/bin/lib/markdown-table.cjs +123 -0
  48. package/gsd-core/bin/lib/milestone.cjs +22 -2
  49. package/gsd-core/bin/lib/phase-command-router.cjs +13 -6
  50. package/gsd-core/bin/lib/phase-id.cjs +251 -9
  51. package/gsd-core/bin/lib/phase.cjs +774 -35
  52. package/gsd-core/bin/lib/plan-document.cjs +10 -0
  53. package/gsd-core/bin/lib/planning-snapshot.cjs +147 -20
  54. package/gsd-core/bin/lib/planning-workspace.cjs +103 -28
  55. package/gsd-core/bin/lib/quick-batch-command-router.cjs +285 -0
  56. package/gsd-core/bin/lib/quick-batch-dispatch.cjs +250 -0
  57. package/gsd-core/bin/lib/quick-batch.cjs +840 -0
  58. package/gsd-core/bin/lib/review-lane-descriptor.cjs +53 -5
  59. package/gsd-core/bin/lib/review-lane-invocation.cjs +73 -1
  60. package/gsd-core/bin/lib/review-lane-runner.cjs +136 -10
  61. package/gsd-core/bin/lib/roadmap-parser.cjs +499 -26
  62. package/gsd-core/bin/lib/roadmap.cjs +187 -58
  63. package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +233 -33
  64. package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +16 -17
  65. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +286 -108
  66. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +215 -43
  67. package/gsd-core/bin/lib/shell-command-projection.cjs +4 -0
  68. package/gsd-core/bin/lib/smart-entry.cjs +7 -9
  69. package/gsd-core/bin/lib/state-document.cjs +30 -5
  70. package/gsd-core/bin/lib/state-md-schema.cjs +23 -13
  71. package/gsd-core/bin/lib/state-transition.cjs +333 -44
  72. package/gsd-core/bin/lib/state.cjs +684 -125
  73. package/gsd-core/bin/lib/surface.cjs +23 -8
  74. package/gsd-core/bin/lib/tdd-red-evidence.cjs +133 -0
  75. package/gsd-core/bin/lib/uat.cjs +1419 -515
  76. package/gsd-core/bin/lib/update-context.cjs +6 -2
  77. package/gsd-core/bin/lib/validate.cjs +230 -12
  78. package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
  79. package/gsd-core/bin/lib/verification.cjs +273 -12
  80. package/gsd-core/bin/lib/verify-command-router.cjs +1 -0
  81. package/gsd-core/bin/lib/verify.cjs +346 -16
  82. package/gsd-core/bin/lib/workstream-inventory.cjs +20 -2
  83. package/gsd-core/bin/lib/worktree-safety.cjs +8 -0
  84. package/gsd-core/bin/shared/config-schema.manifest.json +8 -0
  85. package/gsd-core/bin/verify-reapply-patches.cjs +70 -3
  86. package/gsd-core/references/agent-contracts.md +3 -3
  87. package/gsd-core/references/edge-probe.md +17 -13
  88. package/gsd-core/references/execute-mvp-tdd.md +18 -16
  89. package/gsd-core/references/execute-phase-response-language.md +6 -0
  90. package/gsd-core/references/executor-examples.md +42 -0
  91. package/gsd-core/references/few-shot-examples/plan-checker.md +15 -15
  92. package/gsd-core/references/mvp-concepts.md +2 -2
  93. package/gsd-core/references/plan-checker-examples.md +41 -0
  94. package/gsd-core/references/planner-antipatterns.md +25 -0
  95. package/gsd-core/references/planner-chunked.md +5 -1
  96. package/gsd-core/references/planner-coupling.md +42 -0
  97. package/gsd-core/references/planner-quick-batch.md +71 -0
  98. package/gsd-core/references/planner-reviews.md +47 -0
  99. package/gsd-core/references/planner-revision.md +75 -2
  100. package/gsd-core/references/planning-config.md +2 -1
  101. package/gsd-core/references/response-language-directive.md +9 -0
  102. package/gsd-core/references/revision-loop.md +118 -11
  103. package/gsd-core/references/tdd.md +14 -9
  104. package/gsd-core/references/verifier-evidence-gate.md +160 -0
  105. package/gsd-core/templates/phase-prompt.md +4 -0
  106. package/gsd-core/templates/verification-report.md +5 -0
  107. package/gsd-core/workflows/add-backlog.md +2 -0
  108. package/gsd-core/workflows/add-phase.md +2 -0
  109. package/gsd-core/workflows/add-tests.md +1 -1
  110. package/gsd-core/workflows/add-todo.md +1 -1
  111. package/gsd-core/workflows/ai-integration-phase.md +1 -1
  112. package/gsd-core/workflows/analyze-dependencies.md +2 -0
  113. package/gsd-core/workflows/audit-fix.md +2 -0
  114. package/gsd-core/workflows/audit-milestone.md +2 -0
  115. package/gsd-core/workflows/audit-uat.md +2 -0
  116. package/gsd-core/workflows/autonomous.md +2 -0
  117. package/gsd-core/workflows/check-todos.md +1 -1
  118. package/gsd-core/workflows/cleanup.md +1 -1
  119. package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +15 -13
  120. package/gsd-core/workflows/code-review-fix.md +2 -0
  121. package/gsd-core/workflows/code-review.md +73 -31
  122. package/gsd-core/workflows/complete-milestone.md +13 -4
  123. package/gsd-core/workflows/debug.md +1 -1
  124. package/gsd-core/workflows/diagnose-issues.md +5 -1
  125. package/gsd-core/workflows/discuss-phase/modes/advisor.md +2 -0
  126. package/gsd-core/workflows/discuss-phase/modes/all.md +2 -0
  127. package/gsd-core/workflows/discuss-phase/modes/analyze.md +2 -0
  128. package/gsd-core/workflows/discuss-phase/modes/auto.md +2 -0
  129. package/gsd-core/workflows/discuss-phase/modes/batch.md +2 -0
  130. package/gsd-core/workflows/discuss-phase/modes/chain.md +2 -0
  131. package/gsd-core/workflows/discuss-phase/modes/default.md +2 -0
  132. package/gsd-core/workflows/discuss-phase/modes/power.md +2 -0
  133. package/gsd-core/workflows/discuss-phase/modes/text.md +2 -0
  134. package/gsd-core/workflows/discuss-phase/templates/context.md +2 -0
  135. package/gsd-core/workflows/discuss-phase/templates/discussion-log.md +2 -0
  136. package/gsd-core/workflows/discuss-phase-assumptions.md +1 -1
  137. package/gsd-core/workflows/discuss-phase-power.md +2 -0
  138. package/gsd-core/workflows/discuss-phase.md +1 -1
  139. package/gsd-core/workflows/do.md +43 -13
  140. package/gsd-core/workflows/docs-update.md +1 -1
  141. package/gsd-core/workflows/edit-phase.md +2 -0
  142. package/gsd-core/workflows/eval-review.md +1 -1
  143. package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +2 -0
  144. package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +17 -1
  145. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +8 -2
  146. package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +2 -0
  147. package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +25 -0
  148. package/gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md +2 -0
  149. package/gsd-core/workflows/execute-phase.md +32 -14
  150. package/gsd-core/workflows/execute-plan.md +8 -8
  151. package/gsd-core/workflows/explore.md +2 -0
  152. package/gsd-core/workflows/extract-learnings.md +2 -0
  153. package/gsd-core/workflows/fast.md +6 -0
  154. package/gsd-core/workflows/forensics.md +2 -0
  155. package/gsd-core/workflows/graduation.md +1 -1
  156. package/gsd-core/workflows/health.md +1 -1
  157. package/gsd-core/workflows/help/modes/brief.md +2 -0
  158. package/gsd-core/workflows/help/modes/default.md +2 -0
  159. package/gsd-core/workflows/help/modes/full.md +12 -0
  160. package/gsd-core/workflows/help/modes/topic.md +2 -0
  161. package/gsd-core/workflows/help.md +2 -0
  162. package/gsd-core/workflows/import.md +3 -3
  163. package/gsd-core/workflows/inbox.md +1 -1
  164. package/gsd-core/workflows/ingest-docs.md +1 -1
  165. package/gsd-core/workflows/insert-phase.md +2 -0
  166. package/gsd-core/workflows/list-phase-assumptions.md +2 -0
  167. package/gsd-core/workflows/list-seeds.md +2 -0
  168. package/gsd-core/workflows/list-workspaces.md +2 -0
  169. package/gsd-core/workflows/manager.md +3 -3
  170. package/gsd-core/workflows/map-codebase.md +2 -0
  171. package/gsd-core/workflows/milestone-summary.md +2 -0
  172. package/gsd-core/workflows/mvp-phase.md +1 -1
  173. package/gsd-core/workflows/new-milestone.md +1 -1
  174. package/gsd-core/workflows/new-project.md +5 -3
  175. package/gsd-core/workflows/new-workspace.md +1 -1
  176. package/gsd-core/workflows/next.md +2 -0
  177. package/gsd-core/workflows/node-repair.md +2 -0
  178. package/gsd-core/workflows/note.md +2 -0
  179. package/gsd-core/workflows/onboard.md +1 -1
  180. package/gsd-core/workflows/pause-work.md +19 -4
  181. package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +100 -18
  182. package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +2 -0
  183. package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +9 -0
  184. package/gsd-core/workflows/plan-phase.md +130 -12
  185. package/gsd-core/workflows/plan-review-convergence.md +102 -10
  186. package/gsd-core/workflows/plant-seed.md +1 -1
  187. package/gsd-core/workflows/pr-branch.md +11 -3
  188. package/gsd-core/workflows/profile-user.md +1 -1
  189. package/gsd-core/workflows/progress/steps/forensic-audit.md +1 -1
  190. package/gsd-core/workflows/progress.md +25 -3
  191. package/gsd-core/workflows/quick/steps/plan-checker-loop.md +37 -2
  192. package/gsd-core/workflows/quick/steps/research-phase.md +3 -3
  193. package/gsd-core/workflows/quick-batch/steps/batch-init.md +55 -0
  194. package/gsd-core/workflows/quick-batch/steps/completion.md +65 -0
  195. package/gsd-core/workflows/quick-batch/steps/merge-wave.md +100 -0
  196. package/gsd-core/workflows/quick-batch/steps/plan-checker-loop.md +147 -0
  197. package/gsd-core/workflows/quick-batch/steps/planner-wave.md +158 -0
  198. package/gsd-core/workflows/quick-batch/steps/research-phase.md +95 -0
  199. package/gsd-core/workflows/quick-batch/steps/resume-mode.md +49 -0
  200. package/gsd-core/workflows/quick-batch/steps/verification-wave.md +73 -0
  201. package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +169 -0
  202. package/gsd-core/workflows/quick-batch.md +203 -0
  203. package/gsd-core/workflows/quick.md +13 -3
  204. package/gsd-core/workflows/reapply-patches.md +2 -0
  205. package/gsd-core/workflows/remove-phase.md +2 -0
  206. package/gsd-core/workflows/remove-workspace.md +1 -1
  207. package/gsd-core/workflows/resume-project.md +6 -2
  208. package/gsd-core/workflows/review.md +215 -10
  209. package/gsd-core/workflows/scan.md +2 -0
  210. package/gsd-core/workflows/section-manifest.json +12 -0
  211. package/gsd-core/workflows/secure-phase.md +1 -1
  212. package/gsd-core/workflows/session-report.md +2 -0
  213. package/gsd-core/workflows/settings-advanced.md +2 -0
  214. package/gsd-core/workflows/settings-integrations.md +9 -8
  215. package/gsd-core/workflows/settings.md +1 -1
  216. package/gsd-core/workflows/ship.md +10 -10
  217. package/gsd-core/workflows/sketch-wrap-up.md +2 -0
  218. package/gsd-core/workflows/sketch.md +1 -1
  219. package/gsd-core/workflows/smart-entry.md +1 -1
  220. package/gsd-core/workflows/spec-phase.md +24 -19
  221. package/gsd-core/workflows/spike-wrap-up.md +2 -0
  222. package/gsd-core/workflows/spike.md +1 -1
  223. package/gsd-core/workflows/stats.md +2 -0
  224. package/gsd-core/workflows/sync-skills.md +12 -4
  225. package/gsd-core/workflows/thread.md +2 -0
  226. package/gsd-core/workflows/transition.md +2 -0
  227. package/gsd-core/workflows/ui-phase.md +26 -5
  228. package/gsd-core/workflows/ui-review.md +1 -1
  229. package/gsd-core/workflows/ultraplan-phase.md +2 -0
  230. package/gsd-core/workflows/undo.md +1 -1
  231. package/gsd-core/workflows/update.md +41 -38
  232. package/gsd-core/workflows/validate-phase.md +1 -1
  233. package/gsd-core/workflows/verify-work.md +49 -3
  234. package/hooks/dist/gsd-check-update-worker.js +19 -2
  235. package/hooks/dist/gsd-context-monitor.js +283 -12
  236. package/hooks/dist/gsd-node-runner.sh +1 -0
  237. package/hooks/dist/gsd-prompt-guard.js +30 -5
  238. package/hooks/dist/gsd-read-guard.js +2 -0
  239. package/hooks/dist/gsd-read-injection-scanner.js +5 -5
  240. package/hooks/dist/gsd-secret-read-guard.js +1079 -0
  241. package/hooks/dist/gsd-statusline.js +7 -3
  242. package/hooks/dist/gsd-validate-commit.sh +444 -7
  243. package/hooks/dist/gsd-workflow-guard.js +2 -1
  244. package/hooks/dist/lib/git-cmd.js +210 -1
  245. package/hooks/dist/lib/injection-patterns.js +36 -6
  246. package/hooks/dist/managed-hooks-registry.cjs +1 -0
  247. package/hooks/gsd-check-update-worker.js +19 -2
  248. package/hooks/gsd-context-monitor.js +283 -12
  249. package/hooks/gsd-node-runner.sh +1 -0
  250. package/hooks/gsd-prompt-guard.js +30 -5
  251. package/hooks/gsd-read-guard.js +2 -0
  252. package/hooks/gsd-read-injection-scanner.js +5 -5
  253. package/hooks/gsd-secret-read-guard.js +1079 -0
  254. package/hooks/gsd-statusline.js +7 -3
  255. package/hooks/gsd-validate-commit.sh +444 -7
  256. package/hooks/gsd-workflow-guard.js +2 -1
  257. package/hooks/hooks.json +6 -0
  258. package/hooks/lib/git-cmd.js +210 -1
  259. package/hooks/lib/injection-patterns.js +36 -6
  260. package/hooks/managed-hooks-registry.cjs +1 -0
  261. package/package.json +5 -5
  262. package/scripts/build-hooks.js +11 -4
  263. package/scripts/ci-test-scope.cjs +7 -0
  264. package/scripts/docs-guard-registry.cjs +10 -0
  265. package/scripts/gen-loop-host-contract.cjs +67 -15
  266. package/scripts/lib/shellcheck-fetch.cjs +247 -0
  267. package/scripts/lint-allow-test-rule-refs.allowlist.json +0 -6
  268. package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +1 -1
  269. package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
  270. package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +5 -0
  271. package/scripts/lint-phase-enumeration-drift.cjs +24 -6
  272. package/scripts/lint-phase-id-drift.cjs +133 -8
  273. package/scripts/lint-portable-grep.cjs +176 -0
  274. package/scripts/lint-response-language-coverage.cjs +524 -0
  275. package/scripts/lint-test-file-count.allowlist.json +3 -1
  276. package/scripts/lint-workflow-shellcheck-baseline.json +1027 -0
  277. package/scripts/lint-workflow-shellcheck.cjs +614 -0
  278. package/scripts/npm-audit-baseline.cjs +376 -0
  279. package/scripts/prompt-injection-scan.sh +8 -0
  280. package/scripts/require-issue-link-policy.cjs +16 -1
  281. package/skills/gsd-execute-phase/SKILL.md +1 -1
  282. package/skills/gsd-ns-workflow/SKILL.md +1 -0
  283. package/skills/gsd-phase/SKILL.md +1 -1
  284. package/skills/gsd-quick-batch/SKILL.md +105 -0
  285. package/skills/gsd-surface/SKILL.md +18 -8
  286. package/vscode/package.json +1 -1
@@ -10,7 +10,7 @@ const capabilities = {
10
10
  "ai-integration": {
11
11
  "id": "ai-integration",
12
12
  "role": "feature",
13
- "version": "1.12.0",
13
+ "version": "1.13.0",
14
14
  "title": "AI design contract",
15
15
  "description": "AI-SPEC design contract workflow for phases that build AI systems; owns the AI integration command, agents, and workflow.ai_integration_phase activation key.",
16
16
  "tier": "full",
@@ -95,7 +95,7 @@ const capabilities = {
95
95
  "antigravity": {
96
96
  "id": "antigravity",
97
97
  "role": "runtime",
98
- "version": "1.12.0",
98
+ "version": "1.13.0",
99
99
  "title": "Antigravity",
100
100
  "description": "Google Antigravity IDE — config/settings home nested under ~/.gemini/antigravity (probed across 1.x and 2.x layouts); global skills/agents install under ~/.gemini/config, the dir AGY scans for global discovery (#3738); Gemini hook event dialect; flat skill layout; tier-1 support.",
101
101
  "tier": "core",
@@ -183,7 +183,8 @@ const capabilities = {
183
183
  "background": true,
184
184
  "subagentToolkit": "full",
185
185
  "backgroundDispatch": "undocumented",
186
- "isolation": "undocumented"
186
+ "isolation": "undocumented",
187
+ "maxConcurrency": "undocumented"
187
188
  },
188
189
  "modelMode": "passive",
189
190
  "hookBus": "host",
@@ -214,7 +215,7 @@ const capabilities = {
214
215
  "binary": "agy",
215
216
  "args": [
216
217
  "--print-timeout",
217
- "540s",
218
+ "{{nativeTimeout}}",
218
219
  "{{model}}",
219
220
  "-p",
220
221
  "{{prompt}}"
@@ -225,12 +226,15 @@ const capabilities = {
225
226
  "effortChannel": "none"
226
227
  },
227
228
  "timeoutFloorMs": 600000,
229
+ "timeoutConfigKey": "review.timeouts.antigravity",
228
230
  "emptyOutput": "handler-owned",
229
231
  "reviewsSection": "Antigravity",
230
232
  "evidenceClass": "source-grounded",
231
233
  "requiresBinaries": [],
232
234
  "promptBudgetKey": "review.max_prompt_tokens_per_reviewer.antigravity",
233
235
  "modelConfigKey": "review.models.agy",
236
+ "effortConfigKey": null,
237
+ "defaultEffort": null,
234
238
  "handler": "antigravity"
235
239
  },
236
240
  "config": {
@@ -243,13 +247,18 @@ const capabilities = {
243
247
  "type": "number",
244
248
  "default": -1,
245
249
  "description": "Prompt-token budget for the Antigravity reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\". Keyed on the reviewer slug `antigravity`, not the `agy` binary alias used by review.models.agy."
250
+ },
251
+ "review.timeouts.antigravity": {
252
+ "type": "number",
253
+ "default": -1,
254
+ "description": "Outer wall-clock timeout override (seconds) for the Antigravity reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
246
255
  }
247
256
  }
248
257
  },
249
258
  "assumption-delta": {
250
259
  "id": "assumption-delta",
251
260
  "role": "feature",
252
- "version": "1.12.0",
261
+ "version": "1.13.0",
253
262
  "title": "Assumption-delta architecture checkpoint",
254
263
  "description": "Rarely-firing advisory checkpoint that triggers when a phase makes something plural, optional, or chosen that used to be singular, required, or derived. Surfaces one identity-model question (promote the new general representation to primary, or add it alongside?) so a silent primary-key drift does not accumulate into a later user-facing bug. Non-blocking; fires only on a detected signal.",
255
264
  "tier": "full",
@@ -295,7 +304,7 @@ const capabilities = {
295
304
  "audit": {
296
305
  "id": "audit",
297
306
  "role": "feature",
298
- "version": "1.12.0",
307
+ "version": "1.13.0",
299
308
  "title": "Audit",
300
309
  "description": "Open-artifact audit and UAT-gap audit for milestone close gates; exposes `gsd-tools audit-uat` (cross-phase UAT outstanding items) and `gsd-tools audit-open` (structured open-artifact scan across debug, tasks, threads, todos, seeds, UAT, verification, context-questions).",
301
310
  "tier": "full",
@@ -332,7 +341,7 @@ const capabilities = {
332
341
  "augment": {
333
342
  "id": "augment",
334
343
  "role": "runtime",
335
- "version": "1.12.0",
344
+ "version": "1.13.0",
336
345
  "title": "Augment Code",
337
346
  "description": "Augment Code CLI — commands + nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
338
347
  "tier": "core",
@@ -431,7 +440,8 @@ const capabilities = {
431
440
  "background": true,
432
441
  "subagentToolkit": "full",
433
442
  "backgroundDispatch": "undocumented",
434
- "isolation": "undocumented"
443
+ "isolation": "undocumented",
444
+ "maxConcurrency": "undocumented"
435
445
  },
436
446
  "modelMode": "passive",
437
447
  "hookBus": "host",
@@ -445,7 +455,7 @@ const capabilities = {
445
455
  "broken-windows": {
446
456
  "id": "broken-windows",
447
457
  "role": "feature",
448
- "version": "1.12.0",
458
+ "version": "1.13.0",
449
459
  "title": "Broken-windows ledger",
450
460
  "description": "Cross-phase defect register accumulating stubs, TODOs, skipped tests, unrun verifies, and unmet truths into .planning/WINDOWS.md. When enforcement is enabled, it blocks /gsd-ship while any window is open unless explicitly waived with a recorded reason. Operationalizes GSD's no-defer discipline as a tracked artifact (issue #1950).",
451
461
  "tier": "full",
@@ -491,7 +501,7 @@ const capabilities = {
491
501
  "claude": {
492
502
  "id": "claude",
493
503
  "role": "runtime",
494
- "version": "1.12.0",
504
+ "version": "1.13.0",
495
505
  "title": "Claude Code",
496
506
  "description": "Anthropic Claude Code — primary development runtime; tier-1 support with full hook surface and skills-based global install.",
497
507
  "tier": "core",
@@ -575,7 +585,8 @@ const capabilities = {
575
585
  "background": true,
576
586
  "subagentToolkit": "full",
577
587
  "backgroundDispatch": false,
578
- "isolation": "harness-worktree"
588
+ "isolation": "harness-worktree",
589
+ "maxConcurrency": 20
579
590
  },
580
591
  "modelMode": "passive",
581
592
  "hookBus": "host",
@@ -634,12 +645,15 @@ const capabilities = {
634
645
  }
635
646
  },
636
647
  "timeoutFloorMs": 1200000,
648
+ "timeoutConfigKey": "review.timeouts.claude",
637
649
  "emptyOutput": "stub-with-stderr",
638
650
  "reviewsSection": "Claude",
639
651
  "evidenceClass": "source-grounded",
640
652
  "requiresBinaries": [],
641
653
  "promptBudgetKey": "review.max_prompt_tokens_per_reviewer.claude",
642
654
  "modelConfigKey": "review.models.claude",
655
+ "effortConfigKey": "review.effort.claude",
656
+ "defaultEffort": "high",
643
657
  "handler": null
644
658
  },
645
659
  "config": {
@@ -652,13 +666,23 @@ const capabilities = {
652
666
  "type": "number",
653
667
  "default": -1,
654
668
  "description": "Prompt-token budget for the Claude reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
669
+ },
670
+ "review.timeouts.claude": {
671
+ "type": "number",
672
+ "default": -1,
673
+ "description": "Outer wall-clock timeout override (seconds) for the Claude reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
674
+ },
675
+ "review.effort.claude": {
676
+ "type": "string",
677
+ "default": "",
678
+ "description": "Reasoning effort for the Claude reviewer lane: minimal, low, medium, high, xhigh, max, or inherit. Unset falls back to the lane's declared review default (high); inherit emits no effort argument so the CLI's own configuration decides. An unrecognized value falls back to the lane default rather than being forwarded."
655
679
  }
656
680
  }
657
681
  },
658
682
  "claude-orchestration": {
659
683
  "id": "claude-orchestration",
660
684
  "role": "feature",
661
- "version": "1.12.0",
685
+ "version": "1.13.0",
662
686
  "title": "Claude orchestration (Workflow backend)",
663
687
  "description": "Default-off, BETA, claude-only capability that adopts Claude Code's Workflow tool (the engine behind /effort ultracode) as an optional parallel-execution backend for the GSD loop. When the runtime exposes the Workflow tool and claude_orchestration.execution_backend resolves to 'workflow', execute-phase emits a generated Workflow script (waves -> parallel() barriers, plans -> agent({ agentType: 'gsd-executor', isolation: 'worktree' }), files_modified overlap -> separate sequential stages, resumeFromRunId wired to the phase run id, shared token budget) that composes the SAME gsd-executor agent and worktree isolation the inline path uses, restoring the wave parallelism the #853 backgrounded-agent nesting limitation forces inline on Claude Code. (The plan-checker and verifier remain inline until separately wired — this capability delivers the parallel-execution backend, not those gates.) Also folds the ultraplan plan-offload under one runtime gate (plan:* surface). On any runtime lacking the Workflow tool, or when the capability is disabled, behaviour is byte-identical to today (inline/manual dispatch). Detection + emission live in gsd-core/bin/lib/claude-orchestration.cjs (pure, fail-closed). Mirrors the existing gsd-ultraplan-phase BETA-isolation posture.",
664
688
  "tier": "full",
@@ -746,7 +770,7 @@ const capabilities = {
746
770
  "cline": {
747
771
  "id": "cline",
748
772
  "role": "runtime",
749
- "version": "1.12.0",
773
+ "version": "1.13.0",
750
774
  "title": "Cline",
751
775
  "description": "Cline (VS Code extension) — global-only nested-skill layout; cline-rules hook surface (.clinerules); no hook events emitted; tier-2 support.",
752
776
  "tier": "core",
@@ -816,7 +840,8 @@ const capabilities = {
816
840
  "background": true,
817
841
  "subagentToolkit": "read-only",
818
842
  "backgroundDispatch": false,
819
- "isolation": "undocumented"
843
+ "isolation": "undocumented",
844
+ "maxConcurrency": "undocumented"
820
845
  },
821
846
  "modelMode": "active",
822
847
  "hookBus": "host",
@@ -838,7 +863,7 @@ const capabilities = {
838
863
  "code-review": {
839
864
  "id": "code-review",
840
865
  "role": "feature",
841
- "version": "1.12.0",
866
+ "version": "1.13.0",
842
867
  "title": "Code review",
843
868
  "description": "Source-file code review and review-fix workflow support for completed execution work.",
844
869
  "tier": "full",
@@ -875,6 +900,15 @@ const capabilities = {
875
900
  ],
876
901
  "default": "standard",
877
902
  "description": "Default depth for code review when no --depth override is supplied."
903
+ },
904
+ "workflow.code_review_point": {
905
+ "type": "enum",
906
+ "values": [
907
+ "execute:post",
908
+ "execute:wave:post"
909
+ ],
910
+ "default": "execute:post",
911
+ "description": "Loop point at which the code-review step registers — execute:post reviews once per phase (default); execute:wave:post reviews once per completed wave, scoped to that wave's diff."
878
912
  }
879
913
  },
880
914
  "steps": [
@@ -890,6 +924,20 @@ const capabilities = {
890
924
  "SUMMARY.md"
891
925
  ],
892
926
  "when": "workflow.code_review",
927
+ "pointFrom": "workflow.code_review_point",
928
+ "onError": "skip"
929
+ },
930
+ {
931
+ "point": "execute:wave:post",
932
+ "ref": {
933
+ "skill": "code-review"
934
+ },
935
+ "produces": [
936
+ "REVIEW.md"
937
+ ],
938
+ "consumes": [],
939
+ "when": "workflow.code_review",
940
+ "pointFrom": "workflow.code_review_point",
893
941
  "onError": "skip"
894
942
  }
895
943
  ],
@@ -899,7 +947,7 @@ const capabilities = {
899
947
  "codebuddy": {
900
948
  "id": "codebuddy",
901
949
  "role": "runtime",
902
- "version": "1.12.0",
950
+ "version": "1.13.0",
903
951
  "title": "CodeBuddy",
904
952
  "description": "CodeBuddy (Tencent) — converted commands + skills artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
905
953
  "tier": "core",
@@ -999,7 +1047,8 @@ const capabilities = {
999
1047
  "background": true,
1000
1048
  "subagentToolkit": "full",
1001
1049
  "backgroundDispatch": false,
1002
- "isolation": "undocumented"
1050
+ "isolation": "undocumented",
1051
+ "maxConcurrency": "undocumented"
1003
1052
  },
1004
1053
  "modelMode": "passive",
1005
1054
  "hookBus": "host",
@@ -1016,7 +1065,7 @@ const capabilities = {
1016
1065
  "coderabbit": {
1017
1066
  "id": "coderabbit",
1018
1067
  "role": "reviewer",
1019
- "version": "1.12.0",
1068
+ "version": "1.13.0",
1020
1069
  "title": "CodeRabbit",
1021
1070
  "description": "CodeRabbit CLI — cross-AI /gsd:review reviewer lane only; not a GSD install target (no runtime body, no artifacts). Reviews the working-tree diff (`coderabbit review --prompt-only`), not the source tree, and accepts neither a prompt nor a model flag; findings are down-weighted in consensus (evidenceClass: diff-only).",
1022
1071
  "tier": "full",
@@ -1046,12 +1095,15 @@ const capabilities = {
1046
1095
  "effortChannel": "none"
1047
1096
  },
1048
1097
  "timeoutFloorMs": 360000,
1098
+ "timeoutConfigKey": null,
1049
1099
  "emptyOutput": "stub-with-stderr",
1050
1100
  "reviewsSection": "CodeRabbit",
1051
1101
  "evidenceClass": "diff-only",
1052
1102
  "requiresBinaries": [],
1053
1103
  "promptBudgetKey": "review.max_prompt_tokens_per_reviewer.coderabbit",
1054
1104
  "modelConfigKey": null,
1105
+ "effortConfigKey": null,
1106
+ "defaultEffort": null,
1055
1107
  "handler": null
1056
1108
  },
1057
1109
  "config": {
@@ -1065,7 +1117,7 @@ const capabilities = {
1065
1117
  "codex": {
1066
1118
  "id": "codex",
1067
1119
  "role": "runtime",
1068
- "version": "1.12.0",
1120
+ "version": "1.13.0",
1069
1121
  "title": "OpenAI Codex CLI",
1070
1122
  "description": "OpenAI Codex CLI — shell-var command style; per-agent sandbox tiers; config.toml + hooks.json hook surface; tier-1 support.",
1071
1123
  "tier": "core",
@@ -1149,7 +1201,8 @@ const capabilities = {
1149
1201
  "background": true,
1150
1202
  "subagentToolkit": "full",
1151
1203
  "backgroundDispatch": true,
1152
- "isolation": "orchestrator-worktree"
1204
+ "isolation": "orchestrator-worktree",
1205
+ "maxConcurrency": "undocumented"
1153
1206
  },
1154
1207
  "modelMode": "passive",
1155
1208
  "hookBus": "host",
@@ -1203,12 +1256,15 @@ const capabilities = {
1203
1256
  "effortChannel": "argv"
1204
1257
  },
1205
1258
  "timeoutFloorMs": 1200000,
1259
+ "timeoutConfigKey": "review.timeouts.codex",
1206
1260
  "emptyOutput": "stub-with-stderr",
1207
1261
  "reviewsSection": "Codex",
1208
1262
  "evidenceClass": "source-grounded",
1209
1263
  "requiresBinaries": [],
1210
1264
  "promptBudgetKey": "review.max_prompt_tokens_per_reviewer.codex",
1211
1265
  "modelConfigKey": "review.models.codex",
1266
+ "effortConfigKey": "review.effort.codex",
1267
+ "defaultEffort": "high",
1212
1268
  "handler": null
1213
1269
  },
1214
1270
  "config": {
@@ -1221,13 +1277,23 @@ const capabilities = {
1221
1277
  "type": "number",
1222
1278
  "default": -1,
1223
1279
  "description": "Prompt-token budget for the Codex reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
1280
+ },
1281
+ "review.timeouts.codex": {
1282
+ "type": "number",
1283
+ "default": -1,
1284
+ "description": "Outer wall-clock timeout override (seconds) for the Codex reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
1285
+ },
1286
+ "review.effort.codex": {
1287
+ "type": "string",
1288
+ "default": "",
1289
+ "description": "Reasoning effort for the Codex reviewer lane: minimal, low, medium, high, xhigh, max, or inherit. Unset falls back to the lane's declared review default (high); inherit emits no effort argument so the CLI's own configuration decides. An unrecognized value falls back to the lane default rather than being forwarded."
1224
1290
  }
1225
1291
  }
1226
1292
  },
1227
1293
  "copilot": {
1228
1294
  "id": "copilot",
1229
1295
  "role": "runtime",
1230
- "version": "1.12.0",
1296
+ "version": "1.13.0",
1231
1297
  "title": "GitHub Copilot",
1232
1298
  "description": "GitHub Copilot (VS Code) — markdown config format; copilot-inline hook surface; no hook events emitted; flat skill nesting (unconfirmed recursive loader); tier-2 support.",
1233
1299
  "tier": "core",
@@ -1306,7 +1372,8 @@ const capabilities = {
1306
1372
  "background": true,
1307
1373
  "subagentToolkit": "full",
1308
1374
  "backgroundDispatch": false,
1309
- "isolation": "undocumented"
1375
+ "isolation": "undocumented",
1376
+ "maxConcurrency": "undocumented"
1310
1377
  },
1311
1378
  "modelMode": "passive",
1312
1379
  "hookBus": "host",
@@ -1326,7 +1393,7 @@ const capabilities = {
1326
1393
  "cursor": {
1327
1394
  "id": "cursor",
1328
1395
  "role": "runtime",
1329
- "version": "1.12.0",
1396
+ "version": "1.13.0",
1330
1397
  "title": "Cursor",
1331
1398
  "description": "Cursor IDE — skills-only workflow surface; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.",
1332
1399
  "tier": "core",
@@ -1405,7 +1472,8 @@ const capabilities = {
1405
1472
  "background": true,
1406
1473
  "subagentToolkit": "full",
1407
1474
  "backgroundDispatch": true,
1408
- "isolation": "harness-worktree"
1475
+ "isolation": "harness-worktree",
1476
+ "maxConcurrency": "undocumented"
1409
1477
  },
1410
1478
  "modelMode": "passive",
1411
1479
  "hookBus": "host",
@@ -1453,6 +1521,7 @@ const capabilities = {
1453
1521
  "binary": "cursor-agent",
1454
1522
  "args": [
1455
1523
  "-p",
1524
+ "{{model}}",
1456
1525
  "--mode",
1457
1526
  "ask",
1458
1527
  "--trust",
@@ -1462,19 +1531,27 @@ const capabilities = {
1462
1531
  ],
1463
1532
  "promptChannel": "argv-file-ref",
1464
1533
  "outputChannel": "stdout",
1465
- "modelArg": null,
1534
+ "modelArg": "--model",
1466
1535
  "effortChannel": "none"
1467
1536
  },
1468
1537
  "timeoutFloorMs": 900000,
1538
+ "timeoutConfigKey": null,
1469
1539
  "emptyOutput": "stub-with-stderr",
1470
1540
  "reviewsSection": "Cursor",
1471
1541
  "evidenceClass": "source-grounded",
1472
1542
  "requiresBinaries": [],
1473
1543
  "promptBudgetKey": "review.max_prompt_tokens_per_reviewer.cursor",
1474
- "modelConfigKey": null,
1544
+ "modelConfigKey": "review.models.cursor",
1545
+ "effortConfigKey": null,
1546
+ "defaultEffort": null,
1475
1547
  "handler": null
1476
1548
  },
1477
1549
  "config": {
1550
+ "review.models.cursor": {
1551
+ "type": "string",
1552
+ "default": "",
1553
+ "description": "Model passed to the Cursor reviewer lane."
1554
+ },
1478
1555
  "review.max_prompt_tokens_per_reviewer.cursor": {
1479
1556
  "type": "number",
1480
1557
  "default": -1,
@@ -1485,7 +1562,7 @@ const capabilities = {
1485
1562
  "drift": {
1486
1563
  "id": "drift",
1487
1564
  "role": "feature",
1488
- "version": "1.12.0",
1565
+ "version": "1.13.0",
1489
1566
  "title": "Drift detection gates",
1490
1567
  "description": "Drift detection gates for the planning loop. At execute:wave:post: a blocking schema drift gate (detects schema files changed without a database push) and a non-blocking codebase drift gate (detects structural additions not reflected in STRUCTURE.md). At plan:pre: a non-blocking, warn-only codebase drift gate (gated on workflow.plan_drift_precheck) that flags a stale codebase map before planning, so plans are authored against a fresh STRUCTURE.md instead of discovering drift mid-execution.",
1491
1568
  "tier": "full",
@@ -1526,6 +1603,20 @@ const capabilities = {
1526
1603
  "type": "boolean",
1527
1604
  "default": true,
1528
1605
  "description": "Enable the non-blocking codebase drift pre-check at plan:pre, before /gsd:plan-phase spawns the planner. When enabled, a stale STRUCTURE.md (structural additions exceeding drift_threshold) is surfaced up front as a warn-only advisory pointing to /gsd:map-codebase; it never blocks planning and never spawns the mapper agent. Separate from schema_drift_gate so autonomous/CI runs can silence the plan-time advisory while keeping the execute:wave:post gates enabled."
1606
+ },
1607
+ "workflow.context_drift_precheck": {
1608
+ "type": "boolean",
1609
+ "default": true,
1610
+ "description": "Enable the non-blocking context-drift pre-check at plan:pre, before /gsd:plan-phase reuses an existing RESEARCH.md/PATTERNS.md/VALIDATION.md/SPEC.md. Compares each artifact's effective last-changed time (git commit time, falling back to mtime for uncommitted edits) against CONTEXT.md's own — an artifact that predates CONTEXT.md's newest decision was derived from a premise that has since changed. Warn-only by default (see workflow.context_drift_action); never blocks planning on its own."
1611
+ },
1612
+ "workflow.context_drift_action": {
1613
+ "type": "enum",
1614
+ "values": [
1615
+ "warn",
1616
+ "block"
1617
+ ],
1618
+ "default": "warn",
1619
+ "description": "Action taken by the context-drift gate when a stale upstream artifact is found: warn (advisory message naming the stale artifacts and how to regenerate them) or block (halt plan-phase until the artifacts are regenerated or the check is disabled)."
1529
1620
  }
1530
1621
  },
1531
1622
  "steps": [],
@@ -1557,15 +1648,24 @@ const capabilities = {
1557
1648
  "when": "workflow.plan_drift_precheck",
1558
1649
  "blocking": false,
1559
1650
  "onError": "skip"
1651
+ },
1652
+ {
1653
+ "point": "plan:pre",
1654
+ "check": {
1655
+ "query": "verify.context-drift"
1656
+ },
1657
+ "when": "workflow.context_drift_precheck",
1658
+ "blocking": false,
1659
+ "onError": "skip"
1560
1660
  }
1561
1661
  ]
1562
1662
  },
1563
1663
  "external-job": {
1564
1664
  "id": "external-job",
1565
1665
  "role": "feature",
1566
- "version": "1.12.0",
1666
+ "version": "1.13.0",
1567
1667
  "title": "Async external-job scheduler adapter",
1568
- "description": "Default-off producer of the async external-job manifest (#1164). At execute:wave:post an executor can externalize long-running compute (SLURM first, scheduler-pluggable), commit a .planning/async-jobs/<job>.json manifest, defer SUMMARY.md, and return external_job_waiting. The core loop (#1165) consumes the manifest; this capability is the only thing that writes it. NOTE on contribution point: #1164 specifies execute:wave:pre, but execute-phase.md only dispatches execute:wave:post today (wave:pre is declared in the loop host contract but not rendered); wiring wave:pre dispatch is a core-loop change #1164 explicitly puts out of scope, so this capability registers at wave:post and the executor honors the runtime_budget classification guidance before running any tagged task. The adapter (scripts/slurm-adapter.cjs) reads external_job.submit_timeout_ms / poll_timeout_ms / artifact_dir through the canonical capability-config seam (env override > config > registry default).",
1668
+ "description": "Default-off producer of the async external-job manifest (#1164). At execute:wave:post an executor can externalize long-running compute (SLURM first, scheduler-pluggable), commit a .planning/async-jobs/<job>.json manifest, defer SUMMARY.md, and return external_job_waiting. The core loop (#1165) consumes the manifest; this capability is the only thing that writes it. NOTE on contribution point: #1164 specifies classification at execute:wave:pre and recording at execute:wave:post. This capability still contributes executor guidance at wave:post; execute-phase now renders wave:pre entries and dispatches generic step hooks there independently. Moving external-job classification to wave:pre is a separate capability change, not part of #4148. The adapter (scripts/slurm-adapter.cjs) reads external_job.submit_timeout_ms / poll_timeout_ms / artifact_dir through the canonical capability-config seam (env override > config > registry default).",
1569
1669
  "tier": "full",
1570
1670
  "requires": [],
1571
1671
  "engines": {
@@ -1617,7 +1717,7 @@ const capabilities = {
1617
1717
  "into": "executor",
1618
1718
  "fragment": {
1619
1719
  "path": "fragments/execute-wave-post.md",
1620
- "inline": "<!-- external-job capability — execute:wave:post fragment, injected into the executor (#1164).\n\n Why wave:post, not wave:pre (#1164 refinement A): execute-phase.md only\n dispatches execute:wave:post today — wave:pre is declared in the loop host\n contract but not rendered. Wiring wave:pre dispatch is a core-loop change\n #1164 puts out of scope. The executor therefore honors this classification\n guidance BEFORE running any task tagged <runtime_budget>long_compute</runtime_budget>,\n whether in the current or a subsequent wave, and externalizes rather than\n blocking the turn. -->\n\n## Externalize long-running compute (async external job)\n\nIf the current plan's task is tagged `<runtime_budget>long_compute</runtime_budget>`\n(see the plan-phase fragment), do **not** run it in the foreground — it would\nblock the agent turn for hours. Instead externalize it and record a durable\nhalf-state:\n\n1. **Classify the runtime.** `quick` (<2 min) and `medium` (<~30 min) run\n normally. `unknown` requires a first-health check and a soft-review deadline\n before consuming the child timeout. `long_compute` (>30–60 min) is\n externalized.\n2. **Submit via the scheduler adapter** (default `external_job.backend: slurm`):\n ```bash\n node scripts/slurm-adapter.cjs submit \\\n --plan <plan_id> --phase <phase> -- sbatch --parsable \\\n --output=Artifacts/jobs/%j/out.log ./run.sh\n ```\n The helper writes `.planning/async-jobs/<job>.json` (the versioned stability\n contract — `docs/reference/planning-artifacts.md`) and refuses to create a\n second non-terminal manifest for a `plan_id` that already has one\n (duplicate-execution guard).\n3. **Commit the manifest + a handoff**, then return **`external_job_waiting`**\n and stop. Do **not** write `SUMMARY.md` — SUMMARY is deferred until the job\n reaches a terminal state and its `expected_artifacts` are verified.\n4. **Resume path.** `execute-phase` safe-resume, `resume-project`, and\n `pause-work` reconcile against the manifest and never re-dispatch the plan.\n When the job is `completed-unverified`, run `verification_command` (surface\n it; it is untrusted — confirm before executing), then write `SUMMARY.md` and\n close the plan.\n\nManifest commands cross a trust seam: a Capability (or anything that can write\n`.planning/`) produces them; the core loop consumes them. Never auto-run\n`submit_command` / `verification_command` / `resume_command` — surface the exact\ncommand and require explicit confirmation first.\n"
1720
+ "inline": "<!-- external-job capability — execute:wave:post fragment, injected into the executor (#1164).\n\n #1164 specifies classification at wave:pre and recording at wave:post. This\n capability still contributes executor guidance at wave:post; execute-phase\n now renders wave:pre entries and dispatches generic step hooks there. Moving\n external-job classification is a separate capability change, not part of\n #4148. Until then, this guidance cannot classify the wave that already ran. -->\n\n## Externalize long-running compute (async external job)\n\nIf the current plan's task is tagged `<runtime_budget>long_compute</runtime_budget>`\n(see the plan-phase fragment), do **not** run it in the foreground — it would\nblock the agent turn for hours. Instead externalize it and record a durable\nhalf-state:\n\n1. **Classify the runtime.** `quick` (<2 min) and `medium` (<~30 min) run\n normally. `unknown` requires a first-health check and a soft-review deadline\n before consuming the child timeout. `long_compute` (>30–60 min) is\n externalized.\n2. **Submit via the scheduler adapter** (default `external_job.backend: slurm`):\n ```bash\n node scripts/slurm-adapter.cjs submit \\\n --plan <plan_id> --phase <phase> -- sbatch --parsable \\\n --output=Artifacts/jobs/%j/out.log ./run.sh\n ```\n The helper writes `.planning/async-jobs/<job>.json` (the versioned stability\n contract — `docs/reference/planning-artifacts.md`) and refuses to create a\n second non-terminal manifest for a `plan_id` that already has one\n (duplicate-execution guard).\n3. **Commit the manifest + a handoff**, then return **`external_job_waiting`**\n and stop. Do **not** write `SUMMARY.md` — SUMMARY is deferred until the job\n reaches a terminal state and its `expected_artifacts` are verified.\n4. **Resume path.** `execute-phase` safe-resume, `resume-project`, and\n `pause-work` reconcile against the manifest and never re-dispatch the plan.\n When the job is `completed-unverified`, run `verification_command` (surface\n it; it is untrusted — confirm before executing), then write `SUMMARY.md` and\n close the plan.\n\nManifest commands cross a trust seam: a Capability (or anything that can write\n`.planning/`) produces them; the core loop consumes them. Never auto-run\n`submit_command` / `verification_command` / `resume_command` — surface the exact\ncommand and require explicit confirmation first.\n"
1621
1721
  },
1622
1722
  "produces": [
1623
1723
  ".planning/async-jobs/<job>.json"
@@ -1646,7 +1746,7 @@ const capabilities = {
1646
1746
  "gap-analysis": {
1647
1747
  "id": "gap-analysis",
1648
1748
  "role": "feature",
1649
- "version": "1.12.0",
1749
+ "version": "1.13.0",
1650
1750
  "title": "Post-planning gap analysis",
1651
1751
  "description": "Proactive, non-blocking post-planning coverage report. After all PLAN.md files are generated, cross-references every REQ-ID and D-ID from REQUIREMENTS.md and CONTEXT.md against plan bodies. Emits a Source | Item | Status table. Does not block phase advancement.",
1652
1752
  "tier": "standard",
@@ -1687,7 +1787,7 @@ const capabilities = {
1687
1787
  "gemini": {
1688
1788
  "id": "gemini",
1689
1789
  "role": "reviewer",
1690
- "version": "1.12.0",
1790
+ "version": "1.13.0",
1691
1791
  "title": "Gemini CLI",
1692
1792
  "description": "Google Gemini CLI — cross-AI /gsd:review reviewer lane only; not a GSD install target (no runtime body, no artifacts). Spawned as `gemini -p - -m <model>` with the plan piped on stdin.",
1693
1793
  "tier": "full",
@@ -1718,12 +1818,15 @@ const capabilities = {
1718
1818
  "effortChannel": "none"
1719
1819
  },
1720
1820
  "timeoutFloorMs": 900000,
1821
+ "timeoutConfigKey": "review.timeouts.gemini",
1721
1822
  "emptyOutput": "stub-with-stderr",
1722
1823
  "reviewsSection": "Gemini",
1723
1824
  "evidenceClass": "source-grounded",
1724
1825
  "requiresBinaries": [],
1725
1826
  "promptBudgetKey": "review.max_prompt_tokens_per_reviewer.gemini",
1726
1827
  "modelConfigKey": "review.models.gemini",
1828
+ "effortConfigKey": null,
1829
+ "defaultEffort": null,
1727
1830
  "handler": null
1728
1831
  },
1729
1832
  "config": {
@@ -1736,13 +1839,18 @@ const capabilities = {
1736
1839
  "type": "number",
1737
1840
  "default": -1,
1738
1841
  "description": "Prompt-token budget for the Gemini reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
1842
+ },
1843
+ "review.timeouts.gemini": {
1844
+ "type": "number",
1845
+ "default": -1,
1846
+ "description": "Outer wall-clock timeout override (seconds) for the Gemini reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
1739
1847
  }
1740
1848
  }
1741
1849
  },
1742
1850
  "graphify": {
1743
1851
  "id": "graphify",
1744
1852
  "role": "feature",
1745
- "version": "1.12.0",
1853
+ "version": "1.13.0",
1746
1854
  "title": "Knowledge graph",
1747
1855
  "description": "Build, query, and inspect the project knowledge graph in `.planning/graphs/`; exposes graphify CLI subcommands (build, query, status, diff) and the /gsd-graphify skill.",
1748
1856
  "tier": "full",
@@ -1783,7 +1891,7 @@ const capabilities = {
1783
1891
  "hermes": {
1784
1892
  "id": "hermes",
1785
1893
  "role": "runtime",
1786
- "version": "1.12.0",
1894
+ "version": "1.13.0",
1787
1895
  "title": "Hermes Agent",
1788
1896
  "description": "Hermes Agent (NousResearch) — skills nest under skills/gsd/ category bucket; nested skill layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
1789
1897
  "tier": "core",
@@ -1880,7 +1988,8 @@ const capabilities = {
1880
1988
  "background": true,
1881
1989
  "subagentToolkit": "read-only",
1882
1990
  "backgroundDispatch": false,
1883
- "isolation": "undocumented"
1991
+ "isolation": "undocumented",
1992
+ "maxConcurrency": "undocumented"
1884
1993
  },
1885
1994
  "modelMode": "active",
1886
1995
  "hookBus": "host",
@@ -1894,7 +2003,7 @@ const capabilities = {
1894
2003
  "intel": {
1895
2004
  "id": "intel",
1896
2005
  "role": "feature",
1897
- "version": "1.12.0",
2006
+ "version": "1.13.0",
1898
2007
  "title": "Codebase intelligence",
1899
2008
  "description": "Code-intelligence store for codebase querying, diff, snapshot, and API-surface extraction; exposes `gsd-tools intel` subcommands (query, status, update, diff, snapshot, patch-meta, validate, extract-exports, api-surface) and backs `/gsd-map-codebase` and `gsd-intel-updater`.",
1900
2009
  "tier": "full",
@@ -1946,7 +2055,7 @@ const capabilities = {
1946
2055
  "kilo": {
1947
2056
  "id": "kilo",
1948
2057
  "role": "runtime",
1949
- "version": "1.12.0",
2058
+ "version": "1.13.0",
1950
2059
  "title": "Kilo Code",
1951
2060
  "description": "Kilo Code — XDG-based config dir; global skills at ~/.kilo/skills (separate from XDG config); flat command/ + skills artifact layout; no lifecycle hook registration; tier-2 support.",
1952
2061
  "tier": "core",
@@ -2048,7 +2157,8 @@ const capabilities = {
2048
2157
  "background": true,
2049
2158
  "subagentToolkit": "undocumented",
2050
2159
  "backgroundDispatch": false,
2051
- "isolation": "undocumented"
2160
+ "isolation": "undocumented",
2161
+ "maxConcurrency": "undocumented"
2052
2162
  },
2053
2163
  "modelMode": "active",
2054
2164
  "hookBus": "host",
@@ -2075,7 +2185,7 @@ const capabilities = {
2075
2185
  "kimi": {
2076
2186
  "id": "kimi",
2077
2187
  "role": "runtime",
2078
- "version": "1.12.0",
2188
+ "version": "1.13.0",
2079
2189
  "title": "Kimi CLI",
2080
2190
  "description": "Kimi CLI (Moonshot AI) — generic agents root at ~/.config/agents; skills + kimi-agents artifact layout; native config.toml [[hooks]] bus at ~/.kimi/config.toml; background dispatch; tier-2 support.",
2081
2191
  "tier": "core",
@@ -2147,7 +2257,8 @@ const capabilities = {
2147
2257
  "background": true,
2148
2258
  "subagentToolkit": "undocumented",
2149
2259
  "backgroundDispatch": true,
2150
- "isolation": "orchestrator-worktree"
2260
+ "isolation": "orchestrator-worktree",
2261
+ "maxConcurrency": "undocumented"
2151
2262
  },
2152
2263
  "modelMode": "passive",
2153
2264
  "hookBus": "host",
@@ -2170,14 +2281,15 @@ const capabilities = {
2170
2281
  "verificationStyle": "kimi",
2171
2282
  "agentManifestStyle": "kimi-nested",
2172
2283
  "doneBannerStyle": "kimi-agent-file",
2173
- "skipSharedHooksInstall": true
2284
+ "skipSharedHooksInstall": true,
2285
+ "noPathRewrite": true
2174
2286
  }
2175
2287
  }
2176
2288
  },
2177
2289
  "kimi-code": {
2178
2290
  "id": "kimi-code",
2179
2291
  "role": "runtime",
2180
- "version": "1.12.0",
2292
+ "version": "1.13.0",
2181
2293
  "title": "Kimi Code CLI",
2182
2294
  "description": "Kimi Code CLI (Moonshot AI, Node) — Agent Skills auto-discovered at ~/.kimi-code/skills; global AGENTS.md at ~/.kimi-code/AGENTS.md; native config.toml + [[hooks]] bus; three built-in subagents (coder/explore/plan), NO custom named subagents; background dispatch; tier-2 support. Distinct from Python kimi-cli (the 'kimi' capability) per ADR-1239 EoS — Kimi Code cannot dispatch named subagents so the kimi-agents YAML layout does NOT apply; persona injection rides the existing ${AGENT_SKILLS_*} workflow fallback. Install-layout, agent-install-check, and install-time decision (kimi vs kimi-code) land in follow-up PRs; this descriptor is the EoS foundation.",
2183
2295
  "tier": "core",
@@ -2262,7 +2374,8 @@ const capabilities = {
2262
2374
  "explore",
2263
2375
  "plan"
2264
2376
  ],
2265
- "isolation": "orchestrator-worktree"
2377
+ "isolation": "orchestrator-worktree",
2378
+ "maxConcurrency": "undocumented"
2266
2379
  },
2267
2380
  "modelMode": "passive",
2268
2381
  "hookBus": "host",
@@ -2311,12 +2424,15 @@ const capabilities = {
2311
2424
  "effortChannel": "none"
2312
2425
  },
2313
2426
  "timeoutFloorMs": 900000,
2427
+ "timeoutConfigKey": "review.timeouts.kimi-code",
2314
2428
  "emptyOutput": "stub-with-stderr",
2315
2429
  "reviewsSection": "Kimi Code",
2316
2430
  "evidenceClass": "source-grounded",
2317
2431
  "requiresBinaries": [],
2318
2432
  "promptBudgetKey": "review.max_prompt_tokens_per_reviewer.kimi-code",
2319
2433
  "modelConfigKey": "review.models.kimi-code",
2434
+ "effortConfigKey": null,
2435
+ "defaultEffort": null,
2320
2436
  "handler": null
2321
2437
  },
2322
2438
  "config": {
@@ -2329,13 +2445,18 @@ const capabilities = {
2329
2445
  "type": "number",
2330
2446
  "default": -1,
2331
2447
  "description": "Prompt-token budget for the Kimi Code reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
2448
+ },
2449
+ "review.timeouts.kimi-code": {
2450
+ "type": "number",
2451
+ "default": -1,
2452
+ "description": "Outer wall-clock timeout override (seconds) for the Kimi Code reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
2332
2453
  }
2333
2454
  }
2334
2455
  },
2335
2456
  "live-dom-uat": {
2336
2457
  "id": "live-dom-uat",
2337
2458
  "role": "feature",
2338
- "version": "1.12.0",
2459
+ "version": "1.13.0",
2339
2460
  "title": "Live-DOM UAT",
2340
2461
  "description": "Default-off live-DOM verification (#2856). Confines browser MCP reach to one purpose-built agent (gsd-dom-verifier) that carries the browser globs in its own tools: line, registered as an additive step hook at execute:wave:post. agents/gsd-executor.md is deliberately NOT widened: for a first-party agent the static tool list is the only control that exists, no capability can grant tools to one (ADR-1244 D2), no hook kind grants tool permissions (ADR-857 D4), and there is no per-dispatch tool override. Gated by activationKey workflow.live_dom_uat (default false), so with the key off the capability resolves inactive and the hook does not render at all. NOTE on the browser profile lock: chrome-devtools-mcp holds an exclusive lock on $HOME/.cache/chrome-devtools-mcp/chrome-profile, and --isolated is a flag on the user's own MCP-server registration that GSD cannot pass. Concurrent execution waves sharing one profile will therefore collide; the step tolerates and reports that (onError: skip, never blocking) rather than pretending to coordinate a resource it does not own.",
2341
2462
  "tier": "full",
@@ -2388,7 +2509,7 @@ const capabilities = {
2388
2509
  "llama-cpp": {
2389
2510
  "id": "llama-cpp",
2390
2511
  "role": "reviewer",
2391
- "version": "1.12.0",
2512
+ "version": "1.13.0",
2392
2513
  "title": "llama.cpp",
2393
2514
  "description": "llama.cpp server — cross-AI /gsd:review reviewer lane only; not a GSD install target (no runtime body, no artifacts). OpenAI-compatible HTTP transport against a user-configured `review.llama_cpp_host` (POST /v1/chat/completions); model discovered via GET /v1/models piped through jq. Capability id/folder are kebab (`llama-cpp`, required by KEBAB_RE); `reviewer.slug` stays snake (`llama_cpp`) to match the shipped roster and the `review.llama_cpp_host` config key (ADR-2782's three-namespace trap).",
2394
2515
  "tier": "full",
@@ -2417,12 +2538,15 @@ const capabilities = {
2417
2538
  "effortChannel": "none"
2418
2539
  },
2419
2540
  "timeoutFloorMs": 120000,
2541
+ "timeoutConfigKey": "review.timeouts.llama_cpp",
2420
2542
  "emptyOutput": "stub-with-stderr",
2421
2543
  "reviewsSection": "llama.cpp",
2422
2544
  "evidenceClass": "source-grounded",
2423
2545
  "requiresBinaries": [],
2424
2546
  "promptBudgetKey": "review.max_prompt_tokens_per_reviewer.llama_cpp",
2425
2547
  "modelConfigKey": "review.models.llama_cpp",
2548
+ "effortConfigKey": null,
2549
+ "defaultEffort": null,
2426
2550
  "handler": "openai-compatible"
2427
2551
  },
2428
2552
  "config": {
@@ -2440,13 +2564,18 @@ const capabilities = {
2440
2564
  "type": "number",
2441
2565
  "default": -1,
2442
2566
  "description": "Prompt-token budget for the llama.cpp reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
2567
+ },
2568
+ "review.timeouts.llama_cpp": {
2569
+ "type": "number",
2570
+ "default": -1,
2571
+ "description": "Outer wall-clock timeout override (seconds) for the llama.cpp reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
2443
2572
  }
2444
2573
  }
2445
2574
  },
2446
2575
  "lm-studio": {
2447
2576
  "id": "lm-studio",
2448
2577
  "role": "reviewer",
2449
- "version": "1.12.0",
2578
+ "version": "1.13.0",
2450
2579
  "title": "LM Studio",
2451
2580
  "description": "LM Studio local model server — cross-AI /gsd:review reviewer lane only; not a GSD install target (no runtime body, no artifacts). OpenAI-compatible HTTP transport against a user-configured `review.lm_studio_host` (POST /v1/chat/completions); model discovered via GET /v1/models piped through jq. Capability id/folder are kebab (`lm-studio`, required by KEBAB_RE); `reviewer.slug` stays snake (`lm_studio`) to match the shipped roster and the `review.lm_studio_host` config key (ADR-2782's three-namespace trap).",
2452
2581
  "tier": "full",
@@ -2475,12 +2604,15 @@ const capabilities = {
2475
2604
  "effortChannel": "none"
2476
2605
  },
2477
2606
  "timeoutFloorMs": 120000,
2607
+ "timeoutConfigKey": "review.timeouts.lm_studio",
2478
2608
  "emptyOutput": "stub-with-stderr",
2479
2609
  "reviewsSection": "LM Studio",
2480
2610
  "evidenceClass": "source-grounded",
2481
2611
  "requiresBinaries": [],
2482
2612
  "promptBudgetKey": "review.max_prompt_tokens_per_reviewer.lm_studio",
2483
2613
  "modelConfigKey": "review.models.lm_studio",
2614
+ "effortConfigKey": null,
2615
+ "defaultEffort": null,
2484
2616
  "handler": "openai-compatible"
2485
2617
  },
2486
2618
  "config": {
@@ -2498,13 +2630,18 @@ const capabilities = {
2498
2630
  "type": "number",
2499
2631
  "default": -1,
2500
2632
  "description": "Prompt-token budget for the LM Studio reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
2633
+ },
2634
+ "review.timeouts.lm_studio": {
2635
+ "type": "number",
2636
+ "default": -1,
2637
+ "description": "Outer wall-clock timeout override (seconds) for the LM Studio reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
2501
2638
  }
2502
2639
  }
2503
2640
  },
2504
2641
  "mempalace": {
2505
2642
  "id": "mempalace",
2506
2643
  "role": "feature",
2507
- "version": "1.12.0",
2644
+ "version": "1.13.0",
2508
2645
  "title": "MemPalace memory",
2509
2646
  "description": "Cross-session, cross-project memory: deliberate recall before discuss/plan and verbatim capture + temporal-KG sync at phase boundaries, via the MemPalace MCP server and CLI.",
2510
2647
  "tier": "full",
@@ -2678,7 +2815,7 @@ const capabilities = {
2678
2815
  "nyquist": {
2679
2816
  "id": "nyquist",
2680
2817
  "role": "feature",
2681
- "version": "1.12.0",
2818
+ "version": "1.13.0",
2682
2819
  "title": "Nyquist validation",
2683
2820
  "description": "Validation coverage audit that maps executed work back to tests and manual-only evidence.",
2684
2821
  "tier": "full",
@@ -2728,7 +2865,7 @@ const capabilities = {
2728
2865
  "ollama": {
2729
2866
  "id": "ollama",
2730
2867
  "role": "reviewer",
2731
- "version": "1.12.0",
2868
+ "version": "1.13.0",
2732
2869
  "title": "Ollama",
2733
2870
  "description": "Ollama local model server — cross-AI /gsd:review reviewer lane only; not a GSD install target (no runtime body, no artifacts). OpenAI-compatible HTTP transport against a user-configured `review.ollama_host` (POST /v1/chat/completions); model discovered via GET /v1/models piped through jq.",
2734
2871
  "tier": "full",
@@ -2757,12 +2894,15 @@ const capabilities = {
2757
2894
  "effortChannel": "none"
2758
2895
  },
2759
2896
  "timeoutFloorMs": 120000,
2897
+ "timeoutConfigKey": "review.timeouts.ollama",
2760
2898
  "emptyOutput": "stub-with-stderr",
2761
2899
  "reviewsSection": "Ollama",
2762
2900
  "evidenceClass": "source-grounded",
2763
2901
  "requiresBinaries": [],
2764
2902
  "promptBudgetKey": "review.max_prompt_tokens_per_reviewer.ollama",
2765
2903
  "modelConfigKey": "review.models.ollama",
2904
+ "effortConfigKey": null,
2905
+ "defaultEffort": null,
2766
2906
  "handler": "openai-compatible"
2767
2907
  },
2768
2908
  "config": {
@@ -2780,13 +2920,18 @@ const capabilities = {
2780
2920
  "type": "number",
2781
2921
  "default": -1,
2782
2922
  "description": "Prompt-token budget for the Ollama reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
2923
+ },
2924
+ "review.timeouts.ollama": {
2925
+ "type": "number",
2926
+ "default": -1,
2927
+ "description": "Outer wall-clock timeout override (seconds) for the Ollama reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
2783
2928
  }
2784
2929
  }
2785
2930
  },
2786
2931
  "opencode": {
2787
2932
  "id": "opencode",
2788
2933
  "role": "runtime",
2789
- "version": "1.12.0",
2934
+ "version": "1.13.0",
2790
2935
  "title": "OpenCode",
2791
2936
  "description": "OpenCode — XDG-based config dir; flat commands/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.",
2792
2937
  "tier": "core",
@@ -2883,7 +3028,8 @@ const capabilities = {
2883
3028
  "background": false,
2884
3029
  "subagentToolkit": "full",
2885
3030
  "backgroundDispatch": false,
2886
- "isolation": "orchestrator-worktree"
3031
+ "isolation": "orchestrator-worktree",
3032
+ "maxConcurrency": "undocumented"
2887
3033
  },
2888
3034
  "modelMode": "active",
2889
3035
  "hookBus": "host",
@@ -2943,12 +3089,15 @@ const capabilities = {
2943
3089
  "effortChannel": "argv"
2944
3090
  },
2945
3091
  "timeoutFloorMs": 660000,
3092
+ "timeoutConfigKey": "review.timeouts.opencode",
2946
3093
  "emptyOutput": "stub-with-stderr",
2947
3094
  "reviewsSection": "OpenCode",
2948
3095
  "evidenceClass": "source-grounded",
2949
3096
  "requiresBinaries": [],
2950
3097
  "promptBudgetKey": "review.max_prompt_tokens_per_reviewer.opencode",
2951
3098
  "modelConfigKey": "review.models.opencode",
3099
+ "effortConfigKey": "review.effort.opencode",
3100
+ "defaultEffort": "high",
2952
3101
  "handler": "opencode"
2953
3102
  },
2954
3103
  "config": {
@@ -2961,13 +3110,23 @@ const capabilities = {
2961
3110
  "type": "number",
2962
3111
  "default": -1,
2963
3112
  "description": "Prompt-token budget for the OpenCode reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
3113
+ },
3114
+ "review.timeouts.opencode": {
3115
+ "type": "number",
3116
+ "default": -1,
3117
+ "description": "Outer wall-clock timeout override (seconds) for the OpenCode reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
3118
+ },
3119
+ "review.effort.opencode": {
3120
+ "type": "string",
3121
+ "default": "",
3122
+ "description": "Reasoning effort for the OpenCode reviewer lane: minimal, low, medium, high, xhigh, max, or inherit. Unset falls back to the lane's declared review default (high); inherit emits no effort argument so the CLI's own configuration decides. An unrecognized value falls back to the lane default rather than being forwarded."
2964
3123
  }
2965
3124
  }
2966
3125
  },
2967
3126
  "pattern-mapper": {
2968
3127
  "id": "pattern-mapper",
2969
3128
  "role": "feature",
2970
- "version": "1.12.0",
3129
+ "version": "1.13.0",
2971
3130
  "title": "Pattern mapping",
2972
3131
  "description": "Optional codebase-pattern mapping before planning; owns the pattern mapper agent and workflow.pattern_mapper activation key.",
2973
3132
  "tier": "full",
@@ -3021,7 +3180,7 @@ const capabilities = {
3021
3180
  "pi": {
3022
3181
  "id": "pi",
3023
3182
  "role": "runtime",
3024
- "version": "1.12.0",
3183
+ "version": "1.13.0",
3025
3184
  "title": "pi",
3026
3185
  "description": "pi (pi.dev) — bun-runtime programmatic-CLI; TS ExtensionAPI (registerCommand/registerTool/registerProvider/pi.on); single native-extension file at ~/.pi/agent/extensions/gsd.js (.js, not .cjs — pi's extension auto-discovery accepts only .ts/.js, #2470); no shared-settings hook surface; tier-2 support.",
3027
3186
  "tier": "core",
@@ -3067,7 +3226,8 @@ const capabilities = {
3067
3226
  "background": false,
3068
3227
  "backgroundDispatch": false,
3069
3228
  "subagentToolkit": "undocumented",
3070
- "isolation": "none"
3229
+ "isolation": "none",
3230
+ "maxConcurrency": "undocumented"
3071
3231
  },
3072
3232
  "modelMode": "active",
3073
3233
  "hookBus": "host",
@@ -3090,7 +3250,7 @@ const capabilities = {
3090
3250
  "profile-pipeline": {
3091
3251
  "id": "profile-pipeline",
3092
3252
  "role": "feature",
3093
- "version": "1.12.0",
3253
+ "version": "1.13.0",
3094
3254
  "title": "Developer profiling pipeline",
3095
3255
  "description": "Developer behavioral profiling from Claude Code session history; scans session JSONL files, extracts and samples user messages, and generates profile artifacts (USER-PROFILE.md, dev-preferences.md, CLAUDE.md sections). Exposes eight `gsd-tools` commands: scan-sessions, extract-messages, profile-sample (pipeline phase) and write-profile, profile-questionnaire, generate-dev-preferences, generate-claude-profile, generate-claude-md (output phase). Backs the /gsd-profile-user skill and gsd-user-profiler agent.",
3096
3256
  "tier": "full",
@@ -3167,7 +3327,7 @@ const capabilities = {
3167
3327
  "qwen": {
3168
3328
  "id": "qwen",
3169
3329
  "role": "runtime",
3170
- "version": "1.12.0",
3330
+ "version": "1.13.0",
3171
3331
  "title": "Qwen Code",
3172
3332
  "description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
3173
3333
  "tier": "core",
@@ -3251,7 +3411,8 @@ const capabilities = {
3251
3411
  "background": true,
3252
3412
  "subagentToolkit": "full",
3253
3413
  "backgroundDispatch": false,
3254
- "isolation": "undocumented"
3414
+ "isolation": "undocumented",
3415
+ "maxConcurrency": "undocumented"
3255
3416
  },
3256
3417
  "modelMode": "passive",
3257
3418
  "hookBus": "host",
@@ -3294,12 +3455,15 @@ const capabilities = {
3294
3455
  "effortChannel": "none"
3295
3456
  },
3296
3457
  "timeoutFloorMs": 900000,
3458
+ "timeoutConfigKey": null,
3297
3459
  "emptyOutput": "stub-with-stderr",
3298
3460
  "reviewsSection": "Qwen",
3299
3461
  "evidenceClass": "source-grounded",
3300
3462
  "requiresBinaries": [],
3301
3463
  "promptBudgetKey": "review.max_prompt_tokens_per_reviewer.qwen",
3302
3464
  "modelConfigKey": null,
3465
+ "effortConfigKey": null,
3466
+ "defaultEffort": null,
3303
3467
  "handler": null
3304
3468
  },
3305
3469
  "config": {
@@ -3313,7 +3477,7 @@ const capabilities = {
3313
3477
  "refactor-trigger": {
3314
3478
  "id": "refactor-trigger",
3315
3479
  "role": "feature",
3316
- "version": "1.12.0",
3480
+ "version": "1.13.0",
3317
3481
  "title": "Complexity-triggered refactor",
3318
3482
  "description": "Measures the complexity of the code a phase touched and, when a function crosses a configured threshold or jumps past its recorded anchor, surfaces a scoped refactor proposal at .planning/phases/<N>/<NN>-REFACTOR.md. Advisory by default — it never edits code and never blocks. Opt-in strict mode blocks /gsd-ship while a proposal is untriaged; a declined proposal is recorded in the broken-windows ledger when that capability is present. Operationalizes 'refactor early, refactor often' as continuous pressure instead of a thing you have to remember (issue #1953).",
3319
3483
  "tier": "full",
@@ -3380,7 +3544,7 @@ const capabilities = {
3380
3544
  "research": {
3381
3545
  "id": "research",
3382
3546
  "role": "feature",
3383
- "version": "1.12.0",
3547
+ "version": "1.13.0",
3384
3548
  "title": "Phase research",
3385
3549
  "description": "Optional phase research before planning; owns the phase researcher agent and workflow.research activation key.",
3386
3550
  "tier": "standard",
@@ -3432,7 +3596,7 @@ const capabilities = {
3432
3596
  "schema-gate": {
3433
3597
  "id": "schema-gate",
3434
3598
  "role": "feature",
3435
- "version": "1.12.0",
3599
+ "version": "1.13.0",
3436
3600
  "title": "Schema push detection gate",
3437
3601
  "description": "Detects ORM schema-relevant files in the phase scope during planning and injects a mandatory [BLOCKING] schema push task into the plan. Prevents false-positive verification where build/types pass because TypeScript types come from config, not the live database.",
3438
3602
  "tier": "full",
@@ -3478,7 +3642,7 @@ const capabilities = {
3478
3642
  "security": {
3479
3643
  "id": "security",
3480
3644
  "role": "feature",
3481
- "version": "1.12.0",
3645
+ "version": "1.13.0",
3482
3646
  "title": "Security enforcement",
3483
3647
  "description": "Threat mitigation verification and ship-time security blocking for phases with security enforcement enabled.",
3484
3648
  "tier": "full",
@@ -3577,7 +3741,7 @@ const capabilities = {
3577
3741
  "tdd": {
3578
3742
  "id": "tdd",
3579
3743
  "role": "feature",
3580
- "version": "1.12.0",
3744
+ "version": "1.13.0",
3581
3745
  "title": "Test-driven development",
3582
3746
  "description": "Injects TDD heuristics into the planner and enforces RED/GREEN gate compliance on type:tdd plans after execution. Owns workflow.tdd_mode; the --tdd CLI flag is the ephemeral override.",
3583
3747
  "tier": "full",
@@ -3630,7 +3794,7 @@ const capabilities = {
3630
3794
  "trae": {
3631
3795
  "id": "trae",
3632
3796
  "role": "runtime",
3633
- "version": "1.12.0",
3797
+ "version": "1.13.0",
3634
3798
  "title": "Trae IDE",
3635
3799
  "description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.",
3636
3800
  "tier": "core",
@@ -3708,7 +3872,8 @@ const capabilities = {
3708
3872
  "background": true,
3709
3873
  "subagentToolkit": "undocumented",
3710
3874
  "backgroundDispatch": "undocumented",
3711
- "isolation": "undocumented"
3875
+ "isolation": "undocumented",
3876
+ "maxConcurrency": "undocumented"
3712
3877
  },
3713
3878
  "modelMode": "passive",
3714
3879
  "hookBus": "engine",
@@ -3727,7 +3892,7 @@ const capabilities = {
3727
3892
  "ui": {
3728
3893
  "id": "ui",
3729
3894
  "role": "feature",
3730
- "version": "1.12.0",
3895
+ "version": "1.13.0",
3731
3896
  "title": "UI design contracts",
3732
3897
  "description": "UI-SPEC design contract + retrospective UI audit for frontend phases.",
3733
3898
  "tier": "full",
@@ -3822,7 +3987,7 @@ const capabilities = {
3822
3987
  "vscode": {
3823
3988
  "id": "vscode",
3824
3989
  "role": "runtime",
3825
- "version": "1.12.0",
3990
+ "version": "1.13.0",
3826
3991
  "title": "VS Code",
3827
3992
  "description": "VS Code — Marketplace/VSIX extension; no file-projected config directory; IDE-profile reference host (active vscode.lm model, engine-owned hook bus, sandboxed globalState/workspaceState stateIO).",
3828
3993
  "tier": "core",
@@ -3865,7 +4030,8 @@ const capabilities = {
3865
4030
  "background": true,
3866
4031
  "subagentToolkit": "undocumented",
3867
4032
  "backgroundDispatch": "undocumented",
3868
- "isolation": "undocumented"
4033
+ "isolation": "undocumented",
4034
+ "maxConcurrency": "undocumented"
3869
4035
  },
3870
4036
  "modelMode": "active",
3871
4037
  "hookBus": "engine",
@@ -3879,7 +4045,7 @@ const capabilities = {
3879
4045
  "windsurf": {
3880
4046
  "id": "windsurf",
3881
4047
  "role": "runtime",
3882
- "version": "1.12.0",
4048
+ "version": "1.13.0",
3883
4049
  "title": "Windsurf",
3884
4050
  "description": "Windsurf (Codeium) — workspace workflow artifact layout for slash commands; Cascade native hooks.json blocking hook bus (pre_write_code, pre_run_command); tier-2 support.",
3885
4051
  "tier": "core",
@@ -3950,7 +4116,8 @@ const capabilities = {
3950
4116
  "background": "undocumented",
3951
4117
  "subagentToolkit": "undocumented",
3952
4118
  "backgroundDispatch": "undocumented",
3953
- "isolation": "none"
4119
+ "isolation": "none",
4120
+ "maxConcurrency": "undocumented"
3954
4121
  },
3955
4122
  "modelMode": "passive",
3956
4123
  "hookBus": "host",
@@ -3970,7 +4137,7 @@ const capabilities = {
3970
4137
  "zcode": {
3971
4138
  "id": "zcode",
3972
4139
  "role": "runtime",
3973
- "version": "1.12.0",
4140
+ "version": "1.13.0",
3974
4141
  "title": "ZCode",
3975
4142
  "description": "ZCode (Z.ai) — desktop Agentic Development Environment for GLM-5.2; Claude-shaped nested skills at ~/.zcode/skills/<name>/SKILL.md, slash commands, named subagents, native MCP; declarative plugin surface; profile-marker install; tier-2 community support.",
3976
4143
  "tier": "core",
@@ -4064,7 +4231,8 @@ const capabilities = {
4064
4231
  "background": false,
4065
4232
  "subagentToolkit": "full",
4066
4233
  "backgroundDispatch": false,
4067
- "isolation": "none"
4234
+ "isolation": "none",
4235
+ "maxConcurrency": "undocumented"
4068
4236
  },
4069
4237
  "modelMode": "passive",
4070
4238
  "hookBus": "host",
@@ -4338,6 +4506,16 @@ const byLoopPoint = {
4338
4506
  "blocking": false,
4339
4507
  "onError": "skip"
4340
4508
  },
4509
+ {
4510
+ "capId": "drift",
4511
+ "point": "plan:pre",
4512
+ "check": {
4513
+ "query": "verify.context-drift"
4514
+ },
4515
+ "when": "workflow.context_drift_precheck",
4516
+ "blocking": false,
4517
+ "onError": "skip"
4518
+ },
4341
4519
  {
4342
4520
  "capId": "ui",
4343
4521
  "point": "plan:pre",
@@ -4437,6 +4615,20 @@ const byLoopPoint = {
4437
4615
  },
4438
4616
  "execute:wave:post": {
4439
4617
  "steps": [
4618
+ {
4619
+ "capId": "code-review",
4620
+ "point": "execute:wave:post",
4621
+ "ref": {
4622
+ "skill": "code-review"
4623
+ },
4624
+ "produces": [
4625
+ "REVIEW.md"
4626
+ ],
4627
+ "consumes": [],
4628
+ "when": "workflow.code_review",
4629
+ "pointFrom": "workflow.code_review_point",
4630
+ "onError": "skip"
4631
+ },
4440
4632
  {
4441
4633
  "capId": "live-dom-uat",
4442
4634
  "point": "execute:wave:post",
@@ -4464,7 +4656,7 @@ const byLoopPoint = {
4464
4656
  "into": "executor",
4465
4657
  "fragment": {
4466
4658
  "path": "fragments/execute-wave-post.md",
4467
- "inline": "<!-- external-job capability — execute:wave:post fragment, injected into the executor (#1164).\n\n Why wave:post, not wave:pre (#1164 refinement A): execute-phase.md only\n dispatches execute:wave:post today — wave:pre is declared in the loop host\n contract but not rendered. Wiring wave:pre dispatch is a core-loop change\n #1164 puts out of scope. The executor therefore honors this classification\n guidance BEFORE running any task tagged <runtime_budget>long_compute</runtime_budget>,\n whether in the current or a subsequent wave, and externalizes rather than\n blocking the turn. -->\n\n## Externalize long-running compute (async external job)\n\nIf the current plan's task is tagged `<runtime_budget>long_compute</runtime_budget>`\n(see the plan-phase fragment), do **not** run it in the foreground — it would\nblock the agent turn for hours. Instead externalize it and record a durable\nhalf-state:\n\n1. **Classify the runtime.** `quick` (<2 min) and `medium` (<~30 min) run\n normally. `unknown` requires a first-health check and a soft-review deadline\n before consuming the child timeout. `long_compute` (>30–60 min) is\n externalized.\n2. **Submit via the scheduler adapter** (default `external_job.backend: slurm`):\n ```bash\n node scripts/slurm-adapter.cjs submit \\\n --plan <plan_id> --phase <phase> -- sbatch --parsable \\\n --output=Artifacts/jobs/%j/out.log ./run.sh\n ```\n The helper writes `.planning/async-jobs/<job>.json` (the versioned stability\n contract — `docs/reference/planning-artifacts.md`) and refuses to create a\n second non-terminal manifest for a `plan_id` that already has one\n (duplicate-execution guard).\n3. **Commit the manifest + a handoff**, then return **`external_job_waiting`**\n and stop. Do **not** write `SUMMARY.md` — SUMMARY is deferred until the job\n reaches a terminal state and its `expected_artifacts` are verified.\n4. **Resume path.** `execute-phase` safe-resume, `resume-project`, and\n `pause-work` reconcile against the manifest and never re-dispatch the plan.\n When the job is `completed-unverified`, run `verification_command` (surface\n it; it is untrusted — confirm before executing), then write `SUMMARY.md` and\n close the plan.\n\nManifest commands cross a trust seam: a Capability (or anything that can write\n`.planning/`) produces them; the core loop consumes them. Never auto-run\n`submit_command` / `verification_command` / `resume_command` — surface the exact\ncommand and require explicit confirmation first.\n"
4659
+ "inline": "<!-- external-job capability — execute:wave:post fragment, injected into the executor (#1164).\n\n #1164 specifies classification at wave:pre and recording at wave:post. This\n capability still contributes executor guidance at wave:post; execute-phase\n now renders wave:pre entries and dispatches generic step hooks there. Moving\n external-job classification is a separate capability change, not part of\n #4148. Until then, this guidance cannot classify the wave that already ran. -->\n\n## Externalize long-running compute (async external job)\n\nIf the current plan's task is tagged `<runtime_budget>long_compute</runtime_budget>`\n(see the plan-phase fragment), do **not** run it in the foreground — it would\nblock the agent turn for hours. Instead externalize it and record a durable\nhalf-state:\n\n1. **Classify the runtime.** `quick` (<2 min) and `medium` (<~30 min) run\n normally. `unknown` requires a first-health check and a soft-review deadline\n before consuming the child timeout. `long_compute` (>30–60 min) is\n externalized.\n2. **Submit via the scheduler adapter** (default `external_job.backend: slurm`):\n ```bash\n node scripts/slurm-adapter.cjs submit \\\n --plan <plan_id> --phase <phase> -- sbatch --parsable \\\n --output=Artifacts/jobs/%j/out.log ./run.sh\n ```\n The helper writes `.planning/async-jobs/<job>.json` (the versioned stability\n contract — `docs/reference/planning-artifacts.md`) and refuses to create a\n second non-terminal manifest for a `plan_id` that already has one\n (duplicate-execution guard).\n3. **Commit the manifest + a handoff**, then return **`external_job_waiting`**\n and stop. Do **not** write `SUMMARY.md` — SUMMARY is deferred until the job\n reaches a terminal state and its `expected_artifacts` are verified.\n4. **Resume path.** `execute-phase` safe-resume, `resume-project`, and\n `pause-work` reconcile against the manifest and never re-dispatch the plan.\n When the job is `completed-unverified`, run `verification_command` (surface\n it; it is untrusted — confirm before executing), then write `SUMMARY.md` and\n close the plan.\n\nManifest commands cross a trust seam: a Capability (or anything that can write\n`.planning/`) produces them; the core loop consumes them. Never auto-run\n`submit_command` / `verification_command` / `resume_command` — surface the exact\ncommand and require explicit confirmation first.\n"
4468
4660
  },
4469
4661
  "produces": [
4470
4662
  ".planning/async-jobs/<job>.json"
@@ -4537,6 +4729,7 @@ const byLoopPoint = {
4537
4729
  "SUMMARY.md"
4538
4730
  ],
4539
4731
  "when": "workflow.code_review",
4732
+ "pointFrom": "workflow.code_review_point",
4540
4733
  "onError": "skip"
4541
4734
  },
4542
4735
  {
@@ -4709,23 +4902,32 @@ const configKeys = {
4709
4902
  "workflow.api_coverage_gate": "ai-integration",
4710
4903
  "review.models.agy": "antigravity",
4711
4904
  "review.max_prompt_tokens_per_reviewer.antigravity": "antigravity",
4905
+ "review.timeouts.antigravity": "antigravity",
4712
4906
  "workflow.assumption_delta": "assumption-delta",
4713
4907
  "workflow.windows_enforce": "broken-windows",
4714
4908
  "review.models.claude": "claude",
4715
4909
  "review.max_prompt_tokens_per_reviewer.claude": "claude",
4910
+ "review.timeouts.claude": "claude",
4911
+ "review.effort.claude": "claude",
4716
4912
  "claude_orchestration.enabled": "claude-orchestration",
4717
4913
  "claude_orchestration.execution_backend": "claude-orchestration",
4718
4914
  "claude_orchestration.min_agent_sdk_version": "claude-orchestration",
4719
4915
  "workflow.code_review": "code-review",
4720
4916
  "workflow.code_review_depth": "code-review",
4917
+ "workflow.code_review_point": "code-review",
4721
4918
  "review.max_prompt_tokens_per_reviewer.coderabbit": "coderabbit",
4722
4919
  "review.models.codex": "codex",
4723
4920
  "review.max_prompt_tokens_per_reviewer.codex": "codex",
4921
+ "review.timeouts.codex": "codex",
4922
+ "review.effort.codex": "codex",
4923
+ "review.models.cursor": "cursor",
4724
4924
  "review.max_prompt_tokens_per_reviewer.cursor": "cursor",
4725
4925
  "workflow.drift_threshold": "drift",
4726
4926
  "workflow.drift_action": "drift",
4727
4927
  "workflow.schema_drift_gate": "drift",
4728
4928
  "workflow.plan_drift_precheck": "drift",
4929
+ "workflow.context_drift_precheck": "drift",
4930
+ "workflow.context_drift_action": "drift",
4729
4931
  "external_job.enabled": "external-job",
4730
4932
  "external_job.backend": "external-job",
4731
4933
  "external_job.artifact_dir": "external-job",
@@ -4734,17 +4936,21 @@ const configKeys = {
4734
4936
  "workflow.post_planning_gaps": "gap-analysis",
4735
4937
  "review.models.gemini": "gemini",
4736
4938
  "review.max_prompt_tokens_per_reviewer.gemini": "gemini",
4939
+ "review.timeouts.gemini": "gemini",
4737
4940
  "graphify.enabled": "graphify",
4738
4941
  "intel.enabled": "intel",
4739
4942
  "review.models.kimi-code": "kimi-code",
4740
4943
  "review.max_prompt_tokens_per_reviewer.kimi-code": "kimi-code",
4944
+ "review.timeouts.kimi-code": "kimi-code",
4741
4945
  "workflow.live_dom_uat": "live-dom-uat",
4742
4946
  "review.models.llama_cpp": "llama-cpp",
4743
4947
  "review.llama_cpp_host": "llama-cpp",
4744
4948
  "review.max_prompt_tokens_per_reviewer.llama_cpp": "llama-cpp",
4949
+ "review.timeouts.llama_cpp": "llama-cpp",
4745
4950
  "review.models.lm_studio": "lm-studio",
4746
4951
  "review.lm_studio_host": "lm-studio",
4747
4952
  "review.max_prompt_tokens_per_reviewer.lm_studio": "lm-studio",
4953
+ "review.timeouts.lm_studio": "lm-studio",
4748
4954
  "mempalace.enabled": "mempalace",
4749
4955
  "mempalace.memory_mode": "mempalace",
4750
4956
  "mempalace.wing": "mempalace",
@@ -4759,8 +4965,11 @@ const configKeys = {
4759
4965
  "review.models.ollama": "ollama",
4760
4966
  "review.ollama_host": "ollama",
4761
4967
  "review.max_prompt_tokens_per_reviewer.ollama": "ollama",
4968
+ "review.timeouts.ollama": "ollama",
4762
4969
  "review.models.opencode": "opencode",
4763
4970
  "review.max_prompt_tokens_per_reviewer.opencode": "opencode",
4971
+ "review.timeouts.opencode": "opencode",
4972
+ "review.effort.opencode": "opencode",
4764
4973
  "workflow.pattern_mapper": "pattern-mapper",
4765
4974
  "profile-pipeline.enabled": "profile-pipeline",
4766
4975
  "review.max_prompt_tokens_per_reviewer.qwen": "qwen",
@@ -4804,6 +5013,12 @@ const configSchema = {
4804
5013
  "default": -1,
4805
5014
  "description": "Prompt-token budget for the Antigravity reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\". Keyed on the reviewer slug `antigravity`, not the `agy` binary alias used by review.models.agy."
4806
5015
  },
5016
+ "review.timeouts.antigravity": {
5017
+ "owner": "antigravity",
5018
+ "type": "number",
5019
+ "default": -1,
5020
+ "description": "Outer wall-clock timeout override (seconds) for the Antigravity reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
5021
+ },
4807
5022
  "workflow.assumption_delta": {
4808
5023
  "owner": "assumption-delta",
4809
5024
  "type": "boolean",
@@ -4828,6 +5043,18 @@ const configSchema = {
4828
5043
  "default": -1,
4829
5044
  "description": "Prompt-token budget for the Claude reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
4830
5045
  },
5046
+ "review.timeouts.claude": {
5047
+ "owner": "claude",
5048
+ "type": "number",
5049
+ "default": -1,
5050
+ "description": "Outer wall-clock timeout override (seconds) for the Claude reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
5051
+ },
5052
+ "review.effort.claude": {
5053
+ "owner": "claude",
5054
+ "type": "string",
5055
+ "default": "",
5056
+ "description": "Reasoning effort for the Claude reviewer lane: minimal, low, medium, high, xhigh, max, or inherit. Unset falls back to the lane's declared review default (high); inherit emits no effort argument so the CLI's own configuration decides. An unrecognized value falls back to the lane default rather than being forwarded."
5057
+ },
4831
5058
  "claude_orchestration.enabled": {
4832
5059
  "owner": "claude-orchestration",
4833
5060
  "type": "boolean",
@@ -4868,6 +5095,16 @@ const configSchema = {
4868
5095
  "deep"
4869
5096
  ]
4870
5097
  },
5098
+ "workflow.code_review_point": {
5099
+ "owner": "code-review",
5100
+ "type": "enum",
5101
+ "default": "execute:post",
5102
+ "description": "Loop point at which the code-review step registers — execute:post reviews once per phase (default); execute:wave:post reviews once per completed wave, scoped to that wave's diff.",
5103
+ "values": [
5104
+ "execute:post",
5105
+ "execute:wave:post"
5106
+ ]
5107
+ },
4871
5108
  "review.max_prompt_tokens_per_reviewer.coderabbit": {
4872
5109
  "owner": "coderabbit",
4873
5110
  "type": "number",
@@ -4886,6 +5123,24 @@ const configSchema = {
4886
5123
  "default": -1,
4887
5124
  "description": "Prompt-token budget for the Codex reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
4888
5125
  },
5126
+ "review.timeouts.codex": {
5127
+ "owner": "codex",
5128
+ "type": "number",
5129
+ "default": -1,
5130
+ "description": "Outer wall-clock timeout override (seconds) for the Codex reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
5131
+ },
5132
+ "review.effort.codex": {
5133
+ "owner": "codex",
5134
+ "type": "string",
5135
+ "default": "",
5136
+ "description": "Reasoning effort for the Codex reviewer lane: minimal, low, medium, high, xhigh, max, or inherit. Unset falls back to the lane's declared review default (high); inherit emits no effort argument so the CLI's own configuration decides. An unrecognized value falls back to the lane default rather than being forwarded."
5137
+ },
5138
+ "review.models.cursor": {
5139
+ "owner": "cursor",
5140
+ "type": "string",
5141
+ "default": "",
5142
+ "description": "Model passed to the Cursor reviewer lane."
5143
+ },
4889
5144
  "review.max_prompt_tokens_per_reviewer.cursor": {
4890
5145
  "owner": "cursor",
4891
5146
  "type": "number",
@@ -4920,6 +5175,22 @@ const configSchema = {
4920
5175
  "default": true,
4921
5176
  "description": "Enable the non-blocking codebase drift pre-check at plan:pre, before /gsd:plan-phase spawns the planner. When enabled, a stale STRUCTURE.md (structural additions exceeding drift_threshold) is surfaced up front as a warn-only advisory pointing to /gsd:map-codebase; it never blocks planning and never spawns the mapper agent. Separate from schema_drift_gate so autonomous/CI runs can silence the plan-time advisory while keeping the execute:wave:post gates enabled."
4922
5177
  },
5178
+ "workflow.context_drift_precheck": {
5179
+ "owner": "drift",
5180
+ "type": "boolean",
5181
+ "default": true,
5182
+ "description": "Enable the non-blocking context-drift pre-check at plan:pre, before /gsd:plan-phase reuses an existing RESEARCH.md/PATTERNS.md/VALIDATION.md/SPEC.md. Compares each artifact's effective last-changed time (git commit time, falling back to mtime for uncommitted edits) against CONTEXT.md's own — an artifact that predates CONTEXT.md's newest decision was derived from a premise that has since changed. Warn-only by default (see workflow.context_drift_action); never blocks planning on its own."
5183
+ },
5184
+ "workflow.context_drift_action": {
5185
+ "owner": "drift",
5186
+ "type": "enum",
5187
+ "default": "warn",
5188
+ "description": "Action taken by the context-drift gate when a stale upstream artifact is found: warn (advisory message naming the stale artifacts and how to regenerate them) or block (halt plan-phase until the artifacts are regenerated or the check is disabled).",
5189
+ "values": [
5190
+ "warn",
5191
+ "block"
5192
+ ]
5193
+ },
4923
5194
  "external_job.enabled": {
4924
5195
  "owner": "external-job",
4925
5196
  "type": "boolean",
@@ -4971,6 +5242,12 @@ const configSchema = {
4971
5242
  "default": -1,
4972
5243
  "description": "Prompt-token budget for the Gemini reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
4973
5244
  },
5245
+ "review.timeouts.gemini": {
5246
+ "owner": "gemini",
5247
+ "type": "number",
5248
+ "default": -1,
5249
+ "description": "Outer wall-clock timeout override (seconds) for the Gemini reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
5250
+ },
4974
5251
  "graphify.enabled": {
4975
5252
  "owner": "graphify",
4976
5253
  "type": "boolean",
@@ -4995,6 +5272,12 @@ const configSchema = {
4995
5272
  "default": -1,
4996
5273
  "description": "Prompt-token budget for the Kimi Code reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
4997
5274
  },
5275
+ "review.timeouts.kimi-code": {
5276
+ "owner": "kimi-code",
5277
+ "type": "number",
5278
+ "default": -1,
5279
+ "description": "Outer wall-clock timeout override (seconds) for the Kimi Code reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
5280
+ },
4998
5281
  "workflow.live_dom_uat": {
4999
5282
  "owner": "live-dom-uat",
5000
5283
  "type": "boolean",
@@ -5019,6 +5302,12 @@ const configSchema = {
5019
5302
  "default": -1,
5020
5303
  "description": "Prompt-token budget for the llama.cpp reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
5021
5304
  },
5305
+ "review.timeouts.llama_cpp": {
5306
+ "owner": "llama-cpp",
5307
+ "type": "number",
5308
+ "default": -1,
5309
+ "description": "Outer wall-clock timeout override (seconds) for the llama.cpp reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
5310
+ },
5022
5311
  "review.models.lm_studio": {
5023
5312
  "owner": "lm-studio",
5024
5313
  "type": "string",
@@ -5037,6 +5326,12 @@ const configSchema = {
5037
5326
  "default": -1,
5038
5327
  "description": "Prompt-token budget for the LM Studio reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
5039
5328
  },
5329
+ "review.timeouts.lm_studio": {
5330
+ "owner": "lm-studio",
5331
+ "type": "number",
5332
+ "default": -1,
5333
+ "description": "Outer wall-clock timeout override (seconds) for the LM Studio reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
5334
+ },
5040
5335
  "mempalace.enabled": {
5041
5336
  "owner": "mempalace",
5042
5337
  "type": "boolean",
@@ -5126,6 +5421,12 @@ const configSchema = {
5126
5421
  "default": -1,
5127
5422
  "description": "Prompt-token budget for the Ollama reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
5128
5423
  },
5424
+ "review.timeouts.ollama": {
5425
+ "owner": "ollama",
5426
+ "type": "number",
5427
+ "default": -1,
5428
+ "description": "Outer wall-clock timeout override (seconds) for the Ollama reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
5429
+ },
5129
5430
  "review.models.opencode": {
5130
5431
  "owner": "opencode",
5131
5432
  "type": "string",
@@ -5138,6 +5439,18 @@ const configSchema = {
5138
5439
  "default": -1,
5139
5440
  "description": "Prompt-token budget for the OpenCode reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
5140
5441
  },
5442
+ "review.timeouts.opencode": {
5443
+ "owner": "opencode",
5444
+ "type": "number",
5445
+ "default": -1,
5446
+ "description": "Outer wall-clock timeout override (seconds) for the OpenCode reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
5447
+ },
5448
+ "review.effort.opencode": {
5449
+ "owner": "opencode",
5450
+ "type": "string",
5451
+ "default": "",
5452
+ "description": "Reasoning effort for the OpenCode reviewer lane: minimal, low, medium, high, xhigh, max, or inherit. Unset falls back to the lane's declared review default (high); inherit emits no effort argument so the CLI's own configuration decides. An unrecognized value falls back to the lane default rather than being forwarded."
5453
+ },
5141
5454
  "workflow.pattern_mapper": {
5142
5455
  "owner": "pattern-mapper",
5143
5456
  "type": "boolean",
@@ -5247,7 +5560,7 @@ const runtimes = {
5247
5560
  "antigravity": {
5248
5561
  "id": "antigravity",
5249
5562
  "role": "runtime",
5250
- "version": "1.12.0",
5563
+ "version": "1.13.0",
5251
5564
  "title": "Antigravity",
5252
5565
  "description": "Google Antigravity IDE — config/settings home nested under ~/.gemini/antigravity (probed across 1.x and 2.x layouts); global skills/agents install under ~/.gemini/config, the dir AGY scans for global discovery (#3738); Gemini hook event dialect; flat skill layout; tier-1 support.",
5253
5566
  "tier": "core",
@@ -5335,7 +5648,8 @@ const runtimes = {
5335
5648
  "background": true,
5336
5649
  "subagentToolkit": "full",
5337
5650
  "backgroundDispatch": "undocumented",
5338
- "isolation": "undocumented"
5651
+ "isolation": "undocumented",
5652
+ "maxConcurrency": "undocumented"
5339
5653
  },
5340
5654
  "modelMode": "passive",
5341
5655
  "hookBus": "host",
@@ -5366,7 +5680,7 @@ const runtimes = {
5366
5680
  "binary": "agy",
5367
5681
  "args": [
5368
5682
  "--print-timeout",
5369
- "540s",
5683
+ "{{nativeTimeout}}",
5370
5684
  "{{model}}",
5371
5685
  "-p",
5372
5686
  "{{prompt}}"
@@ -5377,12 +5691,15 @@ const runtimes = {
5377
5691
  "effortChannel": "none"
5378
5692
  },
5379
5693
  "timeoutFloorMs": 600000,
5694
+ "timeoutConfigKey": "review.timeouts.antigravity",
5380
5695
  "emptyOutput": "handler-owned",
5381
5696
  "reviewsSection": "Antigravity",
5382
5697
  "evidenceClass": "source-grounded",
5383
5698
  "requiresBinaries": [],
5384
5699
  "promptBudgetKey": "review.max_prompt_tokens_per_reviewer.antigravity",
5385
5700
  "modelConfigKey": "review.models.agy",
5701
+ "effortConfigKey": null,
5702
+ "defaultEffort": null,
5386
5703
  "handler": "antigravity"
5387
5704
  },
5388
5705
  "config": {
@@ -5395,13 +5712,18 @@ const runtimes = {
5395
5712
  "type": "number",
5396
5713
  "default": -1,
5397
5714
  "description": "Prompt-token budget for the Antigravity reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\". Keyed on the reviewer slug `antigravity`, not the `agy` binary alias used by review.models.agy."
5715
+ },
5716
+ "review.timeouts.antigravity": {
5717
+ "type": "number",
5718
+ "default": -1,
5719
+ "description": "Outer wall-clock timeout override (seconds) for the Antigravity reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
5398
5720
  }
5399
5721
  }
5400
5722
  },
5401
5723
  "augment": {
5402
5724
  "id": "augment",
5403
5725
  "role": "runtime",
5404
- "version": "1.12.0",
5726
+ "version": "1.13.0",
5405
5727
  "title": "Augment Code",
5406
5728
  "description": "Augment Code CLI — commands + nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
5407
5729
  "tier": "core",
@@ -5500,7 +5822,8 @@ const runtimes = {
5500
5822
  "background": true,
5501
5823
  "subagentToolkit": "full",
5502
5824
  "backgroundDispatch": "undocumented",
5503
- "isolation": "undocumented"
5825
+ "isolation": "undocumented",
5826
+ "maxConcurrency": "undocumented"
5504
5827
  },
5505
5828
  "modelMode": "passive",
5506
5829
  "hookBus": "host",
@@ -5514,7 +5837,7 @@ const runtimes = {
5514
5837
  "claude": {
5515
5838
  "id": "claude",
5516
5839
  "role": "runtime",
5517
- "version": "1.12.0",
5840
+ "version": "1.13.0",
5518
5841
  "title": "Claude Code",
5519
5842
  "description": "Anthropic Claude Code — primary development runtime; tier-1 support with full hook surface and skills-based global install.",
5520
5843
  "tier": "core",
@@ -5598,7 +5921,8 @@ const runtimes = {
5598
5921
  "background": true,
5599
5922
  "subagentToolkit": "full",
5600
5923
  "backgroundDispatch": false,
5601
- "isolation": "harness-worktree"
5924
+ "isolation": "harness-worktree",
5925
+ "maxConcurrency": 20
5602
5926
  },
5603
5927
  "modelMode": "passive",
5604
5928
  "hookBus": "host",
@@ -5657,12 +5981,15 @@ const runtimes = {
5657
5981
  }
5658
5982
  },
5659
5983
  "timeoutFloorMs": 1200000,
5984
+ "timeoutConfigKey": "review.timeouts.claude",
5660
5985
  "emptyOutput": "stub-with-stderr",
5661
5986
  "reviewsSection": "Claude",
5662
5987
  "evidenceClass": "source-grounded",
5663
5988
  "requiresBinaries": [],
5664
5989
  "promptBudgetKey": "review.max_prompt_tokens_per_reviewer.claude",
5665
5990
  "modelConfigKey": "review.models.claude",
5991
+ "effortConfigKey": "review.effort.claude",
5992
+ "defaultEffort": "high",
5666
5993
  "handler": null
5667
5994
  },
5668
5995
  "config": {
@@ -5675,13 +6002,23 @@ const runtimes = {
5675
6002
  "type": "number",
5676
6003
  "default": -1,
5677
6004
  "description": "Prompt-token budget for the Claude reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
6005
+ },
6006
+ "review.timeouts.claude": {
6007
+ "type": "number",
6008
+ "default": -1,
6009
+ "description": "Outer wall-clock timeout override (seconds) for the Claude reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
6010
+ },
6011
+ "review.effort.claude": {
6012
+ "type": "string",
6013
+ "default": "",
6014
+ "description": "Reasoning effort for the Claude reviewer lane: minimal, low, medium, high, xhigh, max, or inherit. Unset falls back to the lane's declared review default (high); inherit emits no effort argument so the CLI's own configuration decides. An unrecognized value falls back to the lane default rather than being forwarded."
5678
6015
  }
5679
6016
  }
5680
6017
  },
5681
6018
  "cline": {
5682
6019
  "id": "cline",
5683
6020
  "role": "runtime",
5684
- "version": "1.12.0",
6021
+ "version": "1.13.0",
5685
6022
  "title": "Cline",
5686
6023
  "description": "Cline (VS Code extension) — global-only nested-skill layout; cline-rules hook surface (.clinerules); no hook events emitted; tier-2 support.",
5687
6024
  "tier": "core",
@@ -5751,7 +6088,8 @@ const runtimes = {
5751
6088
  "background": true,
5752
6089
  "subagentToolkit": "read-only",
5753
6090
  "backgroundDispatch": false,
5754
- "isolation": "undocumented"
6091
+ "isolation": "undocumented",
6092
+ "maxConcurrency": "undocumented"
5755
6093
  },
5756
6094
  "modelMode": "active",
5757
6095
  "hookBus": "host",
@@ -5773,7 +6111,7 @@ const runtimes = {
5773
6111
  "codebuddy": {
5774
6112
  "id": "codebuddy",
5775
6113
  "role": "runtime",
5776
- "version": "1.12.0",
6114
+ "version": "1.13.0",
5777
6115
  "title": "CodeBuddy",
5778
6116
  "description": "CodeBuddy (Tencent) — converted commands + skills artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
5779
6117
  "tier": "core",
@@ -5873,7 +6211,8 @@ const runtimes = {
5873
6211
  "background": true,
5874
6212
  "subagentToolkit": "full",
5875
6213
  "backgroundDispatch": false,
5876
- "isolation": "undocumented"
6214
+ "isolation": "undocumented",
6215
+ "maxConcurrency": "undocumented"
5877
6216
  },
5878
6217
  "modelMode": "passive",
5879
6218
  "hookBus": "host",
@@ -5890,7 +6229,7 @@ const runtimes = {
5890
6229
  "codex": {
5891
6230
  "id": "codex",
5892
6231
  "role": "runtime",
5893
- "version": "1.12.0",
6232
+ "version": "1.13.0",
5894
6233
  "title": "OpenAI Codex CLI",
5895
6234
  "description": "OpenAI Codex CLI — shell-var command style; per-agent sandbox tiers; config.toml + hooks.json hook surface; tier-1 support.",
5896
6235
  "tier": "core",
@@ -5974,7 +6313,8 @@ const runtimes = {
5974
6313
  "background": true,
5975
6314
  "subagentToolkit": "full",
5976
6315
  "backgroundDispatch": true,
5977
- "isolation": "orchestrator-worktree"
6316
+ "isolation": "orchestrator-worktree",
6317
+ "maxConcurrency": "undocumented"
5978
6318
  },
5979
6319
  "modelMode": "passive",
5980
6320
  "hookBus": "host",
@@ -6028,12 +6368,15 @@ const runtimes = {
6028
6368
  "effortChannel": "argv"
6029
6369
  },
6030
6370
  "timeoutFloorMs": 1200000,
6371
+ "timeoutConfigKey": "review.timeouts.codex",
6031
6372
  "emptyOutput": "stub-with-stderr",
6032
6373
  "reviewsSection": "Codex",
6033
6374
  "evidenceClass": "source-grounded",
6034
6375
  "requiresBinaries": [],
6035
6376
  "promptBudgetKey": "review.max_prompt_tokens_per_reviewer.codex",
6036
6377
  "modelConfigKey": "review.models.codex",
6378
+ "effortConfigKey": "review.effort.codex",
6379
+ "defaultEffort": "high",
6037
6380
  "handler": null
6038
6381
  },
6039
6382
  "config": {
@@ -6046,13 +6389,23 @@ const runtimes = {
6046
6389
  "type": "number",
6047
6390
  "default": -1,
6048
6391
  "description": "Prompt-token budget for the Codex reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
6392
+ },
6393
+ "review.timeouts.codex": {
6394
+ "type": "number",
6395
+ "default": -1,
6396
+ "description": "Outer wall-clock timeout override (seconds) for the Codex reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
6397
+ },
6398
+ "review.effort.codex": {
6399
+ "type": "string",
6400
+ "default": "",
6401
+ "description": "Reasoning effort for the Codex reviewer lane: minimal, low, medium, high, xhigh, max, or inherit. Unset falls back to the lane's declared review default (high); inherit emits no effort argument so the CLI's own configuration decides. An unrecognized value falls back to the lane default rather than being forwarded."
6049
6402
  }
6050
6403
  }
6051
6404
  },
6052
6405
  "copilot": {
6053
6406
  "id": "copilot",
6054
6407
  "role": "runtime",
6055
- "version": "1.12.0",
6408
+ "version": "1.13.0",
6056
6409
  "title": "GitHub Copilot",
6057
6410
  "description": "GitHub Copilot (VS Code) — markdown config format; copilot-inline hook surface; no hook events emitted; flat skill nesting (unconfirmed recursive loader); tier-2 support.",
6058
6411
  "tier": "core",
@@ -6131,7 +6484,8 @@ const runtimes = {
6131
6484
  "background": true,
6132
6485
  "subagentToolkit": "full",
6133
6486
  "backgroundDispatch": false,
6134
- "isolation": "undocumented"
6487
+ "isolation": "undocumented",
6488
+ "maxConcurrency": "undocumented"
6135
6489
  },
6136
6490
  "modelMode": "passive",
6137
6491
  "hookBus": "host",
@@ -6151,7 +6505,7 @@ const runtimes = {
6151
6505
  "cursor": {
6152
6506
  "id": "cursor",
6153
6507
  "role": "runtime",
6154
- "version": "1.12.0",
6508
+ "version": "1.13.0",
6155
6509
  "title": "Cursor",
6156
6510
  "description": "Cursor IDE — skills-only workflow surface; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.",
6157
6511
  "tier": "core",
@@ -6230,7 +6584,8 @@ const runtimes = {
6230
6584
  "background": true,
6231
6585
  "subagentToolkit": "full",
6232
6586
  "backgroundDispatch": true,
6233
- "isolation": "harness-worktree"
6587
+ "isolation": "harness-worktree",
6588
+ "maxConcurrency": "undocumented"
6234
6589
  },
6235
6590
  "modelMode": "passive",
6236
6591
  "hookBus": "host",
@@ -6278,6 +6633,7 @@ const runtimes = {
6278
6633
  "binary": "cursor-agent",
6279
6634
  "args": [
6280
6635
  "-p",
6636
+ "{{model}}",
6281
6637
  "--mode",
6282
6638
  "ask",
6283
6639
  "--trust",
@@ -6287,19 +6643,27 @@ const runtimes = {
6287
6643
  ],
6288
6644
  "promptChannel": "argv-file-ref",
6289
6645
  "outputChannel": "stdout",
6290
- "modelArg": null,
6646
+ "modelArg": "--model",
6291
6647
  "effortChannel": "none"
6292
6648
  },
6293
6649
  "timeoutFloorMs": 900000,
6650
+ "timeoutConfigKey": null,
6294
6651
  "emptyOutput": "stub-with-stderr",
6295
6652
  "reviewsSection": "Cursor",
6296
6653
  "evidenceClass": "source-grounded",
6297
6654
  "requiresBinaries": [],
6298
6655
  "promptBudgetKey": "review.max_prompt_tokens_per_reviewer.cursor",
6299
- "modelConfigKey": null,
6656
+ "modelConfigKey": "review.models.cursor",
6657
+ "effortConfigKey": null,
6658
+ "defaultEffort": null,
6300
6659
  "handler": null
6301
6660
  },
6302
6661
  "config": {
6662
+ "review.models.cursor": {
6663
+ "type": "string",
6664
+ "default": "",
6665
+ "description": "Model passed to the Cursor reviewer lane."
6666
+ },
6303
6667
  "review.max_prompt_tokens_per_reviewer.cursor": {
6304
6668
  "type": "number",
6305
6669
  "default": -1,
@@ -6310,7 +6674,7 @@ const runtimes = {
6310
6674
  "hermes": {
6311
6675
  "id": "hermes",
6312
6676
  "role": "runtime",
6313
- "version": "1.12.0",
6677
+ "version": "1.13.0",
6314
6678
  "title": "Hermes Agent",
6315
6679
  "description": "Hermes Agent (NousResearch) — skills nest under skills/gsd/ category bucket; nested skill layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
6316
6680
  "tier": "core",
@@ -6407,7 +6771,8 @@ const runtimes = {
6407
6771
  "background": true,
6408
6772
  "subagentToolkit": "read-only",
6409
6773
  "backgroundDispatch": false,
6410
- "isolation": "undocumented"
6774
+ "isolation": "undocumented",
6775
+ "maxConcurrency": "undocumented"
6411
6776
  },
6412
6777
  "modelMode": "active",
6413
6778
  "hookBus": "host",
@@ -6421,7 +6786,7 @@ const runtimes = {
6421
6786
  "kilo": {
6422
6787
  "id": "kilo",
6423
6788
  "role": "runtime",
6424
- "version": "1.12.0",
6789
+ "version": "1.13.0",
6425
6790
  "title": "Kilo Code",
6426
6791
  "description": "Kilo Code — XDG-based config dir; global skills at ~/.kilo/skills (separate from XDG config); flat command/ + skills artifact layout; no lifecycle hook registration; tier-2 support.",
6427
6792
  "tier": "core",
@@ -6523,7 +6888,8 @@ const runtimes = {
6523
6888
  "background": true,
6524
6889
  "subagentToolkit": "undocumented",
6525
6890
  "backgroundDispatch": false,
6526
- "isolation": "undocumented"
6891
+ "isolation": "undocumented",
6892
+ "maxConcurrency": "undocumented"
6527
6893
  },
6528
6894
  "modelMode": "active",
6529
6895
  "hookBus": "host",
@@ -6550,7 +6916,7 @@ const runtimes = {
6550
6916
  "kimi": {
6551
6917
  "id": "kimi",
6552
6918
  "role": "runtime",
6553
- "version": "1.12.0",
6919
+ "version": "1.13.0",
6554
6920
  "title": "Kimi CLI",
6555
6921
  "description": "Kimi CLI (Moonshot AI) — generic agents root at ~/.config/agents; skills + kimi-agents artifact layout; native config.toml [[hooks]] bus at ~/.kimi/config.toml; background dispatch; tier-2 support.",
6556
6922
  "tier": "core",
@@ -6622,7 +6988,8 @@ const runtimes = {
6622
6988
  "background": true,
6623
6989
  "subagentToolkit": "undocumented",
6624
6990
  "backgroundDispatch": true,
6625
- "isolation": "orchestrator-worktree"
6991
+ "isolation": "orchestrator-worktree",
6992
+ "maxConcurrency": "undocumented"
6626
6993
  },
6627
6994
  "modelMode": "passive",
6628
6995
  "hookBus": "host",
@@ -6645,14 +7012,15 @@ const runtimes = {
6645
7012
  "verificationStyle": "kimi",
6646
7013
  "agentManifestStyle": "kimi-nested",
6647
7014
  "doneBannerStyle": "kimi-agent-file",
6648
- "skipSharedHooksInstall": true
7015
+ "skipSharedHooksInstall": true,
7016
+ "noPathRewrite": true
6649
7017
  }
6650
7018
  }
6651
7019
  },
6652
7020
  "kimi-code": {
6653
7021
  "id": "kimi-code",
6654
7022
  "role": "runtime",
6655
- "version": "1.12.0",
7023
+ "version": "1.13.0",
6656
7024
  "title": "Kimi Code CLI",
6657
7025
  "description": "Kimi Code CLI (Moonshot AI, Node) — Agent Skills auto-discovered at ~/.kimi-code/skills; global AGENTS.md at ~/.kimi-code/AGENTS.md; native config.toml + [[hooks]] bus; three built-in subagents (coder/explore/plan), NO custom named subagents; background dispatch; tier-2 support. Distinct from Python kimi-cli (the 'kimi' capability) per ADR-1239 EoS — Kimi Code cannot dispatch named subagents so the kimi-agents YAML layout does NOT apply; persona injection rides the existing ${AGENT_SKILLS_*} workflow fallback. Install-layout, agent-install-check, and install-time decision (kimi vs kimi-code) land in follow-up PRs; this descriptor is the EoS foundation.",
6658
7026
  "tier": "core",
@@ -6737,7 +7105,8 @@ const runtimes = {
6737
7105
  "explore",
6738
7106
  "plan"
6739
7107
  ],
6740
- "isolation": "orchestrator-worktree"
7108
+ "isolation": "orchestrator-worktree",
7109
+ "maxConcurrency": "undocumented"
6741
7110
  },
6742
7111
  "modelMode": "passive",
6743
7112
  "hookBus": "host",
@@ -6786,12 +7155,15 @@ const runtimes = {
6786
7155
  "effortChannel": "none"
6787
7156
  },
6788
7157
  "timeoutFloorMs": 900000,
7158
+ "timeoutConfigKey": "review.timeouts.kimi-code",
6789
7159
  "emptyOutput": "stub-with-stderr",
6790
7160
  "reviewsSection": "Kimi Code",
6791
7161
  "evidenceClass": "source-grounded",
6792
7162
  "requiresBinaries": [],
6793
7163
  "promptBudgetKey": "review.max_prompt_tokens_per_reviewer.kimi-code",
6794
7164
  "modelConfigKey": "review.models.kimi-code",
7165
+ "effortConfigKey": null,
7166
+ "defaultEffort": null,
6795
7167
  "handler": null
6796
7168
  },
6797
7169
  "config": {
@@ -6804,13 +7176,18 @@ const runtimes = {
6804
7176
  "type": "number",
6805
7177
  "default": -1,
6806
7178
  "description": "Prompt-token budget for the Kimi Code reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
7179
+ },
7180
+ "review.timeouts.kimi-code": {
7181
+ "type": "number",
7182
+ "default": -1,
7183
+ "description": "Outer wall-clock timeout override (seconds) for the Kimi Code reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
6807
7184
  }
6808
7185
  }
6809
7186
  },
6810
7187
  "opencode": {
6811
7188
  "id": "opencode",
6812
7189
  "role": "runtime",
6813
- "version": "1.12.0",
7190
+ "version": "1.13.0",
6814
7191
  "title": "OpenCode",
6815
7192
  "description": "OpenCode — XDG-based config dir; flat commands/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.",
6816
7193
  "tier": "core",
@@ -6907,7 +7284,8 @@ const runtimes = {
6907
7284
  "background": false,
6908
7285
  "subagentToolkit": "full",
6909
7286
  "backgroundDispatch": false,
6910
- "isolation": "orchestrator-worktree"
7287
+ "isolation": "orchestrator-worktree",
7288
+ "maxConcurrency": "undocumented"
6911
7289
  },
6912
7290
  "modelMode": "active",
6913
7291
  "hookBus": "host",
@@ -6967,12 +7345,15 @@ const runtimes = {
6967
7345
  "effortChannel": "argv"
6968
7346
  },
6969
7347
  "timeoutFloorMs": 660000,
7348
+ "timeoutConfigKey": "review.timeouts.opencode",
6970
7349
  "emptyOutput": "stub-with-stderr",
6971
7350
  "reviewsSection": "OpenCode",
6972
7351
  "evidenceClass": "source-grounded",
6973
7352
  "requiresBinaries": [],
6974
7353
  "promptBudgetKey": "review.max_prompt_tokens_per_reviewer.opencode",
6975
7354
  "modelConfigKey": "review.models.opencode",
7355
+ "effortConfigKey": "review.effort.opencode",
7356
+ "defaultEffort": "high",
6976
7357
  "handler": "opencode"
6977
7358
  },
6978
7359
  "config": {
@@ -6985,13 +7366,23 @@ const runtimes = {
6985
7366
  "type": "number",
6986
7367
  "default": -1,
6987
7368
  "description": "Prompt-token budget for the OpenCode reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
7369
+ },
7370
+ "review.timeouts.opencode": {
7371
+ "type": "number",
7372
+ "default": -1,
7373
+ "description": "Outer wall-clock timeout override (seconds) for the OpenCode reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
7374
+ },
7375
+ "review.effort.opencode": {
7376
+ "type": "string",
7377
+ "default": "",
7378
+ "description": "Reasoning effort for the OpenCode reviewer lane: minimal, low, medium, high, xhigh, max, or inherit. Unset falls back to the lane's declared review default (high); inherit emits no effort argument so the CLI's own configuration decides. An unrecognized value falls back to the lane default rather than being forwarded."
6988
7379
  }
6989
7380
  }
6990
7381
  },
6991
7382
  "pi": {
6992
7383
  "id": "pi",
6993
7384
  "role": "runtime",
6994
- "version": "1.12.0",
7385
+ "version": "1.13.0",
6995
7386
  "title": "pi",
6996
7387
  "description": "pi (pi.dev) — bun-runtime programmatic-CLI; TS ExtensionAPI (registerCommand/registerTool/registerProvider/pi.on); single native-extension file at ~/.pi/agent/extensions/gsd.js (.js, not .cjs — pi's extension auto-discovery accepts only .ts/.js, #2470); no shared-settings hook surface; tier-2 support.",
6997
7388
  "tier": "core",
@@ -7037,7 +7428,8 @@ const runtimes = {
7037
7428
  "background": false,
7038
7429
  "backgroundDispatch": false,
7039
7430
  "subagentToolkit": "undocumented",
7040
- "isolation": "none"
7431
+ "isolation": "none",
7432
+ "maxConcurrency": "undocumented"
7041
7433
  },
7042
7434
  "modelMode": "active",
7043
7435
  "hookBus": "host",
@@ -7060,7 +7452,7 @@ const runtimes = {
7060
7452
  "qwen": {
7061
7453
  "id": "qwen",
7062
7454
  "role": "runtime",
7063
- "version": "1.12.0",
7455
+ "version": "1.13.0",
7064
7456
  "title": "Qwen Code",
7065
7457
  "description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
7066
7458
  "tier": "core",
@@ -7144,7 +7536,8 @@ const runtimes = {
7144
7536
  "background": true,
7145
7537
  "subagentToolkit": "full",
7146
7538
  "backgroundDispatch": false,
7147
- "isolation": "undocumented"
7539
+ "isolation": "undocumented",
7540
+ "maxConcurrency": "undocumented"
7148
7541
  },
7149
7542
  "modelMode": "passive",
7150
7543
  "hookBus": "host",
@@ -7187,12 +7580,15 @@ const runtimes = {
7187
7580
  "effortChannel": "none"
7188
7581
  },
7189
7582
  "timeoutFloorMs": 900000,
7583
+ "timeoutConfigKey": null,
7190
7584
  "emptyOutput": "stub-with-stderr",
7191
7585
  "reviewsSection": "Qwen",
7192
7586
  "evidenceClass": "source-grounded",
7193
7587
  "requiresBinaries": [],
7194
7588
  "promptBudgetKey": "review.max_prompt_tokens_per_reviewer.qwen",
7195
7589
  "modelConfigKey": null,
7590
+ "effortConfigKey": null,
7591
+ "defaultEffort": null,
7196
7592
  "handler": null
7197
7593
  },
7198
7594
  "config": {
@@ -7206,7 +7602,7 @@ const runtimes = {
7206
7602
  "trae": {
7207
7603
  "id": "trae",
7208
7604
  "role": "runtime",
7209
- "version": "1.12.0",
7605
+ "version": "1.13.0",
7210
7606
  "title": "Trae IDE",
7211
7607
  "description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.",
7212
7608
  "tier": "core",
@@ -7284,7 +7680,8 @@ const runtimes = {
7284
7680
  "background": true,
7285
7681
  "subagentToolkit": "undocumented",
7286
7682
  "backgroundDispatch": "undocumented",
7287
- "isolation": "undocumented"
7683
+ "isolation": "undocumented",
7684
+ "maxConcurrency": "undocumented"
7288
7685
  },
7289
7686
  "modelMode": "passive",
7290
7687
  "hookBus": "engine",
@@ -7303,7 +7700,7 @@ const runtimes = {
7303
7700
  "vscode": {
7304
7701
  "id": "vscode",
7305
7702
  "role": "runtime",
7306
- "version": "1.12.0",
7703
+ "version": "1.13.0",
7307
7704
  "title": "VS Code",
7308
7705
  "description": "VS Code — Marketplace/VSIX extension; no file-projected config directory; IDE-profile reference host (active vscode.lm model, engine-owned hook bus, sandboxed globalState/workspaceState stateIO).",
7309
7706
  "tier": "core",
@@ -7346,7 +7743,8 @@ const runtimes = {
7346
7743
  "background": true,
7347
7744
  "subagentToolkit": "undocumented",
7348
7745
  "backgroundDispatch": "undocumented",
7349
- "isolation": "undocumented"
7746
+ "isolation": "undocumented",
7747
+ "maxConcurrency": "undocumented"
7350
7748
  },
7351
7749
  "modelMode": "active",
7352
7750
  "hookBus": "engine",
@@ -7360,7 +7758,7 @@ const runtimes = {
7360
7758
  "windsurf": {
7361
7759
  "id": "windsurf",
7362
7760
  "role": "runtime",
7363
- "version": "1.12.0",
7761
+ "version": "1.13.0",
7364
7762
  "title": "Windsurf",
7365
7763
  "description": "Windsurf (Codeium) — workspace workflow artifact layout for slash commands; Cascade native hooks.json blocking hook bus (pre_write_code, pre_run_command); tier-2 support.",
7366
7764
  "tier": "core",
@@ -7431,7 +7829,8 @@ const runtimes = {
7431
7829
  "background": "undocumented",
7432
7830
  "subagentToolkit": "undocumented",
7433
7831
  "backgroundDispatch": "undocumented",
7434
- "isolation": "none"
7832
+ "isolation": "none",
7833
+ "maxConcurrency": "undocumented"
7435
7834
  },
7436
7835
  "modelMode": "passive",
7437
7836
  "hookBus": "host",
@@ -7451,7 +7850,7 @@ const runtimes = {
7451
7850
  "zcode": {
7452
7851
  "id": "zcode",
7453
7852
  "role": "runtime",
7454
- "version": "1.12.0",
7853
+ "version": "1.13.0",
7455
7854
  "title": "ZCode",
7456
7855
  "description": "ZCode (Z.ai) — desktop Agentic Development Environment for GLM-5.2; Claude-shaped nested skills at ~/.zcode/skills/<name>/SKILL.md, slash commands, named subagents, native MCP; declarative plugin surface; profile-marker install; tier-2 community support.",
7457
7856
  "tier": "core",
@@ -7545,7 +7944,8 @@ const runtimes = {
7545
7944
  "background": false,
7546
7945
  "subagentToolkit": "full",
7547
7946
  "backgroundDispatch": false,
7548
- "isolation": "none"
7947
+ "isolation": "none",
7948
+ "maxConcurrency": "undocumented"
7549
7949
  },
7550
7950
  "modelMode": "passive",
7551
7951
  "hookBus": "host",