Spec canónica de protocols/session-ipc/version-history.md, copiada sin reescribir.
protocols/session-ipc/version-history.mdPágina generada desde
protocols/session-ipc/version-history.md. No se edita a mano:bun run docs:genla regenera ybun run docs:checkfalla si difiere.
| Version | Fecha | Cambios |
|---|---|---|
| 0x01 | F0.B.1 | Versión inicial. Mensajes: CreateSession, Seek, Cancel, Close. Eventos: SessionCreated, PipelineReady, TransportEndpoint, Progress, Metrics, Error, Closed. Formato: JSON sobre Unix socket. |
| 0x01 | dec-0110 | Aditivo (mismo framing, clientes previos no afectados): MediaEngines, MediaProbe, OpenPackaging, ClosePackaging y sus replies; Error con requestId; Cancel alcanza segmentos de empaquetado HTTP/3 (en cola, produciéndose o enviándose) y gana el campo opcional packagingId (limita la cancelación a esa sesión). |
| 0x01 | SEC-Z01 (2026-09-28) | Aditivo, sin cambio de versión de frame: CreateSession acepta capActor/capResource (binding de capability, dec-0117 I2); mensaje nuevo OpenMoqtSession → OpenMoqtSessionReply; Close revoca las capabilities de la sesión; errores CAPABILITY_BINDING_INVALID/CAPABILITY_BIND_FAILED. Un cliente viejo sigue funcionando en el IPC, pero sus sesiones no son abribles por ningún cliente de media. |
| 0x01 | integración tanda 3 (2026-09-29) | Aditivo: OpenPackaging acepta capActor/capResource y liga el pkg_* en la autoridad (errores CAPABILITY_BINDING_INVALID/CAPABILITY_BIND_FAILED); ClosePackaging lo revoca; /styx/pkg/... exige Authorization: Bearer <sct> del pkg_* (403 genérico). Un cliente viejo sigue en el IPC, pero sus empaquetados no son legibles. |
| 0x02 | dec-0120 (2026-09-30) | Ruptura: el socket habla spire (sobre v2 firmado, handshake mutuo, SO_PEERCRED, policy de BUS_ROUTES); el byte de versión pasa a tipo de frame y 0x01 se rechaza. Subjects cmd.media.*/qry.media.ping con contratos de @styx/api-contracts/bus validados a los dos lados; errores de transporte en el status del sobre y de negocio en error. Fuera: eventos (SessionCreated, TransportEndpoint, PipelineReady, Progress, Metrics, Closed), Subscribe*TransportSignals/CacheMetrics, MediaEngines, MediaProbe (sin consumidor). createSession devuelve fileSize y certHash sin prefijo. Las señales de transporte las publica el daemon en NATS (evt.media.transportSignals). |
| 0x02 | SEC-Z14 (2026-09-30) | Ruptura de contrato (versión 2 de cmd.media.cancel): entra sessionId y el daemon indexa las peticiones por (sessionId, requestId); un Cancel/unregister/Close de una sesión no toca el mismo requestId de otra. Sin sessionId no se cancela ninguna lectura de sesión (el empaquetado sigue con packagingId). |
| 0x02 | SEC-Z07 (2026-09-30) | Ruptura de contrato (versión 2 de cmd.media.createSession y cmd.media.openPackaging; la 1 se rechaza): assetPath sale y entran rootId + relPath (dec-0117 I7). El daemon abre las raíces de STYX_MEDIA_ROOTS (id=/ruta[:ro][:trusted]) como fd de directorio y cada asset fd-relativo bajo la suya; STYX_MEDIA_ROOT desaparece. playback-svc traduce el sourceUri con la misma tabla. El fixture del auto-publisher MoQT de dev pasa a STYX_MEDIA_MOQT_FIXTURE=<rootId>/<relPath>. |
| 0x02 | dec-0121 (2026-09-30) | Aditivo: cmd.media.openIngest → { result: { sessionId: ing_*, endpoint, rootId } }, cmd.media.pollIngestEvents{ackSeq} → { events[] } (hasta 32; entrega al menos una vez), cmd.media.closeIngest → { closed }; errores de negocio INGEST_UNAVAILABLE, INGEST_RESOURCE_MISMATCH, CAPABILITY_*, TOO_MANY_SESSIONS. Sólo playback-svc y styx-ops. Un cliente que no los usa no se ve afectado. |
| 0x02 | dec-0110 ME1 (2026-09-30) | Aditivo: qry.media.probe{assetPath, engine?} → { result: { engine, container, fileSize, durationUs?, streams[≤64] } } o { error } (ASSET_*, MALFORMED_MEDIA, UNSUPPORTED_MEDIA, TOO_MANY_STREAMS, ENGINE_UNAVAILABLE); emisores catalog-svc y styx-ops. Sustituye a cmd.workers.probe (NATS, ffprobe como proceso), retirado. Un cliente que no lo usa no se ve afectado. |
| 0x02 | integración tanda 5 (2026-09-30) | Ruptura de contrato (versión 2 de qry.media.probe; la 1 se rechaza): assetPath sale y entran rootId + relPath como en SEC-Z07 (dec-0117 I7). catalog-svc traduce la ruta que indexa con STYX_MEDIA_ROOTS (@styx/bus resolveMediaAsset, la misma tabla que playback-svc); fuera de toda raíz no pregunta al daemon (CATALOG_INVALID_PATH). |
| 0x02 | dec-0121 wire v2 (2026-10-02) | Ruptura de contrato (versión 2 de cmd.media.pollIngestEvents; la 1 se rechaza): el evento lleva blake3 (raíz BLAKE3 de conduit wire v2, la de b3sum) en lugar de sha256, y key es esa raíz en hex. La ingesta sólo habla wire v2: un create v1 contra el IngestSink recibe 400 protocol_unsupported. Va con la versión 2 de cmd.catalog.registerIngested (NATS), con el mismo cambio. |