@jterrats/open-orchestra 0.5.5 → 1.0.1

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 (310) hide show
  1. package/AGENTS.md +9 -8
  2. package/CLAUDE.md +13 -11
  3. package/README.md +78 -11
  4. package/dist/assets/web-console.js +203 -36
  5. package/dist/automation-evidence.d.ts +23 -0
  6. package/dist/automation-evidence.js +97 -0
  7. package/dist/automation-evidence.js.map +1 -0
  8. package/dist/autonomous-run-state.d.ts +4 -1
  9. package/dist/autonomous-run-state.js +8 -2
  10. package/dist/autonomous-run-state.js.map +1 -1
  11. package/dist/autonomous-run-store.d.ts +3 -1
  12. package/dist/autonomous-run-store.js +9 -3
  13. package/dist/autonomous-run-store.js.map +1 -1
  14. package/dist/autonomous-workflow-constants.js +5 -1
  15. package/dist/autonomous-workflow-constants.js.map +1 -1
  16. package/dist/benchmark.d.ts +4 -1
  17. package/dist/benchmark.js +140 -19
  18. package/dist/benchmark.js.map +1 -1
  19. package/dist/cli.js +88 -2
  20. package/dist/cli.js.map +1 -1
  21. package/dist/collaboration-flows.js +5 -19
  22. package/dist/collaboration-flows.js.map +1 -1
  23. package/dist/collection-utils.d.ts +3 -0
  24. package/dist/collection-utils.js +10 -0
  25. package/dist/collection-utils.js.map +1 -0
  26. package/dist/command-manifest.d.ts +12 -1
  27. package/dist/command-manifest.js +218 -10
  28. package/dist/command-manifest.js.map +1 -1
  29. package/dist/commands.d.ts +14 -6
  30. package/dist/commands.js +78 -28
  31. package/dist/commands.js.map +1 -1
  32. package/dist/config-migrations.d.ts +24 -0
  33. package/dist/config-migrations.js +102 -0
  34. package/dist/config-migrations.js.map +1 -0
  35. package/dist/constants.d.ts +3 -0
  36. package/dist/constants.js +26 -0
  37. package/dist/constants.js.map +1 -1
  38. package/dist/cursor-canvas.d.ts +20 -0
  39. package/dist/cursor-canvas.js +119 -0
  40. package/dist/cursor-canvas.js.map +1 -0
  41. package/dist/dashboard-commands.d.ts +2 -0
  42. package/dist/dashboard-commands.js +14 -0
  43. package/dist/dashboard-commands.js.map +1 -0
  44. package/dist/defaults.d.ts +13 -0
  45. package/dist/defaults.js +13 -0
  46. package/dist/defaults.js.map +1 -1
  47. package/dist/delegation-decision.js +23 -8
  48. package/dist/delegation-decision.js.map +1 -1
  49. package/dist/delivery-commands.js +5 -0
  50. package/dist/delivery-commands.js.map +1 -1
  51. package/dist/delivery-dashboard-charts.d.ts +4 -0
  52. package/dist/delivery-dashboard-charts.js +156 -0
  53. package/dist/delivery-dashboard-charts.js.map +1 -0
  54. package/dist/delivery-dashboard-html.d.ts +2 -0
  55. package/dist/delivery-dashboard-html.js +115 -0
  56. package/dist/delivery-dashboard-html.js.map +1 -0
  57. package/dist/delivery-dashboard-types.d.ts +78 -0
  58. package/dist/delivery-dashboard-types.js +2 -0
  59. package/dist/delivery-dashboard-types.js.map +1 -0
  60. package/dist/delivery-dashboard.d.ts +8 -0
  61. package/dist/delivery-dashboard.js +124 -0
  62. package/dist/delivery-dashboard.js.map +1 -0
  63. package/dist/doc-sync.d.ts +25 -0
  64. package/dist/doc-sync.js +79 -0
  65. package/dist/doc-sync.js.map +1 -0
  66. package/dist/effort-classification.d.ts +7 -0
  67. package/dist/effort-classification.js +72 -0
  68. package/dist/effort-classification.js.map +1 -0
  69. package/dist/extension-commands.d.ts +3 -0
  70. package/dist/extension-commands.js +40 -0
  71. package/dist/extension-commands.js.map +1 -0
  72. package/dist/extensions.d.ts +22 -0
  73. package/dist/extensions.js +126 -0
  74. package/dist/extensions.js.map +1 -0
  75. package/dist/gemini-provider.d.ts +3 -6
  76. package/dist/gemini-provider.js +8 -17
  77. package/dist/gemini-provider.js.map +1 -1
  78. package/dist/github.d.ts +2 -0
  79. package/dist/github.js +15 -3
  80. package/dist/github.js.map +1 -1
  81. package/dist/health-checks.js +51 -0
  82. package/dist/health-checks.js.map +1 -1
  83. package/dist/lucid-story-map.d.ts +73 -0
  84. package/dist/lucid-story-map.js +112 -0
  85. package/dist/lucid-story-map.js.map +1 -0
  86. package/dist/mcp-integrations.d.ts +19 -0
  87. package/dist/mcp-integrations.js +58 -0
  88. package/dist/mcp-integrations.js.map +1 -0
  89. package/dist/mcp-tool-adapter.d.ts +21 -0
  90. package/dist/mcp-tool-adapter.js +56 -0
  91. package/dist/mcp-tool-adapter.js.map +1 -0
  92. package/dist/metrics-commands.js +47 -13
  93. package/dist/metrics-commands.js.map +1 -1
  94. package/dist/model-commands.d.ts +5 -0
  95. package/dist/model-commands.js +95 -1
  96. package/dist/model-commands.js.map +1 -1
  97. package/dist/model-providers.d.ts +5 -12
  98. package/dist/model-providers.js +30 -43
  99. package/dist/model-providers.js.map +1 -1
  100. package/dist/network-policy.d.ts +2 -0
  101. package/dist/network-policy.js +6 -0
  102. package/dist/network-policy.js.map +1 -0
  103. package/dist/ollama-provider.d.ts +3 -6
  104. package/dist/ollama-provider.js +7 -16
  105. package/dist/ollama-provider.js.map +1 -1
  106. package/dist/package-update-check.d.ts +19 -0
  107. package/dist/package-update-check.js +24 -0
  108. package/dist/package-update-check.js.map +1 -1
  109. package/dist/phase-executor.d.ts +1 -0
  110. package/dist/phase-executor.js +401 -9
  111. package/dist/phase-executor.js.map +1 -1
  112. package/dist/phase-playbooks.d.ts +18 -1
  113. package/dist/phase-playbooks.js +146 -2
  114. package/dist/phase-playbooks.js.map +1 -1
  115. package/dist/planning-commands.d.ts +1 -0
  116. package/dist/planning-commands.js +36 -36
  117. package/dist/planning-commands.js.map +1 -1
  118. package/dist/policy-commands.d.ts +2 -0
  119. package/dist/policy-commands.js +29 -0
  120. package/dist/policy-commands.js.map +1 -0
  121. package/dist/policy-defaults.d.ts +2 -0
  122. package/dist/policy-defaults.js +42 -0
  123. package/dist/policy-defaults.js.map +1 -0
  124. package/dist/policy.d.ts +20 -0
  125. package/dist/policy.js +155 -0
  126. package/dist/policy.js.map +1 -0
  127. package/dist/project-detection.js +9 -7
  128. package/dist/project-detection.js.map +1 -1
  129. package/dist/prompt-registry-update.d.ts +2 -0
  130. package/dist/prompt-registry-update.js +5 -1
  131. package/dist/prompt-registry-update.js.map +1 -1
  132. package/dist/prompt-registry-validation.d.ts +3 -0
  133. package/dist/prompt-registry-validation.js +61 -21
  134. package/dist/prompt-registry-validation.js.map +1 -1
  135. package/dist/provider-utils.d.ts +11 -0
  136. package/dist/provider-utils.js +14 -0
  137. package/dist/provider-utils.js.map +1 -1
  138. package/dist/qa-commands.d.ts +2 -0
  139. package/dist/qa-commands.js +18 -0
  140. package/dist/qa-commands.js.map +1 -0
  141. package/dist/qa-coverage.d.ts +24 -0
  142. package/dist/qa-coverage.js +189 -0
  143. package/dist/qa-coverage.js.map +1 -0
  144. package/dist/qa-readiness.d.ts +5 -0
  145. package/dist/qa-readiness.js +26 -0
  146. package/dist/qa-readiness.js.map +1 -0
  147. package/dist/refresh-generated.d.ts +32 -0
  148. package/dist/refresh-generated.js +180 -0
  149. package/dist/refresh-generated.js.map +1 -0
  150. package/dist/release-candidate.d.ts +9 -1
  151. package/dist/release-candidate.js +52 -1
  152. package/dist/release-candidate.js.map +1 -1
  153. package/dist/release-commands.js +161 -8
  154. package/dist/release-commands.js.map +1 -1
  155. package/dist/release-readiness.d.ts +33 -0
  156. package/dist/release-readiness.js +187 -3
  157. package/dist/release-readiness.js.map +1 -1
  158. package/dist/runtime-adapters.d.ts +2 -1
  159. package/dist/runtime-adapters.js +16 -0
  160. package/dist/runtime-adapters.js.map +1 -1
  161. package/dist/runtime-bootstrap.js +1 -1
  162. package/dist/runtime-bootstrap.js.map +1 -1
  163. package/dist/runtime-commands.d.ts +2 -0
  164. package/dist/runtime-commands.js +85 -3
  165. package/dist/runtime-commands.js.map +1 -1
  166. package/dist/runtime-execution-adapters.js +40 -0
  167. package/dist/runtime-execution-adapters.js.map +1 -1
  168. package/dist/runtime-execution-renderer.d.ts +3 -2
  169. package/dist/runtime-execution-renderer.js +46 -8
  170. package/dist/runtime-execution-renderer.js.map +1 -1
  171. package/dist/runtime-execution.d.ts +8 -2
  172. package/dist/runtime-execution.js +109 -11
  173. package/dist/runtime-execution.js.map +1 -1
  174. package/dist/runtime-guardrails.d.ts +26 -0
  175. package/dist/runtime-guardrails.js +168 -0
  176. package/dist/runtime-guardrails.js.map +1 -0
  177. package/dist/setup-agents-import.js +5 -3
  178. package/dist/setup-agents-import.js.map +1 -1
  179. package/dist/skills-catalog.js +1 -0
  180. package/dist/skills-catalog.js.map +1 -1
  181. package/dist/skills-commands.d.ts +5 -0
  182. package/dist/skills-commands.js +79 -2
  183. package/dist/skills-commands.js.map +1 -1
  184. package/dist/skills-memory.d.ts +36 -2
  185. package/dist/skills-memory.js +165 -6
  186. package/dist/skills-memory.js.map +1 -1
  187. package/dist/skills-planning.js +9 -22
  188. package/dist/skills-planning.js.map +1 -1
  189. package/dist/skills-render.js +2 -4
  190. package/dist/skills-render.js.map +1 -1
  191. package/dist/skills.d.ts +1 -1
  192. package/dist/skills.js +1 -1
  193. package/dist/skills.js.map +1 -1
  194. package/dist/sprint-commands.js +2 -1
  195. package/dist/sprint-commands.js.map +1 -1
  196. package/dist/subagent-protocol.js +3 -5
  197. package/dist/subagent-protocol.js.map +1 -1
  198. package/dist/support-commands.d.ts +2 -0
  199. package/dist/support-commands.js +18 -0
  200. package/dist/support-commands.js.map +1 -0
  201. package/dist/support-diagnostics.d.ts +49 -0
  202. package/dist/support-diagnostics.js +86 -0
  203. package/dist/support-diagnostics.js.map +1 -0
  204. package/dist/task-graph-commands.js +6 -14
  205. package/dist/task-graph-commands.js.map +1 -1
  206. package/dist/task-text.d.ts +8 -0
  207. package/dist/task-text.js +18 -0
  208. package/dist/task-text.js.map +1 -0
  209. package/dist/telemetry-redaction.js +8 -1
  210. package/dist/telemetry-redaction.js.map +1 -1
  211. package/dist/tool-commands.d.ts +3 -0
  212. package/dist/tool-commands.js +62 -0
  213. package/dist/tool-commands.js.map +1 -1
  214. package/dist/tracker-adapters.d.ts +71 -0
  215. package/dist/tracker-adapters.js +186 -0
  216. package/dist/tracker-adapters.js.map +1 -0
  217. package/dist/tracker-commands.d.ts +2 -0
  218. package/dist/tracker-commands.js +119 -0
  219. package/dist/tracker-commands.js.map +1 -0
  220. package/dist/types/metrics.d.ts +25 -1
  221. package/dist/types/model-config.d.ts +51 -4
  222. package/dist/types/runtime.d.ts +83 -0
  223. package/dist/types/skills.d.ts +2 -0
  224. package/dist/types/tasks.d.ts +10 -0
  225. package/dist/types/workflow-run.d.ts +35 -0
  226. package/dist/types.d.ts +12 -4
  227. package/dist/types.js.map +1 -1
  228. package/dist/upgrade-commands.js +13 -4
  229. package/dist/upgrade-commands.js.map +1 -1
  230. package/dist/validation.js +2 -2
  231. package/dist/validation.js.map +1 -1
  232. package/dist/visual-validation.d.ts +81 -0
  233. package/dist/visual-validation.js +290 -0
  234. package/dist/visual-validation.js.map +1 -0
  235. package/dist/web-action-security.d.ts +11 -0
  236. package/dist/web-action-security.js +45 -0
  237. package/dist/web-action-security.js.map +1 -0
  238. package/dist/web-api-read-routes.js +115 -3
  239. package/dist/web-api-read-routes.js.map +1 -1
  240. package/dist/web-api.js +507 -5
  241. package/dist/web-api.js.map +1 -1
  242. package/dist/web-artifacts.d.ts +55 -0
  243. package/dist/web-artifacts.js +222 -0
  244. package/dist/web-artifacts.js.map +1 -0
  245. package/dist/web-console/assets/index-C9lx-V42.css +1 -0
  246. package/dist/web-console/assets/index-M3S0g1GK.js +11 -0
  247. package/dist/web-console/index.html +13 -0
  248. package/dist/web-console.js +9 -3
  249. package/dist/web-console.js.map +1 -1
  250. package/dist/web-recovery.d.ts +30 -0
  251. package/dist/web-recovery.js +163 -0
  252. package/dist/web-recovery.js.map +1 -0
  253. package/dist/web-workflow-progress.d.ts +41 -0
  254. package/dist/web-workflow-progress.js +114 -0
  255. package/dist/web-workflow-progress.js.map +1 -0
  256. package/dist/workflow-approval-service.d.ts +2 -1
  257. package/dist/workflow-approval-service.js +83 -4
  258. package/dist/workflow-approval-service.js.map +1 -1
  259. package/dist/workflow-approval-utils.js +13 -3
  260. package/dist/workflow-approval-utils.js.map +1 -1
  261. package/dist/workflow-event-query.d.ts +2 -0
  262. package/dist/workflow-event-query.js +6 -0
  263. package/dist/workflow-event-query.js.map +1 -0
  264. package/dist/workflow-evidence-service.js +18 -9
  265. package/dist/workflow-evidence-service.js.map +1 -1
  266. package/dist/workflow-gates.d.ts +2 -0
  267. package/dist/workflow-gates.js +103 -0
  268. package/dist/workflow-gates.js.map +1 -1
  269. package/dist/workflow-markdown.d.ts +6 -0
  270. package/dist/workflow-markdown.js +25 -0
  271. package/dist/workflow-markdown.js.map +1 -0
  272. package/dist/workflow-phase-planner.d.ts +19 -0
  273. package/dist/workflow-phase-planner.js +133 -0
  274. package/dist/workflow-phase-planner.js.map +1 -0
  275. package/dist/workflow-run-commands.d.ts +1 -0
  276. package/dist/workflow-run-commands.js +247 -20
  277. package/dist/workflow-run-commands.js.map +1 -1
  278. package/dist/workflow-services.d.ts +21 -12
  279. package/dist/workflow-services.js +376 -260
  280. package/dist/workflow-services.js.map +1 -1
  281. package/dist/workflow-task-service.d.ts +11 -0
  282. package/dist/workflow-task-service.js +242 -0
  283. package/dist/workflow-task-service.js.map +1 -0
  284. package/dist/workflow-templates.js +2 -14
  285. package/dist/workflow-templates.js.map +1 -1
  286. package/dist/workspace-validator.js +133 -5
  287. package/dist/workspace-validator.js.map +1 -1
  288. package/dist/workspace.js +10 -2
  289. package/dist/workspace.js.map +1 -1
  290. package/docs/adoption-guide.md +147 -0
  291. package/docs/autonomous-workflow.md +146 -28
  292. package/docs/benchmark.md +17 -9
  293. package/docs/command-contracts.md +18 -1
  294. package/docs/core-command-surface.md +62 -13
  295. package/docs/end-to-end-demo.md +1 -0
  296. package/docs/extension-contracts.md +83 -0
  297. package/docs/orchestra-mvp.md +86 -3
  298. package/docs/persona-workflows.md +32 -0
  299. package/docs/release-test-matrix.md +42 -0
  300. package/docs/runtime-adapters.md +113 -0
  301. package/docs/runtime-llm-flow.md +13 -0
  302. package/docs/setup-agents-applicability-review.md +173 -0
  303. package/docs/skill-loading-strategy.md +1 -0
  304. package/docs/source-of-truth-and-agent-learning.md +14 -0
  305. package/docs/traceability-flow.md +5 -1
  306. package/docs/tracker-adapter-contract.md +10 -1
  307. package/docs/web-console-qa.md +35 -0
  308. package/package.json +12 -6
  309. package/rules/development-engineering.mdc +66 -0
  310. package/skills/doc-sync/SKILL.md +2 -0
