---
key: sched.reshuffle-scoped-reset
title: 2026-07-16 — Per-playout reshuffle = scoped Reset build; seed surfaced (#71)
status: active
since: '2026-07-16'
supersedes: none
superseded-by: none
rule: '`POST /api/v1/playouts/{id}/reshuffle` runs `ErasePlayoutHistory` (reseeds `Playout.Seed` + clears anchors/rerun-history) then enqueues a scoped `Reset` build, so reshuffle always reseeds — even for the non-Classic kinds `Reset` alone wouldn''t reseed; `Playout.Seed` is surfaced on list/detail DTOs as visible confirmation.'
signals: 'reshuffle, Playout.Seed, ErasePlayoutHistory, CollectionEnumeratorState · paths: `PlayoutBuilder` · issues: #71'
mechanics: '`POST /api/v1/playouts/{id}/reshuffle`; `ErasePlayoutHistory`; `PlayoutBuildMode.Reset`'
---

- The shuffle seed (`Playout.Seed`) + per-collection `CollectionEnumeratorState` already persist a stable
  shuffled order across rebuilds. #71's real gap was a **user-triggered per-playout reshuffle** (a Classic
  playout's seed is otherwise only reseeded by a full Reset, and `reset-all` uses `Refresh` for Classic, so
  it never reseeds Classic) plus visibility.
- `POST /api/v1/playouts/{id}/reshuffle` first runs `ErasePlayoutHistory` (reseeds `Playout.Seed` + clears
  anchors/rerun-history) and then enqueues `BuildPlayout(id, PlayoutBuildMode.Reset)` to rebuild. `Reset`
  alone only reseeds the seed for **Classic** playouts (`PlayoutBuilder`); Block/Sequential/Scripted rebuild
  deterministically from the existing seed, so `ErasePlayoutHistory` is the one primitive that reseeds +
  clears the derived per-collection enumerator state for all four resettable kinds — reshuffle runs it
  first so the reshuffle is never a no-op for non-Classic playouts. Named `/reshuffle` (not `/reset`) to (a)
  match user intent and (b) avoid the "reset-one reseeds Classic while reset-all refreshes Classic" naming
  clash. It is deliberately more aggressive than `reset-all` for Classic: an explicit single-channel action
  rolls a new order; the bulk action stays non-disruptive.
- `Playout.Seed` is surfaced on the playout list + detail DTOs so the SPA can show it — its purpose is
  **visible confirmation** (the seed changes after a reshuffle).
