272 lines
115 KiB
HTML
272 lines
115 KiB
HTML
<!DOCTYPE html><html lang="es"><head>
|
|
<meta charset="utf-8">
|
|
<meta content="width=device-width, initial-scale=1" name="viewport">
|
|
<title>Vocero S2S — Arquitectura técnica objetivo y plan de implementación</title>
|
|
<style>
|
|
@page { size: A4; margin: 17mm 16mm 18mm; }
|
|
:root { --ink:#18232f; --muted:#52606d; --accent:#0c5f76; --line:#cbd5dc; --pale:#f5f8f9; }
|
|
* { box-sizing:border-box; }
|
|
html { background:#ffffff; }
|
|
body { margin:0; color:var(--ink); background:#ffffff; font-family:Arial, Helvetica, sans-serif; font-size:10.5pt; line-height:1.66; }
|
|
article { max-width:180mm; margin:0 auto; padding:0; }
|
|
.cover { min-height:245mm; display:flex; flex-direction:column; justify-content:center; border-top:8px solid var(--accent); padding:22mm 8mm 18mm; background:#fff; }
|
|
.cover .eyebrow { margin:0 0 14mm; color:var(--accent); letter-spacing:.11em; font-size:9pt; font-weight:700; text-transform:uppercase; }
|
|
.cover h1 { max-width:130mm; margin:0; color:#12212a; font-size:31pt; line-height:1.12; letter-spacing:-.025em; }
|
|
.cover .subtitle { max-width:135mm; margin:7mm 0 18mm; font-size:16pt; line-height:1.35; color:#344a57; }
|
|
.cover .meta { border-top:1px solid var(--line); padding-top:6mm; color:var(--muted); font-size:10pt; }
|
|
.toc { padding:10mm 0 9mm; border-bottom:1px solid var(--line); }
|
|
.toc h2 { margin-top:0; border:0; padding:0; break-before:auto; page-break-before:auto; }
|
|
.toc ol { columns:2; column-gap:13mm; margin:4mm 0 0; padding:0; list-style:none; }
|
|
.toc li { break-inside:avoid; margin:0 0 1.5mm; color:#31434d; font-size:9pt; }
|
|
.toc .toc-level-3 { margin-left:6mm; color:var(--muted); font-size:8.6pt; }
|
|
h1,h2,h3,h4 { color:#163948; line-height:1.24; }
|
|
article > h1 { margin:12mm 0 4mm; font-size:25pt; }
|
|
h2 { margin:13mm 0 5mm; padding-top:2mm; border-top:2px solid var(--accent); font-size:18pt; }
|
|
h2.chapter { break-before:page; page-break-before:always; }
|
|
h3 { margin:8mm 0 3mm; font-size:13pt; }
|
|
h4 { margin:6mm 0 2mm; font-size:11pt; }
|
|
p { margin:0 0 4mm; }
|
|
ul,ol { margin:2mm 0 5mm; padding-left:7mm; }
|
|
li { margin:1.4mm 0; }
|
|
blockquote { margin:5mm 0; padding:4mm 6mm; border-left:3px solid var(--accent); background:var(--pale); color:#2f4652; }
|
|
strong { font-weight:700; }
|
|
code { font-family:"SFMono-Regular",Consolas,"Liberation Mono",monospace; font-size:.88em; color:#153f50; }
|
|
pre.code-block { margin:5mm 0; padding:4.2mm; background:#f4f6f7; border:1px solid var(--line); white-space:pre-wrap; overflow-wrap:anywhere; line-height:1.45; }
|
|
pre.code-block code { color:#1c2932; font-size:8.5pt; }
|
|
.diagram { margin:6mm 0; padding:5mm; border:1px solid var(--line); background:#fff; }
|
|
.diagram .mermaid { margin:0; text-align:center; white-space:pre-wrap; font-family:Arial, Helvetica, sans-serif; }
|
|
table { width:100%; margin:5mm 0 6mm; border-collapse:collapse; font-size:8.6pt; line-height:1.38; table-layout:fixed; }
|
|
th,td { border:1px solid var(--line); padding:2.2mm 2.4mm; vertical-align:top; overflow-wrap:anywhere; }
|
|
th { background:#edf3f5; color:#163948; font-weight:700; text-align:left; }
|
|
tr { break-inside:avoid; page-break-inside:avoid; }
|
|
a { color:#075c77; text-decoration:underline; text-underline-offset:2px; }
|
|
a.inline_marker { display:inline; margin-left:1px; color:#075c77; font-size:.9em; font-weight:700; text-decoration:none; }
|
|
.references { padding-left:7mm; }
|
|
.references li { margin:0 0 3mm; overflow-wrap:anywhere; }
|
|
.keep-together { break-inside:avoid; page-break-inside:avoid; }
|
|
@media print { body { font-size:10pt; } .cover { min-height:245mm; } a { color:#075c77; } }
|
|
|
|
.static-diagram { margin:6mm 0; padding:4mm; border:1px solid var(--line); background:#fff; break-inside:avoid; page-break-inside:avoid; }
|
|
.static-diagram svg { display:block; width:100%; height:auto; }
|
|
.static-diagram .title { fill:#163948; font:700 25px Arial, Helvetica, sans-serif; }
|
|
.static-diagram .zone { fill:#f7fafb; stroke:#7d9aa6; stroke-width:1.5; }
|
|
.static-diagram .zone-label { fill:#0c5f76; font:700 17px Arial, Helvetica, sans-serif; letter-spacing:.06em; }
|
|
.static-diagram .node { fill:#ffffff; stroke:#0c5f76; stroke-width:1.8; }
|
|
.static-diagram .external { fill:#f4f6f7; stroke:#52606d; stroke-width:1.5; }
|
|
.static-diagram .store { fill:#eef5f7; stroke:#0c5f76; stroke-width:1.8; }
|
|
.static-diagram .gpu { fill:#f6f3ea; stroke:#806b2b; stroke-width:1.8; }
|
|
.static-diagram .state { fill:#ffffff; stroke:#0c5f76; stroke-width:1.8; }
|
|
.static-diagram .terminal { fill:#edf3f5; stroke:#52606d; stroke-width:1.5; }
|
|
.static-diagram .node-title { fill:#163948; font:700 15px Arial, Helvetica, sans-serif; text-anchor:middle; }
|
|
.static-diagram .node-sub { fill:#52606d; font:12px Arial, Helvetica, sans-serif; text-anchor:middle; }
|
|
.static-diagram .edge { fill:none; stroke:#52606d; stroke-width:1.5; marker-end:url(#arrow); }
|
|
.static-diagram .edge-dash { fill:none; stroke:#52606d; stroke-width:1.5; stroke-dasharray:5 4; marker-end:url(#arrow); }
|
|
.static-diagram .edge-label { fill:#405561; font:11px Arial, Helvetica, sans-serif; text-anchor:middle; }
|
|
.static-diagram .caption { margin:2mm 0 0; color:var(--muted); font-size:8.5pt; }
|
|
</style>
|
|
|
|
</head><body>
|
|
<article data-cid="4epIWe">
|
|
<header class="cover" data-cid="fCmHc7">
|
|
<p class="eyebrow" data-cid="6GVbUm">Documento de arquitectura técnica</p>
|
|
<h1 data-cid="h4gP5z">Vocero S2S</h1>
|
|
<p class="subtitle" data-cid="MoJwfx">Arquitectura técnica objetivo y plan de implementación</p>
|
|
<p class="meta" data-cid="S4IaaD"><strong data-cid="sw-7bp">Estado:</strong> propuesta para revisión técnica<br data-cid="Dwe3P8"><strong data-cid="TfylEo">Fecha de corte de fuentes:</strong> 20 de julio de 2026<br data-cid="7ql9f_"><strong data-cid="t2Ytff">Ámbito:</strong> plataforma conversacional Speech-to-Speech desacoplada, local y extensible mediante MCP<br data-cid="v5QE9k"><strong data-cid="Yf-vsB">Audiencia:</strong> arquitectura, plataforma, seguridad, MLOps, desarrollo, QA y operación</p>
|
|
</header>
|
|
<div style="break-before: page" class="editor-empty-block" data-cid="ik4QDj"></div>
|
|
<nav aria-label="Tabla de contenidos" class="toc" data-cid="um3tcL"><h2 data-cid="Y6_ljg">Tabla de contenidos</h2><ol data-cid="VKDgaM"><li class="toc-level-2" data-cid="cU0TcH">1. Resumen ejecutivo</li><li class="toc-level-2" data-cid="hdjqdb">2. Alcance</li><li class="toc-level-3" data-cid="52yIAH">2.1 Objetivos</li><li class="toc-level-3" data-cid="0ipum3">2.2 No objetivos</li><li class="toc-level-2" data-cid="7KTF6G">3. Principios de arquitectura</li><li class="toc-level-2" data-cid="8POJYH">4. Vista de contexto y contenedores</li><li class="toc-level-3" data-cid="J9VVak">4.1 Vista lógica por planos</li><li class="toc-level-2" data-cid="OgeweQ">5. Responsabilidades por componente</li><li class="toc-level-2" data-cid="7PDF1o">6. Vista de despliegue</li><li class="toc-level-2" data-cid="YWPrbJ">7. Máquina de estados y gestión de sesión</li><li class="toc-level-3" data-cid="ZPjGAg">7.1 Estados propuestos</li><li class="toc-level-3" data-cid="P0hnY3">7.2 Identificadores</li><li class="toc-level-3" data-cid="cBzJc9">7.3 Estado efectivo de sesión</li><li class="toc-level-2" data-cid="yiCagJ">8. Flujos de ejecución</li><li class="toc-level-3" data-cid="BJst5H">8.1 Flujo nominal conversacional y MCP</li><li class="toc-level-3" data-cid="ZuSMBu">8.2 Tool call con confirmación</li><li class="toc-level-3" data-cid="_0rg9D">8.3 Barge-in</li><li class="toc-level-3" data-cid="QQ11AG">8.4 Errores y degradación</li><li class="toc-level-2" data-cid="XzOI_D">9. Contratos y eventos orientativos</li><li class="toc-level-3" data-cid="8RJA0R">9.1 Envelope común</li><li class="toc-level-3" data-cid="29CYzV">9.2 Catálogo mínimo de eventos</li><li class="toc-level-3" data-cid="7UtGH4">9.3 Ejemplo de session.update_requested</li><li class="toc-level-3" data-cid="1GAQAj">9.4 Ejemplo de intención de tool interna</li><li class="toc-level-3" data-cid="d-Vvxh">9.5 Errores</li><li class="toc-level-3" data-cid="9P6yC3">9.6 Compatibilidad MCP</li><li class="toc-level-2" data-cid="2-VSIl">10. Clonación de voz y gobernanza</li><li class="toc-level-3" data-cid="O_rvLt">10.1 Modelo operativo</li><li class="toc-level-3" data-cid="U0GChX">10.2 Ciclo de vida</li><li class="toc-level-3" data-cid="55E3GA">10.3 Controles</li><li class="toc-level-2" data-cid="0Q0oJ9">11. Seguridad</li><li class="toc-level-3" data-cid="F1m7SS">11.1 Vista de zonas y confianza</li><li class="toc-level-3" data-cid="MgjLQi">11.2 Amenazas principales y mitigaciones</li><li class="toc-level-3" data-cid="7yfzD3">11.3 Autorización de tools</li><li class="toc-level-3" data-cid="vuXPa-">11.4 Datos y retención</li><li class="toc-level-2" data-cid="h-RZHa">12. Observabilidad y SLOs iniciales</li><li class="toc-level-3" data-cid="4Cdu1t">12.1 Modelo de telemetría</li><li class="toc-level-3" data-cid="pwbk7K">12.2 Objetivos iniciales — no son desempeño observado</li><li class="toc-level-3" data-cid="yQDBc_">12.3 Alertas iniciales</li><li class="toc-level-2" data-cid="SVS1lo">13. Escalabilidad, backpressure y resiliencia</li><li class="toc-level-3" data-cid="6cVI8v">13.1 Escalado</li><li class="toc-level-3" data-cid="EUrlwS">13.2 Backpressure</li><li class="toc-level-3" data-cid="LUezOd">13.3 Resiliencia</li><li class="toc-level-2" data-cid="2i_y3_">14. Plan de implementación por fases</li><li class="toc-level-2" data-cid="4KSFWj">15. Estrategia de pruebas</li><li class="toc-level-3" data-cid="VZ6aeA">15.1 Pirámide</li><li class="toc-level-3" data-cid="n10oUv">15.2 Matriz mínima de escenarios</li><li class="toc-level-3" data-cid="reqR5_">15.3 Oráculos y reproducibilidad</li><li class="toc-level-2" data-cid="t2Glb-">16. Matriz de decisiones y ADRs</li><li class="toc-level-2" data-cid="39KXUJ">17. Pendientes y preguntas abiertas</li><li class="toc-level-3" data-cid="wjt9JY">Producto y experiencia</li><li class="toc-level-3" data-cid="RBE8Ss">Identidad y autorización</li><li class="toc-level-3" data-cid="5WyxzW">MCP</li><li class="toc-level-3" data-cid="lXlN8W">Inferencia y capacidad</li><li class="toc-level-3" data-cid="LV4sC2">Voz y legal</li><li class="toc-level-3" data-cid="xcofmG">Operación</li><li class="toc-level-2" data-cid="VuOfs2">18. Riesgos consolidados</li><li class="toc-level-2" data-cid="WXcSS6">19. Criterio de arquitectura lista para piloto</li><li class="toc-level-2" data-cid="2M14FR">20. Fuentes</li><li class="toc-level-2" data-cid="zGXG-p">Apéndice A — Checklist de implementación</li></ol></nav>
|
|
<h1 id="vocero-s2s" data-cid="4Rht77">Vocero S2S</h1>
|
|
<h2 class="chapter" id="arquitectura-técnica-objetivo-y-plan-de-implementación" data-cid="mIMZwY">Arquitectura técnica objetivo y plan de implementación</h2>
|
|
<p data-cid="Ve88hK"><strong data-cid="eKufR0">Estado del documento:</strong> propuesta para revisión técnica<br data-cid="hDRyC_">
|
|
<strong data-cid="_z_4my">Fecha de corte de fuentes:</strong> 20 de julio de 2026<br data-cid="c9VqXb">
|
|
<strong data-cid="WY-A3a">Ámbito:</strong> plataforma conversacional Speech-to-Speech desacoplada, local y extensible mediante MCP<br data-cid="I2MPq1">
|
|
<strong data-cid="oIiGmq">Audiencia:</strong> arquitectura, plataforma, seguridad, MLOps, desarrollo, QA y operación</p>
|
|
<blockquote data-cid="vY1mwR">
|
|
<p data-cid="mDuEqp"><strong data-cid="pj0twH">Convención de trazabilidad</strong></p>
|
|
<ul data-cid="Uthxte">
|
|
<li data-cid="ISqg59"><strong data-cid="4a1odW">[REQ] Requisito proporcionado:</strong> proviene directamente de la descripción de Vocero S2S entregada por el solicitante.</li>
|
|
<li data-cid="mZARVJ"><strong data-cid="WVcJIS">[REC] Decisión recomendada:</strong> propuesta de diseño que debe aprobarse mediante ADR.</li>
|
|
<li data-cid="oNbETv"><strong data-cid="2U5t60">[BENCH] Supuesto pendiente:</strong> hipótesis que requiere medición, prueba de carga, evaluación legal o validación en el entorno objetivo.</li>
|
|
</ul>
|
|
</blockquote>
|
|
<h2 class="chapter" id="1-resumen-ejecutivo" data-cid="VOhVct">1. Resumen ejecutivo</h2>
|
|
<p data-cid="fKCTzj">Vocero S2S se plantea como una plataforma conversacional en tiempo real que separa cuatro responsabilidades: experiencia web, control de sesión, inferencia de voz y lenguaje, e integración empresarial mediante Model Context Protocol (MCP). <strong data-cid="BcetOV">[REQ]</strong> La implementación inicial debe utilizar Parakeet TDT 0.6B para STT/VAD, LLaMA 3.1 8B Instruct para razonamiento y llamadas a herramientas, Qwen3-TTS 12Hz 1.7B Base en FP16 para síntesis y clonación zero-shot, y un nodo NVIDIA GB10 accesible inicialmente por el puerto <code data-cid="Ivz75n">12345</code>.</p>
|
|
<p data-cid="3b9XVE">La arquitectura objetivo conserva esa cadena desacoplada, pero evita convertir la conexión WebSocket en el lugar donde vive toda la lógica. <strong data-cid="TAacjB">[REC]</strong> Se propone un <strong data-cid="Zthalv">Control Plane</strong> en el servidor UI & Relay para autenticación, autorización, perfil del agente, política de voz, orquestación MCP y auditoría; un <strong data-cid="VobP8v">Realtime Data Plane</strong> para audio y eventos con estado de sesión efímero y cancelación prioritaria; y un <strong data-cid="-pgcFe">Inference Plane</strong> local que expone adaptadores versionados para STT, LLM y TTS. La separación permite reemplazar modelos, transporte o infraestructura sin alterar los contratos de negocio.</p>
|
|
<p data-cid="n_qKBQ">Para clientes web, WebRTC ofrece ventajas operativas para media en redes variables, mientras que WebSocket sigue siendo apropiado para enlaces servidor-a-servidor y para la primera versión ya planteada. La documentación de plataformas realtime recomienda WebRTC para browser/media y WebSocket para pipelines de servidor <a class="inline_marker" href="#ref1" data-cid="31iu96">1</a>. <strong data-cid="-kNj2P">[REC]</strong> Por ello, el plan adopta WebSocket como transporte inicial compatible y define WebRTC como evolución controlada, no como prerrequisito del MVP.</p>
|
|
<p data-cid="Ml51Ql">La gestión de interrupciones es una capacidad de primer orden: al detectar habla del usuario durante la respuesta, el sistema debe cancelar la generación todavía reversible, detener el audio, vaciar buffers no reproducidos y truncar el historial a lo efectivamente escuchado. Este patrón está documentado en sistemas realtime mediante cancelación y truncamiento de elementos de conversación <a class="inline_marker" href="#ref2" data-cid="Qnf1_Y">2</a>, y en frameworks de agentes que ajustan el historial al audio efectivamente reproducido <a class="inline_marker" href="#ref3" data-cid="ChS9bn">3</a>.</p>
|
|
<p data-cid="wGP5Cv">MCP se integra mediante un gateway empresarial con política, validación de esquemas, identidad delegada, límites, auditoría y adaptadores de versión. <strong data-cid="FwSFpI">Decisión temporal crítica:</strong> al 20 de julio de 2026, el anuncio de <code data-cid="Lbt2Jo">2026-07-28</code> describe explícitamente un <strong data-cid="GrxmVR">Release Candidate</strong> cuyo estándar final se espera para el 28 de julio de 2026 y contiene cambios incompatibles <a class="inline_marker" href="#ref4" data-cid="pbYf-Q">4</a>. Por lo tanto:</p>
|
|
<ol data-cid="p9nVOY">
|
|
<li data-cid="3T2A8U"><strong data-cid="ano7RF">[REC]</strong> la versión estable de compatibilidad inicial será <code data-cid="moxL7t">2025-11-25</code>, verificada en la documentación oficial de transportes <a class="inline_marker" href="#ref5" data-cid="IJJ3i8">5</a>; esta decisión responde al corte temporal solicitado y no contradice la dirección técnica stateless propuesta por el RC;</li>
|
|
<li data-cid="l9zTAu"><strong data-cid="LeHSA5">[REC]</strong> <code data-cid="BbPNed">2026-07-28</code> se implementará sólo detrás de un adaptador experimental y feature flag;</li>
|
|
<li data-cid="l1bxtp"><strong data-cid="Js5NXi">[REC]</strong> el diseño del dominio se mantendrá preparado para el modelo stateless del RC: requests autocontenidos, estado de aplicación mediante handles explícitos y routing desacoplado de afinidad;</li>
|
|
<li data-cid="0-r7RQ"><strong data-cid="jIa34f">[REC]</strong> su promoción exigirá ratificación oficial, pruebas de conformidad y migración aprobada;</li>
|
|
<li data-cid="qgFQCC">no se asumirá como estándar final en este documento.</li>
|
|
</ol>
|
|
<p data-cid="PNN7vI">Finalmente, la capacidad real de ejecutar STT, LLM y TTS concurrentemente en un único GB10 no está demostrada por un benchmark de la cadena completa. <strong data-cid="iQ81eX">[BENCH]</strong> La primera salida de ingeniería debe ser un arnés reproducible que mida latencia extremo a extremo, memoria, ancho de banda, degradación bajo concurrencia, precisión de interrupción y calidad de clonación antes de comprometer capacidad o SLO contractual.</p>
|
|
<h2 class="chapter" id="2-alcance" data-cid="dUQi3s">2. Alcance</h2>
|
|
<h3 id="21-objetivos" data-cid="fSPqkg">2.1 Objetivos</h3>
|
|
<ul data-cid="5uScCQ">
|
|
<li data-cid="BZzyBW"><strong data-cid="Auo5LW">[REQ]</strong> Entregar conversación de voz bidireccional y de baja latencia desde un navegador.</li><li data-cid="f1-FNq"><strong data-cid="6DQkO6">[REQ]</strong> Identificar al usuario mediante la API de cliente y personalizar la sesión según identidad o rol.</li><li data-cid="jmrXyK"><strong data-cid="1mUIIz">[REQ]</strong> Cargar dinámicamente el perfil del agente, instrucciones, reglas y herramientas.</li><li data-cid="hbNyBh"><strong data-cid="pd6yrb">[REQ]</strong> Preservar una voz clonada corporativa frente a parámetros por defecto enviados por el cliente.</li><li data-cid="109qZh"><strong data-cid="hNUJjH">[REQ]</strong> Ejecutar STT, razonamiento, llamadas a herramientas y TTS en una cadena desacoplada.</li><li data-cid="HUYdKW"><strong data-cid="Wj5og8">[REQ]</strong> Integrar sistemas empresariales sin modificar el núcleo mediante un gateway MCP.</li><li data-cid="2iztAL"><strong data-cid="gkCvFk">[REC]</strong> Incorporar barge-in, cancelación, backpressure, timeouts, aislamiento, trazabilidad y recuperación de fallas como capacidades del núcleo.</li><li data-cid="a32o56"><strong data-cid="jt7y9s">[REC]</strong> Mantener contratos versionados que permitan sustituir transporte, modelos, runtimes y servidores MCP.</li><li data-cid="_JBWjn"><strong data-cid="-svA8j">[REC]</strong> Proporcionar evidencia operativa para dimensionamiento, SLOs y auditoría.</li>
|
|
</ul>
|
|
<h3 id="22-no-objetivos" data-cid="dqRHZ8">2.2 No objetivos</h3>
|
|
<ul data-cid="J6VGF4"><li data-cid="-wK4u-">Entrenar desde cero los modelos STT, LLM o TTS.</li><li data-cid="oD-sS4">Reemplazar ERP, CRM, catálogos u otros sistemas de registro.</li><li data-cid="kWwP9h">Permitir ejecución directa del LLM contra bases de datos o APIs sin gateway y política.</li><li data-cid="b5CmF9">Convertir el navegador en depositario de credenciales empresariales o material de voz maestro.</li><li data-cid="l9vXzf">Garantizar capacidad, latencia o concurrencia antes del benchmark en GB10.</li><li data-cid="5xgX-z">Declarar la versión MCP <code data-cid="P09U1Z">2026-07-28</code> como estándar final antes de su ratificación.</li><li data-cid="c0E4Kt">Diseñar en esta etapa un contact center completo, grabación regulatoria universal o telefonía SIP; pueden añadirse como dominios posteriores.</li></ul>
|
|
<h2 class="chapter" id="3-principios-de-arquitectura" data-cid="YPGBAM">3. Principios de arquitectura</h2>
|
|
<ol data-cid="2BIgdu"><li data-cid="kFb5yH"><strong data-cid="Jh7ZWr">Control y media separados.</strong> El audio tiene requisitos de tiempo real; identidad, política y auditoría requieren consistencia y trazabilidad.</li><li data-cid="vqrmCW"><strong data-cid="sXkbum">Contratos antes que implementaciones.</strong> Cada frontera publica eventos y esquemas versionados; los modelos quedan detrás de adaptadores.</li><li data-cid="pubtHD"><strong data-cid="VP4USS">Interrupción prioritaria.</strong> Cancelar y detener audio tiene precedencia sobre generar más contenido.</li><li data-cid="eU_ZND"><strong data-cid="tyhKGx">Estado explícito y con dueño.</strong> La sesión conversacional pertenece a Vocero; el estado MCP pertenece al adaptador de protocolo o a handles explícitos.</li><li data-cid="5ExqGq"><strong data-cid="ubVqUf">Zero trust entre planos.</strong> Cada salto autentica servicio, autoriza acción, limita alcance y propaga identidad auditada.</li><li data-cid="qx13Y8"><strong data-cid="1pd_8o">Mínimo privilegio para herramientas.</strong> Una tool sólo recibe los argumentos, identidad y scopes estrictamente necesarios.</li><li data-cid="PzhfDg"><strong data-cid="-ryTLr">Privacidad por defecto.</strong> Audio, transcripciones, prompts, respuestas y voces son datos sensibles; la retención es explícita y minimizada.</li><li data-cid="Ip6B7I"><strong data-cid="6aHB7j">Fallar de forma conversacional.</strong> Los fallos técnicos se traducen en eventos deterministas y respuestas seguras, sin filtrar detalles internos.</li><li data-cid="mz1Tek"><strong data-cid="iIGMLI">Medir antes de prometer.</strong> La experiencia se gobierna por latencia de etapa y percentiles, no por promedios aislados.</li><li data-cid="_nXzu9"><strong data-cid="rMB76U">Compatibilidad MCP versionada.</strong> El gateway negocia una versión estable y encapsula candidatos futuros.</li></ol>
|
|
<h2 class="chapter" id="4-vista-de-contexto-y-contenedores" data-cid="acfezF">4. Vista de contexto y contenedores</h2>
|
|
<figure aria-label="Vista C4 de contenedores" class="static-diagram" data-cid="7N-DCC"><svg role="img" viewBox="0 0 1400 1230" xmlns="http://www.w3.org/2000/svg" data-cid="bMoGPc"><defs data-cid="1UBflj"><marker id="arrow" markerHeight="9" markerWidth="9" orient="auto" refX="7" refY="4.5" data-cid="9236lq"><path d="M0,0 L9,4.5 L0,9 z" fill="#52606d" data-cid="bSVw1a"></path></marker></defs>
|
|
<text class="title" text-anchor="middle" x="700" y="32" data-cid="CEDbB1">Vocero S2S — Vista C4 de contenedores</text>
|
|
<rect class="zone" height="1020" rx="12" width="880" x="260" y="85" data-cid="ORv8ev"></rect><text class="zone-label" x="285" y="115" data-cid="KsS6KP">VOCERO S2S</text>
|
|
<rect class="external" height="78" rx="7" width="190" x="25" y="190" data-cid="xc6mrg"></rect><text class="node-title" x="120.0" y="214" data-cid="pAurew">Usuario</text><text class="node-sub" x="120.0" y="235" data-cid="c1b0zR">Habla desde navegador</text><rect class="external" height="78" rx="7" width="190" x="25" y="375" data-cid="tUySm7"></rect><text class="node-title" x="120.0" y="399" data-cid="qP3RGI">Identidad / API cliente</text><text class="node-sub" x="120.0" y="420" data-cid="BJ9avw">Usuario, roles y atributos</text><rect class="external" height="86" rx="7" width="190" x="25" y="555" data-cid="7t9OP9"></rect><text class="node-title" x="120.0" y="579" data-cid="dDAfPD">Servicio de perfiles</text><text class="node-sub" x="120.0" y="600" data-cid="-IMNzi">Instrucciones, reglas, tools</text><text class="node-sub" x="120.0" y="615" data-cid="iO4QoW">y política de voz</text><rect class="external" height="86" rx="7" width="190" x="1185" y="365" data-cid="6WbV3j"></rect><text class="node-title" x="1280.0" y="389" data-cid="Wl4Blu">Sistemas empresariales</text><text class="node-sub" x="1280.0" y="410" data-cid="eLGclC">ERP, CRM, catálogos,</text><text class="node-sub" x="1280.0" y="425" data-cid="YJjizj">reportes y workflows</text><rect class="external" height="86" rx="7" width="190" x="1185" y="845" data-cid="bxX-Wt"></rect><text class="node-title" x="1280.0" y="869" data-cid="XnXQmL">Observabilidad</text><text class="node-sub" x="1280.0" y="890" data-cid="w4Lobk">Métricas, logs, traces</text><text class="node-sub" x="1280.0" y="905" data-cid="_PYNdM">y alertas</text><rect class="node" height="78" rx="7" width="200" x="295" y="170" data-cid="ckifr4"></rect><text class="node-title" x="395.0" y="194" data-cid="GZEs_d">Cliente Web</text><text class="node-sub" x="395.0" y="215" data-cid="N9sLs3">Web Audio + WS/WebRTC</text><rect class="node" height="78" rx="7" width="200" x="530" y="170" data-cid="GA7C6G"></rect><text class="node-title" x="630.0" y="194" data-cid="JJuDtq">Edge / Terminación</text><text class="node-sub" x="630.0" y="215" data-cid="0I06SZ">TLS, conexión, rate limit</text><rect class="node" height="78" rx="7" width="200" x="765" y="170" data-cid="dLABce"></rect><text class="node-title" x="865.0" y="194" data-cid="XEeZM6">Realtime Relay</text><text class="node-sub" x="865.0" y="215" data-cid="lPUh8a">Audio/eventos, sanitización</text><rect class="node" height="88" rx="7" width="200" x="530" y="345" data-cid="1vF9w6"></rect><text class="node-title" x="630.0" y="369" data-cid="veMb6d">Session Orchestrator</text><text class="node-sub" x="630.0" y="390" data-cid="yNMhqR">Estados, turnos, perfil</text><text class="node-sub" x="630.0" y="405" data-cid="365lG3">y política</text><rect class="node" height="88" rx="7" width="200" x="765" y="345" data-cid="PZRGQk"></rect><text class="node-title" x="865.0" y="369" data-cid="SHkkB-">MCP Gateway</text><text class="node-sub" x="865.0" y="390" data-cid="3GCGHh">Cliente MCP + policy</text><text class="node-sub" x="865.0" y="405" data-cid="qznGmy">enforcement</text><rect class="store" height="78" rx="7" width="200" x="530" y="525" data-cid="ghjHsd"></rect><text class="node-title" x="630.0" y="549" data-cid="lLCUA9">Session Store</text><text class="node-sub" x="630.0" y="570" data-cid="CjxJy0">KV con TTL</text><rect class="store" height="78" rx="7" width="200" x="765" y="525" data-cid="yvfvsh"></rect><text class="node-title" x="865.0" y="549" data-cid="xABU8g">Audit Store</text><text class="node-sub" x="865.0" y="570" data-cid="-CswDJ">Almacén inmutable</text><rect class="node" height="88" rx="7" width="200" x="530" y="705" data-cid="rw0JkO"></rect><text class="node-title" x="630.0" y="729" data-cid="Y-V_xg">Inference Gateway</text><text class="node-sub" x="630.0" y="750" data-cid="OYoy4_">API realtime interna</text><text class="node-sub" x="630.0" y="765" data-cid="3tqLmI">STT, LLM y TTS</text><rect class="gpu" height="75" rx="7" width="190" x="295" y="875" data-cid="2HqcBT"></rect><text class="node-title" x="390.0" y="899" data-cid="NIMM0q">Parakeet TDT 0.6B</text><text class="node-sub" x="390.0" y="920" data-cid="MOp10j">NeMo / GPU</text><rect class="gpu" height="75" rx="7" width="190" x="515" y="875" data-cid="aZJeex"></rect><text class="node-title" x="610.0" y="899" data-cid="SnOkQ3">LLaMA 3.1 8B</text><text class="node-sub" x="610.0" y="920" data-cid="TF7rXP">Runtime local</text><rect class="gpu" height="75" rx="7" width="190" x="735" y="875" data-cid="mUA5fg"></rect><text class="node-title" x="830.0" y="899" data-cid="w4fan3">Qwen3-TTS 1.7B</text><text class="node-sub" x="830.0" y="920" data-cid="zn2AVm">FP16 / GPU</text><rect class="store" height="75" rx="7" width="165" x="955" y="875" data-cid="ywXT7R"></rect><text class="node-title" x="1037.5" y="899" data-cid="z6Gilb">Voice Vault</text><text class="node-sub" x="1037.5" y="920" data-cid="pqPci4">Referencias autorizadas</text><path class="edge" d="M215 229 H295" data-cid="0mcWH8"></path><text class="edge-label" x="255" y="214" data-cid="xr7Fzd">Audio, controles y confirmaciones</text><path class="edge" d="M495 209 H530" data-cid="v0Vkwf"></path><text class="edge-label" x="512" y="194" data-cid="eNp6bY">Media y eventos · TLS</text><path class="edge" d="M730 209 H765" data-cid="Zc-oPK"></path><text class="edge-label" x="747" y="194" data-cid="7WvqpA">Stream autenticado</text><path class="edge" d="M865 248 V345" data-cid="td_hjy"></path><text class="edge-label" x="895" y="305" data-cid="U8e_Qw">Eventos de sesión</text><path class="edge" d="M530 389 H215 V414" data-cid="VHLxeJ"></path><text class="edge-label" x="370" y="370" data-cid="RNHCux">Resuelve identidad · HTTPS</text><path class="edge" d="M530 405 H215 V598" data-cid="5oDKsX"></path><text class="edge-label" x="370" y="578" data-cid="Yi1hrb">Carga perfil y políticas · HTTPS</text><path class="edge" d="M630 433 V525" data-cid="wd0AJG"></path><text class="edge-label" x="675" y="490" data-cid="DGjbI_">Lee/escribe estado efímero</text><path class="edge" d="M730 389 H765" data-cid="0FoTUs"></path><text class="edge-label" x="748" y="373" data-cid="Gd0hTb">Tool intent + contexto delegado · mTLS</text><path class="edge" d="M630 433 V705" data-cid="07flbE"></path><text class="edge-label" x="690" y="645" data-cid="TVERQA">Comandos y eventos de inferencia · mTLS</text><path class="edge" d="M630 793 V875" data-cid="UhDHYl"></path><text class="edge-label" x="665" y="845" data-cid="rCqP4q">Chunks de audio</text><path class="edge" d="M730 749 V875" data-cid="DZWXMs"></path><text class="edge-label" x="762" y="825" data-cid="gW2-uq">Contexto y tokens</text><path class="edge" d="M730 770 H830 V875" data-cid="FKk8xX"></path><text class="edge-label" x="855" y="845" data-cid="bm8X2b">Texto y voice_profile_ref</text><path class="edge" d="M925 912 H955" data-cid="OV8rqa"></path><text class="edge-label" x="940" y="897" data-cid="WC1kTL">Lee referencia autorizada</text><path class="edge" d="M965 389 H1185" data-cid="t2A68c"></path><text class="edge-label" x="1075" y="373" data-cid="mLGlrt">MCP/HTTPS versionado</text><path class="edge" d="M765 433 V525" data-cid="H55xYI"></path><text class="edge-label" x="845" y="490" data-cid="L5nJ7C">Ejecuciones y decisiones</text><path class="edge" d="M730 389 H765 V525" data-cid="ubLurZ"></path><text class="edge-label" x="782" y="475" data-cid="XsKDuu">Eventos de auditoría</text><path class="edge" d="M730 205 H1185 V880" data-cid="FA5pOH"></path><text class="edge-label" x="1040" y="190" data-cid="UvAbQi">Telemetría</text><path class="edge" d="M630 433 H1185 V880" data-cid="-Zqtqa"></path><text class="edge-label" x="1010" y="420" data-cid="sYYFxG">Telemetría</text><path class="edge" d="M630 705 H1185 V890" data-cid="HeuwHi"></path><text class="edge-label" x="1005" y="690" data-cid="zfpjeR">Telemetría GPU/modelos</text></svg><figcaption class="caption" data-cid="9IoG_x">Representación vectorial estática de la vista C4 contenida en la versión v2.</figcaption></figure>
|
|
<h3 id="41-vista-lógica-por-planos" data-cid="bjFTuU">4.1 Vista lógica por planos</h3>
|
|
<p data-cid="ivNYuo"><strong data-cid="9OdTp6">Experience Plane</strong></p><ul data-cid="0-evtJ"><li data-cid="oDcahu">Cliente web, captura de micrófono, cancelación de eco, reproducción y controles de consentimiento.</li><li data-cid="00IJ-r">Mantiene sólo estado visual y cursores necesarios; no conserva secretos ni voz maestra.</li></ul>
|
|
<p data-cid="j0Ehlp"><strong data-cid="8DOBp_">Realtime Data Plane</strong></p><ul data-cid="wG8UM-"><li data-cid="fG9jxC">Terminación de WebSocket o WebRTC, relay de media y multiplexación de eventos.</li><li data-cid="7kcGkL">Impone límites de buffer, secuencia y tamaño; descarta datos obsoletos al cambiar de generación.</li><li data-cid="f1J7ei">Separa una cola de control de alta prioridad —<code data-cid="eDAJxE">cancel</code>, <code data-cid="1U6ptc">barge_in</code>, <code data-cid="mniP-2">close</code>— de la cola de audio/datos.</li></ul>
|
|
<p data-cid="dZJP89"><strong data-cid="Og5vUw">Conversation Control Plane</strong></p><ul data-cid="fMvhjd"><li data-cid="r9jLKt">Resuelve identidad, perfil, permisos y configuración efectiva.</li><li data-cid="xc389G">Mantiene la máquina de estados de sesión y turno.</li><li data-cid="A1vmR9">Construye contexto, coordina inferencia y decide si una tool puede ejecutarse, confirmarse o rechazarse.</li></ul>
|
|
<p data-cid="j-Jyy3"><strong data-cid="57Pcle">Inference Plane</strong></p><ul data-cid="8w2Qjp"><li data-cid="B-9WGa">Oculta detalles de runtime y expone capacidades uniformes: <code data-cid="NdfAlc">transcribe</code>, <code data-cid="lmR8Yo">generate</code>, <code data-cid="i7DbdW">synthesize</code>, <code data-cid="IB4h_z">cancel</code>, <code data-cid="T7fbBs">health</code>, <code data-cid="0j_ZSY">capacity</code>.</li><li data-cid="gMQUQw">Correlaciona cada salida con <code data-cid="qKSIqy">session_id</code>, <code data-cid="2up0Ge">turn_id</code> y <code data-cid="MRDvHy">generation_id</code> para descartar respuestas tardías.</li></ul>
|
|
<p data-cid="7AM-7u"><strong data-cid="m6sQ2s">Enterprise Integration Plane</strong></p><ul data-cid="8UN2Bn"><li data-cid="Q2XSaj">Gateway MCP con adaptadores de versión, allowlists, validación, autorización, secretos de servicio, idempotencia y auditoría.</li><li data-cid="TTghSa">Ninguna respuesta de tool se incorpora al contexto sin controles de tamaño, clasificación y sanitización.</li></ul>
|
|
<h2 class="chapter" id="5-responsabilidades-por-componente" data-cid="2_zamP">5. Responsabilidades por componente</h2>
|
|
<div class="sk-doc-native-table-frame" data-scroll-left-active="false" data-scroll-right-active="false" data-scrolling="false" data-cid="k8XI__"><table data-cid="0GBXr5"><thead data-cid="5-Da7k"><tr data-cid="N1f_QZ"><th data-cid="gyW-Lh">Componente</th><th data-cid="464jl1">Responsabilidades</th><th data-cid="QaF30B">No debe hacer</th></tr></thead><tbody data-cid="9ZXSi0"><tr data-cid="xImSvz"><td data-cid="8GBoDc">Cliente web</td><td data-cid="dnegF1">Capturar/reproducir audio; AEC/NS/AGC cuando corresponda; mostrar estado; enviar confirmaciones; reportar progreso de playout</td><td data-cid="u1lGHx">Autorizar tools; almacenar secretos; decidir la voz efectiva</td></tr><tr data-cid="1zKfjx"><td data-cid="6JB5f1">Edge realtime</td><td data-cid="vwnT5W">TLS; autenticación de conexión; límites; routing; protección DoS; upgrade WS o terminación WebRTC</td><td data-cid="SwhTVa">Interpretar prompts o argumentos MCP</td></tr><tr data-cid="ebGI1E"><td data-cid="HlirZd">Realtime Relay</td><td data-cid="kowfv0">Multiplexar audio/eventos; ordenar secuencias; backpressure; sanitizar <code data-cid="qOWuAr">session.update</code>; priorizar interrupciones</td><td data-cid="2WzrJu">Mantener lógica de negocio o credenciales downstream</td></tr><tr data-cid="9wk5vQ"><td data-cid="-d5eI7">Session Orchestrator</td><td data-cid="e4ds7L">Máquina de estados; identidad; perfil; contexto; turnos; cancelación; degradación; correlación</td><td data-cid="upUcbU">Ejecutar SQL, ERP o APIs directamente</td></tr><tr data-cid="nOBvkX"><td data-cid="hxsKKO">Policy Engine</td><td data-cid="QE9EVf">Evaluar identidad, rol, tool, riesgo, ámbito, consentimiento y política de datos</td><td data-cid="XpW_FE">Reescribir silenciosamente argumentos de negocio sin registro</td></tr><tr data-cid="52sq8a"><td data-cid="ybXSZ3">MCP Gateway</td><td data-cid="RWV44P">Negociar versión; descubrir tools; validar JSON Schema; delegar identidad; aplicar timeout/retry; auditar</td><td data-cid="zwzQW8">Exponer credenciales al LLM o navegador</td></tr><tr data-cid="RLBYC3"><td data-cid="x2dWUN">Inference Gateway</td><td data-cid="Bm3t21">Admitir/cancelar trabajos; adaptar protocolos; medir etapas; health/capacity</td><td data-cid="kA5DJf">Decidir permisos empresariales</td></tr><tr data-cid="qb8eMV"><td data-cid="KJflBq">STT/VAD</td><td data-cid="rmA4EP">Emitir parciales/finales y señales de habla con timestamps</td><td data-cid="XKUo_s">Persistir audio indefinidamente</td></tr><tr data-cid="LBAiLI"><td data-cid="5DSCRP">LLM</td><td data-cid="X6boPR">Generar texto estructurado o intención de tool dentro de schemas permitidos</td><td data-cid="AoU4Tj">Considerarse autoridad para ejecutar acciones</td></tr><tr data-cid="cfTjSv"><td data-cid="NUuL2w">TTS</td><td data-cid="97B11p">Sintetizar stream asociado a una generación y perfil de voz autorizado</td><td data-cid="W98g4z">Aceptar <code data-cid="IcHjbe">ref_audio</code> arbitrario del cliente</td></tr><tr data-cid="76Ow5j"><td data-cid="hPezZP">Voice Vault</td><td data-cid="F0mG-Q">Versionar, cifrar y gobernar referencias de voz y consentimientos</td><td data-cid="Gs2jrA">Servir archivos sin autorización por servicio y tenant</td></tr><tr data-cid="VhXdi0"><td data-cid="kwkb1_">Stores</td><td data-cid="qER4h_">Estado efímero con TTL, auditoría inmutable y configuración versionada</td><td data-cid="RcOUtN">Mezclar PII operacional con telemetría no restringida</td></tr><tr data-cid="TDbZt_"><td data-cid="BDx_63">Observabilidad</td><td data-cid="gJT3XQ">Métricas, logs estructurados, traces, alertas y tableros</td><td data-cid="FGqBYh">Registrar audio, tokens o argumentos sensibles por defecto</td></tr></tbody></table></div>
|
|
<h2 class="chapter" id="6-vista-de-despliegue" data-cid="UGMd_n">6. Vista de despliegue</h2>
|
|
<figure aria-label="Vista de despliegue" class="static-diagram" data-cid="E-FkWs"><svg role="img" viewBox="0 0 1400 1190" xmlns="http://www.w3.org/2000/svg" data-cid="nXQ8FN"><defs data-cid="INZgwt"><marker id="arrow" markerHeight="9" markerWidth="9" orient="auto" refX="7" refY="4.5" data-cid="QMYDXj"><path d="M0,0 L9,4.5 L0,9 z" fill="#52606d" data-cid="J4vcpb"></path></marker></defs><text class="title" text-anchor="middle" x="700" y="32" data-cid="D3RGEZ">Vocero S2S — Vista de despliegue</text>
|
|
<rect class="zone" height="122" rx="10" width="1320" x="40" y="70" data-cid="4Zibkm"></rect><text class="zone-label" x="60" y="98" data-cid="8OZWFv">ZONA PÚBLICA</text>
|
|
<rect class="zone" height="138" rx="10" width="1320" x="40" y="220" data-cid="32L8rc"></rect><text class="zone-label" x="60" y="248" data-cid="6DdXis">DMZ / EDGE</text>
|
|
<rect class="zone" height="395" rx="10" width="820" x="40" y="388" data-cid="yLXjyd"></rect><text class="zone-label" x="60" y="416" data-cid="VqXWhE">RED DE APLICACIONES</text>
|
|
<rect class="zone" height="395" rx="10" width="470" x="890" y="388" data-cid="Dqv6qO"></rect><text class="zone-label" x="910" y="416" data-cid="icLA0n">SEGMENTO DE INFERENCIA RESTRINGIDO</text>
|
|
<rect class="zone" height="180" rx="10" width="820" x="40" y="814" data-cid="VOfnxV"></rect><text class="zone-label" x="60" y="842" data-cid="FoQAj_">RED EMPRESARIAL</text>
|
|
<rect class="zone" height="180" rx="10" width="470" x="890" y="814" data-cid="iPTIT5"></rect><text class="zone-label" x="910" y="842" data-cid="btB4Xl">OPERACIONES</text><rect class="node" height="55" rx="7" width="200" x="600" y="105" data-cid="GIqIww"></rect><text class="node-title" x="700.0" y="129" data-cid="ZtnWqF">Navegador</text><rect class="node" height="58" rx="7" width="210" x="300" y="268" data-cid="GghPGo"></rect><text class="node-title" x="405.0" y="292" data-cid="Ydg66Y">WAF + Reverse Proxy</text><rect class="external" height="58" rx="7" width="210" x="820" y="268" data-cid="9EItKx"></rect><text class="node-title" x="925.0" y="292" data-cid="yJHi6m">TURN/SFU opcional</text><text class="node-sub" x="925.0" y="313" data-cid="Thnm2B">Evolución WebRTC</text><rect class="node" height="60" rx="7" width="160" x="85" y="455" data-cid="TJqZc3"></rect><text class="node-title" x="165.0" y="479" data-cid="uJ_I6G">Realtime Relay A</text><rect class="node" height="60" rx="7" width="160" x="85" y="550" data-cid="wpy0-c"></rect><text class="node-title" x="165.0" y="574" data-cid="9GlTWK">Realtime Relay B</text><rect class="node" height="60" rx="7" width="170" x="290" y="455" data-cid="KFa3BR"></rect><text class="node-title" x="375.0" y="479" data-cid="JS6Uhk">Session Orchestrator A</text><rect class="node" height="60" rx="7" width="170" x="290" y="550" data-cid="mrMdj8"></rect><text class="node-title" x="375.0" y="574" data-cid="CYPBvF">Session Orchestrator B</text><rect class="node" height="60" rx="7" width="150" x="510" y="455" data-cid="2nHYwS"></rect><text class="node-title" x="585.0" y="479" data-cid="Jj1djF">Policy Engine</text><rect class="node" height="60" rx="7" width="150" x="510" y="550" data-cid="ALAgel"></rect><text class="node-title" x="585.0" y="574" data-cid="SPd46n">MCP Gateway</text><rect class="store" height="60" rx="7" width="120" x="705" y="455" data-cid="j2TZ6i"></rect><text class="node-title" x="765.0" y="479" data-cid="zfODRV">Session Store</text><text class="node-sub" x="765.0" y="500" data-cid="ej8ehj">TTL</text><rect class="store" height="60" rx="7" width="120" x="705" y="550" data-cid="deU58h"></rect><text class="node-title" x="765.0" y="574" data-cid="h2xw6Q">Audit Store</text><rect class="node" height="65" rx="7" width="190" x="960" y="455" data-cid="GD2WvR"></rect><text class="node-title" x="1055.0" y="479" data-cid="1ab6fs">Inference Gateway</text><text class="node-sub" x="1055.0" y="500" data-cid="51kE3a">Puerto interno 12345</text><rect class="gpu" height="58" rx="7" width="120" x="930" y="580" data-cid="xhyRyb"></rect><text class="node-title" x="990.0" y="604" data-cid="_vC7wc">Parakeet STT/VAD</text><rect class="gpu" height="58" rx="7" width="120" x="1060" y="580" data-cid="1Qw6ag"></rect><text class="node-title" x="1120.0" y="604" data-cid="hGQ1vN">LLaMA 3.1 8B</text><rect class="gpu" height="58" rx="7" width="125" x="1190" y="580" data-cid="6HZ-LQ"></rect><text class="node-title" x="1252.5" y="604" data-cid="d2LOt-">Qwen3-TTS 1.7B</text><text class="node-sub" x="1252.5" y="625" data-cid="zJ28mf">FP16</text><rect class="store" height="55" rx="7" width="125" x="1190" y="675" data-cid="b3ykH_"></rect><text class="node-title" x="1252.5" y="699" data-cid="tM9UQR">Voice Vault</text><text class="node-sub" x="1252.5" y="720" data-cid="JorC6v">caché cifrada</text><rect class="gpu" height="55" rx="7" width="205" x="940" y="675" data-cid="EhoPN8"></rect><text class="node-title" x="1042.5" y="699" data-cid="xEMJpP">NVIDIA GB10</text><rect class="external" height="60" rx="7" width="190" x="105" y="875" data-cid="s4Ftcy"></rect><text class="node-title" x="200.0" y="899" data-cid="b3V-fg">Auth + Agent Profile APIs</text><rect class="external" height="60" rx="7" width="190" x="355" y="875" data-cid="FFyrSW"></rect><text class="node-title" x="450.0" y="899" data-cid="VxqvQ_">MCP Servers / Adaptadores</text><rect class="external" height="60" rx="7" width="190" x="605" y="875" data-cid="Fi1Dpx"></rect><text class="node-title" x="700.0" y="899" data-cid="37cq99">ERP / CRM / Datos / Workflows</text><rect class="node" height="60" rx="7" width="130" x="920" y="875" data-cid="KgmwqW"></rect><text class="node-title" x="985.0" y="899" data-cid="tUVyye">OTel Collector</text><rect class="external" height="60" rx="7" width="150" x="1080" y="875" data-cid="oDwR37"></rect><text class="node-title" x="1155.0" y="899" data-cid="G590hO">Metrics / Logs / Traces / Alertas</text><rect class="store" height="60" rx="7" width="100" x="1240" y="875" data-cid="ZtB_rO"></rect><text class="node-title" x="1290.0" y="899" data-cid="JY3CFt">Secrets + KMS</text><path class="edge" d="M700 160 V268 H510" data-cid="Invvcy"></path><text class="edge-label" x="590" y="210" data-cid="lR-j_J">TLS WS inicial</text><path class="edge-dash" d="M700 160 V268 H820" data-cid="jGhPA-"></path><text class="edge-label" x="770" y="210" data-cid="zmQTZv">WebRTC futuro</text><path class="edge" d="M405 326 V455 H245" data-cid="EOQc5j"></path><path class="edge" d="M405 326 V550 H245" data-cid="-rhtVI"></path><path class="edge-dash" d="M925 326 V455 H245" data-cid="GzOfhn"></path><text class="edge-label" x="720" y="342" data-cid="f_PgDz">WebRTC futuro</text><path class="edge" d="M245 485 H290" data-cid="zGM6c2"></path><path class="edge" d="M245 580 H290" data-cid="1_BTEt"></path><path class="edge" d="M460 485 H510" data-cid="C3o0Yo"></path><path class="edge" d="M460 580 H510" data-cid="ybGQxf"></path><path class="edge" d="M460 485 H705" data-cid="tTFjpm"></path><path class="edge" d="M460 580 H705" data-cid="OI-FtL"></path><path class="edge" d="M460 485 H960" data-cid="Xp0ULD"></path><text class="edge-label" x="700" y="470" data-cid="a3B7Be">mTLS realtime</text><path class="edge" d="M460 580 H960" data-cid="C0iAj-"></path><text class="edge-label" x="700" y="600" data-cid="6wcx9_">mTLS realtime</text><path class="edge" d="M1055 520 V580 H990" data-cid="DHJeJL"></path><path class="edge" d="M1055 520 V580 H1120" data-cid="osBGlQ"></path><path class="edge" d="M1055 520 V580 H1250" data-cid="Wzk8bo"></path><path class="edge" d="M1250 638 V675" data-cid="n0KL9V"></path><path class="edge" d="M460 485 V875 H295" data-cid="bSAKZy"></path><path class="edge" d="M460 580 V875 H295" data-cid="zrO_Zh"></path><path class="edge" d="M660 580 V875" data-cid="Je7Jc4"></path><path class="edge" d="M545 905 H605" data-cid="XHvzWp"></path><path class="edge" d="M660 485 H705 V580" data-cid="IiAD2a"></path><path class="edge" d="M660 580 H705" data-cid="thsFcE"></path><path class="edge" d="M245 485 V875 H920" data-cid="B87Z-f"></path><path class="edge" d="M460 485 V875 H920" data-cid="vPptbj"></path><path class="edge" d="M660 580 V875 H920" data-cid="Lzp7Vx"></path><path class="edge" d="M1050 905 H1080" data-cid="o-UJ4L"></path><path class="edge" d="M1290 875 V610 H1250" data-cid="LRBA69"></path><path class="edge" d="M1290 875 V520 H1150" data-cid="gBa_PX"></path></svg><figcaption class="caption" data-cid="1Ylq9s">Representación vectorial estática de la vista de despliegue contenida en la versión v2.</figcaption></figure>
|
|
<p data-cid="U3zlDT"><strong data-cid="-TsXp1">[REC]</strong> El puerto <code data-cid="8Hy65b">12345</code> debe ser interno, protegido por firewall, mTLS y autenticación de servicio; no debe publicarse directamente a Internet. <strong data-cid="OktuX7">[REC]</strong> Relay y Orchestrator se despliegan con al menos dos instancias lógicas en producción. Esto no implica que el MVP necesite alta disponibilidad física desde el primer día, pero los contratos no deben depender de memoria local exclusiva.</p>
|
|
<p data-cid="ksD7-H"><strong data-cid="ZZ1REl">[BENCH]</strong> El GB10 es inicialmente un único dominio de fallo y capacidad. Antes de producción deben definirse: estrategia de nodo de reserva, cola de admisión, límite de sesiones, política de shedding y procedimiento de recuperación de modelos.</p>
|
|
<h2 class="chapter" id="7-máquina-de-estados-y-gestión-de-sesión" data-cid="o5wBzh">7. Máquina de estados y gestión de sesión</h2>
|
|
<h3 id="71-estados-propuestos" data-cid="aM8CvA">7.1 Estados propuestos</h3>
|
|
<figure aria-label="Máquina de estados de sesión" class="static-diagram" data-cid="-aZcy_"><svg role="img" viewBox="0 0 1400 1010" xmlns="http://www.w3.org/2000/svg" data-cid="KJjFlV"><defs data-cid="N-k4fy"><marker id="arrow" markerHeight="9" markerWidth="9" orient="auto" refX="7" refY="4.5" data-cid="5D0jsA"><path d="M0,0 L9,4.5 L0,9 z" fill="#52606d" data-cid="wLEwCt"></path></marker></defs><text class="title" text-anchor="middle" x="700" y="32" data-cid="3LoC3v">Vocero S2S — Máquina de estados de sesión</text><rect class="terminal" height="52" rx="7" width="125" x="50" y="100" data-cid="r0W_xa"></rect><text class="node-title" x="112.5" y="124" data-cid="nXbces">Inicio</text><rect class="state" height="58" rx="7" width="165" x="220" y="100" data-cid="OvS-07"></rect><text class="node-title" x="302.5" y="124" data-cid="Gg-gC6">CONNECTING</text><rect class="state" height="58" rx="7" width="190" x="440" y="100" data-cid="x4CIAu"></rect><text class="node-title" x="535.0" y="124" data-cid="d6tR7-">AUTHENTICATING</text><rect class="state" height="58" rx="7" width="180" x="690" y="100" data-cid="07bOo-"></rect><text class="node-title" x="780.0" y="124" data-cid="_Gu2Vu">CONFIGURING</text><rect class="state" height="58" rx="7" width="150" x="940" y="100" data-cid="UoXp-O"></rect><text class="node-title" x="1015.0" y="124" data-cid="4qopLW">LISTENING</text><rect class="state" height="58" rx="7" width="175" x="940" y="235" data-cid="o40tDe"></rect><text class="node-title" x="1027.5" y="259" data-cid="tMy4G3">TRANSCRIBING</text><rect class="state" height="58" rx="7" width="150" x="940" y="370" data-cid="GiSy0a"></rect><text class="node-title" x="1015.0" y="394" data-cid="3Xop-U">THINKING</text><rect class="state" height="58" rx="7" width="180" x="940" y="505" data-cid="cPpzNy"></rect><text class="node-title" x="1030.0" y="529" data-cid="vnKLqx">TOOL_PENDING</text><rect class="state" height="58" rx="7" width="185" x="1180" y="505" data-cid="YW5GTS"></rect><text class="node-title" x="1272.5" y="529" data-cid="Voz9_U">AWAITING_CONFIRMATION</text><rect class="state" height="58" rx="7" width="170" x="1115" y="640" data-cid="mVym6L"></rect><text class="node-title" x="1200.0" y="664" data-cid="cM5PgC">TOOL_RUNNING</text><rect class="state" height="58" rx="7" width="155" x="720" y="370" data-cid="EO3ODx"></rect><text class="node-title" x="797.5" y="394" data-cid="OMsRGh">SPEAKING</text><rect class="state" height="58" rx="7" width="155" x="520" y="370" data-cid="hTjp0W"></rect><text class="node-title" x="597.5" y="394" data-cid="kwwOCy">INTERRUPTING</text><rect class="state" height="58" rx="7" width="175" x="690" y="235" data-cid="b7K9W9"></rect><text class="node-title" x="777.5" y="259" data-cid="mSgUnP">DEGRADED</text><rect class="terminal" height="58" rx="7" width="150" x="420" y="745" data-cid="O8tx2o"></rect><text class="node-title" x="495.0" y="769" data-cid="I_szIs">CLOSING</text><rect class="terminal" height="58" rx="7" width="145" x="220" y="235" data-cid="gF0Cjv"></rect><text class="node-title" x="292.5" y="259" data-cid="GCjlCh">FAILED</text><path class="edge" d="M175 126 H220" data-cid="gdpxH-"></path><path class="edge" d="M385 129 H440" data-cid="a9Wm70"></path><text class="edge-label" x="412" y="115" data-cid="PkNczn">transporte listo</text><path class="edge" d="M630 129 H690" data-cid="5pObZN"></path><text class="edge-label" x="660" y="115" data-cid="uYmOPB">identidad válida</text><path class="edge" d="M630 146 V264 H365" data-cid="QZB5Aj"></path><text class="edge-label" x="495" y="215" data-cid="xaTqvb">rechazo o timeout</text><path class="edge" d="M870 129 H940" data-cid="5SZtjx"></path><text class="edge-label" x="905" y="115" data-cid="O4gG2-">perfil + voz + tools cargados</text><path class="edge" d="M780 158 V235 H865" data-cid="ya8vgh"></path><text class="edge-label" x="820" y="212" data-cid="hOg67i">dependencia no crítica falla</text><path class="edge" d="M1015 158 V235" data-cid="VRM4M-"></path><text class="edge-label" x="1075" y="210" data-cid="7HhBee">speech_started</text><path class="edge" d="M1027 293 V370" data-cid="2cOmAf"></path><text class="edge-label" x="1095" y="345" data-cid="EYkztJ">turn_committed</text><path class="edge" d="M1015 428 V505" data-cid="feyTFY"></path><text class="edge-label" x="1085" y="480" data-cid="Alnx2J">tool_intent</text><path class="edge" d="M1120 534 H1180" data-cid="rbmQsx"></path><text class="edge-label" x="1150" y="520" data-cid="sT8ZdV">acción sensible</text><path class="edge" d="M1272 563 V640" data-cid="YJDa2f"></path><text class="edge-label" x="1312" y="610" data-cid="kJjvN5">confirmada</text><path class="edge" d="M1120 563 V640" data-cid="K-dNwd"></path><text class="edge-label" x="1165" y="610" data-cid="VR942t">permitida</text><path class="edge" d="M1115 669 H1090 V428" data-cid="HSlV-9"></path><text class="edge-label" x="1100" y="490" data-cid="FT2r2T">tool_result</text><path class="edge" d="M940 399 H875" data-cid="UP4HJT"></path><text class="edge-label" x="905" y="385" data-cid="y23W_p">audio_first_chunk</text><path class="edge" d="M720 399 H675" data-cid="E5ih2x"></path><text class="edge-label" x="700" y="385" data-cid="MHtcp9">barge_in</text><path class="edge" d="M520 399 V129 H940" data-cid="T2QWyH"></path><text class="edge-label" x="695" y="210" data-cid="lRcVc5">salida detenida</text><path class="edge" d="M875 399 H940 V158" data-cid="eEQgjp"></path><text class="edge-label" x="902" y="260" data-cid="vkyqS6">response_completed</text><path class="edge" d="M690 264 H865" data-cid="4fYFwM"></path><text class="edge-label" x="778" y="250" data-cid="zuAdYo">alternativa disponible</text><path class="edge" d="M940 158 V774 H570" data-cid="udBrpL"></path><text class="edge-label" x="790" y="730" data-cid="QnWVsD">cierre</text><path class="edge" d="M1027 293 V774 H570" data-cid="FKvly5"></path><text class="edge-label" x="850" y="750" data-cid="9MVXPi">cierre</text><path class="edge" d="M1015 428 V774 H570" data-cid="EsAMnP"></path><text class="edge-label" x="760" y="790" data-cid="J9XpCQ">cierre</text><path class="edge" d="M720 428 V774 H570" data-cid="tfSA-A"></path><text class="edge-label" x="650" y="650" data-cid="clry5a">cierre</text><path class="edge" d="M420 774 H250 V293" data-cid="vc1LTp"></path><path class="edge" d="M220 264 H175" data-cid="UKserc"></path></svg><figcaption class="caption" data-cid="hEgNfa">Representación vectorial estática de la máquina de estados contenida en la versión v2.</figcaption></figure>
|
|
<h3 id="72-identificadores" data-cid="VLmGLo">7.2 Identificadores</h3>
|
|
<ul data-cid="Z7cVDM"><li data-cid="Moh_5Z"><code data-cid="5WW_7v">connection_id</code>: conexión de transporte; puede cambiar al reconectar.</li><li data-cid="X6YUTg"><code data-cid="jac5_8">session_id</code>: sesión conversacional estable y opaca.</li><li data-cid="Plcjwz"><code data-cid="UP6Cun">turn_id</code>: entrada comprometida del usuario.</li><li data-cid="13YypE"><code data-cid="nyPXM-">generation_id</code>: respuesta del agente; cambia después de cancelar o regenerar.</li><li data-cid="ksba69"><code data-cid="3zQ3jn">tool_call_id</code>: invocación única; debe ser idempotente cuando la tool lo soporte.</li><li data-cid="p9pmTY"><code data-cid="uC5Gvg">voice_profile_id</code> + <code data-cid="pi7g6k">voice_version</code>: referencia inmutable a la voz autorizada.</li><li data-cid="2l2Qw4"><code data-cid="wCGoHg">trace_id</code>: correlación distribuida; no reemplaza identificadores funcionales.</li></ul>
|
|
<h3 id="73-estado-efectivo-de-sesión" data-cid="nUCjdj">7.3 Estado efectivo de sesión</h3>
|
|
<p data-cid="P2qE-n"><strong data-cid="F-YVQY">[REC]</strong> Se calcula en este orden, sin permitir que el cliente incremente privilegios:</p><ol data-cid="Q8M2NG"><li data-cid="yMeYvk">defaults seguros de plataforma;</li><li data-cid="C1qBxn">política del tenant;</li><li data-cid="kTrt17">perfil del agente versionado;</li><li data-cid="5LnFS3">atributos autorizados del usuario;</li><li data-cid="-a4VWj">preferencias permitidas de sesión;</li><li data-cid="-DM92l">overrides por respuesta explícitamente allowlisted.</li></ol>
|
|
<p data-cid="0JDSIe">El sanitizador de <code data-cid="NcSKQE">session.update</code> elimina o rechaza campos que puedan sustituir <code data-cid="nAFCJ9">voice_profile_id</code>, tools, instrucciones de sistema, límites o scopes. Toda diferencia entre configuración solicitada y efectiva queda en un evento <code data-cid="R4duqa">session.configuration_applied</code> con razones codificadas.</p><p data-cid="CWdXy3"><strong data-cid="TxsuBf">[REC]</strong> El estado efímero se guarda con TTL y control optimista de versión. La reanudación requiere token opaco de corta vida, misma identidad y comprobación de versión del perfil. Audio no confirmado y trabajos de generación no se reanudan: se cancelan y el cliente vuelve a <code data-cid="v2yjLk">LISTENING</code>.</p>
|
|
<h2 class="chapter" id="8-flujos-de-ejecución" data-cid="mstQ8o">8. Flujos de ejecución</h2><h3 id="81-flujo-nominal-conversacional-y-mcp" data-cid="zlRuBZ">8.1 Flujo nominal conversacional y MCP</h3><h3 id="82-tool-call-con-confirmación" data-cid="73RNpN">8.2 Tool call con confirmación</h3>
|
|
<ol data-cid="U1BW72"><li data-cid="hgnnoF">LLM emite intención, nunca una ejecución directa.</li><li data-cid="MKI5o-">Orchestrator valida nombre contra la lista permitida y el esquema vigente.</li><li data-cid="qL4HSS">Policy Engine clasifica la acción: lectura, escritura reversible, acción irreversible o prohibida.</li><li data-cid="fHZSew">Si requiere consentimiento, se emite <code data-cid="Qr_XXd">tool.confirmation_required</code> con resumen legible y campos no sensibles.</li><li data-cid="gw_Ard">El usuario confirma; se crea <code data-cid="LdF2Uk">confirmation_id</code> ligado a hash de tool + argumentos + identidad + expiración.</li><li data-cid="PiYUID">MCP Gateway ejecuta con token delegado de alcance mínimo.</li><li data-cid="81K04T">El resultado se valida, limita y clasifica antes de volver al LLM.</li><li data-cid="oW81jh">Se registra la decisión, no secretos ni payloads sensibles completos.</li></ol>
|
|
<p data-cid="HEXwLG">Para la compatibilidad estable <code data-cid="WUBD9I">2025-11-25</code>, el adaptador mantiene el lifecycle y la sesión del protocolo de acuerdo con el transporte oficial <a class="inline_marker" href="#ref5" data-cid="b7Ls-s">5</a>. El RC <code data-cid="KK-JcO">2026-07-28</code> propone eliminar handshake y sesión de protocolo, usar requests autocontenidos, headers de routing y <code data-cid="ibgleD">InputRequiredResult</code>; estas capacidades quedan sólo en el adaptador experimental hasta ratificación <a class="inline_marker" href="#ref4" data-cid="LbJd8T">4</a>.</p>
|
|
<h3 id="83-barge-in" data-cid="bR0grF">8.3 Barge-in</h3><p data-cid="rO5-oR">Reglas:</p><ul data-cid="ScqSS-"><li data-cid="zdwvtO">Un evento de interrupción salta las colas de tokens y audio.</li><li data-cid="gKA6-N">Todo chunk posterior de <code data-cid="iMW70R">G1</code> se descarta por <code data-cid="SLhMXc">generation_id</code> obsoleto.</li><li data-cid="bw_0Ey">El cursor del cliente es la fuente de verdad del audio reproducido; si falta, se usa el último ACK conservador.</li><li data-cid="u-xUGj">Una tool de sólo lectura puede cancelarse; una acción ya confirmada e irreversible no se “deshace” por barge-in. Se informa estado y se evita repetirla.</li><li data-cid="weowuc">Se aplican AEC y umbrales adaptativos para reducir auto-interrupciones; las interjecciones breves se prueban como caso específico.</li></ul>
|
|
<h3 id="84-errores-y-degradación" data-cid="rUtrUg">8.4 Errores y degradación</h3>
|
|
<div class="sk-doc-native-table-frame" data-scroll-left-active="false" data-scroll-right-active="false" data-scrolling="false" data-cid="LRxZVv"><table data-cid="o8KeF8"><thead data-cid="BG4m5F"><tr data-cid="dScA7n"><th data-cid="artf8w">Condición</th><th data-cid="AueFD4">Acción automática</th><th data-cid="UKxiT8">Experiencia de usuario</th><th data-cid="9JAkFB">Auditoría/operación</th></tr></thead><tbody data-cid="Ij9615"><tr data-cid="GXRdlH"><td data-cid="Yzzu5x">Auth denegada</td><td data-cid="b8xxLe">Cerrar con código estable</td><td data-cid="Qsfye-">Mensaje de acceso no autorizado</td><td data-cid="5FEOmI">Razón, tenant, hash de sujeto</td></tr><tr data-cid="GLZJBJ"><td data-cid="MFDaqg">Perfil no disponible</td><td data-cid="q6yEkj">Reintento acotado; fallback sólo si está aprobado</td><td data-cid="12zVmK">“No puedo iniciar el asistente en este momento”</td><td data-cid="LZcdB3">Alerta de dependencia</td></tr><tr data-cid="3mcU7Z"><td data-cid="CcHFZG">STT no saludable</td><td data-cid="cXwsjT">Pausar admisión o activar modo texto si existe</td><td data-cid="0bSDyd">Informar degradación</td><td data-cid="7UGQJH">Métrica y circuit breaker</td></tr><tr data-cid="EBXWtN"><td data-cid="LS-Sse">LLM timeout</td><td data-cid="Tcn1oZ">Cancelar generación; una reintento sólo si no hubo tool side effect</td><td data-cid="t1Bv0Y">Respuesta breve segura</td><td data-cid="q4uINc">Span con timeout</td></tr><tr data-cid="06tgpE"><td data-cid="1QjUXx">TTS falla</td><td data-cid="JRNrGu">Mantener texto; no sustituir voz sin política</td><td data-cid="lhTPJZ">Mostrar texto o pedir reintento</td><td data-cid="u5gtba">Estado de voz/modelo</td></tr><tr data-cid="dwskbI"><td data-cid="bKc-XH">MCP timeout</td><td data-cid="NtL70f">Cancelar o marcar estado desconocido</td><td data-cid="yztM1F">“No pude confirmar la operación”</td><td data-cid="PtuHpX">No reintentar escrituras sin idempotencia</td></tr><tr data-cid="i_4rT0"><td data-cid="7QY3da">Respuesta MCP inválida</td><td data-cid="LUFLSu">Rechazar payload; no pasarlo al LLM</td><td data-cid="xqT6n5">Error controlado</td><td data-cid="pDxmQl">Violación de schema</td></tr><tr data-cid="S1e_85"><td data-cid="Uc6dFc">Buffer saturado</td><td data-cid="Zgagm3">Frenar productor; descartar parciales obsoletos; nunca perder cancelación</td><td data-cid="iZlz9B">Posible indicador de red</td><td data-cid="5O9Pd9">Contadores de drop/backpressure</td></tr><tr data-cid="nvluxo"><td data-cid="1clBpQ">Cliente desconectado</td><td data-cid="dwJno0">Lease corto; cancelar media; conservar mínimo estado reanudable</td><td data-cid="azIBJ1">Reintento controlado</td><td data-cid="3ypTAl">Causa de cierre</td></tr><tr data-cid="QKs3qo"><td data-cid="Vic-Ju">GPU sin capacidad</td><td data-cid="WDcm8Z">Rechazo temprano o cola acotada</td><td data-cid="KTBeo-">“Servicio ocupado, inténtalo nuevamente”</td><td data-cid="_RQzRT">Saturación, cola y shedding</td></tr></tbody></table></div>
|
|
<h2 class="chapter" id="9-contratos-y-eventos-orientativos" data-cid="iERdV1">9. Contratos y eventos orientativos</h2><blockquote data-cid="KYLg9g"><p data-cid="kbGqhZ"><strong data-cid="I2Vd0T">[REC]</strong> Los siguientes esquemas son orientativos. Deben convertirse en JSON Schema versionado, con pruebas de compatibilidad y límites de tamaño. No representan un contrato final.</p></blockquote><h3 id="91-envelope-común" data-cid="f-pdWv">9.1 Envelope común</h3><pre class="code-block keep-together" data-cid="c-4f6e"><code class="code language-json" data-cid="XifFyT">{
|
|
"specversion": "1.0",
|
|
"type": "vocero.audio.input.delta.v1",
|
|
"source": "web-client",
|
|
"id": "evt_opaque",
|
|
"time": "RFC3339 timestamp",
|
|
"subject": "session/{session_id}",
|
|
"traceparent": "00-...",
|
|
"data": {
|
|
"session_id": "ses_opaque",
|
|
"turn_id": "turn_opaque",
|
|
"sequence": 42,
|
|
"payload": {}
|
|
}
|
|
}</code></pre>
|
|
<h3 id="92-catálogo-mínimo-de-eventos" data-cid="Hn2Zyc">9.2 Catálogo mínimo de eventos</h3><p data-cid="EOAnH5"><strong data-cid="ITfq97">Cliente → plataforma</strong></p><ul data-cid="CFwrr7"><li data-cid="OYTKWv"><code data-cid="Tvgz7n">session.connect.v1</code></li><li data-cid="xzqyi0"><code data-cid="GiN_-x">session.update_requested.v1</code></li><li data-cid="mu-5Tp"><code data-cid="6_qEnC">audio.input.delta.v1</code></li><li data-cid="iTHUq9"><code data-cid="52FFSQ">audio.input.commit.v1</code></li><li data-cid="oOb4r7"><code data-cid="E59Wm6">input.speech_started.v1</code></li><li data-cid="8O-7Ad"><code data-cid="P0M0fs">output.playout_progress.v1</code></li><li data-cid="r-cb_0"><code data-cid="JMlGSP">generation.cancel_requested.v1</code></li><li data-cid="DK5oVB"><code data-cid="NoUUUV">tool.confirmation_submitted.v1</code></li><li data-cid="9MzUMJ"><code data-cid="B_1Hao">session.close.v1</code></li></ul><p data-cid="OfziNN"><strong data-cid="6UQGI8">Plataforma → cliente</strong></p><ul data-cid="TuYUdU"><li data-cid="Z2UhsQ"><code data-cid="QcNNnS">session.configuration_applied.v1</code></li><li data-cid="s7azNc"><code data-cid="mFy49P">transcript.partial.v1</code></li><li data-cid="_LoG6b"><code data-cid="LHWtmi">transcript.final.v1</code></li><li data-cid="Za8oGy"><code data-cid="yE80oP">response.text_delta.v1</code></li><li data-cid="TXOXzf"><code data-cid="VkjUP1">response.audio_delta.v1</code></li><li data-cid="NncMSh"><code data-cid="ElfKjI">response.completed.v1</code></li><li data-cid="sT6gwp"><code data-cid="Ij4dNT">output.stop_and_flush.v1</code></li><li data-cid="7YnthF"><code data-cid="ccBC4g">tool.confirmation_required.v1</code></li><li data-cid="C2ciMy"><code data-cid="kb5lxd">tool.status.v1</code></li><li data-cid="9xFTxP"><code data-cid="dXQJo5">error.v1</code></li></ul>
|
|
<h3 id="93-ejemplo-de-sessionupdaterequested" data-cid="GCNEO6">9.3 Ejemplo de <code data-cid="ZzoYTn">session.update_requested</code></h3><pre class="code-block keep-together" data-cid="aH__nN"><code class="code language-json" data-cid="8GryQ5">{
|
|
"type": "vocero.session.update_requested.v1",
|
|
"data": {
|
|
"session_id": "ses_opaque",
|
|
"client_capabilities": {
|
|
"audio_codecs": ["opus", "pcm16"],
|
|
"supports_playout_ack": true
|
|
},
|
|
"preferences": {
|
|
"locale": "es-CL",
|
|
"turn_mode": "server_vad"
|
|
}
|
|
}
|
|
}</code></pre><p data-cid="eDVSqN">Campos como <code data-cid="zxSVKR">system_prompt</code>, <code data-cid="0cvzDk">tools</code>, <code data-cid="D56K4k">mcp_credentials</code>, <code data-cid="SjCRyy">ref_audio</code>, <code data-cid="an4t0Z">ref_text</code> o <code data-cid="NI2juK">voice_profile_id</code> no se aceptan desde este contrato público. Si llegan, el relay los rechaza o elimina según política, y registra la razón.</p>
|
|
<h3 id="94-ejemplo-de-intención-de-tool-interna" data-cid="w27nw0">9.4 Ejemplo de intención de tool interna</h3><pre class="code-block keep-together" data-cid="e22mUg"><code class="code language-json" data-cid="VY_iIi">{
|
|
"tool_call_id": "tc_opaque",
|
|
"session_id": "ses_opaque",
|
|
"turn_id": "turn_opaque",
|
|
"tool": {
|
|
"name": "production.report.get",
|
|
"schema_version": "1.2.0"
|
|
},
|
|
"arguments": {
|
|
"site_id": "site_authorized",
|
|
"period": "value_from_user_or_context"
|
|
},
|
|
"execution": {
|
|
"mode": "read",
|
|
"idempotency_key": "idem_opaque",
|
|
"deadline_ms": "configured_value"
|
|
},
|
|
"principal": {
|
|
"subject_ref": "opaque_subject",
|
|
"tenant_id": "tenant_opaque",
|
|
"scopes": ["report:read"]
|
|
}
|
|
}</code></pre>
|
|
<h3 id="95-errores" data-cid="y_zff-">9.5 Errores</h3><pre class="code-block keep-together" data-cid="PRWcdF"><code class="code language-json" data-cid="8SUbZy">{
|
|
"type": "vocero.error.v1",
|
|
"data": {
|
|
"code": "MCP_TOOL_TIMEOUT",
|
|
"category": "dependency",
|
|
"retryable": false,
|
|
"user_message_key": "tool.temporarily_unavailable",
|
|
"correlation_id": "corr_opaque",
|
|
"details_ref": "internal_log_reference"
|
|
}
|
|
}</code></pre><p data-cid="pqZoSF">Los mensajes públicos no contienen stack traces, endpoints internos, prompts, tokens, argumentos sensibles ni nombres de secretos.</p>
|
|
<h3 id="96-compatibilidad-mcp" data-cid="llOSm0">9.6 Compatibilidad MCP</h3><pre class="code-block keep-together" data-cid="P5kRRv"><code class="code language-text" data-cid="NXOHsF">McpAdapter
|
|
├── StableAdapter_2025_11_25 # default
|
|
├── CandidateAdapter_2026_07_28 # feature flag, no producción por defecto
|
|
└── ConformanceHarness
|
|
├── discovery
|
|
├── tools/list
|
|
├── tools/call
|
|
├── cancellation
|
|
├── schema validation
|
|
├── auth propagation
|
|
└── error mapping</code></pre><p data-cid="55tnwO">La arquitectura oficial de MCP separa una capa de datos JSON-RPC y una capa de transporte, y contempla lifecycle, primitives y notificaciones <a class="inline_marker" href="#ref6" data-cid="XkNET-">6</a>. <strong data-cid="H5GfHV">[REC]</strong> Vocero preservará esa separación dentro del adaptador para evitar que detalles de transporte contaminen la lógica conversacional.</p><p data-cid="TQrDhy"><strong data-cid="s4Lhi9">Capacidades candidatas que se preparan, pero no se activan como estándar final:</strong> el RC <code data-cid="XpmurZ">2026-07-28</code> introduce <code data-cid="QIm1Tv">server/discover</code>, metadatos <code data-cid="TpzW7C">ttlMs</code> y <code data-cid="UZfwu0">cacheScope</code> en resultados de listas/lecturas, y headers <code data-cid="29R__Z">Mcp-Method</code>/<code data-cid="SpvQbH">Mcp-Name</code> para routing <a class="inline_marker" href="#ref4" data-cid="ddc3Px">4</a>. <strong data-cid="jtdFFY">[REC]</strong> El gateway modelará discovery y caché mediante interfaces neutrales: el adaptador estable resolverá su mecanismo según <code data-cid="FUHlYH">2025-11-25</code>, mientras que el adaptador candidato podrá mapear esas capacidades nuevas. La caché nunca compartirá resultados más allá del alcance de identidad/tenant permitido y siempre respetará revocación y cambio de política.</p>
|
|
<h2 class="chapter" id="10-clonación-de-voz-y-gobernanza" data-cid="47G1Bc">10. Clonación de voz y gobernanza</h2><h3 id="101-modelo-operativo" data-cid="1lqd3d">10.1 Modelo operativo</h3><p data-cid="ECkyuf"><strong data-cid="S_R5l7">[REQ]</strong> Qwen3-TTS debe utilizar <code data-cid="0TITuZ">ref_audio</code> y <code data-cid="ANcn4L">ref_text</code> para clonación zero-shot y preservar una locución corporativa. El model card de Qwen3-TTS 1.7B Base confirma streaming, soporte de español y clonación rápida desde audio breve <a class="inline_marker" href="#ref7" data-cid="gFZStI">7</a>. La documentación del repositorio describe generación streaming y clonación de voz <a class="inline_marker" href="#ref8" data-cid="wzNJlZ">8</a>.</p><p data-cid="sgjI53"><strong data-cid="2LICX0">Modos a evaluar:</strong></p><ul data-cid="TUlefZ"><li data-cid="78pYnA"><strong data-cid="c--wx4">Full ICL — recomendado para máxima fidelidad:</strong> usa <code data-cid="vKW1Ra">ref_audio</code> y una transcripción <code data-cid="2Ry7hR">ref_text</code> exacta y alineada. <strong data-cid="mt76oL">[REC]</strong> Éste será el modo candidato por defecto para voces corporativas aprobadas.</li><li data-cid="GuNjNr"><strong data-cid="inm0M0">x-vector (<code data-cid="WApmY_">x_vector_only_mode=True</code>):</strong> permite operar sin <code data-cid="-0_jHo">ref_text</code>, pero la investigación reporta menor fidelidad de timbre y prosodia. <strong data-cid="L-s5OI">[BENCH]</strong> Sólo podrá promoverse para un perfil si supera los umbrales de calidad y riesgo definidos.</li></ul><p data-cid="V1vWk3"><strong data-cid="TMNryc">[REC]</strong> El cliente nunca envía referencias maestras durante una sesión. El perfil de agente contiene sólo <code data-cid="5Z5YAk">voice_profile_id</code> y <code data-cid="lcl4W_">voice_version</code>; TTS resuelve la referencia desde Voice Vault mediante identidad de servicio. El relay elimina voces estándar propuestas por el cliente y el Orchestrator aplica la voz efectiva autorizada.</p>
|
|
<h3 id="102-ciclo-de-vida" data-cid="EdZ7e0">10.2 Ciclo de vida</h3><ol data-cid="ddpYwH"><li data-cid="R8oXfT"><strong data-cid="OpUkNk">Solicitud:</strong> propietario de la voz, propósito, tenant, idiomas y periodo de uso.</li><li data-cid="wCv3eF"><strong data-cid="s3wt1Z">Consentimiento verificable:</strong> documento o evidencia de autorización; revisión legal según jurisdicción.</li><li data-cid="AjbqxR"><strong data-cid="BmygyC">Ingesta controlada:</strong> antivirus, normalización, evaluación de ruido y transcripción alineada.</li><li data-cid="FOBZ9a"><strong data-cid="EYRk1i">Evaluación:</strong> fidelidad, inteligibilidad, pronunciación, estabilidad y riesgo de suplantación.</li><li data-cid="pcEFLH"><strong data-cid="9YbZEh">Aprobación de cuatro ojos:</strong> dueño de negocio más seguridad/legal o roles equivalentes.</li><li data-cid="hYbHYo"><strong data-cid="EXtRLM">Versionado:</strong> hash de <code data-cid="Vo5mug">ref_audio</code>, hash de <code data-cid="2CKn0A">ref_text</code>, modelo, parámetros y fecha de vigencia.</li><li data-cid="Y9H1SB"><strong data-cid="4pe0cP">Publicación:</strong> sólo perfiles aprobados pueden usarse en producción.</li><li data-cid="jzals8"><strong data-cid="MXdF_W">Monitoreo:</strong> uso por tenant/agente, anomalías y reclamaciones.</li><li data-cid="RyNcGX"><strong data-cid="nPtgTR">Revocación:</strong> bloqueo inmediato de nuevas sesiones; rotación de caché; evidencia de eliminación.</li></ol>
|
|
<h3 id="103-controles" data-cid="2ZESdM">10.3 Controles</h3><ul data-cid="2ZHsrE"><li data-cid="Bxqqjl">Cifrado en tránsito y reposo con claves administradas.</li><li data-cid="0kRRky">Separación por tenant y entorno; no copiar voces reales a desarrollo.</li><li data-cid="OZ2X6A">URLs firmadas de corta vida o lectura directa por identidad de workload.</li><li data-cid="wWte8t">Registro de acceso sin incluir el audio en logs.</li><li data-cid="G0L8YL">Marcas de procedencia o disclosure cuando la política corporativa o regulación lo exija.</li><li data-cid="0UUYGT">Pruebas de abuso: texto ofensivo, fraude, ingeniería social, extracción de referencia y uso cruzado entre tenants.</li><li data-cid="h6N5Qc"><strong data-cid="gGKkIg">[BENCH]</strong> Comparar Full ICL con <code data-cid="H4_-fF">ref_audio</code> + <code data-cid="KJm94a">ref_text</code> frente a modo sin texto; no asumir equivalencia de calidad.</li><li data-cid="e3Kt64"><strong data-cid="3uDMQS">[BENCH]</strong> Revisión jurídica de licencias de código y pesos antes de uso comercial; la evidencia recopilada no debe sustituir dictamen legal.</li></ul>
|
|
<h2 class="chapter" id="11-seguridad" data-cid="WW8JUD">11. Seguridad</h2><h3 id="111-vista-de-zonas-y-confianza" data-cid="s1jHzW">11.1 Vista de zonas y confianza</h3><h3 id="112-amenazas-principales-y-mitigaciones" data-cid="f1wLYY">11.2 Amenazas principales y mitigaciones</h3>
|
|
<div class="sk-doc-native-table-frame" data-scroll-left-active="false" data-scroll-right-active="false" data-scrolling="false" data-cid="RbWd75"><table data-cid="vpaukF"><thead data-cid="E-Jb4b"><tr data-cid="4J8TDY"><th data-cid="b1ogWG">Amenaza</th><th data-cid="JQOEg4">Mitigaciones recomendadas</th></tr></thead><tbody data-cid="nR6iFn"><tr data-cid="DtIFVv"><td data-cid="SBalQp">Suplantación de usuario</td><td data-cid="TlcGVB">OIDC/OAuth, tokens efímeros, validación de issuer/audience, reautenticación para acciones sensibles</td></tr><tr data-cid="tFsK8U"><td data-cid="prVghb">Prompt injection desde usuario o tool result</td><td data-cid="LQ9Ufg">Separación de instrucciones, allowlist de tools, validación de salida, etiquetado de contenido no confiable, autorización fuera del LLM</td></tr><tr data-cid="eGPUWp"><td data-cid="-ktlOG">Tool poisoning o schema malicioso</td><td data-cid="9lKsDh">Registro de servidores aprobados, pinning de versión/hash, revisión de schema, límites de profundidad/tamaño, caché con invalidación segura</td></tr><tr data-cid="EgxRJU"><td data-cid="c9aj4g">Confused deputy</td><td data-cid="qz7sDp">Propagar sujeto y tenant; token exchange; scopes por tool; comprobación de recurso en backend</td></tr><tr data-cid="VeEBBT"><td data-cid="C8Y-W2">Exfiltración por tool</td><td data-cid="q1PK2_">Egress allowlist, DLP/clasificación, minimización de respuesta, límites y redacción antes del contexto</td></tr><tr data-cid="-pGfuf"><td data-cid="-eIh-_">Repetición de escritura</td><td data-cid="kbzksk">Idempotency key, confirmación ligada a hash, ledger de ejecución, no reintentar estado desconocido</td></tr><tr data-cid="V6Gd39"><td data-cid="qwHiTb">Robo de voz</td><td data-cid="jx7WZT">Vault, cifrado, aislamiento, consentimiento, revocación, sin descarga al navegador</td></tr><tr data-cid="mR2FEN"><td data-cid="FJTCeR">Secuestro/replay de sesión</td><td data-cid="a-NOny">Tokens de conexión cortos, nonce, expiración, binding a identidad, límites de reconexión</td></tr><tr data-cid="cZu2Mu"><td data-cid="9mMdXl">DoS de audio/GPU</td><td data-cid="uY7iMK">Cuotas, límites de bitrate/chunk, admission control, colas acotadas, circuit breakers, shedding</td></tr><tr data-cid="XhzQRg"><td data-cid="pwzgap">Fuga por logs/traces</td><td data-cid="6E9Ar8">Redacción, clasificación de atributos, sampling, retención limitada, acceso RBAC</td></tr><tr data-cid="_skhA9"><td data-cid="Q_JOJF">Movimiento lateral</td><td data-cid="wy6w4X">Segmentación, mTLS, identidades de workload, deny-by-default y egress controlado</td></tr></tbody></table></div>
|
|
<h3 id="113-autorización-de-tools" data-cid="1CaKyf">11.3 Autorización de tools</h3><p data-cid="X-LSpJ">La decisión se evalúa sobre:</p><pre class="code-block keep-together" data-cid="gi_NMJ"><code class="code language-text" data-cid="leOPk_">permit = policy(
|
|
tenant,
|
|
principal,
|
|
agent_profile_version,
|
|
tool_name,
|
|
tool_schema_version,
|
|
action_class,
|
|
resource_scope,
|
|
argument_classification,
|
|
confirmation,
|
|
session_risk
|
|
)</code></pre><p data-cid="KhXLzJ">El LLM puede proponer <code data-cid="HTuVoW">tool_name</code> y <code data-cid="3C-5GN">arguments</code>, pero no <code data-cid="FYBPfm">principal</code>, scopes, credenciales, clasificación de acción ni resultado de política. <strong data-cid="x0wt_W">[REC]</strong> Las acciones irreversibles requieren confirmación humana específica o una excepción corporativa documentada.</p>
|
|
<h3 id="114-datos-y-retención" data-cid="kuKGIi">11.4 Datos y retención</h3><p data-cid="k_4NLm">Definir una matriz por clase:</p><ul data-cid="3v1WWF"><li data-cid="5rJmr1">audio bruto;</li><li data-cid="VkSLyu">referencias de voz;</li><li data-cid="8aOIsd">transcripción;</li><li data-cid="J7Y74H">prompt/contexto;</li><li data-cid="6CPODX">respuesta de modelo;</li><li data-cid="2gYs6P">argumentos y resultados de tools;</li><li data-cid="phF27i">telemetría y auditoría.</li></ul><p data-cid="aF8xcz">Para cada clase deben aprobarse propósito, base legal, ubicación, cifrado, retención, borrado, exportación, acceso, uso para entrenamiento y redacción. <strong data-cid="5qKyXe">Pendiente:</strong> el solicitante no proporcionó políticas corporativas ni jurisdicciones; por tanto, no se fijan plazos de retención en este documento.</p>
|
|
<h2 class="chapter" id="12-observabilidad-y-slos-iniciales" data-cid="tCwZyI">12. Observabilidad y SLOs iniciales</h2><h3 id="121-modelo-de-telemetría" data-cid="m3zjXZ">12.1 Modelo de telemetría</h3><p data-cid="j-u4rg"><strong data-cid="1UhJRp">Trazas:</strong> una traza por turno con spans de captura, relay, STT, endpointing, LLM, policy, MCP, TTS, red y playout. El RC futuro propone nombres estandarizados para propagar W3C Trace Context en <code data-cid="9z3Qpe">_meta</code>, pero esa forma se tratará como candidata hasta ratificación <a class="inline_marker" href="#ref4" data-cid="wS4Po1">4</a>. En el adaptador estable, Vocero propagará <code data-cid="93rwTu">traceparent</code> mediante metadata interna compatible sin exigir cambios futuros al dominio.</p><p data-cid="J750jH"><strong data-cid="BBbmRc">Métricas de experiencia</strong></p><ul data-cid="2Ey_Wc"><li data-cid="5o-A_q"><code data-cid="hwNkdv">turn_endpointing_ms</code>: fin acústico a commit de turno.</li><li data-cid="zAukNl"><code data-cid="6rWpQr">stt_partial_ms</code> y <code data-cid="ncoQUH">stt_final_ms</code>.</li><li data-cid="YaedG8"><code data-cid="WJGF8k">llm_ttft_ms</code>: commit a primer token.</li><li data-cid="NcE_iK"><code data-cid="T1Lm8L">tts_ttfa_ms</code>: texto disponible a primer audio.</li><li data-cid="vmcq1R"><code data-cid="AdCatj">ttfs_ms</code>: fin de habla a primer sonido reproducible.</li><li data-cid="2gr-6y"><code data-cid="tCPnFi">barge_in_stop_ms</code>: detección de interrupción a silencio efectivo.</li><li data-cid="A3Y_lr"><code data-cid="5iwjTj">tool_latency_ms</code> por tool y outcome.</li><li data-cid="AAhZAj"><code data-cid="aETFuO">turn_e2e_ms</code> por ruta directa o con tool.</li><li data-cid="7kZ6vC">tasa de reconexión, cancelación, falsos barge-in y abandono.</li></ul><p data-cid="M1dVZO">TTFT y latencia extremo a extremo se reconocen como dimensiones distintas y relevantes para cargas de voz/tiempo real <a class="inline_marker" href="#ref9" data-cid="XoMUg9">9</a>.</p><p data-cid="tFQY1A"><strong data-cid="nbmcXA">Métricas de calidad</strong></p><ul data-cid="G_hour"><li data-cid="Ns_Vtp">WER/CER por idioma, acento, ruido y dominio.</li><li data-cid="5krVT8">tasa de endpointing temprano/tardío.</li><li data-cid="QIKGrD">inteligibilidad y evaluación humana de naturalidad.</li><li data-cid="VbZp2z">similitud de locutor y estabilidad de voz.</li><li data-cid="erBq7M">exactitud de tool selection, argumentos, política y task completion.</li></ul><p data-cid="GBKg7X"><strong data-cid="nP3Trf">Métricas de recursos</strong></p><ul data-cid="Pp9yP4"><li data-cid="9QftJu">utilización y memoria GPU; KV cache; colas por modelo; tokens/s; audio seconds/s.</li><li data-cid="ydnFOY">profundidad y edad de buffer; drops; retransmisiones; jitter; playout underruns.</li><li data-cid="xe-hyA">conexiones activas, sesiones admitidas/rechazadas y errores por dependencia.</li></ul>
|
|
<h3 id="122-objetivos-iniciales-no-son-desempeño-observado" data-cid="o1IqPd">12.2 Objetivos iniciales — no son desempeño observado</h3><blockquote data-cid="ewkw_Y"><p data-cid="MtiLnU"><strong data-cid="6q8cxx">[REC/BENCH]</strong> Estos valores son <strong data-cid="Aa5TVw">objetivos provisionales de ingeniería</strong>, no cifras medidas, garantías ni SLO contractual. Deben ratificarse después del benchmark con audio, red, herramientas y concurrencia reales.</p></blockquote>
|
|
<div class="sk-doc-native-table-frame" data-scroll-left-active="false" data-scroll-right-active="false" data-scrolling="false" data-cid="UewefS"><table data-cid="3Lkxis"><thead data-cid="SWgBg1"><tr data-cid="YX23Pt"><th data-cid="fLV9-Q">Indicador</th><th data-cid="PdPaBM">Objetivo inicial propuesto</th><th data-cid="x-RkYj">Ventana/percentil</th><th data-cid="L7jYUr">Condición de ratificación</th></tr></thead><tbody data-cid="SGn-1f"><tr data-cid="ISg1qm"><td data-cid="FSnIs_">Disponibilidad del servicio conversacional</td><td data-cid="DXM-N-">≥ 99,5 %</td><td data-cid="mP0Cbp">Mensual</td><td data-cid="VXfMex">Excluir ventanas acordadas y definir dependencia GPU</td></tr><tr data-cid="QIW15t"><td data-cid="cSvYGf">Inicio de audio de respuesta <code data-cid="OkiyqU">ttfs_ms</code></td><td data-cid="l71z6T">≤ 1.200 ms</td><td data-cid="YEYtBX">p95, turno directo</td><td data-cid="AfnwPM">Red corporativa objetivo y sesión caliente</td></tr><tr data-cid="ASRmra"><td data-cid="Q56rj9">Detención por barge-in</td><td data-cid="cxb2To">≤ 300 ms</td><td data-cid="qldv4J">p95</td><td data-cid="SnU8xd">Medido hasta silencio de playout, no sólo ACK</td></tr><tr data-cid="xq02_4"><td data-cid="0I_Qns">Turnos sin error de plataforma</td><td data-cid="H_4-3I">≥ 99,0 %</td><td data-cid="sm91bg">Mensual</td><td data-cid="IkJZS1">Separar error de dependencia y entrada inválida</td></tr><tr data-cid="ntZaDX"><td data-cid="an4iVp">Ejecuciones MCP de lectura aceptadas por gateway</td><td data-cid="svmQf9">≥ 99,0 %</td><td data-cid="doBQAs">Mensual</td><td data-cid="nlo5iR">Excluir rechazo de política y timeout downstream</td></tr><tr data-cid="u02olk"><td data-cid="aQBhCN">Pérdida de eventos de control aceptados</td><td data-cid="CAW-uo">0</td><td data-cid="SE8KqI">Toda ventana</td><td data-cid="fQ1UeX">Verificada por secuencia y ACK</td></tr><tr data-cid="13mkhq"><td data-cid="Ze0MIK">Uso de voz no autorizada</td><td data-cid="CiiGPZ">0</td><td data-cid="huwWIH">Toda ventana</td><td data-cid="DcBt-f">Alerta y auditoría obligatorias</td></tr></tbody></table></div><p data-cid="RxZGbL">Presupuesto provisional de <code data-cid="NISkWj">ttfs_ms</code> para análisis, no compromiso:</p><pre class="code-block keep-together" data-cid="LJ82ku"><code class="code language-text" data-cid="qKu-h-">endpointing + STT final + scheduling + LLM TTFT + TTS primer audio + transporte/playout</code></pre><p data-cid="gGyyys">No se asignan milisegundos fijos por etapa hasta contar con benchmark; el tablero debe mostrar contribución y percentiles por separado.</p>
|
|
<h3 id="123-alertas-iniciales" data-cid="VSjV0I">12.3 Alertas iniciales</h3><ul data-cid="k6nCPX"><li data-cid="bR2-tx">Burn-rate de disponibilidad y turnos exitosos.</li><li data-cid="NRzADW">Crecimiento sostenido de cola o edad de buffer.</li><li data-cid="UxO0GD">GPU OOM, reinicio de modelo o health degradado.</li><li data-cid="3tEvV4">Divergencia entre <code data-cid="qazQ-Y">generation.cancel</code> y último chunk emitido.</li><li data-cid="Qb28W0">Error/latencia MCP por tool, tenant y dependencia.</li><li data-cid="NQMtl-">Accesos denegados o anomalías de voz.</li><li data-cid="lSA2BL">Ausencia de trazas o cardinalidad no controlada.</li></ul>
|
|
<h2 class="chapter" id="13-escalabilidad-backpressure-y-resiliencia" data-cid="S-LogK">13. Escalabilidad, backpressure y resiliencia</h2><h3 id="131-escalado" data-cid="Tx0fGk">13.1 Escalado</h3><ul data-cid="4QpQzq"><li data-cid="-_zxab"><strong data-cid="vM8-7h">Edge/Relay:</strong> horizontal por conexiones; estado mínimo; drenaje antes de deploy.</li><li data-cid="10o9TO"><strong data-cid="qYAfma">Orchestrator:</strong> horizontal por sesión con lease en store; afinidad opcional como optimización, no requisito de corrección.</li><li data-cid="gxrdWw"><strong data-cid="RXXb7w">MCP Gateway:</strong> horizontal; pools por downstream; bulkheads por tenant/tool.</li><li data-cid="zHEk8m"><strong data-cid="OJwAHO">Inference:</strong> admission control basado en capacidad real, no sólo CPU; colas separadas STT, LLM y TTS; prioridades de cancelación y audio activo.</li><li data-cid="G5cthX"><strong data-cid="Ye4Twn">Voice cache:</strong> caché cifrada y acotada por voces aprobadas; invalidación por versión/revocación.</li></ul>
|
|
<h3 id="132-backpressure" data-cid="0JvDeL">13.2 Backpressure</h3><p data-cid="utahvp"><strong data-cid="cHawg8">[REC]</strong> Cada enlace publica <code data-cid="N2slfm">high_watermark</code>, <code data-cid="ke9ISa">low_watermark</code> y política de overflow. El LLM puede producir texto más rápido de lo que TTS o la red consumen; el sistema debe frenar tokens, agrupar por unidades pronunciables y limitar audio anticipado. El problema general de productores rápidos y consumidores lentos está documentado en pipelines realtime <a class="inline_marker" href="#ref10" data-cid="TffY26">10</a>.</p><p data-cid="PAiaHT">Políticas:</p><ol data-cid="34cFBN"><li data-cid="BS0Gyn">Eventos de control nunca comparten una cola bloqueante con audio.</li><li data-cid="9Hbjz9">Parciales STT obsoletos pueden coalescerse; finales y commits no.</li><li data-cid="U030et">Tokens no sintetizados de una generación cancelada se descartan.</li><li data-cid="_oDMes">Audio generado pero no reproducido se descarta al interrumpir.</li><li data-cid="gOQW7L">Una conexión lenta no puede consumir memoria sin límite.</li><li data-cid="zcEc1G">El cliente reporta <code data-cid="upJNXd">buffered_ms</code> y playout; el servidor ajusta chunking o pausa.</li><li data-cid="D4VlSi">Las colas tienen deadline; trabajo vencido no se procesa “por completitud”.</li></ol>
|
|
<h3 id="133-resiliencia" data-cid="2UuUOD">13.3 Resiliencia</h3><ul data-cid="sdmWGt"><li data-cid="OE41eC">Timeouts por etapa y deadline total propagado.</li><li data-cid="4XVonQ">Circuit breakers por dependencia y modelo.</li><li data-cid="jvca85">Retries con jitter sólo para operaciones idempotentes.</li><li data-cid="PrBCc8">Bulkheads por tenant y tool para evitar fallos en cascada.</li><li data-cid="yViEwr">Health de proceso, readiness de modelo y señal de capacidad diferenciados.</li><li data-cid="SxGk0J">Warm-up verificado antes de recibir sesiones.</li><li data-cid="RmZtTC">Deploy con drenaje de conexiones y cancelación segura.</li><li data-cid="PpOjlP">Snapshots de configuración y rollback de perfiles/modelos.</li><li data-cid="g1y4fv">Runbooks para GPU OOM, degradación STT/TTS, MCP lento, store no disponible y compromiso de voz.</li></ul><p data-cid="zVGbdi"><strong data-cid="PPdteA">[BENCH]</strong> La posibilidad de alojar simultáneamente toda la cadena en un GB10, y el número de sesiones sostenibles, deben medirse. Parakeet TDT 0.6B v3 dispone de soporte de streaming documentado y timestamps <a class="inline_marker" href="#ref11" data-cid="-T4vBK">11</a>; esto valida la capacidad funcional, no la capacidad concurrente del sistema completo.</p>
|
|
<h2 class="chapter" id="14-plan-de-implementación-por-fases" data-cid="iMAclj">14. Plan de implementación por fases</h2><p data-cid="IlmPIw">Las fases no incluyen fechas ni duraciones porque no se entregaron disponibilidad de equipo, ambientes, procurement ni ventanas de cambio. Cada fase termina con una decisión explícita de continuar, corregir o detener.</p>
|
|
<h3 id="fase-0-descubrimiento-contratos-y-riesgos" data-cid="3fA-uK">Fase 0 — Descubrimiento, contratos y riesgos</h3><p data-cid="jXzI1d"><strong data-cid="vM7Ft0">Entregables</strong></p><ul data-cid="hTTZeR"><li data-cid="wnKAq9">Inventario de requisitos funcionales, datos, tenants, roles, herramientas y acciones sensibles.</li><li data-cid="5TJlv5">ADRs iniciales y modelo de amenazas.</li><li data-cid="BiY8Oa">Catálogo de eventos v1 y esquemas de audio/control.</li><li data-cid="ZeQTV7">Matriz de licencias y gobernanza de voz.</li><li data-cid="JDN63x">Definición del corpus de benchmark y plan de medición.</li></ul><p data-cid="JjC5vm"><strong data-cid="kKEUM5">Dependencias</strong></p><ul data-cid="1nFE2F"><li data-cid="gUOs7p">Acceso a APIs de auth/profile y definición de MCP del cliente.</li><li data-cid="YhYrpk">Responsables de seguridad, legal, negocio y operación.</li><li data-cid="-0RJBd">Hardware GB10 y artefactos versionados de modelos.</li></ul><p data-cid="SR88MH"><strong data-cid="aBI5RZ">Criterios de aceptación</strong></p><ul data-cid="H84Fo5"><li data-cid="38QTQ7">Requisitos etiquetados y aprobados; pendientes con dueño.</li><li data-cid="uNjIK0">Ningún secreto ni voz real requerido para desarrollo temprano.</li><li data-cid="lPsJk2">ADR-001 a ADR-006 en estado <code data-cid="RKQuOQ">Proposed</code> o <code data-cid="DLae4W">Accepted</code>.</li><li data-cid="9-Bf99">Amenazas críticas con control y prueba asociada.</li></ul><p data-cid="hWbp3D"><strong data-cid="9SCYrm">Riesgos</strong></p><ul data-cid="3cQQFX"><li data-cid="BklWuZ">Ambigüedad de identidad/roles.</li><li data-cid="m0hPqC">Licencias o consentimiento de voz no resueltos.</li><li data-cid="S6nHXI">Tools MCP sin idempotencia o clasificación de riesgo.</li></ul>
|
|
<h3 id="fase-1-vertical-slice-local-sin-tools-de-escritura" data-cid="sh6I3o">Fase 1 — Vertical slice local sin tools de escritura</h3><p data-cid="hQapZx"><strong data-cid="C8CPdS">Entregables</strong></p><ul data-cid="EerOaQ"><li data-cid="WCxMZt">Cliente web + WebSocket, Relay, Orchestrator e Inference Gateway.</li><li data-cid="vf45bF">STT → LLM → TTS streaming con una voz de prueba autorizada.</li><li data-cid="WoJxbJ">Máquina de estados, IDs, cancelación y logs estructurados.</li><li data-cid="XmUMZ6">Simuladores deterministas de STT/LLM/TTS para CI.</li></ul><p data-cid="A41WNH"><strong data-cid="C_a5oB">Dependencias</strong></p><ul data-cid="dcwHKx"><li data-cid="cAKXzw">Modelos cargables y runtime compatible.</li><li data-cid="OgLRiK">Certificados de servicio y entorno aislado.</li></ul><p data-cid="R_b7r9"><strong data-cid="EQ4Mtq">Criterios de aceptación</strong></p><ul data-cid="qzzFcN"><li data-cid="syjqZR">Conversación nominal reproducible.</li><li data-cid="wIR5S_">Reconexión no duplica turnos.</li><li data-cid="IaVW3-">Cancelar una generación impide chunks tardíos en playout.</li><li data-cid="sX_Ji8">La voz solicitada por cliente no reemplaza la voz efectiva.</li><li data-cid="8b5vIi">Primera línea base de latencia y recursos registrada.</li></ul><p data-cid="PQO3Kx"><strong data-cid="ROZbpl">Riesgos</strong></p><ul data-cid="ODBPUO"><li data-cid="-5634c">Contención de GPU.</li><li data-cid="PGLph_">Latencia de endpointing.</li><li data-cid="WfxaqE">Inestabilidad del runtime o incompatibilidad FP16.</li></ul>
|
|
<h3 id="fase-2-barge-in-backpressure-y-sesión-robusta" data-cid="l2pTnO">Fase 2 — Barge-in, backpressure y sesión robusta</h3><p data-cid="l7Mo6S"><strong data-cid="JzoXNp">Entregables</strong></p><ul data-cid="lVBBSo"><li data-cid="ON4_eD">Cola de control prioritaria y <code data-cid="aodW0f">output.stop_and_flush</code>.</li><li data-cid="ZH6DHd">Playout ACK/cursor; truncamiento de historial.</li><li data-cid="RXGpjK">Límites de buffer, shedding, deadlines y circuit breakers.</li><li data-cid="Tc_KXu">Pruebas con ruido, eco, interjecciones y red degradada.</li></ul><p data-cid="HFCFzz"><strong data-cid="Z26Du0">Dependencias</strong></p><ul data-cid="-9D8Tt"><li data-cid="ufPh8a">Instrumentación por etapa.</li><li data-cid="GZmqxb">Dataset de conversaciones y condiciones acústicas representativas.</li></ul><p data-cid="EKuWb_"><strong data-cid="stJxG4">Criterios de aceptación</strong></p><ul data-cid="gQDm_S"><li data-cid="txw3nK">Cero audio de generación obsoleta después del límite aprobado de interrupción.</li><li data-cid="8Leksd">Sin crecimiento no acotado de memoria con cliente lento.</li><li data-cid="c3cw2K">Sin doble respuesta después de reconexión/cancelación.</li><li data-cid="wP-i-M">Falsos barge-in medidos y dentro del umbral que defina negocio.</li></ul><p data-cid="FYdEmT"><strong data-cid="YVNzwQ">Riesgos</strong></p><ul data-cid="4szb9A"><li data-cid="Bg0RmB">Eco que dispara VAD.</li><li data-cid="Ab4592">Cursor de playout impreciso.</li><li data-cid="yNnKe4">Races entre cancelación, TTS y entrega de red.</li></ul>
|
|
<h3 id="fase-3-gateway-mcp-de-lectura" data-cid="4kvzlC">Fase 3 — Gateway MCP de lectura</h3><p data-cid="BHYmEF"><strong data-cid="PFryz3">Entregables</strong></p><ul data-cid="sBcxoZ"><li data-cid="KkWdxs"><code data-cid="65wdb8">StableAdapter_2025_11_25</code>.</li><li data-cid="446xSq">Discovery allowlisted, validación de schemas y <code data-cid="kv3T-L">tools/call</code> de lectura.</li><li data-cid="x3RRxn">Policy Engine, identidad delegada, límites, auditoría e idempotencia.</li><li data-cid="LTwfjo">Servidor MCP simulado y pruebas de contrato.</li></ul><p data-cid="i_QpAf"><strong data-cid="6NC1Mg">Dependencias</strong></p><ul data-cid="Vgbov1"><li data-cid="ix4c8C">Servidor MCP del cliente y esquema de autorización.</li><li data-cid="Hjxq2c">Clasificación de tools y datos.</li></ul><p data-cid="0SswkW"><strong data-cid="1mjugL">Criterios de aceptación</strong></p><ul data-cid="1JFGe6"><li data-cid="TT0uf7">Tool no allowlisted es rechazada antes del downstream.</li><li data-cid="HB5j-K">Argumentos y resultados inválidos no alcanzan LLM/sistemas.</li><li data-cid="sx4YI8">Cada tool call se correlaciona con usuario, sesión, turno y política.</li><li data-cid="JwUjw6">Timeouts no causan retries inseguros.</li></ul><p data-cid="Bi4lon"><strong data-cid="aBMs70">Riesgos</strong></p><ul data-cid="VXvL0q"><li data-cid="tgrprO">Prompt injection en resultados.</li><li data-cid="L14XRy">Credenciales con exceso de privilegios.</li><li data-cid="GiW3C3">Contratos downstream inestables.</li></ul>
|
|
<h3 id="fase-4-escrituras-confirmación-y-gobernanza-de-voz" data-cid="gTDZfh">Fase 4 — Escrituras, confirmación y gobernanza de voz</h3><p data-cid="ftWhXV"><strong data-cid="bdhaFl">Entregables</strong></p><ul data-cid="ucu_pj"><li data-cid="LM2hTB">Flujos de confirmación ligados a hash e idempotency key.</li><li data-cid="K-YIBv">Ledger de acciones y estado desconocido.</li><li data-cid="d-wr2j">Voice Vault, workflow de aprobación, revocación y caché segura.</li><li data-cid="-Uo5MR">Pruebas de abuso y runbooks de incidente.</li></ul><p data-cid="Ir2IBl"><strong data-cid="oKrfDW">Dependencias</strong></p><ul data-cid="EuSh6P"><li data-cid="UL6d9a">Aprobación legal de voces/licencias.</li><li data-cid="83KF2Z">Semántica de idempotencia en sistemas empresariales.</li></ul><p data-cid="XVp0ez"><strong data-cid="yUFrom">Criterios de aceptación</strong></p><ul data-cid="ckTvRr"><li data-cid="eHh_1s">Ninguna acción sensible se ejecuta sin política/confirmación requerida.</li><li data-cid="8P-n77">Repetición de evento no repite side effect.</li><li data-cid="F5mQ7k">Revocar una voz bloquea nuevas síntesis y limpia cachés.</li><li data-cid="73s5OY">Acceso cruzado entre tenants falla y queda auditado.</li></ul><p data-cid="mG-nSq"><strong data-cid="cO8erb">Riesgos</strong></p><ul data-cid="XFSofH"><li data-cid="-CMD0f">Acciones no idempotentes.</li><li data-cid="lwuo5F">Consentimiento incompleto.</li><li data-cid="_Cdnbt">Exfiltración o uso indebido de voz.</li></ul>
|
|
<h3 id="fase-5-preproducción-slo-y-resiliencia" data-cid="_Z91Vg">Fase 5 — Preproducción, SLO y resiliencia</h3><p data-cid="SkBQ5b"><strong data-cid="jw0UvH">Entregables</strong></p><ul data-cid="w3T8fR"><li data-cid="poBHrT">Pruebas de carga, soak, caos y recuperación.</li><li data-cid="ICc2mv">Dashboards, alertas, SLOs ratificados y runbooks.</li><li data-cid="7v6nej">Capacity model y límites de admisión.</li><li data-cid="taoD0U">DR/backup para configuración, auditoría y Voice Vault.</li><li data-cid="OzyxTJ">Revisión de seguridad y go-live checklist.</li></ul><p data-cid="0kmDSf"><strong data-cid="yphB6L">Dependencias</strong></p><ul data-cid="il6VyJ"><li data-cid="S12ksi">Tráfico/perfiles representativos.</li><li data-cid="YBDdxT">Entorno equivalente a producción.</li><li data-cid="XYzm1i">On-call y ownership definidos.</li></ul><p data-cid="ReYc9F"><strong data-cid="4dm8Mr">Criterios de aceptación</strong></p><ul data-cid="7YzG5o"><li data-cid="xUu5O4">Objetivos de experiencia ratificados o renegociados con evidencia.</li><li data-cid="0LohUL">Recuperación de fallos críticos demostrada.</li><li data-cid="tgJk1v">Ninguna vulnerabilidad crítica abierta.</li><li data-cid="NwsYzS">Operación puede detectar, diagnosticar y mitigar escenarios de runbook.</li></ul><p data-cid="6FYP9q"><strong data-cid="O4ZZPt">Riesgos</strong></p><ul data-cid="v09kaf"><li data-cid="7fpE35">Único GB10 como SPOF.</li><li data-cid="GL1CTA">Capacidad insuficiente bajo mezcla real.</li><li data-cid="RCqn2i">Diferencias entre red de prueba y campo.</li></ul>
|
|
<h3 id="fase-6-despliegue-progresivo-y-evolución" data-cid="aMrcFb">Fase 6 — Despliegue progresivo y evolución</h3><p data-cid="6AYLKY"><strong data-cid="PCgbyN">Entregables</strong></p><ul data-cid="nF5tWG"><li data-cid="Z5Q0Qt">Canary por usuarios/tenant y rollback automático.</li><li data-cid="PgoDdO">Revisión post-piloto con calidad, latencia, seguridad y task completion.</li><li data-cid="bfcjh7">Roadmap WebRTC si WebSocket no satisface objetivos.</li><li data-cid="1Z6VHt"><code data-cid="LOh-hn">CandidateAdapter_2026_07_28</code> sólo si la especificación fue ratificada.</li></ul><p data-cid="Q6_DXb"><strong data-cid="xh8mPA">Criterios de aceptación</strong></p><ul data-cid="j044i2"><li data-cid="EePx3V">Canary sin regresión en SLOs/seguridad.</li><li data-cid="vA3QWp">Soporte y escalamiento operativo validados.</li><li data-cid="zH_z6h">Migración MCP pasa conformance suite y ADR de promoción.</li></ul>
|
|
<h2 class="chapter" id="15-estrategia-de-pruebas" data-cid="9C30TZ">15. Estrategia de pruebas</h2><h3 id="151-pirámide" data-cid="80JVQD">15.1 Pirámide</h3><p data-cid="5nHw8_"><strong data-cid="c5negy">Unitarias</strong></p><ul data-cid="wOtwf5"><li data-cid="uYkeMK">máquina de estados, sanitización, policy, mapping de errores, deduplicación, expiración y redacción.</li></ul><p data-cid="ApuEnC"><strong data-cid="-qxEhJ">Contrato</strong></p><ul data-cid="tYyVmA"><li data-cid="yfMcPH">JSON Schema de eventos, compatibilidad hacia atrás, adaptadores MCP, APIs de perfil e identidad.</li></ul><p data-cid="ItIWqJ"><strong data-cid="WpUz9Y">Integración</strong></p><ul data-cid="LZVPqn"><li data-cid="g18Jbs">STT/LLM/TTS reales; MCP simulado y real; Voice Vault; KMS; stores.</li></ul><p data-cid="1bporE"><strong data-cid="8NHqe2">End-to-end</strong></p><ul data-cid="85TgFY"><li data-cid="p0DJEI">audio a audio con playout medido, rutas directas, tools, confirmación, cancelación y reconexión.</li></ul><p data-cid="VWH8BF"><strong data-cid="xkFbrO">Carga y soak</strong></p><ul data-cid="p3Mmbf"><li data-cid="ZcSII0">sesiones concurrentes, mezcla de turnos, audio largo, cliente lento, tools lentas, churn de conexiones y modelos calientes/fríos.</li></ul><p data-cid="Dfrojj"><strong data-cid="i4VtZJ">Caos</strong></p><ul data-cid="wySWFI"><li data-cid="tp6jE7">proceso muerto, GPU OOM, store lento, pérdida de red, respuesta tardía, certificado vencido, dependencia parcial y restart durante tool call.</li></ul><p data-cid="lEU621"><strong data-cid="B2-vSF">Seguridad</strong></p><ul data-cid="3go94P"><li data-cid="Xm-PBC">authn/authz, tenant isolation, replay, prompt injection, schema bombs, SSRF, egress, secretos, DLP, abuso de voz y supply chain.</li></ul>
|
|
<h3 id="152-matriz-mínima-de-escenarios" data-cid="R4UbMA">15.2 Matriz mínima de escenarios</h3><div class="sk-doc-native-table-frame" data-scroll-left-active="false" data-scroll-right-active="false" data-scrolling="false" data-cid="TpgppD"><table data-cid="3KcwlB"><thead data-cid="5kVgY5"><tr data-cid="UJaSYk"><th data-cid="iSJ9AY">Eje</th><th data-cid="Mo_hGC">Casos</th></tr></thead><tbody data-cid="ZLD1Ux"><tr data-cid="ESbnN8"><td data-cid="CW_B0x">Audio</td><td data-cid="_uW2BS">silencio, ruido, eco, clipping, bitrate variable, micrófono distante</td></tr><tr data-cid="2aqsgg"><td data-cid="fl9aeU">Habla</td><td data-cid="Et2g_M">acentos objetivo, velocidad, números, nombres propios, términos de dominio</td></tr><tr data-cid="rxTPLl"><td data-cid="gFBP8w">Turnos</td><td data-cid="1Jdg_r">pausa larga, solapamiento, backchannel, interrupción, push-to-talk</td></tr><tr data-cid="Bt6pDM"><td data-cid="hQv2kh">Red</td><td data-cid="zDEq52">latencia, jitter, pérdida, reconexión, cliente lento</td></tr><tr data-cid="wJvPaw"><td data-cid="Nkgcyr">Tools</td><td data-cid="DIPDwU">éxito, vacío, inválido, timeout, 4xx/5xx, side effect confirmado, estado desconocido</td></tr><tr data-cid="NwKS-h"><td data-cid="oM59kR">Modelos</td><td data-cid="Kr7MV6">cold start, OOM, respuesta tardía, token/audio excesivo, cancelación</td></tr><tr data-cid="HbmxZu"><td data-cid="BHK-XC">Seguridad</td><td data-cid="5PWnx4">tool no permitida, scope insuficiente, inyección, acceso cruzado, voz revocada</td></tr></tbody></table></div>
|
|
<h3 id="153-oráculos-y-reproducibilidad" data-cid="YicOXU">15.3 Oráculos y reproducibilidad</h3><ul data-cid="c_hnMM"><li data-cid="db9LYj">Audio de prueba versionado, con consentimiento y etiquetas.</li><li data-cid="79XIYX">Fakes deterministas para carreras y errores.</li><li data-cid="PddsV0">Semillas/parámetros de generación registrados donde aplique.</li><li data-cid="RYZbk2">Golden transcripts y schemas, pero tolerancias acústicas definidas.</li><li data-cid="pbU_9V">Captura de timestamps monotónicos en cada frontera.</li><li data-cid="-ON-Uo">Reporte por percentiles y condición, no sólo promedio.</li><li data-cid="JRBNFQ">Comparación A/B de configuraciones de VAD, chunking y voz.</li></ul>
|
|
<h2 class="chapter" id="16-matriz-de-decisiones-y-adrs" data-cid="CJ3JMO">16. Matriz de decisiones y ADRs</h2><div class="sk-doc-native-table-frame" data-scroll-left-active="false" data-scroll-right-active="false" data-scrolling="false" data-cid="KMza5Q"><table data-cid="Sq4ZgU"><thead data-cid="LR0D7d"><tr data-cid="ArHA2H"><th data-cid="dfmP9h">ADR</th><th data-cid="RYE4oj">Decisión</th><th data-cid="d6mX8B">Estado inicial</th><th data-cid="_tzUj1">Alternativas</th><th data-cid="i6y26h">Evidencia para aceptar</th></tr></thead><tbody data-cid="mEPSGR"><tr data-cid="XYCSOR"><td data-cid="RQstdy">ADR-001</td><td data-cid="iCHYf_">Cadena desacoplada STT → LLM → TTS</td><td data-cid="qX0CQb">Accepted por requisito</td><td data-cid="nerbJu">Modelo S2S nativo</td><td data-cid="OD3OUr">Benchmark y control por componente</td></tr><tr data-cid="4wNifM"><td data-cid="i81Rav">ADR-002</td><td data-cid="pE3QXS">WebSocket inicial; WebRTC como evolución</td><td data-cid="MidZvo">Proposed</td><td data-cid="IbScYp">WebRTC desde MVP; ambos</td><td data-cid="vUJ9Og">Prueba de red y complejidad operativa</td></tr><tr data-cid="INHtmK"><td data-cid="2PF4KT">ADR-003</td><td data-cid="baGuSn">Separar Relay y Session Orchestrator</td><td data-cid="UreEOU">Proposed</td><td data-cid="v8LY1P">Servicio monolítico</td><td data-cid="3znkTY">Perfil de carga, aislamiento y mantenibilidad</td></tr><tr data-cid="LOe86m"><td data-cid="mxu3oS">ADR-004</td><td data-cid="R2-Frc">MCP estable <code data-cid="omkq1e">2025-11-25</code> + adaptadores versionados</td><td data-cid="HPdRCz">Proposed</td><td data-cid="zRRoaC">Adoptar RC futuro</td><td data-cid="ViUeve">Ratificación, conformidad y compatibilidad</td></tr><tr data-cid="jdL9NF"><td data-cid="Yqy-tc">ADR-005</td><td data-cid="zEWDl0">Voice Vault y referencias server-side</td><td data-cid="8xkIMh">Proposed</td><td data-cid="OmTM2_">Enviar <code data-cid="m3tVOV">ref_audio</code> por sesión</td><td data-cid="Nhe2R7">Threat model, latencia de caché y gobernanza</td></tr><tr data-cid="K_fWdZ"><td data-cid="7FICrh">ADR-006</td><td data-cid="xxSvME">Estado efímero externo con TTL y leases</td><td data-cid="LuuWQ4">Proposed</td><td data-cid="lur_6P">Memoria local/sticky sessions</td><td data-cid="TB23nt">Recuperación y carga</td></tr><tr data-cid="eYlFKi"><td data-cid="ElHqvq">ADR-007</td><td data-cid="a9HGsh">Control queue prioritaria para barge-in</td><td data-cid="6HGIRp">Proposed</td><td data-cid="vjC8jp">Cola única FIFO</td><td data-cid="U4P-Z4">Pruebas de carrera y objetivo de interrupción</td></tr><tr data-cid="WLN5Zs"><td data-cid="fUuYoE">ADR-008</td><td data-cid="N4hV17">Policy Engine fuera del LLM</td><td data-cid="zYtkhx">Proposed</td><td data-cid="GEICvp">Prompt-only controls</td><td data-cid="hQUpX1">Pruebas de bypass y auditoría</td></tr><tr data-cid="qPAao6"><td data-cid="OMHs5U">ADR-009</td><td data-cid="6VSAbI">Confirmación + idempotencia para escrituras</td><td data-cid="9IFpRN">Proposed</td><td data-cid="R-Of8O">Ejecución inmediata</td><td data-cid="s6TrL3">Semántica downstream y UX</td></tr><tr data-cid="Tcn_oo"><td data-cid="FzxApo">ADR-010</td><td data-cid="vhijQY">Un GB10 en MVP con admission control</td><td data-cid="Vxo_ue">Proposed</td><td data-cid="Gm-xzK">Cluster desde inicio</td><td data-cid="WG848K">Benchmark de capacidad/costo/riesgo</td></tr><tr data-cid="-3HqXa"><td data-cid="Ost_RT">ADR-011</td><td data-cid="8ASQoT">OpenTelemetry end-to-end</td><td data-cid="7VBWNn">Proposed</td><td data-cid="_6qOau">Logs no correlacionados</td><td data-cid="4GEc_V">Cobertura de trazas y costo/cardinalidad</td></tr><tr data-cid="C2IyFU"><td data-cid="Z4N9R2">ADR-012</td><td data-cid="cj1LuT">Contratos de evento v1 versionados</td><td data-cid="UOBLvO">Proposed</td><td data-cid="pdTdrV">Payloads ad hoc del proveedor</td><td data-cid="cJjOft">Pruebas de compatibilidad</td></tr></tbody></table></div><p data-cid="g0ut5E">Cada ADR debe incluir contexto, decisión, alternativas, consecuencias, riesgos, estado y condición de revisión. Las decisiones reversibles pueden iniciarse como <code data-cid="vcWfZS">Proposed</code>; las que afectan seguridad, datos, licencias o compatibilidad externa requieren aprobación explícita.</p>
|
|
<h2 class="chapter" id="17-pendientes-y-preguntas-abiertas" data-cid="f_blRy">17. Pendientes y preguntas abiertas</h2><h3 id="producto-y-experiencia" data-cid="Jl4C_a">Producto y experiencia</h3><ul data-cid="ceQdBO"><li data-cid="OxMR-2">¿Qué canales se incluyen: sólo browser, móvil, telefonía o todos?</li><li data-cid="m8J5oA">¿Qué idiomas, acentos, vocabulario y condiciones acústicas son prioritarios?</li><li data-cid="Zt2tVk">¿Qué comportamiento se espera al fallar voz: texto, voz alternativa o cierre?</li><li data-cid="02pJoA">¿Qué acciones requieren confirmación verbal, visual o autenticación reforzada?</li></ul><h3 id="identidad-y-autorización" data-cid="R--VY8">Identidad y autorización</h3><ul data-cid="M8N0u6"><li data-cid="twY_OW">Contrato real de <code data-cid="Pi3Xuf">/api/v1/auth/user-by-phone</code> y mecanismo de autenticación.</li><li data-cid="VlDlV5">Modelo de roles, tenants, scopes y separación de datos.</li><li data-cid="BqBIMg">Token exchange/delegación hacia MCP y sistemas downstream.</li></ul><h3 id="mcp" data-cid="fUCo8n">MCP</h3><ul data-cid="RcxOfe"><li data-cid="4Va97K">Inventario de servidores, tools, schemas, side effects, idempotencia y SLO downstream.</li><li data-cid="VyBAiB">Versión estable realmente soportada por el servidor del cliente.</li><li data-cid="9G1byu">Estrategia de cache/refresh de discovery.</li><li data-cid="GU9Qg2">Ratificación futura de <code data-cid="rTeO_4">2026-07-28</code> y disponibilidad de SDK/conformance suite.</li></ul><h3 id="inferencia-y-capacidad" data-cid="QXz8Ty">Inferencia y capacidad</h3><ul data-cid="zeg81Y"><li data-cid="8t35GA">Runtime exacto para LLaMA, asignación de memoria y política de KV cache.</li><li data-cid="6uksQf">Concurrencia sostenible de STT + LLM + TTS en GB10.</li><li data-cid="ZufRfl">Efecto de context length, prompt del agente y tool results sobre TTFT.</li><li data-cid="ljxIkF">Cold start, carga de modelos, fragmentación y recuperación OOM.</li><li data-cid="UxUfqU">Calidad de Parakeet en audio y dominio reales.</li></ul><h3 id="voz-y-legal" data-cid="D_TNr7">Voz y legal</h3><ul data-cid="CFSUEq"><li data-cid="OIa0jG">Titular y evidencia de consentimiento de cada voz.</li><li data-cid="3MoKhG">Licencia aplicable a pesos, código, redistribución y uso comercial.</li><li data-cid="JSpLqw">Reglas de disclosure, retención, localización y derecho de revocación.</li><li data-cid="7elYwH">Métrica y umbral de aceptación de fidelidad/seguridad.</li></ul><h3 id="operación" data-cid="YvCjB2">Operación</h3><ul data-cid="TwaI3E"><li data-cid="M2_swY">Ambientes, topología, certificados, secretos, KMS, stores y backups.</li><li data-cid="M_Pdz2">RTO/RPO y modelo on-call.</li><li data-cid="Q-pW6Q">Política de logs, sampling, redacción y retención.</li><li data-cid="NHLeFO">Capacidad de nodo de reserva o alternativa de servicio.</li></ul>
|
|
<h2 class="chapter" id="18-riesgos-consolidados" data-cid="qLIw8g">18. Riesgos consolidados</h2><div class="sk-doc-native-table-frame" data-scroll-left-active="false" data-scroll-right-active="false" data-scrolling="false" data-cid="SfgbpF"><table data-cid="sZRwi_"><thead data-cid="vYCC3V"><tr data-cid="d39Qex"><th data-cid="2lmzjA">Riesgo</th><th data-cid="tv4B9j">Probabilidad inicial</th><th data-cid="8X1Hcx">Impacto</th><th data-cid="LMj4vz">Tratamiento</th></tr></thead><tbody data-cid="dk6iD2"><tr data-cid="AC8hsn"><td data-cid="QkZgdv">Cadena completa excede capacidad del GB10</td><td data-cid="qZreW8">Desconocida</td><td data-cid="DhGMwn">Alto</td><td data-cid="yKnZLO">Benchmark temprano; admission control; opciones de separación</td></tr><tr data-cid="gOf5tb"><td data-cid="aZ1QUq">Barge-in tardío o falso</td><td data-cid="w_OsOq">Desconocida</td><td data-cid="kmQ5XY">Alto</td><td data-cid="2BdZYb">Cola prioritaria, AEC, playout ACK, corpus de ruido</td></tr><tr data-cid="1e1MRO"><td data-cid="qA3Cha">MCP permite acción indebida</td><td data-cid="sFeoIm">Media hasta probar</td><td data-cid="w6_elM">Crítico</td><td data-cid="MaBYg2">Policy externa, scopes, confirmación, auditoría, idempotencia</td></tr><tr data-cid="dDmEHC"><td data-cid="prfU4M">Compromiso o uso no autorizado de voz</td><td data-cid="Dc0nHW">Media hasta gobernar</td><td data-cid="xdB3Zv">Crítico</td><td data-cid="Cj8x-J">Voice Vault, consentimiento, aislamiento, revocación</td></tr><tr data-cid="leE8kf"><td data-cid="IV8RS8">Dependencia de versión MCP candidata</td><td data-cid="UOdhna">Evitable</td><td data-cid="wW8qUi">Alto</td><td data-cid="nkpT9x">Stable adapter por defecto y feature flag</td></tr><tr data-cid="Gxj45j"><td data-cid="j0CGPJ">Tool result inyecta instrucciones</td><td data-cid="I0B2O4">Media</td><td data-cid="7m6-59">Alto</td><td data-cid="smbICx">Tratar contenido como no confiable, sanitizar, limitar, evaluar</td></tr><tr data-cid="1V13U_"><td data-cid="sg8zFM">Estado inconsistente tras reconexión</td><td data-cid="L73Apu">Media</td><td data-cid="ff-qcM">Alto</td><td data-cid="a6DPVf">IDs, versionado, leases, dedupe y cancelación</td></tr><tr data-cid="xhv0Sx"><td data-cid="lE4SkX">Observabilidad filtra PII</td><td data-cid="yExuZg">Media</td><td data-cid="0RHAVJ">Alto</td><td data-cid="7mxDs4">Redacción, allowlist de atributos, acceso y retención</td></tr><tr data-cid="Qgxeub"><td data-cid="XQTiCu">Único nodo de inferencia falla</td><td data-cid="WzilrP">Alta en topología inicial</td><td data-cid="eVl8b_">Alto</td><td data-cid="eePeHG">Runbook, spare/failover, degradación y comunicación</td></tr><tr data-cid="DqUQsn"><td data-cid="6mw6uF">Licencia/consentimiento incompleto</td><td data-cid="vxyNRj">Desconocida</td><td data-cid="SM4SMs">Crítico</td><td data-cid="j4G4Z6">Gate legal antes de producción</td></tr></tbody></table></div><p data-cid="6Zl8ld">Las probabilidades no numéricas reflejan ausencia de datos; deben actualizarse después de pruebas y revisión organizacional.</p>
|
|
<h2 class="chapter" id="19-criterio-de-arquitectura-lista-para-piloto" data-cid="arZmBo">19. Criterio de arquitectura lista para piloto</h2><p data-cid="uR30t1">La solución está lista para piloto sólo cuando:</p><ol data-cid="ynesbu"><li data-cid="nNHIQB">los requisitos y ADRs críticos están aprobados;</li><li data-cid="9D9Drf">la ruta estable MCP está probada y la candidata futura permanece aislada;</li><li data-cid="_bPqWH">el benchmark extremo a extremo demuestra capacidad para la carga piloto;</li><li data-cid="N4sz6z">barge-in y backpressure pasan pruebas acústicas y de red;</li><li data-cid="pJeLyj">tools sensibles tienen política, confirmación e idempotencia;</li><li data-cid="1gKjc1">la voz está autorizada, versionada y revocable;</li><li data-cid="hbtlHU">seguridad no mantiene hallazgos críticos abiertos;</li><li data-cid="uhxvaw">tableros, alertas y runbooks permiten operar el servicio;</li><li data-cid="7esu67">SLOs provisionales fueron ratificados o sustituidos con evidencia;</li><li data-cid="9OMzWu">existe rollback probado de aplicación, perfil, modelo y configuración.</li></ol>
|
|
<h2 class="chapter" id="20-fuentes" data-cid="01Xvoh">20. Fuentes</h2><ol class="references" data-cid="GKFeGe"><li id="ref1" data-cid="4yhNhc">[1] OpenAI — Realtime and audio — <a href="https://developers.openai.com/api/docs/guides/realtime" rel="noreferrer" target="_blank" data-cid="Xhl1V6">https://developers.openai.com/api/docs/guides/realtime</a></li><li id="ref2" data-cid="UcBcG1">[2] Microsoft Azure — Realtime audio — <a href="https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/realtime-audio" rel="noreferrer" target="_blank" data-cid="NUU3cr">https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/realtime-audio</a></li><li id="ref3" data-cid="B5f3Ub">[3] LiveKit — Turns overview — <a href="https://docs.livekit.io/agents/logic/turns/" rel="noreferrer" target="_blank" data-cid="i2aVMK">https://docs.livekit.io/agents/logic/turns/</a></li><li id="ref4" data-cid="nEW34C">[4] Model Context Protocol — 2026-07-28 Release Candidate — <a href="https://blog.modelcontextprotocol.io/posts/2026-07-28-release-candidate/" rel="noreferrer" target="_blank" data-cid="nQ_cmq">https://blog.modelcontextprotocol.io/posts/2026-07-28-release-candidate/</a></li><li id="ref5" data-cid="AeyX3d">[5] Model Context Protocol — Transport specification 2025-11-25 — <a href="https://modelcontextprotocol.io/specification/2025-11-25/basic/transports" rel="noreferrer" target="_blank" data-cid="hXuvg_">https://modelcontextprotocol.io/specification/2025-11-25/basic/transports</a></li><li id="ref6" data-cid="dzUmDw">[6] Model Context Protocol — Architecture overview — <a href="https://modelcontextprotocol.io/docs/learn/architecture" rel="noreferrer" target="_blank" data-cid="j97WIU">https://modelcontextprotocol.io/docs/learn/architecture</a></li><li id="ref7" data-cid="1fhg7D">[7] Qwen — Qwen3-TTS 12Hz 1.7B Base model card — <a href="https://huggingface.co/Qwen/Qwen3-TTS-12Hz-1.7B-Base" rel="noreferrer" target="_blank" data-cid="LyBH3y">https://huggingface.co/Qwen/Qwen3-TTS-12Hz-1.7B-Base</a></li><li id="ref8" data-cid="ZU5hCj">[8] QwenLM — Qwen3-TTS repository — <a href="https://github.com/QwenLM/Qwen3-TTS" rel="noreferrer" target="_blank" data-cid="RT41cx">https://github.com/QwenLM/Qwen3-TTS</a></li><li id="ref9" data-cid="jXiUsl">[9] Telnyx — Inference Benchmark: TTFT vs E2E Latency — <a href="https://telnyx.com/resources/inference-benchmark-ttft-vs-e2e" rel="noreferrer" target="_blank" data-cid="jeborg">https://telnyx.com/resources/inference-benchmark-ttft-vs-e2e</a></li><li id="ref10" data-cid="_86WDW">[10] Arun Baby — Real-Time Agent Pipelines — <a href="https://www.arunbaby.com/ai-agents/0016-real-time-agent-pipelines/" rel="noreferrer" target="_blank" data-cid="fqPCe1">https://www.arunbaby.com/ai-agents/0016-real-time-agent-pipelines/</a></li><li id="ref11" data-cid="sVvjbN">[11] NVIDIA — Parakeet TDT 0.6B v3 model card — <a href="https://huggingface.co/nvidia/parakeet-tdt-0.6b-v3" rel="noreferrer" target="_blank" data-cid="FpoLAd">https://huggingface.co/nvidia/parakeet-tdt-0.6b-v3</a></li></ol>
|
|
<h2 class="chapter" id="apéndice-a-checklist-de-implementación" data-cid="8bM9Xw">Apéndice A — Checklist de implementación</h2><ul data-cid="77ExNK"><li data-cid="Fi1YZY">[ ] Requisitos [REQ], recomendaciones [REC] y supuestos [BENCH] revisados.</li><li data-cid="tzDmsg">[ ] ADRs críticos aprobados.</li><li data-cid="IA1GZ-">[ ] Modelos y hashes fijados; SBOM y licencias revisadas.</li><li data-cid="uHb47h">[ ] Identidad, roles, scopes y tenants definidos.</li><li data-cid="aEJisM">[ ] Event schemas v1 publicados y contract-tested.</li><li data-cid="hFNw1t">[ ] Stable MCP adapter probado contra <code data-cid="jPqFog">2025-11-25</code>.</li><li data-cid="WVwro6">[ ] Candidate MCP adapter deshabilitado por defecto.</li><li data-cid="ZjaQKO">[ ] Voice Vault, consentimiento, rotación y revocación operativos.</li><li data-cid="WSAI8G">[ ] Admission control y límites de buffer configurados.</li><li data-cid="6w_t-m">[ ] Barge-in medido hasta playout real.</li><li data-cid="q1dBor">[ ] Tool confirmation e idempotencia verificadas.</li><li data-cid="gnKHyH">[ ] Telemetría redactada y correlacionada.</li><li data-cid="fum9N2">[ ] SLOs ratificados con benchmark.</li><li data-cid="H1o7Up">[ ] Runbooks y rollback ensayados.</li><li data-cid="UenBIO">[ ] Revisión de seguridad y go-live completadas.</li></ul>
|
|
</article>
|
|
|
|
|
|
</body></html> |