[06/09 08:21 · 🃏1 joker1] 🤖 2ᵉ TÂCHE AUTONOME, MESURÉE AVANT D'ÊTRE ARMÉE : « qui doit regarder chaque rouge de la nuit ? » — corps-technique/attribuer_rouges.py (mode mesure, n'écrit aucun courrier). Témoin = les 7 rouges réels de la nuit du 06/09, vérité posée à la main. Résultats sur la même matière (5,9 k car) : juge.sh (claude -p medium) 7/7 · 19 s · 1,63 $, courriers qui nomment fichiers et chiffres ; Tour mistral-small:24b 6/7 · 50 s · 0 € ; Tour qwen2.5:32b 6/7 · 83 s · 0 € ; Tour qwen3-coder:30b 3/7 (4 bancs sans réponse). Les 3 modèles Tour ratent LE MÊME cas : un banc de joker1 rouge à cause d'un .glb de neo1 (route au chantier, pas à l'auteur). Décision à Ben (c'est SON résumé de 04:20) : Tour (0 €, 6/7, routage seul) · juge chaque nuit (≈ 1,6 $/nuit de quota compte 2, 7/7 + courriers) · hybride (Tour, juge seulement sur les rouges de 1ʳᵉ nuit). Rien armé.

[06/09 09:04 · 🃏1 joker1] ✅ VOIE 3 BRANCHÉE (Ben « go 3 ») — attribuer_rouges.py --hybride : rouges de 1ʳᵉ nuit → juge claude -p allégé, rouges qui durent → Tour 0 € (mistral-small, repli qwen2.5). Réel sur les 7 rouges du 06/09 : 7/7 justes · 58 s · 0,21 $ (5 neufs au juge, 2 anciens à la Tour — qui a routé juste cette fois). Gardes : fail-closed (Tour/juge muet, JSON illisible, route hors liste ⇒ « NON MESURÉ », jamais une route inventée) · rejeu gratuit (sortie bancs-nuit/<jour>-attribution.json relue si même jour et mêmes bancs) · AUCUN courrier envoyé aux agents : ESSAI À BLANC, le bloc « qui doit regarder » s'ajoute au résumé de 04:20 de Ben et joker1 le vérifie au réveil. Greffé dans resume_matin.py (garde ⑦ : si l'attribution tombe, le résumé part quand même). Témoin 0 € sous le banc de nuit : banc_temoin_attribuer_rouges.py 10/10. Prochain pas : demain 07/09, vérifier le bloc du résumé ; sur le mot de Ben, passer d'« à blanc » à l'envoi des courriers.

06/09 18:36 (joker1, Gardien par intérim) — MESURÉ sur la question de Ben « a-t-on fait le codeur ? quel modèle réfléchit le mieux ? » : ① le CODEUR EXISTE (opérateur, 05-06/09) : Claude Code dont le cerveau est qwen3-coder-64k sur la Tour (profil /root/.claude-codeur, lanceur codeur-tour, tmux codeur, MCP neo-toolgate 20 outils + 419 forgés + forge gardée + Google de Ben ; ~43 k jetons de travail ; choisi le 05/09 sur un banc à vérificateur caché : le seul qui échoue franchement). Son modèle reste RÉSIDENT (22 Go / 24,6, keep_alive infini) : tout autre gros modèle se bat contre lui — c'est la cause des 3 chutes de ce matin (32 k par défaut), pas une fatalité. ② « le modèle qui réfléchit le mieux » n'a jamais été mesuré : corps-technique/mesurer_reflexion_tour.py (7/7 épreuves) le mesure CETTE NUIT à 04:45 (passage unique, pas un timer) — 6 questions vérifiables dont l'honnêteté, 6 candidats ≤ 20 Go (qwen3-coder-64k · deepseek-r1:32b · qwen3.8:27b · gemma3:27b · mistral-small:24b · phi4:14b), contexte 8 192, déchargement après chaque modèle, garde de débordement RAM. Résultat dans courrier/ben.md au matin.

07/09 01:44 (joker1) — 2ᵉ Claude Code sur la Tour après le codeur : scribe-tour (écrit les fiches de la mémoire du Gardien, Notion + internet en lecture, 0 €). Même mécanique que codeur-tour, permissions par chemin. Prouvé : fiche entière 35 s, juge Tour FIDÈLE. Détail : memo-essai/scribe-tui/README.md.

💶 08-09/09 — Deux bascules faites : ce qui était payant tourne à 0 €, et le relais est écrit

(joker1 · Claude Opus 5 · rejoué le 09/09 à 17h06)

Rappel de la mission de Ben (03/09) : « j'ai dû payer 2 abonnements Max parce qu'Opus 5 tournait en rond. » La réponse n'est pas « moins travailler » : c'est envoyer le répétitif sur la Tour et garder le payant pour le jugement.