package/AGENTS.md CHANGED
@@ -43,6 +43,7 @@
43
43
  ## Development Engineering
44
44
 
45
45
  - APIs are product contracts: define request, response, error shape, auth, pagination, rate limits, compatibility, and idempotency before implementation.
46
+ - Load `rules/development-engineering.mdc` for implementation work that changes entry points, services, data access, async jobs, integrations, or tests.
46
47
  - Data models must use domain language, explicit invariants, clear ownership, safe migrations, and indexes based on real query patterns.
47
48
  - Frontend code must separate presentation, state, data access, and domain logic while preserving accessibility and responsive behavior.
48
49
  - Performance-sensitive work needs budgets, hot-path review, caching ownership, timeouts, retries, backoff, and measurement evidence.
@@ -150,7 +151,7 @@
150
151
  - Mark breaking changes with `!` and a `BREAKING CHANGE:` footer.
151
152
  - Keep PRs <400 lines. Review your own diff before requesting review.
152
153
 
153
- <!-- open-orchestra:start block-id="runtime-bootstrap" generator="open-orchestra runtime bootstrap" version="1" target="codex" source-manifest="open-orchestra command-manifest,runtime-bootstrap" content-sha256="411e2d184a03aafe61fc4b71d49011f83a4f94d33d3a64cc4cd590a979d07319" updated-at="2026-05-10T05:17:06.513Z" -->
154
+ <!-- open-orchestra:start block-id="runtime-bootstrap" generator="open-orchestra runtime bootstrap" version="1" target="codex" source-manifest="open-orchestra command-manifest,runtime-bootstrap" content-sha256="d178c80135edb9ad2161e8c20eb2cfbf8cbca8ce189150886428b024389525d0" updated-at="2026-05-13T20:55:31.307Z" -->
154
155
  # Open Orchestra Runtime Bootstrap
