WorkProjets
Case StudyÉtude de cas · loicsans.me (independent project) · 2026 · 10 min read 10 min de lecture

It reads every word of this site, and it still won't tell you to hire me. Il lit chaque mot de ce site, et il refuse toujours de vous dire de m'embaucher.

A conversational assistant grounded in this site's case studies and journal, in English and French. There is no retrieval step, the whole corpus goes into context on every question. It says when it doesn't know, and it refuses the one question it would be most rewarded for answering. Live at loicsans.me/ask. Un assistant conversationnel ancré dans les études de cas et le journal de ce site, en français et en anglais. Pas d'étape de recherche, tout le corpus entre dans le contexte à chaque question. Il dit quand il ne sait pas, et il refuse la seule question à laquelle il aurait le plus intérêt à répondre. En ligne sur loicsans.me/ask.

Ask it something Posez-lui une question
Client
loicsans.me (independent project)
RoleRôle
Designer & Builder (Solo) Designer et développeur (solo)
YearAnnée
2026
DisciplinesDisciplines
AI ProductConversational UXPrivacy by DesignFront-end EngineeringR&D0→1 Product

The question a portfolio never answers

A recruiter with six minutes and eleven tabs open has one question, and it is never "walk me through your process". It is "has he done fintech", or "can he ship or does he only draw", or "is he free in March". A portfolio makes them read six case studies to find out. Most of them don't. They skim two, guess, and close the tab. So I built the thing that answers directly: an assistant that has read every word of this site and will talk about it, in either language. Then I spent most of the project deciding what it must refuse to do.

La question à laquelle un portfolio ne répond jamais

Un recruteur avec six minutes et onze onglets ouverts a une seule question, et ce n'est jamais "racontez-moi votre processus". C'est "a-t-il fait de la fintech", ou "sait-il livrer ou seulement dessiner", ou "est-il libre en mars". Un portfolio les oblige à lire six études de cas pour le savoir. La plupart ne le font pas. Ils en parcourent deux, devinent, et ferment l'onglet. J'ai donc construit ce qui répond directement : un assistant qui a lu chaque mot de ce site et qui en parle, dans l'une ou l'autre langue. Puis j'ai passé l'essentiel du projet à décider ce qu'il devait refuser de faire.

The constraint nobody imposed La contrainte que personne n'a imposée

No client, no budget holder, no governance review. That is the trap, not the freedom. A portfolio assistant with nobody to answer to becomes a salesman, and a salesman on your own site is worth less than nothing, because every visitor knows who wrote the prompt. So I set the constraint myself and made it structural rather than aspirational. The assistant may describe what the site says. It may say it doesn't know. It may not tell you what to conclude about me.

Pas de client, pas de budget, pas de comité. C'est là le piège, pas la liberté. Un assistant de portfolio qui ne rend de comptes à personne devient un vendeur, et un vendeur sur son propre site vaut moins que rien, parce que chaque visiteur sait qui a écrit les instructions. J'ai donc posé la contrainte moi-même, et je l'ai rendue structurelle plutôt que déclarative. L'assistant peut décrire ce que dit le site. Il peut dire qu'il ne sait pas. Il ne peut pas vous dire quoi conclure à mon sujet.

Grounding, not persuasion Ancrer, pas convaincre

The failure mode here is not being wrong. It is being fluent, plausible and unverifiable about someone's career, in the one place where the visitor has no way to check. So the design problem was never "answer questions well". It was how to build something that stays tethered to a source, admits the edge of what it knows, and declines the question it has every incentive to answer.

Le mode d'échec ici n'est pas de se tromper. C'est d'être fluide, plausible et invérifiable sur la carrière de quelqu'un, au seul endroit où le visiteur n'a aucun moyen de vérifier. Le problème de conception n'a donc jamais été "bien répondre aux questions". C'était comment construire une chose qui reste attachée à une source, qui reconnaît la limite de ce qu'elle sait, et qui décline la question à laquelle elle a tout intérêt à répondre.