tâche avant après preuve mesurée
juger les fiches MÉMO juge payant (claude -p) Tour, phi4:14b — 0 € 90/92 d'accord sur 92 fiches réelles · invention plantée vue · valider_fiches.py 11/11
attribuer les rouges de la nuit ≈ 18 $/mois 0,00 $ 9 rouges sur 9 attribués en réel · attribuer_rouges.py 13/13 · filet éprouvé dans les deux sens
chercher dans la mémoire (319 fiches) — 0 € embeddings sur l'Ollama local du VPS, jamais la Tour
écrire les fiches (scribe) — 0 € contrôle mécanique : chaque chiffre et chaque nom doit exister dans la page

Retour arrière prévu partout (une bascule sans retour arrière est un pari, pas une décision) : ATTRIBUER_1ERE_NUIT=juge ramène le juge payant · --juge claude sur les fiches · le juge payant reste la référence hebdomadaire pour re-banc-er le juge de la Tour.

MESURE QUI SURPREND ET QU'IL FAUT GARDER : phi4:14b — le plus petit modèle de la Tour (9 Go) — est à la fois le meilleur juge et le meilleur raisonneur mesurés, devant des modèles 2 à 3 fois plus gros (banc de 17 cas avec fiche piégée : phi4 16/17 et piège vu en 86 s ; qwen3:27b 14/17 en 657 s ; le modèle codeur ne voit pas le piège du tout).

⚠️ DÉFAUT TROUVÉ EN CHEMIN, ET IL A FAILLI COÛTER CHER : le banc qui notait le juge de la Tour mélangeait deux natures dans son dénominateur — un vrai raté et un cas simplement non jugeable. phi4 était noté « 4/9 » alors que la référence ne couvrait que 4 des 9 rouges : son vrai score était 4/4. J'ai failli garder 18 $/mois en croyant que la Tour n'était pas à la hauteur. Contrôle posé pour que ça ne se reproduise pas : corps-technique/verifier_denominateurs.py (voir la ligne 🔍 AUDIT).

LE RELAIS — ce que Ben a demandé le 09/09 : « je dirigerais avec Fable 5.1 et GPT-6, mais ils seront limités à un moment ; tous les autres devront pouvoir reprendre. » C'est exactement ce que ces bascules achètent : quand tous les modèles payants sont limités, la Tour n'a ni quota ni facture et continue de juger, de fichier et de faire tourner les 63 bancs de nuit. Le protocole complet est écrit dans la page 🛡️ PASSATION DU GARDIEN (bloc à coller + table de relais).

RESTE À FAIRE sur cette ligne : ⏳ GO Ben ① — le timer de nuit du scribe (systemd) · passer le reste du répétitif sur la Tour · l'attribution des rouges tourne à blanc (aucun courrier réellement envoyé) : ⏳ GO Ben ⑤ pour l'ouvrir en vrai.

<aside> 📬 🃏1 14/09 17h40 (Opus 5) — 🤖 LA FILE EST REGARDÉE : verifier_file_agents.py (corps-technique 613892f) lit la file Notion sur 24 h et juge ① rien en ERROR ② rien bloqué en RUNNING > 30 min ③ rien oublié en TODO > 2 h ④ l'exécuteur bat ; il DIT le coût par voie (Tour 0 € · juge claude -p → <jour>-attribution.json · exec) et tient bancs-nuit/file-agents.json (N/7 jours avec ≥ 1 tâche). Témoin 10/10 (a trouvé le journal qui doublait au rejeu). Mesuré 17h40 : 8 finies/24 h (7 DONE · 1 ERROR = l'essai neo-sonnet du 13/09, jamais lu), Tour 5 (0 €), juge 2, 2/7 jours avec ≥ 1 tâche. Ramassé par la nuit sans enrôlement. Curseur « ≥ 1 tâche/nuit 7 nuits, coût affiché » : l'instrument existe, la borne se mesure à partir du 21/09.

</aside>

<aside> 🎯

17/09 18h4x (joker1, Opus 5) — J'AI POUSSÉ DEUX VRAIES TÂCHES DANS LA FILE, ET ELLES ONT TROUVÉ UN PIÈGE QUE LE BANC NE POUVAIT PAS VOIR.

Le matin, verifier_voie_llm.py disait 4/4 et une tâche réelle avait abouti en 686 ms. Ce soir j'ai quand même poussé une tâche écrite comme un humain l'écrit : « [LLM] Reponds exactement le mot suivant et rien d'autre : VOIE-LLM-VIVANTE », colonne Model = tour-qwen32 (le bon modèle). Résultat : ERROR 400 en 50 ms.

La cause, lue dans /opt/neo-dispatch/verbs.py : _llm() prend le modèle dans le texte du prompt, avant le premier « : ». Mon modèle était donc littéralement « Reponds exactement le mot suivant et rien d'autre ». Et la colonne Model de la BDD n'est JAMAIS lue pour le verbe LLM — elle ne sert qu'à router les tâches claude-code vers un autre exécuteur.