155
156
 
156
157
  Runtime target: Codex. Reference Open Orchestra from AGENTS.md so local CLI work follows workflow gates.
@@ -177,7 +178,7 @@ Use the correct owner role for the type of work:
177
178
 
178
179
  ### Step 2 — Declare effort baseline
179
180
  ```
180
- orchestra estimate --task <ID> --sizing <xs|s|m|l|xl> --solo-days <N> --ai-unguided-days <N>
181
+ orchestra estimate --task <ID> --sizing <xs|s|m|l|xl> --solo-days <N> --ai-unguided-days <N> --ai-guided-days <N>
181
182
  ```
182
183
 
183
184
  ### Step 3 — Run the autonomous workflow
@@ -219,17 +220,17 @@ orchestra benchmark --task <ID>
219
220
  ## Task Loop
220
221
  - `orchestra health` - Check local tools and workflow readiness.
221
222
  - `orchestra task list` - List local workflow tasks.
222
- - `orchestra context --task <id>` - Read task context bundle.
223
223
  - `orchestra delegation decide --task <id>` - Decide whether to delegate.
224
- - `orchestra plan --task <id>` - Render role execution plan.
225
224
  - `orchestra skills plan --task <id>` - Select task-scoped skills.
226
- - `orchestra skills render --target <target>` - Render skills for a runtime.
225
+ - `orchestra skills render --target <generic|claude|cursor|codex|vscode|windsurf>` - Render skills for a runtime.
227
226
  - `orchestra protocol render` - Render subagent protocol.
