# ADR-0003 — Delete ProductionLoop after EpisodeRunner validation

**Status:** Accepted
**Date:** 2026-05-05
**Deciders:** JT, Claude (in dialogue)
**Supersedes:** ADR-0002
**Superseded by:** none

> *This ADR was drafted by AI (Claude Opus 4.7) during the CP-10 orchestration substrate cleanup build.*

## Context

ADR-0002 (2026-05-03) accepted import-line rewrites in `production_loop.py`
during the engine-fix Phase D sprint, justifying the deviation by treating
`production_loop.py` as a stability anchor for the rest of the sprint. That
sprint closed with the `june-refactor-complete` tag (post CP-9, 2026-04-28).

CP-10 (this build) introduces `EpisodeRunner` — the unified orchestrator
that replaces `ProductionLoop`, `run_episode.py`, and the broken-on-import
`ClientSequenceRunner`. EpisodeRunner is built on the post-CP-7 substrate
(Take/Beat/Scene + dispatch + Workflow) and integrates the CP-10 Beat
persistence layer.

The substrate cleanup consult (`consultations/recoil/orchestration-substrate-cleanup/SYNTHESIS.md`)
identified that `production_loop.py` predates the CP-7 model and cannot be
reconciled with it without a full rewrite — at which point it becomes
EpisodeRunner.

## Decision

Delete `recoil/pipeline/orchestrator/production_loop.py` after Phase 3 of
the CP-10 build validates EpisodeRunner against driver-beware SEQ11.

This supersedes ADR-0002. Its stability-anchor role has expired; the
sprint that justified retention has shipped (`june-refactor-complete`).

## Consequences

**Single orchestrator.** EpisodeRunner is the canonical home for episode
orchestration. SSOT (Law 1) restored.

**Rollback path preserved.** `pre-cp10-substrate-cleanup` and
`pre-cp10-orchestrator` tags allow restoring `production_loop.py` if
EpisodeRunner is found inadequate post-deletion.

**Cascade.** Files that imported from `pipeline.orchestrator.production_loop`
must migrate to `pipeline.orchestrator.episode_runner`. Phase 3 of CP-10
has already updated the in-tree call sites; any external scripts must be
updated by their owners before the deletion is merged.

**Out-of-scope.** Style anchor propagation (`run_episode.py` had it;
deferred to a later CP). Workspace MCP `submit_sequence_generation` tool
wrapper (subprocess invocation works today; proper MCP wrapper is UX,
not a prerequisite).

## Verification

EpisodeRunner passes `pytest pipeline/orchestrator/tests/test_episode_runner.py`
(Phase 3) and the live SEQ11 run with `--budget-usd 5` (Phase 4 gate).
Scene JSON updated; `dailies_queue.json` populated; Workspace can read
state via existing surfaces (no new IPC).