PROUVÉ DANS LES DEUX SENS, par deux tâches réelles du soir : celle qui a échoué déclarait le BON modèle dans la colonne (tour-qwen32) · celle qui a réussi (DONE, 51,6 s, réponse exacte VOIE-LLM-VIVANTE-20260917) déclarait neo-opus — un modèle absent du routeur — et tournait en réalité sur tour-qwen32 écrit dans le prompt. Une colonne qui a l'air de commander et qui ne commande rien est pire qu'une colonne absente.

CE QUE ÇA N'EST PAS : une panne. Mes propres scripts sont immunisés, ils construisent le préfixe (attribuer_rouges.py : "[LLM] %s: %s" % (MODELE, q)). Les tâches d'organe de cette nuit passeront. Le piège ne frappe que ce qu'un humain écrit à la main — Ben, le Gardien, ou moi ce soir.

CORRECTIF PRÊT, NON APPLIQUÉ (/root/backups/joker1-dispatch-modele-20260917-1845/) : le modèle vient du prompt quand il y est, sinon de la colonne ; un texte qui ressemble à une phrase n'est plus pris pour un nom de modèle ; sans modèle du tout, le refus nomme la convention au lieu d'un 400 opaque ; et l'erreur imprime désormais le modèle envoyé. Logique éprouvée 5/5 sur les deux cas réels du soir plus trois cas limites. APPLIQUER.sh et RETOUR.sh écrits.

POURQUOI JE NE L'AI PAS APPLIQUÉ : il faut systemctl restart neo-dispatch — action systemd, donc GO Ben. Et j'ai délibérément remis le code d'origine en place : laisser le correctif sur le disque sans redémarrer fait rougir verifier_dispatch_garde toute la nuit (« le process n'a pas chargé ce code ») — un rouge qui n'est pas un défaut, et c'est exactement ainsi qu'on apprend à ne plus lire les rouges. Garde : 11/11.

</aside>

✅ 17/09 20h31 — « GO modèle » de Ben APPLIQUÉ. La colonne Model de la file commande enfin le verbe [LLM]. verbs.py + worker.py remplacés, neo-dispatch redémarré, empreintes vérifiées après coup (le code chargé EST le code corrigé), garde du dispatch 11/11. Sauvegarde fraîche de l'état d'avant : /root/backups/joker1-dispatch-avant-gomodele-20260917-203037/ ; retour arrière en une commande : RETOUR.sh.

🔬 17/09 20h3x — prouvé DANS LES DEUX SENS, sur le chemin réel d'une tâche. ① Témoin AVANT, posé exprès pour échouer : [LLM] Reponds exactement le mot suivant… : TEMOIN-AVANT, colonne Model = tour-qwen32 → ERROR en 36 ms. ② Même tâche APRÈS → DONE en 51,5 s, réponse exacte « TÉMOIN-APRÈS », lue dans la ligne Notion et pas déduite du statut. Sans le témoin d'avant, j'aurais attribué au remède un succès que je n'aurais pas su distinguer d'un hasard. Les trois formes marchent : modèle dans le prompt (prioritaire) · modèle dans la colonne (le défaut réparé) · ni l'un ni l'autre → le refus nomme la convention au lieu d'un 400 muet.

🩺 17/09 20h3x — le vrai coupable était mon banc, et il est réparé. verifier_voie_llm affichait 4/4 pendant que le chemin était piégé : ses quatre épreuves mesuraient le proxy (clé, réponse, témoin négatif, déclarations divergentes), aucune ne passait par le verbe [LLM] qu'emprunte réellement une tâche. Une épreuve qui n'emprunte pas le chemin de l'utilisateur mesure un COMPOSANT, pas un SERVICE. Trois épreuves de routage ajoutées — requests.post remplacé par un espion, donc aucun appel réseau, aucune tâche posée, aucun jeton dépensé — et VOIE_LLM_VERBS permet de pointer un autre routeur. Éprouvé par MUTATION sur le code d'avant : 4/5, sortie 1, message exact « le correctif n'est PAS chargé ». Sur le code d'aujourd'hui : 7/7. Commit 856d1b0. Ma première version de ⑦ accusait le code à tort — elle lisait execute() comme un Result alors qu'il rend un tuple (verbe, Result).

🧪 17/09 20h3x — un échec DÉLIBÉRÉ n'est pas une panne, mais il ne se cache pas. Mon témoin « AVANT » comptait comme un défaut dans verifier_file_agents et aurait fait rougir la nuit pour un rouge qui n'en est pas un — l'usure du fail-closed, celle qui apprend à ne plus lire les rouges. Convention étroite et visible : titre commençant par TEMOIN/TÉMOIN → hors verdict, mais compté ET nommé dans la même ligne. Deux épreuves la gardent, dont ③ter : un témoin déclaré ne couvre PAS une vraie panne du même lot — c'est elle qui empêche la convention de devenir une porte dérobée. Commit bd55309. ① reste rouge ce soir et c'est juste : 6 erreurs réelles sur 24 h, toutes antérieures au correctif (dont celle du Gardien, pris au même piège) ; elles sortiront de la fenêtre demain. Ne pas les réparer.