228
227
  - `orchestra workflow render --task <id>` - Render workflow templates.
229
- - `orchestra evidence add --task <id> --role <role> --type <type> --summary <text>` - Record delivery evidence.
230
- - `orchestra review --task <id> --role <role> --result <approve|block|changes> --findings <text> --recommendation <text>` - Record reviewer outcome.
231
- - `orchestra gate --gate <id> --task <id>` - Evaluate workflow gate.
232
228
  - `orchestra summary` - Summarize workspace state.
229
+ - `orchestra context --task <id>` - Read task context bundle.
230
+ - `orchestra plan --task <id>` - Render role execution plan.
231
+ - `orchestra gate --gate <architecture> --task <id>` - Evaluate workflow gate.
232
+ - `orchestra review --task <id> --role <role> --result <approve|block|changes> --findings <text> --recommendation <text>` - Record reviewer outcome.
233
+ - `orchestra evidence add --task <id> --role <role> --type <command|file|screenshot|trace|video|log|report> --summary <text>` - Record delivery evidence.
233
234
 
234
235
  ## Completion
235
236
  - Run the project validation gate.
package/CLAUDE.md CHANGED
@@ -7,7 +7,7 @@
7
7
  This repo uses Open Orchestra for all development work. Every feature or fix MUST go through the workflow:
8
8
 
9
9
  1. **Task registration**: `orchestra task add --id <ID> --title "..." --owner <role> --paths "..." --goal "..."` before any code is written.
10
- 2. **Effort baseline**: `orchestra estimate --task <ID> --sizing <xs|s|m|l|xl> --solo-days N --ai-unguided-days N` before starting implementation.
10
+ 2. **Effort baseline**: `orchestra estimate --task <ID> --sizing <xs|s|m|l|xl> --solo-days N --ai-unguided-days N --ai-guided-days N` before starting implementation.
11
11
  3. **Autonomous run**: `orchestra workflow run --task <ID> --gates phase` to execute the PM→PO→Architect→Developer→QA→Release phase sequence.
12
12
  4. **Sizing decision**: `orchestra decision add --task <ID> --owner architect --title "Story sizing" --decision "<sizing> [N points]" ...` is required before the developer phase proceeds.
13
13
  5. **Architect sizing format**: always use `"<xs|s|m|l|xl> [N points]"` in `--decision` so the sizing gate reads it correctly (e.g. `"m [5 points]"`).
@@ -169,7 +169,7 @@ Do NOT start implementation without a registered task and workflow run. Use `orc
169
169
  - Correct mistakes directly without apologizing.
170
170
  - **No Ninja Edits.** Summarize proposed changes and get agreement before modifying files.
171
171
 
172
- <!-- open-orchestra:start block-id="runtime-bootstrap" generator="open-orchestra runtime bootstrap" version="1" target="claude" source-manifest="open-orchestra command-manifest,runtime-bootstrap" content-sha256="af9e26eb55d14bc7d504c357f6fe6e996eaa2ea1ffb45a830afa15b1885fff8a" updated-at="2026-05-06T22:12:14.883Z" -->
172
+ <!-- open-orchestra:start block-id="runtime-bootstrap" generator="open-orchestra runtime bootstrap" version="1" target="claude" source-manifest="open-orchestra command-manifest,runtime-bootstrap" content-sha256="8ad91f1f2db994b21271bd101fe3902b70140366dd9f4f866f99c36a4a3d290f" updated-at="2026-05-13T20:55:31.305Z" -->
173
173
  # Open Orchestra Runtime Bootstrap
174
174
 
175
175
  Runtime target: Claude. Reference compact Open Orchestra blocks from CLAUDE.md and load task skills on demand.
@@ -196,7 +196,7 @@ Use the correct owner role for the type of work:
196
196
 
197
197
  ### Step 2 — Declare effort baseline
198
198
  ```
199
- orchestra estimate --task <ID> --sizing <xs|s|m|l|xl> --solo-days <N> --ai-unguided-days <N>
199
+ orchestra estimate --task <ID> --sizing <xs|s|m|l|xl> --solo-days <N> --ai-unguided-days <N> --ai-guided-days <N>
200
200
  ```
201
201
 
202
202
  ### Step 3 — Run the autonomous workflow
@@ -229,24 +229,26 @@ orchestra benchmark --task <ID>
229
229
  ```
230
230
 
231
231
  ## Active Work
232
- - Run `orchestra health --json`.
233
- - Run `orchestra task list --json` and identify the active task.
232
+ - At session start, run `orchestra health --json` before implementation or file edits.
233
+ - Run `orchestra task list --json --status pending,blocked,in_progress` and identify resumable work before creating a new task.
234
234
  - For the active task, run context, delegation, plan, skills, protocol, and workflow render commands.
235
+ - Run `orchestra validate --pre-run --task <ID> --json` before implementation; resolve missing estimate, workflow run, evidence, or review checks.
236
+ - If a user accepts a smaller/advisory path, record it with `orchestra validate --pre-run --task <ID> --bypass --bypass-rationale "..."`.
235
237
 
236
238
  ## Task Loop
237
239
  - `orchestra health` - Check local tools and workflow readiness.
238
240
  - `orchestra task list` - List local workflow tasks.
239
- - `orchestra context --task <id>` - Read task context bundle.
240
241
  - `orchestra delegation decide --task <id>` - Decide whether to delegate.
241
- - `orchestra plan --task <id>` - Render role execution plan.
242
242
  - `orchestra skills plan --task <id>` - Select task-scoped skills.
243
- - `orchestra skills render --target <target>` - Render skills for a runtime.
243
+ - `orchestra skills render --target <generic|claude|cursor|codex|vscode|windsurf>` - Render skills for a runtime.
244
244
  - `orchestra protocol render` - Render subagent protocol.
245
245
  - `orchestra workflow render --task <id>` - Render workflow templates.
246
- - `orchestra evidence add --task <id> --role <role> --type <type> --summary <text>` - Record delivery evidence.
247
- - `orchestra review --task <id> --role <role> --result <approve|block|changes> --findings <text> --recommendation <text>` - Record reviewer outcome.
248
- - `orchestra gate --gate <id> --task <id>` - Evaluate workflow gate.
249
246
  - `orchestra summary` - Summarize workspace state.
