ARCH-E

James Archidona · Technical founder · Sapere aude Sapere aude, Latin for dare to know. Written by Horace in Epistles I.2, around 20 BC, as advice to stop waiting and begin. Immanuel Kant made it the motto of the Enlightenment in 1784, in What is Enlightenment?, where it means: have the courage to use your own understanding instead of borrowing someone else’s. Horace, Epistles I.2.40 · Kant, 1784 · Europe

Innovation is progress. I dedicate my life to it: more than ten years building and selling technology, from Apple to my own startups. Below is my current state of mind.

No. 01  ·  Voice  ·  production
An inbound phone agent that says it is an AI, in three languages
+
PythonLiveKit AgentsDeepgram Claude HaikuElevenLabsSIP

It answers a real phone number in Spanish, Catalan and English, declares that it is an AI before anything else, works out what the caller wants, handles it with tools against a CRM, a ticket system and a calendar, and hands over to a human with a spoken summary when it should.

Five specialised agents, not one prompt. One agent with one 18 KB prompt tried to be a receptionist, a salesperson, a support desk and a screener at once, and blurred all four. Each agent now carries only its own role prompt and only the tools it is allowed to use, and hands off by returning the next agent from a tool call. The support agent cannot quote a price. The sales agent cannot read a candidate's file. That is a containment decision, not an organisational one: the narrower the tool surface, the smaller the set of things a prompt injection in a caller's utterance can reach.

Cascaded on purpose, not speech-to-speech. A speech-to-speech model is faster and sounds better, and gives you no text to assert on. This agent quotes prices and reads back application statuses in a hiring context, which is high risk under Annex III of the EU AI Act. The latency cost of the cascade is the price of being able to test it.

Source: the repository, published with the prompts and the client's data removed from the whole history.

No. 02  ·  Benchmark  ·  proved me wrong
I benchmarked the wrong thing first, and it would have made production worse
+

The question was whether to move speech to text from Deepgram to ElevenLabs Scribe. The obvious test is to run both over clean audio and compare word error rate. Two things are wrong with the obvious test: clean 16 kHz audio is not what arrives down a phone line, and batch transcription is not the mode that runs in a live call. So the harness degrades the audio to 8 kHz mu-law, G.711, which is what the trunk delivers, and measures streaming separately from batch.

EngineModeWER
Scribe v1 / v2batch3,3%
Deepgram nova-3streaming5,8%
Scribe v2 realtimestreaming14,9%

Batch Scribe wins by a wide margin and is irrelevant, because batch is not a mode a phone call has. The engine that would actually have run is the last row, nearly three times worse than the incumbent. The errors are not evenly spread noise either, they are content: a l'any became a Lenny, Visc a Barcelona became Visca Barcelona. In one case the interim hypothesis was better than the final one, so the closing pass actively degraded the result.

Kept Deepgram. The clean batch benchmark, which is the one most people would have run and published, pointed the other way.

Source: six Catalan screening phrases, commit a56ba00 on branch lab/stt-benchmark, in the repository.

No. 03  ·  Latency  ·  proved me wrong
My latency hypothesis was false by a factor of three and a half
+

Production was showing 2,38 to 2,43 s to first token. The system prompt was 18 KB. The obvious conclusion is that the prompt is the cost, and the obvious fix is to trim it. Measured against the API directly, over the same five-turn conversation:

PromptSizeMean TTFT
Full18.118 chars0,68 s
Trimmed5.740 chars0,57 s

So the whole prompt costs 0,68 s, not 2,4 s, and cutting two thirds of it buys 0,11 s. The missing 1,8 s was somewhere else: cold start, because the worker scales to zero, plus end-of-turn detection, which is an endpointing delay plus a model inference per turn.

Trimmed the prompt anyway, for a different reason, and sold it as what it was. A prompt written directly in Catalan stops Spanish examples leaking into Catalan speech. That is a quality win, not the latency win it never was.

Source: commit 8778abc on branch lab/stt-benchmark, in the repository.

