@jterrats/open-orchestra 0.5.7 → 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 (249) 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 +169 -32
  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-store.js +3 -3
  9. package/dist/autonomous-run-store.js.map +1 -1
  10. package/dist/benchmark.d.ts +4 -1
  11. package/dist/benchmark.js +93 -4
  12. package/dist/benchmark.js.map +1 -1
  13. package/dist/cli.js +73 -2
  14. package/dist/cli.js.map +1 -1
  15. package/dist/collaboration-flows.js +3 -5
  16. package/dist/collaboration-flows.js.map +1 -1
  17. package/dist/collection-utils.d.ts +3 -0
  18. package/dist/collection-utils.js +10 -0
  19. package/dist/collection-utils.js.map +1 -0
  20. package/dist/command-manifest.d.ts +12 -1
  21. package/dist/command-manifest.js +213 -10
  22. package/dist/command-manifest.js.map +1 -1
  23. package/dist/commands.d.ts +10 -5
  24. package/dist/commands.js +16 -6
  25. package/dist/commands.js.map +1 -1
  26. package/dist/config-migrations.d.ts +24 -0
  27. package/dist/config-migrations.js +102 -0
  28. package/dist/config-migrations.js.map +1 -0
  29. package/dist/constants.d.ts +2 -0
  30. package/dist/constants.js +22 -0
  31. package/dist/constants.js.map +1 -1
  32. package/dist/dashboard-commands.d.ts +2 -0
  33. package/dist/dashboard-commands.js +14 -0
  34. package/dist/dashboard-commands.js.map +1 -0
  35. package/dist/defaults.d.ts +13 -0
  36. package/dist/defaults.js +13 -0
  37. package/dist/defaults.js.map +1 -1
  38. package/dist/delegation-decision.js +23 -8
  39. package/dist/delegation-decision.js.map +1 -1
  40. package/dist/delivery-commands.js +5 -0
  41. package/dist/delivery-commands.js.map +1 -1
  42. package/dist/delivery-dashboard-charts.d.ts +4 -0
  43. package/dist/delivery-dashboard-charts.js +156 -0
  44. package/dist/delivery-dashboard-charts.js.map +1 -0
  45. package/dist/delivery-dashboard-html.d.ts +2 -0
  46. package/dist/delivery-dashboard-html.js +115 -0
  47. package/dist/delivery-dashboard-html.js.map +1 -0
  48. package/dist/delivery-dashboard-types.d.ts +78 -0
  49. package/dist/delivery-dashboard-types.js +2 -0
  50. package/dist/delivery-dashboard-types.js.map +1 -0
  51. package/dist/delivery-dashboard.d.ts +8 -0
  52. package/dist/delivery-dashboard.js +124 -0
  53. package/dist/delivery-dashboard.js.map +1 -0
  54. package/dist/effort-classification.d.ts +7 -0
  55. package/dist/effort-classification.js +72 -0
  56. package/dist/effort-classification.js.map +1 -0
  57. package/dist/extension-commands.d.ts +3 -0
  58. package/dist/extension-commands.js +40 -0
  59. package/dist/extension-commands.js.map +1 -0
  60. package/dist/extensions.d.ts +22 -0
  61. package/dist/extensions.js +126 -0
  62. package/dist/extensions.js.map +1 -0
  63. package/dist/github.d.ts +2 -0
  64. package/dist/github.js +15 -3
  65. package/dist/github.js.map +1 -1
  66. package/dist/health-checks.js +51 -0
  67. package/dist/health-checks.js.map +1 -1
  68. package/dist/lucid-story-map.d.ts +73 -0
  69. package/dist/lucid-story-map.js +112 -0
  70. package/dist/lucid-story-map.js.map +1 -0
  71. package/dist/mcp-integrations.d.ts +19 -0
  72. package/dist/mcp-integrations.js +58 -0
  73. package/dist/mcp-integrations.js.map +1 -0
  74. package/dist/mcp-tool-adapter.d.ts +21 -0
  75. package/dist/mcp-tool-adapter.js +56 -0
  76. package/dist/mcp-tool-adapter.js.map +1 -0
  77. package/dist/metrics-commands.js +47 -13
  78. package/dist/metrics-commands.js.map +1 -1
  79. package/dist/model-commands.d.ts +5 -0
  80. package/dist/model-commands.js +95 -1
  81. package/dist/model-commands.js.map +1 -1
  82. package/dist/model-providers.js +13 -1
  83. package/dist/model-providers.js.map +1 -1
  84. package/dist/package-update-check.d.ts +18 -0
  85. package/dist/package-update-check.js +20 -0
  86. package/dist/package-update-check.js.map +1 -1
  87. package/dist/phase-executor.d.ts +1 -0
  88. package/dist/phase-executor.js +115 -14
  89. package/dist/phase-executor.js.map +1 -1
  90. package/dist/phase-playbooks.d.ts +15 -0
  91. package/dist/phase-playbooks.js +82 -0
  92. package/dist/phase-playbooks.js.map +1 -1
  93. package/dist/planning-commands.d.ts +1 -0
  94. package/dist/planning-commands.js +24 -1
  95. package/dist/planning-commands.js.map +1 -1
  96. package/dist/project-detection.js +9 -7
  97. package/dist/project-detection.js.map +1 -1
  98. package/dist/prompt-registry-update.d.ts +2 -0
  99. package/dist/prompt-registry-update.js +5 -1
  100. package/dist/prompt-registry-update.js.map +1 -1
  101. package/dist/prompt-registry-validation.js +39 -2
  102. package/dist/prompt-registry-validation.js.map +1 -1
  103. package/dist/qa-commands.d.ts +2 -0
  104. package/dist/qa-commands.js +18 -0
  105. package/dist/qa-commands.js.map +1 -0
  106. package/dist/qa-coverage.d.ts +24 -0
  107. package/dist/qa-coverage.js +189 -0
  108. package/dist/qa-coverage.js.map +1 -0
  109. package/dist/qa-readiness.d.ts +5 -0
  110. package/dist/qa-readiness.js +26 -0
  111. package/dist/qa-readiness.js.map +1 -0
  112. package/dist/refresh-generated.d.ts +10 -1
  113. package/dist/refresh-generated.js +83 -6
  114. package/dist/refresh-generated.js.map +1 -1
  115. package/dist/release-candidate.d.ts +9 -1
  116. package/dist/release-candidate.js +52 -1
  117. package/dist/release-candidate.js.map +1 -1
  118. package/dist/release-commands.js +161 -8
  119. package/dist/release-commands.js.map +1 -1
  120. package/dist/release-readiness.d.ts +33 -0
  121. package/dist/release-readiness.js +187 -3
  122. package/dist/release-readiness.js.map +1 -1
  123. package/dist/runtime-bootstrap.js +1 -1
  124. package/dist/runtime-bootstrap.js.map +1 -1
  125. package/dist/runtime-commands.d.ts +2 -0
  126. package/dist/runtime-commands.js +77 -0
  127. package/dist/runtime-commands.js.map +1 -1
  128. package/dist/runtime-execution-renderer.d.ts +3 -2
  129. package/dist/runtime-execution-renderer.js +19 -1
  130. package/dist/runtime-execution-renderer.js.map +1 -1
  131. package/dist/runtime-execution.d.ts +2 -1
  132. package/dist/runtime-execution.js +71 -11
  133. package/dist/runtime-execution.js.map +1 -1
  134. package/dist/runtime-guardrails.d.ts +26 -0
  135. package/dist/runtime-guardrails.js +168 -0
  136. package/dist/runtime-guardrails.js.map +1 -0
  137. package/dist/setup-agents-import.js +5 -3
  138. package/dist/setup-agents-import.js.map +1 -1
  139. package/dist/skills-commands.d.ts +4 -0
  140. package/dist/skills-commands.js +55 -2
  141. package/dist/skills-commands.js.map +1 -1
  142. package/dist/skills-memory.d.ts +36 -2
  143. package/dist/skills-memory.js +165 -6
  144. package/dist/skills-memory.js.map +1 -1
  145. package/dist/skills-planning.js +2 -4
  146. package/dist/skills-planning.js.map +1 -1
  147. package/dist/skills-render.js +2 -4
  148. package/dist/skills-render.js.map +1 -1
  149. package/dist/skills.d.ts +1 -1
  150. package/dist/skills.js +1 -1
  151. package/dist/skills.js.map +1 -1
  152. package/dist/sprint-commands.js +2 -1
  153. package/dist/sprint-commands.js.map +1 -1
  154. package/dist/subagent-protocol.js +3 -5
  155. package/dist/subagent-protocol.js.map +1 -1
  156. package/dist/support-commands.d.ts +2 -0
  157. package/dist/support-commands.js +18 -0
  158. package/dist/support-commands.js.map +1 -0
  159. package/dist/support-diagnostics.d.ts +49 -0
  160. package/dist/support-diagnostics.js +86 -0
  161. package/dist/support-diagnostics.js.map +1 -0
  162. package/dist/task-graph-commands.js +5 -3
  163. package/dist/task-graph-commands.js.map +1 -1
  164. package/dist/telemetry-redaction.js +8 -1
  165. package/dist/telemetry-redaction.js.map +1 -1
  166. package/dist/tool-commands.d.ts +3 -0
  167. package/dist/tool-commands.js +62 -0
  168. package/dist/tool-commands.js.map +1 -1
  169. package/dist/tracker-adapters.d.ts +71 -0
  170. package/dist/tracker-adapters.js +186 -0
  171. package/dist/tracker-adapters.js.map +1 -0
  172. package/dist/tracker-commands.d.ts +2 -0
  173. package/dist/tracker-commands.js +119 -0
  174. package/dist/tracker-commands.js.map +1 -0
  175. package/dist/types/metrics.d.ts +24 -0
  176. package/dist/types/model-config.d.ts +35 -0
  177. package/dist/types/runtime.d.ts +56 -0
  178. package/dist/types/skills.d.ts +2 -0
  179. package/dist/types/tasks.d.ts +6 -0
  180. package/dist/types/workflow-run.d.ts +17 -0
  181. package/dist/types.d.ts +4 -4
  182. package/dist/types.js.map +1 -1
  183. package/dist/upgrade-commands.js +13 -4
  184. package/dist/upgrade-commands.js.map +1 -1
  185. package/dist/validation.js +2 -2
  186. package/dist/validation.js.map +1 -1
  187. package/dist/visual-validation.d.ts +81 -0
  188. package/dist/visual-validation.js +290 -0
  189. package/dist/visual-validation.js.map +1 -0
  190. package/dist/web-action-security.d.ts +11 -0
  191. package/dist/web-action-security.js +45 -0
  192. package/dist/web-action-security.js.map +1 -0
  193. package/dist/web-api-read-routes.js +101 -1
  194. package/dist/web-api-read-routes.js.map +1 -1
  195. package/dist/web-api.js +507 -5
  196. package/dist/web-api.js.map +1 -1
  197. package/dist/web-artifacts.d.ts +55 -0
  198. package/dist/web-artifacts.js +222 -0
  199. package/dist/web-artifacts.js.map +1 -0
  200. package/dist/web-console/assets/index-C9lx-V42.css +1 -0
  201. package/dist/web-console/assets/index-M3S0g1GK.js +11 -0
  202. package/dist/web-console/index.html +13 -0
  203. package/dist/web-console.js +9 -3
  204. package/dist/web-console.js.map +1 -1
  205. package/dist/web-recovery.d.ts +30 -0
  206. package/dist/web-recovery.js +163 -0
  207. package/dist/web-recovery.js.map +1 -0
  208. package/dist/web-workflow-progress.d.ts +41 -0
  209. package/dist/web-workflow-progress.js +114 -0
  210. package/dist/web-workflow-progress.js.map +1 -0
  211. package/dist/workflow-approval-service.d.ts +2 -1
  212. package/dist/workflow-approval-service.js +72 -0
  213. package/dist/workflow-approval-service.js.map +1 -1
  214. package/dist/workflow-evidence-service.js +8 -1
  215. package/dist/workflow-evidence-service.js.map +1 -1
  216. package/dist/workflow-gates.d.ts +1 -0
  217. package/dist/workflow-gates.js +57 -0
  218. package/dist/workflow-gates.js.map +1 -1
  219. package/dist/workflow-run-commands.js +13 -1
  220. package/dist/workflow-run-commands.js.map +1 -1
  221. package/dist/workflow-services.d.ts +16 -12
  222. package/dist/workflow-services.js +311 -253
  223. package/dist/workflow-services.js.map +1 -1
  224. package/dist/workflow-task-service.d.ts +11 -0
  225. package/dist/workflow-task-service.js +242 -0
  226. package/dist/workflow-task-service.js.map +1 -0
  227. package/dist/workspace-validator.js +109 -3
  228. package/dist/workspace-validator.js.map +1 -1
  229. package/dist/workspace.js +8 -2
  230. package/dist/workspace.js.map +1 -1
  231. package/docs/adoption-guide.md +147 -0
  232. package/docs/autonomous-workflow.md +118 -27
  233. package/docs/benchmark.md +15 -7
  234. package/docs/command-contracts.md +18 -1
  235. package/docs/core-command-surface.md +59 -13
  236. package/docs/end-to-end-demo.md +1 -0
  237. package/docs/extension-contracts.md +83 -0
  238. package/docs/orchestra-mvp.md +83 -3
  239. package/docs/persona-workflows.md +32 -0
  240. package/docs/release-test-matrix.md +42 -0
  241. package/docs/runtime-adapters.md +92 -0
  242. package/docs/runtime-llm-flow.md +13 -0
  243. package/docs/setup-agents-applicability-review.md +173 -0
  244. package/docs/source-of-truth-and-agent-learning.md +14 -0
  245. package/docs/traceability-flow.md +5 -1
  246. package/docs/tracker-adapter-contract.md +10 -1
  247. package/docs/web-console-qa.md +35 -0
  248. package/package.json +12 -6
  249. package/rules/development-engineering.mdc +66 -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,11 +21,15 @@ 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"],
