github code-yeongyu/oh-my-opencode v3.5.0
v3.5.0 — Atlas Trusts No One

latest release: v3.5.1
13 hours ago

v3.5.0 — Atlas Trusts No One

Atlas was naive. A subagent said "done" — Atlas moved on. Tests failing, code half-baked, requirements missing entirely. Didn't matter. "Done" meant done.

Not anymore.

Atlas now enforces mandatory manual code review. You Read every file the subagent touched. You cross-check claims against reality. You verify imports, logic, edge cases — or you don't proceed. No rubber-stamping. No skipping Step 2.

But that wasn't the only thing Atlas got wrong.


What Changed in Atlas

Boulder continuation fired on any idle session. Yours wasn't even part of the boulder — didn't matter. Atlas injected continuation prompts into random sessions. Phantom continuations everywhere.

Now Atlas checks session_ids first. Not in the list? You don't get continued. Period.

injectBoulderContinuation wasn't being awaited. Fire-and-forget. When it failed — and it failed — errors were swallowed silently. Your boulder stalled. You stared at a frozen session wondering what went wrong. The answer: Atlas threw the error into the void.

Now it's awaited. Failures are tracked. Prompt failure count increments. Two strikes, continuation stops. No more hammering broken sessions.

Plan paths pointed to the wrong place. .sisyphus/tasks/*.yaml — a path that doesn't exist anymore. Atlas looked where there were no plans. Fixed to .sisyphus/plans/*.md.

Sisyphus sessions were blocked from boulder continuation. Atlas-agent only. But Sisyphus runs when the boulder defaults to Atlas — same intent, different name. Now Sisyphus gets through.

The continuation prompt itself improved. Before: just "continue working." Now: "Read the plan file FIRST." Check exact progress. Count the remaining - [ ] tasks. No more guessing where you left off.


Also Shipped

🔴 Background Task Interrupts

Background tasks that fail during promptAsync are now marked "interrupt" instead of generic "error". Notifications show INTERRUPTED — you know exactly what happened without digging into logs.

🧭 Session Idle Dedup

OpenCode fires both session.status {type:"idle"} and session.idle for the same event. Your hooks fired twice. Now there's a 500ms dedup window — one idle, one dispatch, zero duplicates.

📝 Comment Checker: apply_patch

AI slop detection now catches apply_patch edits. Previously only Write/Edit tools were checked — patches slipped through. Not anymore.

📂 Skill @path Auto-Resolution

@scripts/search.py in skill templates → /home/user/.config/opencode/skills/frontend/scripts/search.py. No more broken relative references when skills load from unexpected directories.

🐚 Prometheus: Bash Access

The planner agent can now execute bash commands. Previously restricted to read-only tools — now it actually inspects the environment it's planning for.


Fixes

Delegation System (Wave 1 + 2)

The entire sync delegation pipeline was overhauled:

  • Polling: Native finish-based completion detection. No more fragile message-count stability polling.
  • Resource cleanup: Subagent sessions cleaned up on ALL exit paths.
  • Tool restrictions: Sync tasks get their tools back.
  • CLI runner: Fixed hang caused by event processor promise missing .catch().
  • JSONC: Config writes use proper jsonc-parser — no more corruption from comments or trailing commas.

CLI & Config

  • run command: timeout 2min → 10min, handles "retry" status, error check before idle gates.
  • Config migration applies in-memory even if backup fails.
  • Auth-plugins: crash recovery restores previous config on write failure.
  • Sensitive query params redacted from skill-mcp error messages.

Agent System

  • useTaskSystem config flag actually wired into Sisyphus/Hephaestus now.
  • EXA websearch x-api-key header restored (accidentally removed).
  • promptAsync gets 120s timeout (was infinite).
  • Comment checker CLI spawn gets 30s hard timeout.
  • Session recovery returns success=false for unsupported prefill.
  • Sisyphus-Junior can use TaskCreate/Update/List without delegation tool block.
  • Todo continuation enforcer requires active boulder session.

The Great Split

645 files. 25+ god-files decomposed. 200 LOC hard limit enforced.

Module Before After
src/index.ts 1,004 lines 88 lines + 4 orchestration files
delegate-task/executor.ts 998 lines 16 lines + 15 modules
background-agent/manager.ts 1,646 lines Core manager + 20 modules
hooks/atlas/index.ts 700 lines 25 lines + 15 modules
hooks/todo-continuation-enforcer.ts 517 lines 58 lines + 11 modules
hooks/ralph-loop/index.ts 456 lines 53 lines + 9 modules
hooks/session-recovery/index.ts 451 lines 145 lines + 12 modules
hooks/claude-code-hooks/index.ts 422 lines 22 lines + 6 handlers
tools/lsp/client.ts 854 lines 129 lines + 12 modules
config/schema.ts 483 lines 21 schema component files
cli/install.ts 540 lines 189 lines + validators/prompts
cli/config-manager.ts 680 lines 82 lines + 18 modules

New architecture layer: src/plugin/ — 21 files composing the plugin interface.

Every utils.ts renamed to what it actually does: result-formatter.ts, session-formatter.ts, tmux-path-resolver.ts, source-detector.ts.

Not a single public API changed.


Stats

645 files changed
+34,507 additions
-21,492 deletions


Breaking Changes

None. Internal module boundaries only. All public APIs unchanged.


Upgrade

npm install -g oh-my-opencode@3.5.0
# or
bun install -g oh-my-opencode@3.5.0

Thank you to our community contributors:

Full Changelog: v3.4.0...v3.5.0

LFG ulw ulw!

Don't miss a new oh-my-opencode release

NewReleases is sending notifications on new releases.