Skip to content

Work

I build multi-agent systems at Jupiter and, before that, Solana programs and observability tooling. Below are a few things I made and why I made them the way I did, then the places I have worked.

On the bench

The simulation that said no

simulateTransaction → response

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

Zero compute units and an empty log: none of the instructions ran. The RPC call itself succeeded, so the failure only shows up in value.err. Anything that asks a user to sign should check that field first, not the response status.

Read the note

Averages you can't add

pipes/daily_avg.pipe

-- materialise 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 later: merge the states
SELECT toStartOfWeek(day) AS week, city,
       avgMerge(latency) AS avg_latency
FROM daily_latency
GROUP BY week, city

When days have different volumes, the average of daily averages is not the weekly average. Storing the aggregate state instead of the finished number lets one materialised view answer any window correctly.

Read the note

A prompt change is a deploy

evals/gate.ts (sketch)

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));
}

A sketch of the rule, not production code: a prompt or model change ships only if it scores at least as well as the current one on the same eval cases. Agents usually fail without throwing, so the comparison is the test.

Read the note

Where I've worked

  • Jupiter · AI Engineer · 2026

    Multi-agent LLM systems and evaluation harnesses at Jupiter Exchange.

  • Sanctum Labs · Senior Software Engineer · 2025

    No-std Rust programs for liquid staking tokens (LSTs).

  • Ironforge · Senior Software Engineer · 2024

    Solana observability and incident tooling with ClickHouse, Tinybird and Cloudflare Workers.

  • Komon · Senior Software Engineer · 2022

    Foundational team. Rebuilt creator and community monetisation on Solana.

  • Affirm / Returnly · Software Engineer · 2020–2021

    Rails and React.

Side project

Cursor MCP Deeplink Generator (opens in new tab). You name an MCP server and add its commands, and it produces a deep link that imports it into Cursor, plus a shareable URL. Built with Next.js and TypeScript.

If you want help with something like this, see consulting or email me@pavs.dev.