@@ -44,6 +48,10 @@ var validation = document.querySelector("#validation");
44
48
  var workspaceView = document.querySelector("#workspace-view");
45
49
  var graph = document.querySelector("#graph");
46
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");
47
55
  var taskDetailSelect = document.querySelector("#task-detail-select");
48
56
  var taskDetail = document.querySelector("#task-detail");
49
57
  var taskOwner = document.querySelector("#task-owner");
@@ -150,6 +158,10 @@ function render(data) {
150
158
  );
151
159
  renderGraph(data.graph);
152
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");
153
165
  renderTaskDetailControls(data.tasks);
154
166
  renderTaskWriteControls(data.roles);
155
167
  renderCharts(data);
@@ -158,7 +170,7 @@ function render(data) {
158
170
  renderRoles(data.roleActivation);
159
171
  renderPlanning(data.roleActivation);
160
172
  renderWorkflowControls(data.tasks, data.workflowRuns);
161
- renderWorkflowRuns(data.workflowRuns);
173
+ renderWorkflowRuns(data.workflowRuns, data.workflowProgress);
162
174
  renderCost(data.usage, data.budget);
163
175
  renderPlaywrightTasks(data.tasks);
164
176
  renderSkillControls(data);
@@ -471,12 +483,12 @@ function renderReleaseReadiness(data) {
471
483
  }
472
484
  function readinessRow(ok, title, detail) {
473
485
  const node = listItem(title, detail);
474
- const tag = document.createElement("span");
475
- tag.className = ok ? "tag ok" : "tag warn";
476
- 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";
477
489
  const row = document.createElement("div");
478
490
  row.className = "tag-row";
479
- row.append(tag);
491
+ row.append(tag2);
480
492
  node.append(row);
481
493
  return node;
482
494
  }
@@ -598,10 +610,17 @@ function renderWorkflowControls(tasks, runs) {
598
610
  );
599
611
  document.querySelector("#workflow-start").disabled = !workflowTask.value || runningTaskIds.has(workflowTask.value);
600
612
  }