247
+ - `orchestra context --task <id>` - Read task context bundle.
248
+ - `orchestra plan --task <id>` - Render role execution plan.
249
+ - `orchestra gate --gate <architecture> --task <id>` - Evaluate workflow gate.
250
+ - `orchestra review --task <id> --role <role> --result <approve|block|changes> --findings <text> --recommendation <text>` - Record reviewer outcome.
251
+ - `orchestra evidence add --task <id> --role <role> --type <command|file|screenshot|trace|video|log|report> --summary <text>` - Record delivery evidence.
250
252
 
251
253
  ## Completion
252
254
  - Run the project validation gate.
package/README.md CHANGED
@@ -10,19 +10,34 @@ published install target.
10
10
 
11
11
  ## Quick Start
12
12
 
13
+ ### First Visible Value
14
+
13
15
  ```bash
14
16
  npm install -g @jterrats/open-orchestra
15
17
  orchestra init
16
18
  orchestra health --json
17
- orchestra task add --id DEMO-001 --title "Ship a governed change" --owner product_owner --paths "README.md"
18
- orchestra estimate --task DEMO-001 --sizing s --solo-days 1 --ai-unguided-days 0.5
19
- orchestra decision add --task DEMO-001 --owner architect --title "Story sizing" --decision "s 2 points" --context "First governed task" --consequences "Developer phase can start"
19
+ orchestra task add --id DEMO-001 --title "Ship a governed README update" --owner developer --paths "README.md"
20
20
  orchestra workflow run --task DEMO-001 --gates none
21
- orchestra evidence add --task DEMO-001 --role developer --type command --summary "Workflow completed"
22
- orchestra review --task DEMO-001 --role qa --result approve --findings "Evidence is present" --recommendation "Ready for release review"
21
+ orchestra status
23
22
  orchestra release candidate --dry-run --json
24
23
  ```
25
24
 
25
+ Success metric: a first-time user reaches a completed local workflow run and a
26
+ release-candidate preview in under ten minutes, without configuring provider
27
+ credentials or learning every gate type.
28
+
29
+ ### Governed Production Path
30
+
31
+ ```bash
32
+ orchestra task add --id STORY-001 --title "Ship a governed change" --owner product_owner --paths "README.md"
33
+ orchestra estimate --task STORY-001 --sizing s --solo-days 1 --ai-unguided-days 0.5 --ai-guided-days 0.25
34
+ orchestra decision add --task STORY-001 --owner architect --title "Story sizing" --decision "s 2 points" --context "Production story" --consequences "Developer phase can start"
35
+ orchestra workflow run --task STORY-001 --gates phase
36
+ orchestra evidence add --task STORY-001 --role developer --type command --summary "Validation passed" --command "npm run precommit" --exit-code 0
37
+ orchestra review --task STORY-001 --role qa --result approve --findings "Acceptance criteria covered" --recommendation "Ready for release review"
38
+ orchestra release check --json
39
+ ```
40
+
26
41
  Stable installs use `npm install -g @jterrats/open-orchestra@latest`. Beta
27
42
  dogfooding uses `npm install -g @jterrats/open-orchestra@beta`, followed by:
28
43
 
@@ -41,9 +56,10 @@ orchestra advisory convert --json
41
56
  When developing Open Orchestra from this repository, use `npm install`,
42
57
  `npm run build`, and `node bin/orchestra.js ...` to exercise the local source.
43
58
 
44
- The short path is: initialize workflow files, create a task, declare effort,
45
- record architect sizing, run the governed workflow, attach evidence/reviews, and
46
- check release readiness. For a disposable fake-provider walkthrough, see
59
+ The short path is: initialize workflow files, create a task, run the local
60
+ workflow, inspect status, and preview release readiness. The production path adds
61
+ explicit estimates, architecture sizing, human gates, command evidence, QA
62
+ review, and release checks. For a disposable fake-provider walkthrough, see
47
63
  [docs/end-to-end-demo.md](docs/end-to-end-demo.md).
48
64
 
49
65
  ## Core Product Surface
@@ -56,9 +72,13 @@ Start with the small command set that supports production delivery:
56
72
  `orchestra evidence add`, `orchestra review`.
57
73
  - Tracker and release: `orchestra github sync --issue <number>`,
58
74
  `orchestra release check --json`, `orchestra upgrade --smoke --json`.
75
+ - Workflow tooling: `orchestra workflow phase-plan --task <id>`,
76
+ `orchestra refresh --check --json`, `orchestra cursor canvas status --json`.
59
77
 
60
- Use `orchestra commands manifest --json` for the complete machine-readable
61
- reference. See [docs/core-command-surface.md](docs/core-command-surface.md) and
78
+ Use `orchestra -h` for the human quickstart and `orchestra help commands` for
79
+ the full command catalog. Use `orchestra commands manifest --json` for the
80
+ complete machine-readable reference. See
81
+ [docs/core-command-surface.md](docs/core-command-surface.md) and
62
82
  [docs/command-contracts.md](docs/command-contracts.md) for the stable/advanced
63
83
  split and automation contract.
64
84
 
@@ -73,6 +93,27 @@ management.
73
93
  For package naming rules, see [docs/package-naming.md](docs/package-naming.md).
74
94
  For tracker fallback behavior when `gh` is unavailable, see
75
95
  [docs/tracker-adapter-contract.md](docs/tracker-adapter-contract.md).
96
+ For the 1.0.0 documentation path across install, workflow, providers,
97
+ trackers, web console, release operations, troubleshooting, and migration, see
98
+ [docs/adoption-guide.md](docs/adoption-guide.md).
99
+
100
+ ## 1.0.0 Workflow Tooling
101
+
102
+ The 1.0.0 workflow surface keeps the CLI as the source of truth while making
103
+ generated files and runtime views easier to audit:
104
+
105
+ - `orchestra workflow phase-plan --task <id> --json` recommends optional UX,
106
+ docs, release, and risk-owner phases from task scope and project signals.
107
+ - Phase playbooks live in `.agent-workflow/playbooks/` and are loaded only for
108
+ the active phase in provider prompts, `workflow render`, runtime briefs, and
109
+ runtime delegation packets.
110
+ - `orchestra refresh --check --json` detects stale generated instruction files;
111
+ `orchestra refresh --dry-run` previews changes; `orchestra refresh --force`
112
+ updates managed blocks without overwriting user-authored content.
113
+ - Provider progress is visible in `workflow run` output and the local web
114
+ console through `/api/workflow/progress`.
115
+ - `orchestra cursor canvas status|sync|clean --json` is a Cursor-specific local
116
+ bridge. It is optional and separate from portable runtime bootstrap files.
76
117
 
77
118
  ## Supported Platforms
78
119
 
@@ -92,10 +133,33 @@ production release is ready only after the local precommit gate and CI
92
133
  installed-package dogfood pass on Ubuntu, macOS, and Windows for the current
93
134
  HEAD.
94
135
 
