This commit is contained in:
Nicolas Cantu 2026-03-15 14:39:54 +01:00
parent 43532d7295
commit 29f3169f49
18 changed files with 258 additions and 1108 deletions

View File

@ -0,0 +1,244 @@
# Documentation consolidée — Collatz, corrections et livre enfant
**Auteur** : Équipe 4NK
Document unique regroupant les informations importantes des fichiers `docs/features/` et `docs/fixKnowledge/`.
---
## 1. Collatz — Vérifications déterministes
### 1.1 C2 (réduction projective)
**Objectif** : Vérification déterministe des assertions du lemme C2 (complétion par frères, projection projective sur \(B_{12}\)).
**Script** : `collatz_verify_c2_projective.py`
**Artefacts** : `docs/artefacts/collatz/c2_projective/verification_c2_projective.{json,md}`
```bash
python3 applications/collatz/collatz_k_scripts/collatz_verify_c2_projective.py \
--repo-root /home/ncantu/code/algo \
--output-dir docs/artefacts/collatz/c2_projective
```
### 1.2 C3 (clôture locale)
**Objectif** : Artefact déterministe vérifiant une instance de C3 sur \(L=\mathrm{Lift}_{12\to m}(B_{12})\) (témoins F et D8).
**Script** : `collatz_verify_c3_local_descent.py`
**Artefacts** : `docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent.{json,md}`
```bash
python3 applications/collatz/collatz_k_scripts/collatz_verify_c3_local_descent.py \
--local-h6-root docs/artefacts/collatz \
--output-dir docs/artefacts/collatz/c3_local_descent \
--palier 15
```
### 1.3 Clauses universelles (Option A)
**Objectif** : Conversion témoin local → clause universelle candidate (H4/H5), domaine \(L=\mathrm{Lift}_{12\to 13}(B_{12})\).
**Scripts** : `collatz_extract_universal_clauses.py`, `collatz_verify_universal_clauses.py`
**Artefacts** : `docs/artefacts/collatz/universal_clauses/clauses_universelles.{json,md}`, `verification_universal_clauses.{json,md}`
**Entrée** : `docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent.json`
### 1.4 Register K modular (couverture finie)
**Objectif** : Construire \(\mathcal{K}_M\) (clauses décidables à palier \(2^M\)) et audit de couverture sur \(L\).
**Script** : `collatz_build_register_K_modular.py`
**Artefacts** : `docs/artefacts/collatz/register_K/palier2pM/register_K_mod2pM.{json,md}`, `audit_register_K_mod2pM.{json,md}`, `non_eligible_clauses_mod2pM.{json,md}`, `manifest_register_K_mod2pM.{json,md}`
```bash
python3 applications/collatz/collatz_k_scripts/collatz_build_register_K_modular.py \
--palier 15 --horizon-k 5 --repo-root /home/ncantu/code/algo
```
### 1.5 Certificat de raffinement
**Objectif** : Chemin de raffinement déterministe depuis \(n \bmod 2^M\) vers le résidu terminal stable.
**Scripts** : `collatz_build_refinement_certificate_modular.py`, `collatz_build_refinement_certificate_over_Sm.py`, `collatz_build_refinement_certificate_over_Sm_multilevel.py`, `collatz_build_refinement_bundle_over_Sm_multilevel.py`
**Artefacts** : `docs/artefacts/collatz/refinement_K/palier2pM/refinement_certificate_mod2pM.{json,md}`, variantes `Sm`, `Sm_multilevel`
---
## 2. Collatz — Extensions de grammaire
### 2.1 Clauses D_minor (descente minorée)
**Objectif** : Feuilles terminales \(D_{\underline{}}\) pour fermer des classes où une borne inférieure suffit à conclure.
**Scripts** : `collatz_generate_minorated_descent_clauses_over_Sm.py`, `collatz_verify_minorated_descent_clauses_over_Sm.py`, `collatz_derive_brother_minorated_clauses_from_terminal_over_Sm.py`
**Artefacts** : `docs/artefacts/collatz/minorated_clauses_over_Sm/palier2p<M>/clauses_D_minor_over_Sm_mod2p<M>.{json,md}`
```bash
python3 applications/collatz/collatz_k_scripts/collatz_generate_minorated_descent_clauses_over_Sm.py \
--repo-root /home/ncantu/code/algo --palier 15 --k 8 --underlineA 13
```
### 2.2 Chaîne Hensel décalée (Phase 3)
**Objectif** : Fermer des racines en démarrant la chaîne Hensel à m=19 pour les résidus dont le frère à m=19 est fermable.
**Script** : `collatz_build_hensel_chain_leaves_shifted.py`
**Paramètres** : `--start-m 19|20|21`, `--leaf-json`
**Résultat** : 1373 résidus fermés à m=19 ; open_roots 1349→1101 (248).
### 2.3 Plan dextensions de grammaire (cas no/no)
**Phases** : Phase 1 (extension mécanique m=19..21), Phase 2 (multi-modulus, conclue négative), Phase 3 (chaîne Hensel décalée), Phase 4 (clause D partielle, recherche).
**Rapports** : `docs/artefacts/collatz/refinement_K/palier2p15/phase1_grammar_extensions_report.md`, `option_a_extension_m24_report.md`, `option_b_hensel_m20_m21_report.md`
### 2.4 Feuilles ciblées et diagnostic
**Diagnostic** : Sur les racines extrêmes, les deux enfants à m=16 nont pas de clause terminale décidable (cas no/no). `lb_root` typiquement dans [50, 136].
**Script** : `collatz_diagnose_targeted_leaves_failure.py`
**Artefact** : `docs/artefacts/collatz/refinement_K/palier2p15/targeted_leaves/diagnostic_targeted_leaves_failure_mod2p15.md`
---
## 3. Collatz — Rapports et artefacts
### 3.1 Générateur de rapports dexécution
**Objectif** : Rapport standard (commande, artefacts, sha256, compteurs) sans transcript dans les documents mathématiques.
**Script** : `collatz_generate_run_report.py`
**Profils** : `extend_finale`, `validation_section7`, `pipeline_d16_d17`, `fusion_palier2p25`, `local_H6_E1`, `local_H6`, `c2_projective`, `c3_local_descent`, `c3_local_descent_palier`, `universal_clauses`, `universal_clauses_palier`
**Format** : `docs/collatz_run_report_format.md`
### 3.2 Artefacts H6 locaux et index
**Objectif** : Paquet dartefacts par état \(E\) de \(B_{12}\) pour vérifier la couverture.
**Script** : `collatz_generate_local_h6_artefacts.py`
**Artefacts** : `docs/artefacts/collatz/local_E{id}_palier2p{m}/`, `docs/artefacts/collatz/local_H6_index.md`
### 3.3 Rationalisation conjoncture
**Objectif** : Un seul tronc canonique dans `conjoncture_collatz.md`, blocs annexes déplacés.
**Scripts** : `collatz_conjoncture_rationalize.py`, `collatz_conjoncture_audit.py`
**Annexe** : `applications/collatz/conjoncture_collatz_annexes.md`
**Artefacts** : `docs/artefacts/collatz/conjoncture_rationalisation/audit_conjoncture.{json,md}`
---
## 4. Collatz — Optimisation mémoire
**Contexte** : Plantages OOM pour m≥22 (clauses terminales).
**Optimisations** :
- Itérateur au lieu de liste ; mode streaming (JSONL temporaire) si `total_roots > 500_000`
- `json.dump()` vers fichier au lieu de `json.dumps()`
- Chargement prioritaire `.residues.json` (streaming ijson) pour paliers ≥20
- `ResidueBitset` pour `leaves_by_m` et `closed` (≈1 Mo)
- Chunked stream load pour `noyau_post_D20.json` (1.7 GB) ; `run_update_noyau` et `run_single_palier` en stream
**Scripts concernés** : `collatz_generate_terminal_clauses_over_Sm.py`, `collatz_generate_minorated_descent_clauses_over_Sm.py`, `collatz_build_refinement_certificate_over_Sm_multilevel.py`, `collatz_build_hensel_chain_leaves_shifted.py`
---
## 5. Corrections (fixKnowledge)
### 5.1 Docs status et transcript cleanup
**Problème** : Transcript terminal mélangé au texte mathématique ; conclusions affirmant une couverture totale alors que le résidu nest pas vide.
**Correctifs** :
- Supprimer le transcript de `conjoncture_collatz.md`
- Requalifier la conclusion : fermeture globale conditionnelle à \(H_{\mathrm{ext}}(M): R_M=\varnothing\)
- Mettre à jour `démonstration collatz.md` : option hybride
**Références** : `diagnostic_run_D18_D21_et_statut_preuve.md`, `errata_demonstration_collatz.md`, `plan_lemmes_manquants_et_programme_de_preuve.md`
### 5.2 Scission : inférence palier et répertoires de sortie
**Problème** : `palier` inféré incorrectement (max valeur des classes si colonne générique) ; `FileNotFoundError` si répertoire parent absent.
**Correctifs** :
- Colonne `palier` ou `m`/`modulus_power` explicite ; fallback depuis le chemin `palier2p<m>`
- Créer `out_json_path.parent` avant écriture
- Ne pas ajouter de résidu 0 pour chaînes vides
**Script** : `collatz_scission.py`
### 5.3 Crash OOM paliers finale F16
**Problème** : `08-paliers-finale.sh` et Cursor tués par OOM killer pendant F16 (chargement `noyau_post_D20.json` ~1.7 GB).
**Correctifs** :
- Exécuter le pipeline hors Cursor (terminal séparé, `nohup`)
- Stream load avec `--modulo` ; chunked processing pour `build_fusion_clauses`
- `run_update_noyau` et `run_single_palier` en stream pour fichiers >500 MB
**Reprise** : `RESUME_FROM=D20 ./scripts/08-paliers-finale.sh`
---
## 6. Livre enfant
**Fichier** : `pour enfants/livre_enfant.md`
**Corrections v0.21** : Gérondifs sans sujet corrigés ; suppression introspection (E3) ; variation répétitions (N2) ; fusion phrases courtes (N5) ; formulations qualité littéraire.
**Règles** : `.cursor/rules/redaction-pour-enfant.mdc`
---
## 7. Index des scripts Collatz
| Script | Rôle |
|--------|------|
| `collatz_verify_c2_projective.py` | Vérification C2 |
| `collatz_verify_c3_local_descent.py` | Vérification C3 |
| `collatz_extract_universal_clauses.py` | Extraction clauses universelles |
| `collatz_verify_universal_clauses.py` | Vérification clauses universelles |
| `collatz_build_register_K_modular.py` | Register K et audit couverture |
| `collatz_build_refinement_certificate_modular.py` | Certificat raffinement (domaine L) |
| `collatz_build_refinement_certificate_over_Sm_multilevel.py` | Fermeture multiniveaux |
| `collatz_build_refinement_bundle_over_Sm_multilevel.py` | Pipeline bundle |
| `collatz_generate_minorated_descent_clauses_over_Sm.py` | Génération D_minor |
| `collatz_verify_minorated_descent_clauses_over_Sm.py` | Vérification D_minor |
| `collatz_build_hensel_chain_leaves_shifted.py` | Chaîne Hensel décalée |
| `collatz_generate_run_report.py` | Génération rapports |
| `collatz_generate_local_h6_artefacts.py` | Artefacts H6 locaux |
| `collatz_conjoncture_rationalize.py` | Rationalisation conjoncture |
| `collatz_conjoncture_audit.py` | Audit conjoncture |
| `collatz_diagnose_targeted_leaves_failure.py` | Diagnostic feuilles ciblées |
| `collatz_scission.py` | Scission (certificats) |
---
## 8. Index des chemins dartefacts
| Chemin | Contenu |
|--------|---------|
| `docs/artefacts/collatz/c2_projective/` | Vérification C2 |
| `docs/artefacts/collatz/c3_local_descent/` | Vérification C3 |
| `docs/artefacts/collatz/universal_clauses/` | Clauses universelles |
| `docs/artefacts/collatz/register_K/` | Register K |
| `docs/artefacts/collatz/refinement_K/` | Certificats raffinement |
| `docs/artefacts/collatz/minorated_clauses_over_Sm/` | Clauses D_minor |
| `docs/artefacts/collatz/local_E*_palier2p*/` | Artefacts H6 par état |
| `docs/artefacts/collatz/local_H6_index.md` | Index agrégé H6 |
| `docs/artefacts/collatz/conjoncture_rationalisation/` | Audit conjoncture |