601
- 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
+ );
602
619
  replace(
603
620
  workflowRuns,
604
- 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
+ }) : [
605
624
  empty(
606
625
  "No workflow runs yet",
607
626
  "Start a task workflow to track phases, gates, and handoffs."
@@ -609,7 +628,7 @@ function renderWorkflowRuns(runs) {
609
628
  ]
610
629
  );
611
630
  }
612
- function workflowRunItem(run) {
631
+ function workflowRunItem(run, progress) {
613
632
  const phases = (run.phases || []).map(function(phase) {
614
633
  return phase.phase + ":" + phase.status;
615
634
  }).join(" -> ");
@@ -617,15 +636,16 @@ function workflowRunItem(run) {
617
636
  return phase.providerProgress && phase.providerProgress.status === "running";
618
637
  })?.providerProgress;
619
638
  const progressText = activeProgress ? " - provider " + activeProgress.provider + "/" + activeProgress.model + " elapsed " + formatWorkflowElapsed(activeProgress) : "";
620
- const node = listItem(
621
- run.id + " [" + run.status + "]",
622
- run.taskId + " - gates " + run.gates + (phases ? " - " + phases : "") + progressText
623
- );
639
+ const progressDetail = progress ? workflowProgressDetail(progress) : run.taskId + " - gates " + run.gates + (phases ? " - " + phases : "") + progressText;
640
+ const node = listItem(run.id + " [" + run.status + "]", progressDetail);
624
641
  const pausedGate = [...run.phases || []].reverse().find(function(phase) {
625
642
  return phase.status === "gate_paused";
626
643
  });
627
644
  const row = document.createElement("div");
628
645
  row.className = "tag-row";
646
+ workflowProgressTags(run, progress).forEach(function(item) {
647
+ row.append(item);
648
+ });
629
649
  if (pausedGate) {
630
650
  const approve = document.createElement("button");
631
651
  approve.className = "text-button";
@@ -647,12 +667,55 @@ function workflowRunItem(run) {
647
667
  resume.textContent = "Resume";
648
668
  row.append(resume);
649
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
+ }
650
679
  node.append(row);
651
680
  return node;
652
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
+ }
653
713
  function formatWorkflowElapsed(progress) {
654
714
  const startedAt = Date.parse(progress.startedAt);
655
715
  const elapsed = Number.isFinite(startedAt) ? Date.now() - startedAt : progress.elapsedMs || 0;
716
+ return formatDuration(elapsed);
717
+ }
718
+ function formatDuration(elapsed) {
656
719
  if (elapsed < 1e3) return elapsed + "ms";
657
720
  if (elapsed < 6e4) return (elapsed / 1e3).toFixed(1) + "s";
658
721
  const minutes = Math.floor(elapsed / 6e4);
@@ -689,6 +752,10 @@ async function handleWorkflowAction(event) {
689
752
  }
690
753
  if (button.dataset.workflowAction === "resume") {
691
754
  await resumeWorkflowFromWeb(button);
755
+ return;
756
+ }
757
+ if (button.dataset.workflowAction === "cancel") {
758
+ await cancelWorkflowFromWeb(button);
692
759
  }
693
760
  }
694
761
  async function approveWorkflowGateFromWeb(button) {
@@ -723,6 +790,21 @@ async function resumeWorkflowFromWeb(button) {
723
790
  }
724
791
  await loadDashboard();
725
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
+ }
726
808
  function renderCost(usage, budget) {
727
809
  const rows = [
728
810
  listItem("Requests", String(usage.totals.requests)),
@@ -838,10 +920,10 @@ function renderRoles(report) {
838
920
  ["activationCriteria", "expectedEvidence", "gateParticipation"].forEach(
839
921
  function(field) {
840
922
  (entry.role[field] || []).slice(0, 3).forEach(function(value) {
841
- const tag = document.createElement("span");
842
- tag.className = "tag";
843
- tag.textContent = value;
844
- tags.append(tag);
923
+ const tag2 = document.createElement("span");
924
+ tag2.className = "tag";
925
+ tag2.textContent = value;
926
+ tags.append(tag2);
845
927
  });
846
928
  }
847
929
  );
@@ -889,10 +971,10 @@ function renderSkillCatalog(skills, sources) {
889
971
  const tags = document.createElement("div");
890
972
  tags.className = "tag-row";
891
973
  skill.sourceGroups.slice(0, 4).forEach(function(group) {
892
- const tag = document.createElement("span");
893
- tag.className = "tag";
894
- tag.textContent = sourceMap.get(group) || group;
895
- tags.append(tag);
974
+ const tag2 = document.createElement("span");
975
+ tag2.className = "tag";
976
+ tag2.textContent = sourceMap.get(group) || group;
977
+ tags.append(tag2);
896
978
  });
897
979
  node.append(tags);
898
980
  return node;
@@ -930,10 +1012,10 @@ async function loadSkillPlan() {
930
1012
  const tags = document.createElement("div");
931
1013
  tags.className = "tag-row";
932
1014
  item.skill.sourceGroups.slice(0, 4).forEach(function(group) {
933
- const tag = document.createElement("span");
934
- tag.className = "tag";
935
- tag.textContent = group;
936
- tags.append(tag);
1015
+ const tag2 = document.createElement("span");
1016
+ tag2.className = "tag";
1017
+ tag2.textContent = group;
1018
+ tags.append(tag2);
937
1019
  });
938
1020
  node.append(tags);
939
1021
  return node;
@@ -974,10 +1056,10 @@ function renderSourceCatalog(sources) {
974
1056
  const tags = document.createElement("div");
975
1057
  tags.className = "tag-row";
976
1058
  source.locations.forEach(function(location) {
977
- const tag = document.createElement("span");
978
- tag.className = "tag";
979
- tag.textContent = location;
980
- tags.append(tag);
1059
+ const tag2 = document.createElement("span");
1060
+ tag2.className = "tag";
1061
+ tag2.textContent = location;
1062
+ tags.append(tag2);
981
1063
  });
982
1064
  node.append(tags);
983
1065
  return node;
@@ -1001,10 +1083,10 @@ function renderLessons(lessons) {
1001
1083
  tags.className = "tag-row";
1002
1084
  const appliesTo = Array.isArray(lesson.appliesTo) ? lesson.appliesTo : [];
1003
1085
  appliesTo.slice(0, 4).forEach(function(tool) {
1004
- const tag = document.createElement("span");
1005
- tag.className = "tag";
1006
- tag.textContent = tool;
1007
- tags.append(tag);
1086
+ const tag2 = document.createElement("span");
1087
+ tag2.className = "tag";
1088
+ tag2.textContent = tool;
1089
+ tags.append(tag2);
1008
1090
  });
1009
1091
  node.append(tags);
1010
1092
  return node;
@@ -1244,6 +1326,61 @@ function renderActions(data) {
1244
1326
  ]
1245
1327
  );
1246
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
+ }
1247
1384
  function metric(value, label) {
1248
1385
  const node = document.createElement("div");
1249
1386
  node.className = "metric";
@@ -0,0 +1,23 @@
1
+ import type { EvidenceInput } from "./types.js";
2
+ export type AutomationSurface = "web" | "api" | "cli" | "integration";
3
+ export interface AutomationEvidenceInput {
4
+ surface?: AutomationSurface;
5
+ assertions?: string;
6
+ externalValidation?: string;
7
+ deferredOwner?: string;
8
+ deferredRationale?: string;
9
+ }
10
+ export interface AutomationEvidenceQuality {
11
+ automated: boolean;
12
+ surface?: AutomationSurface;
13
+ assertions?: string;
14
+ externalValidation?: string;
15
+ deferredOwner?: string;
16
+ deferredRationale?: string;
17
+ observableOutcome: boolean;
18
+ deferredExternalValidation: boolean;
19
+ gaps: string[];
20
+ }
21
+ export declare function evaluateAutomationEvidence(input: EvidenceInput): AutomationEvidenceQuality;
22
+ export declare function assertAutomationEvidenceQuality(input: EvidenceInput): void;
23
+ export declare function automationEvidenceLines(quality: AutomationEvidenceQuality): string[];