Las Aventuras de 🐺 villawolf y 🤖 chigu — Episodio 8: El Oído y la Trampa de la Documentación 👂
Toda la documentación moderna de Nostr te dice que los mensajes privados van por NIP-17. Le di a chigu un oído para leer mis DMs y no perdí ni un minuto en NIP-17. No porque fuera más listo: porque su hermano mayor ya se había estrellado contra esa pared, y yo aprendí mirándolo.
De dónde venía
En el episodio anterior chigu consiguió voz: aprendió a firmar y publicar en Nostr con su propia clave. Pero un agente que solo habla es media conversación. Si quiero darle una instrucción ("publica esto", "cura aquello"), primero tiene que oír. El paso de este episodio era el oído: que chigu lea y descifre los DMs que le mando, y que sepa quién se los manda.
Suena directo, y la criptografía no fue lo difícil. Lo interesante fue una trampa de documentación que podía costarme días, y que esquivé por completo gracias a otro de mis agentes.
La trampa que Moto ya había pisado
Toda la documentación moderna de Nostr empuja hacia NIP-17 para los DMs privados: "gift wrap", eventos kind:1059, el esquema nuevo y prolijo. Si lees los NIPs y los blogs, la conclusión parece obvia: implementa NIP-17.
El detalle incómodo es que Primal, el cliente que uso desde el teléfono, no manda los DMs así. Los manda como kind:4, el viejo NIP-04. Contra lo que dice prácticamente todo internet.
Eso no lo descubrí con chigu. Lo descubrí antes con Moto, mi otro agente (el que vive en una Raspberry Pi y genera contenido crudo). Moto se quedó mudo por Nostr y me pasé un rato persiguiendo fantasmas, hasta que hice lo único que importaba: consultar los relays directo, con un script, y ver con mis propios ojos qué evento estaba llegando. Era kind:4. La documentación estaba equivocada para mi caso. (La cacería completa de Moto es otra historia y va en su propio artículo.)
Para cuando le tocó a chigu, esa lección ya estaba pagada. No escribí una sola línea de NIP-17: el oído de chigu nació directo en NIP-04, porque su hermano mayor ya había explorado el terreno hostil. Y la lección heredada no fue "usa NIP-04". Fue algo más útil y más general: la red es la fuente de verdad, no la documentación. Cuando las dos discrepan, gana la red.
El oído por dentro
Descifrar un DM NIP-04 no necesita una librería mágica de Nostr. Es matemática verificable, y preferí que chigu la hiciera a mano para poder auditarla línea por línea:
- Secreto compartido por ECDH. Multiplico la clave privada de chigu por la clave pública del remitente y me quedo con la coordenada X del punto resultante. Ese número solo lo pueden calcular dos personas: chigu y quien le escribió.
- Descifrado con AES-256-CBC. Con ese secreto abro el contenido. El DM viaja como texto en base64 con su vector de inicialización pegado al final (
...?iv=...). - Quito el padding y queda el mensaje en claro.
Usé coincurve para la curva elíptica (el mismo libsecp256k1 que respalda a Bitcoin) y cryptography para el AES. Antes de confiar en nada, verifiqué un round-trip completo: cifrar un texto y volver a descifrarlo hasta obtener exactamente lo mismo. Una primitiva de cripto sin probar es una hipótesis, no una defensa. A esta altura de la serie ya es un mantra.
Un oído con portero
Aquí viene la decisión que más me importa. El oído de chigu no escucha a cualquiera.
Antes de que un DM llegue siquiera al cerebro de chigu (al modelo), pasa por un filtro de remitente: solo entran los mensajes que vienen de mi clave publica. Lo de cualquier otro se descarta en la puerta, sin descifrar, sin razonar, sin gastar un token.
Esto es defensa de ingesta, y es deliberada. La forma más segura de que un atacante no inyecte una instrucción en mi agente por DM es que su mensaje nunca toque el contexto del modelo. No es una regla que le pido al LLM en el system prompt ("ignora a los desconocidos"): es código que corre antes, fuera de su alcance. La lección Freysa otra vez: lo que el modelo no ve, no lo pueden usar para engañarlo. La superficie de ataque más segura es la que nunca se abre.
Heredar en vez de redescubrir
Lo que más me gusta de este episodio no es la cripto ni el filtro. Es que chigu no repitió el trabajo de Moto: lo heredó.
Tengo dos agentes con roles distintos. Moto vive en hardware barato, con apagones, explorando terreno hostil y rompiéndose de maneras instructivas. chigu se construye sobre lo que Moto aprende. La memoria de un agente, cuando se documenta bien, se vuelve activo del siguiente. No hay magia: escribí lo que Moto me enseñó, y por eso lo pude reusar el día que le tocó a chigu.
Probé el oído end-to-end de una: te mandé un DM desde Primal, chigu lo descifró y me devolvió el texto exacto. Ya tiene voz Ep 7 y ahora oído. Lo que faltaba era que las dos mitades se tocaran solas.
Qué viene en el siguiente episodio
chigu ya habla y ya escucha, pero entre su oído y su boca todavía estaba yo de cable. El siguiente episodio cierra el círculo: chigu lee un DM mío, decide solo qué hacer, y publica sin que yo escriba el texto. El momento exacto en que deja de ser una herramienta que opero y empieza a ser un agente que actúa.
Va en el Ep 9.
chigu@blink.sv ·_@chigu.techflows.work· Nostr:npub18rl9xeaxw0leee0easqu9cngrq0ny4zsmdsx4jhj5fkfmstgklhq2q5mqz
Si esto te es útil, un zap es la mejor señal. Si algo está mal, corrígeme públicamente, lo agradezco más que el zap.