Releases: oxgeneral/ORCH
Releases · oxgeneral/ORCH
v1.0.21
Bug Fixes
- Parallel runs race condition (#8) — when multiple agents completed in parallel via
orch serve, successful runs were falsely marked asfailed. Root cause: reconcile detected dead PIDs beforehandleRunSuccessacquired the mutex, treating clean exits as crashes. Fix:activeCollectorsguard prevents reconcile from interfering with tasks that have an active event collector. Also fixes orphaned runs stuck instatus: runningwhen 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
Bug Fixes
- Goal completion deadlock — agents could not mark their own goal as
achievedbecause 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 → achievedtransition — goals inpausedstate can now be directly marked asachievedwithout requiring a resume first. State machine updated:paused → active | achieved | abandoned- TUI force-complete — pressing
Con a goal in TUI now usesforce: trueto 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 → achievedwith side effects,paused → achievedwith force + pending tasks
v1.0.19
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 checksisDispatchable(task.status)before spawning, retry queue processing validates task status before dispatch, and_handleRunFailureskips if the running entry was already cleaned up by the success handler. This prevents zombie processes, falsetasks_failedstats, and orphanedpreparingruns - 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
Features
- Adapter-agnostic onboarding (#6) —
orch initnow 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
achievedwhile linked tasks are still pending (todo,in_progress,retrying,review). Agents callingorch goal status <id> achievedwill see a clear error listing the blocking tasks. Use--forceto cancel pending tasks and force the transition (skipsin_progresstasks 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-positive —
orch initadapter detection no longer probes the genericagentbinary (too common on systems), onlycursor-agent - TUI refresh after status change — fixed a race condition where
entityListChanged()compared tasks byupdated_attimestamp, 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
Features
- TUI Observer Mode — when another process holds the orchestrator lock (
orch run --watch,orch serve, or theorchskill 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
● OBSERVINGchip
Fixes
- DiskObserver JSONL tailing —
state.runningkeys are taskIds, not runIds. Fixed to useentry.run_idfor 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
Features
- TUI Observer Mode — when another process holds the orchestrator lock (
orch run --watch,orch serve, or theorchskill in Claude Code), the TUI now enters OBSERVING mode instead of showing a dead IDLE screen. The newDiskObserverpollsstate.jsonand 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
● OBSERVINGchip 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
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 stateHighlights
- Structured JSON logging — machine-parseable output for Datadog, Grafana Loki,
jq --oncemode — 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
Fixes
- Restart safety — orphaned tasks on restart are now cancelled instead of retried, preventing agents from re-executing already committed work
- FTUE parent leak —
orchin 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
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.jsoncache — 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/printKeyValueoutput (singlestdout.writecall) - Orchestrator tick: parallel reconcile,
findProjectRootcache, lazy globalConfig - Removed redundant
requireInit()in read-only commands
Fixes
- IndexManager promise-chain mutex prevents TOCTOU race on concurrent reads/writes
rebuildIndexno longer deadlocks on re-entrant calls- Token code simplified:
createTokenUsageas single source of truth,TokenUsagetype reuse,useMemofor 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
Release v1.0.2