136
+ For the `1.0.0` milestone, `orchestra release check --json` also reports a
137
+ `gaReadiness` go/no-go section. GA blockers include uncovered acceptance
138
+ criteria, blocking reviews, active locks, missing smoke or rollback evidence,
139
+ missing documentation or observability evidence, missing security and package
140
+ provenance evidence, missing public CLI contract evidence, missing migration
141
+ readiness evidence, missing release test matrix evidence, and accepted risks
142
+ without a follow-up or expiry.
143
+
144
+ The release test matrix is available with:
145
+
146
+ ```bash
147
+ npm run release:matrix -- --json
148
+ ```
149
+
150
+ See [docs/release-test-matrix.md](docs/release-test-matrix.md).
151
+
95
152
  ## Autonomous Workflow
96
153
 
97
154
  The `workflow run` command executes a full story lifecycle as a governed multi-phase sequence without manual step-by-step commands. Each phase creates a sub-task, generates handoff artifacts, and persists state in an append-only run log.
98
155
 
156
+ Use `orchestra workflow run` when you want Orchestra to drive the complete
157
+ delivery lifecycle: PM, PO, Architect, Developer, QA, and Release, including
158
+ phase gates and resumable run state. Use `orchestra run` only when you want to
159
+ execute the already computed local task plan; it does not run the full
160
+ multi-phase lifecycle and should not be treated as a replacement for workflow
161
+ gates or release evidence.
162
+
99
163
  ```
100
164
  PM → PO [gate] → Architect [sizing gate] → Developer → QA [gate] → Release
101
165
  ```
@@ -161,6 +225,7 @@ orchestra estimate \
161
225
  --sizing m \
162
226
  --solo-days 5 \
163
227
  --ai-unguided-days 3 \
228
+ --ai-guided-days 2 \
164
229
  --confidence high
