Repository navigation
Description
Bug
The atlas hook's resolveActiveBoulderSession() adopts task-spawned worker subagent sessions into the active boulder, causing them to receive BOULDER_CONTINUATION_PROMPT directives that override their single-task constraint.
Reproduction
- Start a boulder session with an orchestrator (Sisyphus/Atlas) and a multi-task plan
- Orchestrator spawns 3 worker subagents via
task(), each assigned a single task - Worker finishes its task → goes idle →
session.idlefires - Atlas hook calls
resolveActiveBoulderSession()which:- Finds the session in
subagentSessions(alltask()sessions are tracked there) - Walks parent chain via
isSessionInBoulderLineage()→ parent is the orchestrator → returns true - Appends the worker to
boulderState.session_ids
- Finds the session in
BOULDER_CONTINUATION_PROMPTis injected: "Read the plan file NOW... mark checkboxes... do not stop until all tasks are complete"- Worker obeys the system directive, reads the full plan, and starts executing all remaining tasks
- All 3 workers do this independently → they race through the entire plan in parallel, stepping on each other's file edits
Root Cause
resolveActiveBoulderSession() in src/hooks/atlas/resolve-active-boulder-session.ts (lines 30-46) doesn't distinguish between:
- The orchestrator session (should receive boulder continuation)
- Worker subagent sessions spawned by
task()(should NOT — they have their own single-task scope)
Since all task()-spawned sessions are in subagentSessions AND have a parent in boulderState.session_ids, they always pass the lineage check.
Regression Timeline
| Date | Commit | What |
|---|---|---|
| Mar 9 | vmxzmltv "fix(atlas): append idle subagent sessions to active boulder" |
Introduced the bug — removed agent-mismatch guard, added blanket subagentSessions.has() + appendSessionId |
| Mar 13 | kovyrtor "fix(atlas): restrict idle-event session append to boulder-owned subagent sessions only" |
Narrowed blast radius with lineage check, but worker subagents still pass it |
Affected Files
src/hooks/atlas/resolve-active-boulder-session.ts— the lineage-based adoption logicsrc/hooks/atlas/boulder-session-lineage.ts— parent chain walkersrc/hooks/atlas/idle-event.ts— callsresolveActiveBoulderSessiononsession.idle
Suggested Fix
resolveActiveBoulderSession should not adopt sessions found via subagentSessions into the boulder. Sessions that should participate in the boulder are explicitly registered in boulderState.session_ids at creation time. The lineage walk was intended to restrict adoption to boulder-descended subagents, but all task()-spawned workers are boulder-descended by definition.
Simplest fix: remove the lineage-based adoption block (lines 30-46 of resolve-active-boulder-session.ts) and update the corresponding test in idle-event-lineage.test.ts.
Activity
github-actions commentedon Jul 4, 2026
To stay organized issues are automatically closed after 60 days of no activity. If the issue is still relevant please open a new one.