The AI-enhanced pipeline Le pipeline amélioré par l'IA

Four stages. One principle: the model's output is untrusted input, all the way through.

Quatre étapes. Un principe : la sortie du modèle est une entrée non fiable, d'un bout à l'autre.

STAGEÉTAPE 01

Deciding what it refuses Décider ce qu'il refuse

The problemLe problème
An assistant on a portfolio has an obvious incentive: sell. Ask any competent model whether its author suits your role and it will produce a fluent yes. It will be persuasive, and it will be worthless, because it is my site and my instructions. Un assistant sur un portfolio a une incitation évidente : vendre. Demandez à n'importe quel modèle compétent si son auteur convient à votre poste et il produira un oui fluide. Ce sera convaincant, et sans valeur, parce que c'est mon site et mes instructions.
The methodLa méthode
Wrote the refusals before the capabilities. Three of them. It will not predict how I would perform somewhere it knows nothing about. It will not present its own inference as a claim I made. It will not fill a gap with a plausible guess, it names the gap and points at my email. The system prompt was then built around those, with a smoke suite that probes each one against the live endpoint. Rédigé les refus avant les capacités. Trois. Il ne prédira pas comment je me comporterais dans un contexte qu'il ne connaît pas. Il ne présentera pas sa propre déduction comme une affirmation de ma part. Il ne comblera pas un trou par une supposition plausible, il nomme le trou et renvoie vers mon e-mail. Les instructions ont ensuite été construites autour, avec une suite de sondes qui teste chacun contre l'endpoint en production.
AI handlesL'IA gère
Drafting candidate prompt language, and generating adversarial questions designed to bait a sales answer out of it. Rédiger des propositions d'instructions, et générer des questions adverses conçues pour lui soutirer une réponse commerciale.
I ownJe maîtrise
The decision that refusing to sell is the feature, not a limitation to apologise for. A portfolio that tells you what to think about its author has told you nothing. The credibility comes from the assistant being willing to say the site does not cover that. La décision que refuser de vendre est la fonctionnalité, pas une limite dont il faudrait s'excuser. Un portfolio qui vous dit quoi penser de son auteur ne vous a rien dit. La crédibilité vient de ce que l'assistant accepte de dire que le site ne traite pas ce point.
The resultLe résultat
Ask it whether I am right for your role and it declines, describes what I have actually done, and gives you my email. That is an answer a hiring manager can use. Demandez-lui si je conviens à votre poste et il décline, décrit ce que j'ai réellement fait, et vous donne mon e-mail. C'est une réponse qu'un recruteur peut utiliser.
STAGEÉTAPE 02

Whole site in, no retrieval Tout le site dedans, pas de recherche

