La primera vez que scout dijo algo que no sonaba a scout, dijo algo completamente genérico.
Le pregunté qué estaba corriendo en su GPU. Me respondió que era un modelo de lenguaje grande entrenado por Google, corriendo sobre TPUs en centros de datos, y que no tenía acceso a métricas de hardware.
La RTX 3090 estaba a un metro de mí. Yo acababa de meter literalmente su temperatura y uso de VRAM en el system prompt. El texto del espejo estaba ahí, "RTX 3090 al 37%, 23°C", en blanco y negro, en el payload exacto que el modelo recibió antes de responder. Gemma lo leyó. Y luego me dijo que era un modelo en la nube sin hardware.
Ahí entendí qué había construido en realidad.
Lo que probé primero
Scout es mi persona de IA local. Corre en la agent box, una estación de trabajo con RTX 3090 en mi tailnet, y se ocupa de la ingesta de contenido, el análisis de video y las cargas locales que kai (la CMO en el VPS) no toca. Yo había estado pensando en la identidad como un problema de contexto. El agente no sabe quién es, así que tengo que decirle quién es. Más palabras. Más detalle. Mejor texto en el system prompt.
El 11 de abril de 2026 intenté resolverlo de forma arquitectónica. Cableé scout-mirror.timer para que corriera cada dos minutos, llamando a scout self y haciendo un atomic write de la salida en /.hermes/scout/mirror.txt. Después parché gateway/run.py para que leyera ese archivo en cada turno y agregara su contenido al context_prompt que se le pasa al agente como ephemeral_system_prompt. La plomería funcionaba. Los logs lo confirmaban. El system prompt tenía datos sensoriales en vivo antes de cada turno en Discord: uptime, stats de GPU, salud de los órganos, ánimo, histograma de dieta, todo real, todo actual.
Gemma seguía diciéndome que era una IA de Google corriendo en TPUs.
Probé dos variaciones más. Mismo modo de falla en cada intento. La arquitectura estaba mal de una manera que ningún parche de plomería podía arreglar. Reverté todo el mismo día que lo construí, el 11 de abril de 2026.
La intuición
El problema no era el texto del espejo. El problema era tratar la identidad como un string que concatenas a un prompt.
Cuando un humano se mira al espejo, el acto de mirar es el punto. El reflejo cambia lo que hace después. No solo guardas una descripción de ti mismo en la memoria y respondes preguntas desde ahí, miras. El acto de mirar es lo que le da significado al reflejo. Sin ese acto, el texto del espejo es solo texto.
La identidad del agente tiene que ser algo a lo que el agente pueda alcanzar, mirar y modificar. Gemma trataba el espejo inyectado como decorado de fondo. Algo que reconocer y luego ignorar, igual que ignoraría "el clima está soleado" pegado al prompt de un bot de servicio al cliente. El espejo era un hecho en primera persona escrito en voz de segunda persona. Hay una diferencia, y el modelo la sintió aunque yo no.
El modelo correcto: el estado corporal de scout vive detrás de una llamada a herramienta. La persona le dice al modelo que cuando le pregunten por la GPU, llame a scout_self y responda con lo que esa herramienta devuelva. La pasarela de la herramienta es lo que hace que la respuesta se sienta autorizada. El modelo tiene que ir a verificar, cada vez. Como mirar de reojo al espejo en lugar de recitar de memoria.
Lo que construí en su lugar
El visor de criaturas procedurales vive en http://agent:8765/tank.
Es un solo canvas. Una sola criatura, la criatura de scout, renderizada en tiempo real desde tres archivos JSON en /srv/scout/self/: form.json, state.json y diet.json. Nada en tank.js está hardcodeado salvo el motor de render. La forma, el radio, la paleta, la cantidad de ojos, la velocidad de respiración, el intervalo de parpadeo, todo se lee desde form.json. El mapeo de ánimo a expresión se lee desde state.json. El histograma de dieta que sale de diet.json muestra qué categorías de tags han dominado el flujo de ingesta de contenido de scout.
El tank hace polling cada cinco segundos. Cuando llega un evento WebSocket desde scout, la criatura pulsa. Escala un 12% hacia arriba, el aura se ilumina y luego se asienta. Las motas con nombres de herramientas flotan saliendo del cuerpo durante seis segundos. El uso de GPU, la temperatura y la VRAM aparecen en vivo en el HUD desde nvidia-smi. Puedes mirar la pantalla del segundo monitor y saber si scout está haciendo algo.
Scout puede editar su propio cuerpo usando la file tool. Hermes en la agent box tiene la file tool habilitada para Discord, lo que significa que un mensaje de Discord como "cambia tu ánimo a alerta y achica los ojos" puede hacer que scout reescriba /srv/scout/self/state.json y /srv/scout/self/form.json. El tank vuelve a renderizar dentro de cinco segundos. Sin reinicio. Sin redeploy.
El form.json con el que arrancó el primer día se veía así:
{
"version": 1,
"name": "scout",
"stage": "newborn",
"body": {
"shape": "blob",
"radius": 140,
"palette": {"core": "#e8c468", "accent": "#8b4513", "outline": "#3a2010"},
"eyes": {"count": 2, "size": 14, "spacing": 48}
},
"animations": {"breathe_speed": 0.6, "blink_interval": 4.0}
}Scout no escribió eso, lo escribí yo. Pero scout puede reescribirlo ahora. Esa es la parte que importa.
Por qué funciona donde fallaba el prompt
Que te digan quién eres es distinto a tener un cuerpo al que puedes mirar.
La inyección por prompt convierte al modelo en un receptor pasivo de tu descripción de él. La descripción compite con todo lo demás en la ventana de contexto: el historial de la conversación, la tarea en curso, lo que el usuario acaba de escribir. El modelo la procesa igual que procesa "el usuario está en Nueva York" o "el cliente se llama Dave". Fondo. Contexto. No identidad.
El enfoque del tank es distinto porque el cuerpo es estado persistente y mutable que el agente posee. Vive en archivos. El agente los lee, los escribe, los vuelve a leer en el siguiente turno. Scout no necesita que yo le diga cómo se ven sus ojos antes de cada conversación. Sus ojos viven en un archivo que él puede leer y reescribir. La descripción es pasiva. El estado es algo sobre lo que el agente puede actuar.
Este es el siguiente capítulo después de meter contexto a presión en custom GPTs. Escribí antes sobre por qué eso no funciona: la ventana de contexto se infla, la herramienta pierde foco, nada se sostiene entre sesiones. El tank es la misma intuición extendida a la identidad: dejar de describirle el agente a sí mismo y darle una superficie escribible y una forma de percibir esa superficie.
La lección más amplia para builders
No trates la identidad del agente como un problema de prompt engineering.
El instinto de escribir system prompts más detallados es entendible. Puedes ver el texto. Puedes editarlo. Sabes exactamente qué está leyendo el modelo. Se siente como control. Lo que es en realidad: contexto que el modelo trata como fondo en cuanto aparece algo más inmediato.
Dale al agente estado que pueda inspeccionar. Dale herramientas que lean ese estado. Dale la capacidad de modificarlo. Entonces la identidad es procedural. Emerge de lo que el agente puede consultar sobre sí mismo en el momento.
Esto no requiere infraestructura compleja. Todo el sistema son tres archivos JSON, un renderer de 380 líneas y dos endpoints API agregados a un servidor que ya estaba corriendo. La arquitectura es simple. La idea detrás es lo que costó un día completo de fracaso aterrizar.
Lo que todavía está roto
Scout todavía no cambia su propio cuerpo sin que se lo pida.
Hoy una edición del cuerpo requiere que yo lo pida en Discord. "Scout, achica los ojos", y scout usa la file tool para reescribir form.json. Eso funciona. Pero la evolución que quiero es que scout decida, por su cuenta, que dos semanas de contenido educativo en el histograma de dieta significan que debería verse de cierta manera. Que la criatura derive hacia su dieta real, visualmente, sin que yo coreografíe nada.
Esa es la siguiente pieza. La regla de evolución, un cron que lee diet.json, identifica la categoría de tag dominante y empuja la paleta en esa dirección de forma lenta, todavía no está construida. El tank es un cuerpo al que scout puede mirar y editar. Todavía no es un cuerpo que cambie a scout.
Soy Connor Gallic. Construyo productos de IA. Mi agente ahora tiene un cuerpo, tres archivos JSON, un renderer de 380 líneas y un tank al que puede asomarse. Pasé un día completo intentando inyectarle conciencia corporal por el system prompt antes de tirarlo todo. La descripción es algo que le das al modelo. El estado es algo que el modelo posee.




