v0.1.142
main
précédent la fusion du train — un commit où package.json déclare encore 0.1.140 et où cette
section n'existait pas. Le job verifier a refusé (tag v0.1.141 != package.json version) et
rien n'a été publié : ni npm, ni Release, ni attestation. La garde a fait exactement son
travail, sur la sortie même du dépôt.
Le tag ne peut pas être retiré — le ruleset des tags interdit leur suppression, ce que
docs/RELEASING.md annonçait déjà (« tag protection then makes awkward to withdraw »). Plutôt
que de désarmer cette protection pour contourner sa propre garde, ce train sort en 0.1.142 : le
tag mort cesse alors d'être le plus haut, et image-reconcile — qui exige que le plus haut tag ait
une image servie — redevient sain sans qu'on touche à rien. Le numéro sauté est le prix, et il est
écrit ici pour qu'aucun lecteur n'ait à deviner.
Security
⚠️ Dix étiquettes d'erreur que l'appelant choisissait, et rien ne les bornait.
route: String(body.action || "(sans action)"), écrit dix fois à l'identique dans trois fichiers
de routes.body.actionvient du corps de la requête, donc de n'importe qui muni d'un lien : un
mégaoctet de texte, des retours à la ligne, des guillemets, des octets de contrôle. Ça partait
ensuite dans le puits d'erreurs de l'hôte — Sentry, un journal ligne-par-ligne, un fichier —
dont ce paquet ne connaît ni le format ni les échappements.
⚠️ Ce qui est empêché n'est pas « une grosse chaîne », c'est la forgerie de structure : un
saut de ligne ouvre une entrée de journal qui n'a jamais eu lieu, un guillemet ouvre un champ dans
un puits qui concatène du JSON. Seuls les caractères dont une action est faite traversent
désormais, et la troncature se dit (…) plutôt que de se lire comme un nom véritable.
(sans action)et(action illisible)restent deux constats distincts. Aucune action légitime
n'est affectée. Rien à faire côté hôte.
Fixed
⚠️ docs/HOST-CONTRACT.mddemandait aux hôtes plus que ce dont la purge a besoin, et le geste
« évident » pour s'y conformer aurait été destructeur. La page disait « write it with the same
fingerprint the player computes, and nothing else » ; la seule propriété nécessaire est que le
hashde la ligne soit le nom de base de l'objet. Un hôte a rapporté le 27/08 un troisième
écrivain utilisantpreview-fr-v2là où le lecteur utilisev2: parfaitement sain, non conforme
sur le papier, et réaligner sa formule aurait orphelinné définitivement 908 objets — les fichiers
portent l'ANCIENNE empreinte dans leur nom. La page distingue désormais l'exigence (le balayage)
de l'option (partager un clip avec la route du lecteur), et nomme le banc qui tient la propriété.- Le tableau des verdicts de
schemaavait perdu sa cinquième valeur.indeterminevivait
depuis la 0.1.64 (18/08) en ligne de tableau avalée par le paragraphe précédent, faute d'une ligne
vide — donc rendue en prose, au milieu d'un avertissement sur un autre sujet. Un hôte qui parse ce
tableau y trouvait quatre valeurs pour cinq possibles. non-sondeetpartielportent maintenant leur piège dans leur cellule, comme le fait déjà
presenceDurcissementtrois lignes plus haut : la sonde est PARESSEUSE et locale au processus,
donc ces deux verdicts disent ce que ce processus a demandé jusqu'ici, jamais l'état du schéma.
Un hôte a relevé trois valeurs différentes en une journée sur une base inchangée et a failli
signaler une régression inexistante.⚠️ La sentinelle des exemples se réannonçait à chaque tour. L'issue #412 a reçu son corps puis
quatre commentaires identiques au caractère près en dix heures, pour zéro information nouvelle —
le mécanisme de fatigue d'alarme que l'en-tête depublication.ymlcondamne chez les autres.
Elle ne parle désormais que sur changement de FAIT (version servie ou état d'un exemple), via une
empreinte portée dans le corps de l'issue. Un aller-retour sur la même version reste un fait neuf.
⚠️ Et ce marqueur ne peut plus sortir de son commentaire : l'empreinte est bâtie sur des chemins
lus sur le disque, et un>les fermait en avance — auquel cas la forge aurait comparé à un
marqueur différent de celui publié, donc alarme répétée sans fin ou muette pour toujours. Relevé
par CodeQL sur le banc qui vérifiait la forme ; le défaut était sous l'assertion, pas dedans.
Added
ctx.has(name)est documentée, après avoir été mesurée : implémentée dans le contexte
autonome, appelée par aucune ligne deserver/, absente du contrat, et recopiée dans 57 fixtures
sur 45 fichiers. Un hôte l'implémentait correctement sans le savoir, parce que le type la
déclarait. Rien n'est câblé — la page dit ce qu'elle est, pour qu'une couture qui fonctionne
cesse d'être un accident à un renommage près de la suppression.
What changed in the package, by zone — 0.1.140 → 0.1.142
Measured on the two tarballs, by the release workflow. Not written by hand.
| Zone | What it is | Added | Removed | Changed |
|---|---|---|---|---|
documents |
what a human reads | 0 | 0 | 1 |
manifest |
package.json — version, exports, dependencies | 0 | 0 | 1 |
server |
the code the host executes | 0 | 0 | 4 |
context |
the injected-context implementations | 0 | 0 | 0 |
browser-types |
the declarations the host's tsc reads for « ./bridge » — breaks a build, never a page | 0 | 0 | 0 |
browser |
what the visitors' page executes | 0 | 0 | 0 |
cli |
the command-line entry point | 0 | 0 | 0 |
types |
declarations for the server and context entry points — breaks a build, never runtime | 0 | 0 | 0 |
database |
the schema and the migrations the host applies itself | 0 | 0 | 0 |
The files themselves
~ docs/HOST-CONTRACT.md
~ package.json
~ server/reponses.js
~ server/routes-agent.js
~ server/routes-direct.js
~ server/routes-liens.js