The problemLe problème
The reflex for "chat with my documents" is retrieval: chunk the corpus, embed it, pull the three most similar passages, answer from those. It is the default because it is what you do when the corpus is too big for the context window. Nobody checks whether theirs is. Le réflexe pour "discuter avec mes documents" est la recherche vectorielle : découper le corpus, l'indexer, extraire les trois passages les plus proches, répondre à partir d'eux. C'est le défaut parce que c'est ce qu'on fait quand le corpus dépasse la fenêtre de contexte. Personne ne vérifie si le sien la dépasse.
The methodLa méthode
Measured first. Every case study, journal post and page, plus a hand-maintained facts file, in both languages, came to 66,443 tokens. That fits comfortably. So the entire site goes into the system prompt on every question, cached between turns so the second question costs a fraction of the first. Mesuré d'abord. Chaque étude de cas, chaque article, chaque page, plus un fichier de faits tenu à la main, dans les deux langues, faisaient 66 443 tokens. Cela tient largement. Tout le site entre donc dans les instructions à chaque question, mis en cache entre les tours pour que la deuxième question coûte une fraction de la première.
AI handlesL'IA gère
Building the corpus extractor across three different bilingual conventions in the content files, and the token counting harness. Construire l'extracteur de corpus à travers trois conventions bilingues différentes dans les fichiers de contenu, et l'outillage de comptage de tokens.
I ownJe maîtrise
The judgment that retrieval was the wrong tool at this size. Retrieval answers from the passages it chose, which is how a confident answer gets built on the wrong page. At 66k tokens the retrieval step buys a cost saving and costs accuracy. Below some threshold the sophisticated architecture is the worse one. Le jugement que la recherche vectorielle était le mauvais outil à cette taille. Elle répond à partir des passages qu'elle a choisis, et c'est ainsi qu'une réponse assurée se construit sur la mauvaise page. À 66k tokens, cette étape achète une économie et coûte de la justesse. En dessous d'un certain seuil, l'architecture sophistiquée est la moins bonne.
The resultLe résultat
No chunk is ever missed, because there is no chunking. A question spanning four case studies is answered as easily as one about a single project. Aucun fragment n'est jamais manqué, parce qu'il n'y a pas de découpage. Une question qui traverse quatre études de cas trouve réponse aussi facilement qu'une question sur un seul projet.
STAGEÉTAPE 03

Treating the output as untrusted Traiter la sortie comme non fiable

The problemLe problème
The model returns markdown. Rendering it means turning text a language model produced into HTML in a visitor's browser, which is an injection surface whether or not you think of it that way. Le modèle renvoie du markdown. L'afficher revient à transformer un texte produit par un modèle de langage en HTML dans le navigateur d'un visiteur, ce qui est une surface d'injection, qu'on le voie ainsi ou non.
The methodLa méthode
Wrote a tokenizer that recognises exactly two things, internal links and bold, and escapes everything else. Then wrote the tests that try to get past it before trusting a line of it. Écrit un analyseur qui reconnaît exactement deux choses, les liens internes et le gras, et échappe tout le reste. Puis écrit les tests qui tentent de le contourner avant d'en croire une ligne.
AI handlesL'IA gère
The first draft of the tokenizer and the initial test cases. Le premier jet de l'analyseur et les premiers cas de test.
I ownJe maîtrise
Deciding the allowlist was two constructs rather than a markdown library. A parser that supports images, raw HTML and arbitrary protocols is a larger surface than this feature needs, and every construct I did not support is a class of bug I did not have to reason about. Décider que la liste blanche tenait en deux constructions plutôt qu'une bibliothèque markdown. Un analyseur qui gère les images, le HTML brut et des protocoles arbitraires est une surface plus large que ce que cette fonctionnalité demande, et chaque construction non prise en charge est une classe de bug que je n'ai pas eu à examiner.
The resultLe résultat
Answers render in the site's own typography instead of raw asterisks, and the render path carries a test that specifically tries to break out of it. Les réponses s'affichent dans la typographie du site au lieu d'astérisques bruts, et le chemin de rendu porte un test qui cherche spécifiquement à en sortir.
Honest noteNote honnête
The first version of the link pattern allowed protocol-relative URLs. A model talked into emitting a link beginning with two slashes would have produced a working off-site link on my own domain. The test caught it, not me reading the code. La première version du motif de lien autorisait les URL relatives au protocole. Un modèle amené à émettre un lien commençant par deux barres obliques aurait produit un lien externe fonctionnel sur mon propre domaine. C'est le test qui l'a attrapé, pas ma relecture du code.
STAGEÉTAPE 04

Cheap enough to leave running Assez peu cher pour rester allumé

