> ## Documentation Index
> Fetch the complete documentation index at: https://docs.oximail.ch/llms.txt
> Use this file to discover all available pages before exploring further.

# Journal des versions

> Le modèle de publication et les changements notables de la ligne actuelle, avec des renvois vers les pages qui documentent chaque domaine en profondeur.

OxiMail évolue comme une ligne continue : la version actuelle est la **v0.30.0**, et la ligne reçoit des lots fonctionnels et de durcissement en continu. Une mise à jour est un remplacement de binaire : les migrations de schéma s'appliquent d'elles-mêmes au démarrage, transactionnellement, sans étape manuelle ([exploitation](../operator/operations)). Le journal complet, changement par changement, est tenu dans le dépôt du serveur et accompagnera son ouverture publique ; cette page résume ce qui a atterri sur la ligne actuelle, du plus récent au plus ancien.

## Ligne actuelle : v0.30 (2026)

**Mi-août**

* **Meet, première forme qui fonctionne** : les appels en temps réel gagnent une surface serveur, à savoir une session ancrée sur un salon de discussion, dont la création atteint tous les membres du salon pour qu'un appelé apprenne l'appel sans type de notification dédié, plus un relais transitoire pour la poignée de main WebRTC, jamais persistée ni journalisée. La phase 1 est en pair-à-pair jusqu'à trois participants actifs, et l'adhésion est un bail de présence à expiration automatique plutôt qu'un drapeau ([Meet](../developer/jmap-meet)).
* **`Email/get` gagne son arbre** : `bodyStructure` est émis et récursif, `fetchAllBodyValues` atteint enfin toutes les feuilles `text/*` (la partie `text/calendar` d'une invitation comprise), et les pièces jointes portent `partId`, `charset` et `disposition`. Les en-têtes par partie sont servis sous `bodyProperties`, seul chemin conforme vers les paramètres de Content-Type qui distinguent une invitation d'un `.ics` joint. **Changement de contrat** : sans argument `fetch*BodyValues`, `bodyValues` revient désormais vide comme l'exige la RFC 8621 §4.2, alors qu'il était rempli inconditionnellement ([l'arbre du corps](../developer/jmap-mail#arbre-du-corps-et-valeurs-de-corps)).
* **Chaque `/get` ferme son vocabulaire, et le canon est publié** : un nom de propriété inconnu devient un `invalidArguments` qui nomme les fautifs au lieu d'un mot ignoré en silence, et ce qui est sélectionnable, comme ce qui est calculé par appelant, est désormais émis en forme machine à côté des types générés ([le canon de projection](../developer/jmap-v2#le-canon-de-projection)).
* **Les boîtes partagées se lisent et s'écrivent correctement** : la clé de déchiffrement suit le compte effectif et non l'appelant, si bien que les corps d'une boîte partagée s'ouvrent ; et un message classé par un bénéficiaire est chiffré pour le propriétaire, ce qui referme le miroir du même défaut ([chiffrement au repos](../operator/encryption-at-rest)).
* **`Thread/get` et `Thread/changes` reviennent aux clients RFC 8621 purs**, servis sous la capacité `mail` là où le §3 les place ; un client ne déclarant que `core` + `mail` s'entendait répondre `unknownCapability` sur une méthode obligatoire ([courrier](../developer/jmap-mail#comportements-à-connaître)).
* **Les annuaires de contacts de tenant** : une organisation peut publier des jeux de contacts partagés qui atteignent les membres en fiches lisibles seulement dans leur propre carnet, avec des entrées tenues par des principaux et des groupes nommés ([contacts](../developer/jmap-contacts#les-annuaires-de-tenant), ADR-133).
* **L'échange de clés post-quantique est réellement négocié** : X25519MLKEM768 est proposé en tête, avec le X25519 classique en repli, sur 25, 465, 587, 993 et 443. La fonctionnalité était compilée depuis des mois alors que le fournisseur installé ne pouvait pas l'implémenter : chaque session retombait en silence ([TLS & ACME](../operator/tls-acme#échange-de-clés-post-quantique)).
* **Deux ans de chiffrement amont rattrapés** : SQLCipher passe de 4.5.7 à **4.14.0** et SQLite de 3.45.3 à 3.51.3, vérifiés en exécutant `PRAGMA cipher_version` plutôt qu'en lisant un manifeste, car les correctifs du moteur n'atteignent une base chiffrée que par une publication SQLCipher. Le binaire livré est désormais contrôlé au déploiement pour ne dépendre d'aucune bibliothèque de cryptographie, TLS ou SQLite du système ([chiffrement au repos](../operator/encryption-at-rest)).
* **Les journaux de poignée de main cessent de crier au loup** : les quatre écouteurs TLS séparent un pair qui a raccroché avant de négocier d'un vrai échec de négociation, chaque branche portant un champ `reason` stable. Une instance de production émettait 480 avertissements inoffensifs par jour pour une seule sonde de supervision, et un vrai échec s'y serait caché ([exploitation](../operator/operations#les-journaux-de-poignée-de-main-tls)).
* **`dkim=fail` dit pourquoi** : le motif d'échec atteint l'en-tête `Authentication-Results` et le résultat conservé par message, si bien qu'une analyse après coup sépare une signature invalide d'un corps modifié en transit, d'une clé absente, ou d'une signature datée dans le futur, ce qui signifie que l'horloge du serveur retarde ([authentification du courrier](../operator/email-auth-security#dkim)).
* **Exploitation** : `oximail sql` route sur la forme du statement, si bien qu'un `WITH ... SELECT` retourne des lignes au lieu de rapporter « 0 rows affected » ; `blobs gc` ne collecte plus un blob non référencé plus jeune qu'une fenêtre de grâce de 24 heures (RFC 8620 §6.1) ; les instantanés locaux de retour arrière ont gagné une politique de rétention que le déploiement applique ; `doctor` juge la santé de l'horloge ; et des limites seulement annoncées sont devenues des limites qu'un mécanisme applique ([CLI](../operator/cli#deux-comportements-des-verbes-de-maintenance), [exploitation](../operator/operations#les-mises-à-jour)).
* **Fuseaux horaires** : le fuseau par défaut d'un tenant est lisible, hérité et surveillé, et un fuseau fourni au provisioning atteint désormais le principal. Un fuseau invalide est refusé avant la première écriture au lieu d'être accepté puis ignoré.

**Fin juillet et début août**

* **La fédération, première forme qui fonctionne** : la [cérémonie d'appairage](../developer/jmap-sharing) bilatérale hors bande (empreinte sur le realm et la clé, clé de nœud par organisation), une racine d'identité portable distincte de la clé de travail jetable qui vit sur la machine (la rotation vaut révocation, par époque monotone), et le modèle de grant inter-organisation : borné au realm, écrit par le propriétaire, à expiration automatique, et qui n'élargit que l'axe d'accès. Révoquer un appairage *suspend* l'accès au lieu de détruire l'enregistrement ; les notices d'effacement sont estampillées sur l'ancre d'identité et échouent fermé à la livraison (ADR-124 à ADR-127).
* **Les accusés de lecture, sur les deux surfaces.** Le courrier gagne la [surface MDN de la RFC 9007](../developer/jmap-mail#les-accusés-de-lecture-mdn) : `MDN/send` compose un accusé comme geste explicite de l'utilisateur, `MDN/parse` rend enfin lisibles les accusés entrants déjà rattachés à vos messages envoyés. Les accusés de lecture du chat atteignent désormais en direct chaque membre d'un groupe ou d'un canal, et non plus le seul pair d'une conversation directe, avec un interrupteur de visibilité par canal et un plafond de taille de salon sur la diffusion en direct ([chat](../developer/jmap-chat#les-accusés-de-lecture)).
* **L'historique de versions du drive sur le fil** : `FileVersion/query`, `get` et `restore`, avec `maxVersionsPerNode` annoncé et l'élagage piloté par la même constante ([fichiers](../developer/jmap-files#lhistorique-de-versions)).
* **L'honnêteté de la synchronisation** : un curseur `Foo/changes` plus ancien que la fenêtre de rejeu de 90 jours est maintenant **refusé** avec `cannotCalculateChanges`, au lieu de s'entendre dire qu'il est à jour. C'est un seul point de passage au niveau du stockage dont tous les consommateurs héritent, `sync-collection` de DAV compris. `/changes` réduit aussi à une seule issue par identifiant, conformément à la RFC 8620 §5.2, et un lot `/set` vide ne saute plus sa vérification d'`ifInState` ([JMAP Core](../developer/jmap-core#la-fenêtre-de-rejeu-et-les-deltas-refusés)).
* **Les identifiants de streaming** : les flux SSE s'ouvrent avec un [ticket éphémère](../developer/jmap-core#le-ticket-éphémère-de-streaming) de 60 secondes au lieu du token de session, pour qu'un identifiant valable 24 heures ne circule plus dans une URL que les proxies journalisent.
* **Les formes de fil corrigées là où elles laissaient filtrer le stockage** : les aperçus de liens du chat sont des objets typés et non plus un tableau d'octets bruts ; une partie `message/rfc822` est annoncée comme la pièce jointe qu'elle est, au lieu de publier au premier niveau les pièces jointes du message encapsulé ; quatre internes de stockage de l'agenda ont quitté le fil.
* **IMAP** : `FETCH RFC822`, `RFC822.HEADER` et `RFC822.TEXT` ne renvoyaient aucune charge utile, et `RFC822` marquait quand même le message `\Seen`. Les deux sont corrigés ([protocoles historiques](../operator/legacy-protocols)).
* **L'intégrité de la rétention et des sauvegardes** : la sauvegarde par organisation n'omet plus en silence les blobs de pièces jointes ni les lignes des tables absentes d'une liste tenue à la main, et `verify-backup` peut voir la différence ; la corbeille vers laquelle balaient les messages qui expirent a enfin une politique de rétention derrière elle ; les blobs de parties de corps sont devenus le cache dérivé qu'ADR-098 décrivait depuis toujours, re-dérivé et vérifié par empreinte lors d'un échec de téléchargement ([exploitation](../operator/operations)).
* **L'exploitabilité** : onze tâches de ménage au démarrage ne se marchent plus dessus en `sqlite busy` avec un tick perdu à chaque boot ; `doctor` a cessé de présenter toute la file de remise comme en attente ; un verbe `spam check` en lecture seule demande au filtre son opinion actuelle sur un message stocké ; les DSN et ARF entrants lèvent désormais des événements de rebond et de plainte sur le chemin d'ingestion.
* **Les portées des mots de passe d'application sont appliquées** de bout en bout : la portée voyage avec le token et survit au renouvellement, une seule matrice de capacités décide, et l'accès aux protocoles se déduit de l'ensemble des capacités, appliqué au dispatch JMAP, à la connexion IMAP et à DAV (ADR-129).
* **Anti-spam** : le greylisting au moment du `RCPT` a été retiré comme défense. Les botnets réessaient, les pools d'adresses des gros expéditeurs cassent le triplet, et le mécanisme taxait les expéditeurs légitimes de premier contact. L'exigence d'authentification et le pipeline scoré portent cette charge (ADR-128, [anti-spam](../operator/anti-spam)).
* **Installation** : l'assistant a gagné un profil smarthost comme troisième entrée, consigné comme marqueur d'intention audité et non comme un rôle ([premier démarrage](../first-boot)).
* **Domaines d'enveloppe** : une plateforme qui envoie par le MSA peut utiliser un `MAIL FROM` technique sur un domaine prouvé par DNS, formes VERP comprises, pendant que l'en-tête `From:` reste l'identité humaine. Le domaine accordé doit partager son domaine organisationnel avec une identité du compte : l'alignement SPF sous DMARC relaxed tient donc par construction ([envois en nombre](../operator/bulk-sending)).

**Début juillet**

* **Conformité** : la [journalisation](../operator/compliance) du courrier par organisation (entrant/sortant, boîte ou archiveur externe), et l'effacement de compte reconstruit en [machine à phases](../operator/compliance) durable et reprenable, avec tampon de réversibilité, preuve DSAR (`oximail erasure prove`) et rétention appliquée du journal d'audit.
* **Performance** : une campagne de test de charge mesurée a environ **triplé le débit de lecture** (cache d'instructions préparées par connexion) et **doublé l'ingestion saturée** (index composite de fils) ; l'ingestion d'un message isolé a perdu son plancher de latence fixe (l'index de recherche valide au repos de la file) ; le WAL est borné et observable.
* **Justesse de la remise** : la visibilité de synchronisation incrémentale de l'ingestion est devenue atomique avec la ligne du message ; les règles du destinataire et l'absence s'exécutent désormais sur la remise locale (ADR-117) ; les sauts sortants font la médiation des extensions ESMTP (SMTPUTF8/8BITMIME/SIZE) au lieu de combler en silence ; DKIM sursigne From/To/Subject.
* **Vague d'interopérabilité clients** (vérifiée contre Apple Calendar, Thunderbird, eM Client, les invitations Outlook) : amorçage DAV à la racine, XML sûr en CDATA, ETag en empreinte de contenu, vrais filtres `calendar-query`, émission des VTIMEZONE, modélisation des VALARM, annonces IMAP `EXPUNGE` correctes, et un point d'accès de configuration eM Client.
* **Authentification** : [DPoP v2](../developer/jmap-core) : nonce serveur, preuves par requête, et le jeton média mono-blob.

**Mai et juin**

* **Relais smarthost sortant** (ADR-116) : comptes de relais aux domaines prouvés par DNS, enrôlement à usage unique, quotas de destinataires par jour avec montée en charge, rétention éphémère du relais, auto-surveillance DNSBL ([relais sortant](../operator/outbound-relay)).
* **Lot sécurité** : vérification des mots de passe d'application à travail constant, durcissement SSRF des récupérateurs de push et d'aperçus, dispatch des comptes partagés fermé par défaut, autorisation du `From:` d'en-tête à la soumission, hachage au repos des tokens.
* **Refonte du pipeline anti-spam** : époques et reconstruction du corpus Bayes, liste blanche des réponses sur enveloppe authentifiée seulement, colonne vertébrale de disposition ([anti-spam](../operator/anti-spam)).
* **Drive et collaboration** : drive raciné avec favoris par lecteur et vignettes serveur, comptabilité des liens de partage, chronologie de conversation, plafonds de capacité du chat et saisie limitée aux membres.
* **Balayage de conformité du fil** : la classe des « ignorés en silence » de `/query` éliminée (filtres, tris et arguments inconnus sont des erreurs), les capacités d'extension annoncées honnêtement dans `accountCapabilities`.

**Avril : v0.30.0**

La version de durcissement d'avant lancement : la discipline d'échec bruyant passée sur chaque surface, l'isolation par organisation dans la couche de stockage, le chiffrement au repos par défaut, le modèle SMTP à deux chemins, les passerelles historiques, et l'assistant d'installation tel que livré aujourd'hui.

Pour distinguer le réel du spécifié : chaque page de cette documentation énonce la version qu'elle décrit. Le site documente la **ligne v0.30.0 telle que déployée**, jamais du travail prévu présenté comme livré.
