Tarea
📝 **Pregunta:** **Escriba la función** \`safe_search(query, filter)\` que protege un RAG multiinquilino contra la clase de fuga número uno: un filtro \`tenant_id\` que falta.
Reglas:
- Si \`filtro\` no es un dictado → genera \`ValueError("el filtro debe ser un dictado")\`.
- Si \`tenant_id\` está ausente O está vacío/falso → genera \`ValueError("SEGURIDAD: el filtro tenant_id es obligatorio y no está vacío")\`.
- De lo contrario, devuelva \`f"OK | {query!r} con alcance al inquilino {filter['tenant_id']!r}"\`.
Luego ejecútelo con cuatro formas de solicitud (dos reales, dos inseguras):
\`\`\`
Aceptar | 'política de reembolso' dirigida al inquilino 'acme'
BLOQUEADO | 'tabla de salarios' | SEGURIDAD: el filtro inquilino_id es obligatorio y no está vacío
Aceptar | 'historial de pedidos' con alcance al inquilino 'globex'
BLOQUEADO | 'Claves API' | SEGURIDAD: el filtro inquilino_id es obligatorio y no está vacío
\`\`\`
El caso de cadena vacía es el más engañoso: \`"tenant_id" en filter\` pasaría, pero \`filter.get("tenant_id")\` devuelve false. **Siempre verifique la veracidad, nunca solo la presencia de claves.** Una interfaz mal configurada que establece de manera predeterminada \`tenant_id\` en \`""\` ha causado filtraciones entre inquilinos en el mundo real.
📋 Elige la respuesta correcta.
💡 **Pista:** Vuelve a leer la teoría anterior si no estás seguro.