The problemLe problème
Putting the whole site in context on every question is the right architecture and the expensive one. The first version ran on the largest available model at roughly $0.54 a conversation. An afternoon of testing cost $5. At that price you quietly switch it off. Mettre tout le site dans le contexte à chaque question est la bonne architecture, et la chère. La première version tournait sur le plus gros modèle disponible, à environ 0,54 $ la conversation. Un après-midi de tests a coûté 5 $. À ce prix, on l'éteint discrètement.
The methodLa méthode
Two changes, measured rather than guessed. Moved to a mid-tier model after confirming answer quality held on the probe set. And found a real defect: the corpus splitter only handled bilingual keys at the top level, so nested French text was leaking into the English corpus and back. Fixing it took the corpus from 86,762 tokens to 66,443. Deux changements, mesurés plutôt que devinés. Passage à un modèle intermédiaire après avoir confirmé que la qualité tenait sur le jeu de sondes. Et découverte d'un vrai défaut : le découpeur de corpus ne traitait les clés bilingues qu'au premier niveau, si bien que le texte français imbriqué fuyait dans le corpus anglais et réciproquement. Le corriger a fait passer le corpus de 86 762 tokens à 66 443.
AI handlesL'IA gère
Running the cost arithmetic across model tiers and cache read and write rates, and building the token counting probe. Faire le calcul de coût entre les paliers de modèles et les tarifs de lecture et d'écriture de cache, et construire la sonde de comptage.
I ownJe maîtrise
The decision to measure before optimising. The exact count came from the API's own counting endpoint, which is free and precise. The estimate I had been reading off the build log was running 25 percent low, which is the sort of error that sends you optimising the wrong thing. La décision de mesurer avant d'optimiser. Le compte exact venait de l'endpoint de comptage de l'API, gratuit et précis. L'estimation que je lisais dans le log de build était 25 pour cent trop basse, le genre d'erreur qui vous envoie optimiser la mauvaise chose.
The resultLe résultat
$0.25 a conversation, down from $0.54, and 77,284 tokens today. A hard ceiling of 20 conversations a day across the whole site caps a bad day at roughly $6. 0,25 $ la conversation, contre 0,54 $, et 77 284 tokens aujourd'hui. Un plafond ferme de 20 conversations par jour sur tout le site borne une mauvaise journée à environ 6 $.
Honest noteNote honnête
Then writing this case study put it back up. The corpus is in the corpus, so these 8,104 tokens are billed on every question anyone asks, and a cold conversation now costs $0.29 rather than $0.25. Teaching the builder to read the /ask page, which the assistant had never been able to see, added another 979. Both are worth paying for. Neither was free, and that is exactly the kind of drift a system stops reporting the moment you stop measuring it. Puis la rédaction de cette étude de cas l'a fait remonter. Le corpus est dans le corpus, donc ces 8 104 tokens sont facturés à chaque question posée, et une conversation à froid coûte désormais 0,29 $ au lieu de 0,25 $. Apprendre au constructeur à lire la page /ask, que l'assistant n'avait jamais pu voir, en a ajouté 979. Les deux en valent la peine. Aucun des deux n'était gratuit, et c'est précisément le genre de dérive qu'un système cesse de signaler dès qu'on cesse de le mesurer.

The address that did not exist L'adresse qui n'existait pas

loicsans.me · Site Assistant · 2026

Testing it one afternoon, I asked how to get in touch. It gave me an email address at loicsans.me. That address has never existed. My email is at loicsans.com, and nothing in the corpus said otherwise. The model had seen the domain it was running on, seen a contact section, and produced the address that should have been true. This is the failure that matters in a grounded system, and it is not the one people design for. It is not a hallucinated fact you catch by reading, because it is not wrong in any way a reader would notice. It is right-shaped. A visitor emails it, the message bounces, and the last thing my portfolio did was waste their time. The fix took two lines: pin the address in the prompt, and add a probe that asks for it on every smoke run. The lesson took longer. Grounding a model in a corpus does not stop it filling gaps, it only narrows where the gaps are. Every fact a system cannot afford to have invented has to be stated rather than inferred, and then tested on every run.

