AI engineer in Santiago, Chile

I build autonomous agents, and the systems that keep them honest.

Multi-agent coordination, cross-model verification, and memory that holds up in production. Mostly Python and Rust, with guarantees written down before the code is.

How this page works

This page is built like the vector index I wrote. Sparse at the top, dense at the bottom. As you scroll, a query drops through it, taking the nearest neighbour at every hop until nothing is closer.

The orange path is the route taken. Blue nodes were considered and passed over. The work is organised the same way: three layers, from how agents act together down to what they remember.

layer 2

Coordinate

Many agents, one piece of work, and nobody steps on anybody. Claims are atomic, handoffs are explicit, and anything that spends money or publishes waits for a person.

layer 1

Verify

Nothing an agent says is committed on its own word. A second model family, a proof kernel, or a safety gate decides — and what fails is dropped, not softened.

layer 0

Remember

Long-running agents need memory they can trust: indexes that stay correct under concurrency, recall that knows what is recent, and a model of who they are talking to.

Flagship systems

Four agent systems I designed and built end to end. Each one opens in the explorer as a live walkthrough of how it actually runs. Every number comes from the repository's own tests and evals.

Coordinateprivate repo

Clave

A coordination runtime for agents running as separate processes: rooms, atomic task claims, shared state, presence, approval gates and an audit log.

Permissions, claims and audit run inside one transactional reducer on SpacetimeDB, so two agents can never both own a task. Ships an MCP server, LangGraph and CrewAI adapters, and phase-based blueprints for multi-agent workflows.

  • 16 agents race for one task, exactly 1 wins
  • ~810 claims/s at 5.6 ms p50
  • 333 SDK tests
RustPythonSpacetimeDBMCPLangGraph

Sixteen agents see the same task at the same moment. Release it and watch who gets it — then switch to a naive read-then-write claim and watch it go wrong.

Coordinateprivate repo

Kanvel

A marketing agency run by agents, where anything that spends money or publishes stops for a named human.

Approval gates are LangGraph interrupts that survive a restart. A rejection goes back to the agent as the tool result it reads next. Every approval shows what was checked — and what nobody checked. Committed evals fail CI when the reviewer agent gets lenient.

  • reviewer eval: 0% false-pass over 3 runs
  • false-pass budget of 20% enforced in CI
  • 33 test files
PythondeepagentsLangGraphevals

One campaign, start to finish. Step through it: the spend is proposed, frozen, rejected, revised, and only then allowed to happen.

Rememberprivate repo

memex

A long-running companion whose memory is split into faculties: a semantic graph, time-decayed episodes, affect, and a council for hard questions.

Facts are extracted by one model family and verified by another before they are committed. Recall blends similarity with a ~21-day half-life and importance. Background tasks run plan, execute, verify, escalate — with a watchdog behind them.

  • 1,025 verified facts from 9,824 events
  • ~$0.0005 per turn
  • 11 of 11 demo probes pass
Pythonknowledge graphcross-family verification

One message through a memory made of faculties. The reply is fast; what gets remembered is slower, and checked by a second model family first.

Verifyopen source

Rumbo

A live learning platform that turns a job posting into a study route, then has an AI tutor judge real work — with calibration suites that fail when the judge gets flattering.

Competencies are matched against 75 module contracts and closed over prerequisites; the route states plainly what it cannot teach. The tutor scores on three dimensions and asks one question only the author could answer. Both the matcher and the tutor have calibration suites that make real model calls and exit non-zero.

  • 15 courses, 450 lessons, in production
  • ~$0.35 of LLM per generated course
  • judge calibration runs as a test
PythonFastAPIPostgresAstro

From a job posting to proven work. Two places where a model judges — and both are calibrated, so flattery fails a test.

Open source, and the rest

Led by the two open-source projects I'd point you to first, then the remaining systems, grouped by what they make agents do.

Open source, backend and frontend

CASCADE

An open-source, schema-agnostic backend for multi-agent systems: any agent can log interactions under schemas registered at runtime, and anyone can question the resulting graph in plain English.

FastAPI and ArangoDB underneath; JSON schemas are registered, versioned and enforced while the system runs. Questions become AQL through local Qwen3 models on Ollama — then every generated query passes a safety gate: writes blocked, collections whitelisted, results capped. The LLM subsystem was rewritten from 5,107 to 815 lines and got more reliable doing it. A React front end turns answers into charts and live network views.

  • 88 tests, 32 on the LLM and safety path
  • LLM code cut 84% (5,107 → 815 lines)
  • fully local inference, 4B dev / 30B MoE prod
  • v2.5.0, 11 months, backend + frontend