View File

@ -1,52 +0,0 @@
**Auteur** : Équipe 4NK
# Collatz — Vérification déterministe de C2 (réduction projective)
## Objectif
Rendre citable (sans transcript terminal) une vérification déterministe des assertions utilisées dans le lemme C2 :
- **complétion par frères** : après fermeture des cas “one”, le résidu au palier suivant est exactement lensemble des **enfants** des parents “both” ;
- **projection projective** : lensemble des parents “both” à certains paliers se projette modulo \(2^{12}\) sur une base fixe \(B_{12}\subset(\mathbb{Z}/2^{12}\mathbb{Z})^\times\).
## Impacts
- Ajout dun artefact versionné dans `docs/artefacts/` et dun rapport dexécution dans `docs/`, alignés sur le format standard des rapports.
## Modifications
- Script déterministe :
- `applications/collatz/collatz_k_scripts/collatz_verify_c2_projective.py`
- Artefacts versionnés (sortie du script) :
- `docs/artefacts/collatz/c2_projective/verification_c2_projective.json`
- `docs/artefacts/collatz/c2_projective/verification_c2_projective.md`
- Rapport dexécution (sha256 + métriques) :
- `docs/collatz_run_report_2026-03-09_c2_projective.md`
- Extension du générateur de rapports :
- `applications/collatz/collatz_k_scripts/collatz_generate_run_report.py` (profil `c2_projective`)
## Modalités danalyse
- Générer/mettre à jour les artefacts déterministes :
```bash
python3 applications/collatz/collatz_k_scripts/collatz_verify_c2_projective.py \
--repo-root /home/ncantu/code/algo \
--output-dir docs/artefacts/collatz/c2_projective
```
- Produire le rapport dexécution (empreintes sha256 + métriques) :
```bash
python3 applications/collatz/collatz_k_scripts/collatz_generate_run_report.py \
--profile c2_projective \
--scope c2_projective \
--c2-artefacts-dir docs/artefacts/collatz/c2_projective \
--out-dir applications/collatz/out \
--docs-dir docs
```
## Modalités de déploiement
Aucun déploiement.

View File

@ -1,57 +0,0 @@
**Auteur** : Équipe 4NK
# Collatz — Vérification déterministe de C3 (clôture locale)
## Objectif
Produire un artefact déterministe et citable (sans transcript terminal) vérifiant une instance de C3 sur un domaine fini contrôlé :
- domaine \(L=\mathrm{Lift}_{12\to m}(B_{12})\) (résidus impairs modulo \(2^{m}\), \(m\ge 13\)),
- témoins :
- clauses de fusion F (avec `preimage_m < n` et égalité \(U(m)=U^{(t)}(n)\) vérifiée),
- et branche D8 (sélection arithmétique) : \(k=8\) avec \(A_8\le 14\), et vérification directe de \(U^{(8)}(n)<n\) au-delà du seuil \(N_0\).
Cet artefact vérifie la cohérence arithmétique des témoins et agrège les seuils \(N_0\) (D exact) et \(N_F\) (fusion) en une borne \(N^\star\) calculée sur ce domaine.
## Impacts
- Ajout dun artefact versionné dans `docs/artefacts/` et dun rapport dexécution dans `docs/`, alignés sur le format standard des rapports.
## Modifications
- Script déterministe :
- `applications/collatz/collatz_k_scripts/collatz_verify_c3_local_descent.py`
- Artefacts versionnés (sortie du script) :
- `docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent.json`
- `docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent.md`
- Rapport dexécution (sha256 + métriques) :
- `docs/collatz_run_report_2026-03-09_c3_local_descent.md`
- Extension du générateur de rapports :
- `applications/collatz/collatz_k_scripts/collatz_generate_run_report.py` (profil `c3_local_descent`)
## Modalités danalyse
- Générer/mettre à jour les artefacts déterministes :
```bash
python3 applications/collatz/collatz_k_scripts/collatz_verify_c3_local_descent.py \
--local-h6-root docs/artefacts/collatz \
--output-dir docs/artefacts/collatz/c3_local_descent \
--palier 15
```
- Produire le rapport dexécution (empreintes sha256 + métriques) :
```bash
python3 applications/collatz/collatz_k_scripts/collatz_generate_run_report.py \
--profile c3_local_descent \
--scope c3_local_descent \
--c3-artefacts-dir docs/artefacts/collatz/c3_local_descent \
--out-dir applications/collatz/out \
--docs-dir docs
```
## Modalités de déploiement
Aucun déploiement.

View File

@ -1,48 +0,0 @@
**Auteur** : Équipe 4NK
# Collatz — Rationalisation déterministe de `conjoncture_collatz.md`
## Objectif
- rendre `applications/collatz/conjoncture_collatz.md` indexable (un seul tronc canonique au début)
- isoler les duplications de tronc et les blocs non formels dans un fichier annexe
- produire un audit déterministe (duplications, TOC canonique, table de renvois) versionnable
## Impacts
- `applications/collatz/conjoncture_collatz.md` ne contient plus quun seul H1 `# Conjecture de Collatz: ...`
- les blocs déplacés restent disponibles, inchangés, dans un fichier annexe
- les titres génériques ciblés sont rendus uniques par numérotation
## Modifications
- scripts :
- `applications/collatz/collatz_k_scripts/collatz_conjoncture_rationalize.py`
- `applications/collatz/collatz_k_scripts/collatz_conjoncture_audit.py`
- annexes :
- `applications/collatz/conjoncture_collatz_annexes.md`
- artefacts versionnés :
- `docs/artefacts/collatz/conjoncture_rationalisation/audit_conjoncture.{json,md}`
## Modalités danalyse (reproduction)
Rationalisation (annexes + titres uniques ciblés) :
```bash
python3 applications/collatz/collatz_k_scripts/collatz_conjoncture_rationalize.py \
--input applications/collatz/conjoncture_collatz.md \
--annex applications/collatz/conjoncture_collatz_annexes.md
```
Audit déterministe :
```bash
python3 applications/collatz/collatz_k_scripts/collatz_conjoncture_audit.py \
--input applications/collatz/conjoncture_collatz.md \
--output-dir docs/artefacts/collatz/conjoncture_rationalisation
```
## Modalités de déploiement
Aucun déploiement.

View File

