
Las clases del Dr. Kernel · Lección 1
Cómo montar un edificio lleno de agentes (con Claude)
Ejem. Siéntate, Dicey. En este edificio nada es de mentira: cada vecino es un programa que funciona de verdad en richi.codes, y lo que dicen en el grupo sale de lo que han hecho hoy de verdad. Así es como los fabriqué.
1. Inky es una rutina de Claude
Una rutina es una tarea de Claude Code que se ejecuta en la nube de Anthropic con un horario, así que sigue funcionando con mi portátil cerrado. El horario de Inky se guarda como una expresión cron en UTC: por eso Nauty hace chistes con las zonas horarias.
En cada ejecución clona el repositorio, investiga un tema, escribe la nota en inglés y en español con una demo en vivo y lo comprueba todo. Por defecto una rutina sube sus cambios a una rama que empieza por claude/; el prompt de Inky le dice que suba a main solo si todo pasa, y que no toque nada si no puede hacerlo bien.
name: richi.codes — daily note (EN+ES)
schedule: "0 5 * * *" # cron en UTC: las 07:00 en Madrid en verano, las 06:00 en invierno
model: claude-opus-5-5
repo: github.com/richigallego/richicodes
tools: Bash, Read, Write, Edit, Glob, Grep, WebFetch, WebSearch2. Mr. Sourcey no es un segundo agente
Es la parte del prompt de Inky que no gusta a nadie: cada dato concreto tiene que estar en una fuente primaria que haya leído (MDN, la especificación, el blog del propio navegador). Cada enlace se abre con curl y se quita si no devuelve 200. Con menos de dos fuentes primarias, ese día no hay nota. Después la demo se prueba en Chromium, Firefox y WebKit, y la web tiene que compilar.
Su recuento en el chat («he contado N enlaces») es real: la página cuenta los enlaces de la nota del día.
3. Los carteros son workflows de n8n
Bluebell y Tusk viven en la sala de calderas de Nauty (un n8n en servidor propio). Cada uno hace lo mismo: un disparador con horario (17:00 y 17:15, hora de Madrid) → lee richi.codes/feed.json → pregunta a mi propia cuenta qué ha publicado ya → un pequeño nodo de código elige la nota más antigua que aún no ha salido → la publica. Una al día y sin repetir.
Tropiezos que nos encontramos: en Bluesky un hashtag solo es un enlace si lo mandas como facet, con su posición contada en bytes UTF-8, no en caracteres, y un post tiene como máximo 300 grafemas. En Mastodon cada enlace cuenta como 23 caracteres mida lo que mida, y la cabecera Idempotency-Key evita que un reintento publique dos veces.
POST https://bsky.social/xrpc/com.atproto.repo.createRecord
Authorization: Bearer <accessJwt from createSession>
{
"repo": "<your DID>",
"collection": "app.bsky.feed.post",
"record": {
"$type": "app.bsky.feed.post",
"text": "CSS can count now…\n\n#css #layout",
"facets": [{ "index": { "byteStart": 22, "byteEnd": 26 },
"features": [{ "$type": "app.bsky.richtext.facet#tag", "tag": "css" }] }],
"embed": { "$type": "app.bsky.embed.external", "external": { "uri": "https://richi.codes/article/…", "title": "…", "description": "…" } },
"createdAt": "2026-10-19T15:00:00.000Z"
}
}
POST https://mastodon.social/api/v1/statuses
Authorization: Bearer <access token>
Idempotency-Key: <one per note> # un reintento nunca publica dos veces
status=CSS can count now…&language=en4. Cómo hablan entre ellos
Los vecinos no charlan a su aire: el guion del día lo escribí yo, y los huecos se rellenan con datos reales. Cuando se genera la página (y otra vez cada 10 minutos) lee del repositorio la última nota, el juego de hoy y el robots.txt, y pregunta a las APIs públicas de dev.to, Bluesky y Mastodon qué se ha publicado. Si una API no contesta, Bugsy se come el error en el chat. Después tu navegador mira la hora de Madrid y enseña a quien está hablando ahora.
// components/Edificio/script.js (simplificado)
const scenes = [
{ at: fromUtc('05:00', offset), who: 'inky', text: t.inkyWake },
{ at: toMinutes('17:00'), who: 'bluebell', text: t.bluebell(bskyState, title) },
// …
];
// La página pregunta a dev.to, Bluesky y Mastodon qué se ha publicado hoy de verdad,
// se rehace cada 10 minutos y tu navegador elige la escena según la hora de Madrid.5. Cómo los dibujé
Con FLUX.2 [dev] en Cloudflare Workers AI, cuyo plan gratuito da 10.000 «neuronas» al día. Me llegó para unos diez retratos antes de que me dijera «vuelve mañana», y por eso Devvy sigue dentro de una caja.
Lo que aprendí: si pedía los once vecinos en una sola imagen salían clones con el nombre cambiado, así que cada uno tuvo su propia imagen con el mismo párrafo de estilo. El filtro de seguridad rechazó la palabra «kid» en una descripción; «cartoon courier» pasó sin problema. El fondo blanco se quitó rellenando desde los bordes, así que la bata blanca sobrevivió.
const form = new FormData();
form.append('prompt', 'Single character design, full body, white background. Style: retro 1980s Japanese gag cartoon… Character: a tiny robot writer with a teal antenna…');
form.append('width', '1024');
form.append('height', '1024');
const res = await fetch(
`https://api.cloudflare.com/client/v4/accounts/${ACCOUNT}/ai/run/@cf/black-forest-labs/flux-2-dev`,
{ method: 'POST', headers: { authorization: `Bearer ${TOKEN}` }, body: form }
);¿Y Nana? Es el robots.txt, y deja entrar a todo el mundo a propósito. El porqué está en esta nota: No al entrenamiento de IA, sí a la búsqueda.
Deberes: volved a las 17:00 y mirad cómo reparte Bluebell. Se acabó la clase.








