# Track Specification: Pipeline Pause/Resume (pipeline_pause_resume_20260306)

## Overview
Add global pause/resume for entire DAG execution pipeline. Allow user to freeze all worker activity and resume later without losing state.

## Current State Audit

### Already Implemented (DO NOT re-implement)

#### Execution Loop (multi_agent_conductor.py)
- **`ConductorEngine.run()`**: Async loop that processes tickets
- **Loop continues until**: All complete OR all blocked OR error
- **No pause mechanism**

#### Execution Engine (dag_engine.py)
- **`ExecutionEngine.tick()`**: Returns ready tasks
- **`auto_queue` flag**: Controls automatic task promotion
- **No global pause state**

#### GUI State (gui_2.py)
- **`mma_status`**: "idle" | "planning" | "executing" | "done"
- **No paused state**

### Gaps to Fill (This Track's Scope)
- No way to pause execution mid-pipeline
- No way to resume from paused state
- No visual indicator for paused state

## Architectural Constraints

### State Preservation
- Running workers MUST complete before pause takes effect
- Paused state MUST preserve all ticket statuses
- No data loss on resume

### Atomic Operation
- Pause MUST be atomic (all-or-nothing)
- No partial pause state

### Non-Blocking
- Pause request MUST NOT block GUI thread
- Pause signaled via threading.Event

## Architecture Reference

### Key Integration Points

| File | Lines | Purpose |
|------|-------|---------|
| `src/multi_agent_conductor.py` | 80-150 | `ConductorEngine.run()` - add pause check |
| `src/dag_engine.py` | 50-80 | `ExecutionEngine` - add pause state |
| `src/gui_2.py` | ~170 | State for pause flag |
| `src/gui_2.py` | 2650-2750 | `_render_mma_dashboard()` - add pause button |

### Proposed Pause Pattern

```python
# In ConductorEngine:
self._pause_event: threading.Event = threading.Event()

def pause(self) -> None:
 self._pause_event.set()

def resume(self) -> None:
 self._pause_event.clear()

# In run() loop:
async def run(self):
 while True:
  if self._pause_event.is_set():
   await asyncio.sleep(0.5)  # Wait while paused
   continue
  # Normal processing...
```

## Functional Requirements

### FR1: Pause Button
- Button in MMA dashboard
- Disabled when no execution active
- Click triggers `engine.pause()`

### FR2: Resume Button
- Button in MMA dashboard (replaces pause when paused)
- Disabled when not paused
- Click triggers `engine.resume()`

### FR3: Visual Indicator
- Banner or icon when paused
- `mma_status` shows "paused"
- Ticket status preserved

### FR4: State Display
- Show which workers were running when paused
- Show pending tasks that will resume

## Non-Functional Requirements

| Requirement | Constraint |
|-------------|------------|
| Response Time | Pause takes effect within 500ms |
| No Data Loss | All state preserved |
| Visual Feedback | Clear paused indicator |

## Testing Requirements

### Unit Tests
- Test pause stops task spawning
- Test resume continues from correct state
- Test state preserved across pause

### Integration Tests (via `live_gui` fixture)
- Start execution, pause, verify workers stop
- Resume, verify execution continues
- Verify no state loss

## Out of Scope
- Per-ticket pause (all-or-nothing only)
- Scheduled pause
- Pause during individual API call

## Acceptance Criteria
- [ ] Pause button freezes pipeline
- [ ] Resume button continues execution
- [ ] Visual indicator shows paused state
- [ ] Worker states preserved
- [ ] No data loss on resume
- [ ] `mma_status` includes "paused"
- [ ] 1-space indentation maintained
