Surtido: split Ruta A fundido en main (2026-09-14)

Contexto: user pidió fundir experiments con main “split pero sin ámbar”: la Ruta A (dos paneles lista|lector) integrada en el home HN de main, manteniendo la estética crema/serif, sin el CRT ámbar de experiments-ambar, y sin tocar el asgi completo (radio, cursos, fuentes, ediciones).

# Commit 061e033 (main), push + vercel --prod (Ready in 19s)

## Cambios
- asgi.py: +GET /ediciones (lista de reporte/*.json desc) y
  +GET /ediciones/{fecha} (render_html del boletín), con 404 real
  (_pagina ahora acepta status=). Nav ganó "Ediciones" (entre Inicio y Fuentes).
- asgi.py: +GET /leer/lectura?u= → JSONResponse con Cache-Control:no-store.
- leer.py: portados de experiments-ambar (sin ámbar): _VIDEO_RE, _video_id,
  _transcripto_youtube, _extracto_lectura, _cache_lectura, _guardar_lectura,
  _EN_MARCADORES, _parece_es, lectura_json. Tipo: _resumen_extractivo → string,
  parrafos → list. Forma del JSON: {url,hash,titulo,es,resumen,parrafos,
  fuente,generado}.
- hn.py: split lista|lector en el home (Ruta A):
  - Layout: .feed (izq) + aside.lector#lector (der). .fuentes-panel sigue,
    sin columna extra. Filas con data-url / data-titulo / data-medio.
  - Desktop (≥1000px): grid minmax(0,1fr) minmax(340px,460px), lector
    sticky (max-height 100vh-100px), visible por default.
  - Mobile (<1000px): .lector como overlay fixed full-screen (z-60,
    height 100dvh), se abre con click/pushState, esc/volver lo cierra.
  - Teclado: j/k (o arrows) navegan, Enter abre, o = ir a la fuente,
    esc/q cierra, 1 colapsa.
  - Filtro por medio: <select id=filtro-medio> en .colider; cambia a
    hide/show filas y resetea índice.
  - Lectura vía fetch('/leer/lectura?u=') → render con .lect-vacio
    inicial, h2.lect-titulo, p.lect-resumen, links (son -origen al salto,
    original a la source), párrafos en #lect-parrafos. Maneja error con
    fallback "queda vinculado" + botón ir a la fuente (post-deploy: el botón
    "origen" no desborda, .lect-media lo separa).

## Verificado
- curl local + Playwright (390x844 y 1280x800): 20 rows, overflow=0,
  click abre lector, esc cierra, sin pageerrors.
- /ediciones, /ediciones/2026-09-14 (200), fecha inválida → 404.
- /leer/lectura valida URL (400 si no), titulo+parrafos OK.
- Prod: /health ok, inicio 200, /ediciones 200.

## Aprendido / pendiente
- .gitignore: +reporte/leer_cache/ (los .lectura.json son generados y Vercel
  tiene FS efímero → no versionar).
- reporte/traducciones.json cambió por las traducciones de los 20 items del
  home (se versiona, es canonical).
- Post-deploy: comprobación manual de que el botón "origen" no desborda en el
  overlay chico y que back gesture (popstate) cierra en iOS (solo probado en
  chromium local).
- experiments-ambar: NO se deployó; main es la fuente de verdad now.

Ruta del commit: repo local main 061e033, ramas experiments/experiments-ambar quedan como referencia histórica.