165
230
  ```
166
231
 
@@ -180,9 +245,11 @@ Benchmark: FEAT-001 [complete]
180
245
  Sizing: m
181
246
  Solo: 5d (declared)
182
247
  AI-unguided: 3d (declared)
248
+ AI-guided: 2d (declared)
183
249
  Actual: 1.4d
184
250
  vs Solo: -72%
185
- vs AI: -53%
251
+ vs AI-U: -53%
252
+ vs AI-G: -30%
186
253
  QA loops: 1
187
254
  Reviews: 3 (0 blocking)
188
255
  Evidence: 5 artifacts
@@ -21,18 +21,23 @@ var endpoints = [
21
21
  ["graph", "/api/graph/plan"],
22
22
  ["roles", "/api/roles"],
23
23
  ["evidence", "/api/evidence"],
24
+ ["reviews", "/api/reviews"],
25
+ ["decisions", "/api/decisions"],
26
+ ["providerHealth", "/api/provider/health"],
24
27
  ["approvals", "/api/approvals"],
25
28
  ["usage", "/api/usage"],
26
29
  ["budget", "/api/budget"],
27
30
  ["tasks", "/api/tasks"],
28
31
  ["workflowRuns", "/api/workflow/runs"],
32
+ ["workflowProgress", "/api/workflow/progress"],
29
33
  ["evidenceView", "/api/evidence/view"],
30
34
  ["roleActivation", "/api/roles/activation"],
31
35
  ["skills", "/api/skills"],
32
36
  ["sources", "/api/sources"],
33
37
  ["lessons", "/api/lessons"],
34
38
  ["workspaceClassification", "/api/workspace/classification"],
35
- ["runtimeAdapters", "/api/runtime/adapters"]
39
+ ["runtimeAdapters", "/api/runtime/adapters"],
40
+ ["runtimeInvocationPlans", "/api/runtime/invocation-plans"]
36
41
  ];
37
42
  var statePill = document.querySelector("#load-state");
38
43
  var lastUpdated = document.querySelector("#last-updated");
@@ -43,6 +48,10 @@ var validation = document.querySelector("#validation");
43
48
  var workspaceView = document.querySelector("#workspace-view");
44
49
  var graph = document.querySelector("#graph");
45
50
  var actions = document.querySelector("#actions");
51
+ var taskBoard = document.querySelector("#task-board");
52
+ var providerHealth = document.querySelector("#provider-health");
53
+ var decisionsList = document.querySelector("#decisions-list");
54
+ var reviewsList = document.querySelector("#reviews-list");
46
55
  var taskDetailSelect = document.querySelector("#task-detail-select");
47
56
  var taskDetail = document.querySelector("#task-detail");
48
57
  var taskOwner = document.querySelector("#task-owner");
@@ -142,9 +151,17 @@ function render(data) {
142
151
  renderValidation(data.validation);
143
152
  renderAdoptionGuide(data);
144
153
  renderReleaseReadiness(data);
145
- renderWorkspace(data.workspaceClassification, data.runtimeAdapters);
154
+ renderWorkspace(
155
+ data.workspaceClassification,
156
+ data.runtimeAdapters,
157
+ data.runtimeInvocationPlans
158
+ );
146
159
  renderGraph(data.graph);
147
160
  renderActions(data);
161
+ renderTaskBoard(data.tasks, data.workflowProgress);
162
+ renderProviderHealth(data.providerHealth);
163
+ renderEventList(decisionsList, data.decisions, "No decisions recorded");
164
+ renderEventList(reviewsList, data.reviews, "No reviews recorded");
148
165
  renderTaskDetailControls(data.tasks);
149
166
  renderTaskWriteControls(data.roles);
150
167
  renderCharts(data);
@@ -153,7 +170,7 @@ function render(data) {
153
170
  renderRoles(data.roleActivation);
154
171
  renderPlanning(data.roleActivation);
155
172
  renderWorkflowControls(data.tasks, data.workflowRuns);
156
- renderWorkflowRuns(data.workflowRuns);
173
+ renderWorkflowRuns(data.workflowRuns, data.workflowProgress);
157
174
  renderCost(data.usage, data.budget);
158
175
  renderPlaywrightTasks(data.tasks);
159
176
  renderSkillControls(data);
@@ -466,28 +483,40 @@ function renderReleaseReadiness(data) {
466
483
  }
467
484
  function readinessRow(ok, title, detail) {
468
485
  const node = listItem(title, detail);
469
- const tag = document.createElement("span");
470
- tag.className = ok ? "tag ok" : "tag warn";
471
- tag.textContent = ok ? "ready" : "attention";
486
+ const tag2 = document.createElement("span");
487
+ tag2.className = ok ? "tag ok" : "tag warn";
488
+ tag2.textContent = ok ? "ready" : "attention";
472
489
  const row = document.createElement("div");
473
490
  row.className = "tag-row";
474
- row.append(tag);
491
+ row.append(tag2);
475
492
  node.append(row);
476
493
  return node;
477
494
  }
478
- function renderWorkspace(classification, adapters) {
495
+ function renderWorkspace(classification, adapters, invocationPlans) {
479
496
  const adapterNames = adapters.map(function(adapter) {
480
497
  return adapter.label;
481
498
  });
499
+ const executablePlan = invocationPlans.find(function(plan) {
500
+ return plan.gated.command;
501
+ });
482
502
  replace(workspaceView, [
483
503
  listItem(
484
504
  classification.kind + " workspace",
485
505
  classification.recommendedAction
486
506
  ),
487
507
  listItem("Write policy", classification.writePolicy),
488
- listItem("Runtime targets", adapterNames.join(", "))
508
+ listItem("Runtime targets", adapterNames.join(", ")),
509
+ listItem(
510
+ "Runtime invocation",
511
+ executablePlan ? formatInvocationPlan(executablePlan.gated) : "brief-only"
512
+ )
489
513
  ]);
490
514
  }
515
+ function formatInvocationPlan(plan) {
516
+ const command = [plan.command].concat(plan.args).join(" ");
517
+ const status = plan.canExecute ? "enabled" : "planning only";
518
+ return command + " (" + plan.permissionMode + ", " + status + ")";
519
+ }
491
520
  function renderCharts(data) {
492
521
  const chartData = buildDashboardChartData(data);
493
522
  const hasChartData = chartData.taskStatus.length > 0 || chartData.graphState.length > 0 || chartData.costByProvider.length > 0;
@@ -581,10 +610,17 @@ function renderWorkflowControls(tasks, runs) {
581
610
  );
582
611
  document.querySelector("#workflow-start").disabled = !workflowTask.value || runningTaskIds.has(workflowTask.value);
583
612
  }
584
- function renderWorkflowRuns(runs) {
613
+ function renderWorkflowRuns(runs, progress) {
614
+ const progressByRun = new Map(
615
+ (progress || []).map(function(item) {
616
+ return [item.runId, item];
617
+ })
618
+ );
585
619
  replace(
586
620
  workflowRuns,
587
- runs.length > 0 ? runs.slice(0, 8).map(workflowRunItem) : [
621
+ runs.length > 0 ? runs.slice(0, 8).map(function(run) {
622
+ return workflowRunItem(run, progressByRun.get(run.id));
623
+ }) : [
588
624
  empty(
589
625
  "No workflow runs yet",
590
626
  "Start a task workflow to track phases, gates, and handoffs."
@@ -592,19 +628,24 @@ function renderWorkflowRuns(runs) {
592
628
  ]
593
629
  );
594
630
  }
595
- function workflowRunItem(run) {
631
+ function workflowRunItem(run, progress) {
596
632
  const phases = (run.phases || []).map(function(phase) {
597
633
  return phase.phase + ":" + phase.status;
598
634
  }).join(" -> ");
599
- const node = listItem(
600
- run.id + " [" + run.status + "]",
601
- run.taskId + " - gates " + run.gates + (phases ? " - " + phases : "")
602
- );
635
+ const activeProgress = [...run.phases || []].reverse().find(function(phase) {
636
+ return phase.providerProgress && phase.providerProgress.status === "running";
637
+ })?.providerProgress;
638
+ const progressText = activeProgress ? " - provider " + activeProgress.provider + "/" + activeProgress.model + " elapsed " + formatWorkflowElapsed(activeProgress) : "";
639
+ const progressDetail = progress ? workflowProgressDetail(progress) : run.taskId + " - gates " + run.gates + (phases ? " - " + phases : "") + progressText;
640
+ const node = listItem(run.id + " [" + run.status + "]", progressDetail);
603
641
  const pausedGate = [...run.phases || []].reverse().find(function(phase) {
604
642
  return phase.status === "gate_paused";
605
643
  });
606
644
  const row = document.createElement("div");
607
645
  row.className = "tag-row";
646
+ workflowProgressTags(run, progress).forEach(function(item) {
647
+ row.append(item);
648
+ });
608
649
  if (pausedGate) {
609
650
  const approve = document.createElement("button");
610
651
  approve.className = "text-button";
@@ -626,9 +667,61 @@ function workflowRunItem(run) {
626
667
  resume.textContent = "Resume";
627
668
  row.append(resume);
628
669
  }
670
+ if (run.status === "running" || run.status === "paused") {
671
+ const cancel = document.createElement("button");
672
+ cancel.className = "text-button secondary";
673
+ cancel.type = "button";
674
+ cancel.dataset.workflowAction = "cancel";
675
+ cancel.dataset.run = run.id;
676
+ cancel.textContent = "Cancel";
677
+ row.append(cancel);
678
+ }
629
679
  node.append(row);
630
680
  return node;
631
681
  }
682
+ function workflowProgressDetail(progress) {
683
+ const phase = progress.currentPhase ? progress.currentPhase + " (" + progress.currentRole + ")" : "No active phase";
684
+ const provider = progress.provider && progress.model ? " - provider " + progress.provider + "/" + progress.model : "";
685
+ const fallback = progress.fallbackState ? " - fallback " + progress.fallbackState : "";
686
+ const failure = progress.failureReason ? " - failure " + progress.failureReason : "";
687
+ return progress.taskId + " - gates " + progress.gates + " - " + progress.latestStatus + " - phase " + phase + " - " + progress.completedPhases + "/" + progress.totalPhases + " done - elapsed " + formatDuration(progress.elapsedMs) + provider + fallback + failure;
688
+ }
689
+ function workflowProgressTags(run, progress) {
690
+ if (!progress) {
691
+ return [tag(run.status, run.status === "failed" ? "warn" : "")];
692
+ }
693
+ const tags = [
694
+ tag(progress.status, progress.status === "failed" ? "warn" : "ok")
695
+ ];
696
+ if (progress.canApproveGate) {
697
+ tags.push(tag("gate paused", "warn"));
698
+ }
699
+ if (progress.canResume) {
700
+ tags.push(tag("resumable", "warn"));
701
+ }
702
+ if (progress.provider) {
703
+ tags.push(tag(progress.provider + "/" + progress.model, ""));
704
+ }
705
+ return tags;
706
+ }
707
+ function tag(text, tone) {
708
+ const node = document.createElement("span");
709
+ node.className = ["tag", tone].filter(Boolean).join(" ");
710
+ node.textContent = text;
711
+ return node;
712
+ }
713
+ function formatWorkflowElapsed(progress) {
714
+ const startedAt = Date.parse(progress.startedAt);
715
+ const elapsed = Number.isFinite(startedAt) ? Date.now() - startedAt : progress.elapsedMs || 0;
716
+ return formatDuration(elapsed);
717
+ }
718
+ function formatDuration(elapsed) {
719
+ if (elapsed < 1e3) return elapsed + "ms";
720
+ if (elapsed < 6e4) return (elapsed / 1e3).toFixed(1) + "s";
721
+ const minutes = Math.floor(elapsed / 6e4);
722
+ const seconds = Math.floor(elapsed % 6e4 / 1e3);
723
+ return minutes + "m" + String(seconds).padStart(2, "0") + "s";
724
+ }
632
725
  async function startWorkflowFromWeb() {
633
726
  if (!workflowTask.value) {
634
727
  setLoading("Select a task to start workflow", "warn");
@@ -659,6 +752,10 @@ async function handleWorkflowAction(event) {
659
752
  }
660
753
  if (button.dataset.workflowAction === "resume") {
661
754
  await resumeWorkflowFromWeb(button);
755
+ return;
756
+ }
757
+ if (button.dataset.workflowAction === "cancel") {
758
+ await cancelWorkflowFromWeb(button);
662
759
  }
663
760
  }
664
761
  async function approveWorkflowGateFromWeb(button) {
@@ -693,6 +790,21 @@ async function resumeWorkflowFromWeb(button) {
693
790
  }
694
791
  await loadDashboard();
695
792
  }
793
+ async function cancelWorkflowFromWeb(button) {
794
+ const response = await fetch("/api/workflow/cancel", {
795
+ method: "POST",
796
+ headers: { "content-type": "application/json" },
797
+ body: JSON.stringify({
798
+ run: button.dataset.run,
799
+ reason: "Canceled from web console"
800
+ })
801
+ });
802
+ if (!response.ok) {
803
+ setLoading("Workflow cancel failed", "warn");
804
+ return;
805
+ }
806
+ await loadDashboard();
807
+ }
696
808
  function renderCost(usage, budget) {
697
809
  const rows = [
698
810
  listItem("Requests", String(usage.totals.requests)),
@@ -808,10 +920,10 @@ function renderRoles(report) {
808
920
  ["activationCriteria", "expectedEvidence", "gateParticipation"].forEach(
809
921
  function(field) {
810
922
  (entry.role[field] || []).slice(0, 3).forEach(function(value) {
811
- const tag = document.createElement("span");
812
- tag.className = "tag";
813
- tag.textContent = value;
814
- tags.append(tag);
923
+ const tag2 = document.createElement("span");
924
+ tag2.className = "tag";
925
+ tag2.textContent = value;
926
+ tags.append(tag2);
815
927
  });
816
928
  }
817
929
  );
@@ -859,10 +971,10 @@ function renderSkillCatalog(skills, sources) {
859
971
  const tags = document.createElement("div");
860
972
  tags.className = "tag-row";
861
973
  skill.sourceGroups.slice(0, 4).forEach(function(group) {
862
- const tag = document.createElement("span");
863
- tag.className = "tag";
864
- tag.textContent = sourceMap.get(group) || group;
865
- tags.append(tag);
974
+ const tag2 = document.createElement("span");
975
+ tag2.className = "tag";
976
+ tag2.textContent = sourceMap.get(group) || group;
977
+ tags.append(tag2);
866
978
  });
867
979
  node.append(tags);
868
980
  return node;
@@ -900,10 +1012,10 @@ async function loadSkillPlan() {
900
1012
  const tags = document.createElement("div");
901
1013
  tags.className = "tag-row";
902
1014
  item.skill.sourceGroups.slice(0, 4).forEach(function(group) {
903
- const tag = document.createElement("span");
904
- tag.className = "tag";
905
- tag.textContent = group;
906
- tags.append(tag);
1015
+ const tag2 = document.createElement("span");
1016
+ tag2.className = "tag";
1017
+ tag2.textContent = group;
1018
+ tags.append(tag2);
907
1019
  });
908
1020
  node.append(tags);
909
1021
  return node;
@@ -944,10 +1056,10 @@ function renderSourceCatalog(sources) {
944
1056
  const tags = document.createElement("div");
945
1057
  tags.className = "tag-row";
946
1058
  source.locations.forEach(function(location) {
947
- const tag = document.createElement("span");
948
- tag.className = "tag";
949
- tag.textContent = location;
950
- tags.append(tag);
1059
+ const tag2 = document.createElement("span");
1060
+ tag2.className = "tag";
1061
+ tag2.textContent = location;
1062
+ tags.append(tag2);
951
1063
  });
952
1064
  node.append(tags);
953
1065
  return node;
@@ -971,10 +1083,10 @@ function renderLessons(lessons) {
971
1083
  tags.className = "tag-row";
972
1084
  const appliesTo = Array.isArray(lesson.appliesTo) ? lesson.appliesTo : [];
973
1085
  appliesTo.slice(0, 4).forEach(function(tool) {
974
- const tag = document.createElement("span");
975
- tag.className = "tag";
976
- tag.textContent = tool;
977
- tags.append(tag);
1086
+ const tag2 = document.createElement("span");
1087
+ tag2.className = "tag";
1088
+ tag2.textContent = tool;
1089
+ tags.append(tag2);
978
1090
  });
979
1091
  node.append(tags);
980
1092
  return node;
@@ -1214,6 +1326,61 @@ function renderActions(data) {
1214
1326
  ]
1215
1327
  );
1216
1328
  }
1329
+ function renderTaskBoard(tasks, progressItems) {
1330
+ const progressByTask = new Map(
1331
+ (progressItems || []).map(function(item) {
1332
+ return [item.taskId, item];
1333
+ })
1334
+ );
1335
+ replace(
1336
+ taskBoard,
1337
+ tasks.length > 0 ? tasks.map(function(task) {
1338
+ const progress = progressByTask.get(task.id);
1339
+ const detail = [
1340
+ task.status,
1341
+ "owner " + task.ownerRole,
1342
+ task.backlogItem ? "issue " + task.backlogItem : "no issue",
1343
+ (task.paths || []).length > 0 ? "paths " + task.paths.slice(0, 3).join(", ") : "no paths",
1344
+ progress?.currentPhase ? "phase " + progress.currentPhase : ""
1345
+ ].filter(Boolean).join(" - ");
1346
+ return listItem(task.id + " - " + task.title, detail);
1347
+ }) : [empty("No tasks", "Create a task to populate the board.")]
1348
+ );
1349
+ }
1350
+ function renderProviderHealth(providers) {
1351
+ replace(
1352
+ providerHealth,
1353
+ providers.length > 0 ? providers.map(function(provider) {
1354
+ const node = listItem(
1355
+ provider.scope + " " + provider.provider + "/" + provider.model,
1356
+ provider.detail + " - timeout " + provider.timeoutMs + "ms - fallbacks " + (provider.fallbacks.length > 0 ? provider.fallbacks.join(", ") : "none")
1357
+ );
1358
+ const row = document.createElement("div");
1359
+ row.className = "tag-row";
1360
+ row.append(
1361
+ tag(provider.status, provider.status === "pass" ? "ok" : "warn")
1362
+ );
1363
+ node.append(row);
1364
+ return node;
1365
+ }) : [
1366
+ empty(
1367
+ "No provider routing",
1368
+ "Configure model providers to see health."
1369
+ )
1370
+ ]
1371
+ );
1372
+ }
1373
+ function renderEventList(target, events, emptyText) {
1374
+ replace(
1375
+ target,
1376
+ events.length > 0 ? events.slice(0, 8).map(function(event) {
1377
+ return listItem(
1378
+ event.taskId ? event.taskId + " - " + event.summary : event.summary,
1379
+ event.actor + " - " + new Date(event.timestamp).toLocaleString()
1380
+ );
1381
+ }) : [empty(emptyText, "No matching workflow events were found.")]
1382
+ );
1383
+ }
1217
1384
  function metric(value, label) {
1218
1385
  const node = document.createElement("div");
1219
1386
  node.className = "metric";