No. 04  ·  Evaluation  ·  gates a deploy
The felt silence is the metric, and the harness that catches its own blind spot
+

A caller does not experience time to first token. They experience the gap between finishing their sentence and hearing a voice. The latency meter parses the per-turn metrics the agent logs, reports p50, p95 and max per phase against a budget written down once, and exits non-zero on a breach so it can gate a deploy.

PhaseBudget at p95
End of utterance delay0,8 s
Time to first token1,2 s
Time to first byte of audio1,0 s
Response gap, the felt silence2,5 s

Separately, a judge model grades the agent's text behaviour against 24 saved scenarios before every deploy, in about thirty seconds and a few cents. Two of the 24 are permanent known false negatives, because the opening AI disclosure is static synthesised audio that a text harness cannot observe. They are excluded by name and reported as N/A, because an ignored failure nobody can explain later is worse than a documented one.

The bug worth reporting is in the harness, not the agent. An unmatched scenario silently fell back to feeding the scenario sentence to the model, so it still scored and still printed a number. Eleven cases degraded that way at once, because I typed the Spanish without accents. There is now a free offline check in CI that fails on it.

Source: evals/latency.py and evals/selftest.py in the repository.

No. 05  ·  Data  ·  live
Coarchive: 741.233 companies out of a gazette nobody could query
+
NodeSQLiteTursoOpen data

Spain's commercial registry gazette is published daily and is effectively unqueryable. The build loads it into an index: 741.233 companies and 1.182.206 corporate acts, 503 days of gazette, in four minutes, at no cost, because the summary exposes structured XML per province and nobody needs to parse the PDFs.

The design decision is the redaction, not the parser. The gazette names natural persons. The index never stores one: the rule runs before anything is written, and the four measurements that shaped it are in the header of the file that implements it, so the next reader changes it with the evidence in front of them.

The trap was in the dates. The gazette date is the date of publication, not of incorporation. The real one is inside the act text. Verified against a filing bought from the registry for 10,88 €: published 03.03.2025, incorporated 04.02.2025.

Live at joblanders.ai/coarchive, free, no account.

Everything I have built myself, with its state today. Each line links to the thing that is running. Where the code is not public yet, the line says so rather than linking to nothing.

Shipped and running
Inbound voice agent
Live
Five specialised agents on one phone number, in Spanish, Catalan and English. Declares it is an AI on pickup, warm transfer with consent, no fact it cannot source.
Coarchive
Live
741.233 Spanish companies and 1.182.206 corporate acts, built out of the daily gazette in four minutes at no cost, with the redaction rule running before anything is written.
Startup benchmark
Live
32 metrics against 22 published market sources, computed entirely in the browser, so no company ever sends its numbers anywhere.
Spanish startup funding and exits
Live
Money raised and companies sold, 2012 to 2026, one source per row and the revised figure rather than the one the original annual report printed.
Agents: what they are and how to build one
Live
A field guide in three parts: the concepts, the build (harness, six decisions, ontology, governance), and an eight-question diagnostic. Bilingual, and it prints.
Weekly AI and agents digest
Live
One file per week, built by a script, published every Friday. The rule is simple: a paper with no number in it does not get in.
Idearium essays
Live
Short pieces on applied AI, generated from markdown by a build script and never edited by hand. Spanish first, English underneath.
Working on it now
Eval harness
In progress
Scores any model on our own labelled data: accuracy, per-class F1, confusion matrix, calibration error, latency and cost per 1.000 decisions. First baseline already changed a model choice.
Opening the repositories
In progress
Every project above goes public, one at a time, each with the client data removed from the whole history and not only from the tip.
Next
Screening evals
A graded suite for candidate screening decisions, where the regulated act is the rejection and not the hire, and a human reviewer who never disagrees is evidence against you.
Registry MCP server
The Coarchive index behind an MCP server, so a model can ask the Spanish commercial registry a question instead of being told about it.

jamesarchibal@gmail.com
Right to work in the UK, six years in London. English, Spanish and Catalan.