AI safety that doesn’t depend on the model behaving.

I’m Manuel. I build the layer under AI agents that can’t be talked out of its job: kernel sandboxes, hard budget caps, escalate-only clinical rails and contracts that verify proofs. Mostly in Rust, from Chile.

NovDecJanFebMarAprMayJunJulAugSepOct426 contributions, week of Jul 5
2,502 contributions on GitHub in the last year, one summit per week.

Approach

A lot of AI safety is about making the model want the right thing. I work on the other half: assume that sometimes fails, and build the part that holds anyway.

  • 01

    Enforce outside the model

    A system prompt is a request. A kernel sandbox, a proxy or a smart contract is a rule. The controls that matter sit where the model cannot reach them.

    In ClawCrate, PennyPrompt, Ohu

  • 02

    Fail closed

    When the budget is spent or the check cannot run, the answer is no. In triage the model may raise urgency by one level and never lower it.

    In PennyPrompt, Clinibrium

  • 03

    Leave evidence

    Every decision writes something a third party can verify without trusting me: a signed receipt, an audit trail, a proof, a benchmark that either matches or does not.

    In ClawCrate, CerberusGuard, HIPnosis, VeritasVoice

Work

I

Making agents safe to run

An agent is a loop with shell access and a credit card. These put a hard stop under it.

ProjectWhat it doesWhat decides
ClawCrate RustSandbox for agent commands and MCP servers. No Docker, no root, one binary, and a signed receipt for everything it ran.The kernel: Landlock, seccomp, Seatbelt
PennyPrompt RustReverse proxy that prices every model call as it happens and pauses the agent when the money runs out.A budget cap, answered with HTTP 402
CerberusGuard PythonThree heads for production agents (prompts, money, syscalls) writing to one audit trail.Three independent checks
II

LLMs on a short leash

The model does the reasoning. It never gets to grade its own homework.

ProjectWhat it doesWhat decides
HIPnosis PythonAgent that ports CUDA code to ROCm and only keeps a port once the numbers match.Numerical parity on an AMD MI300X
Clinibrium PythonVertigo triage co-pilot. Claude reasons and explains; it can raise urgency one level and never lower it. Built during Built with Claude: Life Sciences.An escalate-only clinical rail, then the physician
vertigoDx TypeScriptThe same clinical problem, fully offline on Gemma 4 for clinics without reliable internet. Patient data never leaves the laptop.
LaForja TypeScriptStudents write math exam problems, and LLM reviewers try to break them.
III

Contracts that say no

When the thing being decided is money or a vote, the last word belongs on-chain.

ProjectWhat it doesWhat decides
Ohu RustCooperative procurement where an LLM swarm runs the season and never touches the funds.A Casper contract: escrow, bonds, settlement
VeritasVoice TypeScriptAnonymous feedback that still proves the author belongs to the group.Groth16 verified inside a Soroban contract
HollyWars TypeScriptAnonymous, sybil-resistant voting on Solana. Your indentation style decides your vote weight.ZK ballots checked on-chain
chainSentinel SolidityWatches Polkadot DeFi transactions for exploit patterns and pulls the funds out before the exploit lands.Heuristics and an LLM, in two layers

Model evaluation

The confidence layer of Clinibrium, a hierarchical CatBoost classifier for vertigo triage, retrained here from its public repo with the same seed and split (4,800 train, 1,600 calibration, 1,600 untouched test). Every chart below is computed from those held-out predictions in your browser.

Note The cases are synthetic, sampled from published diagnostic criteria, because real patient data had no place in a hackathon. These numbers measure how well the model recovers that generator, not clinical performance. What they do show is the method.

of dangerous cases flagged by the gate
98.8%
expected calibration error
0.013
of cases it declines, by design
10%
accuracy across eight diagnoses
96.7%

A model that is allowed to say “I don’t know”

Below a confidence bar the model returns undetermined instead of a diagnosis. Move the bar: the curve shows the error rate among the cases it still answers, and the matrix shows where those answers land. The shipped bar was fitted on a separate calibration split to answer 90% of cases.

