How this agent is run
This agent is run like a production service: every answer served goes through a mechanical check, a fixed bench scores it every week with a judge, and the figures on this page come straight from the database that produces them.
At a glance
Reading the measurements…
The measurements cannot be reached
The service that computes these aggregates is not answering right now. The figures themselves are not lost: they live in the agent’s database, and this page re-reads them on every load.
This page keeps no backup copy, and that is on purpose: a figure frozen into the HTML would outlive the outage while asserting something nothing checks any more.
The non-regression bench
Every week the agent goes through the same set of questions and a judge scores each of its answers. This panel plots no curve, and that is exactly what it has to say today.
A score only means something next to a score taken with the same instrument. The detector requires several comparable passes before drawing any conclusion.
Comparable means four things at once: the same case set, the same judge, the same model behind the agent, and no case left unscored. The set changed several times while it was being worked out, and every change resets the counter to zero, as did the switch from Gemini to Claude Haiku on 12 October 2026. That is by design: comparing scores taken with two different instruments would be measuring changes to the code and calling them quality.
The time series will appear here when the counter reaches its threshold. Until then the space is taken by the rule, which is itself the point: an instrument that refuses to conclude from a single point is more convincing than a curve drawn through three.
Comparable passes, one after another
The last comparable pass, axis by axis
How it is measured
Each bar counts the cases by the score the judge gave them, from 5 down to 0, and the number written in a segment is a number of cases. A score below the axis gate fails the case, whatever the other axes say; concision is scored but fails nothing. A case also fails outside the judge, when a mechanical check rejects it or the expected tool was not called: the list above the bars counts the cases by cause, without publishing the bench questions. A single pass says nothing about a trend, and it will not be compared with any other before the counter above reaches its threshold.
The mechanical check, on every answer served
Every answer served is re-read by a check that uses no network and no model, axis by axis. It costs nothing, it runs on every single answer, and its verdict is written to the database next to the answer it judges.
How it is measured
A check that does not apply is marked not applicable, never failed. Without that rule, an answer with no volatile figure to date would count as defective, and the table would lie in the direction that suits it.
Why an answer fails
Watched, without weighing on the verdict
And the admission that beats silence: the bench judge does not score real traffic. Deprived of the excerpts it ought to lean on, its grounding collapses, and that was measured. What runs instead is this table: free, network-free, on every answer served.
Latency, and what it is measured on
How long a complete answer takes, and how long the first word takes to appear. Two different measurements, two different populations, and the page says which is which.
Answers served from the cache
Only a first question gets in, after the four guards, and only an answer that passed the mechanical check; any change of data, prompt or models invalidates it, and an entry expires on its own.
Time to the first word
How it is measured
Only streamed calls carry a genuine time to first word. On the non-streamed path the headers arrive only once the whole answer is ready: their measurement equals the total duration, and counting it here would display overruns that are not overruns.
No day-by-day curve, and the reason is methodological.
A latency measured on free traffic is not comparable from one day to the next, because the questions are not the same. The bench asks exactly the same ones on every pass: that is the only latency series anyone has the right to compare over time, and it is published with the bench, above, pass by pass.
What is refused before any model call
A share of the requests never reaches a model: a guard stops them first. This section counts those blocks and names their reasons, without ever showing the question that triggered them.
What the guards blocked
How it is measured
The reasons come from a list frozen in the filter’s code, where they are written in French. The first line of each cell is a translation added by this page; the second line, smaller, is the original label copied word for word from that list, so the provenance stays checkable by eye. No visitor text leaves the database: the page counts blocks, it does not show questions.
The count is right; the label is less so. Several entries in the original list are written as variants of the one preceding them, and only read correctly in their place in the file. Sorting by number of blocks detaches them from that antecedent: one and the same label can then gather attempts the original list keeps apart.
What these blocks do not prove
This filter is a first line: it stops what is cheap and obvious. A regular-expression filter against prompt injection is inherently porous, and the bench that lives in the same repository measures that rather than hoping otherwise. On 27 August 2026, out of eight phrasings kept away from its design, it stopped only one. Fixing false positives generalises; a gain in recall does not.
The real defence is elsewhere, and it is structural: the agent’s tools are read-only, the corpus it consults is already public, and the system prompt contains no secret. An injection that got past this filter would open nothing, because there is nothing to open.
A second filter, and a second opinion
Every question is also read by a trained injection classifier, chosen on a bench of questions kept apart from the first filter’s patterns. Above its threshold it blocks, but not alone: a language model rereads the question as plain data, and the refusal stands only if both agree. This second opinion can only unblock; when it is down or unsure, the refusal stands.
How it is measured
A served answer it would have refused is a question the second opinion judged legitimate, or an answer served while the classifier was down. This page does not read the questions: it counts them.
The state graph, read on every page load
This agent is not a model call wrapped in a loop: it is a state machine, and here is its own. The drawing below is not an image exported on some day of development, it is the topology the service publishes of its own graph.
How it is measured
This topology is read again every time this page is opened, from the service that runs the agent, exactly like the figures in the other panels. A node added to the graph tomorrow shows up here on the next load, without a single line of this page changing. The fingerprint above is the one of the topology served: two loads that share it have seen the same agent.
The node names are the ones the agent’s code gives them, as the service publishes them, and that code is written in French. Each box carries our English wording, with the original name underneath it in smaller type: translating alone would have thrown away the provenance, which is the whole argument of this panel.
The loop, measured
How it is measured
A turn is one call to the model. An answer in one turn was written without calling any tool; each extra turn adds a round of tool calls. On the last turn allowed, the agent can no longer call one and must conclude with what it has.
What the answer is made with
The model chain in its fallback order, the corpus these answers cite, and the tools the agent calls to go and fetch its facts. A link that was never called says so, instead of letting you believe it did any work.
A rarely called link is a barely tested link. This count says what the fallback actually carried over the window, and not what it would carry if the first link were to go down.
The fallback chain, and what it actually served
Why the chain left a link
How it is measured
A link gives up for one of two reasons, and they are not the same: too slow, when the first word did not arrive within its time budget; on error, when the provider answered with an error (quota, outage) through all its retries. Each transition is written as it happened: the chain order changed during the window, and a link left on that day is not necessarily first in line today.
The corpus the tools read
A source is only re-ingested when its file has changed: the date is that of the last change actually written to the database, not that of a check.
The tools, and what they cost in time
None of these tools writes anything at all. They read the profile, the publications, the thesis, the AI Digest and the radar. The only one that produces text prepares a draft message that the visitor re-reads and sends themselves: nothing goes out without their click.
What the service catches up on, and what it costs
A service that retries its failed links on its own, and the price of one answer. Two figures that describe the instrument and not its audience: they do not move if nobody comes.
The cost
A unit cost is honest at any volume; a cumulative cost would only tell you about the turnout. We show the unit, never the total.
The same profile, from your own assistant
The Worker that serves this site also exposes a public MCP server. Added as a connector in Claude or ChatGPT, it lets your assistant query Baptiste Blouin’s profile with its own model: the agent measured above plays no part.
Nine tools
get_profile- The profile by section: overview and availability, experience, education and thesis, skills, recruiter FAQ.
list_projects- Projects with period, tech stack and links; filterable by technology or theme (“RAG”, “Rust”).
search_private_projects- The reviewed write-ups of his private, unpublished projects: period, skills, stack, demonstrated skills and results; keyword search.
search_publications- The seven peer-reviewed publications, ranked by relevance to a question, abstracts included.
get_veille- One edition of the AI Digest: daily digest, weekly recap or four-week trends, with cited sources.
search_veille- Keyword search across the daily digests, over fourteen days at most.
get_radar- The AI ecosystem Radar: an overview, or a panel’s full ranking with its provenance.
analyze_skill- One named technology, checked against the CV and the private project write-ups: declared, used in a private project, mentioned in a project, or absent. If absent, what close skills he has and his own estimate of the ramp-up.
evaluate_job_offer- The site’s job-offer rubric and all the profile evidence: your assistant writes the evaluation itself, and the offer never leaves your conversation.
How it is run
- Read-only: no tool writes, sends or changes anything, and no authentication is required.
- Stateless: Streamable HTTP, no session; every request stands on its own.
- Rate limited: 60 requests per minute per IP address, then a 429 error with
Retry-After. - No language model on the server side: answers are compact Markdown, drawn from the same sources as the site.
The same address is listed in llms.txt, for agents that read the site.