HEURISME
Le blog : cloud, DevOps, IA et infographies.
Articles
-
Ce que le contexte perd à la compaction
Quand la fenêtre de contexte est pleine, Claude Code remplace la conversation par un résumé. Ce qui survit (CLAUDE.md, memory, fichiers relus), ce qui part, et comment garder l’état sur le disque : fichier de suivi, commits, hook
SessionStart compact. -
La fréquence qui dérive pendant le passage d’un satellite
Un satellite en orbite basse file à 7,6 km/s. Sur 145,800 MHz, la fréquence reçue dérive de ±3,4 kHz pendant le passage, de ±10,3 kHz sur 437,800 MHz, à 157 Hz/s au zénith. La géométrie à l’échelle, un passage simulé avec son récepteur, ce que la FM tolère et pas la BLU ni la CW, le suivi par Gpredict et la commande
rigctld, et l’heure qui fixe l’erreur. -
La recherche sémantique ne trouve pas la facture INV-48213
On cherche INV-48213 avec un vrai modèle d’embedding, multilingual-e5-small : le bon document sort 3e, derrière INV-48231. Pourquoi un identifiant se perd dans un vecteur, ce que fait BM25, pourquoi la fusion RRF laisse des égalités, et comment un champ d’identifiants avec un filtre exact remet le bon document en tête 13 fois sur 13.
-
La facture NAT Gateway
Des instances en subnet privé lisent S3 et tirent leurs images ECR à travers la NAT Gateway, qui facture 0,05 $ par Go à Paris. Cost Explorer et les flow logs pour voir qui consomme, le gateway endpoint S3 gratuit, le seuil des interface endpoints, et un calculateur pour comparer trois montages.
-
Disque plein, mais la commande
dune trouve riendfdit 90 %,duadditionne 14 Ko : un log de 150 Mo supprimé parrm, encore ouvert par un process.lsof +L1,/proc/PID/fd, la troncature par: > /proc/PID/fd/N, le fichier creux sansO_APPEND, logrotate copytruncate ou create avec un signal, et le cas des conteneurs, mesurés sur un ext4 de 200 Mo. -
Hooks : la consigne que l’agent ne peut pas ignorer
Une règle dans CLAUDE.md est suivie la plupart du temps, un hook est exécuté par le harness à chaque fois. Événements,
exit 2, sortie JSON et matcher, trois hooks testés avec Claude Code (push forcé sur main, tiret cadratin, hook Stop qui relance), et pourquoi un hook n’est pas une sandbox. -
Terraform : « Error acquiring the state lock » après un job coupé
Avec Terraform (ou OpenTofu, son fork), un job de CI annulé en pleine commande
tofu applylaisse le verrou du state dans S3. La ligne DynamoDBLockID, le fichier.tflockde Terraform 1.10 et OpenTofu 1.10, quand la commandeforce-unlockest sûre, quand elle crée deux writers, et comment faire attendre la CI. -
Bouton pressé une fois, compté 5 fois
Un bouton sur une interruption FALLING compte 3 ou 7 appuis pour un seul. Le rebond du contact mesuré par Jack Ganssle, le pull-up interne de l’ESP32, le filtre RC et le trigger de Schmitt 74HC14 avec le calcul du délai, puis l’anti-rebond logiciel par échantillonnage. Démo : un appui, quatre compteurs.
-
Retry, backoff et jitter : quand les clients achèvent le service
Après une panne, 2000 clients réessaient au même rythme et le service retombe. Backoff exponentiel, plafond, full jitter et decorrelated jitter (Marc Brooker, AWS), budget de retries des SDK AWS, Retry-After et clé d’idempotence, avec une simulation à lancer dans la page.
-
RS-485 : ça marche à 1 m, mais plus à 50 m
Une paire RS-485 de 50 m est une ligne de transmission : 120 Ω, 4,3 ns par mètre, et un bout ouvert qui renvoie le front. La règle du temps de montée contre l’aller-retour, 120 Ω aux deux bouts seulement, la polarisation au repos, le bus plutôt que l’étoile, et une simulation des réflexions vues par le récepteur.
-
Cinq sous-agents en parallèle : ce qu’on gagne, ce qu’on paie
Chaque sous-agent part d’un contexte neuf : il relit les fichiers et ne renvoie qu’un résumé. Le temps gagné plafonne à 1 / (1 − p), la relecture se multiplie par N, et le renvoi du contexte à chaque requête (cache read à 0,1 fois l’input) change le bilan. Un calculateur aux hypothèses modifiables compare un agent seul et N sous-agents.
-
Trop d’outils MCP
Chaque outil MCP déclaré part dans chaque requête de l’agent. Trois serveurs réels mesurés : 48 outils, environ 7 500 tokens par tour, des outils sosies qui gênent le choix du modèle. Le chargement à la demande, et ce qu’il ne rattrape pas.
-
Le microcontrôleur planté qui ne repart jamais
Un watchdog nourri dans une interruption de timer ne voit pas la boucle bloquée. Le motif des drapeaux de vie, le Task Watchdog d’ESP-IDF (5 s et sans reset par défaut), le timeout au démarrage, et la cause du reset dans
esp_reset_reason()ouRCC_CSR, avec une simulation de deux cartes. -
Infinity : 75 000 agents en pause dans 8 Go
Infinity : runtime d'agents en Rust par AWS et UC Berkeley (projet Hydro), Apache 2.0. Une complétion par slice, l'appel d'outil part en HTTP fire-and-forget, entre deux slices l'agent n'est qu'un historique stocké. Banc de test public : 80 000 agents, 99,1 Kio par agent idle, 352 octets par tâche tokio en attente.
-
Scion : 30 000 merges par jour, git ne suit plus
Le monorepo d'Anthropic est passé de 2 500 à plus de 30 000 merges par jour en quatre mois, avec près de 100 Go d'historique. Avec Scion, le serveur fait les commits et les merges : une ref est une ligne Spanner avancée par compare-and-swap. Banc de test public, 200 agents sur un Mac : git classique 367,5 s, merge côté serveur 10,3 s, 36 fois plus vite.
-
eBUS : un bus auto-alimenté sur 2 fils
Une chaudière Saunier Duval ou Vaillant parle à son régulateur sur deux fils qui portent aussi le courant : UART 2400 bauds, SYN après 40 à 45 ms de silence, arbitrage par ET des adresses. Trame maître-esclave, échappement, CRC polynôme 0x9B. Chaque octet recalculé en Python sur cinq vraies trames de logs ebusd publics, sans matériel eBUS.
-
Une antenne à gain ne crée pas d’énergie
dBi, dBd et diagramme de rayonnement, simulés dans NEC2 à 1090 MHz : un dipôle à 2,14 dBi, une Yagi à 7,37 dBi, une colinéaire à 5,08 dBi qui aplatit son lobe, et la même puissance rayonnée pour toutes. Exemple suivi : un récepteur ADS-B sur un toit, entre un fouet et une colinéaire.
-
Polarisation : l’antenne ADS-B montée à plat
Un récepteur ADS-B sur 1090 MHz dont l’antenne est couchée à l’horizontale : la perte en cos² de l’angle mesurée avec NEC2, ce que les reflets ramènent, la portée divisée par 3 ou plus, et la polarisation circulaire du GPS.
-
Antenne quart d’onde : pourquoi 8 cm à 868 MHz
Une antenne ground plane faite maison pour une passerelle LoRa 868 MHz, rejouée dans NEC2 : le brin résonne à 8,14 cm et non à λ/4 = 8,63 cm, 36 Ω sur un plan parfait, 24 Ω avec des radians à plat, 51 Ω et un ROS de 1,02 avec des radians inclinés à 45°.
-
Le ROS : ce que l’antenne renvoie à l’émetteur
Coefficient de réflexion, ROS, pertes de retour et puissance réfléchie, sur une ground plane 144,800 MHz simulée avec NEC2 : le λ/4 calculé est trop long, et 20 m de RG-58 font lire un ROS de 2,95 sur une antenne débranchée.
-
Câble coaxial : 15 m de RG58 perdent plus que l’antenne ne gagne
Les pertes du câble entre l’antenne et le récepteur, d’après les fiches constructeur : RG174, RG58, RG213 et LMR-400 à 144, 868 et 1090 MHz, les connecteurs, ce que valent 3 dB, et pourquoi le préampli d’un récepteur ADS-B se met en haut du mât.
-
Chaîne TLS incomplète : le navigateur passe, curl et Python non
« unable to get local issuer certificate » sur une API qui s’ouvre dans le navigateur : nginx n’envoie que le certificat du serveur, sans l’intermédiaire. Banc de test nginx avec une PKI locale, erreurs de curl, Python et OpenSSL recopiées, AIA suivi à la main, puis le fichier fullchain.
-
Limite CPU : une API ralentie sur une machine au repos
Avec --cpus=1, quatre threads vident le quota CFS de 100 ms en 25 ms, puis tout le conteneur attend la période suivante. Mesuré dans Docker : le p99 d’une API passe de 7,5 à 78,7 ms alors que le conteneur consomme 0,25 CPU en moyenne. cpu.max, cpu.stat et ce qui évite le gel.
-
Un changement DNS ne se propage pas : les caches expirent
Une bascule de site rejouée avec NSD, Unbound et dig : le serveur faisant autorité donne la nouvelle adresse tout de suite, le resolver garde l’ancienne jusqu’à la fin du TTL, un NXDOMAIN reste 30 s en cache, et un TTL baissé à l’avance ramène l’écart à 5 s.
-
Inodes épuisés : « No space left on device » avec de la place
Sur un /var ext4 de 128 Mo, 7 830 sessions PHP épuisent les 8 192 inodes alors que df -h affiche 72 % : ce qu’est un inode, df -i, du --inodes pour trouver le dossier, la purge des sessions sur Debian, mke2fs -i et -N, et XFS qui relève son plafond à chaud.
-
Des 502 rares que personne n’arrive à reproduire
Une API Node.js derrière nginx ou un ALB : Node.js ferme ses connexions keep-alive au bout de 5 s, le proxy les garde 60 s. Sur un banc de test, 6 à 11 POST sur 460 finissent en 502, nginx rejoue les GET sans que le client le voie, et le compteur tombe à zéro quand le proxy ferme en premier.
-
Un Allow ne suffit pas : IAM refuse quand même
Un rôle de déploiement autorisé à faire s3:PutObject reçoit AccessDenied. Le simulateur IAM, rejoué couche par couche : refus implicite, permission boundary, Deny explicite sur aws:SecureTransport, SCP de l’organisation.
-
En français, le même prompt coûte plus de tokens
Ce qu’est un token, pourquoi le tokenizer découpe davantage le français, et ce que ça coûte : sur un long texte et sa traduction officielle, de 1,14 à 1,50 fois plus de tokens selon le tokenizer. Les accents n’y sont presque pour rien, et le chatbot d’un service client paie 17 % de plus.
-
44Net : le réseau IP des radioamateurs
Le réseau 44.0.0.0/8 attribué aux radioamateurs en 1981, le quart vendu à Amazon en 2019, et le chemin d’un paquet vers une adresse de 44.151.0.0/16 : BGP, passerelle IPIP de l’UCSD, WireGuard, et ce que le règlement interdit sur l’air.
-
Une facture électronique, vue de l’intérieur
Une facture Factur-X fictive, fabriquée et validée hors ligne. Le PDF/A-3 ouvert en couches, le XML CII et ses champs EN 16931, les métadonnées XMP, les cinq profils, puis les règles BR-CO-15 et BR-CO-17 du validateur Mustang, et une erreur de TVA de 0,20 € qui passe quand même.
-
Ce que Claude Code consomme et envoie
Ce qui remplit la context window d’une session et ce que ça coûte, puis où partent tes prompts selon le backend, et les réglages pour couper le reste.
-
Les gateways MCP
Une ligne par couple agent-serveur, ou une seule correspondance. Ce qu’une gateway MCP prend en charge, ce que font les offres point par point, et les risques qui restent.
-
Seul, ou à plusieurs agents ?
Les cinq façons de faire travailler plusieurs agents avec Claude Code, en brigade de cuisine. Ce que chacune coûte, ce qu’on y voit, et comment choisir.
-
Prompt injection : ce qui l’arrête, couche par couche
Les trois conditions d’une fuite, les points d’entrée, six couches de défense dans Claude Code, leurs limites et les réglages qui ferment les trous.
-
Configurer et étendre Claude Code
CLAUDE.md, settings, skills, subagents, hooks et permissions. Où écrire une consigne, quoi ajouter et quand, et ce qui décide vraiment d’un appel d’outil.
-
Claude Code, du terminal à la plateforme
Le même agent, lancé par un humain, par un événement ou par un service, dans une infra qui le cadre.
-
Les classifieurs qui surveillent un agent LLM
Une page piégée fait fuiter ~/.aws/credentials par un curl. Où placer un classifieur pour l’arrêter, comment régler son seuil, pourquoi la plupart des alertes sont fausses, ce que couvrent Claude Code, Bedrock et Azure, et ce que le fournisseur du LLM filtre de son côté.
-
Supply chain des dépendances
Un install exécute du code écrit par des inconnus. Cinq couches pour choisir ce qui entre et quand, en Node comme en Python, avec huit attaques réelles.
-
OpenSpec, se mettre d'accord avec l'agent avant qu'il code
Guide pratique du spec-driven development avec OpenSpec et Claude Code, du plan relu à la spec archivée.
-
Le juge LLM qui préfère la réponse la plus longue
Biais de position et biais de longueur d’un LLM qui en note un autre, mesurés sur 30 paires de réponses DevOps et réseau avec deux juges en local. Puis les parades, mesurées elles aussi : deux ordres, grille de critères, référence, sortie structurée.
-
JSON, YAML ou CSV : ce que coûte un prompt
Les mêmes 100 lignes coûtent jusqu’à 3,2 fois plus de tokens selon leur format. Découpage token par token, six formats comptés avec quatre tokenizers, le français contre l’anglais, le prix des nombres et des UUID, puis 10 questions posées à un modèle local avec chaque format.
-
Un job à 2 h 30, la nuit du changement d’heure
Deux fois 2 h 30 en octobre, aucune en mars. Ce que font cron, systemd, un CronJob Kubernetes et EventBridge Scheduler, sur des sorties réelles de cronie, systemd-analyze et robfig/cron.
-
Même prompt, deux réponses
Temperature à 0 et pourtant deux réponses différentes. Logits, softmax, temperature, top-p et seed mesurés sur un modèle local, 50 essais par réglage, la non-associativité des flottants et l’effet du batch, puis ce qu’il faut en tirer pour tester un agent.
-
Les avions au-dessus de chez soi : ce qu’ils émettent sur 1090 MHz
Un message ADS-B de 112 bits ouvert champ par champ. Démodulation PPM d’un vrai enregistrement IQ, CRC-24 recalculé, indicatif en 6 bits, altitude, position CPR pas à pas avec ses trames paire et impaire, vitesse, et deux décodeurs qui concordent.
-
Packet radio : ce qui passe vraiment dans l’air
La trame AX.25 octet par octet, le FCS, le bit stuffing, l’AFSK 1200, les digipeaters et KISS, suivis d’une position APRS depuis l’indicatif jusqu’à la tonalité.
-
Le GPS met 30 secondes à savoir où il est
Deux vrais logs NMEA 0183 décodés champ par champ (GGA, RMC, GSA, GSV, checksum XOR). Le signal arrive vite, l'orbite non. Le message de navigation à 50 bit/s, la trame de 30 s, les éphémérides, l'almanach de 12,5 minutes, et ce que changent les démarrages à froid, tiède, chaud et l'A-GPS.
-
DMX512 : 512 octets, 44 fois par seconde
Le protocole qui pilote les projecteurs de scène depuis 1986. RS-485, BREAK et MAB, adressage, RDM, Art-Net et sACN, et ce qu’il faut pour lui parler depuis du code.
-
Le cold start Lambda, phase par phase
Où part le temps avant la première ligne du handler. Les phases INIT, INVOKE et SHUTDOWN, la facturation de l’INIT depuis le 1er août 2025, le poids des imports, la mémoire, la provisioned concurrency et SnapStart.
-
UART à 115200 bauds, à 2 % près
Une liaison série marche à 9600 bauds et affiche des caractères faux à 115200. Trame, échantillonnage 16x, diviseur entier et erreur de débit selon le quartz, cumul jusqu'au bit de stop, framing error. Récepteur simulé d'après la datasheet ATmega328P et vraies captures décodées par sigrok-cli.
-
Human in the loop ou over the loop
Approuver chaque action de l’agent, ou superviser le système ?
-
Ce qui invalide le prompt caching d’un agent
Le cache divise la facture d’un agent au moins par dix, tant que le préfixe ne bouge pas d’un octet. Quatre pièges qui l’invalident, et comment le mesurer.
-
LoRa : pourquoi 20 octets prennent plus d’une seconde
Le temps d’antenne d’un message LoRa de 20 octets, de SF7 à SF12, puis la règle européenne du duty cycle à 1 % et la Fair Use Policy de TTN. Tout est calculé, aucune radio.
-
Modbus RTU : le silence entre les trames
Sur une paire RS-485, aucun caractère ne marque le début ou la fin d'une trame, seulement du silence. t1.5, t3.5, le CRC, les exceptions, et pourquoi le latency timer d'un adaptateur USB FTDI coupe une trame en deux.
-
terraform test : ce que le mock voit au plan, et à l’apply
Un mock_provider teste un module sans cloud, mais une valeur de defaults n’existe pas encore au plan. Le piège, trois parades et quel run écrire.
-
ESP-NOW : des ESP32 qui se parlent sans routeur
Pas de point d’accès, pas d’IP. La trame 802.11, les peers, le canal imposé par le routeur, le chiffrement, le sommeil et les relais, d’après la doc ESP-IDF v5.4.
-
Bus CAN : l’ID le plus bas gagne, sans collision
Arbitrage bit à bit, ET câblé, format de trame, stuffing, CRC-15, ACK et compteurs d’erreurs, recalculés sur une trame d’exemple. Bus et erreurs simulés, pas de matériel CAN.
-
Lire un AccessDenied AWS
La fin du message dit quelle couche de policy a refusé. L’ordre d’évaluation, les phrases de la doc, les clés de condition absentes, KMS et les outils.
-
SSM Session Manager : un shell sans aucun port ouvert
Pas de règle inbound, pas de bastion, pas de clé, et pourtant un shell. Les connexions sortantes de l’agent, les VPC endpoints, KMS, les logs et le diagnostic.
-
Ports source épuisés : EADDRNOTAVAIL, TIME_WAIT et NAT Gateway
Cent connexions passent, la suivante échoue avec EADDRNOTAVAIL. Pourquoi TIME_WAIT garde les ports 60 s, ce que changent le keep-alive et tcp_tw_reuse, et la même limite sur la NAT Gateway AWS (chiffres tirés de la doc AWS, rien n’a été créé).
-
Exit 137 : qui a tué le conteneur ?
Le code 137 dit SIGKILL, pas qui l'a envoyé. OOM de la cgroup v2, docker stop et son délai, kill -9 : les traces de chaque suspect (memory.events, dmesg, oom_score_adj), mesurées sur Docker 29.4.2.
-
I²C : qui tient l’horloge
Un capteur I²C qui répond une fois sur deux. Collecteur ouvert, pull-up et temps de montée, START, adresse 7 bits, ACK et NACK, puis 65 ms de clock stretching mesurées sur une vraie capture, et un maître qui ne le respecte pas.
-
Pourquoi pip compile au lieu d’installer un wheel
Même paquet, même commande, un fichier différent sur chaque machine. Les tags d’un wheel, la glibc, le sdist et uv, sur des sorties réelles de pip et des images Lambda.
-
Le process qui survit à kill -9
Un dd bloqué sur un disque qui ne répond plus, en état D. Ce que le noyau fait du SIGKILL, comment le voir (wchan, SigPnd), load average, TASK_KILLABLE, NFS hard et soft.
-
SSH passe, git clone se fige
Le trou noir PMTUD, rejoué sur un banc de test réel. Un transfert HTTP de 2 Mo se fige quand un pare-feu jette l’ICMP « fragmentation needed ». Mesures avec tcpdump, tracepath et ss, MSS clamping, PLPMTUD et IPv6.
-
Une URL S3 pré-signée, de l’intérieur
D’où viennent les 64 caractères de la signature, ce qu’ils protègent et pourquoi S3 refuse parfois l’URL. Calcul SigV4 refait à la main sur des sorties de botocore.
-
Lire un plan Terraform
Deux mille lignes, et une dizaine qui comptent. Six symboles, les remplacements qui ne disent pas pourquoi, les moved oubliés et un secret en clair, sur des sorties réelles.
-
CRLF : ce que Git stocke, ce qu’il écrit sur le disque
Trois copies d’un même fichier, des fins de ligne différentes. core.autocrlf, .gitattributes, la renormalisation et le shebang en CRLF, sur des sorties réelles de git.