symphony-orchestrator 0.2.5 → 0.2.6

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/README.md CHANGED
@@ -65,11 +65,14 @@ and Task Branch context.
65
65
  Compozy PRD Run progress appears when Compozy tracking is selected.
66
66
 
67
67
  The Terminal Console is safe to keep open while Symphony runs. Its MVP safe local aids are limited to
68
- refreshing the latest in-memory Runtime State snapshot, navigating and filtering tabs, showing the
69
- Web Dashboard handoff command, and inspecting validated local paths such as the Workspace Repository
70
- or Runtime Home. These aids do not retry tasks, pause or resume dispatch, update tracker status, merge
71
- or push Task Branches, open pull requests, change Runtime Contract files, or otherwise mutate task
72
- lifecycle state.
68
+ refreshing the latest in-memory Runtime State snapshot, navigating and filtering tabs, opening focused Terminal Console settings with `s`, starting or reusing the loopback Web Dashboard with `w`, and inspecting validated local paths such as the Workspace Repository or Runtime Home.
69
+
70
+ The `s` settings surface persists Terminal Console theme in ignored Runtime Home state and persists the
71
+ Web Dashboard port by updating only Runtime Settings `server.port`. It is not a general Runtime
72
+ Settings editor and does not edit `server.host`, tracker, Git, agent, Harness, Sandbox, queue, or
73
+ lifecycle settings. The `w` action starts or reuses a compatible loopback Web Dashboard for the current
74
+ Workspace Repository and Runtime Home, then shows the dashboard URL. If the configured port is occupied
75
+ by an incompatible listener, Symphony reports a conflict instead of attaching to it. Settings and `w` do not retry tasks, pause or resume dispatch, update tracker status, merge or push Task Branches, open pull requests, or otherwise mutate task lifecycle state.
73
76
 
74
77
  Use Web Dashboard mode when browser-level inspection is more useful:
75
78
 
@@ -78,7 +81,9 @@ symphony --web --port 8080
78
81
  ```
79
82
 
80
83
  The Web Dashboard keeps using the Live Dashboard Connection as a Runtime State stream. It is not a
81
- Terminal Console command channel.
84
+ Terminal Console command channel. Terminal Console V1 dashboard controls are loopback-only; non-loopback
85
+ Web Dashboard access remains an explicit Runtime Settings choice and continues to require the
86
+ server-generated local dashboard auth token for Runtime State HTTP and Live Dashboard Connection access.
82
87
 
83
88
  For a non-interactive check, use `symphony --once`; it prints terminal output and exits without
84
89
  starting the foreground Terminal Console loop.
@@ -261,6 +266,22 @@ reasoning, and timeout fields for planner, engineer, or reviewer work:
261
266
  "command": ""
262
267
  }
263
268
  },
269
+ "cursor": {
270
+ "kind": "cursor",
271
+ "command": "cursor-agent -p --model <model> --output-format stream-json",
272
+ "loop": {
273
+ "enabled": false,
274
+ "command": ""
275
+ }
276
+ },
277
+ "cursor-force": {
278
+ "kind": "cursor",
279
+ "command": "cursor-agent -p --force --model <model> --output-format stream-json",
280
+ "loop": {
281
+ "enabled": false,
282
+ "command": ""
283
+ }
284
+ },
264
285
  "pi": {
265
286
  "kind": "pi",
266
287
  "command": "pi --model <model> --thinking <reasoning> --print --no-session",
@@ -308,12 +329,20 @@ reasoning, and timeout fields for planner, engineer, or reviewer work:
308
329
  }
309
330
  ```
310
331
 
311
- PI and Claude are not prerequisites for Codex-only dispatch. Symphony validates install and
332
+ PI, Claude, and Cursor are not prerequisites for Codex-only dispatch. Symphony validates install and
312
333
  authentication readiness only for Harnesses selected by enabled Stage Agent routes. A selected PI
313
334
  Harness requires the `pi` executable on `PATH` and provider authentication for the configured model. A
314
335
  selected Claude Harness requires the `claude` executable and Claude Code authentication, such as
