Files
pi_mcps/plans/bigmind-loop-fix.md
Patrick Plate 9453aecf0b fix(roo): add anti-loop guardrails to prevent autonomous session resumption
- Add Rule 9 (Anti-Loop Guardrail) to 01-bigmind-core.md: detect 2+ identical
  partial sessions and surface the loop to user instead of auto-resuming
- Add partial=history clause to Rule 1: partial/blocked/abandoned outcomes are
  historical records only, never task queue items
- Add focus guard to memory_announce_focus: must reflect current user message,
  not prior session outcome; use 'Awaiting user task assignment' if no task yet
- Add .roo/rules/06-anti-loop.md: global injection for ALL modes overriding
  any mode-specific 'do the task immediately' behavior
- Add mode interaction safety clause to 00-identity.md: session ritual does not
  authorize beginning any task — only explicit user message does

Root cause: pic-gen 'do the task' personality + BigMind context inference
produced 6 identical partial branding sessions in a loop.
2026-04-10 23:27:32 +02:00

6.1 KiB

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