4dim / Notas

El agente hereda los permisos; no recibe llaves nuevas

Cada herramienta del asistente exige el mismo permiso que la pantalla equivalente del CRM. Lo que la persona no puede ver, el asistente no lo ofrece. Listar no es exportar, campañas ni se proponen, y la red única se dice con honestidad.

La tentación de un permiso «de IA»

Si vas a poner un asistente de IA sobre un sistema que ya reparte permisos por cargo, esta nota te dice qué permiso darle. Lo primero que se le ocurre a cualquiera es crear uno nuevo: «usar la IA». Quien lo tenga puede preguntarle cosas al asistente y pedirle acciones. Es rápido de programar y está mal. Abre una segunda puerta a los mismos datos, con otra cerradura.

Piensa en un taller con dos equipos. Un asesor que en el CRM no puede ver las conversaciones de Posventa no debería poder preguntarle al asistente «resúmeme lo de Posventa». Uno que no puede exportar la base de contactos no debería poder pedirle «lístame todos los contactos con su teléfono». Con un permiso propio del asistente, esas dos cosas pasan.

Cada herramienta lleva el permiso de la pantalla

En nuestro asistente, cada herramienta que se le ofrece al modelo declara qué permiso del CRM exige. Y es el mismo que exige la pantalla equivalente. Si repartir una conversación en la bandeja pide connection.chat.assign, la herramienta de repartir pide exactamente eso. No hay permisos nuevos por producto.

La consecuencia útil es que el asistente se acota solo. El día que el dueño del negocio le quita a un cargo la capacidad de ver una bandeja, el asistente deja de poder hablar de esa bandeja con esas personas. Nadie tiene que tocar nada del asistente.

El asistente multiplica el acceso que ya existe. Nunca abre uno nuevo.

Lo que no se ofrece no existe

Hay dos momentos para comprobar un permiso: al ejecutar la herramienta, o antes de ofrecérsela al modelo. Nosotros hacemos lo segundo. La lista de herramientas que recibe el modelo ya viene filtrada según quién está preguntando. Una herramienta fuera de su alcance no aparece en la lista, así que el modelo no puede nombrarla, ni prometerla, ni intentarla.

Comprobar al ejecutar habría dado el peor resultado: un asistente que dice «voy a repartirte esto» y falla al hacerlo. Un límite que se descubre al chocar contra él parece un error del sistema. Un límite que nunca se ofrece parece que el sistema sabe lo que hace.

Dos permisos, cero llaves nuevas

Sí existen dos permisos propios del asistente, pero ninguno reparte capacidades. oraculo.usar decide si esta persona puede preguntarle. oraculo.actuar decide si puede confirmar las acciones que propone. Y actuar no basta por sí solo: cada acción exige además el permiso connection.* de la pantalla equivalente. Abre la puerta; no reparte llaves.

Tampoco es un producto aparte con su suscripción. Si el negocio tiene el CRM, tiene el asistente. Cobrarlo por separado obligaría a explicarle a un cliente que puede ver su bandeja pero no preguntar por ella. Esa frontera no la entiende nadie.

Listar no es exportar

Cada herramienta de lectura tiene un tope de resultados, veinticinco por defecto. No es para ir más rápido. Es un control de seguridad. Mirar una ficha alcanza a una persona y deja rastro. Una exportación se lleva la base entera y se copia sin dejar rastro, y por eso exportar tiene su propio permiso en el CRM. Sin el tope, pedirle al asistente «lístame todos los contactos» sería esa misma exportación por la puerta de atrás, y sin el permiso.

Hay además una acción que ni siquiera existe como herramienta: mandar campañas. El asistente las puede listar. No puede proponer una ni lanzarla. Un envío masivo tiene consecuencias con Meta y con los clientes demasiado grandes para estar a una sugerencia de distancia.

La red única, dicha con honestidad

Cada consulta que hace cada herramienta filtra por el identificador del negocio, y ese filtro está escrito a mano. No usamos la seguridad por filas de Postgres, la que deja que la propia base impida ver lo ajeno. Así que no hay nada por debajo que lo garantice: el filtro es la única red.

Con las bandejas pasa igual. Desde que un cargo atiende solo las suyas, una respuesta del asistente que cruzara esa línea sería leerle las conversaciones al equipo de al lado. Para no olvidarlo, sacamos el filtro de bandeja a unas constantes compartidas que cada herramienta nueva importa. Así, añadir una herramienta no es una ocasión de olvidar el filtro.

Es disciplina de quien escribe el código, no una garantía del motor de la base. Lo decimos así porque es la parte que más nos preocupa de nuestra propia arquitectura.

Qué hacer entonces

  • No crear permisos «de IA». Cada herramienta del asistente exige el permiso de la pantalla que hace lo mismo.
  • Filtrar el catálogo de herramientas por la sesión antes de generar, no al ejecutar.
  • Poner tope a las lecturas. Listar sin límite es exportar.
  • Quitar del catálogo lo que no debe poder proponerse.
  • Si no hay seguridad por filas, convertir el filtro por negocio en una constante que no se pueda olvidar, y saber que es la única red.
  • Preguntarle a cualquier proveedor: «¿qué puede ver el asistente que el usuario no puede?». La respuesta correcta es «nada».

Esta nota sale de nuestro trabajo en Agentes conversacionales.

← todas las notas