dec-0046

Vista generada de dec-0046: El planner modela direct-play con tres estados ortogonales — DIRECT_ELIGIBLE (codec/container decodificable), DIRECT_SUSTAINABLE (link medido sostiene el envelope, informativo no veto), DIRECT_POLICY_SELECTED (policy de sesión decide) — junto con la 'regla canónica' que l

ImplementadoSin versión del tren todavía· generada desde docs/decisions/dec-0046-planner-modela-direct-play-tres-estados.md
track/docsdec-0124track/docs:DC10

Vista generada desde docs/decisions/dec-0046-planner-modela-direct-play-tres-estados.md. No se edita a mano: bun run docs:gen la regenera y bun run docs:check falla si difiere. El estado aquí es el del model: si discrepa con otra página, manda el model.

CampoValor
EstadoLOCKED (migrado de un rNN por gate-3: el fichero no declara estado)
Referencia legadaL1-three-orthogonal-states
Ficherodocs/decisions/dec-0046-planner-modela-direct-play-tres-estados.md

Enmienda a: r32-bitrate-not-a-gate-2026-06-24

Por qué importa (del frontmatter del ADR):

Embebido literal en .claude/rules/codec-agnostic-architecture.md:40-42 (regla de gobierno del boundary packages/playback-policy+capability-model+domain), roadmap.spec.yml:925 (título del gate r32 cita explícitamente el split 3-axes), ROADMAP.md:286-288, r42-cathedral-adjacent-spike:115 ('NO modificar semánticas r31/r32 ni DIRECT_ELIGIBLE/DIRECT_SUSTAINABLE/DIRECT_POLICY_SELECTED' — dos veces en ese handoff), y materializado en código real: packages/api-contracts/src/playback-plan.ts (reason kinds 'link-ample'/'link-tight'/'bitrate-unknown', interface IPlaybackLink) + packages/playback-policy/src/planner.ts (param link) según docs/specs/r32-playback-planner-impl-spec.md, más packages/mocks/src/sintel-federation.ts que cita DIRECT_SUSTAINABLE en un comentario de fixture ya en uso por F-UI.

Nodos del roadmap que lo citan en refs: ninguno.

Páginas de la documentación que lo citan: ninguna todavía.

Texto del ADR

Leído de docs/decisions/dec-0046-planner-modela-direct-play-tres-estados.md, el fichero canónico.

El planner modela direct-play con tres estados ortogonales — DIRECT_ELIGIBLE (codec/container decodificable), DIRECT_SUSTAINABLE (link medido sostiene el envelope, informativo no veto), DIRECT_POLICY_SELECTED (policy de sesión decide) — junto con la 'regla canónica' que la resume (líneas 32-35, fusiono aquí L3 porque es una reformulación del mismo modelo, no un lock independiente).

El planner modela direct-play con tres estados ortogonales — DIRECT_ELIGIBLE (codec/container decodificable), DIRECT_SUSTAINABLE (link medido sostiene el envelope, informativo no veto), DIRECT_POLICY_SELECTED (policy de sesión decide) — junto con la 'regla canónica' que la resume (líneas 32-35, fusiono aquí L3 porque es una reformulación del mismo modelo, no un lock independiente).

Por qué pasa gate-3

  • Hard-to-reverse: Revertir a un estado único 'direct eligible' requeriría cambiar PlaybackLink, los reasons link-tight/link-ample/bitrate-unknown, y toda la lógica del planner que depende de distinguir elegibilidad de sostenibilidad. Es un cambio estructural en la arquitectura de playback plan.
  • Surprising sin contexto: Sin este addendum, un ingeniero competente leyendo r32 original inferiría que bitrate no es gate, pero NO inferiría la necesidad de dos ejes adicionales (sostenibilidad y policy) para modelar correctamente el caso link-20Mbps/asset-80Mbps-sostenido. El split 'eligible vs sustainable vs policy-selected' no es obvio sin el contexto explícito del ADR.
  • Trade-off real: La alternativa considerada y rechazada era mantener un solo estado 'direct eligible' y dejar que el planner 'mienta' (reporte direct cuando el link no sostiene el envelope). El trade-off es visible: simplicidad de un solo estado vs corrección semántica de tres estados que no ocultan la realidad del link al usuario.

Procedencia

Split de docs/decisions/r32-addendum-eligibility-sustainability-policy-2026-06-24.md (lock L1-three-orthogonal-states) durante PASO 7 (2026-07-16). Ver el fichero padre para el contexto completo del pack original.