@jterrats/open-orchestra 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +90 -0
- package/CHANGELOG.md +104 -0
- package/CLAUDE.md +103 -0
- package/README.md +173 -22
- package/dist/assets/web-console.js +743 -0
- package/dist/autonomous-workflow.d.ts +45 -0
- package/dist/autonomous-workflow.js +386 -0
- package/dist/autonomous-workflow.js.map +1 -0
- package/dist/benchmark.d.ts +8 -0
- package/dist/benchmark.js +193 -0
- package/dist/benchmark.js.map +1 -0
- package/dist/burndown.d.ts +3 -0
- package/dist/burndown.js +141 -0
- package/dist/burndown.js.map +1 -0
- package/dist/clarification.d.ts +6 -0
- package/dist/clarification.js +88 -0
- package/dist/clarification.js.map +1 -0
- package/dist/cli.js +221 -4
- package/dist/cli.js.map +1 -1
- package/dist/collaboration-flows.d.ts +5 -0
- package/dist/collaboration-flows.js +256 -0
- package/dist/collaboration-flows.js.map +1 -0
- package/dist/command-manifest.d.ts +11 -0
- package/dist/command-manifest.js +52 -0
- package/dist/command-manifest.js.map +1 -0
- package/dist/commands.d.ts +39 -0
- package/dist/commands.js +1069 -2
- package/dist/commands.js.map +1 -1
- package/dist/constants.d.ts +4 -0
- package/dist/constants.js +22 -0
- package/dist/constants.js.map +1 -1
- package/dist/defaults.d.ts +7 -11
- package/dist/defaults.js +7 -625
- package/dist/defaults.js.map +1 -1
- package/dist/delegation-decision.d.ts +14 -0
- package/dist/delegation-decision.js +391 -0
- package/dist/delegation-decision.js.map +1 -0
- package/dist/detect-commands.d.ts +3 -0
- package/dist/detect-commands.js +28 -0
- package/dist/detect-commands.js.map +1 -0
- package/dist/diagram-validation.d.ts +36 -0
- package/dist/diagram-validation.js +118 -0
- package/dist/diagram-validation.js.map +1 -0
- package/dist/fs-utils.d.ts +2 -0
- package/dist/fs-utils.js +75 -6
- package/dist/fs-utils.js.map +1 -1
- package/dist/github.d.ts +11 -0
- package/dist/github.js +48 -0
- package/dist/github.js.map +1 -0
- package/dist/health-checks.d.ts +28 -0
- package/dist/health-checks.js +219 -0
- package/dist/health-checks.js.map +1 -0
- package/dist/health-commands.d.ts +2 -0
- package/dist/health-commands.js +18 -0
- package/dist/health-commands.js.map +1 -0
- package/dist/instruction-apply.d.ts +34 -0
- package/dist/instruction-apply.js +150 -0
- package/dist/instruction-apply.js.map +1 -0
- package/dist/instruction-blocks.d.ts +22 -0
- package/dist/instruction-blocks.js +120 -0
- package/dist/instruction-blocks.js.map +1 -0
- package/dist/instruction-imports.d.ts +12 -0
- package/dist/instruction-imports.js +45 -0
- package/dist/instruction-imports.js.map +1 -0
- package/dist/instruction-stale.d.ts +9 -0
- package/dist/instruction-stale.js +106 -0
- package/dist/instruction-stale.js.map +1 -0
- package/dist/instruction-types.d.ts +66 -0
- package/dist/instruction-types.js +2 -0
- package/dist/instruction-types.js.map +1 -0
- package/dist/instruction-updates.d.ts +4 -0
- package/dist/instruction-updates.js +5 -0
- package/dist/instruction-updates.js.map +1 -0
- package/dist/knowledge-base.d.ts +10 -0
- package/dist/knowledge-base.js +117 -0
- package/dist/knowledge-base.js.map +1 -0
- package/dist/mcp-oauth-proxy.d.ts +39 -0
- package/dist/mcp-oauth-proxy.js +80 -0
- package/dist/mcp-oauth-proxy.js.map +1 -0
- package/dist/pr-review.d.ts +20 -0
- package/dist/pr-review.js +142 -0
- package/dist/pr-review.js.map +1 -0
- package/dist/project-detection.d.ts +22 -0
- package/dist/project-detection.js +174 -0
- package/dist/project-detection.js.map +1 -0
- package/dist/prompt-registry.d.ts +56 -0
- package/dist/prompt-registry.js +163 -0
- package/dist/prompt-registry.js.map +1 -0
- package/dist/release-candidate.d.ts +41 -0
- package/dist/release-candidate.js +196 -0
- package/dist/release-candidate.js.map +1 -0
- package/dist/release-commands.d.ts +4 -0
- package/dist/release-commands.js +50 -0
- package/dist/release-commands.js.map +1 -0
- package/dist/roles/ai-support-roles.d.ts +11 -0
- package/dist/roles/ai-support-roles.js +67 -0
- package/dist/roles/ai-support-roles.js.map +1 -0
- package/dist/roles/core-roles.d.ts +11 -0
- package/dist/roles/core-roles.js +144 -0
- package/dist/roles/core-roles.js.map +1 -0
- package/dist/roles/engineering-roles.d.ts +11 -0
- package/dist/roles/engineering-roles.js +176 -0
- package/dist/roles/engineering-roles.js.map +1 -0
- package/dist/roles/governance-roles.d.ts +11 -0
- package/dist/roles/governance-roles.js +117 -0
- package/dist/roles/governance-roles.js.map +1 -0
- package/dist/roles/index.d.ts +11 -0
- package/dist/roles/index.js +17 -0
- package/dist/roles/index.js.map +1 -0
- package/dist/roles/platform-ops-roles.d.ts +11 -0
- package/dist/roles/platform-ops-roles.js +158 -0
- package/dist/roles/platform-ops-roles.js.map +1 -0
- package/dist/roles/qa-ux-roles.d.ts +11 -0
- package/dist/roles/qa-ux-roles.js +193 -0
- package/dist/roles/qa-ux-roles.js.map +1 -0
- package/dist/roles/release-ops-roles.d.ts +11 -0
- package/dist/roles/release-ops-roles.js +109 -0
- package/dist/roles/release-ops-roles.js.map +1 -0
- package/dist/runtime-adapters.d.ts +6 -0
- package/dist/runtime-adapters.js +88 -0
- package/dist/runtime-adapters.js.map +1 -0
- package/dist/runtime-bootstrap.d.ts +12 -0
- package/dist/runtime-bootstrap.js +136 -0
- package/dist/runtime-bootstrap.js.map +1 -0
- package/dist/skills.d.ts +36 -0
- package/dist/skills.js +665 -0
- package/dist/skills.js.map +1 -0
- package/dist/subagent-protocol.d.ts +41 -0
- package/dist/subagent-protocol.js +179 -0
- package/dist/subagent-protocol.js.map +1 -0
- package/dist/telemetry-consent.d.ts +24 -0
- package/dist/telemetry-consent.js +95 -0
- package/dist/telemetry-consent.js.map +1 -0
- package/dist/telemetry-export.d.ts +14 -0
- package/dist/telemetry-export.js +126 -0
- package/dist/telemetry-export.js.map +1 -0
- package/dist/telemetry-records.d.ts +3 -0
- package/dist/telemetry-records.js +96 -0
- package/dist/telemetry-records.js.map +1 -0
- package/dist/telemetry-redaction.d.ts +9 -0
- package/dist/telemetry-redaction.js +55 -0
- package/dist/telemetry-redaction.js.map +1 -0
- package/dist/telemetry-types.d.ts +52 -0
- package/dist/telemetry-types.js +2 -0
- package/dist/telemetry-types.js.map +1 -0
- package/dist/telemetry.d.ts +4 -0
- package/dist/telemetry.js +4 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/types.d.ts +304 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/validation.d.ts +3 -1
- package/dist/validation.js +28 -5
- package/dist/validation.js.map +1 -1
- package/dist/web-api.js +167 -3
- package/dist/web-api.js.map +1 -1
- package/dist/web-console.js +6 -160
- package/dist/web-console.js.map +1 -1
- package/dist/workflow-gates.js +4 -2
- package/dist/workflow-gates.js.map +1 -1
- package/dist/workflow-services.js +143 -67
- package/dist/workflow-services.js.map +1 -1
- package/dist/workflow-templates.d.ts +10 -0
- package/dist/workflow-templates.js +141 -0
- package/dist/workflow-templates.js.map +1 -0
- package/dist/workspace-classification.d.ts +5 -0
- package/dist/workspace-classification.js +127 -0
- package/dist/workspace-classification.js.map +1 -0
- package/dist/workspace-validator.js +11 -1
- package/dist/workspace-validator.js.map +1 -1
- package/dist/workspace.d.ts +8 -4
- package/dist/workspace.js +111 -4
- package/dist/workspace.js.map +1 -1
- package/docs/autonomous-workflow.md +165 -0
- package/docs/benchmark.md +219 -0
- package/docs/dev-team-specialist-role-profiles.md +171 -0
- package/docs/mcp-oauth-proxy-evaluation.md +44 -0
- package/docs/multi-agent-orchestrator-backlog.md +413 -1
- package/docs/open-orchestra-dogfooding-findings.md +66 -0
- package/docs/orchestra-mvp.md +161 -3
- package/docs/runtime-adapters.md +86 -0
- package/docs/runtime-llm-flow.md +124 -0
- package/docs/setup-agents-dogfooding-findings.md +101 -0
- package/docs/skill-loading-strategy.md +114 -0
- package/docs/source-of-truth-and-agent-learning.md +83 -0
- package/package.json +9 -5
- package/rules/agent-roles.mdc +30 -0
- package/rules/ai-assisted-development.mdc +22 -0
- package/skills/agent-learning/SKILL.md +24 -0
- package/skills/agent-learning/manifest.json +40 -0
- package/skills/backlog-sync/SKILL.md +24 -0
- package/skills/backlog-sync/manifest.json +41 -0
- package/skills/diagram-export/SKILL.md +35 -0
- package/skills/diagram-export/manifest.json +40 -0
- package/skills/model-evaluation/SKILL.md +25 -0
- package/skills/model-evaluation/manifest.json +41 -0
- package/skills/playwright-evidence/SKILL.md +28 -0
- package/skills/playwright-evidence/manifest.json +46 -0
- package/skills/pr-review/SKILL.md +23 -0
- package/skills/pr-review/manifest.json +43 -0
- package/skills/prompt-registry/SKILL.md +24 -0
- package/skills/prompt-registry/manifest.json +45 -0
- package/skills/release-readiness/SKILL.md +25 -0
- package/skills/release-readiness/manifest.json +45 -0
- package/skills/source-of-truth/SKILL.md +24 -0
- package/skills/source-of-truth/manifest.json +47 -0
- package/skills/static-analysis/SKILL.md +26 -0
- package/skills/static-analysis/manifest.json +46 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Open Orchestra Dogfooding Findings
|
|
2
|
+
|
|
3
|
+
This file records what Open Orchestra contributed while building Open Orchestra
|
|
4
|
+
itself, plus issues found by using the CLI as the local control plane.
|
|
5
|
+
|
|
6
|
+
## What Helped
|
|
7
|
+
|
|
8
|
+
- **Backlog alignment:** GitHub issues, local `.agent-workflow/tasks.json`, and
|
|
9
|
+
semantic commits stayed tied to backlog IDs such as `ROLE-003`, `WFLOW-001`,
|
|
10
|
+
and `BUG-087`.
|
|
11
|
+
- **Explicit delegation:** `orchestra delegation decide` made role selection
|
|
12
|
+
visible before implementation, including write scopes and expected outputs.
|
|
13
|
+
- **Evidence discipline:** fixes were closed with command evidence,
|
|
14
|
+
reviewer records, and `npm run precommit` results instead of relying on a
|
|
15
|
+
prose claim.
|
|
16
|
+
- **Bug discovery:** concurrent state writes exposed real bugs in task and lock
|
|
17
|
+
mutation safety. Those became tracked fixes instead of one-off manual repairs.
|
|
18
|
+
- **Context control:** skills, source-of-truth, lessons, protocols, and workflow
|
|
19
|
+
templates kept primary instruction files smaller while preserving task-specific
|
|
20
|
+
context.
|
|
21
|
+
- **Runtime portability:** the same workflow state supported Codex, CLI, web/API,
|
|
22
|
+
VS Code extension scaffolding, and future Claude/Cursor instruction renders.
|
|
23
|
+
|
|
24
|
+
## Finding: Parallel Independent Commands Are Safe So Far
|
|
25
|
+
|
|
26
|
+
- **Date checked:** 2026-05-06
|
|
27
|
+
- **Workspace:** `/tmp/oo-parallel-dogfood`
|
|
28
|
+
- **Commands tested in parallel:** `task add`, `delegation decide`,
|
|
29
|
+
duplicate `task add`, same-path `lock claim`, `validate`, `task list`, and
|
|
30
|
+
concurrent `evidence add`.
|
|
31
|
+
- **Observed behavior:** independent writes serialized correctly. Duplicate
|
|
32
|
+
tasks failed with `task already exists`. Same-path locks allowed one winner
|
|
33
|
+
and blocked the second. Concurrent evidence writes produced distinct artifacts
|
|
34
|
+
and a valid event log.
|
|
35
|
+
- **Validation:** `orchestra validate --json` returned valid after the stress
|
|
36
|
+
run.
|
|
37
|
+
|
|
38
|
+
## Finding: Parallel Dependent Commands Need DAG Semantics
|
|
39
|
+
|
|
40
|
+
- **Date found:** 2026-05-06
|
|
41
|
+
- **Observed behavior:** when a parent agent schedules `task add` and an
|
|
42
|
+
immediate dependent command such as `delegation decide --task <id>` in the
|
|
43
|
+
same parallel batch, the dependent command can run before the task exists and
|
|
44
|
+
fail with `unknown task`.
|
|
45
|
+
- **Impact:** this is not state corruption, but it creates noisy false failures
|
|
46
|
+
when the parent agent treats dependent steps as independent parallel work.
|
|
47
|
+
- **Recommended product fix:** add a future batch runner with explicit
|
|
48
|
+
`dependsOn` ordering, or make dependent command failures retryable when the
|
|
49
|
+
missing task is being created in the same batch.
|
|
50
|
+
- **Current workaround:** only run independent Open Orchestra commands in
|
|
51
|
+
parallel. Run `task add` before `context`, `delegation`, `plan`, `review`, or
|
|
52
|
+
`evidence` for that task.
|
|
53
|
+
|
|
54
|
+
## Finding: Renamed Project Paths Must Be Revalidated Before Generation
|
|
55
|
+
|
|
56
|
+
- **Date found:** 2026-05-06
|
|
57
|
+
- **Observed behavior:** after the project directory moved from `cursor-rules`
|
|
58
|
+
to `open-orchestra`, a file-generation tool attempted to write new files
|
|
59
|
+
through stale path context.
|
|
60
|
+
- **Impact:** generated files can be created outside the intended repo, leaving
|
|
61
|
+
imports in the current repo pointing at missing files.
|
|
62
|
+
- **Recommended product fix:** add a workspace guard that verifies `cwd`,
|
|
63
|
+
`package.json`, and `.git` root before generated file writes.
|
|
64
|
+
- **Current workaround:** after a rename or context transition, run
|
|
65
|
+
`pwd`, `git status --short`, and `ls` for every newly generated file before
|
|
66
|
+
continuing.
|
package/docs/orchestra-mvp.md
CHANGED
|
@@ -11,6 +11,31 @@ It stores workflow state in `.agent-workflow/` and coordinates agents through fi
|
|
|
11
11
|
- Existing `AGENTS.md`, `CLAUDE.md`, Cursor rules, and generated instruction files remain supported entry points.
|
|
12
12
|
- `ORCHESTRA.md` is the intended future primary guide name; it is not required for existing projects.
|
|
13
13
|
|
|
14
|
+
## Prompt Registry
|
|
15
|
+
|
|
16
|
+
Open Orchestra initializes `.generated-prompts/` beside `.agent-workflow/`. The prompt registry stores the latest prompt intent and generation context by artifact type so future agents can preserve conventions without loading all history into the main instruction files.
|
|
17
|
+
|
|
18
|
+
Generated register files:
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
.generated-prompts/
|
|
22
|
+
cicd.md
|
|
23
|
+
code.md
|
|
24
|
+
diagrams.md
|
|
25
|
+
docs.md
|
|
26
|
+
evals.md
|
|
27
|
+
services.md
|
|
28
|
+
tests.md
|
|
29
|
+
ui.md
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Existing register files are preserved unless `orchestra init --force` is used.
|
|
33
|
+
|
|
34
|
+
## Skills and Context Loading
|
|
35
|
+
|
|
36
|
+
Open Orchestra should treat skills as demand-loaded capabilities. Main files such as `AGENTS.md`, `CLAUDE.md`, Cursor rules, and `ORCHESTRA.md` should contain a compact index and activation rules, while detailed procedures live in skill files. See [skill-loading-strategy.md](skill-loading-strategy.md).
|
|
37
|
+
|
|
38
|
+
|
|
14
39
|
## Commands
|
|
15
40
|
|
|
16
41
|
```bash
|
|
@@ -41,6 +66,22 @@ node bin/orchestra.js lock list
|
|
|
41
66
|
node bin/orchestra.js lock release --id lock-123
|
|
42
67
|
node bin/orchestra.js roles list
|
|
43
68
|
node bin/orchestra.js roles list --json
|
|
69
|
+
node bin/orchestra.js skills list
|
|
70
|
+
node bin/orchestra.js skills list --json
|
|
71
|
+
node bin/orchestra.js skills plan --task TASK-1
|
|
72
|
+
node bin/orchestra.js skills plan --task TASK-1 --json
|
|
73
|
+
node bin/orchestra.js skills render --target generic --task TASK-1
|
|
74
|
+
node bin/orchestra.js skills render --target claude --task TASK-1
|
|
75
|
+
node bin/orchestra.js skills render --target cursor --skills static-analysis,playwright-evidence
|
|
76
|
+
node bin/orchestra.js skills render --target codex --task TASK-1
|
|
77
|
+
node bin/orchestra.js skills render --target vscode --task TASK-1 --json
|
|
78
|
+
node bin/orchestra.js skills validate
|
|
79
|
+
node bin/orchestra.js skills validate --json
|
|
80
|
+
node bin/orchestra.js sources list
|
|
81
|
+
node bin/orchestra.js sources list --json
|
|
82
|
+
node bin/orchestra.js lessons list
|
|
83
|
+
node bin/orchestra.js lessons add --operation "shell edit" --failed-action "bad escaping" --error-signature "syntax error" --root-cause "unescaped token" --fix "escape token" --prevention "dry run first" --applies-to node,markdown --verified-by precommit
|
|
84
|
+
node bin/orchestra.js lessons promote --to doc --filter escaping
|
|
44
85
|
node bin/orchestra.js readiness --task TASK-1
|
|
45
86
|
node bin/orchestra.js gate --gate architecture --task TASK-1
|
|
46
87
|
node bin/orchestra.js gate --gate qa-release --task TASK-1
|
|
@@ -81,6 +122,86 @@ node bin/orchestra.js model set-role --role developer --provider openai --model
|
|
|
81
122
|
node bin/orchestra.js model complete-fake --provider primary --model fake-model --prompt "hello" --fallbacks backup --fail-provider primary
|
|
82
123
|
node bin/orchestra.js model provenance add --task TASK-1 --role developer --provider openai --model gpt-example --prompt-id prompt-1 --response-id response-1 --finish-reason stop
|
|
83
124
|
node bin/orchestra.js model provenance list --task TASK-1 --json
|
|
125
|
+
|
|
126
|
+
# Autonomous workflow
|
|
127
|
+
node bin/orchestra.js workflow run --task TASK-1 --dry-run --gates phase
|
|
128
|
+
node bin/orchestra.js workflow run --task TASK-1 --gates none
|
|
129
|
+
node bin/orchestra.js workflow run --task TASK-1 --gates phase
|
|
130
|
+
node bin/orchestra.js workflow run --task TASK-1 --gates all
|
|
131
|
+
node bin/orchestra.js workflow run --task TASK-1 --resume <run-id>
|
|
132
|
+
node bin/orchestra.js workflow runs
|
|
133
|
+
node bin/orchestra.js workflow runs --json
|
|
134
|
+
|
|
135
|
+
# Clarification loop
|
|
136
|
+
node bin/orchestra.js workflow clarify --run <run-id> --from developer --to po --question "..."
|
|
137
|
+
node bin/orchestra.js workflow clarify --run <run-id> --from developer --to architect --question "..."
|
|
138
|
+
node bin/orchestra.js workflow clarify --run <run-id> --from qa --to po --question "..."
|
|
139
|
+
node bin/orchestra.js workflow clarify-respond --run <run-id> --clarification <id> --answer "..."
|
|
140
|
+
node bin/orchestra.js workflow clarify-list --run <run-id>
|
|
141
|
+
node bin/orchestra.js workflow clarify-list --run <run-id> --json
|
|
142
|
+
|
|
143
|
+
# Benchmark & burndown
|
|
144
|
+
node bin/orchestra.js estimate --task TASK-1 --sizing m --solo-days 5 --ai-unguided-days 3
|
|
145
|
+
node bin/orchestra.js estimate --task TASK-1 --sizing l --solo-days 8 --ai-unguided-days 5 --confidence high --declared-by pm --json
|
|
146
|
+
node bin/orchestra.js benchmark --task TASK-1
|
|
147
|
+
node bin/orchestra.js benchmark --task TASK-1 --json
|
|
148
|
+
node bin/orchestra.js benchmark --summary
|
|
149
|
+
node bin/orchestra.js benchmark --summary --json
|
|
150
|
+
node bin/orchestra.js burndown --sprint TASK-1,TASK-2,TASK-3
|
|
151
|
+
node bin/orchestra.js burndown --sprint TASK-1,TASK-2,TASK-3 --json
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Autonomous Workflow Engine
|
|
155
|
+
|
|
156
|
+
`orchestra workflow run` executes a full story lifecycle as a governed multi-phase sequence. Each phase creates a sub-task, generates handoff artifacts, and persists state in an append-only run log.
|
|
157
|
+
|
|
158
|
+
```
|
|
159
|
+
PM → PO [gate] → Architect [sizing gate] → Developer → QA [gate] → Release
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
# Inspect the phase graph without persisting state
|
|
164
|
+
orchestra workflow run --task FEAT-001 --dry-run --gates phase
|
|
165
|
+
|
|
166
|
+
# Fully autonomous — no human approval required
|
|
167
|
+
orchestra workflow run --task FEAT-001 --gates none
|
|
168
|
+
|
|
169
|
+
# Gate-controlled — pauses at po→architect and qa→release
|
|
170
|
+
orchestra workflow run --task FEAT-001 --gates phase
|
|
171
|
+
|
|
172
|
+
# Resume a paused or clarification-suspended run
|
|
173
|
+
orchestra workflow run --task FEAT-001 --resume <run-id>
|
|
174
|
+
|
|
175
|
+
# List all runs with status and phase trace
|
|
176
|
+
orchestra workflow runs
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**Architect sizing gate:** always enforced regardless of `--gates` mode. The architect must record a sizing decision (`xs/s/m/l/xl`) before the developer phase starts. If missing, the run fails with the exact command to resolve it:
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
orchestra decision add --task FEAT-001 --owner architect \
|
|
183
|
+
--title "Story sizing" --decision "m [5 points]" \
|
|
184
|
+
--context "..." --consequences "..." --status accepted
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Clarification Loop
|
|
188
|
+
|
|
189
|
+
Developers or QA engineers can surface blocking questions to the PO or architect mid-phase without abandoning the run.
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
# Open a clarification (suspends the active developer/qa phase)
|
|
193
|
+
orchestra workflow clarify --run <run-id> --from developer --to po \
|
|
194
|
+
--question "Should empty input return null or throw?"
|
|
195
|
+
|
|
196
|
+
# Answer the clarification (resumes the phase)
|
|
197
|
+
orchestra workflow clarify-respond --run <run-id> --clarification <id> \
|
|
198
|
+
--answer "Return null — downstream handles it."
|
|
199
|
+
|
|
200
|
+
# Resume execution after the answer
|
|
201
|
+
orchestra workflow run --task FEAT-001 --resume <run-id>
|
|
202
|
+
|
|
203
|
+
# Inspect all clarifications for a run
|
|
204
|
+
orchestra workflow clarify-list --run <run-id>
|
|
84
205
|
```
|
|
85
206
|
|
|
86
207
|
## Workflow Files
|
|
@@ -92,6 +213,11 @@ node bin/orchestra.js model provenance list --task TASK-1 --json
|
|
|
92
213
|
tasks.json
|
|
93
214
|
locks.json
|
|
94
215
|
events.jsonl
|
|
216
|
+
workflow-runs.jsonl ← autonomous run state (append-only)
|
|
217
|
+
clarifications.jsonl ← clarification loop records (append-only)
|
|
218
|
+
estimates.jsonl ← declared effort baselines (append-only)
|
|
219
|
+
source-of-truth.json
|
|
220
|
+
agent-lessons.jsonl
|
|
95
221
|
approvals/
|
|
96
222
|
decisions/
|
|
97
223
|
handoffs/
|
|
@@ -121,7 +247,9 @@ The role catalog JSON includes capabilities, required handoff fields, blocking a
|
|
|
121
247
|
|
|
122
248
|
Open Orchestra initializes a broad role catalog but does not require every role to participate in every task. The parent/orchestrator should activate roles based on task type, risk, touched paths, impact areas, and gate requirements.
|
|
123
249
|
|
|
124
|
-
Default roles include delivery roles such as Product Manager, Product Owner, Business Analyst, Architect, Developer, QA, Security, DevOps, SRE, DBA, UX/UI Designer, Release Manager, Compliance/Privacy, and
|
|
250
|
+
Default roles include delivery and specialist roles such as Product Manager, Product Owner, Business Analyst, Architect, Developer, Tech Lead, Frontend Specialist, Backend Specialist, Mobile Specialist, QA, SDET, Security, DevOps, Platform Engineer, SRE, DBA, UX/UI Designer, Release Manager, Compliance/Privacy, Technical Writer, AI Evaluation Engineer, and Support/Customer Operations. They also include orchestration roles for modern multi-agent systems: Planner, Reviewer/Critic, Toolsmith, Context Curator, Policy/Governance, Observability/Incident Response, Data/Privacy Officer, Domain Expert, UX Researcher/Accessibility Reviewer, Performance Engineer, and Game Designer.
|
|
251
|
+
|
|
252
|
+
Specialist profiles and their source rationale are documented in [dev-team-specialist-role-profiles.md](dev-team-specialist-role-profiles.md).
|
|
125
253
|
|
|
126
254
|
Each default role declares:
|
|
127
255
|
|
|
@@ -167,10 +295,40 @@ The VS Code Control Center scaffold is under `extensions/vscode-open-orchestra`.
|
|
|
167
295
|
- `src/commands.ts` is the CLI adapter: it parses command options, delegates to services, and renders terminal output.
|
|
168
296
|
- Services accept an explicit repo root, so future web, GitHub Actions, Playwright, or multi-model orchestration layers can reuse the same core without depending on `process.cwd()`.
|
|
169
297
|
|
|
298
|
+
## Benchmark & Sprint Burndown
|
|
299
|
+
|
|
300
|
+
`orchestra estimate` declares the three-mode effort baseline at story start. After the autonomous run completes, `orchestra benchmark` joins the declared estimate with the actual cycle time and quality signals automatically computed from the event log.
|
|
301
|
+
|
|
302
|
+
Quality signals collected automatically:
|
|
303
|
+
- `REVIEW_RECORDED` events → review count, blocking reviews (result=block or severity high/critical)
|
|
304
|
+
- `EVIDENCE_ADDED` events → evidence artifact count
|
|
305
|
+
- `LESSON_RECORDED` events → lesson count
|
|
306
|
+
- `GATE_BLOCKED` events → gate block count
|
|
307
|
+
- `MODEL_PROVENANCE_RECORDED` events → total tokens, estimated cost
|
|
308
|
+
|
|
309
|
+
```bash
|
|
310
|
+
# Declare baseline at story start (once per story)
|
|
311
|
+
orchestra estimate --task TASK-1 --sizing m --solo-days 5 --ai-unguided-days 3
|
|
312
|
+
|
|
313
|
+
# Per-story benchmark after run completes
|
|
314
|
+
orchestra benchmark --task TASK-1
|
|
315
|
+
|
|
316
|
+
# Sprint summary table across all stories with estimates
|
|
317
|
+
orchestra benchmark --summary
|
|
318
|
+
|
|
319
|
+
# Sprint burndown (developer points > architect points as fallback)
|
|
320
|
+
orchestra burndown --sprint TASK-1,TASK-2,TASK-3
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
See [benchmark.md](benchmark.md) for the full reference.
|
|
324
|
+
|
|
170
325
|
## Current Scope
|
|
171
326
|
|
|
172
|
-
-
|
|
327
|
+
- Autonomous workflow engine (`workflow run`) executes the full PM→PO→Architect→Developer→QA→Release phase sequence with configurable human gates and an architect sizing gate.
|
|
328
|
+
- Clarification loop (`workflow clarify`) allows developer and QA phases to surface blocking questions to PO or architect without abandoning the run.
|
|
329
|
+
- Benchmark (`orchestra estimate` + `orchestra benchmark`) compares declared effort baselines against actual cycle time and automatically collected quality signals from the event log.
|
|
330
|
+
- Sprint burndown (`orchestra burndown`) computes ideal vs actual lines from developer or architect story point estimates.
|
|
331
|
+
- No real LLM calls in the autonomous engine — phases complete deterministically and generate handoff artifacts; LLM execution per phase is a future layer.
|
|
173
332
|
- No automatic code editing.
|
|
174
|
-
- No Playwright generation yet.
|
|
175
333
|
- Python workers are represented in config only and disabled by default.
|
|
176
334
|
- Static analysis is enforced locally through `.githooks/pre-commit` after running `npm run hooks:install`.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Runtime Adapters
|
|
2
|
+
|
|
3
|
+
Open Orchestra uses one adapter catalog for LLM runtimes, IDEs, and CLI agents.
|
|
4
|
+
The catalog keeps target names, default files, managed-block support, structured
|
|
5
|
+
payload support, and usage guidance in one place.
|
|
6
|
+
|
|
7
|
+
## Adapter Catalog
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
node bin/orchestra.js runtime adapters --json
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Current targets:
|
|
14
|
+
|
|
15
|
+
- `generic`: provider-agnostic Markdown in `ORCHESTRA.md`.
|
|
16
|
+
- `claude`: Claude project memory in `CLAUDE.md`.
|
|
17
|
+
- `cursor`: Cursor MDC rules in `.cursor/rules/open-orchestra.mdc`.
|
|
18
|
+
- `codex`: Codex instructions in `AGENTS.md`.
|
|
19
|
+
- `vscode`: extension/chat payloads in `.vscode/open-orchestra.runtime.json`
|
|
20
|
+
and `.vscode/open-orchestra.md`.
|
|
21
|
+
- `windsurf`: Windsurf rules in `.windsurf/rules/open-orchestra.md`.
|
|
22
|
+
|
|
23
|
+
## Init Modes
|
|
24
|
+
|
|
25
|
+
Default project init keeps the current compact bootstrap behavior:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
node bin/orchestra.js init
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Generate only selected runtime files:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
node bin/orchestra.js init --target claude,cursor,windsurf
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Advisory mode creates workflow state without root instruction files unless a
|
|
38
|
+
target is explicit:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
node bin/orchestra.js init --advisory
|
|
42
|
+
node bin/orchestra.js init --advisory --target claude
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Unsafe roots are blocked before writes. Unknown non-temp directories require an
|
|
46
|
+
explicit confirmation:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
node bin/orchestra.js init --confirm-unknown
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Runtime Loop
|
|
53
|
+
|
|
54
|
+
After init, any runtime should use the same local control-plane loop:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
node bin/orchestra.js health --json
|
|
58
|
+
node bin/orchestra.js task list --json
|
|
59
|
+
node bin/orchestra.js context --task STORY-001 --json
|
|
60
|
+
node bin/orchestra.js delegation decide --task STORY-001 --json
|
|
61
|
+
node bin/orchestra.js skills render --target codex --task STORY-001
|
|
62
|
+
node bin/orchestra.js protocol render --target codex --task STORY-001
|
|
63
|
+
node bin/orchestra.js workflow render --target codex --task STORY-001
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Change `--target` to the runtime that is executing the work. The workflow state,
|
|
67
|
+
roles, evidence, reviews, and gates remain runtime-agnostic.
|
|
68
|
+
|
|
69
|
+
## Web And VS Code
|
|
70
|
+
|
|
71
|
+
The local web console exposes workspace classification and supported runtime
|
|
72
|
+
targets through:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
node bin/orchestra.js web
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
The API contracts are:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
curl -s http://127.0.0.1:3717/api/workspace/classification
|
|
82
|
+
curl -s http://127.0.0.1:3717/api/runtime/adapters
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
These endpoints are intended for VS Code, Cursor-like extensions, and other
|
|
86
|
+
clients that need to show safe next actions without parsing human CLI output.
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Runtime LLM Flow
|
|
2
|
+
|
|
3
|
+
Open Orchestra is the local control plane. The active LLM runtime is the parent
|
|
4
|
+
agent today.
|
|
5
|
+
|
|
6
|
+
That means Claude, Codex, Cursor, VS Code, Windsurf, or another LLM starts the
|
|
7
|
+
work, reads the relevant project instructions, and calls `orchestra` commands to
|
|
8
|
+
coordinate tasks, roles, skills, handoffs, reviews, evidence, gates, and model
|
|
9
|
+
routing metadata. Open Orchestra does not yet spawn real provider-backed
|
|
10
|
+
subagents by itself.
|
|
11
|
+
|
|
12
|
+
## Startup Flow
|
|
13
|
+
|
|
14
|
+
Use this sequence for a new project or a new task:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
node bin/orchestra.js init
|
|
18
|
+
node bin/orchestra.js health --json
|
|
19
|
+
node bin/orchestra.js task add --id STORY-001 --title "Short title" --owner developer --goal "Outcome"
|
|
20
|
+
node bin/orchestra.js context --task STORY-001 --json
|
|
21
|
+
node bin/orchestra.js delegation decide --task STORY-001 --json
|
|
22
|
+
node bin/orchestra.js plan --task STORY-001 --json
|
|
23
|
+
node bin/orchestra.js skills plan --task STORY-001 --json
|
|
24
|
+
node bin/orchestra.js skills render --target codex --task STORY-001
|
|
25
|
+
node bin/orchestra.js protocol render --target codex --task STORY-001
|
|
26
|
+
node bin/orchestra.js workflow render --target codex --task STORY-001
|
|
27
|
+
node bin/orchestra.js commands manifest --json
|
|
28
|
+
node bin/orchestra.js runtime bootstrap --target codex
|
|
29
|
+
node bin/orchestra.js evidence add --task STORY-001 --role developer --type command --summary "npm run precommit passed" --command "npm run precommit" --exit-code 0
|
|
30
|
+
node bin/orchestra.js gate --gate architecture --task STORY-001
|
|
31
|
+
node bin/orchestra.js summary --json
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Use `--target claude`, `--target cursor`, `--target codex`, `--target vscode`,
|
|
35
|
+
`--target windsurf`, or `--target generic` when rendering skills, protocol, or
|
|
36
|
+
workflow instructions for a specific runtime.
|
|
37
|
+
|
|
38
|
+
`orchestra init` also refreshes compact managed bootstrap blocks in
|
|
39
|
+
`ORCHESTRA.md` and `AGENTS.md`. These blocks tell the active LLM how to discover
|
|
40
|
+
commands and which task loop to run without copying the full manual into the
|
|
41
|
+
always-loaded context.
|
|
42
|
+
|
|
43
|
+
Use explicit init targets when a project should generate runtime-specific files:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
node bin/orchestra.js runtime adapters --json
|
|
47
|
+
node bin/orchestra.js init --target claude,cursor,windsurf
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Parent Agent Prompts
|
|
51
|
+
|
|
52
|
+
Claude:
|
|
53
|
+
|
|
54
|
+
```text
|
|
55
|
+
Use Open Orchestra as the local control plane for this repo. Treat yourself as
|
|
56
|
+
the parent agent. Start by running health, context, delegation, plan, skills
|
|
57
|
+
plan, and target-specific skill/protocol render commands. Do not spawn or claim
|
|
58
|
+
subagents unless the local workflow state and user approval make that explicit.
|
|
59
|
+
Record evidence and reviews before saying work is complete.
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Codex:
|
|
63
|
+
|
|
64
|
+
```text
|
|
65
|
+
Use the local orchestra CLI before implementation. Confirm the task exists,
|
|
66
|
+
inspect context and delegation, render Codex skills/protocol/workflow context,
|
|
67
|
+
implement with focused tests, run precommit, then record evidence and review
|
|
68
|
+
artifacts in Open Orchestra.
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Cursor:
|
|
72
|
+
|
|
73
|
+
```text
|
|
74
|
+
Use Open Orchestra for task state and context. Render Cursor-targeted skills and
|
|
75
|
+
protocol instead of copying large rule files. Keep generated MDC/MD blocks
|
|
76
|
+
managed, record test evidence, and do not overwrite user-authored content.
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Generic LLM runtime:
|
|
80
|
+
|
|
81
|
+
```text
|
|
82
|
+
Act as the parent agent. Use Open Orchestra commands as the source of truth for
|
|
83
|
+
tasks, roles, skills, workflow templates, evidence, reviews, and gates. Ask the
|
|
84
|
+
user before changing architecture or spending budget. Treat provider execution
|
|
85
|
+
as future capability unless the project exposes an approved adapter.
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Model Routing
|
|
89
|
+
|
|
90
|
+
Current model routing is metadata and policy plumbing. These commands inspect
|
|
91
|
+
or update routing state, but they do not yet execute real provider-backed
|
|
92
|
+
subagents:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
node bin/orchestra.js model providers --json
|
|
96
|
+
node bin/orchestra.js model set-role --role qa --provider fake --model fake-model
|
|
97
|
+
node bin/orchestra.js model provenance list --json
|
|
98
|
+
node bin/orchestra.js budget check --json
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Future multi-model delegation should route by role capability, risk, budget,
|
|
102
|
+
latency, and required evidence. For example, a parent agent could keep planning
|
|
103
|
+
local, route security review to a stronger security model, route Playwright
|
|
104
|
+
analysis to a browser-capable runtime, and request user approval before any
|
|
105
|
+
budget fallback.
|
|
106
|
+
|
|
107
|
+
## Current Limits
|
|
108
|
+
|
|
109
|
+
- Open Orchestra has fake/provider-routing primitives, not real autonomous
|
|
110
|
+
provider execution.
|
|
111
|
+
- It records delegation decisions, but it does not automatically spawn
|
|
112
|
+
subagents yet.
|
|
113
|
+
- Parallel independent CLI commands are expected to work, but dependent commands
|
|
114
|
+
still need parent-agent ordering or future DAG semantics.
|
|
115
|
+
- Workflow files are local state. Promote durable lessons into docs, skills, or
|
|
116
|
+
managed instruction blocks only after review.
|
|
117
|
+
|
|
118
|
+
## Related Docs
|
|
119
|
+
|
|
120
|
+
- [Skill Loading Strategy](skill-loading-strategy.md)
|
|
121
|
+
- [Runtime Adapters](runtime-adapters.md)
|
|
122
|
+
- [Open Orchestra MVP](orchestra-mvp.md)
|
|
123
|
+
- [Source of Truth and Agent Learning](source-of-truth-and-agent-learning.md)
|
|
124
|
+
- [Dogfooding Findings](open-orchestra-dogfooding-findings.md)
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Setup Agents Dogfooding Findings
|
|
2
|
+
|
|
3
|
+
This file tracks issues found while using Open Orchestra to coordinate the
|
|
4
|
+
`setup-agents` improvement backlog.
|
|
5
|
+
|
|
6
|
+
## Finding 1: Concurrent `task add` commands can corrupt `tasks.json`
|
|
7
|
+
|
|
8
|
+
- **Open Orchestra issue:** https://github.com/jterrats/open-orchestra/issues/85
|
|
9
|
+
- **Status:** fixed in Open Orchestra
|
|
10
|
+
|
|
11
|
+
- **Date found:** 2026-05-06
|
|
12
|
+
- **Source repo:** `/Users/polux/dev/setup-agents`
|
|
13
|
+
- **Command pattern:** multiple `node_modules/.bin/orchestra task add ...` commands executed concurrently
|
|
14
|
+
- **Observed behavior:** `.agent-workflow/tasks.json` ended up with trailing partial JSON and subsequent Orchestra commands failed with `Unexpected non-whitespace character after JSON`.
|
|
15
|
+
- **Impact:** users or automation that parallelize CLI calls can corrupt workflow state.
|
|
16
|
+
- **Expected behavior:** state writes should be serialized, locked, or written atomically so concurrent commands either succeed safely or fail without corrupting existing state.
|
|
17
|
+
- **Workaround used:** manually rewrote `.agent-workflow/tasks.json` as valid JSON and continued with sequential state-changing commands.
|
|
18
|
+
- **Suggested fix:** introduce file-level locking plus atomic write through a temp file and rename for all workflow state mutations.
|
|
19
|
+
- **Resolution:** workflow state writes are serialized with per-file lock directories and JSON state files are written through temporary files followed by atomic rename.
|
|
20
|
+
|
|
21
|
+
## Finding 2: Evidence type validation is stricter than the CLI help implies
|
|
22
|
+
|
|
23
|
+
- **Open Orchestra issue:** https://github.com/jterrats/open-orchestra/issues/84
|
|
24
|
+
- **Status:** fixed in Open Orchestra
|
|
25
|
+
|
|
26
|
+
- **Date found:** 2026-05-06
|
|
27
|
+
- **Source repo:** `/Users/polux/dev/setup-agents`
|
|
28
|
+
- **Command pattern:** `orchestra evidence add --type validation ...`
|
|
29
|
+
- **Observed behavior:** the command failed with `type must be one of: command, file, screenshot, trace, video, log, report`.
|
|
30
|
+
- **Impact:** users must know the closed evidence type list before calling the command.
|
|
31
|
+
- **Expected behavior:** CLI help should show the allowed values, and validation failures should suggest the nearest valid type when possible.
|
|
32
|
+
- **Workaround used:** recorded validation evidence as `--type command`.
|
|
33
|
+
- **Suggested fix:** update command help to include the enum and consider aliases such as `validation -> command`.
|
|
34
|
+
- **Resolution:** `validation` is accepted as an alias for `command`; CLI help lists canonical types and the alias; invalid type errors include valid types and aliases.
|
|
35
|
+
|
|
36
|
+
## Finding 3: `reviewer` is not accepted as a review role
|
|
37
|
+
|
|
38
|
+
- **Open Orchestra issue:** https://github.com/jterrats/open-orchestra/issues/86
|
|
39
|
+
- **Status:** fixed in Open Orchestra
|
|
40
|
+
|
|
41
|
+
- **Date found:** 2026-05-06
|
|
42
|
+
- **Source repo:** `/Users/polux/dev/setup-agents`
|
|
43
|
+
- **Command pattern:** `orchestra review --task SA-90 --role reviewer --result approve ...`
|
|
44
|
+
- **Observed behavior:** the command failed with `unknown reviewer role: reviewer`.
|
|
45
|
+
- **Impact:** the role catalog and README describe a Reviewer / Critic capability, but the review command does not accept the intuitive `reviewer` role id.
|
|
46
|
+
- **Expected behavior:** `reviewer` should either be a valid role alias or the error should list accepted role ids.
|
|
47
|
+
- **Workaround used:** record the approval with an existing valid role.
|
|
48
|
+
- **Suggested fix:** add `reviewer` as a role alias or expose accepted roles in validation errors and CLI help.
|
|
49
|
+
- **Resolution:** `reviewer` is accepted as an alias for `reviewer_critic`; CLI help lists the alias; unknown reviewer role errors include accepted role ids and aliases.
|
|
50
|
+
|
|
51
|
+
## Finding 4: Concurrent `lock claim` commands can create duplicate lock ids
|
|
52
|
+
|
|
53
|
+
- **Open Orchestra issue:** https://github.com/jterrats/open-orchestra/issues/87
|
|
54
|
+
- **Status:** fixed in Open Orchestra
|
|
55
|
+
|
|
56
|
+
- **Date found:** 2026-05-06
|
|
57
|
+
- **Source repo:** `/Users/polux/dev/setup-agents`
|
|
58
|
+
- **Command pattern:** multiple `node_modules/.bin/orchestra lock claim ...` commands executed concurrently
|
|
59
|
+
- **Observed behavior:** two distinct locks were created with the same id, `lock-1778052846730`, for different paths.
|
|
60
|
+
- **Impact:** `lock release --id <id>` becomes ambiguous and can release the wrong lock or require manual state repair.
|
|
61
|
+
- **Expected behavior:** lock ids should be collision-resistant even when lock claims happen in the same millisecond.
|
|
62
|
+
- **Workaround used:** avoid concurrent state-mutating Orchestra commands and continue sequentially.
|
|
63
|
+
- **Suggested fix:** generate lock ids with a random suffix or monotonic per-process sequence in addition to the timestamp.
|
|
64
|
+
- **Resolution:** lock ids now include a timestamp plus `crypto.randomUUID()`, and concurrent lock claim regression coverage verifies uniqueness.
|
|
65
|
+
|
|
66
|
+
## Finding 5: Runtime bootstrap examples are not portable after package install
|
|
67
|
+
|
|
68
|
+
- **Open Orchestra issue:** https://github.com/jterrats/open-orchestra/issues/96
|
|
69
|
+
- **Status:** fixed in Open Orchestra
|
|
70
|
+
|
|
71
|
+
- **Date found:** 2026-05-06
|
|
72
|
+
- **Source repo:** `/Users/polux/dev/setup-agents`
|
|
73
|
+
- **Command pattern:** `node_modules/.bin/orchestra init --force`
|
|
74
|
+
- **Observed behavior:** generated `AGENTS.md` and `ORCHESTRA.md` bootstrap blocks recommend commands such as `node bin/orchestra.js health --json` and `node bin/orchestra.js task list --json`.
|
|
75
|
+
- **Impact:** those examples only work inside the Open Orchestra repository layout. When Open Orchestra is installed into another repository as a package or local file install, the consumer repo does not have `bin/orchestra.js`, so agents following the generated bootstrap will run the wrong command.
|
|
76
|
+
- **Expected behavior:** generated runtime bootstrap guidance should use the installed executable form, such as `orchestra health --json`, or derive a target-appropriate command prefix from the runtime/install context.
|
|
77
|
+
- **Workaround used:** run `node_modules/.bin/orchestra ...` directly from the consuming repo.
|
|
78
|
+
- **Suggested fix:** update command manifest examples and runtime bootstrap rendering to prefer `orchestra` for installed usage, with repo-local `node bin/orchestra.js` reserved for Open Orchestra development docs.
|
|
79
|
+
- **Resolution:** command manifest examples and generated runtime bootstrap blocks now use the portable installed executable form, `orchestra ...`; regression coverage verifies generated bootstrap content does not include `node bin/orchestra.js`.
|
|
80
|
+
|
|
81
|
+
## Finding 6: Concurrent `evidence add` commands can overwrite artifact files
|
|
82
|
+
|
|
83
|
+
- **Open Orchestra issue:** https://github.com/jterrats/open-orchestra/issues/98
|
|
84
|
+
- **Status:** fixed in Open Orchestra
|
|
85
|
+
|
|
86
|
+
- **Date found:** 2026-05-06
|
|
87
|
+
- **Source repo:** `/Users/polux/dev/open-orchestra`
|
|
88
|
+
- **Command pattern:** multiple `orchestra evidence add ...` commands executed concurrently
|
|
89
|
+
- **Observed behavior:** two distinct `EVIDENCE_ADDED` events pointed to the same artifact file when they were created in the same millisecond.
|
|
90
|
+
- **Impact:** the later evidence write overwrote the earlier evidence content, leaving one event pointing to mismatched artifact content.
|
|
91
|
+
- **Expected behavior:** every evidence event should keep a unique artifact path even under concurrent CLI usage.
|
|
92
|
+
- **Workaround used:** rerun evidence recording sequentially.
|
|
93
|
+
- **Suggested fix:** include a collision-resistant suffix in generated evidence artifact filenames.
|
|
94
|
+
- **Resolution:** evidence artifact filenames now include a UUID in addition to task, timestamp, and type; concurrent CLI regression coverage verifies unique artifact paths.
|
|
95
|
+
|
|
96
|
+
## Workspace State Safety Notes
|
|
97
|
+
|
|
98
|
+
- Open Orchestra serializes local workflow state writes with per-file lock directories next to the target file.
|
|
99
|
+
- JSON state files are written through temporary files and atomic rename to avoid partial JSON on interruption.
|
|
100
|
+
- The lock mechanism is intended for local filesystems. Network filesystems or stale lock directories after a killed process may require manual cleanup if a command times out waiting for a lock.
|
|
101
|
+
- State-mutating Orchestra commands should still prefer explicit task/path locks when multiple agents edit code, because file serialization protects workflow metadata, not source-code merge conflicts.
|