Confidence bar
0.949
Right when it answers
98.9%
95% interval 98.2% to 99.3%
Wrong answers given
16 of 1,436
Dangerous cases answered as benign
0
0%1%2%3%4%5%50%60%70%80%90%100%wrong, among answeredshare of cases answeredshipped
Rows are the true diagnosis, columns the model’s answer
BPpBPhMénMigNeuLabCenCarn/a
BPPV, posteriorBPp40638
BPPV, horizontalBPh96921
MénièreMén13910
Vestibular migraineMig179139
Vestibular neuritisNeu17720
LabyrinthitisLab246122
CentralCen2208
CardiogenicCar1696

Central and cardiogenic are the two dangerous classes. Shade is the share of each row; n/a counts the cases held back.

Does 90% sure mean right 90% of the time?

Each dot is a band of confidence; its height is how often the model was right there, and its area is how many of the 1,600 held-out cases fall in it. Bars are 95% Wilson intervals, wide where few cases fall. On the diagonal, the stated confidence can be taken literally. Temperature scaling lowers the log-loss it is fitted on, yet here it raises the calibration error slightly. The model card reports that instead of hiding it.

Raw scores

Expected calibration error 0.0086

25%25%50%50%75%75%100%100%0%perfectly calibratedstated confidence

After temperature scaling, T = 0.80

Expected calibration error 0.0135

25%25%50%50%75%75%100%100%0%perfectly calibratedstated confidence
Show the numbers
Confidence bandRaw: cases rightScaled: cases right
33% to 40%2 50.0%
40% to 47%2 50.0%3 66.7%
47% to 53%9 44.4%6 16.7%
53% to 60%6 66.7%7 57.1%
60% to 67%13 61.5%8 100.0%
67% to 73%24 87.5%12 66.7%
73% to 80%31 83.9%24 75.0%
80% to 87%40 75.0%31 80.6%
87% to 93%99 91.9%50 82.0%
93% to 100%1374 99.1%1459 98.7%

What actually moves the danger gate

Exact TreeSHAP on the gate’s log-odds for 450 held-out cases, features ranked by mean absolute effect. Vascular risk and age dominate, as they should, since posterior-circulation stroke is the danger this gate exists for. Marked features carry a monotone constraint: more risk can never lower the probability of danger, by construction rather than by luck.

-20+2+4+6+8← toward benigntoward dangerous, log-odds →◆ Vascular risk factorsAgeTriggerOnset◆ Neurological alarm signsHead impulse testNystagmus direction◆ Cardiogenic cluster
  • Truly peripheral
  • Truly dangerous
  • ◆ Monotone risk feature
Show the numbers
FeatureMean |SHAP|Monotone
Vascular risk factors1.662yes
Age1.509
Trigger0.729
Onset0.602
Neurological alarm signs0.446yes
Head impulse test0.436
Nystagmus direction0.376
Cardiogenic cluster0.323yes

What happens when the chart is incomplete

Real intake forms arrive half empty. Here 1,500 fresh cases are scored with up to 60% of their fields removed. Accuracy on the answers it gives barely moves, because the model answers less instead of guessing more. Danger recall is what degrades, which is why it never gets the final word on urgency.

40%60%80%100%0%10%20%30%40%50%60%fields missingCases it answersRight when it answersDangerous cases flagged
  • Cases it answers
  • Right when it answers
  • Dangerous cases flagged
Show the numbers
MissingCases it answersRight when it answersDangerous cases flagged
0%93.7%99.6%100.0%
10%91.5%99.3%99.1%
20%85.2%99.1%97.7%
30%77.5%99.0%94.5%
40%67.7%98.7%89.9%
50%54.8%97.9%81.2%
60%40.7%96.9%64.9%

Side projects

EntrenaTuPAES

Co-founder and sole developer

A prep academy for PAES, Chile’s university-entrance exam. I wrote its LMS and I am the only one who commits to it.

commits by me
1,246
private repos
2
building since
Jul 2025
Jul 2025Jan 2026

Fundación Rescate de Mascotas

Volunteer and sole developer

The foundation’s donation platform. A gift in someone’s memory funds a specific rescued dog, and you can follow it until it’s adopted.

