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
runcommand: 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
useTaskSystemconfig flag actually wired into Sisyphus/Hephaestus now.- EXA websearch
x-api-keyheader restored (accidentally removed). promptAsyncgets 120s timeout (was infinite).- Comment checker CLI spawn gets 30s hard timeout.
- Session recovery returns
success=falsefor 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.0Thank you to our community contributors:
- @nianyi778: Add ELESTYLE to "Loved by professionals at" section
- New CLA signers: @RobertWsp, @materializerx, @cyberprophet, @lxia1220, @mrm007, @aliozdenisik, @JunyeongChoi0
Full Changelog: v3.4.0...v3.5.0
LFG ulw ulw!