Meldungen entschlackt, Bild-Modalbox, neues Muster, kleinere Trade-Schrift, M15 eingeklappt (v=207)
Fuenf User-Vorgaben in einem Durchgang.
(1) HYPERLIQUID + MUSTER + TRAILING AUS DER MELDUNGEN-KARTE. Die drei Divs sind
ENTFERNT, nicht nur versteckt; die Render-Bloecke bleiben stehen (null-sicher),
damit ein Zurueckholen eine reine HTML-Aenderung ist. Backend rechnet
unveraendert weiter (hl_ctx, patterns_tf, trail_info stehen im Snapshot).
Stufe F bekam eine dokumentierte Ausnahmeliste - sonst haette sie drei
Dauer-Treffer gemeldet, und eine Pruefung mit Dauer-Treffern wird ignoriert.
⚠⚠ DABEI ZWEI ECHTE ABSTUERZE GEFUNDEN - und der Weg dahin ist der Punkt.
`hl-note` wurde ueber das Auffang-`$` geholt; nach dem Entfernen des Elements
griffen ZWEI Zweige ungeschuetzt auf `hlEl.classList` zu. Im Browser ein
TypeError mitten im Render = das GESAMTE Dashboard friert auf Altwerten ein.
Die Render-Probe blieb zunaechst GRUEN - ihr eigener blinder Fleck: die
DOM-Attrappe lieferte fuer JEDE ID ein Element, `$streng` konnte darin also NIE
`null` zurueckgeben. Genau der Fall, fuer den es `$streng` gibt, war ungeprueft.
Behoben: die Attrappe kennt jetzt die echten IDs aus index.html
(`getElementById: id => HTML_IDS.has(id) ? el() : null`) - und meldete die
beiden Zweige im selben Lauf. Danach beide Waechter ergaenzt.
(2) BILD-MODALBOX. Klick auf ein Chartmuster oeffnet es gross.
⚠⚠ BEWUSST OHNE BIBLIOTHEK: ein Lightbox-Paket waere 15-40 KB plus ein zweites
Bedienkonzept fuer ~30 Zeilen Code. Das Dashboard laeuft nur ueber WireGuard,
ein CDN ist gar nicht erreichbar; das Projekt hat aus demselben Grund Tailwind
abgelehnt und am 05.08. die vendorte lightweight-charts (164 KB) entfernt.
Delegierter Klick auf `document`, weil die Kacheln bei JEDEM Render neu erzeugt
werden - ein Handler am <img> waere nach dem naechsten Snapshot weg.
Grosse Fassung (1408 px, ~133 KB) liegt getrennt unter muster/gross/ und wird
ERST beim Klick geladen; die Kachel bleibt bei 25 KB. Esc und Klick auf den
Hintergrund schliessen.
(3) NEUES BILD gescannt: "Inverse Tasse+Henkel.jpg". `inv_cup` hatte bis dahin
ausdruecklich KEIN Bild ("lieber keins als ein falsches") - jetzt zugeordnet.
Damit 16 Muster, keins ohne Datei, keine Datei ohne Zuordnung.
(4) SCHRIFT IN DER TRADE-LEISTE um 2 px (bezogen auf die 18-px-Referenz)
verkleinert - 4 Regeln: Ueberschrift, Feldbeschriftungen, Werte/Eingaben,
Knoepfe.
⚠ Erster Versuch nahm alles zwischen `.tb-title{` und `.mg-row` und traf 80
Regeln statt 4 - die halbe Oberflaeche. Zurueckgesetzt und namentlich
aufgezaehlt. Ein Zeilenbereich ist kein Selektor.
(5) M15-KARTE PER DEFAULT EINGEKLAPPT. Das `open` am ersten <details> ist weg.
⚠ Zusaetzlich der localStorage-Schluessel gebumpt (oil_m15_akk -> oil_m15_akk2):
bei jedem, der die Karte je aufgeklappt hatte, stand dort `true`, und das
gewinnt gegen den neuen Default. Ein neuer Schluessel setzt genau EINMAL
zurueck; danach merkt sich die Karte die eigene Wahl wie bisher.
Pipeline A-G gruen, 97 Tests, 14 render*-Funktionen (Fixture UND leerer
Snapshot), deployt und am ausgelieferten HTML/JS verifiziert.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
06024dd0c1
commit
71abb49cf7
@@ -478,7 +478,15 @@ def _stufe_ids():
|
||||
js = re.sub(r"(?m)^\s*//.*$", "", js)
|
||||
html_ids = re.findall(r'id="([^"]+)"', html)
|
||||
doppelt = sorted({i for i in html_ids if html_ids.count(i) > 1})
|
||||
fehlt = sorted(set(re.findall(r'\$(?:streng)?\("([^"]+)"\)', js)) - set(html_ids))
|
||||
# ⚠⚠ ABSICHTLICH ausgeblendete Elemente. Der JS-Block bleibt stehen —
|
||||
# er ist null-sicher (`$streng` + Waechter) — damit ein Zurueckholen eine
|
||||
# reine HTML-Aenderung ist. Ohne diese Liste meldete die Stufe drei
|
||||
# Dauer-Treffer, und eine Pruefung mit Dauer-Treffern wird ignoriert (die
|
||||
# Lehre vom Linter). ⚠ Wer hier etwas eintraegt, MUSS den Zugriff im JS
|
||||
# auf `$streng` + Waechter umstellen — sonst bricht der GESAMTE Render.
|
||||
AUSGEBLENDET = {"hl-note", "pat-note", "trail-note"} # User-Wunsch 2026-08-20
|
||||
fehlt = sorted(set(re.findall(r'\$(?:streng)?\("([^"]+)"\)', js))
|
||||
- set(html_ids) - AUSGEBLENDET)
|
||||
for i in fehlt:
|
||||
befunde.append(f"ID verwaist: $(\"{i}\") ohne Element in index.html")
|
||||
print(f" FEHLER verwaiste ID: {i}")
|
||||
|
||||
+17
-1
@@ -26,6 +26,14 @@ import vm from "node:vm";
|
||||
const pfad = process.argv[2] || "tests/fixtures/snapshot.json";
|
||||
const snap = JSON.parse(fs.readFileSync(pfad, "utf-8"));
|
||||
const src = fs.readFileSync("web/app.js", "utf-8");
|
||||
// Die real vorhandenen Element-IDs aus der ausgelieferten HTML.
|
||||
const HTML_IDS = new Set(
|
||||
[...fs.readFileSync("web/index.html", "utf-8").matchAll(/id="([^"]+)"/g)]
|
||||
.map((m) => m[1]));
|
||||
if (HTML_IDS.size < 50) {
|
||||
console.log(` ❌ nur ${HTML_IDS.size} IDs aus index.html gelesen — Probe greift nicht`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
function el() {
|
||||
const o = {
|
||||
@@ -44,7 +52,15 @@ function el() {
|
||||
const ctx = {
|
||||
console,
|
||||
document: {
|
||||
getElementById: () => el(), querySelector: () => el(),
|
||||
// ⚠⚠ NUR IDs, die es in `index.html` wirklich gibt (Fix 2026-08-20).
|
||||
// Vorher lieferte die Attrappe fuer JEDE ID ein Element — damit konnte
|
||||
// `$streng()` in der Probe NIE `null` zurueckgeben, und genau der Fall,
|
||||
// fuer den es `$streng` gibt, war ungeprueft. Real aufgefallen beim
|
||||
// Ausblenden von `#hl-note`: der Hauptzweig griff ungeschuetzt auf
|
||||
// `hlEl.classList` zu, die Probe blieb gruen, im Browser haette es den
|
||||
// GESAMTEN Render abgebrochen.
|
||||
getElementById: (id) => (HTML_IDS.has(id) ? el() : null),
|
||||
querySelector: () => el(),
|
||||
querySelectorAll: () => [], createElement: () => el(),
|
||||
addEventListener() {}, body: el(), documentElement: el(),
|
||||
activeElement: null, hidden: false, visibilityState: "visible",
|
||||
|
||||
Reference in New Issue
Block a user