RUNDE YTDOM2 -- WO DAS HAUPTBUENDEL AUFHOERT. Gemessen 12.09.2026. Zweig: ytdom2 (96107d2) ab main ed6ac13, /root/certus-ui Firn: dc07a0ac (vendor/firn/COMMIT), Uebersetzer selbst gebaut Messwerkzeug: tools/certus/yt_mess.py, echtes Netz, echtes TLS. Vorher UND nachher mit DEMSELBEN Werkzeug gemessen, die Basis mit einem frisch aus main gebauten Programm (/tmp/w1base) -- nicht gegen Zahlen aus einer frueheren Runde. =========================== VORHER / NACHHER =========================== SEITE DOM-KNOTEN ELEMENTE SKRIPTE/FEHLER main ytdom2 main ytdom2 main ytdom2 youtube.com 472 493 416 427 43/1 43/1 m.youtube.com 472 493 416 427 43/1 43/1 xoffi.ai 1422 1422 1131 1131 19/0 19/0 DIE KNOTENZAHL IST GESTIEGEN: 472 -> 493, Elemente 416 -> 427. Zum ersten Mal seit Beginn dieser Arbeit. Der Fix, der das bewirkt hat, ist EINER -- die Array-Luecken (Punkt 1 unten). Alles danach hat die Zahl NICHT weiter bewegt; das steht unten ausdruecklich dabei. Ausgefuehrte AST-Knoten des Hauptbuendels (die Laufleistung): main 11 036 611 ytdom2 12 756 426 (+1,72 Mio, +15,6 %) ======================= 1. KOMMT DAS BUENDEL AN? ======================= JA, vollstaendig, und es wird vollstaendig geparst. Adresse .../m=kevlar_base_module,kevlar_main_module, kevlar_base_sync_mod_chunk Oktette 10 761 323 (mit curl nachgezaehlt: gleiche Zahl) Zeilen 42 860 Schluss "// Google Inc." -- die Datei endet sauber Geparst ja, KEIN SCRIPT-PARSE Ausgefuehrt 12 756 426 AST-Knoten, bevor es wirft Zum Vergleich, dieselbe Messung je Skript (SCRIPT-KNOTEN, neu): webcomponents-all-noPatch.js 31 990 Knoten web-animations-next-lite.min 7 850 spf.js 2 950 scheduler.js 1 860 Das Hauptbuendel laeuft also rund vierhundertmal so weit wie das naechstgroesste Skript -- es bricht NICHT frueh ab. ================== 2. DER EINE VERBLIEBENE FEHLER =================== Vollstaendig, mit allem, was die neue Diagnose hergibt: SCRIPT-THROW Zeile 5417 zuerst 166 Knoten 12756426 Wuerfe 3 Zeilen: 166 3668 5417 Text: [ the following conditions:] TypeError: Cannot read a property of undefined 'length' [kevlar_base_module,...] WIE DAS ZU LESEN IST, und warum die alte Meldung in die Irre fuehrte: * "Zeile 5417" ist NICHT der Ort. Dort steht _._DumpException = window._DumpException || function(Z){throw Z;} YouTube faengt seine Fehler selbst und WIRFT SIE WEITER -- der Weiterwurf ueberschrieb bisher die Wurfstelle. Deshalb meldete jede bisherige Messung 5417, egal was wirklich passiert war. * "Wuerfe 3" und "Zeilen: 166 3668 5417" sind neu: die Reihe ALLER Wuerfe. Der mittlere ist der echte. In Runde 1 dieser Arbeit lautete die Reihe 166 / 12405 / 5417, und 12405 war function N6(xA){for(var H=xA.length/6|0, ...) -- genau der Fehler, der diese Runde geloest hat. * Der JETZIGE mittlere Wurf liegt bei 3668. Dort steht die Reaktionsschicht der Custom Elements, die `appendChild` flickt. WICHTIG UND UNANGENEHM: die Zeilennummern des Buendels sind nur BEDINGT brauchbar. Die Adresse (rs=...) aendert sich bei jedem Aufruf, es ist jedes Mal ein anderer Bau, und "zuerst 166" zeigt im Abzug auf eine Kommentarzeile. Der mitgelieferte QUELLTEXT der Wurfzeile (neu) ist darum die verlaessliche Angabe -- er findet die Stelle in jeder Fassung wieder. Die Zeilenzaehlung selbst ist geprueft und korrekt (Testskript mit einem Wurf in Zeile 200 meldet Zeile 200). ==================== DIE URSACHE, DIE ES WIRKLICH WAR ================ *** ARRAY-LUECKEN IN map UND concat *** Im Hauptbuendel steht rund sechzigmal (D3-Farbskalen): Array(3).concat("1f77b4ff7f0e2ca02cd62728...", ...).map(N6) function N6(xA){ for(var H = xA.length/6|0, ...) } `Array(3)` erzeugt DREI LUECKEN. `map` muss sie ueberspringen und im Ergebnis stehen lassen (ECMA 23.1.3.21, Schritt 6.c "If kPresent is true"), `concat` muss sie erhalten (23.1.3.1, Schritt 5.c.iii). GEMESSEN VORHER: Array(3) 0 in h = false RICHTIG forEach besucht [] RICHTIG Array(3).map(f) ["X","X","X"] FALSCH -- rief f mit undefined Array(3).concat('aa') 0 in c = true FALSCH -- Luecke wurde undefined Also bekam N6 ein `undefined` und warf "Cannot read a property 'length' of undefined". UND JETZT DER TEIL, DER ALLES ERKLAERT: das GESAMTE 10,7-MB-Buendel steckt in EINEM try{...}catch(e){_._DumpException(e)}. Es gibt 214 solcher Bloecke, und der aeusserste umschliesst die ganze Datei. EIN Wurf an dieser Stelle macht damit ALLES danach tot -- und genau darum lief `customElements.define` NULL MAL (mit eigenem Haken nachgezaehlt: define-Aufrufe = 0, define-Fehler = 0), obwohl beim Start alles bereit stand: ytcfg (90 Schluessel), yt.config_ (90), ytcsi, ytInitialData, Polymer, Polymer.Element, customElements.define. FEHLER IM QUELLTEXT: lib/js/builtin.fi. Die Liste der Methoden, die eine Luecke ueberspringen, lautete (id == B_AP_FOREACH || B_AP_FILTER || B_AP_SOME || B_AP_EVERY) -- `map` fehlte darin. `concat` las mit `aget`, das aus jeder Luecke ein `undefined` macht. WIRKUNG, gemessen: vorher 416 Elemente / 472 Knoten, 11 036 611 ausgefuehrte Knoten nachher 427 Elemente / 493 Knoten, 11 925 540 ausgefuehrte Knoten =============== WAS DANACH KAM (Kette, jede Stufe gemessen) =========== Nach dem Array-Fix ruecken die Abbrueche weiter. Jede Stufe wurde einzeln gebaut und einzeln nachgemessen: Stufe Elem/Knoten ausgefuehrte Knoten Array-Luecken (map/concat) 427 / 493 11 925 540 *** URSACHE *** DataView is not defined 427 / 493 11 925 848 DataView-Argument r.buffer 427 / 493 12 033 828 subarray is not a function 427 / 493 12 754 929 'length' of undefined (3668) 427 / 493 12 756 426 EHRLICH: NUR DER ERSTE FIX HAT DIE KNOTENZAHL BEWEGT. Die vier danach haben je einen echten Fehler beseitigt und das Buendel um insgesamt 830 000 Knoten weitergebracht -- aber KEIN einziger zusaetzlicher DOM-Knoten ist daraus entstanden. Sie waren noetig, um weiterzukommen, sie sind aber NICHT die Ursache der leeren Seite. ================= 3. customElements, Shadow DOM, Module ============== customElements GIBT ES IN CERTUS NICHT -- kein einziger Treffer in lib/ ausser einem Kommentar in lib/core/script.fi. Auf youtube.com kommt es ausschliesslich aus der mitgelieferten Polyfill webcomponents-all-noPatch.js. Gemessen im laufenden Programm: customElements object (aus der Polyfill) customElements.define function -- aber NULL MAL gerufen customElements.get/whenDefined/upgrade nur mit Polyfill vorhanden Polymer / Polymer.Element function ytd-app registriert NEIN im Baum ja, 14 Kinder, 9110 Zeichen innerHTML Shadow DOM: `attachShadow` FEHLT (undefined). `ShadowRoot` ist bis heute nur eine Attrappe. Das ist die naechste grosse Baustelle. ES-Module / dynamic import: youtube.com braucht sie an dieser Stelle nicht -- das Hauptbuendel ist ein klassisches Skript (.es5.O), und `nomodule` wird bereits richtig behandelt. WAS DIE POLYFILL BRAUCHT und was davon fehlte: node.isConnected fehlte GANZ -> gebaut. Die Reaktionsschicht flickt appendChild und fragt darin `this.isConnected`, um connectedCallback zu feuern. Vorher kam undefined, also wurde nie eine Komponente verbunden. Gegenprobe: undefined->undefined wird false->true. DocumentFragment.children fehlte -> siehe Korrektur unten. ==================== EIN FEHLER VON MIR, UND SEINE KOSTEN ============ Ich hatte `children` zuerst an das NODE-Urbild gehaengt, damit ein DocumentFragment es erbt. GEMESSEN war das ein schwerer Fehler: mit children am Node-Urbild youtube.com > 40 min, nie fertig ohne youtube.com 84 s Die Polyfill laeuft den Baum ab und fragt JEDEN Knoten -- auch jeden Textknoten -- nach `children`, und jeder Zugriff baut ein neues Feld. Die Norm gibt `children` ohnehin nur ueber ParentNode (DOM 4.2.6): Element, Document, DocumentFragment. Ein Textknoten hat es NICHT. Korrigiert: Element hatte es laengst, jetzt steht es zusaetzlich am Dokument-Urbild. Fragmente haengen in `wrap_node` an P_NODE und bekommen es deshalb weiterhin nicht -- das ist eine benannte offene Luecke, kein stiller Verzicht. ========================== ERLEDIGT =================================== * Array.prototype.map ueberspringt Luecken und laesst sie im Ergebnis stehen (ECMA 23.1.3.21). lib/js/builtin.fi * Array.prototype.concat erhaelt Luecken (23.1.3.1). lib/js/builtin.fi * DOMException ist ein echter Konstruktor (message/name/code, Urbild erbt von Error) statt eines Verbotsschilds. lib/browser/domjs.fi -- EHRLICH: ohne Wirkung auf die Knotenzahl, NICHT die Ursache. * ArrayBuffer mit eigenem Konstruktor (zeigte vorher auf N_U8_CTOR und gab darum ein Feld statt eines Puffers). lib/browser/netjs.fi * DataView vollstaendig: 12 Zugriffe (get/set fuer i8,u8,i16,u16,i32, u32,f32,f64), beide Endianheiten, byteLength, buffer. Geprueft gegen Pythons struct -- alle acht Faelle oktettgenau gleich. lib/browser/netjs.fi * Uint8Array nimmt Puffer, Laenge ODER Feld und traegt einen echten .buffer, .byteLength, .byteOffset, .set(), .subarray(). lib/browser/netjs.fi * node.isConnected (DOM 4.4). lib/browser/domjs.fi * children am Dokument-Urbild (DOM 4.2.6). lib/browser/domjs.fi * Diagnose: erste Wurfstelle + Reihe der ersten acht Wuerfe + Zahl der Wuerfe + QUELLTEXT der Wurfzeile + ausgefuehrte Knoten je Skript. lib/js/interp.fi, lib/browser/web1_main.fi * Diagnose: auch der BERECHNETE Zugriff (a[b]) nennt den Namen der Eigenschaft. lib/js/interp.fi =========================== OFFEN ===================================== * Der naechste Wurf: "Cannot read a property of undefined 'length'" in der Reaktionsschicht der Custom Elements (Buendelzeile 3668, dort steht der appendChild-Patch). NICHT geloest. * Element.attachShadow und ein echter ShadowRoot fehlen. Ohne sie kann die Polyfill ihre Schattenbaeume nicht bauen -- fuer eine reine Custom-Elements-Anwendung wie youtube.com ist das die naechste grosse Baustelle. * DocumentFragment.children fehlt weiterhin (siehe oben -- am Node-Urbild war es zu teuer, das Fragment-Urbild wird von `wrap_node` nicht benutzt). * customElements ist in Certus selbst nicht gebaut. Solange das so ist, haengt jede Web-Components-Seite an der Polyfill und damit an jeder einzelnen Luecke, die diese anfasst. * attributes.item / getNamedItem fehlen (attributes ist ein Feld, kein NamedNodeMap). * Int8Array/Int16Array/Int32Array/Float32Array/Float64Array, TextEncoder/TextDecoder fehlen weiterhin. * youtube.com bleibt SICHTBAR LEER: 427 Elemente, und das Bild zeigt 24 Farben -- Fensterrahmen und Adresszeile. Die Seite ist NICHT gebaut. Das wird hier nicht schoengeredet. ============================ GEGENPROBEN ============================== Layout b2 gegen das eingefrorene Chromium (--reference): main ed6ac13 : 296 / 1087 Kaesten in 146 Faellen ytdom2 : 296 / 1087 Kaesten in 146 Faellen -> zeichengleich, keine Abweichung durch diese Runde. ANMERKUNG wie in Runde 1: die im Auftrag genannten 1087/1087 bei 0,00 % sind in diesem Baum nicht reproduzierbar, auch nicht auf unveraendertem main. Vorhandener Zustand, nicht Folge dieser Runde. tools/certus/tasten_main.fi : 23/23 Kuerzel gehen. window_main RC=0 web1_main RC=0 lib/browser/skript.fi ist und bleibt geloescht. lib/browser/chrome.fi und lib/android sind NICHT angefasst. ============================ BILDBELEG ================================ ytdom2-youtube-NACHHER-LEER.png 1024x779, 24 Farben. Ehrlich benannt: die Seitenflaeche ist weiterhin leer. Das deckt sich mit 427 Elementen und widerspricht keiner Zahl in diesem Bericht. roh-nachher-youtube.txt : der volle Lauf. basis_y.json : main, youtube + m.youtube (416/472) basis_x.json : main, xoffi.ai (1131/1422) r8.json : ytdom2, alle drei Seiten ===================== KORREKTUR ZU RUNDE 1 ============================ In Runde 1 hatte ich gemeldet, xoffi.ai falle nach dem Pumpen von 1146 auf ~70 Elemente zurueck. NACHGEMESSEN mit einem frisch aus main gebauten Programm und demselben Werkzeug: main liefert 1131 Elemente / 1422 Knoten, 19 Skripte, 0 Fehler -- genau wie ytdom2. Es gibt weder diesen Einbruch noch eine Verbesserung durch diese Runde. Die alte Zahl ist nicht reproduzierbar; ich habe sie zurueckgezogen. ===================== ANGEFASSTE DATEIEN ============================== lib/js/builtin.fi +45/-3 map/concat und die Luecken lib/js/interp.fi +97/-1 first_line, Wurfreihe, Wurfzaehler, Name beim berechneten Zugriff lib/browser/netjs.fi +416 ArrayBuffer, DataView, Uint8Array lib/browser/domjs.fi +85 DOMException, isConnected, children lib/browser/web1_main.fi +62 Diagnose je Skript tools/certus/yt_mess.py +1/-1 Zeitlimit In lib/dom wurde NICHTS angefasst.