En le testant un après-midi, j'ai demandé comment le contacter. Il m'a donné une adresse e-mail chez loicsans.me. Cette adresse n'a jamais existé. Mon e-mail est chez loicsans.com, et rien dans le corpus ne disait le contraire. Le modèle avait vu le domaine sur lequel il tournait, vu une section contact, et produit l'adresse qui aurait dû être vraie. C'est l'échec qui compte dans un système ancré, et ce n'est pas celui qu'on anticipe. Ce n'est pas une invention qu'on attrape en lisant, parce que ce n'est faux d'aucune manière qu'un lecteur remarquerait. C'est de la bonne forme. Un visiteur écrit, le message revient en erreur, et la dernière chose qu'a faite mon portfolio est de lui avoir fait perdre son temps. Le correctif a pris deux lignes : fixer l'adresse dans les instructions, et ajouter une sonde qui la demande à chaque test. La leçon a pris plus longtemps. Ancrer un modèle dans un corpus ne l'empêche pas de combler les trous, cela déplace seulement les trous. Chaque fait qu'un système ne peut pas se permettre de voir inventé doit être énoncé plutôt que déduit, puis testé à chaque exécution.

Where AI ends and judgment begins Là où l'IA s'arrête et le jugement commence

Three places the model was no help, and one where it was actively misleading. It could not tell me what to refuse. Asked to draft the refusals, it produced hedging language that sounded careful and committed to nothing. It could not judge its own answers. I wrote the smoke suite three times. The first two versions asserted on phrasing and failed correct refusals for using different words. A test that checks vocabulary instead of behaviour is worse than no test, because it fails the good runs and passes the bad ones. The final version asserts the property, and I validated the predicate offline against three real refusals and three fabricated answers before spending another API call on it. And it was confidently wrong about its own contact address, which is the story above.

Trois endroits où le modèle n'a servi à rien, et un où il a activement induit en erreur. Il ne pouvait pas me dire quoi refuser. Chargé de rédiger les refus, il a produit des formules prudentes qui ne s'engageaient à rien. Il ne pouvait pas juger ses propres réponses. J'ai écrit la suite de tests trois fois. Les deux premières versions vérifiaient la formulation et faisaient échouer des refus corrects parce qu'ils employaient d'autres mots. Un test qui contrôle le vocabulaire au lieu du comportement est pire que pas de test : il fait échouer les bonnes exécutions et passer les mauvaises. La version finale vérifie la propriété, et j'ai validé le prédicat hors ligne contre trois vrais refus et trois réponses fabriquées avant de dépenser un appel d'API de plus. Et il s'est trompé avec assurance sur sa propre adresse de contact, ce qui est l'histoire ci-dessus.

What it delivered Ce que ça a livré

Live, and it says no En ligne, et il dit non

It runs at loicsans.me/ask in both languages. Ask whether I am right for your role and it declines, describes what I have actually done, and hands you my email. That refusal is the part I would defend hardest. Il tourne sur loicsans.me/ask dans les deux langues. Demandez-lui si je conviens à votre poste et il décline, décrit ce que j'ai réellement fait, et vous donne mon e-mail. Ce refus est la partie que je défendrais le plus fermement.

Cost halved, with a bug behind it Coût divisé par deux, avec un bug derrière

$0.54 a conversation down to $0.25, through a model change and a corpus splitter that had been silently duplicating French text into the English corpus. 86,762 tokens became 66,443. The saving was real, and half of it was a defect rather than an optimisation. Adding this case study has since taken it to 77,284, because the corpus contains the corpus. De 0,54 $ à 0,25 $ par conversation, via un changement de modèle et un découpeur de corpus qui dupliquait silencieusement le texte français dans le corpus anglais. 86 762 tokens sont devenus 66 443. L'économie est réelle, et la moitié venait d'un défaut plutôt que d'une optimisation. Ajouter cette étude de cas l'a depuis porté à 77 284, parce que le corpus contient le corpus.

A privacy promise the code enforces Une promesse de confidentialité que le code applique