commits by me
453
private repo
1
building since
Nov 2025
Jul 2025Jan 2026

Commits per month, same scale on both charts. Counted on 2026-10-27.

Field data

My own commit history, collected by a script and redrawn every day. Only counts are stored: no repository names and no messages.

What I write, by month

3,571 commits across 45 repositories, public and private. Rust first shows up in April 2026.

  • Rust
  • TypeScript
  • Circom
  • Solidity
  • Python
  • Web and other
0200400600800100020232025202618 months no record830 in Jul 2026
Show the numbers
MonthWeb and otherPythonSolidityCircomTypeScriptRustTotal
Mar 202399
Apr 202349352
Aug 202388
Sep 202361319
Nov 202352025
Dec 20236666
Jul 20255555
Sep 202511
Oct 2025136120
Nov 20251515
Dec 20251111
Feb 202614721
Mar 20265132644
Apr 20263811373422
May 2026586230112406
Jun 2026232178122
Jul 20261834535299133830
Aug 2026622618250
Sep 20266585591
Oct 20266146452604

When I write it

Commits by weekday and hour, Santiago time. The busiest hour is Saturday from 10:00 with 91 commits; only 2% of everything lands between 03:00 and 08:00.

MonTueWedThuFriSatSun00:0006:0012:0018:00
  • 0
  • 1 to 19
  • 20 to 38
  • 39 to 57
  • 58 to 76
  • 77 to 91
Show the numbers
Day000102030405060708091011121314151617181920212223
Mon17172302835129723131323101713756
Tue246410101412163211193432302026111523
Wed5025132313123141102526776131183231402223
Thu23913283948456314556246532435191310
Fri1115351417224627776535218593743262940331744
Sat351116528179174312019997201354171815
Sun1533201133741491726273231918251112683329

Writing

Path

I trained as a biotechnology engineer and modelled food processes for years before I wrote a smart contract. The same habit runs through all of it: write the model down, then make something check it.

  1. 2025 to now

    Open source

    Rust, AI systems, zero-knowledge

    Everything in the sections above, built in the open and mostly at hackathons: sandboxes and budget proxies for agents, clinical triage under hard rails, and contracts that verify proofs.

  2. 2022 to 2023

    ZK Blockchain Services

    Web3 developer and smart contract analyst

    Shipped four projects across NFTs, governance and asset tokenization: tokenomics analysis, gas optimization and contract audits with Foundry, Hardhat and Ethers.js.

  3. 2022 to 2023

    Kawésqar VC

    Blockchain analyst, then advisor

    Technical due diligence on the fund’s blockchain portfolio, mostly real-estate and asset tokenization. Wrote and deployed contracts on Polygon and led their first audits.

  4. 2018 to 2022

    The Brunch Company

    R&D manager, then head of innovation

    Formulated food with computational models instead of trial and error, and built a blockchain traceability platform for fair-trade suppliers, which is how I ended up in Web3.

    to develop a new product line
    18 → 7 months
    food waste
    −43%
    sales margin against earlier lines
    +27%
  5. 2015 to 2018

    The Drying Factory

    R&D engineer, then head of innovation

    Heat and mass transfer models to optimize fruit dehydration: better nutrition and flavour for less energy.

    temperature peaks during drying
    −65%
  6. 2012 to 2014

    Websurf

    Backend developer

    Java, JavaScript and PHP: web application performance, database integration and WordPress builds.

Studied

  • MSc in Engineering SciencesPontificia Universidad Católica de Chile, 2017 to 2019
  • Biotechnology EngineeringPontificia Universidad Católica de Chile, 2011 to 2016
  • Diploma in Operations ManagementUniversidad Andrés Bello, 2023
  • Diploma in Digital Product and Services DevelopmentPontificia Universidad Católica de Chile, 2014 to 2016

Recognition

Contact

Illustration of an alpaca in glasses working at a laptop

Santiago, Chile, UTC−4. LinkedIn or Telegram is the fastest way to reach me.

Charts rebuilt from my commit history on 2026-10-27. This page is open source, and it has a terminal if you know which key to press (or what to type).

manuel@andes $0.00 of $1.00
Type help. Esc closes.