Skip to content

Releases: oxgeneral/ORCH

v1.0.21

09 Apr 11:26

Choose a tag to compare

Bug Fixes

  • Parallel runs race condition (#8) — when multiple agents completed in parallel via orch serve, successful runs were falsely marked as failed. Root cause: reconcile detected dead PIDs before handleRunSuccess acquired the mutex, treating clean exits as crashes. Fix: activeCollectors guard prevents reconcile from interfering with tasks that have an active event collector. Also fixes orphaned runs stuck in status: running when the running entry was already cleaned up
  • Assignee name resolution (#7) — tasks assigned by agent name (e.g. --assignee "Sam Altman") instead of agent ID were silently accepted but never dispatched. TaskService.resolveAssignee() now normalizes agent names to IDs at creation and assignment time, with clear error messages for unknown agents. findBestAgent() also matches by name as a fallback for legacy data

Tests

  • 15 new tests: activeCollectors guard (reconcile skip, crash detection, cleanup, orphaned run finalization), assignee name→ID resolution (create, assign, unknown name/ID, backward compatibility, findBestAgent name fallback)

v1.0.20

02 Apr 21:52

Choose a tag to compare

Bug Fixes

  • Goal completion deadlock — agents could not mark their own goal as achieved because the agent's running [auto] task blocked the pending-tasks guard. Autonomous tasks are now excluded from the check since they are the mechanism for achieving the goal, not a blocker
  • paused → achieved transition — goals in paused state can now be directly marked as achieved without requiring a resume first. State machine updated: paused → active | achieved | abandoned
  • TUI force-complete — pressing C on a goal in TUI now uses force: true to cancel cancellable pending tasks, with an informative status message. Previously it would silently fail if any non-terminal tasks existed

Tests

  • 4 new tests: autonomous task exclusion from pending check, non-auto task still blocks, paused → achieved with side effects, paused → achieved with force + pending tasks

v1.0.19

02 Apr 19:00

Choose a tag to compare

Bug Fixes

  • Retry dispatch race condition — fixed a race where a task could be re-dispatched from the retry queue after it had already succeeded. dispatchTask() now checks isDispatchable(task.status) before spawning, retry queue processing validates task status before dispatch, and _handleRunFailure skips if the running entry was already cleaned up by the success handler. This prevents zombie processes, false tasks_failed stats, and orphaned preparing runs
  • GitHub star count on landing page — navbar and CTA now show live star count fetched from GitHub API

Tests

  • 5 new tests covering retry race condition guards (dispatch of done/cancelled/failed tasks, retry queue skip, failure handler race)

v1.0.18

02 Apr 16:32

Choose a tag to compare

Features

  • Adapter-agnostic onboarding (#6) — orch init now auto-detects installed AI adapters (claude, opencode, codex, cursor) and lets you choose a default. Agent shop templates use semantic tiers (balanced, capable, fast) instead of hardcoded Claude model names, so agents are created with the correct model for your chosen adapter. Pass --adapter <name> to skip detection
  • Goal completion guard — goals can no longer be marked achieved while linked tasks are still pending (todo, in_progress, retrying, review). Agents calling orch goal status <id> achieved will see a clear error listing the blocking tasks. Use --force to cancel pending tasks and force the transition (skips in_progress tasks with live processes)

Fixes

  • MCP skills filtered for non-Claude adapters — agent shop templates and TUI wizard now strip MCP skills (colon-format like testing-suite:generate-tests) when the default adapter is not Claude, since MCP skills only work with the Claude CLI
  • Cursor agent probe false-positiveorch init adapter detection no longer probes the generic agent binary (too common on systems), only cursor-agent
  • TUI refresh after status change — fixed a race condition where entityListChanged() compared tasks by updated_at timestamp, causing refresh no-ops when initial and updated tasks had identical timestamps

Tests

  • 32 new tests: goal pending-tasks validation (10), model tier resolution (8), agent factory (5), adapter-agnostic init (4), MCP skill filtering (3), TUI refresh fix (2)

v1.0.13

23 Mar 21:44

Choose a tag to compare

Features

  • TUI Observer Mode — when another process holds the orchestrator lock (orch run --watch, orch serve, or the orch skill in Claude Code), the TUI now enters OBSERVING mode instead of showing a dead IDLE screen
  • Full cross-process event visibility — agent output, file changes, errors, tool calls, lifecycle events, task status transitions, orchestrator ticks
  • OBSERVING header badge — amber ● OBSERVING chip

Fixes

  • DiskObserver JSONL tailingstate.running keys are taskIds, not runIds. Fixed to use entry.run_id for JSONL paths

Improvements

  • Byte-offset JSONL tailing with partial-line buffering
  • Concurrent poll guard, stale-refresh dedup, 64KB remainder cap

Tests

  • 15 new tests (unit + integration) + battle test (5 runs, 44 events)

Install: npm install -g @oxgeneral/orch@1.0.13

v1.0.12

23 Mar 21:28

Choose a tag to compare

Features

  • TUI Observer Mode — when another process holds the orchestrator lock (orch run --watch, orch serve, or the orch skill in Claude Code), the TUI now enters OBSERVING mode instead of showing a dead IDLE screen. The new DiskObserver polls state.json and tails run JSONL files to deliver the same real-time activity stream as the in-process orchestrator
  • Full cross-process event visibility — observer mode shows agent output, file changes, errors, tool calls, lifecycle events (started/completed), task status transitions, and orchestrator ticks — identical to the native TUI experience
  • OBSERVING header badge — amber ● OBSERVING chip replaces the red error message, clearly indicating the TUI is connected to an external orchestrator

Improvements

  • Byte-offset JSONL tailing — DiskObserver tracks per-run byte offsets with partial-line buffering, reading only new bytes each tick. Handles mid-line splits across poll boundaries correctly
  • Concurrent poll guard — prevents race conditions when a poll tick takes longer than the poll interval
  • Stale-refresh dedup — periodic state refresh in observer mode skips if an event-driven refresh already ran recently, avoiding redundant disk reads
  • Remainder cap — partial JSONL line buffer is capped at 64KB to prevent unbounded memory growth on stalled writes

Tests

  • 15 new tests: 11 unit tests for DiskObserver (event translation, byte offsets, partial lines, error handling, unsubscribe), 4 integration tests (full lifecycle, failed runs, concurrent runs, orchestrator restart detection)
  • Battle test script simulating real cross-process orchestration with 5 runs and 44 events

Install: npm install -g @oxgeneral/orch@1.0.12

v1.0.5

16 Mar 21:25

Choose a tag to compare

orch serve — Headless Daemon Mode

Run ORCH as a background daemon for 24/7 operation on servers. Compatible with pm2 and systemd.

# On your VPS:
orch serve &

# From another terminal:
orch task add "Fix auth bug" -p 1   # daemon picks it up on next tick
orch status                          # see orchestrator state

Highlights

  • Structured JSON logging — machine-parseable output for Datadog, Grafana Loki, jq
  • --once mode — process all tasks and exit, designed for CI/CD pipelines (exit 0 = success, exit 1 = failures)
  • Graceful shutdown — SIGINT/SIGTERM waits for running agents, saves state, releases lock
  • Heap monitoring — memory usage tracked in tick events for 24/7 stability
  • pm2 / systemd ready — works as a managed process out of the box

New Options

orch serve [options]

  --once                 Process current tasks and exit
  --tick-interval <ms>   Override polling interval (default: 10000)
  --log-file <path>      Tee logs to file in addition to stdout
  --log-format <fmt>     json | text (default: json)
  --verbose              Include agent:output events (noisy, off by default)

Example Output

{"ts":"2026-03-17T10:00:00Z","level":"info","event":"serve:started","mode":"watch","pid":12345,"poll_interval_ms":10000}
{"ts":"2026-03-17T10:00:01Z","level":"info","event":"task:status_changed","taskId":"tsk_abc","from":"todo","to":"in_progress"}
{"ts":"2026-03-17T10:00:01Z","level":"info","event":"agent:started","agentId":"agt_1","taskId":"tsk_abc","runId":"run_xyz"}
{"ts":"2026-03-17T10:00:15Z","level":"info","event":"agent:completed","runId":"run_xyz","agentId":"agt_1","success":true}
{"ts":"2026-03-17T10:00:15Z","level":"info","event":"task:status_changed","taskId":"tsk_abc","from":"review","to":"done"}
{"ts":"2026-03-17T10:00:20Z","level":"info","event":"orchestrator:tick","running":0,"queued":0,"heap_mb":9.2}

Files Changed

File Action
src/cli/serve/types.ts New — LogFormat, ServeEvent types
src/cli/serve/structured-logger.ts New — StructuredLogger class
src/cli/serve/once-runner.ts New — runOnce() for --once mode
src/cli/commands/serve.ts New — serve command
src/application/orchestrator.ts Modified — startWatch({ skipAutonomousSeeding }) option
src/bin/cli.ts Modified — registered serve command

Tests: 1649 (37 new) · TypeScript: clean · Build: clean


Full Changelog: v1.0.4...v1.0.5

v1.0.4

15 Mar 13:42

Choose a tag to compare

Fixes

  • Restart safety — orphaned tasks on restart are now cancelled instead of retried, preventing agents from re-executing already committed work
  • FTUE parent leakorch in a new folder no longer picks up a parent directory's .orchestry/ project
  • Activity feed — history now loads correctly on startup (sort by recency, filter cancelled runs, log errors instead of silently swallowing)

v1.0.3 — Performance & Token Tracking

15 Mar 12:57

Choose a tag to compare

What's New

Reasoning & Cache Token Tracking

TokenUsage now tracks reasoning, cache_read, cache_write separately. Reasoning tokens are included in total; cache tokens are informational (subset of input, not double-counted). TUI header shows 🧠 icon when reasoning tokens are present.

Performance: IndexManager + Caching

  • Extracted generic IndexManager<T> with _index.json cache — list operations across all stores (TaskStore, AgentStore, ContextStore, GoalStore, MessageStore) now read 1 file instead of N
  • Parallel requireInit() + configStore.read() during CLI startup
  • Buffered printTable/printKeyValue output (single stdout.write call)
  • Orchestrator tick: parallel reconcile, findProjectRoot cache, lazy globalConfig
  • Removed redundant requireInit() in read-only commands

Fixes

  • IndexManager promise-chain mutex prevents TOCTOU race on concurrent reads/writes
  • rebuildIndex no longer deadlocks on re-entrant calls
  • Token code simplified: createTokenUsage as single source of truth, TokenUsage type reuse, useMemo for TUI header

Daemon Mode (design only)

Architecture doc for sub-10ms CLI responses via persistent background process — implementation coming in a future release.


Install / Upgrade:

npm i -g @oxgeneral/orch

🤖 Generated with Claude Code

v1.0.2

15 Mar 11:00

Choose a tag to compare

Release v1.0.2