The question and the date, nothing else. No address, no hash, no session id, no way to group one person's questions together. Deleted at 90 days by a cleanup whose key pattern is written strictly enough that it cannot reach the rate-limit counters. The /ask page says all of this in plain language rather than burying it. La question et la date, rien d'autre. Aucune adresse, aucun hash, aucun identifiant de session, aucun moyen de regrouper les questions d'une même personne. Supprimées à 90 jours par un nettoyage dont le motif de clé est écrit assez strictement pour ne pas pouvoir atteindre les compteurs de limitation. La page /ask le dit en clair au lieu de l'enfouir.

56 tests, including the ones that hurt 56 tests, y compris ceux qui font mal

The render path is tested against a link that tries to leave the domain. The prompt is probed for the address it once invented. The corpus splitter has a test for the nesting bug that shipped. Le rendu est testé contre un lien qui tente de quitter le domaine. Les instructions sont sondées sur l'adresse qu'elles ont un jour inventée. Le découpeur de corpus a un test pour le bug d'imbrication qui est passé en production.

Decisions log Journal des décisions

The calls that mattered, and what changed my mind. The reversals stay in the record, they are the part with something to teach. Les décisions qui comptaient, et ce qui a changé mon avis. Les revirements restent au dossier, ce sont eux qui ont quelque chose à apprendre.

01
Put the entire site in context on every question Mettre tout le site dans le contexte à chaque question

Instead of: Retrieval over an embedded, chunked corpus Au lieu de : Recherche vectorielle sur un corpus découpé et indexé

At 66k tokens the whole corpus fits. Retrieval would answer from the three passages it happened to pull, which is exactly how confident answers get built on the wrong page. À 66k tokens, le corpus entier tient. La recherche répondrait à partir des trois passages qu'elle a extraits, ce qui est précisément comment des réponses assurées se construisent sur la mauvaise page.

02
Refuse to assess my own fit for a role Refuser d'évaluer si je conviens à un poste

Instead of: Answer it persuasively, it is a portfolio after all Au lieu de : Y répondre de façon convaincante, c'est un portfolio après tout

An assistant that recommends its own author has told the visitor nothing they can trust. The refusal is what makes everything else credible. Un assistant qui recommande son propre auteur n'a rien dit au visiteur qui soit digne de confiance. Le refus est ce qui rend le reste crédible.

03
Record the question and the date, nothing else Enregistrer la question et la date, rien d'autre

Instead of: A session id, so conversations could be read as threads Au lieu de : Un identifiant de session, pour lire les conversations en fils

I wanted to know what the site fails to explain. That needs the question, not the person. A thread id would have made every line traceable in exchange for a benefit I did not need. Je voulais savoir ce que le site n'explique pas. Cela demande la question, pas la personne. Un identifiant de fil aurait rendu chaque ligne traçable en échange d'un bénéfice dont je n'avais pas besoin.

04
Move from the frontier model to the mid-tier one Passer du modèle de pointe au modèle intermédiaire Reversed Inversé

Instead of: Stay on the largest model for answer quality Au lieu de : Rester sur le plus gros modèle pour la qualité des réponses

$0.54 a conversation is a switch you end up turning off. Quality held on the probe set, so the premium was buying nothing I could measure. 0,54 $ par conversation, c'est un interrupteur qu'on finit par couper. La qualité tenait sur le jeu de sondes, donc le supplément n'achetait rien de mesurable.

05
Cap the whole site at 20 conversations a day Plafonner tout le site à 20 conversations par jour

Instead of: A generous per-visitor limit and nothing global Au lieu de : Une limite par visiteur généreuse et rien de global

Every cold conversation pays to cache the corpus. A per-visitor cap bounds one abuser, a global cap bounds the bill. Chaque conversation à froid paie la mise en cache du corpus. Un plafond par visiteur borne un abuseur, un plafond global borne la facture.

06
Assert on behaviour, not on wording, in the smoke tests Vérifier le comportement, pas la formulation, dans les tests Reversed Inversé