315
- `ANTHROPIC_API_KEY` or Claude's configured login state. Runtime Settings must reference only
316
- environment variable names, never secret values.
336
+ `ANTHROPIC_API_KEY` or Claude's configured login state. A selected Cursor Harness requires the
337
+ `cursor-agent` executable and a successful `cursor-agent status` check, using either browser login or
338
+ `CURSOR_API_KEY`. Use the non-`--force` Cursor Harness for review-first operation; select the
339
+ `cursor-force` Harness only when the `Workspace Repository` operator intentionally wants Cursor to
340
+ write directly during that role. Runtime Settings must reference only environment variable names,
341
+ never secret values.
342
+
343
+ To assign Cursor to any Logical Agent, set `agents.<name>.harness` to `cursor` or `cursor-force`.
344
+ Keep `stageAgents.stages[]` routing by Logical Agent name rather than placing provider fields on the
345
+ stage itself.
317
346
 
318
347
  Legacy settings that place Harness definitions under `agents.*`, such as `agents.pi.kind`, are
319
348
  migration input. When the new Runtime Settings shape is in use, Symphony reports a blocking Readiness
@@ -324,6 +353,44 @@ definitions. Stage-level `stageAgents.stages[].harness` is also legacy input; mo
324
353
  If setup is incomplete, the Terminal Console still starts and prints Readiness Gaps with remediation
325
354
  steps. Dispatch remains disabled until those gaps are resolved.
326
355
 
356
+ ### Optional Docker Sandbox
357
+
358
+ Sandboxing is a repository-level Runtime Settings boundary for Workspace Repositories that should run
359
+ agent work through Docker instead of direct host Agent Harness execution. It is optional and disabled
360
+ by default. Docker is the only supported sandbox type in V1:
361
+
362
+ ```json
363
+ {
364
+ "sandbox": {
365
+ "enabled": false,
366
+ "type": "docker",
367
+ "image": "ghcr.io/your-org/symphony-agent:latest",
368
+ "bootstrapCommands": [],
369
+ "persistent": true,
370
+ "networkEnabled": false,
371
+ "cpuLimit": 2,
372
+ "memoryMb": 4096
373
+ }
374
+ }
375
+ ```
376
+
377
+ Set `sandbox.enabled` to `true` only after replacing `sandbox.image` with the Docker image for the
378
+ Workspace Repository. When sandboxing is enabled, Symphony treats the Sandbox as required for agent
379
+ execution in that repository. Missing required settings, unsupported `sandbox.type` values, Docker
380
+ availability problems, or unhealthy sandbox state are Readiness Gaps and block dispatch; Symphony does
381
+ not silently fall back to host execution.
382
+
383
+ `sandbox.bootstrapCommands` is a list of non-empty shell commands that run only when Symphony creates
384
+ or recreates the Agent Worktree-scoped Docker container. V1 requires `sandbox.persistent: true` so
385
+ restarts of the same work item can reuse the named container without sharing it with concurrent Agent
386
+ Worktrees. `sandbox.networkEnabled` makes network access explicit, and `sandbox.cpuLimit` /
387
+ `sandbox.memoryMb` must be positive integers.
388
+
389
+ Runtime State snapshots include the running-work fields `sandbox_enabled`, `sandbox_provider`, and
390
+ `sandbox_reuse_outcome`. The reuse outcome is one of `created`, `reused`, or `recreated`; these
391
+ fields are the V1 visibility surface for confirming whether a sandboxed run used a fresh, warm, or
392
+ refreshed container.
393
+
327
394
  For the GitHub Tracker, readiness includes the configured owner, Workspace Repository name, GitHub
328
395
  Project number, status field, and token environment variable. For Local Issue Tracker runs,
329
396
  GitHub owner, repo, Project, and token settings are not required. The local tracker readiness checks
@@ -473,8 +540,8 @@ from the same Compozy PRD Run when those files exist.
473
540
  Set `goal.enabled` to `true` on a specific stage to allow Stage Goal Handoff for that stage only.
474
541
  The selected Harness decides whether a loop command is actually sent. The Bootstrap default Codex
475
542
  Harness has `loop.enabled: true` and `loop.command: "/goal"`, so Codex receives `/goal` with
476
- deterministic Stage Goal Context before the normal Agent Prompt. The Bootstrap default Claude and PI
477
- Harnesses have loop disabled, so those Harnesses run the normal prompt even when a stage has
543
+ deterministic Stage Goal Context before the normal Agent Prompt. The Bootstrap default Claude, Cursor,
544
+ and PI Harnesses have loop disabled, so those Harnesses run the normal prompt even when a stage has
478
545
  `goal.enabled: true`. Stage Goal Context includes issue identifier, title, description, comments, URL,