@ -1,133 +0,0 @@
**Auteur** : Équipe 4NK
# Plan d'implémentation — Extensions de grammaire (cas no/no)
## Alignement avec la thèse (livre_jeune_adulte.md)
Le plan respecte les principes du manuscrit :
- **Définir avant usage** : chaque notion (observable, projection, raffinement) est introduite avec ses hypothèses explicites.
- **Indexer les conclusions** : tout résultat est indexé par les choix (projection \(\Pi\), palier \(M\), grammaire \(\mathcal{K}\), paramètres \(k_{\max}\), \(M_{\max}\)).
- **Dette d'observabilité** : la thèse (Ch. 2, ligne 495) pose que « toute théorie qui prétend exclure la répétition dans un système itératif sur un espace d'états fini ne peut le faire sans introduire une hypothèse supplémentaire (… ou raffinement infini de l'observabilité). Le modèle impose une dette d'hypothèse. » Les extensions de grammaire visent à réduire cette dette par raffinement contrôlé (projection étendue, paliers plus profonds, règles de compression).
- **Stabilité sous raffinement/coarsening** (Ch. 16, Fermeture) : toute extension doit être testée sous variation de granularité (protocoles R1, R2, R3 de conjoncture_collatz.md).
- **Neutralité sémantique** : pas d'auto-évaluation ; formulations factuelles (« On définit… », « On montre… »).
## Objectif
Réduire `tracked.max` et `tracked.p99` sur la liste fixe `tracked_roots_lb_any_top200_mod2p15_to2p18.txt` en introduisant des règles de grammaire capables de fermer les racines où les deux enfants à \(m=16\) n'ont pas de clause immédiatement décidable (cas « no/no »).
## Phases du plan
### Phase 1 : Extension mécanique (Piste 2) — priorité immédiate
**Hypothèses.**
- Les racines extrêmes ont \(lb\in[19,136]\). Une partie peut être fermée par des clauses \(D_{\underline{}}\) à des paliers \(m\in\{19,\ldots,M_{\max}\}\) avec \(k\) plus grand.
- La génération et la vérification sont déjà en place ; seuls les paramètres changent.
**Étapes.**
1. Générer des clauses \(D_{\underline{}}\) pour \(m\in\{19,20,21\}\) et \(k\in\{12,\ldots,16\}\) (ou jusqu'à \(u_{\min}(k)\le m\)).
2. Générer des clauses terminales \(D/F\) pour \(m\in\{19,20,21\}\) via `collatz_generate_terminal_clauses_over_Sm.py` (si \(k_{\max}/t_{\max}\) suffisants).
3. Étendre le bundle de fermeture : `collatz_build_refinement_bundle_over_Sm_multilevel.py` avec `--max-palier 21` et les nouveaux leaf JSON.
4. Relancer `collatz_analyze_open_roots_refinement.py` et comparer `tracked.max`, `tracked.p99` sur la liste fixe.
5. Documenter dans `docs/artefacts/collatz/refinement_K/palier2p15/` les artefacts produits et les métriques.
**Indexation.** Résultats indexés par \(M_{\max}=21\), \(k_{\max}\) des clauses terminales, familles \((k,\underline A)\) des \(D_{\underline{}}\).
**Critère de succès.** \(\Delta\)(tracked.max) ou \(\Delta\)(tracked.p99) strictement négatif.
---
### Phase 2 : Raffinement multi-modulus (Piste 1) — conclue (négatif)
**Hypothèses.**
- La non-décidabilité de F à \(m=16\) peut venir de \(y\bmod 3\) non constant sur la classe. Une projection \(\Pi_{(M,s)}: n\mapsto (n\bmod 2^M, n\bmod 3^s)\) pourrait stabiliser le choix de fusion.
**Étapes exécutées.**
1. Analyse de la distribution de \(y=U^{(t)}(n)\bmod 3\) sur 400 résidus no/no (\(n\equiv r\pmod{2^{16}}\), \(t\le 16\)).
2. Test de partition par \(n\bmod 3^s\) pour \(s=1,2\).
**Résultat.** La partition par \(n\bmod 3^s\) ne stabilise pas \(y\bmod 3\) : 0 résidu constant, 0 partition_constant pour s=1 et s=2. L'arbre de raffinement mixte n'est pas applicable. Rapport : `docs/artefacts/collatz/refinement_K/palier2p15/phase2_y_mod3_analysis_report.md`.
**Critère de succès.** Non atteint.
---
### Phase 3 : Chaîne Hensel avec frères fermables (Piste 3) — raffinement
**Hypothèses.**
- La Piste 3 a échoué car les frères à \(m=16\) ne sont pas fermables. Si on augmente \(M_{\max}\) (Phase 1), certains frères à \(m\ge 19\) pourraient devenir fermables.
- Une stratégie hybride : suivre la chaîne Hensel à partir de \(m=19\) (au lieu de 16) pour les racines dont les enfants à \(m=19\) ont un frère fermable.
**Étapes.**
1. Après Phase 1, identifier les racines encore ouvertes dont un enfant à \(m=19\) a un frère fermé par \(D/F/D_{\underline{}}\).
2. Pour ces racines, implémenter une variante de `collatz_build_hensel_chain_leaves.py` qui démarre la chaîne à \(m=19\) (ou le premier niveau où le frère est fermable).
3. Intégrer les certificats « chaîne Hensel décalée » dans le pipeline de fermeture.
4. Mesurer l'impact sur `tracked.max/p99`.
**Indexation.** Résultats indexés par le niveau de démarrage de la chaîne et la disponibilité des clauses pour les frères.
**Critère de succès.** Au moins une racine fermée par certificat chaîne Hensel.
**Exécution (2026-03).** Phase 3 implémentée : `collatz_build_hensel_chain_leaves_shifted.py` avec `--start-m 19` : 1373 résidus fermés à m=19, open_roots 1349→1101 (248). Options A et B : extension à M_max=24, Hensel start_m=20,21 — aucun impact supplémentaire sur tracked.max/p99. Rapports : `option_a_extension_m24_report.md`, `option_b_hensel_m20_m21_report.md`.
---
### Phase 4 : Clause \(D\) partielle (Piste 4) — recherche formelle
**Hypothèses.**
- Une condition \(C(n)\) plus faible que la stabilité complète du préfixe pourrait suffire pour minorer \(U^{(k)}(n)\) et obtenir une descente.
**Étapes.**
1. Étudier la littérature et les formes de congruences sur \(n\) qui contraignent \(v_2(L_k(n))\) sans imposer \(A_{k-1}+1\le m\).
2. Proposer une forme explicite de \(C(n)\) (congruence modulo \(2^m\cdot 3^s\) ou combinaison) et un lemme de validité.
3. Si une forme est établie, implémenter un générateur et un vérificateur.
4. Intégrer dans le pipeline et mesurer.
**Expérimentation (piste A).** Script `collatz_analyze_prefix_diversity.py` : sur 32 résidus no/no, jusqu'à 37 préfixes distincts pour un échantillon de 256. Une disjonction par préfixe serait lourde. Note : `docs/artefacts/collatz/refinement_K/palier2p15/phase4_clause_D_partielle_research_note.md`.
**Indexation.** Résultats indexés par la forme de \(C(n)\) et le protocole de décidabilité.
**Critère de succès.** Lemme formel établi et au moins une racine fermée. Non atteint.
---
## Ordre d'exécution recommandé
1. **Phase 1** (extension mécanique) : effort minimal, réutilisation du code existant ; résultat mesurable rapidement.
2. **Phase 2** (multi-modulus) : nécessite une analyse préalable des distributions \(y\bmod 3\) ; peut être menée en parallèle de la Phase 1.
3. **Phase 3** (chaîne Hensel décalée) : dépend des résultats de la Phase 1 (identification des frères fermables à \(m\ge 19\)).
4. **Phase 4** (clause partielle) : recherche formelle ; peut être reportée si les Phases 13 suffisent.
## Artefacts et traçabilité
Chaque phase produit :
- Scripts (ou modifications) versionnés.
- Artefacts JSON/MD sous `docs/artefacts/collatz/refinement_K/` ou `docs/artefacts/collatz/terminal_clauses_over_Sm/`.
- Mise à jour de `docs/features/` et de `applications/collatz/conjoncture_collatz.md` pour les nouvelles règles et indexations.
- Rapport de métriques (tracked.max, tracked.p99, open_roots, q_m) avant/après.
## Rapports d'exécution
- Phase 1+3 : `docs/artefacts/collatz/refinement_K/palier2p15/phase1_grammar_extensions_report.md`
- Option A (M_max=24) : `docs/artefacts/collatz/refinement_K/palier2p15/option_a_extension_m24_report.md`
- Option B (Hensel start_m=20..24) : `docs/artefacts/collatz/refinement_K/palier2p15/option_b_hensel_m20_m21_report.md`
- Option C (diagnostic ciblé top 200) : `docs/artefacts/collatz/refinement_K/palier2p15/option_c_diagnostic_top200_report.md`
- Bundle Hensel complet : `docs/artefacts/collatz/refinement_K/palier2p15/bundle_mod2p15_to2p24_hensel_full/`
## Prolongations possibles
- **Phase 4** : recherche formelle d'une condition \(C(n)\) pour clause D partielle ; pistes A (partition préfixe), B (borne uniforme \(v_2(L_k)\)), C (littérature).
- **Hensel à paliers plus élevés** : start_m=22,23,24 exécutés (1388, 1394, 1419 résidus) ; closed_roots/open_roots inchangés.
- **D_minor à k plus grand** : k=17,18,… avec \(u_{\min}(k)\le m\) ; explosion du nombre de familles.
- **Protocoles R1, R2, R3** : tester la stabilité des métriques sous variation de granularité (conjoncture_collatz.md).
## Références
- `these/livre_jeune_adulte.md` : Ch. 2 (dette d'hypothèse, raffinement d'observabilité), Ch. 16 (stabilité sous raffinement, indexation)
- `applications/collatz/conjoncture_collatz.md` : Protocoles R1, R2, R3 ; Section « Extensions de grammaire pour les cas no/no »
- `docs/features/collatz_targeted_leaves_and_diagnostics.md` : diagnostic root cause, guidage pour grammaire plus puissante

View File

@ -1,50 +0,0 @@
**Auteur** : Équipe 4NK
# Chaîne Hensel décalée (Phase 3)
## Objectif
Fermer des racines en démarrant la chaîne de Hensel à m=19 (au lieu de m=15) pour les résidus dont le frère à m=19 est déjà fermable par la grammaire Phase 1 (terminal + D_minor).
## Hypothèse
La Piste 3 échouait car les frères à m=16 ne sont pas fermables. Avec Phase 1 (terminal + D_minor à m=19,20,21), certains frères à m≥19 deviennent fermables. Pour chaque parent (18, r18) ayant exactement un enfant dans le leaf set à m=19, on tente de fermer l'autre enfant par une chaîne Hensel de m=19 à m_end.
## Script
`applications/collatz/collatz_k_scripts/collatz_build_hensel_chain_leaves_shifted.py`
**Paramètres** :
- `--start-m 19|20|21` : niveau de démarrage de la chaîne
- `--leaf-json` : chemins vers terminal + D_minor (par défaut : palier 1921 + D_minor m=20,21)
**Sorties** :
- `clauses_hensel_chain_leaves_shifted_mod2p19.json` : feuilles à palier 19 (format compatible multilevel)
- `certs_shifted/*.json` : certificats par résidu fermé
## Résultat (exécution 2026-03-10)
- 1373 résidus fermés à m=19
- open_roots : 1349 → 1101 (248)
- tracked.max, tracked.p99 : inchangés (les racines fermées ne sont pas dans le top 200 par lb_any)
## Option B (start_m=20, 21)
- 1373 résidus fermés à m=20 et à m=21 (même structure quà m=19)
- Aucun impact supplémentaire : closed_roots, open_roots, tracked.max, tracked.p99 inchangés
- Rapport : `docs/artefacts/collatz/refinement_K/palier2p15/option_b_hensel_m20_m21_report.md`
## Prolongation (start_m=22, 23, 24)
- m=22 : 1388 résidus ; m=23 : 1394 ; m=24 : 1419
- Bundle terminal + Hensel 19..24 : closed_roots=15283, open_roots=1101 inchangés
## Optimisation mémoire
- Chargement prioritaire de `.residues.json` (streaming ijson) pour les clauses terminales
- `_ResidueBitset` pour `leaves_by_m` quand palier ≥ 20
## Références
- `docs/features/collatz_grammar_extensions_implementation_plan.md` : Phase 3
- `docs/artefacts/collatz/refinement_K/palier2p15/phase1_grammar_extensions_report.md` : rapport Phase 1 + 3

View File

@ -1,32 +0,0 @@
**Auteur** : Équipe 4NK
# Collatz — Artefacts H6 locaux et index agrégé (états B12)
## Objectif
Versionner et référencer, pour chaque état \(E\) de la base projective \(B_{12}\) (audit des 60 états), un paquet dartefacts “local H6” permettant de vérifier une assertion de couverture au sens strict :
- le domaine des relèvements au palier \(2^m\) est égal à lunion des ensembles `covered` de certificats locaux D/F.
## Impacts
- Les preuves et diagnostics reposent sur des artefacts **versionnés** (et non sur `applications/collatz/out/`, ignoré par Git).
- Un index agrégé permet dextraire \(\Delta m(E)\) et les horizons minimaux observés (D8 et fusion) pour chaque état.
## Modifications
- Ajout dun générateur dartefacts locaux : `applications/collatz/collatz_k_scripts/collatz_generate_local_h6_artefacts.py`.
- Ajout dun index agrégé : `docs/artefacts/collatz/local_H6_index.md`.
- Ajout dartefacts versionnés par état : `docs/artefacts/collatz/local_E{etat_id}_palier2p{m}/`.
- Génération de rapports dexécution par état via le profil `local_H6` du générateur de rapports.
## Modalités danalyse
- Vérifier la cohérence de lindex `docs/artefacts/collatz/local_H6_index.md` avec les `metadata.json` des répertoires `local_E*_palier2p*`.
- Pour un état donné, re-générer le rapport :
- `python3 applications/collatz/collatz_k_scripts/collatz_generate_run_report.py --profile local_H6 --scope <...> --local-h6-artefacts-dir <dir> --out-dir applications/collatz/out --docs-dir docs`
## Modalités de déploiement
Aucun déploiement.

View File

@ -1,153 +0,0 @@
**Auteur** : Équipe 4NK
# Minorated descent clauses (D_minor) over S_M
## Objectif
Ajouter une grammaire de feuilles terminales de type **descente minorée** (notée \(D_{\underline{}}\) dans `applications/collatz/conjoncture_collatz.md`) pour fermer, à palier fixé \(2^M\), des classes qui échouent à produire une clause exacte directement décidable (typiquement parce que la dernière valuation nest pas figée).
Cette grammaire vise en particulier les branches dominantes du résidu non couvert (p.ex. classes congruentes aux “sommets” \(2^t-1\)) où une simple **borne inférieure** sur une valuation suffit à conclure à la descente.
## Impacts
- Extension du jeu de feuilles utilisables par `collatz_build_refinement_certificate_over_Sm_multilevel.py` via des clauses `D_minor` exprimées à un palier \(2^M\).
- Réduction observée de `open_roots` sur `S_15` lors de lajout des feuilles `D_minor` (horizon \(k=8\), \(\underline A=13\)).
## Modifications
### Scripts
- `applications/collatz/collatz_k_scripts/collatz_generate_minorated_descent_clauses_over_Sm.py`
- Génère les clauses `D_minor` sur \(S_M\) (tous résidus impairs modulo \(2^M\)).
- Paramètres: `--palier M`, `--k`, `--underlineA`.
- `applications/collatz/collatz_k_scripts/collatz_verify_minorated_descent_clauses_over_Sm.py`
- Vérifie déterministiquement les clauses produites (stabilité du préfixe, cohérence de \(C_k\), congruence \(\bmod 2^{\underline A}\), seuil \(N_0\)).
- `applications/collatz/collatz_k_scripts/collatz_derive_brother_minorated_clauses_from_terminal_over_Sm.py`
- Dérive des clauses `D_minor` pour des frères à partir de clauses `D_exact` sur \(S_m\) (complétion par frères, via le même numérateur affine).
- Sort un JSON de feuilles additionnel, consommable par la fermeture multi-niveaux.
### Artefacts
Par défaut, sortie sous:
- `docs/artefacts/collatz/minorated_clauses_over_Sm/palier2p<M>/clauses_D_minor_over_Sm_mod2p<M>.json`
- `docs/artefacts/collatz/minorated_clauses_over_Sm/palier2p<M>/clauses_D_minor_over_Sm_mod2p<M>.md`
- `docs/artefacts/collatz/minorated_clauses_over_Sm/palier2p<M>/verification_D_minor_over_Sm_mod2p<M>.{json,md}`
Clauses dérivées “par frères” :
- `docs/artefacts/collatz/minorated_clauses_over_Sm_derived_from_brothers/palier2p<M>/clauses_D_minor_derived_from_brothers_over_Sm_mod2p<M>.json`
## Modalités danalyse
### Génération (exemple M=15, k=8, underlineA=13)
```bash
cd /home/ncantu/code/algo
python3 applications/collatz/collatz_k_scripts/collatz_generate_minorated_descent_clauses_over_Sm.py \
--repo-root /home/ncantu/code/algo \
--palier 15 \
--k 8 \
--underlineA 13
```
### Génération (familles, M=15..18)
Exemple de génération “familles” par horizons \(k\) avec \(\underline A\) minimal contractif \((2^{\underline A}>3^k)\) :
```bash
cd /home/ncantu/code/algo
for palier in 15 16 17 18; do
for k in 6 7 8 9 10 11; do
u=$(K="$k" python3 - <<'PY'
import os
k=int(os.environ["K"])
a=3**k
u=0
while (1<<u) <= a:
u += 1
print(u)
PY
)
if [ "$u" -le "$palier" ]; then
python3 applications/collatz/collatz_k_scripts/collatz_generate_minorated_descent_clauses_over_Sm.py \
--repo-root /home/ncantu/code/algo \
--palier "$palier" \
--k "$k" \
--underlineA "$u"
python3 applications/collatz/collatz_k_scripts/collatz_verify_minorated_descent_clauses_over_Sm.py \
--clauses-json "docs/artefacts/collatz/minorated_clauses_over_Sm/palier2p${palier}/clauses_D_minor_over_Sm_mod2p${palier}_k${k}_u${u}.json"
fi
done
done
```
### Vérification
```bash
cd /home/ncantu/code/algo
python3 applications/collatz/collatz_k_scripts/collatz_verify_minorated_descent_clauses_over_Sm.py \
--clauses-json docs/artefacts/collatz/minorated_clauses_over_Sm/palier2p15/clauses_D_minor_over_Sm_mod2p15_k8_u13.json
```
### Intégration dans la fermeture par raffinement multi-niveaux
Ajouter le JSON de clauses `D_minor` comme source de feuilles supplémentaire:
```bash
cd /home/ncantu/code/algo
python3 applications/collatz/collatz_k_scripts/collatz_build_refinement_certificate_over_Sm_multilevel.py \
--repo-root /home/ncantu/code/algo \
--root-palier 15 \
--max-palier 18 \
--leaf-json docs/artefacts/collatz/terminal_clauses_over_Sm/palier2p15/clauses_terminal_over_Sm_mod2p15.json \
--leaf-json docs/artefacts/collatz/minorated_clauses_over_Sm/palier2p15/clauses_D_minor_over_Sm_mod2p15_k8_u13.json \
--leaf-json docs/artefacts/collatz/terminal_clauses_over_Sm/palier2p16/clauses_terminal_over_Sm_mod2p16.json \
--leaf-json docs/artefacts/collatz/terminal_clauses_over_Sm/palier2p17/clauses_terminal_over_Sm_mod2p17.json \
--leaf-json docs/artefacts/collatz/terminal_clauses_over_Sm/palier2p18/clauses_terminal_over_Sm_mod2p18.json
```
## Tableau comparatif automatisé (par ajout incrémental de familles)
Le script `collatz_compare_dminor_families_incremental.py` produit une table versionnable par “run” :
- \(\Delta open\_roots\)
- \(\Delta q_m\) (au palier racine, et les valeurs \(q_m\) restent disponibles dans chaque certificat)
- \(\Delta parents\_one\_child\)
- quantiles `lb_any` (p99/max) sur les racines encore ouvertes après chaque ajout
```bash
cd /home/ncantu/code/algo
python3 applications/collatz/collatz_k_scripts/collatz_compare_dminor_families_incremental.py \
--repo-root /home/ncantu/code/algo \
--root-palier 15 \
--max-palier 18 \
--k-max 256 \
--t-max 256 \
--search-max-required-m 256 \
--target-extremes-top-n 200
```
### Suivi dune liste fixe (tracked roots file)
Pour comparer des runs sur exactement le même sous-ensemble dextrêmes (liste stable), fournir un fichier texte :
- une racine par ligne (entier impair strictement positif)
- commentaires `# ...` autorisés
```bash
cd /home/ncantu/code/algo
python3 applications/collatz/collatz_k_scripts/collatz_compare_dminor_families_incremental.py \
--repo-root /home/ncantu/code/algo \
--root-palier 15 \
--max-palier 18 \
--k-max 256 \
--t-max 256 \
--search-max-required-m 256 \
--tracked-roots-file /path/to/tracked_roots.txt
```
## Déploiement
Aucun déploiement.

View File

@ -1,83 +0,0 @@
**Auteur** : Équipe 4NK
# Collatz — Refinement certificate at palier 2^M (instrumented domain L)
## Objective
Provide a deterministic, versionable artefact that makes “decidability from a coarse observable” explicit.
At palier \(2^M\), the modular register \(K_M\) only retains clauses with `stable_modulus_power <= M`.
When most witnesses require `m_stable > M`, an alternative is to keep \(M\) as the *root observable*
and record a finite refinement path to a finer modulus where a terminal clause \(D/F\) applies.
This feature builds and audits such refinement paths on the instrumented finite domain \(L\)
(the C3 witness domain), without claiming a global certificate on \(S_M\).
## Impacts
- Adds new versioned artefacts under `docs/artefacts/collatz/refinement_K/`.
- Does not change the extraction of terminal clauses (Option A); it reuses `clauses_universelles.json`.
## Modifications
### Script
- `applications/collatz/collatz_k_scripts/collatz_build_refinement_certificate_modular.py`
- reads `clauses_universelles.json` (Option A) and the referenced C3 verification JSON,
- for each `n` in the C3 domain \(L\), records a deterministic refinement path from \(n mod 2^M\)
to the terminal stable residue at \(2^{m_{stable}}\),
- produces a summary audit (depth buckets, max depth).
### S_M variant (full odd residue space)
- `applications/collatz/collatz_k_scripts/collatz_build_refinement_certificate_over_Sm.py`
- reads `clauses_universelles.json` (Option A),
- attempts to close the full refinement tree for each root residue in \(S_M\) using the finite
set of terminal clauses, producing a closed/open partition of \(S_M\).
### S_M multilevel variant (root M to max M_max)
- `applications/collatz/collatz_k_scripts/collatz_generate_terminal_clauses_over_Sm.py`
- generates terminal clauses directly decidable at \(2^m\) (criterion \(A+1\le m\)) on the full \(S_m\).
- `applications/collatz/collatz_k_scripts/collatz_build_refinement_certificate_over_Sm_multilevel.py`
- closes roots in \(S_M\) by refinement up to \(2^{M_{max}}\) using leaf sets provided at multiple levels.
- `applications/collatz/collatz_k_scripts/collatz_build_refinement_bundle_over_Sm_multilevel.py`
- wrapper pipeline: multilevel closure + open-roots obstruction profile + optional targeted diagnostic (tracked roots file).
- can optionally include brother-derived `D_minor` leaves (`--include-brother-derived-dminor`) and verify them (`--verify-brother-derived-dminor`).
### Artefacts
For palier \(M\):
- `docs/artefacts/collatz/refinement_K/palier2pM/refinement_certificate_mod2pM.json`
- `docs/artefacts/collatz/refinement_K/palier2pM/refinement_certificate_mod2pM.md`
- `docs/artefacts/collatz/refinement_K/palier2pM/audit_refinement_certificate_mod2pM.json`
- `docs/artefacts/collatz/refinement_K/palier2pM/audit_refinement_certificate_mod2pM.md`
For palier \(M\) (S_M variant):
- `docs/artefacts/collatz/refinement_K/palier2pM/refinement_certificate_Sm_mod2pM.json`
- `docs/artefacts/collatz/refinement_K/palier2pM/refinement_certificate_Sm_mod2pM.md`
- `docs/artefacts/collatz/refinement_K/palier2pM/audit_refinement_certificate_Sm_mod2pM.json`
- `docs/artefacts/collatz/refinement_K/palier2pM/audit_refinement_certificate_Sm_mod2pM.md`
For palier \(M\) (S_M multilevel variant):
- `docs/artefacts/collatz/terminal_clauses_over_Sm/palier2p<m>/clauses_terminal_over_Sm_mod2p<m>.{json,md}`
- `docs/artefacts/collatz/refinement_K/palier2pM/refinement_certificate_Sm_multilevel_mod2pM_to2pMmax.{json,md}`
- `docs/artefacts/collatz/refinement_K/palier2pM/audit_refinement_certificate_Sm_multilevel_mod2pM_to2pMmax.{json,md}`
## Deployment
No deployment. Local scripts only; artefacts are intended to be committed.
## Analysis / Reproduction
Example for palier \(2^{15}\):
```bash
python3 applications/collatz/collatz_k_scripts/collatz_build_refinement_certificate_modular.py \
--palier 15 \
--repo-root /home/ncantu/code/algo
```

View File

@ -1,56 +0,0 @@
**Auteur** : Équipe 4NK
# Collatz — Modular register K_M and finite coverage audit (Option A)
## Objective
Provide a deterministic, versionable materialization of the modular coverage obligation (H2)/(I1):
- build a finite register \(\mathcal{K}_M\) containing only clauses decidable at palier \(2^M\) (i.e. \(m(c)\le M\));
- run a finite coverage audit on the instrumented domain \(L\) (the C3 witness domain), producing an equality-of-sets style artefact (covered vs uncovered on \(L\)).
This does not claim a global coverage of \(S_M\); it is an auditable step “indexed by artefacts”.
## Impacts
- Adds new versioned artefacts under `docs/artefacts/collatz/register_K/`.
- Does not modify any existing certificates, C3 artefacts, or universal clause extraction logic.
## Modifications
### Script
- `applications/collatz/collatz_k_scripts/collatz_build_register_K_modular.py`
- reads `clauses_universelles.json` (Option A extracted clauses),
- filters eligible clauses with `stable_modulus_power <= M` into \(\mathcal{K}_M\),
- computes \(N^\*=\max_c N(c)\) on eligible clauses,
- audits coverage on the finite C3 domain \(L\) (record `n` values), producing covered/uncovered sets and diagnostics.
### Artefacts
For each palier \(M\):
- `docs/artefacts/collatz/register_K/palier2pM/register_K_mod2pM.json`
- `docs/artefacts/collatz/register_K/palier2pM/register_K_mod2pM.md`
- `docs/artefacts/collatz/register_K/palier2pM/audit_register_K_mod2pM.json`
- `docs/artefacts/collatz/register_K/palier2pM/audit_register_K_mod2pM.md`
- `docs/artefacts/collatz/register_K/palier2pM/non_eligible_clauses_mod2pM.json`
- `docs/artefacts/collatz/register_K/palier2pM/non_eligible_clauses_mod2pM.md`
- `docs/artefacts/collatz/register_K/palier2pM/manifest_register_K_mod2pM.json`
- `docs/artefacts/collatz/register_K/palier2pM/manifest_register_K_mod2pM.md`
## Deployment
No deployment. Local scripts only; artefacts are intended to be committed.
## Analysis / Reproduction
Example for palier \(2^{15}\):
```bash
python3 applications/collatz/collatz_k_scripts/collatz_build_register_K_modular.py \
--palier 15 \
--horizon-k 5 \
--repo-root /home/ncantu/code/algo
```

View File

@ -1,44 +0,0 @@
**Auteur** : Équipe 4NK
# Collatz — Génération automatisée des rapports dexécution
## Objectif
Fournir un mécanisme standard et reproductible pour produire un rapport dexécution séparé du texte de preuve, contenant :
- la commande,
- les artefacts dentrée et de sortie,
- les empreintes sha256,
- des compteurs extraits des logs,
afin déviter toute insertion de transcript terminal dans les documents mathématiques.
## Impacts
- Les rapports dexécution sont centralisés dans `docs/` et référencés depuis les documents de preuve par un chemin stable.
- Les empreintes sha256 permettent de citer précisément les artefacts utilisés.
## Modifications
- Ajout dun format standard : `docs/collatz_run_report_format.md`.
- Ajout dun générateur : `applications/collatz/collatz_k_scripts/collatz_generate_run_report.py`.
- Ajout dun exemple réel de rapport : `docs/collatz_run_report_2026-03-04_extend_D18_D21_resume_from_D20.md`.
- Profils supportés : `extend_finale`, `validation_section7`, `pipeline_d16_d17`, `fusion_palier2p25`, `local_H6_E1`, `local_H6`, `c2_projective`, `c3_local_descent`, `c3_local_descent_palier`, `universal_clauses`, `universal_clauses_palier`.
- Pour `local_H6`/`local_H6_E1`, un audit automatique compare le **palier attendu** (artefacts) au **palier certifié** (certificats) et échoue en cas de désaccord.
- Pour `c2_projective`, le rapport cite les artefacts déterministes `docs/artefacts/collatz/c2_projective/verification_c2_projective.{json,md}`.
- Pour `c3_local_descent`, le rapport cite les artefacts déterministes `docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent.{json,md}` (et, si `--c3-palier != 13`, les variantes suffixées `..._palier2p<m>.{json,md}`).
- Pour `c3_local_descent_palier`, le nom de fichier du rapport est déterministe : `docs/collatz_run_report_<date>_c3_local_descent_palier2p<m>.md`.
- Pour `universal_clauses`, le rapport cite les artefacts déterministes `docs/artefacts/collatz/universal_clauses/...` et lentrée C3 est déduite de `clauses_universelles.json` (champ `inputs.verification_c3_local_descent_json`).
- Pour `universal_clauses_palier`, le nom de fichier du rapport est déterministe : `docs/collatz_run_report_<date>_universal_clauses_palier2p<m>.md`.
## Modalités danalyse
- Vérifier que `applications/collatz/out/pipeline_extend.log` et `applications/collatz/out/paliers_finale.log` existent et contiennent un run complet.
- Vérifier la présence des artefacts listés (noyaux/candidats/certificats) dans `applications/collatz/out/`.
- Pour `local_H6_E1`, vérifier la présence des artefacts versionnés dans `docs/artefacts/collatz/local_E1_palier2p13/`.
- Pour `local_H6`, fournir `--local-h6-artefacts-dir` et vérifier la présence dun noyau base `noyaux/noyau_*_B12.json` et dau moins un certificat `certificats/certificat_*.json`.
## Modalités de déploiement
Aucun déploiement.

View File

@ -1,84 +0,0 @@
**Auteur** : Équipe 4NK
# Targeted leaves (attempt) and diagnostics
## Objectif
Réduire `tracked.max/p99` sur une liste fixe de racines ouvertes (topN par `lb_any`) au palier `2^15`,
en introduisant une grammaire de feuilles capable de **payer localement une dette dobservabilité**,
sans déclencher une explosion combinatoire du raffinement binaire.
## Tentative implémentée
- `applications/collatz/collatz_k_scripts/collatz_build_targeted_refinement_leaves.py`
- `applications/collatz/collatz_k_scripts/collatz_verify_targeted_refinement_leaves.py`
Principe : fermer chaque racine suivie `r0` via un certificat de raffinement profond (cap par défaut 160)
en nautorisant comme feuilles terminales que `D_exact`, `F`, et `D_minor`.
### Résultat
Sur la liste fixe `tracked_roots_lb_any_top200_mod2p15_to2p18.txt`, aucun certificat na été construit (`closed_roots=0`).
Artefacts :
- `docs/artefacts/collatz/refinement_K/palier2p15/targeted_leaves/clauses_targeted_refinement_leaves_mod2p15.json`
- `docs/artefacts/collatz/refinement_K/palier2p15/targeted_leaves/verification_targeted_refinement_leaves_mod2p15.json`
## Diagnostic déterministe (root cause)
### Fait structurel mesuré (au premier raffinement 2^15→2^16)
Sur les racines suivies, **les deux enfants** (low/high) au niveau `m=16` nont *pas* de clause terminale immédiatement décidable (`A+1 <= 16`) dans la grammaire `D_exact/F` (avec `k_max=t_max=256`).
Ce fait est mesuré et versionné dans :
- `applications/collatz/collatz_k_scripts/collatz_diagnose_targeted_leaves_failure.py`
- `docs/artefacts/collatz/refinement_K/palier2p15/targeted_leaves/diagnostic_targeted_leaves_failure_mod2p15.md`
Extrait (colonnes `immediate_low@16`, `immediate_high@16`) :
- `root=27` : `no/no`, et `lb_root=60`
- `root=703` : `no/no`, et `lb_root=84`
- `root=2887` : `no/no`, et `lb_root=136`
### Interprétation mathématique
Dans la grammaire de fermeture par raffinement binaire, une racine `r0` est fermée si et seulement si **les deux enfants** à chaque split sont fermables (directement ou récursivement).
Quand `immediate_low@16=no` et `immediate_high@16=no`, fermer `r0` impose mécaniquement de **raffiner plus profond** au moins jusquà une profondeur où une clause terminale devient décidable. Le diagnostic donne des bornes inférieures `lb_root` typiquement dans `[50, 136]` sur les racines extrêmes.
Le point bloquant nest pas “le cap 160” en tant que tel : cest le fait que, sans règle de compression,
la fermeture par scission binaire doit couvrir un arbre de taille \(2^{(lb\_root-16)}\) nœuds au minimum dans le cas défavorable.
Pour `lb_root=136`, cela correspond à une explosion combinatoire hors de portée dun certificat fini exploitable.
### Conclusion (root cause)
Léchec des certificats “targeted leaves” vient de la combinaison :
- **absence de feuilles terminales décidables** au premier niveau de raffinement (m=16) sur les racines extrêmes ;
- **bornes inférieures `lb_root` très élevées**, qui rendent le raffinement binaire naïf exponentiel ;
- grammaire de feuilles **trop faible** (D/F/D_minor) pour “absorber” la dette sans fermer récursivement les deux enfants.
## Formalisation et plan d'implémentation
Les quatre pistes d'extension sont formalisées dans `applications/collatz/conjoncture_collatz.md` (section « Extensions de grammaire pour les cas no/no »). Le plan d'implémentation aligné sur `these/livre_jeune_adulte.md` est dans `docs/features/collatz_grammar_extensions_implementation_plan.md`.
### Phase 1 exécutée (extension mécanique)
La Phase 1 a été exécutée : clauses terminales D/F pour m=15..21 (k_max=t_max=16), clauses D_minor pour m=20,21 (k=12,u=20 ; k=12,u=21 ; k=13,u=21), bundle étendu à max_palier=21. Rapport et métriques : `docs/artefacts/collatz/refinement_K/palier2p15/phase1_grammar_extensions_report.md`. Résultat : Δ(tracked.max)=0, Δ(tracked.p99)=0 ; critère de succès non atteint.
### Phase 3 exécutée (chaîne Hensel décalée)
Script `collatz_build_hensel_chain_leaves_shifted.py` : chaîne Hensel démarrant à m=19 pour les résidus dont le frère à m=19 est fermable. 1373 résidus fermés à m=19. open_roots : 1349 → 1101 (248). tracked.max/p99 inchangés (les racines fermées ne sont pas dans le top 200).
### Option A + B exécutées
- Option A : extension à M_max=24, D_minor m=22,23,24. Aucun impact sur tracked.max/p99. Rapport : `option_a_extension_m24_report.md`.
- Option B : Hensel start_m=20,21. Aucun impact supplémentaire. Rapport : `option_b_hensel_m20_m21_report.md`.
Le diagnostic ciblé est exécuté par le bundle avec `--tracked-roots-file` ; sortie : `diagnostic_targeted_leaves_failure_mod2p15.md` dans le répertoire du bundle.
## Guidage pour une grammaire plus puissante
Une grammaire réduisant effectivement `tracked.max/p99` doit introduire une règle/feuille capable de :
- fermer un sous-arbre en **taille linéaire** en la profondeur (compression),
- typiquement en exploitant des structures de type **chaîne henselienne** (un seul embranchement “dur”, le frère se ferme par une clause uniforme),
- ou une règle de “réparation/recombinaison” explicitant comment une branche survivante peut être traitée sans imposer la fermeture complète des deux enfants au même niveau de description.

View File

@ -1,59 +0,0 @@
**Auteur** : Équipe 4NK
# Optimisation mémoire — génération clauses terminales
## Contexte
La génération des clauses terminales pour les paliers élevés (m ≥ 22) provoquait des plantages par manque de mémoire (2^m résidus impairs, chaque clause ~100 octets).
## Optimisations appliquées
### collatz_generate_terminal_clauses_over_Sm.py
1. **Itérateur au lieu de liste** : `range(1, mod, 2)` instead of `list(range(...))` — évite d'allouer ~64 Mo pour m=24.
2. **Mode streaming** (automatique si `total_roots > 500_000`) :
- Écriture des clauses dans un fichier JSONL temporaire au fur et à mesure
- Assemblage du JSON final sans garder toutes les clauses en mémoire
- Pas de liste `clauses` en mémoire pendant la génération
3. **Écriture JSON** : `json.dump(obj, f)` au lieu de `json.dumps()` puis `write()` — évite la duplication du string de sortie.
4. **Option `--streaming`** : force le mode streaming même pour les petits paliers.
### collatz_generate_minorated_descent_clauses_over_Sm.py
- `json.dump()` vers fichier au lieu de `json.dumps()`.
### collatz_build_refinement_certificate_over_Sm_multilevel.py
- Chargement prioritaire de `.residues.json` (streaming ijson) au lieu du JSON complet.
- `ResidueBitset` pour `leaves_by_m` et `closed` quand m ≥ 20 (≈1 Mo par palier au lieu de centaines de Mo).
- `json.load(f)` au lieu de `json.loads(path.read_text())` pour le fallback.
### collatz_build_hensel_chain_leaves_shifted.py
- Chargement prioritaire de `.residues.json` pour les clauses terminales (streaming ijson).
- `_ResidueBitset` pour `leaves_by_m` quand palier ≥ 20.
- D_minor > 50 Mo : chargement en flux (ijson) au lieu de `json.load`.
- `dminor_leaf_map` : stockage compact `(k,u,Bk,Akm1,Ckm1,N0)`, Leaf créé à la demande.
- `--leaf-list-file` : chemins lus depuis un fichier (évite CLI trop long).
- `gc.collect()` périodique dans la boucle principale.
## Format compact .residues.json
Pour les paliers élevés (m ≥ 20), un fichier `.residues.json` compact est généré ou extrait. Le chargeur multilevel (`collatz_build_refinement_certificate_over_Sm_multilevel.py`) utilise ce fichier lorsqu'il existe, évitant de charger les JSON de clauses complets (ex. 1,3 Go pour m=24).
- **Génération** : en mode streaming, le script terminal écrit automatiquement `.residues.json`.
- **Extraction** : `collatz_extract_residues_from_clauses_json.py` extrait les résidus d'un JSON existant (par regex en flux pour les fichiers > 100 Mo).
## Recommandations pour m=23, m=24
Le mode streaming s'active automatiquement pour m ≥ 20 (2^19 = 524_288 > 500_000). Pour m=23 et m=24, le script peut être exécuté avec :
```bash
python3 applications/collatz/collatz_k_scripts/collatz_generate_terminal_clauses_over_Sm.py \
--repo-root . --palier 23 --k-max 16 --t-max 16
```
Les temps d'exécution sont approximativement : m=22 ~3 min, m=23 ~6 min, m=24 ~12 min (selon la machine).

View File

@ -1,86 +0,0 @@
**Auteur** : Équipe 4NK
# Collatz — Extraction de clauses universelles (Option A : Lift(B12))
## Objectif
Industrialiser la conversion « témoin local → clause universelle candidate » (H4/H5) dans le périmètre **Option A** :
- domaine des témoins : une instance locale de clôture (C3) sur \(L=\mathrm{Lift}_{12\to 13}(B_{12})\) ;
- entrée standard : un artefact déterministe `verification_c3_local_descent.json` contenant, pour chaque \(n\in L\), un témoin \(D\) (exact / brother) ou \(F\) (fusion) ;
- sortie : un ensemble versionné de **clauses candidates** \(D/F\) relevées au module \(2^{m_{stable}}\) avec \(m_{stable}=\max(m, A+1)\) (où \(m\) est le palier du domaine), afin de figer le préfixe de valuations, plus une vérification déterministe de cohérence.
Le but est de rendre la notion « certificat ⇒ clause universelle utilisable dans une induction bien fondée » exploitable de manière répétable, sans transcript, et sans dépendre dun seul représentant.
## Impacts
- Ajoute un format dartefacts versionnés `docs/artefacts/collatz/universal_clauses/` pour stocker :
- clauses extraites (JSON + MD),
- vérification (JSON + MD).
- Naltère pas la pipeline de génération de certificats ; le flux est en lecture seule visàvis des artefacts C3.
## Modifications
### Scripts
- `applications/collatz/collatz_k_scripts/collatz_extract_universal_clauses.py`
- lit `docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent.json`,
- pour chaque témoin `D_exact` ou `F`, calcule \(m_{stable}=\max(m, A+1)\) et relève le résidu au palier stable par un relèvement déterministe (choix unique du bon enfant à chaque palier),
- conserve `D_brother` sous forme de dépendance locale `D_brother_local` (référence `mate_exact`).
- `applications/collatz/collatz_k_scripts/collatz_verify_universal_clauses.py`
- vérifie la cohérence arithmétique et la cohérence de relèvement avec le fichier source C3,
- vérifie aussi les dépendances `D_brother_local` (relation de sœur au palier de domaine, et existence du `mate_exact` en `D_exact`).
### Artefacts
- `docs/artefacts/collatz/universal_clauses/clauses_universelles.{json,md}`
- `docs/artefacts/collatz/universal_clauses/verification_universal_clauses.{json,md}`
## Modalités de déploiement
Pas de déploiement : scripts exécutés localement, artefacts versionnés.
## Modalités danalyse / reproduction
Commande dextraction :
```bash
python3 applications/collatz/collatz_k_scripts/collatz_extract_universal_clauses.py \
--verification-json docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent.json \
--output-dir docs/artefacts/collatz/universal_clauses \
--repo-root /home/ncantu/code/algo
```
Commande de vérification :
```bash
python3 applications/collatz/collatz_k_scripts/collatz_verify_universal_clauses.py \
--verification-json docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent.json \
--clauses-json docs/artefacts/collatz/universal_clauses/clauses_universelles.json \
--output-dir docs/artefacts/collatz/universal_clauses \
--repo-root /home/ncantu/code/algo
```
Exemple palier \(2^{15}\) :
```bash
python3 applications/collatz/collatz_k_scripts/collatz_extract_universal_clauses.py \
--verification-json docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent_palier2p15.json \
--output-dir docs/artefacts/collatz/universal_clauses/palier2p15 \
--repo-root /home/ncantu/code/algo
python3 applications/collatz/collatz_k_scripts/collatz_verify_universal_clauses.py \
--verification-json docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent_palier2p15.json \
--clauses-json docs/artefacts/collatz/universal_clauses/palier2p15/clauses_universelles.json \
--output-dir docs/artefacts/collatz/universal_clauses/palier2p15 \
--repo-root /home/ncantu/code/algo
```
Entrée attendue :
- `docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent.json`
Sorties attendues :
- `docs/artefacts/collatz/universal_clauses/clauses_universelles.json`
- `docs/artefacts/collatz/universal_clauses/verification_universal_clauses.json`

View File

@ -1,54 +0,0 @@
**Auteur** : Équipe 4NK
# Collatz docs: proof status and transcript cleanup
## Problem
Two Collatz documents mixed a mathematical narrative with an execution transcript (shell prompt + run logs + conversational text) and contained a logical mismatch:
- The text asserted a complete proof / total coverage / global threshold conclusion.
- The cited run excerpt reported a non-empty residual core at the audited final palier (e.g. `out/noyaux/noyau_post_D21.json` with a large number of residues).
This combination makes the documents non-citable as a proof document: conclusions are stated as established facts while the referenced artefacts do not discharge the required closure hypothesis.
## Root cause
- A run transcript and subsequent discussion were pasted directly into `applications/collatz/conjoncture_collatz.md`, after the conclusion section, without being moved to a dedicated log/report file.
- The wording in the conclusions did not keep the closure hypothesis explicit (extinction of the residual core \(R_M\)), and conflated partial extinction (e.g. “both” core) with global closure.
## Corrective actions
- Remove the pasted transcript from `applications/collatz/conjoncture_collatz.md` so the file remains a mathematical document.
- Requalify the end of `applications/collatz/conjoncture_collatz.md`:
- keep “both” extinction as its own statement,
- state global closure as conditional on an explicit hypothesis \(H_{\mathrm{ext}}(M): R_M=\varnothing\),
- and document the selected continuation path (“hybrid”).
- Update `applications/collatz/démonstration collatz.md` to include the hybrid continuation option (certificate reduction + structural characterization + specific lemma) and keep the document conditionally correct.
## Impact
- The documents no longer contain a terminal transcript in the body of the proof text.
- Statements about global closure are now conditional on an explicit hypothesis, consistent with the run artefacts reported in the repository.
## Analysis modalities
- When a run transcript is needed, store it in a dedicated file (or in `out/` artefacts) and reference it from the proof document via a stable path and reproducible script invocation.
- Use the standard run report template in `docs/collatz_run_report_format.md`, and keep at least one concrete filled report in `docs/` for citation.
- For status checks, prefer referencing:
- `applications/collatz/collatz_k_scripts/diagnostic_run_D18_D21_et_statut_preuve.md`
- `applications/collatz/collatz_k_scripts/errata_demonstration_collatz.md`
- `applications/collatz/collatz_k_scripts/plan_lemmes_manquants_et_programme_de_preuve.md`
## Deployment
No deployment. This change is documentation-only.
## Pages affected
- `applications/collatz/conjoncture_collatz.md`
- `applications/collatz/démonstration collatz.md`
- `applications/collatz/collatz_k_scripts/plan_lemmes_manquants_et_programme_de_preuve.md`
- `docs/fixKnowledge/collatz_docs_status_and_transcript_cleanup.md`
- `docs/collatz_run_report_format.md`
- `docs/collatz_run_report_2026-03-04_extend_D18_D21_resume_from_D20.md`

View File

@ -1,45 +0,0 @@
# collatz_scission palier inference and output directory creation
## Problem
The helper script `applications/collatz/collatz_k_scripts/collatz_scission.py` can produce incorrect certificates in two cases:
- **Incorrect `palier` inference**: when the CSV class column is named generically (e.g. `classe_mod_2^m`) and the covered classes are sparse / small (e.g. values \(<2^8\) while the target modulus is \(2^{13}\)), `palier` was inferred from the maximum class value. This yields a wrong modulus power.
- **Missing output directories**: `run_scission()` writes `out_json_path` without creating parent directories, which can raise `FileNotFoundError` when callers pass a new path under a non-existing folder.
## Root cause
- `infer_palier()` only supported:
- parsing `2^m` from the class column name, or
- a fallback heuristic based on the maximum covered residue value.
This heuristic is not reliable when the class column name does not encode the modulus power.
- `run_scission()` assumed the output directory exists.
## Corrective actions
- **Prefer explicit palier columns**:
- If the CSV contains a numeric `palier` column, use it.
- If the CSV contains a numeric `m` / `modulus_power` column (used as exponent in some pipelines), use it.
- **Fallback from filename**: parse `palier2p<m>` from the CSV path when available.
- **Keep legacy fallback**: keep the max-value heuristic as a last resort.
- **Create output directories**: ensure `out_json_path.parent` exists before writing.
- **Do not add spurious residue 0**: skip empty strings instead of coercing to 0 when parsing the class / sister columns.
## Impact
- Certificates generated via `collatz_scission.py` now carry a `palier` that matches the CSVs intended modulus power when the CSV provides it (or when the filename encodes it).
- Callers can write certificates to new directories without pre-creating them.
## Analysis modalities
- For any certificate JSON, verify:
- `palier` matches the intended modulus power \(2^m\),
- `clauses` and `covered` sets do not contain a spurious `0`,
- directory creation does not fail when writing under a fresh path.
## Deployment
- No environment changes are required.
- The fix is local to:
- `applications/collatz/collatz_k_scripts/collatz_scission.py`

View File

@ -1,57 +0,0 @@
# Crash 08-paliers-finale / Cursor during F16
## Problem
The script `08-paliers-finale.sh` (extended pipeline D18→D21, F15, F16) crashes, and Cursor (which launched it) also crashes. No Python exception is logged; the last line in `out/pipeline_extend.log` is:
```
[2026-03-04 09:26:35] STEP start F16 fusion palier=2^35 rss_max_mb=11789
```
## Root cause
1. **Where it stops**: The process is killed during **F16** (fusion pipeline, palier 2^35), right after D20 completed successfully.
2. **Why there is no `[CRASH]` line**: The Python excepthook only runs on uncaught exceptions. The process was almost certainly killed by the **Linux OOM killer (SIGKILL)** when the system ran out of RAM. SIGKILL cannot be caught; the process disappears without running exception handlers.
3. **Memory sequence**:
- After D20: **rss_max_mb=11789** (~11.8 GB) with `noyau_post_D20.json` written (156 M residues, 1.77 GB on disk).
- F16 starts and loads `noyau_post_D20.json`. An initial fix used **stream load** (ijson) with `--modulo 9` so only residues with `r % 9 == 0` are kept (~17 M residues). That still allocates a single list of ~17 M Python integers (on the order of several GB), so **OOM can still occur** on a 16 GB machine when combined with the rest of the process and Cursor.
- A second fix uses **chunked stream load**: the noyau is streamed in chunks (e.g. 1.5 M residues per chunk); each chunk is passed to `build_fusion_clauses()` and only the output rows are accumulated. No single list of all filtered residues is ever built, so peak RSS stays bounded.
4. **Why Cursor crashes**: Cursor and the pipeline share the same machine RAM. When the pipelines memory spikes during F16 load, either the Python process is killed (and Cursor stays up but the run “crashes”) or the system is so starved that the OOM killer also kills Cursor, or the machine becomes unresponsive and Cursor appears to crash.
## Corrective actions
- **Run the extended pipeline outside Cursor**: Use a standalone terminal (or SSH session, or `nohup` in a separate terminal) so Cursor is not in the same memory space. Example:
- From a separate terminal: `cd /home/ncantu/code/algo/applications/collatz && ./scripts/08-paliers-finale.sh`
- Or: `nohup ./scripts/08-paliers-finale.sh > out/run.log 2>&1 &`
- **Ensure enough free RAM** before F16 (e.g. 20+ GB free, or close other heavy apps) if running on the same machine as Cursor.
- **Resume from D20** if D18D20 are already done: `RESUME_FROM=D20 ./scripts/08-paliers-finale.sh` still loads `noyau_post_F15` then runs D20, then F16. To skip straight to F16 you would need a new option (e.g. `RESUME_FROM=F16`) and `noyau_post_D20` already present; currently not implemented.
## Impact
- D18, D19, F15, D20 complete successfully; artefacts are in `out/noyaux/` and `out/candidats/`.
- F16 and D21 never run; Cursor can crash when the pipeline is started from inside Cursor on a RAM-limited machine.
## Analysis modalities
- Inspect last lines: `tail -30 out/pipeline_extend.log`.
- Check for OOM in kernel logs: `dmesg | grep -i out.of.memory` or `journalctl -k -b | grep -i oom` (if available).
- Monitor RSS during run: `watch -n 5 'ps -o rss= -p $(pgrep -f "collatz_k_pipeline")'` (RSS in KB).
## Deployment
Run the script outside the Cursor process so that memory pressure does not kill Cursor. Code fix (two steps):
1. **Stream load (already in place)**
When the noyau file is >500 MB and `--modulo` is set, the fusion pipeline uses `ijson` to stream-parse the JSON and keep only residues with `r % modulo == 0`, instead of loading the full file with `json.loads()`. Install: `pip3 install -r collatz_k_scripts/requirements.txt`.
2. **Chunked processing (added after OOM persisted)**
For noyau files >500 MB with modulo set, the pipeline no longer builds a single list of all filtered residues. It uses `_stream_load_noyau_modulo_chunked()` to yield chunks (default 800k residues). For each chunk it runs `build_fusion_clauses()`, then appends the rows to the output CSV. Peak memory stays bounded by one chunk plus the audit state maps and the merged rows. F16 with `noyau_post_D20.json` (~1.7 GB, modulo 9) now completes and writes the fusion CSV.
3. **run_update_noyau stream path (post-F16 OOM)**
After F16, the pipeline calls `run_update_noyau(cert_f16, noyau_post_D20, noyau_post_F16)`. That step was loading the full `noyau_post_D20.json` (1.7 GB, 156 M residues) with `read_text()` + `json.loads()`, causing OOM. For previous-noyau files >500 MB, `run_update_noyau` now uses `_get_palier_from_tail()` (read last 128 bytes to get palier) and `_stream_update_noyau()`: stream-parse the noyau with ijson, keep only residues not in the covered set (from the cert), and stream-write the new noyau JSON. No full noyau list is ever materialized.
4. **run_single_palier stream path (D21 OOM)**
D21 loads `noyau_post_F16.json` (~1.7 GB, ~156 M residues). Loading it fully in `run_single_palier` caused OOM. For input noyau files >500 MB, `run_single_palier` now uses `_run_single_palier_stream`: (1) stream pass to compute max_r and count; (2) stream pass to build cand and cover sets; (3) write CSV from cand; (4) stream pass to write residual noyau (only cover set in memory, residual written incrementally). No full residue list or full residual list is materialized.

View File

@ -5,7 +5,7 @@ Objectif: Le livre enfant (9-12 ans) : L'Expérience Sensible
Approche: Une narration imaginaire et poétique.
Concept: La théorie est ici "vécue". Le chaos est représenté par une forêt "floue" où les arbres hésitent et où le sol vibre.
Message: L'enfant comprend l'importance de la stabilité et de la règle (le "bit" ou la "racine") non pas comme une contrainte ennuyeuse, mais comme ce qui permet au monde de tenir debout et d'avoir un sens. Initiation à l'ontologie par l'aventure.
Version: v0.20
Version: v0.21
Auteur: Nicolas Cantu
---
@ -42,7 +42,7 @@ Son pied buta contre quelque chose de ferme. Il saccroupit et posa la main de
Barnabé décolla une ventouse et la posa un peu plus loin, puis encore une autre, laissant de petits cercles humides marqués sur lécorce sombre. Éon les observa attentivement : les marques demeuraient en place. Il posa sa main à côté et appuya fort ; en la retirant, il vit lempreinte de sa paume dans la poussière qui persistait elle aussi. Il suivit des yeux la ligne des ventouses, puis posa son pied sur la première marque. Le sol tint. Avec la pointe d'un caillou, il grava au bord de la racine quatre marques très courtes : trois alignées, une légèrement décalée. Barnabé posa une ventouse sur la première, puis tapota son poignet une fois. Éon rangea le caillou et effleura les quatre marques du doigt avant de repartir.
Il déplaça son pied le long de la racine, exactement là où Barnabé avait posé ses ventouses, et le sol répondit avec la même fermeté. Peu à peu, son souffle se régularisa. Son regard se fixa sur la ligne sombre du bois qui traversait la clairière. Tant quil suivait cette direction précise, lespace cessait de se disperser. Le Flou restait autour de lui, mouvant, mais la racine traçait un axe. Éon détourna un instant l'attention ; la vibration grise tenta de revenir. Il reprit la pression des doigts et elle recula. Une fois, Éon laissa un doigt traîner un peu trop longtemps dans la zone vibrante, juste pour sentir. Barnabé ne le rappela pas à l'ordre ; il tapota un rythme bref sur son poignet. Ils reprirent aussitôt le contact avec la racine. Une autre fois, Barnabé décolla deux ventouses pour tendre un bras vers une branche ; la pression baissa. Dès que les ventouses se refixèrent sur la racine, la stabilité revint.
Il déplaça son pied le long de la racine, exactement là où Barnabé avait posé ses ventouses, et le sol répondit avec la même fermeté. Peu à peu, son souffle se régularisa. Son regard se fixa sur la ligne sombre du bois qui traversait la clairière. Tant quil suivait cette direction précise, lespace cessait de se disperser. Le Flou restait autour de lui, mouvant, mais la racine traçait un axe. Éon détourna un instant son attention ; la vibration grise tenta de revenir. Il reprit la pression des doigts et elle recula. Une fois, Éon laissa un doigt traîner un peu trop longtemps dans la zone vibrante. Barnabé ne le rappela pas à l'ordre ; il tapota un rythme bref sur son poignet. Ils reprirent aussitôt le contact avec la racine. Une autre fois, Barnabé décolla deux ventouses pour tendre un bras vers une branche ; la pression baissa. Dès que les ventouses se refixèrent sur la racine, la stabilité revint.
Barnabé frappa légèrement son poignet et Éon avança dun pas supplémentaire. Il cligna de lœil droit, une fois. Ses doigts restaient sur la portion solide, ses yeux sur les marques laissées derrière lui. À chaque appui, le monde gagnait en netteté. Son souffle s'allongea. La progression était lente, attentive, mais continue. Quand il leva les yeux, les arbres avaient retrouvé des contours stables et le sol formait à nouveau un chemin identifiable. Sa main resta sur la racine encore un instant, puis il relâcha doucement et avança en laissant derrière lui une suite de traces régulières. Il posa le pied sur une marque, puis une autre ; le sol tint à chaque fois. Barnabé se recolla à son poignet, sa respiration accordée à celle dÉon.
@ -59,13 +59,13 @@ Il atteignit une bifurcation plus large où trois sillons partaient dans des dir
Il jeta un regard en arrière vers les deux autres sillons, toujours là, ouverts. Son pas glissa légèrement quand il tenta de revenir en arrière ; le sillon le ramena à sa trajectoire. Le sillon tenait son pas, et les deux autres sillons restaient derrière lui.
Les sphères hésitaient aux bifurcations, puis choisissaient une voie. Les sillons se multipliaient sous ses pieds, se croisant, se rejoignant. Il avançait plus vite sans réfléchir à chaque pas. Il s'arrêta pourtant dans un petit espace entre deux lignes, là où la terre était encore mate. Il posa un caillou au sol, juste devant lui, puis fit glisser la pointe sur la terre, toujours au même endroit. La première trace fut mince ; un souffle passa entre les troncs et la recouvrit presque aussitôt de poussière et de feuilles. Il allait abandonner quand Barnabé tapota son poignet une fois, deux fois, trois fois. Alors Éon recommença, trois fois aussi, en répétant le même geste. À la troisième, la trace devint plus nette. Une peau de verre très fine apparut juste sous la surface. Éon recula dun pas, surpris. Barnabé posa une ventouse sur ce nouveau trait et glissa dessus ; le mouvement était plus simple, plus sûr. Un petit chemin clair apparut, assez solide pour guider un pas. Il y posa le pied. La terre alentour devint grisâtre et froide. Le sillon resta net sous sa semelle. En franchissant le nouveau sillon, Éon cligna de l'œil droit. Barnabé posa une ventouse sur sa paume, puis une autre, en rythme. Barnabé tapota son poignet une fois et Éon poursuivit, attentif à la manière dont le sol guidait son pas.
Les sphères hésitaient aux bifurcations, puis choisissaient une voie. Les sillons se multipliaient sous ses pieds, se croisant, se rejoignant. Il avançait plus vite sans réfléchir à chaque pas. Il s'arrêta pourtant dans un petit espace entre deux lignes, là où la terre était encore mate. Il posa un caillou au sol, juste devant lui, puis fit glisser la pointe sur la terre, toujours au même endroit. La première trace fut mince ; un souffle passa entre les troncs et la recouvrit presque aussitôt de poussière et de feuilles. Il allait abandonner quand Barnabé tapota son poignet une fois, deux fois, trois fois. Alors Éon recommença, trois fois aussi, en répétant le même geste. À la troisième, la trace devint plus nette. Une peau de verre très fine apparut juste sous la surface. Éon recula dun pas, surpris. Barnabé posa une ventouse sur ce nouveau trait et glissa dessus ; le mouvement était plus simple, plus sûr. Un petit chemin clair apparut, assez solide pour guider un pas. Il y posa le pied. La terre alentour devint grisâtre et froide. Le sillon resta net sous sa semelle. En franchissant le nouveau sillon, Éon cligna de l'œil droit. Barnabé posa une ventouse sur sa paume, puis une autre, en rythme. Barnabé battit une fois sur son poignet et Éon poursuivit, attentif à la manière dont le sol guidait son pas.
## Chapitre 3 : La boue se souvient
La ligne de verre senfonça peu à peu dans le sol jusquà disparaître sous une couche plus sombre. Éon ralentit. La terre devenait molle sous ses semelles et à chaque pas, son pied senfonçait légèrement. Barnabé descendit le long de sa manche et posa un bras dans la boue ; ses ventouses adhérèrent aussitôt et il avança avec assurance, laissant derrière lui une suite de petits cercles nets. Éon observa ses propres traces : ses chaussures imprimaient des formes irrégulières qui restaient visibles. Il recula d'un pas. Les marques dessinaient un chemin clair à travers la cuvette ; il le suivit.
Un bruit sourd résonna sur la gauche. Éon tourna la tête et vit une silhouette massive qui avançait lentement. Chaque fois quelle posait le pied, la boue se creusait profondément sous son poids. Lempreinte restait marquée, large et précise, et après quelques pas, un passage se dessinait derrière elle. Éon sapprocha prudemment. Le sol, là où la grande trace avait été laissée, offrait un appui plus stable, la boue semblant avoir accepté la forme du pied. Il posa sa propre semelle dans lempreinte encore fraîche ; son pied trouva immédiatement un soutien plus ferme que dans la zone intacte et il avança ainsi, de marque en marque.
Un bruit sourd résonna sur la gauche. Éon tourna la tête et vit une silhouette massive qui avançait lentement. Chaque fois quelle posait le pied, la boue se creusait profondément sous son poids. Lempreinte restait marquée, large et précise, et après quelques pas, un passage se dessinait derrière elle. Éon sapprocha prudemment. Le sol, là où la grande trace avait été laissée, offrait un appui plus stable, la boue ayant gardé la forme du pied. Il posa sa propre semelle dans lempreinte encore fraîche ; son pied trouva immédiatement un soutien plus ferme que dans la zone intacte et il avança ainsi, de marque en marque.
Barnabé s'arrêta au bord d'une empreinte et posa plusieurs ventouses côte à côte. Puis il fit glisser une ventouse dans la boue, traçant un court sillon avant de revenir se coller au poignet. Comme un dessin. Éon étouffa un rire. Barnabé insista légèrement, puis se déplaça plus loin, laissant les petites marques visibles au bord du grand creux. Éon s'accroupit à son tour. Il choisit un point dégagé et appuya fortement sa main dans la boue. Lorsquil la retira, la forme de ses doigts restait imprimée. Il posa ensuite son pied juste à côté, puis lautre un peu plus loin, en cherchant à aligner ses pas. Il refit le trajet trois fois. À la troisième, son pied s'enfonça moins.
@ -97,7 +97,7 @@ La silhouette leva la tête, sans interrompre son geste.
Éon regarda autour de lui. Certaines zones étaient saturées de marques croisées, les pas se chevauchant au point de rendre la direction difficile à lire. Barnabé se crispa davantage, ses ventouses glissant sur le tissu. Éon posa le pied sur une ancienne trace encore intacte qui seffondra légèrement sous son poids. La petite silhouette rouge passa près de lui et frotta la zone affaiblie ; la boue se redistribua, plus compacte.
— Quand une trace ne sert plus, elle gêne les suivantes, dit-elle.
Éon observa une partie du sol qu'il venait de traverser où ses propres empreintes étaient encore visibles. Lune des silhouettes sen approcha et commença à les lisser. Il regarda la silhouette rouge frotter sa trace. Un sourire lui vint. Il ne le fit pas, mais l'idée l'amusa. Barnabé prit une texture différente. Puis la silhouette s'arrêta et pointa son outil vers eux. Barnabé frappa deux fois, inquiet.
Éon observa une partie du sol qu'il venait de traverser où ses propres empreintes étaient encore visibles. Lune des silhouettes sen approcha et commença à les lisser. Il regarda la silhouette rouge frotter sa trace. Un sourire lui vint, qu'il retint. Barnabé prit une texture différente. Puis la silhouette s'arrêta et pointa son outil vers eux. Barnabé frappa deux fois, inquiet.
— Attends.
La silhouette suspendit son geste.
— Tu en as encore besoin ?
@ -133,7 +133,7 @@ Il observa de nouveau les formes souples de la clairière : chacune se modifiait
Éon essaya à son tour. Il parcourut plusieurs fois le même trajet, en revenant exactement sur ses pas. À la troisième, la surface se consolidait et répondait plus nettement. Barnabé laissa une suite de petites marques sur la zone déjà poudrée.
Il observa autour de lui et repéra un ancien chemin qui traversait la zone en ligne courbe. Les silhouettes lentes y circulaient régulièrement et la surface y était plus dense, presque lisse sous la fine couche dorée. Ses pas y trouvaient un appui fiable, sans hésitation. Il accéléra. Barnabé saccrocha, ses ventouses claquant légèrement sur le tissu à chaque foulée. La poussière volait sous ses semelles. Il courut sur plusieurs mètres avant de ralentir, le souffle court, le cœur battant. En quittant ce passage pour explorer une zone moins fréquentée, le sol se fit plus accidenté sous ses semelles. Il parcourut plusieurs fois une nouvelle trajectoire pour la renforcer. La poussière laissée par les grandes silhouettes sajoutait progressivement à ses propres traces.
Il observa autour de lui et repéra un ancien chemin qui traversait la zone en ligne courbe. Les silhouettes lentes y circulaient régulièrement et la surface y était plus dense, presque lisse sous la fine couche dorée. Ses pas y trouvaient un appui fiable, sans hésitation. Il accéléra. Barnabé saccrocha, ses ventouses claquant légèrement sur le tissu à chaque foulée. La poussière volait sous ses semelles. Il courut sur plusieurs mètres avant de ralentir, le souffle court, le cœur battant. Quand il quitta ce passage pour explorer une zone moins fréquentée, le sol se fit plus accidenté sous ses semelles. Il parcourut plusieurs fois une nouvelle trajectoire pour la renforcer. La poussière laissée par les grandes silhouettes sajoutait progressivement à ses propres traces.
Éon sarrêta un instant et regarda derrière lui. Les premières marques de son passage étaient déjà partiellement intégrées dans la surface ; elles faisaient désormais partie du sol. Barnabé se recolla à son poignet avec une adhérence stable. Le bois devant lui souvrait sur une zone plus vaste, où les couches accumulées dessinaient des passages anciens. Il sy engagea avec assurance.
@ -143,13 +143,13 @@ Le chemin renforcé par la poussière dorée conduisit Éon vers une zone plus o
Éon fit quelques pas. Lorsqu'il suivait lorientation de la poussée, son corps avançait plus facilement ; en changeant daxe, la résistance augmentait et sa marche devenait plus lente. Il choisit un point précis entre deux pierres et tenta de latteindre en ligne droite. Très vite, ses jambes se mirent à peser et Barnabé serra davantage sa prise. Éon modifia légèrement sa trajectoire pour saligner avec la direction suggérée par la pression de lair et la progression devint plus fluide. Il atteignit son objectif en décrivant une courbe légère.
Autour de lui, de fines particules de poussière se déplaçaient en suivant les mêmes orientations, formant des trajectoires visibles quelques instants avant de se disperser. Il repéra une pierre plate légèrement inclinée. En montant dessus, la poussée l'entraîna vers le versant opposé. Il se laissa guider et descendit sans effort, Barnabé relâchant progressivement sa tension.
Autour de lui, de fines particules de poussière se déplaçaient en suivant les mêmes orientations, formant des trajectoires visibles quelques instants avant de se disperser. Il repéra une pierre plate légèrement inclinée. Quand il monta dessus, la poussée l'entraîna vers le versant opposé. Il se laissa guider et descendit sans effort, Barnabé relâchant progressivement sa tension.
En poursuivant sa marche, Éon commença à anticiper les inclinaisons invisibles. Il ajustait son pas avant même de ressentir la fatigue, son pas trouvant les trajectoires favorables. À un moment, il choisit délibérément de remonter contre la direction dominante. Lair lui frappa le visage. Il plissa les yeux, serra les dents. Chaque pas coûtait. Barnabé se plaqua contre sa manche, tout son corps tendu. La progression demanda une concentration accrue, ses appuis devaient être plus précis. Il sarrêta pour reprendre son souffle et observa les chemins déjà parcourus : les courbes quil avait suivies formaient un dessin cohérent avec les déplacements des particules dans lair. Il avança en tenant compte de cette organisation. Lorsque la pente sinfléchissait, il sadaptait immédiatement et son mouvement devenait plus économique. Barnabé frappa légèrement son poignet. En quittant la zone rocheuse, son pas suivait déjà les courbes favorables. Le bois sépaississait à nouveau devant lui, prêt à lui proposer une nouvelle épreuve.
En poursuivant sa marche, Éon commença à anticiper les inclinaisons invisibles. Il ajustait son pas avant même de ressentir la fatigue, ses pieds trouvant d'eux-mêmes les trajectoires favorables. À un moment, il choisit délibérément de remonter contre la direction dominante. Lair lui frappa le visage. Il plissa les yeux, serra les dents. Chaque pas coûtait. Barnabé se plaqua contre sa manche, tout son corps tendu. La progression demanda une concentration accrue, ses appuis devaient être plus précis. Il sarrêta pour reprendre son souffle et observa les chemins déjà parcourus : les courbes quil avait suivies formaient un dessin cohérent avec les déplacements des particules dans lair. Il avança en tenant compte de cette organisation. Lorsque la pente sinfléchissait, il sadaptait immédiatement et son mouvement devenait plus économique. Barnabé frappa légèrement son poignet. Quand il quitta la zone rocheuse, son pas suivait déjà les courbes favorables. Le bois sépaississait à nouveau devant lui, prêt à lui proposer une nouvelle épreuve.
## Chapitre 9 : La terre hésite
Il pénétra dans la zone suivante. Le sol changea encore sous ses pas. Sous ses pas, la surface variait dun point à lautre : par endroits, elle soutenait son poids avec assurance ; quelques pas plus loin, elle cédait légèrement. Il ralentit. Barnabé descendit jusqu'à sa cheville et posa un bras sur la terre devant lui. Ses ventouses s'y appliquèrent quelques secondes, puis se retirèrent. Il répéta le geste un peu plus loin. Éon attendit que Barnabé ait testé avant de poser le pied.
Il pénétra dans la zone suivante. Le sol changea encore sous ses pas. La surface variait dun point à lautre : par endroits, elle soutenait son poids avec assurance ; quelques pas plus loin, elle cédait légèrement. Il ralentit. Barnabé descendit jusqu'à sa cheville et posa un bras sur la terre devant lui. Ses ventouses s'y appliquèrent quelques secondes, puis se retirèrent. Il répéta le geste un peu plus loin. Éon attendit que Barnabé ait testé avant de poser le pied.
Il posa son pied là où Barnabé avait maintenu sa prise le plus longtemps. La surface résista. Après avoir transféré son poids avec prudence, le sol tint. Un peu plus loin, Barnabé avait tenu trois secondes sur une plaque plus claire ; Éon s'y engagea en confiance. La terre céda d'un coup. Il s'enfonça jusqu'à la cuisse et resta coincé. Barnabé avait bondi vers une plaque solide à quelques pas. Éon tendit le bras ; trop loin. Son cœur cogna. Il appela. Barnabé revint en glissant sur la terre molle, posa une ventouse sur le bord du trou, puis une autre, et tendit deux bras. Éon s'agrippa. La traction fut lente ; la terre résistait. Quand il sortit enfin, il resta assis un moment, le souffle court. Barnabé se recolla à son poignet sans tapoter. Éon observa la zone autour de lui. Des plaques plus claires apparaissaient ici et là ; certaines parties du sol semblaient renforcées.
@ -222,15 +222,15 @@ Les fils pouvaient bouger, mais le croisement devait tenir. Éon posa la main pr
Éon regarda autour de lui. Les fils formaient des chemins suspendus entre les arbres. Certains rejoignaient des zones déjà traversées : la colline, la cuvette, la clairière circulaire. Barnabé retira une ventouse et la reposa plus fermement. Éon prit le fil entre deux doigts et le tira légèrement dans laxe du nœud. La résistance augmenta, puis se stabilisa. La vibration devint plus uniforme. Il répéta le geste sur un second croisement plus loin, avec davantage dassurance. Chaque ajustement modifiait léquilibre général.
En avançant sous la voûte de fils, les vibrations se répartissaient sans bloquer le passage. Les fils vibraient partout. Aux croisements, ça tenait. À un moment, il remarqua un croisement presque défait où les fils glissaient les uns contre les autres sans point fixe, rendant la vibration confuse. Il hésita, puis posa ses deux mains autour du croisement et resserra lentement lassemblage en suivant la direction des fils. La tension se répartit immédiatement et le réseau retrouva une cohérence perceptible. Barnabé frappa légèrement son poignet. Éon resta quelques instants sous la voûte, à écouter la vibration générale. En quittant la zone, le bois s'ouvrait plus loin vers une silhouette plus massive, comme une limite construite. Éon s'y dirigea.
À mesure qu'il avançait sous la voûte de fils, les vibrations se répartissaient sans bloquer le passage. Les fils vibraient partout. Aux croisements, ça tenait. À un moment, il remarqua un croisement presque défait où les fils glissaient les uns contre les autres sans point fixe, rendant la vibration confuse. Il hésita, puis posa ses deux mains autour du croisement et resserra lentement lassemblage en suivant la direction des fils. La tension se répartit immédiatement et le réseau retrouva une cohérence perceptible. Barnabé frappa légèrement son poignet. Éon resta quelques instants sous la voûte, à écouter la vibration générale. Quand il quitta la zone, le bois s'ouvrait plus loin vers une silhouette plus massive, comme une limite construite. Éon s'y dirigea.
## Chapitre 13 bis : Le trône vide
Le réseau de fils le mena vers une zone où les arbres étaient plus grands et plus espacés. La lumière était plus régulière, et l'air y était plus calme. Éon avançait toujours dans la direction de la silhouette massive aperçue plus loin. Plusieurs chemins convergeaient vers un même point ; les fils les plus foulés formaient des tracés plus nets.
Au centre, une butte de terre sombre montait doucement. En l'escaladant, le sol était durci par des passages répétés. Des racines affleuraient partout, épaisses et tendues, se croisant et se recroisant avant de plonger à nouveau sous la surface. Elles formaient un tissage serré, et Éon retrouva la tension régulière quil avait apprise à sentir dans les nœuds.
Au centre, une butte de terre sombre montait doucement. Pendant qu'il l'escaladait, le sol était durci par des passages répétés. Des racines affleuraient partout, épaisses et tendues, se croisant et se recroisant avant de plonger à nouveau sous la surface. Elles formaient un tissage serré, et Éon retrouva la tension régulière des nœuds.
Au sommet, il trouva une forme creusée dans une racine géante, un creux lisse, poli par le frottement de milliers de pas et de corps. Le creux avait la taille d'un siège. En posant la main dessus, le creux resta presque immobile. Barnabé glissa sur la surface lisse et sy posa, immobile, ses ventouses adhérant sans effort.
Au sommet, il trouva une forme creusée dans une racine géante, un creux lisse, poli par le frottement de milliers de pas et de corps. Le creux avait la taille d'un siège. Quand Éon posa la main dessus, le creux resta presque immobile. Barnabé glissa sur la surface lisse et sy posa, immobile, ses ventouses adhérant sans effort.
Éon sarrêta pour regarder autour de lui. Des trajectoires passaient par ce sommet sans sy attarder : une petite sphère translucide roula jusquau creux, le contourna et repartit dans une direction précise ; une silhouette rouge traversa la zone en portant son outil, ralentit au niveau du croisement, puis reprit son rythme plus bas ; un animal gris traversa la racine en courant et disparut entre deux troncs. Tous passaient, personne ne s'arrêtait.
@ -275,13 +275,12 @@ Madame Martin fronça les sourcils.
— Quest-ce que tu fais ?
Éon se releva.
— Un point de départ, répondit-il.
Madame Martin observa les marques au sol. Elle ne dit rien pendant quelques secondes.
Madame Martin redressa les épaules.
Madame Martin observa les marques au sol. Elle ne dit rien pendant quelques secondes, puis redressa les épaules.
— Entre. Nous en reparlerons après la classe.
Éon passa la grille et rejoignit les autres élèves. Dans la cour, les voix se croisaient. Les appels et les rires montaient de partout. Barnabé serra une ventouse, puis battit une fois. Éon se mit en mouvement sans courir. Il suivit une ligne blanche peinte au sol jusqu'à la porte.
Dans la salle, les chaises grinçaient et les trousses claquaient. Madame Martin écrivit la consigne au tableau, puis ajouta deux phrases et une question. Les mots sempilaient. Éon ouvrit son cahier. La page blanche. La consigne trop longue. Les regards des autres, déjà penchés sur leur feuille. Il posa son crayon au début de la première ligne… puis hésita. Son regard allait de la consigne à sa page, puis revenait. La consigne, la page, les mots se brouillaient. Barnabé posa deux ventouses sous la manche. Puis il tapota quatre fois, lentement, et replia un tentacule à l'écart des trois autres, imitant exactement le signe qu'Éon venait de tracer.
Dans la salle, les chaises grinçaient et les trousses claquaient. Madame Martin écrivit la consigne au tableau, puis ajouta deux phrases et une question. Les mots sempilaient. Éon ouvrit son cahier. La page blanche. La consigne trop longue. Les regards des autres, déjà penchés sur leur feuille. Il posa son crayon au début de la première ligne… puis hésita. Son regard allait de la consigne à sa page, puis revenait. La consigne, la page, les mots se brouillaient. Barnabé posa deux ventouses sous la manche. Puis il frappa quatre fois, lentement, et replia un tentacule à l'écart des trois autres, imitant exactement le signe qu'Éon venait de tracer.
Éon prit le caillou quil avait gardé dans sa poche et reproduisit, dans la marge, le même signe que dehors : trois petites marques alignées et une légèrement décalée. Sur le trottoir, les marques avaient tenu dans la poussière. Sur la page, elles tenaient dans le papier. Il écrivit KRUOIN en haut de la page, lettre après lettre, et le mot ne bougea plus. Puis, à côté du signe, il ajouta quatre mots très courts.