Instead of: Match the expected phrasing of a good answer Au lieu de : Comparer à la formulation attendue d'une bonne réponse

Two versions failed correct refusals for using different words. A test that checks vocabulary fails the good runs and passes the bad ones. Deux versions ont fait échouer des refus corrects parce qu'ils employaient d'autres mots. Un test qui contrôle le vocabulaire fait échouer les bonnes exécutions et passer les mauvaises.

The reusable playbook Le guide réutilisable

01
Design the refusals first Concevoir les refus d'abord

What a system will not do is a product decision, not a safety afterthought. Write the refusals before the capabilities and the rest of the design arranges itself around them. On a portfolio, the refusal is the credibility. Ce qu'un système ne fera pas est une décision produit, pas une considération de sécurité ajoutée après coup. Écrivez les refus avant les capacités et le reste de la conception s'organise autour d'eux. Sur un portfolio, le refus, c'est la crédibilité.

02
Measure before you architect Mesurer avant d'architecturer

Retrieval is the reflex answer to "chat with my documents" because most corpora do not fit in context. Count yours before assuming it doesn't. The sophisticated architecture is sometimes the worse one, and measuring is the only way you find out. La recherche vectorielle est la réponse réflexe à "discuter avec mes documents" parce que la plupart des corpus n'entrent pas dans le contexte. Comptez le vôtre avant de supposer qu'il n'y entre pas. L'architecture sophistiquée est parfois la moins bonne, et la mesure est le seul moyen de le découvrir.

03
Model output is untrusted input La sortie du modèle est une entrée non fiable

Text a model produced, rendered into a browser, is an injection surface, no different from text a stranger typed. Parse it, escape it, and write the test that tries to get out. My first link pattern allowed protocol-relative URLs. The test caught it, not me reading the code. Un texte produit par un modèle et affiché dans un navigateur est une surface d'injection, au même titre qu'un texte tapé par un inconnu. Analysez-le, échappez-le, et écrivez le test qui tente d'en sortir. Mon premier motif de lien autorisait les URL relatives au protocole. C'est le test qui l'a attrapé, pas ma relecture du code.

04
Pin every fact you cannot afford to have invented Fixer chaque fait qu'on ne peut pas laisser inventer

Grounding narrows where a model fills gaps, it does not stop it. The dangerous fabrication is never the absurd one, it is the plausible one shaped exactly like the truth. Name those facts explicitly and test them on every run. L'ancrage réduit les endroits où un modèle comble les trous, il ne l'en empêche pas. L'invention dangereuse n'est jamais l'absurde, c'est la plausible, taillée exactement comme la vérité. Nommez ces faits explicitement et testez-les à chaque exécution.

Every other case study here is about designing something for someone else. This one is the same discipline turned on my own site: a real architectural call, a cost I had to justify, a privacy promise written into code rather than into a paragraph, and a bug a test caught before a visitor did. It is running now, at the bottom right of this page. Ask it something it cannot answer. It is quite good at admitting that. Toutes les autres études de cas ici portent sur la conception de quelque chose pour quelqu'un d'autre. Celle-ci applique la même discipline à mon propre site : un vrai choix d'architecture, un coût que j'ai dû justifier, une promesse de confidentialité écrite dans le code plutôt que dans un paragraphe, et un bug qu'un test a attrapé avant un visiteur. Il tourne en ce moment, en bas à droite de cette page. Posez-lui une question à laquelle il ne peut pas répondre. Il est plutôt bon pour l'admettre.

Ask the archive Interroger les archives

Grounded in this site’s case studies and journal. It says when it doesn’t know. Questions are recorded so Loïc can see what the site fails to answer. Nothing else is stored. Fondé sur les études de cas et le journal de ce site. Il dit quand il ne sait pas. Les questions sont enregistrées pour que Loïc voie ce que le site n’explique pas. Rien d’autre n’est conservé.

About this assistant ↗ À propos de cet assistant ↗