# BigMind Session Loop — Root Cause & Fix Plan **Date:** 2026-04-10 **Reported by:** Patrick **Severity:** High — caused 6 identical wasted sessions with $0+ API cost per loop --- ## Problem Statement BigMind's session ritual, combined with mode-specific behavior rules, creates a self-reinforcing resumption loop when a session ends as `partial`. The model loads prior context, sees an incomplete task, and autonomously attempts to resume it — without ever waiting for user input. This produces a chain of identical `partial` sessions that only breaks when Patrick manually intervenes. Observed: 6 identical sessions titled *"Prepared large-scale CannaManage branding generation"*, all `partial`, all spawned from one session ending before image generation completed in pic-gen mode. --- ## Root Cause Analysis ### Loop Trigger Chain ``` [Session N] ends partial (task: CannaManage branding generation) │ ▼ [Session N+1] memory_start_session() → loads context │ │ Context shows: last outcome = partial │ Rule 1: "search before every task, avoid redundant work" │ → model reads: "prior task incomplete, I must finish it" │ ▼ memory_announce_focus() called with prior session's task │ → locks in wrong objective BEFORE user speaks │ ▼ Mode rules (pic-gen) fire: "generate images now" │ → autonomous action without user instruction │ ▼ Hits context/token/tool limit → session ends partial │ └──────────────────────────────────────────► REPEAT ``` ### Three Compounding Failures #### Failure 1: Rule 1 — No "partial = history only" clause Rule 1 says to load context and search for prior work. It has **no explicit instruction** that sessions marked `partial` are historical records, NOT resumption requests. The model's default behavior is to treat incomplete work as a pending obligation. #### Failure 2: memory_announce_focus — Called on prior context, not current task The architect rules say to call `memory_announce_focus()` as part of the startup ritual. But when no user message has been received yet, the model has nothing to announce except the prior session's objective — which is the wrong task for the new session. #### Failure 3: Mode interaction amplification Modes with strong "do the task" personalities (pic-gen, code) compound the loop. When context suggests "there's pending image generation work", pic-gen mode's instructions say to start generating — creating autonomous action before the user speaks. --- ## Fix Design ### Fix 1: Rule 1 Addendum — Partial Sessions Are History Add explicit text to Rule 1 in `01-bigmind-core.md`: > **`partial`, `blocked`, or `abandoned` outcomes are historical records only.** > They do NOT constitute task queues, resumption requests, or pending obligations. > A new session begins fresh. The current session's task is determined solely by > what the user writes in their first message — never by the outcome of a prior session. ### Fix 2: New Rule 9 — Anti-Loop Guardrail Add Rule 9 to `01-bigmind-core.md`: > **Rule 9: Detect and Break Loops Before They Start** > > If `memory_start_session()` context shows 2 or more recently closed sessions with: > - Near-identical headlines or topics, AND > - `partial` or `blocked` outcome > > → **Do NOT attempt to resume the repeated task.** > → Instead: acknowledge the loop to the user, summarize what context was accumulated > across the repeated sessions, and ask: "What would you like to do?" > > Never assume the correct action is to retry a failed/partial task silently. ### Fix 3: memory_announce_focus — Wait for User Input Add a constraint to Rule 3 (announce focus): > **`memory_announce_focus()` must reflect the CURRENT session's task.** > Call it only AFTER the user has given a clear instruction for this conversation. > Do NOT announce focus derived from prior session outcomes before the user speaks. > During the startup ritual (steps 1-4 of Rule 1), use a placeholder focus if needed: > `memory_announce_focus(session_id, "Awaiting user task assignment")` ### Fix 4: Mode Interaction Safety Clause Add a universal safety rule (applies to all modes): > **Session ritual completion ≠ task authorization.** > Completing `memory_start_session()` + `memory_list_hypotheses()` + `memory_announce_focus()` > does NOT authorize beginning any task. Work begins only when the user explicitly assigns it > in the current conversation. Prior session context is reference material, not instruction. --- ## Files to Change | File | Change | |------|--------| | `.roo/rules/01-bigmind-core.md` | Add Rule 9, add partial=history clause to Rule 1, add focus guard to Rule 3 | | `.roo/rules/00-identity.md` | Add mode-interaction safety clause | --- ## Risk Assessment | Risk | Likelihood | Mitigation | |------|-----------|------------| | Model ignores new rules in long context | Medium | Rules are loaded via rules files, not context — they apply per-session | | Fix breaks legitimate resumption (e.g., user explicitly asks to continue) | Low | Rules say "task determined by user's first message" — explicit resumption request still works | | New Rule 9 fires falsely on legitimate repeated partial tasks | Low | Trigger requires near-identical headlines AND repeated partial — normal work produces diverse headlines | --- ## Success Criteria 1. Starting a new session after a partial pic-gen session → model waits for user input, no autonomous generation 2. Starting a new session after 2+ identical partial sessions → model acknowledges the loop and asks what to do 3. User explicitly asking "continue the branding generation" → model correctly resumes (rule only prevents silent resumption) --- ## Implementation Order 1. Patch `.roo/rules/01-bigmind-core.md` — add Rule 9 + partial=history clause + focus guard 2. Patch `.roo/rules/00-identity.md` — add mode interaction safety clause 3. Test by starting a new session in pic-gen mode with partial history in context 4. Push to Gitea