# ADR-0011: Phase 16 enumeration was silently rescoped; this fix synthesizes hierarchy and supersedes the rescope's invisibility

**Status:** Accepted (P3 of console-v2-fix-build, 2026-05-04). Supersedes Phase 16's
silent rescope (Cluster 1 in console-v2-audit-2026-05-04/AUDIT.md).

## Context

Phase 16 of the parent Console v2 build was specced to populate
`Project.episodes: list[Episode]` (required, no default) plus the
`/episodes` and `/scenes` list routes. The build shipped with `episodes=[]`
hardcoded and the routes unregistered (404). The rescope existed only as a
one-line code comment; no spec amendment, no `.out-of-scope/`, no ADR.

The audit (Cluster 1) flagged this as a P1: the hierarchy is unwalkable
from a stateless client; PHASE_18_SMOKE Item 2 is unreachable; Law 4 is
violated (the empty list masks "we don't enumerate yet").

## Decision

Console v2 ships hierarchy SYNTHESIS as the minimal fix:
- `Project.episodes` is populated from `set(shot["episode_id"])` per request,
  with each `Episode.synthesized = True`.
- One synthetic scene per episode (id `<episode_id>__synthetic_scene_1`) is
  emitted from a new `/api/projects/{pid}/episodes/{eid}/scenes` route.
- Two sanctioned fallbacks are registered: `episodes_synthesized_from_shot_index`
  and `scenes_synthesized_one_per_episode`. Every synthesis emits a fallback
  event, satisfying Law 4 prong-2.
- `Episode.scenes` is empty in the `/projects/{pid}` response (lazy fill).
- `synthesized: bool` is added to the Episode + Scene schemas; codegen
  propagates to TypeScript; the frontend decorates synthesized nodes.

The CORRECT long-term fix (engine-side `scene_id` backfill, first-class
Episode + Scene entities) is documented at
`.out-of-scope/hierarchy-enumeration-engine-side.md` and deferred to a
follow-on build.

## Consequences

PHASE_18_SMOKE Item 2 unblocks. Frontend sees a real tree it can walk.
Every fallback fires once per request — high-volume but quality-neutral and
visible. The `synthesized` field tells callers (and reviewers) which nodes
are placeholders. Two fallback emissions per project view is acceptable
chatter; if it becomes operational noise, the registry can grow a "rate
limit" knob (out of scope for P3).

Cross-references: ADR-0012 (Python sanctioned-fallback registry — the
substrate this synthesis lands on); ADR-0013 (chrome status truth — the
fallback counters surface through `/api/system-status.fallback_counts`,
which means JT will SEE these synthesis fires accumulate in the chrome
status pill).
