Saltar al contenido
Pablo Adell

Experiencia

Desarrollo sistemas multiagente en Jupiter. Antes trabajé en programas de Solana y en las herramientas de observabilidad que los rodean. Aquí cuento dónde he trabajado y algunos proyectos que hice, junto con las razones de mis decisiones.

Dónde he trabajado

  • JupiterIngeniero de IA2026

    Sistemas multiagente con LLM y sistemas de evaluación en Jupiter Exchange.

  • Sanctum LabsIngeniero de software sénior2025

    Programas Rust no-std para tokens de staking líquido (LST).

  • IronforgeIngeniero de software sénior2024

    Herramientas de observabilidad e incidencias para Solana con ClickHouse, Tinybird y Cloudflare Workers.

  • KomonIngeniero de software sénior2022

    Equipo fundador. Reconstrucción de la monetización de creadores y comunidades en Solana.

  • Affirm / ReturnlyIngeniero de software2020–2021

    Rails y React.

Cosas que he creado

Solana · simulateTransaction → response

La simulación que dijo que no

Cero unidades de cómputo y un registro vacío: no se ejecutó ninguna instrucción. La llamada RPC sí se completó, así que el fallo solo aparece en value.err. Cualquier flujo que pida firmar al usuario debería comprobar primero ese campo, no el estado de la respuesta.

"value": {
  "err": "BlockhashNotFound",
  "logs": [],
  "unitsConsumed": 0
}

La nota que lo explica

Datos · pipes/daily_avg.pipe

Promedios que no se pueden sumar

Cuando cada día tiene un volumen distinto, el promedio de los promedios diarios no es el promedio semanal. Guardar el estado del agregado en vez del número final permite que una vista materializada responda correctamente para cualquier intervalo.

-- per day: keep the state, not the number
SELECT toStartOfDay(ts) AS day, city,
       avgState(latency_ms) AS latency
FROM events
GROUP BY day, city

-- any window: merge the states
SELECT toStartOfWeek(day) AS week, city,
       avgMerge(latency) AS avg_latency
FROM daily_latency
GROUP BY week, city

La nota que lo explica

IA · evals/gate.ts (sketch)

Cambiar un prompt es un despliegue

Un esquema de la regla, no código de producción: un cambio de prompt o de modelo solo se publica si obtiene al menos el mismo resultado que la versión actual en los mismos casos de evaluación. Los agentes suelen fallar sin lanzar errores, así que la comparación es la prueba.

const baseline = await runSuite(suite, { prompt: current });
const candidate = await runSuite(suite, { prompt: next });

if (candidate.passRate < baseline.passRate) {
  throw new Error("regression: " + diff(baseline, candidate));
}

Por mi cuenta

Cursor MCP Deeplink Generator (se abre en una pestaña nueva). Indica un servidor MCP, añade sus comandos y obtén un enlace que lo importe en Cursor, además de una URL para compartir. Next.js y TypeScript.

¿Necesitas algo así? Acepto un proyecto de consultoría cada vez, o escríbeme a me@pavs.dev.