Expand description
Classification des erreurs applicatives encore portées par une String.
── Le défaut que ce module borne ──────────────────────────────────────────
Dix-huit gestionnaires décident du code HTTP en cherchant des sous-chaînes dans un message d’erreur. Cent vingt-six occurrences au 2026-09-07.
Le relevé des motifs cherchés dit tout :
52 × .contains("not found")
6 × .contains("introuvable")Le même concept, en deux langues. Les messages du domaine juridique sont en français ; ceux des couches techniques en anglais. Un gestionnaire qui ne cherche que « not found » renvoie donc 500 sur un « introuvable » — une panne serveur là où l’utilisateur a simplement demandé une ressource qui n’existe pas.
C’est exactement ce qui s’est produit le 2026-09-04 : « Impossible de déterminer l’ACP : une écriture manuelle doit désigner un immeuble » ne correspondait à aucun motif, et une saisie incomplète ressortait en 500. La rustine a consisté à ajouter les deux motifs manquants — au site concerné seulement.
── Ce que ce module fait, et ce qu’il ne fait pas ────────────────────────
Il ne remplace pas la vraie correction, qui est de typer les erreurs
(#762, et la migration Result<_, String> → Result<_, AppError> de
#555). Un jour où le domaine rendra AppError::NotFound, ce module n’aura
plus lieu d’être.
En attendant, il rassemble en un seul endroit le lexique bilingue, pour que la prochaine langue ou le prochain synonyme s’ajoute une fois et profite à tous les gestionnaires — au lieu d’être découvert site par site, à chaque 500 injustifié.
Un lexique dispersé sur cent vingt-six sites ne se corrige jamais entièrement : on corrige celui qui a fait mal.
Functions§
- est_
interdit - L’erreur dit-elle que l’appelant n’a pas le droit ?
- est_
introuvable - L’erreur dit-elle qu’une ressource n’existe pas ?
- est_
motif_ acp_ manquant - L’erreur est-elle PRÉCISÉMENT le refus « motif obligatoire » d’une
réservation
on_behalf_of_acp(story #588, INV-5/FR27) ? - est_
motif_ manquant - L’erreur est-elle PRÉCISÉMENT le refus d’une modération communautaire (SEL/Poll/Notice/SharedObject) tentée sans motif texte ?
- est_
refus_ owner_ requis - L’erreur est-elle PRÉCISÉMENT le refus opposé à qui n’a pas de fiche de
copropriétaire (skill/shared_object/resource_booking
resolve_owner()) ?