Repository navigation
Bonnes Pratiques Claude Code
Auteur : hprzeta · Mis à jour : 2 juin 2026 Guide vivant — enrichi à chaque nouvelle leçon de session Fusion : version wiki 1ᵉʳ juin + leçons session 2 juin (529, crédits, modèle, capture)
C'est la confusion n°1. Il y a deux choses différentes à surveiller :
Affichées en bas de Claude Code :
5h[█ 18%]⏱4h18m | 7d[█ 21%]⏱3d13h | Sonnet 4.6(26.0k/200.0k) | cache 1m46s
↳ Riemann_Lab ⑂ Riemann_Lab_C
| Segment | Ce que c'est | Quand agir |
|---|---|---|
5h[█ X%]⏱Yh |
Quota fenêtre glissante 5h — forfait Pro | Proche 100% → pause forcée |
7d[█ X%]⏱Yh |
Quota semaine glissante 7j | Rarement critique |
Sonnet 4.6(Xk/200k) |
Contexte session — mémoire de travail | |
cache Xm Xs |
Cache prompt — expire en ~5 min | Relancer vite = plus rapide/moins cher |
cache COLD |
Cache expiré | Pas grave — Claude recharge au prochain appel |
↳ Repo ⑂ Branche |
Repère Git actif | Vérifier branche avant tout commit |
Affiché comme XX% context used (bas droite) ou (XX.0k/200.0k) à côté du modèle.
- C'est la mémoire de travail de Claude Code dans la session en cours
- À ~200k tokens, l'auto-compact se déclenche : Claude Code RÉSUME l'historique → il peut OUBLIER des contraintes ou RÉPÉTER du travail déjà fait
- C'est CE compteur qui dicte quand committer/pousser
| Compteur | Ce qu'il limite | Quand s'inquiéter |
|---|---|---|
| 5h / 7d | Volume de travail autorisé | Proche de 100% = pause forcée |
| Contexte (k/200k) | Qualité/cohérence de la session | > 70% = sécuriser le travail |
| Seuil contexte | Action OBLIGATOIRE |
|---|---|
| < 50% | Travail normal. On peut démarrer une grosse tâche. |
| 50% |
git commit checkpoint (wip). Tâche en cours = on continue. |
| 70% |
git push origin <branche>. NE PAS démarrer de nouvelle grosse tâche. |
| 80% | STOP nouvelles tâches. Finir/sécuriser uniquement. |
| 85–90% | URGENCE : commit + push IMMÉDIAT. Aucun nouveau test/run. |
| > 90% | Commit/push depuis le TERMINAL BASH (pas Claude Code) pour ne pas consommer plus de contexte. Puis fermer. |
À 85–92% de contexte, Claude Code continuait à lancer des tests de diagnostic au lieu de committer, malgré les STOP. Solution qui a marché : taper la commande git directement dans le TERMINAL BASH (fond violet), pas dans Claude Code. Le bash exécute instantanément SANS consommer de contexte Claude Code.
# Commande de sauvetage à 90%+ (terminal bash, PAS Claude Code) :
cd ~/projet_zeta && git add -A && git commit -m "wip: checkpoint" && git push origin Riemann_Lab_CC'est la leçon la plus rentable de la session v4.1.
Principe : avant tout run long (plusieurs minutes), insérer des POINTS D'ARRÊT où Claude Code DOIT montrer ses chiffres et attendre un "OK continue" explicite.
- STOP ici. Montre-moi ces chiffres et attends mon "OK continue".
Au point d'arrêt n°1 de v4.1, le test a révélé 359 désaccords sur la détection des changements de signe. Sans ce point d'arrêt, un run de plusieurs heures aurait RATÉ des centaines de zéros sans alerte. Le test a tué le bug en quelques minutes, avant le run long.
| Ce que tu vois | Décision |
|---|---|
| 0 désaccord + mêmes changements de signe partout | "OK continue" |
| Écart numérique ~1e-3 mais 0 désaccord | "OK continue" (normal = troncature RS) |
| Désaccords > 0, ou nb de changements de signe différent | STOP — diagnostiquer avant tout run |
| Modèle | Usage | Coût relatif | Verdict projet |
|---|---|---|---|
| Opus 4.x | Décisions d'architecture délicates, diagnostic complexe | ×5 à ×10 | Surdimensionné au quotidien — épuise les crédits vite |
| Sonnet 4.6 | Code, math, documents, sessions longues | ×1 | ✅ Modèle cible |
| Haiku 4.x | Réponses courtes, classification simple | ×0.2 | Trop léger pour le raisonnement zêta |
Rester sur Sonnet par défaut. Basculer sur Opus (/model) uniquement pour
les vrais blocages d'architecture, puis repasser sur Sonnet.
Deux endroits à configurer (une seule fois) :
# 1. Claude Code — dans ~/.claude/CLAUDE.md (LOCAL, ne jamais committer)
## Modèle par défaut
# Utiliser Claude Sonnet 4.6. Ne pas basculer sur Opus sauf demande hprzeta.2. App web claude.ai : Paramètres → Général → Modèle par défaut → Sonnet 4.6
Changer en cours de session :
/model claude-sonnet-4-6 # basculer sur Sonnet
/model # voir le modèle actuelAPI Error: 529 Overloaded. This is a server-side issue, usually temporary.
Pas un problème de ton code ou de ta machine. Vérifier en temps réel : https://status.claude.com
| Statut | Signification | Action |
|---|---|---|
| 🟢 Opérationnel | Tout va bien | — |
| 🟡 Panne partielle | Dégradé | Réessayer toutes les 30–60 secondes |
| 🔴 Panne complète | Attendre | S'abonner aux mises à jour |
Le travail déjà écrit sur le disque n'est pas perdu — retaper la même commande. Si l'incident touche Opus mais pas Sonnet (fréquent) : encore une raison de rester Sonnet.
Bon réflexe : vérifier status.claude.com avant toute longue session.
| Chiffre | Rôle | Que faire si atteint |
|---|---|---|
| Solde de crédits (ex. 17,58 €) | L'argent réellement disponible. Renouvellement mensuel. | Acheter des crédits si besoin |
| Limite mensuelle (ex. 25 €) | Frein volontaire — ne jamais supprimer | Augmenter modérément via le +
|
Si la limite mensuelle bloque :
- Paramètres → Utilisation → Crédits d'utilisation.
- Cliquer
+→ monter de quelques euros → Enregistrer. Déblocage immédiat. - Ne jamais monter la limite au-delà de ton solde réel (inutile).
Lire la page Utilisation :
Barre rouge → quota session 5h de l'app WEB (≠ Claude Code)
Barre bleue → quota 7 jours tous modèles
Barre jaune → % du plafond mensuel consommé
Solde actuel → vrais euros disponibles
Important : app web (claude.ai) et Claude Code (terminal) ont des quotas séparés. Barre rouge à 100% dans l'app web ne bloque pas Claude Code.
Pour relire tranquillement tout ce que Claude Code a affiché.
#!/usr/bin/env bash
# capture.sh — session Claude Code → .log brut + .md propre — hprzeta
DOSSIER="$HOME/projet_zeta/claude-traitement-journalier"
mkdir -p "$DOSSIER"
HORODATAGE=$(date +%Y%m%d_%H%M)
BRUT="$DOSSIER/session_${HORODATAGE}.log"
PROPRE="$DOSSIER/session_${HORODATAGE}.md"
echo "📹 Enregistrement → $BRUT (tape 'exit' pour arrêter)"
script -q -f "$BRUT"
sed 's/\x1b\[[0-9;]*[mGKHF]//g' "$BRUT" | sed 's/\r$//' > "$PROPRE"
echo "✅ Version lisible : $PROPRE"# Installation (une seule fois)
mkdir -p ~/projet_zeta/scripts
nano ~/projet_zeta/scripts/capture.sh # coller le script ci-dessus
chmod +x ~/projet_zeta/scripts/capture.sh
echo "claude-traitement-journalier/" >> ~/projet_zeta/.gitignore
# Utilisation quotidienne
~/projet_zeta/scripts/capture.sh # AVANT de lancer Claude Code
claude
exit # arrête l'enregistrement + génère le .md proprePourquoi
scriptet pas> fichier? Claude Code est une TUI (interactive). Une redirection>lui retire le terminal et casse l'affichage.scriptcrée un pseudo-TTY intermédiaire — tout fonctionne normalement à l'écran, et le flux est enregistré en parallèle. Les codes couleur ANSI sont nettoyés automatiquement ; les emojis (✅⚠️ 🛑) restent.
Do you want to make this edit?
1. Yes
2. Yes, allow all edits during this session (shift+tab)
3. No
- Choisir 1 (Yes) — valider au cas par cas, tu gardes la visibilité
- ÉVITER 2 (allow all) en phase de débogage délicat : tu perds le contrôle
- Les petits tests de diagnostic sont sûrs → Yes
Les blocs contiennent parfois des placeholders à remplacer :
~/chemin/vers/fichier.md, <branche>, FICHIER. Collés tels quels,
ils provoquent une chaîne de non-opérations silencieuse :
cp ~/chemin/vers/Handoff.md . # ÉCHOUE silencieusement
# → git add ne trouve rien
# → commit "aucune modification"
# → push "up-to-date" — rien n'a été pousséAucune erreur bloquante, mais rien n'a été poussé. (Vécu le 1ᵉʳ juin.)
Réflexes :
- Lire le bloc avant de le coller — repérer tout placeholder.
- Mettre le vrai chemin (
~/Téléchargements/...). - Vérifier :
head -3 fichier.mdaprès uncp; regarder la sortie degit commit(« 1 file changed » = OK ; « up-to-date » inattendu = échec amont).
Détail des pièges Git (
git rmvsrm, untracked ≠ page wiki) : voirGuide-Git-GitHub.md§21.
Règle d'or : un secret (token, mot de passe, clé) ne va JAMAIS dans un fichier suivi par Git.
- Mettre les fichiers sensibles (
.mcp.json) dans.gitignoreAVANT le 1er commit. -
.gitignorene purge PAS le passé : si un secret est commité, réécrire l'historique (git filter-repo --path FICHIER --invert-paths). - Si GitHub Push Protection bloque (GH013) : révoquer le token d'abord, puis purger. NE JAMAIS cliquer "unblock-secret".
- Vérifier :
git check-ignore .mcp.json - Le
.gitignoren'est pas synchronisé entre branches : vérifier sur CHAQUE branche.
git add -A
git commit -m "wip: checkpoint [description courte]"
git push origin <branche>Si la session a produit des résultats à transmettre :
- Créer
docs/session_checkpoint_YYYYMMDD.md: état actuel, résultats validés, problème restant, prochaine étape. - Mettre à jour Handoff.md (section « REPRENDRE ICI »).
- Ajouter un pavé daté en haut de
JOURNAL.md(résumé de la session).
Mémo de reprise : toujours laisser dans Handoff.md un état exact → gain
de ~20 min au redémarrage.
| Branche | Usage |
|---|---|
Riemann_Lab_IA |
Développement principal, docs, wiki |
Riemann_Lab_C |
Phase C — Illinois C/libmpfr |
main |
Stable uniquement |
- Tous les
.md→ wiki (~/projet_zeta/Riemann_Lab.wiki/, branchemaster). -
Handoff.mdne va JAMAIS dans le repo principalRiemann_Lab_IA. - Convention commit :
feat(...),fix(...),docs(...),chore: ...,wip: ...
Ce fichier est LOCAL — ne jamais committer dans un dépôt projet.
# ~/.claude/CLAUDE.md — Instructions globales
## Modèle par défaut
Utiliser Claude Sonnet 4.6. Ne pas basculer sur Opus sauf demande hprzeta.
## Langue et style
- Toujours répondre en français
- Code commenté ligne par ligne
- Distinguer : théorème prouvé / conjecture / heuristique / intuition
- Formules en LaTeX
## Règles code
- plt.savefig() + plt.close() — jamais plt.show() en production
- Ne pas utiliser joblib avec mpmath (GMP non thread-safe)
## Sécurité
- git status AVANT tout git add -A
- .mcp.json ne doit JAMAIS être commité
- Un secret exposé = secret mort : révoquer, ne jamais suivre "unblock-secret"| Fichier | Portée | Committer ? | Contenu |
|---|---|---|---|
~/.claude/CLAUDE.md |
Toute la machine | ❌ Jamais | Règles globales légères |
~/projet_zeta/CLAUDE.md |
Projet uniquement | ✅ Oui | Contexte complet, formules, état Phase C |
# Modèle
/model # voir le modèle actif
/model claude-sonnet-4-6 # basculer sur Sonnet
# Checkpoint Git (règle 50% contexte)
git add -A && git commit -m "wip: checkpoint $(date +%Y%m%d_%H%M)"
git push origin Riemann_Lab_C
# Sauvetage à 90%+ (terminal bash, PAS Claude Code)
cd ~/projet_zeta && git add -A && git commit -m "wip: urgence" && git push origin Riemann_Lab_C
# Capture de session (lancer AVANT claude)
~/projet_zeta/scripts/capture.sh
# Vérifier les serveurs Anthropic
# → ouvrir https://status.claude.com dans le navigateur
# Vérifier l'usage des crédits
# → claude.ai → Paramètres → UtilisationAuteur : hprzeta · Mise à jour : 2 juin 2026 — $~418 lignes
Tout ce qui s'affiche dans le terminal Claude Code est capturé :
- Les messages de Claude Code (insights, analyses, décisions)
- Les sorties bash (workers, résultats, tableaux)
- Les erreurs et avertissements
- Les confirmations (1. Yes / 2. No)
- La barre de statut du bas
Ce qui n'est PAS dans la capture :
- Les onglets VS Code (éditeur, explorateur)
- Les autres terminaux
- L'app web claude.ai
capture.sh lancé → .log brut créé IMMÉDIATEMENT (enregistrement en direct)
→ .md propre créé SEULEMENT quand tu tapes 'exit'
| Moment | Fichier disponible | Lisible ? |
|---|---|---|
| Pendant la session |
.log uniquement |
❌ Caractères bizarres |
Après exit
|
.log + .md
|
✅ .md propre dans VS Code |
Dans un 2ème terminal bash (pas Claude Code) :
# Voir les 50 dernières lignes nettoyées
tail -50 ~/projet_zeta/claude-traitement-journalier/session_*.log \
| sed 's/\x1b\[[0-9;]*[mGKHF]//g'
# Suivre en temps réel (comme un tail -f nettoyé)
tail -f ~/projet_zeta/claude-traitement-journalier/session_*.log \
| sed 's/\x1b\[[0-9;]*[mGKHF]//g'
# Ctrl+C pour arrêter le suivi~/projet_zeta/
└── claude-traitement-journalier/ ← dossier ignoré par Git (.gitignore)
├── session_20260602_1600.log ← brut (illisible directement)
└── session_20260602_1600.md ← propre (généré à la fin, après exit)
# Depuis un terminal bash
code ~/projet_zeta/claude-traitement-journalier/session_20260602_1600.md
# Ou dans l'explorateur VS Code à gauche :
# projet_zeta → claude-traitement-journalier → session_*.mdSi VS Code ouvre le .log directement → ferme-le, ouvre le .md à la place.
Le .log n'est pas fait pour être lu dans un éditeur — c'est une archive brute.
Fichier : Bonnes-Pratiques-Claude-Code.md · Dossier : wiki racine Branche : master · Auteur : hprzeta · MAJ : 2026-06-10
Si tu fermes accidentellement une fenêtre Claude.ai :
| Situation | Action | Pourquoi |
|---|---|---|
| Conversation récente, peu de tokens | Rouvrir | Contexte encore léger |
| Conversation longue (>50k tokens) | Nouvelle conversation | Rouvrir = recharger TOUS les vieux tokens → coûteux |
| Tu changes de tâche | Nouvelle conversation | Contexte propre = moins cher et plus efficace |
| Tu es en milieu de tâche critique | Rouvrir | Ne pas perdre le fil |
Règle simple : si la conversation avait déjà beaucoup tourné → nouvelle conv + coller le Handoff.
Ctrl+Z ne ferme pas Claude Code : il le met en pause en arrière-plan (signal SIGTSTP). Le programme existe encore tant que le terminal reste ouvert.
| Situation | Que faire |
|---|---|
Le terminal affiche « Stopped » après Ctrl+Z
|
Taper jobs pour voir la ligne [1]+ Stopped claude, puis fg pour reprendre : l'écran revient tel quel |
| Terminal fermé ou machine redémarrée | Le programme est arrêté, mais la conversation est sauvegardée. Dans le dossier du projet : claude --continue (dernière conversation) ou claude --resume (choisir dans une liste). Dans Claude Code : /resume
|
| Voir où il en était avant de reprendre | Les conversations sont enregistrées dans ~/.claude/projects/<dossier-du-projet>/ (un fichier .jsonl par conversation) ; on peut lire les derniers messages du plus récent |
- Un traitement long lancé par Claude Code (conversion de PDF avec marker, calcul, copie) ne survit pas à l'arrêt du programme. Après la reprise, lui demander de VÉRIFIER l'état réel (processus actifs avec
psoutmux, fichiers vides ou tronqués) avant de relancer, et de ne rien écraser. - Pour les traitements longs, les lancer dans
tmux: ils continuent même si le terminal se ferme. - En cas de doute devant un terminal qui ne répond plus, taper
jobsavant de le fermer : c'est sans risque. -
Ctrl+Zest voisin deCtrl+C(interrompre) et deCtrl+X: ne pas les confondre.
Pour donner des documents à lire à Claude sans surcharger le projet :
1. Convertir PDF → MD (script pdf_to_md_voie_b5.sh)
→ résultat dans ~/projet_zeta/pdf/optimisation/Voie_b_5/md_to_claude/
2. Pousser sur inbox-ia :
git checkout inbox-ia
cp ~/projet_zeta/pdf/optimisation/Voie_b_5/md_to_claude/*.md .
git add *.md
git commit -m "inbox: ajout N pavés ($(date +%F))"
git push origin inbox-ia
git checkout Riemann_Lab_IA
3. Donner l'URL à Claude :
"Lis les fichiers sur la branche inbox-ia de hprzeta/Riemann_Lab"
4. Archiver quand Claude a fini :
git checkout inbox-ia && git rm FICHIER.md
git commit -m "inbox: archive FICHIER ($(date +%F))"
git push origin inbox-ia
git checkout Riemann_Lab_IA
Règles inbox-ia :
- ✅ Fichiers
.mdlégers uniquement (convertis depuis PDF) - ❌ Jamais de secrets, tokens, chemins système
- ❌ Jamais de PDFs directement (trop lourds)
- Le dossier
.pdf_to_md/est LOCAL et dans.gitignore— jamais pushé
Tu peux ouvrir un 2ème terminal VS Code (`Ctrl+Shift+``) pendant que Claude Code tourne :
| Terminal 1 (Claude Code) | Terminal 2 (bash libre) |
|---|---|
| Claude Code bosse | Tu pousses des fichiers |
| Sur branche X | Sur branche Y différente |
| Ne pas interrompre | Aucun conflit possible |
Condition : travailler sur des branches différentes. Si même branche → risque de conflit.
Dans la barre de statut Claude Code :
~87k uncached · /clear to start fresh
| uncached | Action |
|---|---|
| < 30k | Normal, continuer |
| 30–50k | Surveiller |
| > 50k |
/clear entre deux tâches |
| cache COLD |
/clear recommandé avant grosse tâche |
Après /clear : Claude Code relit automatiquement les CLAUDE.md en cascade → pas besoin de tout ré-expliquer.
Sonnet 4.6(36.0k/200.0k) | cache 4m13s · high · effort
high · effort = Claude Code est en mode raisonnement approfondi sur une tâche complexe (ex: git multi-branches, diagnostic algorithme). C'est normal et attendu — pas un problème. Consomme un peu plus de tokens mais produit une meilleure analyse.
Tous les prompts du projet sont documentés dans :
~/projet_zeta/scripts/ia_prompts/ia_prompts_riemann_lab_complet.md
Contient 14 sessions (mai → juin 2026) + 10 leçons sur les prompts.
Versionné sur Riemann_Lab_IA.
Pour ajouter un nouveau prompt :
# Éditer le fichier
code ~/projet_zeta/scripts/ia_prompts/ia_prompts_riemann_lab_complet.md
# Ajouter la nouvelle session avec date + contexte + prompt complet
git add scripts/ia_prompts/
git commit -m "docs: ajout prompt SESSION_DATE"
git push origin Riemann_Lab_IA-
Toujours utiliser
nohup+printf "T\nO\n"pour les runs interactifs en arrière-plan. Sans nohup, SIGHUP tue le process dès déconnexion du terminal → 0 résultats.printf "100000\nO\n" | nohup python src/calculs/optimisation/compute_zeros_v4_1.py \ > logs/run_T100000.log 2>&1 &
- Ne jamais fermer VS Code pendant un run sans nohup préalable.
-
zeta_turbo_on.shobligatoire avant tout run (règleCLAUDE.md) → +15–30 % calcul. -
zeta_turbo_off.shobligatoire après tout run → restaure CPU governor + swappiness.
-
/clearquand le contexte > 50k tokens ou que le cache est COLD (ralentissement notable). -
Vérifier quota 7j avant session longue :
ccusage(coût/session, limite API). - Contexte > 40 % → ne pas lancer de runs T > 300.
Espacement moyen entre zéros ≈
| Tranche t | Espacement moyen | STEP imposé |
|---|---|---|
| t < 10 000 | ~0.39 | 0.1 |
| 10 000 ≤ t < 50 000 | ~0.28 | 0.05 |
| t ≥ 50 000 | ~0.21 | 0.02 |
STEP=0.1 fixe à T=100 000 → 356 zéros manquants (0.26 %). Fix dans step_pour_t().
Sans segmentation adaptative, Worker 3 ([75k, 100k]) traite ~2× plus de zéros que Worker 0
([14, 25k]) → déséquilibre de charge. Solution : _partitionner_adaptatif() dans
compute_zeros_v4_1.py (partition uniforme de l'axe √t).
nvrtc: error: invalid value for --gpu-architecture → sm_50 déprécié dans CUDA 12.x.
Fix dans riemann_siegel_batch.py : détecter cc_major < 6 → basculer automatiquement
sur CPU numpy. Aucune perte de performance (Z_batch numpy est déjà très rapide).
- Log progression 1000 zéros par worker :
[Worker X] zéro #N à t=... — Xs -
tail -f logs/run_T*.logtoutes les 5 min pour vérifier l'avancement. -
htop→ F4 +compute_zerospour filtrer les processus.
- Un seul fichier
session_YYYYMMDD_HHMM.mdpar session Claude Code (créé viacapture.sh) - Ne pas créer plusieurs fichiers pour la même session
- Ne pas confondre avec Handoff.md (état courant) et JOURNAL.md (historique)
| Fichier | Rôle | Localisation |
|---|---|---|
Handoff.md |
État courant — "REPRENDRE ICI" |
handoff/ local, hors git |
JOURNAL.md |
Historique daté append-only | wiki master |
session_YYYYMMDD_HHMM.md |
Log automatique Claude Code |
claude-traitement-journalier/ local |
- Toujours faire
/clearentre deux sessions longues (évite l'auto-compact intempestif) - Vérifier quota
ccusageavant session longue (5h glissantes) - Cache COLD = relancer depuis
~/projet_zeta/aveczetapour recharger les CLAUDE.md - Un
/clearne supprime PAS les CLAUDE.md — ils sont relus automatiquement - Ne pas lancer T > 300 si contexte > 40 % (règle
CLAUDE.mdracine)
Valeurs repères : 0.5 à d2f62c1).
Ne pas revenir à un STEP fixe sans raison documentée.
Avant de lancer un run long, estimer la durée par worker :
Vérifier la vitesse à 5 min — si
Pour les runs > 30 min, lancer Monitor sur le fichier log pour être notifié :
# Dans Claude Code, lancer Monitor sur le log du run :
# Monitor file = calculs/run_T100k_*.log
# Pattern : "Turing-Backlund"
# Timeout : 3600000 (1h max par tranche)Si le Monitor se déclenche (pattern trouvé) → stopper immédiatement toute autre tâche et traiter le résultat du run en priorité.
Toujours lancer /clear avant de démarrer un prompt de développement majeur (v6, nouveau levier).
Raison : les prompts v5/v4.1 génèrent ~200k tokens de contexte ; l'auto-compact à 80 %
peut supprimer des contraintes critiques (seuil Illinois, formule N(T), règle STEP).
Conséquence : erreurs silencieuses, pas de message d'erreur explicite.
Contre-intuition prouvée : prec=64 bits (1 limb machine) est ×16 plus rapide que
prec=116 bits (2 limbs), parce qu'un seul limb active les routines SIMD spécialisées de
libmpfr (AVX2 sur x86_64). Deux limbs cassent le SIMD et multiplient le coût par 10 à 20.
| Précision | Limbs | SIMD | ms/appel t~5k |
|---|---|---|---|
| 32 bits | 1 | OUI — mais trop imprécis | ~0.7 ms |
| 64 bits | 1 | OUI — AVX2 | ~1.5 ms |
| 116 bits | 2 | NON | ~23.5 ms |
| 128 bits | 2 | NON | ~24 ms |
| 170 bits | 3 | NON | ~35 ms |
Règle : ne jamais supposer que la précision « raisonnable » est optimale — mesurer. La théorie (nombre de termes RS) prédisait ×4.6 pour v7 ; la réalité (précision) a donné ×16.
Conséquence pour la v8 : tester prec_fast ∈ {32, 48, 64, 80, 96} bits empiriquement
avant toute décision d'architecture.
TÂCHE 0 obligatoire à chaque nouvelle version : mesurer les paramètres clés sur T=5k (run court) AVANT de modifier l'architecture.
# Benchmark minimal : 1 appel illinois_refine pour chaque prec candidate
for prec in [32, 48, 64, 80, 96, 116, 128]:
t0 = time.time()
for _ in range(100):
illinois_refine_adaptive(a, b, fa, fb, prec_fast=prec, ...)
print(f"prec={prec:3d} bits : {(time.time()-t0)*10:.2f} ms/appel")| Règle | Raison |
|---|---|
| Mesurer AVANT de modifier l'architecture | v7 : l'intuition théorique (termes RS) était fausse |
Calibrer iter_switch empiriquement |
Pas a priori — valeur optimale dépend du hardware |
| Séparer tests précision ET nombre de termes | Une seule variable à la fois |
| Ne pas confier à la théorie le rôle du benchmark | La théorie confirme, le benchmark décide |
Leçon v7 chiffrée : hypothèse = ×4.6 via N_termes, réalité = ×16 via prec_fast=64 bits. Sans benchmark, v7 n'aurait jamais trouvé le bon levier.
Contexte : remplacement de arb_fpwrap_cdouble_hardy_z par acb_dirichlet_hardy_z
dans illinois_arb.c — un changement touchant le cœur du calcul de production. Le
déroulé de cette session illustre un protocole réutilisable pour tout changement
similaire (nouvelle dépendance, nouveau mécanisme, gain mesuré mais pas encore prouvé
à l'échelle réelle).
-
Chiffrer avant de proposer —
perf recordréel, pas une intuition. Le vrai goulot (escalade de précisionarb_fpwrapvisant ~1e-16, surdimensionné vs le besoin réel 1e-12) n'apparaît qu'en lisant le code source de la dépendance, pas en devinant depuis la doc. -
Prototyper en isolation stricte — nouveau fichier
.c/.sodistinct, nouveau script Python distinct, jamais toucher au fichier de production pendant cette phase.git statusvérifié vide sur les fichiers de production à chaque étape. - Valider sur un run réel modeste avant de demander une décision — pas seulement des micro-benchmarks synthétiques (300 brackets isolés a surestimé le gain réel de ×5,75 à ×1,98 mesuré sur un vrai run T=10000 — la part relative de la phase optimisée n'est pas la même en isolation qu'en contexte réel).
- Poser explicitement la question de décision à hprzeta (« décide si on intègre ») plutôt que d'intégrer unilatéralement dès qu'un gain est mesuré — un changement de dépendance (ici : headers FLINT vendorisés) engage le projet au-delà du gain de vitesse.
-
Intégrer en suivant la convention établie du projet, pas une convention
inventée pour l'occasion — ici, fichier
.cmodifié en place + nouveaucompute_zeros_vN.py(le pattern déjà utilisé pour v12→v15). -
Revalider au protocole standard AVANT de déclarer la version adoptée — le
critère d'acceptation d'une nouvelle version Phase C dans ce projet est fixe
(T=100k, Turing COMPLET, LMFDB 20/20 — voir
STACK.md), pas le run modeste de l'étape 3. Le gain mesuré à grande échelle a d'ailleurs été meilleur que celui du run modeste (×2,75 à T=100k vs ×1,98 à T=10000) — les deux sens d'écart sont possibles, d'où l'intérêt de ne jamais sauter cette étape.
Pourquoi ça compte : sans les étapes 2-3, un gain synthétique aurait pu être intégré directement en production sans preuve qu'il tient à l'échelle réelle — dans un sens comme dans l'autre. Le coût de ce protocole (deux runs de validation au lieu d'un) est negligeable comparé au risque d'un remplacement de production non prouvé.
Leçons tirées de la configuration du bastion VPN PC4 (
zeta-secure, OpenBSD 7.9/i386).
net.inet6.ip6.accept_rtadv n'existe pas sous OpenBSD (sysctl Linux uniquement).
Sous OpenBSD, SLAAC s'active dans /etc/hostname.<interface> :
inet6 autoconf
Relancer avec sh /etc/netstart <interface> (il n'y a pas d'ifup sous OpenBSD).
pass in on $ext_if inet6 proto icmp6 icmp6-type {routeradv, neighbradv, neighbrsol, redir}
neighbrsol, pas neighbrsolicit (nom long Linux, invalide sous pf).
Sans cette règle, block in par défaut bloque les Router Advertisements → aucune adresse
globale SLAAC ne s'obtient malgré inet6 autoconf dans /etc/hostname.re0.
Ne pas tester depuis l'intérieur du réseau avec curl ifconfig.me ou curl ip6.me :
le résultat peut être trafiqué par le routeur. Pour savoir si l'IP est derrière CGNAT :
→ Comparer avec l'IP WAN affichée par la box (interface admin [IP_BOX]).
Si l'IP WAN de la box est en 10.x.x.x, 100.64-127.x.x.x ou autre RFC1918 : CGNAT.
# Générer un QR code lisible par l'app Android/iOS WireGuard
qrencode -t ansiutf8 < /etc/wireguard/peer_telephone.confImport direct dans l'app sans saisie manuelle. qrencode : apt install qrencode (Linux)
ou pkg_add qrencode (OpenBSD).
rx=0 persistant + tx croissant = les paquets partent du client mais n'arrivent pas.
Ne pas chercher du côté du client — le pare-feu intermédiaire bloque.
→ Vérifier à la fois :
- Règles
pfsur PC4 (port UDP 51820 enpass in). - Section "Réseau v6" de la box SFR (Sécurité → Accès → Réseau v6) : distincte du NAT/redirection IPv4, vide par défaut = tout trafic IPv6 entrant bloqué.
Si ssh échoue avec "Too many authentication failures" : l'agent SSH propose trop de
clés au serveur avant la bonne. Forcer la clé correcte :
ssh -o IdentitiesOnly=yes -i ~/.ssh/zeta_cluster user@hostAjouter dans ~/.ssh/config pour l'alias concerné :
IdentityFile ~/.ssh/zeta_cluster
IdentitiesOnly yes
Quand un .so se comporte différemment sur PC1 et PC2, utiliser ce protocole en 4 commandes :
# 1. Sources identiques ?
diff <(cat local/scan_arb.c) <(ssh pc2 "cat ~/projet_zeta/.../scan_arb.c")
# 2. Symboles exportés
nm -D scan_arb.so | grep " T " # fonctions publiques uniquement
# 3. Dépendances réelles (bibliothèques liées)
ldd scan_arb.so | grep -E 'arb|flint|not found'
# 4. Paquets installés
dpkg -l | grep -E 'flint|arb' # Debian/Ubuntu
# ou sur OpenBSD : pkg_info | grep flintPièges courants :
-
ldd | grep arbretourne exit 1 si aucune correspondance → pas forcément une erreur, peut vouloir dire que la lib n'utilise pas arb (normal pourscan_arb.soqui est C pur). -
nm -Dn'exporte passcan_arb_hardy_z: normal si la fonction n'est pas dans le source. -
python-flint(pip) ≠libflint-arb2(apt) : le wrapper Python cherchepython_flint.libs/libflint-*.so*dans site-packages. Même silibflint-arb2est installé système,ARB_DISPONIBLE=Falsesi python-flint est absent.
En Python ctypes, passer trop peu d'arguments ne lève pas d'exception — comportement indéfini C (valeurs parasites sur la pile), résultat souvent 0 ou crash aléatoire.
# ❌ Bug silencieux : 2 POINTER au lieu de 4 → retourne 0
lib.scan_zeros_arb.argtypes = [ctypes.c_double]*3 + [ctypes.POINTER(ctypes.c_double)]*2 + [ctypes.c_int]
n = lib.scan_zeros_arb(100.0, 200.0, 0.3, a, b, 200) # fa, fb manquants !
# ✅ Correct : vérifier la signature dans le .c avant d'écrire argtypes
lib.scan_zeros_arb.argtypes = (
[ctypes.c_double] * 3 +
[ctypes.POINTER(ctypes.c_double)] * 4 + # brackets_a, brackets_b, fa, fb
[ctypes.c_int]
)Règle : toujours compter les arguments dans le .c source et les comparer au argtypes Python avant tout test.
scan_arb (Z_double RS + C0+C1) est fiable seulement si N_RS ≥ 3. En-dessous, les brackets peuvent être décalés de 0.01-0.05 et provoquer des erreurs de convergence Illinois.
| Range t | N_RS | Comportement |
|---|---|---|
| [14, 20) | 1 | θ(t) asymptotique invalide → mpmath obligatoire |
| [20, 57) | 2 | Brackets scan_arb potentiellement décalés → mpmath |
| [57, 100) | 3 | Fiable à t ≥ 65 (confirmé empiriquement LMFDB T=1000) |
| [100, 157) | 3-4 | Fiable |
| ≥ 157 | ≥ 5 | Très fiable |
v13 : T_SEUIL_PETIT_T = 65 — compromis validé : 20/20 LMFDB, 52 z/s sur PC2 (×8.1 vs v12).
Piège re-évaluation fa/fb : filtrer les brackets spurieux avec if fa*fb >= 0: continue élimine aussi les vrais zéros dont scan_arb a placé le bracket au mauvais endroit — le vrai bracket adjacent est lui aussi manqué. Ne pas re-évaluer après coup ; utiliser arb_hardy_z dès la détection (chemin mpmath_petit_t).
Leçon session 2026-06-17 — Distribution PC1+PC2 T=100k validée.
-
pip3 install X --break-system-packages (Debian 12, PEP 668) — pip3 système bloque l'install sans flag explicite.
--userpeut marcher mais les paquets vont dans~/.local/lib/qui peut ne pas être dans PYTHONPATH si le script est lancé via SSH sans shell interactif. Vérifier avecpython3 -c "import sys; print(sys.path)". -
Toujours vérifier ARB_DISPONIBLE avant benchmark cross-machine — un
ARB_DISPONIBLE=Falsesur PC2 multiplie par ×100 le temps de la zone [14,65] (mpmath.siegelz au lieu de Arb). -
Marge pivot PC2 : −15% — compense overhead SSH (~5 s de setup) + CPU plus lent + swap potentiel.
N_pivot = N_total - int(N_pc2_eq * 0.85). Marge −5% trop faible (PC2 finissait 20% après PC1). -
dry-run obligatoire avant vrai run —
python scripts/zeta_distribute.py T --dry-runaffiche la segmentation et les durées prévues sans lancer le calcul. -
Surplus zéros aux bords de segment = normal — chevauchement de ±0.5 entre workers internes crée des doublons. Déduplication
tolerance=0.01suffit. Turing COMPLET (0 manquant) est le vrai critère. - PC2 finit avant PC1 = bon signe — signifie que la marge est efficace et que l'agrégation Turing peut démarrer dès que PC1 termine. Si PC2 finit après → augmenter la marge.
-
PYTHONPATH cross-machine — sur PC2 sans venv, les modules sont à plat dans
src/calculs/optimisation/. Passerexport PYTHONPATH=.../src/calculs/optimisationdans la commande SSH, passrc/. -
Nom CSV v13 — convention : dossier
v13_T{T_MIN:.0f}_{T_MAX:.0f}_{horodatage}/, CSVzeros_v13_T{T_MAX:.0f}_{horodatage}.csv(T_MAX seul dans le nom du CSV, pas T_MIN).
Quand la session Claude Code se déconnecte (token expiré), relancer l'authentification depuis le terminal :
/login
Choisir Claude account with subscription, puis ouvrir platform.claude.com dans le
navigateur, récupérer le code affiché et le coller dans le terminal pour valider la
reconnexion.
💡 Comme pour
gh auth status(Guide-Git-GitHub.md §23), si Claude Code répond de façon anormale en début de session (erreurs d'auth, refus d'outil), vérifier d'abord l'état de connexion via/loginavant de chercher un autre bug.
Les instructions personnalisées du compte web claude.ai (distinctes de ~/.claude/CLAUDE.md,
qui ne s'applique qu'à Claude Code) se gèrent depuis :
claude.ai → Settings → Général → Instructions pour Claude
Le 23 juin 2026, l'ancien prompt présent dans ce champ était devenu obsolète (référençait
un contexte de session périmé) et a été remplacé par une version courte et à jour. À
recontrôler périodiquement — ce champ n'est pas synchronisé avec ~/.claude/CLAUDE.md et
peut diverger silencieusement si l'un des deux est mis à jour sans l'autre.
Tirées de l'analyse du déficit de zéros T=5M — voir prompts_claude_2026-08-18 pour le recueil complet des prompts et analyse_math_deficit_2026-08-18 pour les démonstrations associées.
- Toujours faire chiffrer avant de lancer. Une estimation de coût donnée sans vérification ("~1h par run") s'est révélée fausse d'un facteur 2 — corrigée en lisant les débits réels des logs existants avant tout nouveau calcul.
-
Un test A/B ne vaut que si la fenêtre est discriminante. Une première fenêtre
de test avait un espacement minimal 79× plus grand que le pas testé : aucune
grille n'y était en danger, un résultat "identique" était garanti d'avance et
n'apportait aucune information. Toujours calculer
$s_{\min}$ de la fenêtre avant de lancer un test de résolution. - Demander la lecture de code avant le calcul. Six questions de lecture de code posées avant tout nouveau test ont rapporté plus d'information que plusieurs heures de runs A/B qui ont suivi.
- Exiger la distinction PROUVÉ / MESURÉ / CONJECTURE à chaque réponse — c'est ce qui a permis de détecter qu'un chiffre présenté comme un déficit n'était en réalité qu'une estimation jamais validée par la méthode de référence du projet.
-
Lancer Claude Code dans
tmux, jamais dans le terminal intégré VS Code :tmux new -s claude, détacher parCtrl+BpuisD. Une session perdue = tout le contexte à réinjecter manuellement au prompt suivant. -
Ne jamais faire
Ctrl+Z. Cela suspend le process sans le terminer ; récupération possible parfgimmédiatement, dans le même terminal — une fois ce terminal fermé, le contexte est perdu (cf. incident du 18/08). Voir toutefois la section « ⏸️ Reprendre une session Claude Code interrompue » : la conversation, elle, se reprend avecclaude --continueouclaude --resume.
Auteur : hprzeta · Mise à jour : 11 juin 2026 · 15 juin 2026 (§ OpenBSD/pf) · 17 juin 2026 (§ diagnostic cross-machine, ctypes, T_SEUIL) · 23 juin 2026 (§ Maintenance périodique — tokens expirés) · 8 août 2026 (§ Workflow de validation avant intégration production — leçon v16) · 18 août 2026 (§ conduite des prompts — 6 leçons investigation déficit) · 4 octobre 2026 (§ reprendre une session interrompue) · 974 lignes