¿Qué usa CocoSession internamente para impulsar el cliente del SDK?#
Answer
B — CocoSession posee un threading.Thread llamado coco-session que ejecuta un bucle asyncio envolviendo CortexCodeSDKClient.
Q2Multiple choice
¿Qué invariante permite que examples/headless_pipeline.py se ejecute desde una terminal simple sin Streamlit instalado?#
Answer
A — Los símbolos headless principales se importan sin cargar Streamlit; los exports de la interfaz se resuelven de forma perezosa mediante __getattr__/_LAZY_ATTRS, que es lo que permite que headless_pipeline.py funcione sin Streamlit instalado.
Q3Multiple choice
Cuando una llamada a herramienta necesita aprobación, ¿qué se bloquea exactamente, y hasta cuándo?#
Answer
B — can_use_tool bloquea el hilo worker en PermissionManager.wait_for_decision() hasta que se resuelve o transcurre approval_timeout_seconds.
Q4Multiple choice
¿Qué campos aplica en hash CocoOptions.options_hash(), y para qué se usa?#
Answer
B — options_hash() aplica hash solo a los campos que afectan a los permisos de herramienta; el worker se reinicia solo cuando ese hash cambia, no en cada edición de opciones.
Q5Multiple choice
¿Por qué app_viewer() nunca importa copilot_rail() (y viceversa)?#
Answer
B — Este es un invariante documentado: el componente de vista previa se mantiene agnóstico del anfitrión y no conoce las colas de trabajos.
Q6Multiple choice
¿Qué familias de herramientas están tratadas como caso especial en permissions.py para crear siempre una solicitud de aprobación nueva, ignorando cualquier "always allow" previo?#
Answer
B — permissions.py trata como caso especial a AskUserQuestion y ExitPlanMode para crear siempre una solicitud nueva, sin importar un "always allow" previo.
Q7Multiple choice
¿Qué mensaje transporta SnowflakeConfigNotFoundError?#
Answer
B — Este es el texto exacto del mensaje de SnowflakeConfigNotFoundError.
Q8Multiple choice
¿Qué excepción se lanza cuando se encuentra un binario cortex en una ruta configurada pero no responde correctamente a --version?#
Answer
B — CLIProbeError significa específicamente que el binario existe pero no respondió a --version; CLINotFoundError cubre el caso de no estar en PATH.
Q9Multiple choice
¿En qué se diferencia SessionStartError de SessionNotReadyError?#
Answer
B — SessionStartError es un error de worker que falla al arrancar; SessionNotReadyError cubre el timeout/fallo de arranque una vez iniciado.
B — CwdUploadError se lanza igualmente por nombres incorrectos, extensiones no permitidas, payloads de tamaño excesivo y conflictos de sobrescritura.
Q12Multiple choice
¿Qué excepción es también un TimeoutError, además de un CocoError?#
Answer
B — ApprovalTimeoutError está documentado como también TimeoutError.
Q13Multiple choice
En el modelo de amenazas STRIDE, ¿qué severidad se asigna a la inyección de prompt que dispara herramientas peligrosas, y qué la mitiga?#
Answer
B — La inyección de prompt se califica de severidad alta; las puertas de aprobación que interceptan antes de la ejecución son la mitigación principal, junto con la recomendación de un rol de mínimo privilegio.
Q14Multiple choice
¿Qué severidad y mitigación aplican al riesgo de escalada de "Always allow"?#
Answer
B — La escalada de "Always allow" es de severidad media, mitigada puramente por su alcance por herramienta/por sesión.
Q15Multiple choice
¿Cuál es el estado del riesgo de repudio (sin registro persistido de acciones destructivas aprobadas)?#
Answer
B — El repudio es de severidad media, abierto como SEC-01 — no se escribe nada duradero fuera del estado de sesión en memoria.
Q16Multiple choice
¿Cómo se mitiga el riesgo de divulgación de información de secretos que aparecen en la transcripción/logs?#
Answer
B — La mitigación es que la librería nunca registra credenciales y el SDK las redacta de su propia salida.
Q17Multiple choice
¿Qué riesgo de cadena de suministro señala el modelo de amenazas, y cómo se mitiga?#
Answer
A — El riesgo señalado es la elevación de privilegios mediante una dependencia comprometida; la mitigación es pip-audit, Gitleaks, y un uv.lock confirmado.
Q18Multiple choice
Según la orientación de "Roles and grants", ¿por qué se desaconseja conectar con ACCOUNTADMIN (o un grant como MANAGE WAREHOUSES), incluso con puertas de aprobación en su lugar?#
Answer
A — Las puertas de aprobación solo deciden si una sentencia se ejecuta; una vez aprobada, su alcance está limitado únicamente por los grants reales del rol conectado.
Q19Select all that apply
¿Cuáles de estos quedan explícitamente fuera de alcance para el pack de guías de este producto, según la decisión de alcance de los módulos de forma? (Opción múltiple — selecciona todas las que apliquen)#
Answer
A, B, C, F — A, B, C, F
Q20Multiple choice
¿Qué objetivos de despliegue considera el modelo de amenazas, y cuáles se lanzan realmente hoy?#
Answer
C — El modelo de amenazas considera local/SiS/SPCS, pero solo local se lanza realmente; SiS/SPCS son solo alcance del modelo de amenazas y de la hoja de ruta.
Q21Multiple choice
¿Por qué omite el pack de guías un capítulo de "Infrastructure as code"?#
Answer
B — El motivo de alcance dado es simplemente que no existe ningún archivo *.tf en ningún lugar del repositorio.
Q22Multiple choice
¿Por qué trata reference-examples cada una de las tres apps de ejemplo como una sola sección, en lugar de documentar cada página interna de Streamlit de cada app?#
Answer
A — La decisión de alcance explícita es un H2 por app de ejemplo, para evitar repetir los README de los ejemplos página por página.
B — text_renderer acepta un nombre preestablecido o un callable en panel() y los helpers de visualización relacionados.
Q24Multiple choice
¿Cómo decide la librería cómo renderizar la tarjeta de una herramienta desconocida o provista por MCP?#
Answer
B — El despacho tool_family(name) en tool_names.py mapea nombres de herramienta a un ToolFamily, consumido por tool_cards.py/tool_extract.py para el renderizado.
Q25Multiple choice
¿Cómo permite App Builder que un "type" aporte su propia guía de CoCo a un trabajo de generación?#
Answer
B — Cada carpeta de type puede llevar su propio SKILL.md (+ reference/checklist), montado vía add_dirs, más un types/shared/SKILL.md compartido.
Q26Multiple choice
¿Qué decide si el paso de perfilado de un type de App Builder es un parser determinista o un trabajo de CoCo?#
Answer
B — grounding_kind decide: tabular usa el parser determinista engine/profile.py, los demás tipos pasan por CoCo.
Q27Multiple choice
¿Quién obtiene las fuentes de grounding de "documents" o "urls" de App Builder — la sesión de CoCo o la app anfitriona?#
Answer
B — Los documentos/URLs los obtiene la app anfitriona; a la sesión de CoCo no se le concede ninguna herramienta de red.
Q28Multiple choice
Un colega pregunta por qué el repositorio no necesita un capítulo reference-commands de flags de CLI como lo tendría una herramienta CLI típica. ¿Cuál es la explicación correcta?#
Answer
B — La superficie principal de la librería es la API de Python, no un CLI; los objetivos del Makefile reciben reference-commands para las demos, mientras que la API es el propio análogo de "Commands" de la librería.
Q29Multiple choice
Dos repositorios están involucrados en el lanzamiento a PyPI hoy. ¿Cuál es el arreglo actual (temporal), y por qué?#
Answer
B — lletourmy/streamlit-coco es la superficie de release pública temporal etiquetada para la publicación en PyPI, hasta que DevoteamSP/streamlit-coco esté validado para PyPI.
Q30Multiple choice
Enseñando a un nuevo miembro del equipo el flujo de release: ¿qué paso viene inmediatamente después de que DRY_RUN=1 make sync-release se vea correcto?#
Answer
B — Tras un dry run limpio, el siguiente paso documentado es la sincronización confirmada/enviada, y luego etiquetar vX.Y.Z en lletourmy/streamlit-coco, nunca en -dev.
Every answer is also reachable per question above. This section keeps the full key for offline review and printing.
Show the complete answer key
A1
B — CocoSession posee un threading.Thread llamado coco-session que ejecuta un bucle asyncio envolviendo CortexCodeSDKClient.
A2
A — Los símbolos headless principales se importan sin cargar Streamlit; los exports de la interfaz se resuelven de forma perezosa mediante __getattr__/_LAZY_ATTRS, que es lo que permite que headless_pipeline.py funcione sin Streamlit instalado.
A3
B — can_use_tool bloquea el hilo worker en PermissionManager.wait_for_decision() hasta que se resuelve o transcurre approval_timeout_seconds.
A4
B — options_hash() aplica hash solo a los campos que afectan a los permisos de herramienta; el worker se reinicia solo cuando ese hash cambia, no en cada edición de opciones.
A5
B — Este es un invariante documentado: el componente de vista previa se mantiene agnóstico del anfitrión y no conoce las colas de trabajos.
A6
B — permissions.py trata como caso especial a AskUserQuestion y ExitPlanMode para crear siempre una solicitud nueva, sin importar un "always allow" previo.
A7
B — Este es el texto exacto del mensaje de SnowflakeConfigNotFoundError.
A8
B — CLIProbeError significa específicamente que el binario existe pero no respondió a --version; CLINotFoundError cubre el caso de no estar en PATH.
A9
B — SessionStartError es un error de worker que falla al arrancar; SessionNotReadyError cubre el timeout/fallo de arranque una vez iniciado.
A10
B — context= ("session_start", "session_ready"/"session", "query", "approval") guía hacia qué subclase CocoError mapea la detección de mensaje.
A11
B — CwdUploadError se lanza igualmente por nombres incorrectos, extensiones no permitidas, payloads de tamaño excesivo y conflictos de sobrescritura.
A12
B — ApprovalTimeoutError está documentado como también TimeoutError.
A13
B — La inyección de prompt se califica de severidad alta; las puertas de aprobación que interceptan antes de la ejecución son la mitigación principal, junto con la recomendación de un rol de mínimo privilegio.
A14
B — La escalada de "Always allow" es de severidad media, mitigada puramente por su alcance por herramienta/por sesión.
A15
B — El repudio es de severidad media, abierto como SEC-01 — no se escribe nada duradero fuera del estado de sesión en memoria.
A16
B — La mitigación es que la librería nunca registra credenciales y el SDK las redacta de su propia salida.
A17
A — El riesgo señalado es la elevación de privilegios mediante una dependencia comprometida; la mitigación es pip-audit, Gitleaks, y un uv.lock confirmado.
A18
A — Las puertas de aprobación solo deciden si una sentencia se ejecuta; una vez aprobada, su alcance está limitado únicamente por los grants reales del rol conectado.
A19
A, B, C, F — A, B, C, F
A20
C — El modelo de amenazas considera local/SiS/SPCS, pero solo local se lanza realmente; SiS/SPCS son solo alcance del modelo de amenazas y de la hoja de ruta.
A21
B — El motivo de alcance dado es simplemente que no existe ningún archivo *.tf en ningún lugar del repositorio.
A22
A — La decisión de alcance explícita es un H2 por app de ejemplo, para evitar repetir los README de los ejemplos página por página.
A23
B — text_renderer acepta un nombre preestablecido o un callable en panel() y los helpers de visualización relacionados.
A24
B — El despacho tool_family(name) en tool_names.py mapea nombres de herramienta a un ToolFamily, consumido por tool_cards.py/tool_extract.py para el renderizado.
A25
B — Cada carpeta de type puede llevar su propio SKILL.md (+ reference/checklist), montado vía add_dirs, más un types/shared/SKILL.md compartido.
A26
B — grounding_kind decide: tabular usa el parser determinista engine/profile.py, los demás tipos pasan por CoCo.
A27
B — Los documentos/URLs los obtiene la app anfitriona; a la sesión de CoCo no se le concede ninguna herramienta de red.
A28
B — La superficie principal de la librería es la API de Python, no un CLI; los objetivos del Makefile reciben reference-commands para las demos, mientras que la API es el propio análogo de "Commands" de la librería.
A29
B — lletourmy/streamlit-coco es la superficie de release pública temporal etiquetada para la publicación en PyPI, hasta que DevoteamSP/streamlit-coco esté validado para PyPI.
A30
B — Tras un dry run limpio, el siguiente paso documentado es la sincronización confirmada/enviada, y luego etiquetar vX.Y.Z en lletourmy/streamlit-coco, nunca en -dev.