Abrí el JSON de la política de ejecución generada y lo primero que vi fue el tipo de forma de permiso que se ve bien con un tamaño de prueba del 2% y una locura en el momento en que hay liquidez real detrás.
El agente tenía resolución de rutas, estado del puente, objetivo del vault, ruta del firmante y una política de escritura que básicamente pretendía que 'contract_call' es un permiso normal. No lo es. Es el campo de creep de permisos. El que comienza como prueba de depósito y luego se convierte en el lugar donde alguien olvida bloquear el selector, amplía el rol de IAM, añade lógica de reintentos y de repente un agente autónomo puede hacer más de lo que la ruta jamás necesitó.
Solo quería que OctoClaw tocara un único activo puenteado, un vault ERC 4626 aprobado, un selector de función, una cantidad limitada, con revisión manual si el gas saltaba o el mapeo del token volvía raro. No una llamada de router genérica. No un rol de ejecutor de estrategia con un nombre amigable. No acceso directo del firmante porque “el modelo ya conoce la ruta”.

El selector fue toda la pelea.
deposit() estuvo bien. En términos de política cruda, eso significó permitir 0xb6b55f25 y nada más. No quería withdraw(), redeem(), rebalance(), llamadas auxiliares, barrido de vault, auto-exit, o alguna rutina de “seguridad” posterior que se añade porque un dev piensa que el agente debería recuperarse de un mal llenado por sí mismo. Si el agente necesita algo más allá de depositar para completar la ruta, quiero que falle ruidosamente antes de que se muevan los fondos.
La primera política era demasiado permisiva alrededor del límite del firmante. Lee los datos del mercado, lee el estado del puente, lee el estado del vault, bien. Escribe solo a través del wrapper restringido. El wrapper verifica APPROVED_ASSET, APPROVED_VAULT, ALLOWED_SELECTOR, MAX_DEPOSIT, GAS_LIMIT_WEI, y si AUTO_RETRY es falso antes de que la llamada se acerque a la ejecución. Si falta alguno de esos, es nulo, está desactualizado, o lo llena el agente en lugar de la configuración, la llamada muere.
Tuve que mirar eso más tiempo del que esperaba porque la ruta en sí parecía correcta. El Puente EVM tenía el activo aterrizando donde se esperaba, OctoClaw tenía la señal, el vault aceptaba depósitos, y la simulación devolvía verde. Ese es exactamente el tipo de configuración que hace que la gente afloje los permisos demasiado pronto. Todo funciona, así que el límite se trata como limpieza.
El mapeo del puente fue donde me molestó más. Si el identificador del activo envuelto no coincide con el token aprobado después de la liquidación del puente, no me importa si la estrategia es correcta. Bloquéalo. Si la dirección del vault se resuelve pero el ID de la cadena no es el que fijé, bloquéalo. Si la estimación de gas se dispara después de la liquidación y el agente quiere volver a intentarlo con un techo más amplio, bloquéalo y hazme aprobar el reintento manualmente. No quiero un camino de recuperación automatizado que convierta un pequeño fallo de ruta en manipulación del estado a nivel de wallet.

El hecho de que el ERC 4626 se esté estandarizando casi hace que esto sea peor porque te engaña haciéndote pensar que la superficie del vault es ordenada. La interfaz es ordenada. Los permisos no lo son. depositar y redimir sentados cerca el uno del otro en el mismo cubo mental es cómo terminas dando a un agente de trading capacidad de salida cuando todo lo que necesitabas era entrada limitada.
La versión fea que dejé en su lugar es lo suficientemente simple como para auditar mientras estoy cansado. OctoClaw puede leer ampliamente, preparar la ruta y proponer el depósito, pero la ejecución es tonta y estrecha. El activo debe coincidir. El vault debe coincidir. El selector debe coincidir. La cantidad debe mantenerse por debajo del límite. El gas debe mantenerse por debajo del techo. El reintento sigue siendo manual. Cualquier otra cosa se rechaza.
Todavía no me siento completamente cómodo con esto, que probablemente es el estado correcto en el que estar.
El registro que quería ver no era éxito. Era esto:
execution_rejected | reason=cap_exceeded | selector=0xb6b55f25 | vault=approved | asset=approved | auto_retry=false | manual_review=true
Dejarlo funcionando durante la noche con ese límite aún se siente tonto, pero menos tonto que dejar que un modelo decida qué significa “acceso al vault”.
