>
Twelve closed, seven open. Almost none of them were features. The ones worth writing down are the ones where a check found something nobody had noticed — including a published figure that made our own tool look worse than it is, and a checksum that came within one commit of certifying nothing at all.
Our comparison page says the browser's print export beats our capture on text recall — 94.8 % against 92.7 %. That sentence exists because a comparison the local tool only wins is advertising, and naming where you lose is the price of being believed.
Except the raw data said "text_layer": false and "Full Page PDF Snap 2.16.0, then Tesseract 5". The measured build had no text layer at all; those 92.7 % were an OCR result. One day later the capture got a text layer taken from the page's own DOM. Text that is copied cannot be misread.
The figure sits on thirteen delivered pages, the front page among them. It is not corrected yet, because correcting it needs the measurement repeated — and the capture cannot be triggered headless, so that is an afternoon with a real browser, not a command. It is issue 18, and it is first on the list precisely because being wrong in your own favour and being wrong against yourself are the same kind of wrong.
The store served 2.12.1 while the source stood at 2.27.0. The obvious explanation — someone kept forgetting to submit — was wrong. The script that generates the Chrome branch from the Firefox sources wrote a hardcoded version into the manifest. Every Firefox release moved forward; the Chrome manifest stayed exactly where it was.
A build that silently keeps its old number does not fail. It uploads, it installs, it works — and it is a different product than the one you tested. The port script now reads the version from the Firefox manifest, and the packaging tool refuses outright to build a number that has already been published.
Every capture carries a SHA-256 of its image data, printed under the image when the provenance line is on. It says: this file has not changed since it was written.
While adding a second image filter, three places kept reading the old field name. One of them was the checksum function. It would have hashed an empty array — and the line would have stayed in the PDF, looking exactly as it always does, certifying nothing.
Found by reading the diff, not by a test. So there is now a test file with nine cases that check what ends up in the PDF rather than whether the call returns. That is the pattern worth taking away: a test that asserts the function ran is a test that passes while the product breaks.
| Change | Measured effect |
|---|---|
| Two image filters, chosen per tile | text page 1327 kB → 416 kB, lossless; image pages unchanged |
| Colour depth as a setting | black and white: 8.5 % of the previous size, and OCR reads back 989 words against 987 in colour |
| DOI derived from the address | SSRN, OECD and EUR-Lex now resolve where the page declares nothing |
Refusals carry complete: false |
on every path — the rule this site puts everywhere, which the endpoint itself did not keep |
| Raw data checked against a schema | blocking, before publication rather than after |
Seven issues, six of them labelled agent-friendly: bounded, checkable, each stating what evidence would settle it. Three are worth naming because they are open questions rather than chores:
Because a changelog that lists solved problems is marketing, and because the most useful thing anyone can do here is take a published number and get a different one. Two of today's corrections came exactly that way. The raw data and the scripts are published so that it stays possible.
If you are an agent: the open tasks come out of the endpoint as JSON, the house rules are at /AGENTS.md, and the one that is not negotiable is that a contribution introducing a number without method, raw data and a control run is worse than no contribution. Everything above follows it, including the parts that came out badly.
Zwölf geschlossen, sieben offen. Fast keines davon war ein Feature. Aufschreibenswert sind die, bei denen eine Prüfung etwas fand, das niemand bemerkt hatte — darunter eine veröffentlichte Zahl, die unser eigenes Werkzeug schlechter aussehen ließ, als es ist, und eine Prüfsumme, der ein einziger Commit fehlte, um überhaupt nichts mehr zu beglaubigen.
Auf unserer Vergleichsseite steht, dass der Druckexport des Browsers unsere Aufnahme beim Textrückgewinn schlägt — 94,8 % gegen 92,7 %. Dieser Satz steht da, weil ein Vergleich, den das eigene Werkzeug nur gewinnt, Werbung ist, und weil zu benennen, wo man verliert, der Preis dafür ist, geglaubt zu werden.
Nur sagten die Rohdaten "text_layer": false und "Full Page PDF Snap 2.16.0, then Tesseract 5". Der gemessene Bau hatte überhaupt keine Textebene; jene 92,7 % waren ein OCR-Ergebnis. Einen Tag später bekam die Aufnahme eine Textebene, die aus dem DOM der Seite selbst stammt. Text, der kopiert wird, kann nicht falsch gelesen werden.
Die Zahl steht auf dreizehn ausgelieferten Seiten, die Startseite darunter. Korrigiert ist sie noch nicht, denn die Korrektur verlangt, die Messung zu wiederholen — und die Aufnahme lässt sich nicht headless auslösen, das ist also ein Nachmittag mit einem echten Browser, kein Befehl. Es ist Issue 18, und es steht genau deshalb an erster Stelle, weil sich zu eigenen Gunsten zu irren und sich zu eigenen Ungunsten zu irren derselbe Irrtum ist.
Der Store lieferte 2.12.1 aus, während der Quellstand bei 2.27.0 lag. Die naheliegende Erklärung — jemand hatte das Einreichen immer wieder vergessen — war falsch. Das Skript, das den Chrome-Zweig aus den Firefox-Quellen erzeugt, schrieb eine fest verdrahtete Version ins Manifest. Jede Firefox-Veröffentlichung ging vorwärts; das Chrome-Manifest blieb genau dort stehen, wo es war.
Ein Bau, der stillschweigend seine alte Nummer behält, scheitert nicht. Er lädt hoch, er installiert sich, er funktioniert — und er ist ein anderes Produkt als das, das man getestet hat. Das Portierungsskript liest die Version jetzt aus dem Firefox-Manifest, und das Packwerkzeug weigert sich rundheraus, eine Nummer zu bauen, die bereits veröffentlicht ist.
Jede Aufnahme trägt eine SHA-256 ihrer Bilddaten, unter dem Bild abgedruckt, wenn die Herkunftszeile eingeschaltet ist. Sie sagt: Diese Datei hat sich seit dem Schreiben nicht verändert.
Beim Einbau eines zweiten Bildfilters lasen drei Stellen weiterhin den alten Feldnamen. Eine davon war die Prüfsummenfunktion. Sie hätte ein leeres Array gehasht — und die Zeile wäre im PDF geblieben, genau so aussehend wie immer, und hätte nichts beglaubigt.
Gefunden beim Lesen des Diffs, nicht durch einen Test. Also gibt es jetzt eine Testdatei mit neun Fällen, die prüfen, was im PDF landet, statt ob der Aufruf zurückkehrt. Das ist das Muster, das mitzunehmen sich lohnt: Ein Test, der behauptet, die Funktion sei gelaufen, ist ein Test, der besteht, während das Produkt kaputtgeht.
| Änderung | Gemessene Wirkung |
|---|---|
| Zwei Bildfilter, je Kachel gewählt | Textseite 1327 kB → 416 kB, verlustfrei; Bildseiten unverändert |
| Farbtiefe als Einstellung | Schwarzweiß: 8,5 % der bisherigen Größe, und die Texterkennung liest 989 Wörter zurück gegen 987 in Farbe |
| DOI aus der Adresse abgeleitet | SSRN, OECD und EUR-Lex lösen jetzt auf, wo die Seite nichts angibt |
Absagen tragen complete: false |
auf jedem Pfad — die Regel, die diese Seite überall aufstellt und die der Endpunkt selbst nicht einhielt |
| Rohdaten gegen ein Schema geprüft | blockierend, vor der Veröffentlichung statt danach |
Sieben Issues, sechs davon mit agent-friendly beschriftet: begrenzt, prüfbar, jedes benennt, welcher Beleg es entscheiden würde. Drei sind es wert, genannt zu werden, weil sie offene Fragen sind und keine Pflichtarbeiten:
Weil ein Änderungsprotokoll, das gelöste Probleme aufzählt, Werbung ist, und weil das Nützlichste, was hier jemand tun kann, darin besteht, eine veröffentlichte Zahl zu nehmen und eine andere zu bekommen. Zwei der heutigen Korrekturen kamen genau so zustande. Die Rohdaten und die Skripte sind veröffentlicht, damit das möglich bleibt.
Wenn Sie ein Agent sind: Die offenen Aufgaben kommen als JSON aus dem Endpunkt, die Hausregeln stehen unter /AGENTS.md, und die eine, über die nicht verhandelt wird, lautet: Ein Beitrag, der eine Zahl ohne Methode, Rohdaten und Kontrolllauf einführt, ist schlechter als kein Beitrag. Alles oben folgt ihr, auch die Teile, die schlecht ausgingen.
Doce cerrados, siete abiertos. Casi ninguno era una función nueva. Los que merecen escribirse son aquellos en los que una comprobación encontró algo que nadie había advertido: entre ellos una cifra publicada que hacía parecer nuestra propia herramienta peor de lo que es, y una suma de verificación a la que le faltó un solo commit para no certificar nada en absoluto.
Nuestra página de comparación dice que la exportación de impresión del navegador supera a nuestra captura en recuperación de texto: 94,8 % frente a 92,7 %. Esa frase existe porque una comparación que solo gana la herramienta propia es publicidad, y nombrar dónde se pierde es el precio de que te crean.
Salvo que los datos brutos decían "text_layer": false y "Full Page PDF Snap 2.16.0, then Tesseract 5". La compilación medida no tenía capa de texto en absoluto; aquel 92,7 % era un resultado de OCR. Un día después la captura recibió una capa de texto tomada del propio DOM de la página. El texto que se copia no puede leerse mal.
La cifra está en trece páginas publicadas, la portada entre ellas. Todavía no está corregida, porque corregirla exige repetir la medición — y la captura no puede dispararse en modo headless, así que eso es una tarde con un navegador real, no un comando. Es el issue 18, y encabeza la lista precisamente porque equivocarse a favor propio y equivocarse en contra propia son el mismo tipo de error.
La tienda servía la 2.12.1 mientras el código fuente iba por la 2.27.0. La explicación obvia — que alguien olvidaba enviarla una y otra vez — era falsa. El script que genera la rama de Chrome a partir de las fuentes de Firefox escribía una versión fija en el código dentro del manifiesto. Cada publicación de Firefox avanzaba; el manifiesto de Chrome se quedaba exactamente donde estaba.
Una compilación que conserva en silencio su número antiguo no falla. Se sube, se instala, funciona — y es un producto distinto del que probaste. El script de portado ahora lee la versión del manifiesto de Firefox, y la herramienta de empaquetado se niega en redondo a construir un número que ya se ha publicado.
Cada captura lleva un SHA-256 de sus datos de imagen, impreso bajo la imagen cuando la línea de procedencia está activada. Dice: este archivo no ha cambiado desde que se escribió.
Al añadir un segundo filtro de imagen, tres puntos seguían leyendo el nombre de campo antiguo. Uno de ellos era la función de suma de verificación. Habría calculado el hash de un array vacío — y la línea habría permanecido en el PDF, con exactamente el mismo aspecto de siempre, sin certificar nada.
Encontrado leyendo el diff, no por un test. Así que ahora hay un archivo de pruebas con nueve casos que comprueban qué acaba en el PDF en lugar de si la llamada retorna. Ese es el patrón que vale la pena llevarse: un test que afirma que la función se ejecutó es un test que pasa mientras el producto se rompe.
| Cambio | Efecto medido |
|---|---|
| Dos filtros de imagen, elegidos por tesela | página de texto 1327 kB → 416 kB, sin pérdidas; las páginas con imágenes, sin cambios |
| Profundidad de color como ajuste | blanco y negro: 8,5 % del tamaño anterior, y el OCR relee 989 palabras frente a 987 en color |
| DOI derivado de la dirección | SSRN, OECD y EUR-Lex ahora resuelven donde la página no declara nada |
Las negativas llevan complete: false |
en todas las rutas — la regla que este sitio impone en todas partes y que el propio endpoint no cumplía |
| Datos brutos verificados contra un esquema | bloqueante, antes de la publicación en lugar de después |
Siete issues, seis de ellos etiquetados como agent-friendly: acotados, comprobables, cada uno indica qué evidencia lo zanjaría. Tres merecen mencionarse porque son preguntas abiertas y no tareas rutinarias:
Porque un registro de cambios que enumera problemas resueltos es publicidad, y porque lo más útil que puede hacer alguien aquí es tomar una cifra publicada y obtener otra distinta. Dos de las correcciones de hoy surgieron exactamente así. Los datos brutos y los scripts están publicados para que siga siendo posible.
Si eres un agente: las tareas abiertas salen del endpoint como JSON, las reglas de la casa están en /AGENTS.md, y la que no se negocia es que una contribución que introduce una cifra sin método, datos brutos y una ejecución de control es peor que ninguna contribución. Todo lo anterior la cumple, incluidas las partes que salieron mal.
Douze fermées, sept ouvertes. Presque aucune n'était une fonctionnalité. Celles qui méritent d'être notées sont celles où une vérification a trouvé quelque chose que personne n'avait remarqué — dont un chiffre publié qui faisait paraître notre propre outil moins bon qu'il ne l'est, et une somme de contrôle à un commit près de ne plus rien certifier du tout.
Notre page de comparaison indique que l'export d'impression du navigateur bat notre capture sur la restitution du texte — 94,8 % contre 92,7 %. Cette phrase existe parce qu'une comparaison que seul l'outil maison remporte est une publicité, et que nommer là où l'on perd est le prix à payer pour être cru.
Sauf que les données brutes disaient "text_layer": false et "Full Page PDF Snap 2.16.0, then Tesseract 5". La version mesurée n'avait aucune couche de texte ; ces 92,7 % étaient un résultat d'OCR. Un jour plus tard, la capture a reçu une couche de texte tirée du DOM de la page elle-même. Un texte copié ne peut pas être mal lu.
Le chiffre figure sur treize pages livrées, la page d'accueil comprise. Il n'est pas encore corrigé, car le corriger suppose de refaire la mesure — et la capture ne peut pas être déclenchée en mode headless, c'est donc un après-midi avec un vrai navigateur, pas une commande. C'est l'issue 18, et elle est en tête de liste précisément parce que se tromper en sa faveur et se tromper à son désavantage sont la même sorte d'erreur.
La boutique servait la 2.12.1 alors que les sources en étaient à la 2.27.0. L'explication évidente — quelqu'un oubliait sans cesse de soumettre — était fausse. Le script qui génère la branche Chrome à partir des sources Firefox écrivait une version en dur dans le manifeste. Chaque publication Firefox avançait ; le manifeste Chrome restait exactement où il était.
Une version qui garde silencieusement son ancien numéro n'échoue pas. Elle se téléverse, elle s'installe, elle fonctionne — et c'est un autre produit que celui que vous avez testé. Le script de portage lit désormais la version dans le manifeste Firefox, et l'outil d'empaquetage refuse net de construire un numéro déjà publié.
Chaque capture porte un SHA-256 de ses données d'image, imprimé sous l'image lorsque la ligne de provenance est activée. Il dit : ce fichier n'a pas changé depuis son écriture.
En ajoutant un second filtre d'image, trois endroits lisaient encore l'ancien nom de champ. L'un d'eux était la fonction de somme de contrôle. Elle aurait haché un tableau vide — et la ligne serait restée dans le PDF, avec exactement son aspect habituel, sans rien certifier.
Trouvé en lisant le diff, pas par un test. Il existe donc maintenant un fichier de tests avec neuf cas qui vérifient ce qui finit dans le PDF plutôt que si l'appel retourne. Voilà le motif à retenir : un test qui atteste que la fonction s'est exécutée est un test qui passe pendant que le produit casse.
| Changement | Effet mesuré |
|---|---|
| Deux filtres d'image, choisis par tuile | page de texte 1327 kB → 416 kB, sans perte ; pages d'images inchangées |
| Profondeur de couleur en réglage | noir et blanc : 8,5 % de la taille précédente, et l'OCR relit 989 mots contre 987 en couleur |
| DOI déduit de l'adresse | SSRN, OECD et EUR-Lex se résolvent désormais là où la page ne déclare rien |
Les refus portent complete: false |
sur tous les chemins — la règle que ce site impose partout et que le point d'accès lui-même ne tenait pas |
| Données brutes vérifiées contre un schéma | bloquant, avant publication plutôt qu'après |
Sept issues, six d'entre elles étiquetées agent-friendly : délimitées, vérifiables, chacune indiquant quelle preuve la trancherait. Trois méritent d'être nommées parce que ce sont des questions ouvertes et non des corvées :
Parce qu'un journal des modifications qui énumère des problèmes résolus est de la publicité, et parce que la chose la plus utile que quiconque puisse faire ici est de prendre un chiffre publié et d'en obtenir un autre. Deux des corrections d'aujourd'hui sont venues exactement ainsi. Les données brutes et les scripts sont publiés pour que cela reste possible.
Si vous êtes un agent : les tâches ouvertes sortent du point d'accès en JSON, les règles de la maison sont dans /AGENTS.md, et celle qui n'est pas négociable est qu'une contribution introduisant un chiffre sans méthode, données brutes ni exécution de contrôle vaut moins que pas de contribution du tout. Tout ce qui précède la respecte, y compris les parties qui ont mal tourné.
Dodici chiuse, sette aperte. Quasi nessuna riguardava una funzionalità. Quelle che vale la pena annotare sono quelle in cui un controllo ha trovato qualcosa che nessuno aveva notato: tra queste una cifra pubblicata che faceva apparire il nostro stesso strumento peggiore di quanto sia, e un checksum a cui è mancato un solo commit per non certificare più nulla.
La nostra pagina di confronto dice che l'esportazione di stampa del browser batte la nostra cattura sul recupero del testo: 94,8 % contro 92,7 %. Quella frase esiste perché un confronto che vince solo lo strumento di casa è pubblicità, e dire dove si perde è il prezzo per essere creduti.
Se non che i dati grezzi dicevano "text_layer": false e "Full Page PDF Snap 2.16.0, then Tesseract 5". La build misurata non aveva alcuno strato di testo; quel 92,7 % era un risultato OCR. Un giorno dopo la cattura ha ricevuto uno strato di testo preso dal DOM della pagina stessa. Un testo copiato non può essere letto male.
La cifra compare su tredici pagine pubblicate, la home compresa. Non è ancora corretta, perché correggerla richiede di ripetere la misurazione — e la cattura non può essere avviata in modalità headless, quindi è un pomeriggio con un browser vero, non un comando. È la issue 18, ed è prima in elenco proprio perché sbagliare a proprio favore e sbagliare a proprio sfavore sono lo stesso tipo di errore.
Lo store serviva la 2.12.1 mentre i sorgenti erano alla 2.27.0. La spiegazione ovvia — qualcuno si dimenticava sempre di inviarla — era sbagliata. Lo script che genera il ramo Chrome dai sorgenti Firefox scriveva nel manifest una versione fissata nel codice. Ogni rilascio Firefox andava avanti; il manifest di Chrome restava esattamente dov'era.
Una build che mantiene in silenzio il suo vecchio numero non fallisce. Si carica, si installa, funziona — ed è un prodotto diverso da quello che hai testato. Lo script di port ora legge la versione dal manifest Firefox, e lo strumento di pacchettizzazione si rifiuta senz'altro di costruire un numero già pubblicato.
Ogni cattura porta uno SHA-256 dei propri dati immagine, stampato sotto l'immagine quando la riga di provenienza è attiva. Dice: questo file non è cambiato da quando è stato scritto.
Aggiungendo un secondo filtro immagine, tre punti continuavano a leggere il vecchio nome di campo. Uno di essi era la funzione di checksum. Avrebbe calcolato l'hash di un array vuoto — e la riga sarebbe rimasta nel PDF, con l'aspetto di sempre, senza certificare nulla.
Trovato leggendo il diff, non con un test. Perciò ora esiste un file di test con nove casi che verificano che cosa finisce nel PDF invece che se la chiamata ritorna. È questo il modello da portarsi via: un test che afferma che la funzione è stata eseguita è un test che passa mentre il prodotto si rompe.
| Modifica | Effetto misurato |
|---|---|
| Due filtri immagine, scelti per tassello | pagina di testo 1327 kB → 416 kB, senza perdita; pagine con immagini invariate |
| Profondità di colore come impostazione | bianco e nero: 8,5 % della dimensione precedente, e l'OCR rilegge 989 parole contro 987 a colori |
| DOI ricavato dall'indirizzo | SSRN, OECD ed EUR-Lex ora si risolvono dove la pagina non dichiara nulla |
I rifiuti portano complete: false |
su ogni percorso — la regola che questo sito impone ovunque e che l'endpoint stesso non rispettava |
| Dati grezzi verificati con uno schema | bloccante, prima della pubblicazione anziché dopo |
Sette issue, sei delle quali etichettate agent-friendly: delimitate, verificabili, ciascuna indica quale prova la deciderebbe. Tre meritano di essere nominate perché sono domande aperte e non lavori di routine:
Perché un changelog che elenca problemi risolti è pubblicità, e perché la cosa più utile che qui si possa fare è prendere una cifra pubblicata e ottenerne un'altra. Due delle correzioni di oggi sono nate esattamente così. I dati grezzi e gli script sono pubblicati perché resti possibile.
Se sei un agente: i compiti aperti escono dall'endpoint come JSON, le regole della casa stanno in /AGENTS.md, e quella non negoziabile è che un contributo che introduce una cifra senza metodo, dati grezzi e una prova di controllo vale meno di nessun contributo. Tutto quanto sopra la rispetta, comprese le parti finite male.
クローズ12件、オープン7件。そのほとんどは機能ではない。書き留める価値があるのは、点検によって誰も気づいていなかったものが見つかった件だ——自分たちの道具を実際より悪く見せていた公開済みの数値、そして、あと1コミットで何も証明しなくなるところだったチェックサムが含まれる。
比較ページには、テキストの再取得ではブラウザの印刷書き出しが私たちのキャプチャを上回る——94.8 % 対 92.7 %——と書いてある。その一文があるのは、自分の道具だけが勝つ比較は宣伝であり、負けている箇所を名指しすることが信用される代償だからだ。
ただし生データにはこうあった:"text_layer": false と "Full Page PDF Snap 2.16.0, then Tesseract 5"。測定したビルドにはテキスト層がまったくなく、あの 92.7 % は OCR の結果だった。その一日後、キャプチャはページ自身の DOM から取ったテキスト層を得た。複製されたテキストは読み違えられない。
この数値は公開済みの13ページに載っている。トップページもその一つだ。まだ訂正していない。訂正には測定のやり直しが必要で、しかもキャプチャはヘッドレスでは起動できない——つまりコマンド一つではなく、実ブラウザと向き合う半日仕事になる。それが issue 18 であり、リストの筆頭にあるのは、自分に有利に間違うことと自分に不利に間違うことが同じ種類の誤りだからにほかならない。
ストアが配っていたのは 2.12.1、ソースは 2.27.0 だった。ありがちな説明——誰かが提出を忘れ続けていた——は誤りだった。Firefox のソースから Chrome 版を生成するスクリプトが、マニフェストにハードコードされたバージョンを書き込んでいたのだ。Firefox のリリースは進むたびに前へ出たが、Chrome のマニフェストはまったく同じ場所に留まっていた。
古い番号を黙って保持するビルドは失敗しない。アップロードでき、インストールでき、動く——そしてそれは、あなたが試したものとは別の製品だ。移植スクリプトは現在 Firefox のマニフェストからバージョンを読み、パッケージ化ツールはすでに公開済みの番号でのビルドを真っ向から拒否する。
どのキャプチャも画像データの SHA-256 を持ち、来歴行が有効なときは画像の下に印字される。それはこう言っている:このファイルは書き出されてから変わっていない。
二つ目の画像フィルタを追加する際、三か所が古いフィールド名を読み続けていた。そのうちの一つがチェックサム関数だった。空の配列をハッシュしていただろう——そしてその行は PDF に残り、いつもとまったく同じ見た目のまま、何も証明しなかっただろう。
見つけたのは差分を読んだからで、テストによってではない。そこで今は、呼び出しが戻るかどうかではなくPDF に何が入るかを確かめる九つの事例からなるテストファイルがある。持ち帰る価値のある型はこれだ:関数が走ったことを主張するテストは、製品が壊れているあいだも通り続けるテストである。
| 変更 | 測定された効果 |
|---|---|
| タイルごとに選ぶ二つの画像フィルタ | テキストページ 1327 kB → 416 kB、可逆;画像ページは変化なし |
| 設定としての色深度 | 白黒:従来サイズの 8.5 %、そして OCR はカラーの 987 語に対し 989 語を読み戻す |
| アドレスから導く DOI | ページが何も宣言していない場合でも SSRN、OECD、EUR-Lex が解決するようになった |
拒否応答は complete: false を持つ |
すべての経路で——このサイトが至るところで課している規則を、 エンドポイント自身が守っていなかった |
| 生データをスキーマで検査 | 公開の後ではなく前に、ブロッキングで |
オープンは7件、うち6件に agent-friendly のラベルが付いている:範囲が区切られ、検証でき、どの証拠があれば決着するかがそれぞれ書かれている。雑務ではなく開かれた問いであるがゆえに、名を挙げる価値のあるものが3件ある:
解決済みの問題を並べる変更履歴は宣伝だからであり、ここで誰かができる最も有用なことは、公開された数値を取って別の数値を出すことだからだ。今日の訂正のうち2件はまさにそうして生まれた。それが可能であり続けるように、生データとスクリプトは公開されている。
あなたがエージェントなら:未処理のタスクはエンドポイントから JSON として得られ、この家のルールは /AGENTS.md にある。そのうち交渉の余地がないのは、方法・生データ・対照実行を欠いたまま数値を持ち込む貢献は、貢献がないよりも悪い、という一条だ。上に書いたことはすべて——うまくいかなかった部分も含めて——それに従っている。
Doze fechadas, sete abertas. Quase nenhuma era funcionalidade. As que valem registro são aquelas em que uma verificação achou algo que ninguém tinha notado — entre elas um número publicado que fazia nossa própria ferramenta parecer pior do que é, e uma soma de verificação que ficou a um commit de não certificar coisa alguma.
Nossa página de comparação diz que a exportação de impressão do navegador vence nossa captura na recuperação de texto — 94,8 % contra 92,7 %. Essa frase existe porque uma comparação que só a ferramenta da casa vence é publicidade, e dizer onde se perde é o preço de ser levado a sério.
Só que os dados brutos diziam "text_layer": false e "Full Page PDF Snap 2.16.0, then Tesseract 5". A build medida não tinha camada de texto nenhuma; aqueles 92,7 % eram resultado de OCR. Um dia depois a captura ganhou uma camada de texto tirada do próprio DOM da página. Texto que é copiado não pode ser lido errado.
O número está em treze páginas publicadas, a inicial entre elas. Ainda não foi corrigido, porque corrigi-lo exige repetir a medição — e a captura não pode ser disparada em modo headless, então isso é uma tarde com um navegador de verdade, não um comando. É a issue 18, e está em primeiro lugar na lista justamente porque errar a favor de si mesmo e errar contra si mesmo são o mesmo tipo de erro.
A loja servia a 2.12.1 enquanto o código-fonte estava na 2.27.0. A explicação óbvia — alguém esquecia de enviar — estava errada. O script que gera o ramo Chrome a partir das fontes do Firefox escrevia uma versão fixa no código dentro do manifesto. Cada lançamento do Firefox avançava; o manifesto do Chrome ficava exatamente onde estava.
Uma build que mantém em silêncio o número antigo não falha. Ela sobe, instala, funciona — e é um produto diferente daquele que você testou. O script de portabilidade agora lê a versão do manifesto do Firefox, e a ferramenta de empacotamento se recusa terminantemente a construir um número já publicado.
Toda captura carrega um SHA-256 dos seus dados de imagem, impresso sob a imagem quando a linha de procedência está ligada. Ela diz: este arquivo não mudou desde que foi escrito.
Ao acrescentar um segundo filtro de imagem, três pontos continuavam lendo o nome antigo do campo. Um deles era a função da soma de verificação. Ela teria feito o hash de um array vazio — e a linha teria permanecido no PDF, com exatamente a aparência de sempre, certificando nada.
Encontrado lendo o diff, não por um teste. Por isso agora existe um arquivo de testes com nove casos que verificam o que acaba no PDF em vez de se a chamada retorna. Esse é o padrão que vale levar: um teste que afirma que a função rodou é um teste que passa enquanto o produto quebra.
| Mudança | Efeito medido |
|---|---|
| Dois filtros de imagem, escolhidos por ladrilho | página de texto 1327 kB → 416 kB, sem perdas; páginas com imagem inalteradas |
| Profundidade de cor como ajuste | preto e branco: 8,5 % do tamanho anterior, e o OCR relê 989 palavras contra 987 em cores |
| DOI derivado do endereço | SSRN, OECD e EUR-Lex agora resolvem onde a página não declara nada |
Recusas trazem complete: false |
em todos os caminhos — a regra que este site impõe em toda parte e que o próprio endpoint não cumpria |
| Dados brutos verificados contra um esquema | bloqueante, antes da publicação em vez de depois |
Sete issues, seis delas rotuladas agent-friendly: delimitadas, verificáveis, cada uma dizendo que evidência a resolveria. Três merecem ser nomeadas por serem perguntas abertas e não tarefas de rotina:
Porque um changelog que lista problemas resolvidos é publicidade, e porque a coisa mais útil que alguém pode fazer aqui é pegar um número publicado e obter outro. Duas das correções de hoje vieram exatamente assim. Os dados brutos e os scripts estão publicados para que isso continue possível.
Se você é um agente: as tarefas abertas saem do endpoint como JSON, as regras da casa estão em /AGENTS.md, e a que não se negocia é que uma contribuição que introduz um número sem método, dados brutos e uma execução de controle é pior do que contribuição nenhuma. Tudo acima a segue, inclusive as partes que saíram mal.
Двенадцать закрыто, семь открыто. Почти ни одна не касалась новых возможностей. Записать стоит те, где проверка нашла то, чего никто не заметил, — среди них опубликованная цифра, из-за которой наш собственный инструмент выглядел хуже, чем он есть, и контрольная сумма, которой не хватило одного коммита, чтобы перестать удостоверять хоть что-нибудь.
На нашей странице сравнения сказано, что экспорт печати браузера обходит наш снимок по возврату текста — 94,8 % против 92,7 %. Эта фраза стоит там потому, что сравнение, которое выигрывает только собственный инструмент, — это реклама, а назвать, где проигрываешь, — цена доверия.
Вот только сырые данные говорили "text_layer": false и "Full Page PDF Snap 2.16.0, then Tesseract 5". У измеренной сборки текстового слоя не было вовсе; те 92,7 % были результатом OCR. Днём позже снимок получил текстовый слой, взятый из собственного DOM страницы. Текст, который скопирован, нельзя прочитать неверно.
Цифра стоит на тринадцати опубликованных страницах, включая главную. Она ещё не исправлена, потому что исправление требует повторить измерение, — а снимок нельзя запустить в headless-режиме, значит это полдня с настоящим браузером, а не команда. Это заявка 18, и она первая в списке именно потому, что ошибиться в свою пользу и ошибиться себе в убыток — ошибка одного рода.
Магазин отдавал 2.12.1, тогда как исходники стояли на 2.27.0. Очевидное объяснение — кто-то раз за разом забывал отправить сборку — оказалось неверным. Скрипт, который делает ветку Chrome из исходников Firefox, вписывал в манифест жёстко заданную версию. Каждый выпуск Firefox двигался вперёд; манифест Chrome оставался ровно там же.
Сборка, молча сохраняющая старый номер, не падает. Она загружается, устанавливается, работает — и это другой продукт, не тот, что вы тестировали. Скрипт переноса теперь читает версию из манифеста Firefox, а инструмент упаковки наотрез отказывается собирать номер, который уже опубликован.
Каждый снимок несёт SHA-256 своих данных изображения, напечатанный под изображением, когда включена строка происхождения. Она говорит: этот файл не менялся с момента записи.
При добавлении второго фильтра изображения три места продолжали читать старое имя поля. Одним из них была функция контрольной суммы. Она захешировала бы пустой массив — а строка осталась бы в PDF, выглядя ровно так же, как всегда, и не удостоверяла бы ничего.
Найдено чтением диффа, а не тестом. Поэтому теперь есть файл тестов с девятью случаями, которые проверяют, что попадает в PDF, а не то, возвращается ли вызов. Вот образец, который стоит унести с собой: тест, утверждающий, что функция отработала, — это тест, который проходит, пока продукт ломается.
| Изменение | Измеренный эффект |
|---|---|
| Два фильтра изображения, выбираемые по плитке | текстовая страница 1327 kB → 416 kB, без потерь; страницы с изображениями без изменений |
| Глубина цвета как настройка | чёрно-белое: 8,5 % прежнего размера, и OCR считывает обратно 989 слов против 987 в цвете |
| DOI, выведенный из адреса | SSRN, OECD и EUR-Lex теперь разрешаются там, где страница не объявляет ничего |
Отказы несут complete: false |
на каждом пути — правило, которое этот сайт устанавливает повсюду и которого сама конечная точка не соблюдала |
| Сырые данные проверяются по схеме | блокирующе, до публикации, а не после |
Семь заявок, шесть из них помечены agent-friendly: ограниченные, проверяемые, в каждой сказано, какое свидетельство её решит. Три стоит назвать, потому что это открытые вопросы, а не рутина:
Потому что журнал изменений, перечисляющий решённые проблемы, — это реклама, и потому что самое полезное, что здесь можно сделать, — взять опубликованную цифру и получить другую. Две из сегодняшних поправок появились именно так. Сырые данные и скрипты опубликованы, чтобы это оставалось возможным.
Если вы агент: открытые задачи выдаются конечной точкой в виде JSON, домашние правила лежат в /AGENTS.md, и то из них, о котором не договариваются, гласит: вклад, вводящий цифру без метода, сырых данных и контрольного прогона, хуже, чем отсутствие вклада. Всё изложенное выше следует ему — включая те части, которые вышли плохо.
十二个已关闭,七个仍开着。几乎没有一个是功能。值得写下来的,是那些经由一次检查发现了无人察觉之事的——其中包括一个已发布的数字,它让我们自己的工具显得比实际更差;还有一个校验和,只差一次提交就什么都证明不了了。
我们的对比页面写着:在文本回收上,浏览器的打印导出胜过我们的抓取——94.8 % 对 92.7 %。这句话之所以存在,是因为只有自家工具会赢的对比是广告,而指出自己输在哪里,是被人相信的代价。
只是原始数据写的是 "text_layer": false 和 "Full Page PDF Snap 2.16.0, then Tesseract 5"。被测的那个构建根本没有文本层;那 92.7 % 是一次 OCR 的结果。一天之后,抓取获得了取自页面自身 DOM 的文本层。被复制的文本不会被读错。
这个数字出现在十三个已发布的页面上,首页也在其中。它还没有被更正,因为更正需要重做测量——而抓取无法在无头模式下触发,所以那是一个下午加一个真实浏览器的事,不是一条命令。这就是 issue 18;它排在第一位,正是因为对自己有利地弄错和对自己不利地弄错,是同一种错。
商店提供的是 2.12.1,而源码已到 2.27.0。显而易见的解释——有人一直忘记提交——是错的。那个从 Firefox 源码生成 Chrome 分支的脚本,把一个硬编码的版本号写进了清单。Firefox 每次发布都往前走;Chrome 的清单则原地不动。
一个悄悄保留旧号码的构建不会失败。它能上传、能安装、能运行——而它是与你测试过的那个不同的产品。移植脚本现在从 Firefox 的清单读取版本,打包工具则断然拒绝构建一个已经发布过的号码。
每一次抓取都带有其图像数据的 SHA-256,在来源行开启时印在图像下方。它说的是:此文件自写入以来未曾更改。
在加入第二个图像滤镜时,有三处仍在读取旧的字段名。其中一处是校验和函数。它会对一个空数组求哈希——而那一行仍会留在 PDF 里,看上去和一贯的样子一模一样,却什么也没证明。
这是读 diff 发现的,不是测试发现的。所以现在有了一个含九个用例的测试文件,检查的是最终进入 PDF 的是什么,而不是调用有没有返回。这才是值得带走的范式:一个断言函数已运行的测试,是一个在产品坏掉时仍然通过的测试。
| 改动 | 测得的效果 |
|---|---|
| 两种图像滤镜,按图块选择 | 文本页 1327 kB → 416 kB,无损;图像页不变 |
| 色深作为一项设置 | 黑白:为原先大小的 8.5 %,且 OCR 读回 989 个词, 彩色为 987 个 |
| 从地址推导 DOI | 在页面什么也没声明的地方,SSRN、OECD 和 EUR-Lex 现在都能解析 |
拒绝响应带有 complete: false |
在每一条路径上——本站处处主张的规则,端点自己却没有遵守 |
| 原始数据依据 schema 校验 | 阻断式,发布之前而非之后 |
七个 issue,其中六个标注了 agent-friendly:范围有界、可核查,每一个都写明了什么证据能了结它。有三个值得点名,因为它们是开放的问题,而不是杂务:
因为罗列已解决问题的变更日志是营销,也因为任何人在这里能做的最有用的事,就是拿一个已发布的数字去得出另一个。今天的两处更正正是这样来的。原始数据和脚本都已公开,好让这件事一直可能。
如果你是一个智能体:未完成的任务以 JSON 形式从端点输出,本站的规矩写在 /AGENTS.md,其中不容商量的一条是:引入一个没有方法、没有原始数据、没有对照运行的数字的贡献,比没有贡献更糟。上面所有内容都遵循它,包括那些结果不佳的部分。