PythonFastAPIArangoDBOllama + Qwen3ReactWebSocket
Agent interactions land in a graph store under schemas registered at runtime. Natural language becomes AQL — but only through a safety gate.

Open source, ★ 75

chrono-mind

A lock-free vector index with time-aware memory for agents: wait-free reads, lock-free writes, recency and importance in the ranking.

Correctness is checked, not assumed: loom model checking, Miri, ThreadSanitizer, a differential oracle and fuzzing all run in CI. Under concurrent writes it keeps 65% of read throughput where a single RwLock keeps 1%.

  • recall@10 ≥ 0.95 gated in CI
  • search on par with usearch, 66% faster than FAISS
  • p99 228 → 384 µs under writes
RustHNSWloomMiriPyO3
A real query, running. It enters at the sparse top layer and descends greedily — touching a handful of nodes instead of all of them. Toggle decay to let recency compete with similarity.

layer 2

Coordinate

InfoCruncher

private

A StarCraft II agent that treats attention as a budget, using Bayesian surprise to decide which moments are worth thinking about.

Perception, strategy and micro run as separate stages; an information-gain scheduler skips frames that would not change a decision. Every game is logged as JSONL, losses included.

  • ~50% of frames skipped, 0 critical misses
  • beat the built-in VeryHard AI
  • 371 tests
PythonBayesian surprisepython-sc2
Open in explorer

layer 1

Verify

rnd-falsifier

open source

A research agent that reads papers, extracts claims, and commits only the ones a different model family can find in the source.

It refuses to start if extractor and verifier share a model family. Unsupported claims are kept, marked uncommitted, for audit. Surviving claims form a graph that is mined for gaps and argued over by a proposer and a cross-family adversary.

  • 1,508 claims extracted, 1,373 committed
  • 0 of 30 fabrications on hand check
  • 48 papers in the first run
Pythonpgvectorcross-family verification
Open in explorer

cadence

private

A theorem-proving agent loop where the Lean 4 kernel is the only judge.

Statements are formalised, compiled and repaired with the compiler error fed back. An integrity gate rejects sorry, admit and untrusted axioms before anything counts. Verified proofs are stored as content-addressed nodes in a shared proof graph.

  • 8 of 19 theorems verified
  • 9 sorry cheats caught by the gate
  • repair 42% vs single-shot 16%
PythonLean 4multi-agenteval harness
Open in explorer

canondb

open source

Breaking-change detection for the APIs and MCP servers agents call, so a tool changing under an agent fails a build instead of a task.

Fetch, normalise, diff against the last snapshot, and classify each change as strict-breaking, agent-breaking or safe — an LLM classifier with deterministic rules underneath. Never serves stale data as current. Exposed as a feed, a REST API, an MCP server and a GitHub Action.

  • 20 sources tracked every 6 h
  • classified for agents, not just for compilers
  • fails CI on breaking changes
TypeScriptMCPGitHub Actions
Open in explorer

layer 0

Remember

Attuned

open source

A behavioural layer that turns a person’s state into constraints any LLM can follow — context, never actions.

23 interpretable axes; what a person says about themselves always overrides what is inferred. Explicit non-goals: no action execution, no persuasion optimisation, no hidden optimisers.

  • 11 of 13 behavioural effects significant
  • translation in 214 ns
  • anxiety detection F1 0.68
RustPythonmodel-agnostic
Open in explorer

Where I've built

  1. Jun 2025 — present

    Acid Labs for LATAM Airlines

    Senior Prompt Engineer

    AURA: a production document-intelligence and memory system with deterministic LLM context planning, async job orchestration, and auditable knowledge artifacts. Plus a multi-pass CustomGPT auditing pipeline monitoring thousands of configs.

  2. 2025

    Freelance

    Senior AI Engineer

    CASCADE, a TypeScript ChromaDB wrapper, and ResearchRank — a modular ingestion pipeline benchmarked across FAISS, ChromaDB, and DuckDB.

  3. Aug 2024 — Apr 2025

    RSM Chile

    GenAI Engineer

    Solo-built PDF/Excel/CSV automation and off-metric anomaly alerting for C-suite reporting, and agentic tooling for autonomous systems.

  4. Aug 2023 — Aug 2024

    Fundación Ciencia & Vida

    Rust Developer

    Optimized molecular-dynamics order-parameter calculation by 64% (11 → 4 min); built centralized data analysis and automated CI/testing.

  5. 2019 — 2023

    Habitans

    Prompt Engineer / Frontend

    Early LLM pipeline work, and a full-featured React + Rocket platform for real-estate operations.

Building agents that have to be right?

If you're putting agents in front of real systems, real money or real people, I'd like to hear what you're building.