479
546
  current tracker status, labels, priority when present, blocker references when present,
480
547
  attempt, and stage agent name. It omits issue creation and update timestamps.
@@ -490,6 +557,71 @@ goals = true
490
557
  If a selected loop-enabled Codex Harness cannot accept the configured loop command, Symphony reports a
491
558
  Readiness Gap. Goal Usage reported by Codex is stored in Runtime State for running, retrying, and
492
559
  attention-needed task details when available; missing or unparseable Goal Usage does not fail a task.
560
+ If a selected loop-enabled Cursor Harness cannot accept the configured loop command from standard
561
+ input, Symphony reports a Cursor loop Readiness Gap. Cursor `stream-json` activity updates the same
562
+ running-task Runtime State fields used by other Harnesses, while raw stdout and stderr logs remain
563
+ available as diagnostics.
564
+
565
+ Goal Loop is separate from Stage Goal Handoff. Stage Goal Handoff is launch-time prompt handoff;
566
+ Goal Loop is Runtime-owned Stage Agent behavior that can stop as Goal met, Needs attention, or
567
+ Budget exhausted. Goal met requires deterministic evidence, so Goal Usage, agent exit `0`, changed
568
+ files, or model confidence alone does not count as completion evidence.
569
+
570
+ Enable Goal Loop per stage with `goalLoop`. Bootstrap does not add Goal Loop defaults; omitting the
571
+ block keeps existing stage behavior unchanged. The `goalLoop.evidence` block configures the Goal
572
+ Loop Evidence Command. The evidence command is an argv array, runs from the configured working
573
+ directory, receives the same structured input on stdin and through the Context Command temp-file path
574
+ convention, and should print a concise, secret-free evidence summary:
575
+
576
+ ```json
577
+ {
578
+ "stageAgents": {
579
+ "enabled": true,
580
+ "root": ".symphony/agents",
581
+ "stages": [
582
+ {
583
+ "states": ["Todo", "To-Do", "In progress", "In Progress"],
584
+ "agent": "engineer",
585
+ "successStatus": "In review",
586
+ "retryStatus": "To-Do",
587
+ "goalLoop": {
588
+ "enabled": true,
589
+ "evidence": {
590
+ "command": ["pnpm", "test"],
591
+ "cwd": "agentWorktree",
592
+ "timeoutMs": 120000,
593
+ "maxOutputBytes": 8192
594
+ },
595
+ "budget": {
596
+ "maxTurns": 4,
597
+ "maxRuntimeMs": 3600000,
598
+ "maxTokens": 200000
599
+ }
600
+ }
601
+ }
602
+ ]
603
+ }
604
+ }
605
+ ```
606
+
607
+ The evidence command contract is intentionally narrow. A zero exit code with bounded stdout is
608
+ successful deterministic evidence. Missing commands, timeouts, non-zero exits, invalid output, or
609
+ missing deterministic evidence retry the same task with missing-evidence guidance while the
610
+ configured budget allows another attempt; once the loop cannot continue, the stop outcome is Needs
611
+ attention or Budget exhausted instead of Goal met.
612
+
613
+ Runtime State exposes Goal Loop State as top-level `goal_loops[]` entries with `issue_id`,
614
+ `issue_identifier`, `run_id`, `goal`, `state`, `stage_agent`, `harness_name`, `harness_kind`,
615
+ `attempt_count`, `budget`, `latest_evidence`, `stop_outcome`, `stop_reason`, `next_action`,
616
+ `diagnostics_path`, and `updated_at`. The Goal Loop Stop Outcome is `goal_met`, `needs_attention`, or
617
+ `budget_exhausted`. The Terminal Console and Web Dashboard read that same Runtime State projection
618
+ near Goal Usage and Context Status, including stopped Goal met, Needs attention, and Budget
619
+ exhausted outcomes.
620
+
621
+ Goal Loop does not own delivery authority. Stage Commit, Stage Push, Task Branch Integration, merge,
622
+ pull request creation, auto-merge, and tracker status transitions stay governed by the existing
623
+ Runtime Contract and run only through the existing completion and delivery lifecycle after Goal met
624
+ evidence succeeds.
493
625
 
494
626
  Stage commits run after an agent exits successfully and before Symphony moves the issue to the
495
627
  stage's `successStatus`. Set `commit.enabled` per stage to control which transitions create commits;