Pipeline: zwei neue Pruefstufen vor dem Commit (Typaritaet + JS-Render)

User: "baue alle und integriere in die pipeline vor dem commit". Beide Stufen
schliessen Luecken, die HEUTE real zugeschlagen haben.

A3) TYPPRUEFUNG (ty 0.0.73, Konfiguration in ty.toml)
Anlass: `paarweise(d)` wurde mit 1 von 2 Pflichtargumenten gerufen. py_compile
sah nichts (Syntax ok), ruff F821 auch nicht (der Name IST definiert), kein Test
deckte den Pfad ab - der Fehler schlug erst zur Laufzeit zu.
⚠ BEWUSST ENGES REGELSET: der volle ty-Lauf meldet 172 Befunde, davon 97
`unresolved-attribute` aus fehlenden MetaTrader5-Stubs. Eine Stufe mit
Dauer-Treffern wird ignoriert, und mit ihr die eine echte Meldung (die Lehre vom
07.08.). Aktiv sind nur die Aritaets-Regeln. `call-non-callable` und
`not-iterable` sind AUS - beide melden hier ausschliesslich Falsch-Positive aus
heterogenen dicts (`c["have"]()`, `"up" in c`); geprueft, nicht angenommen.
⚠ Der dokumentierte Einwand "Pruefumgebung != Laufumgebung" greift NICHT: ein
Typchecker fuehrt nichts aus, er kann also nicht divergieren. Er braucht auch
kein MT5.
⚠ Nebenbefund: die CLAUDE.md-Begruendung gegen mypy ("kaum Annotationen
vorhanden") ist veraltet - gemessen sind 305 von 443 Funktionen annotiert (69 %).

B2) RENDER-PROBE (tools/render_check.mjs gegen tests/fixtures/snapshot.json)
Anlass: `node --check` prueft nur SYNTAX. Der ReferenceError von heute Abend
(RSI-Zeile griff in renderM15(s) auf d.market zu) war syntaktisch einwandfrei
und brach im Browser den GESAMTEN Render ab - sechs leere Zeilen und eine leere
Breakout-Karte. Fuer Python gibt es ruff F821, fuer JS gab es nichts.
⚠ Laeuft gegen einen GESPEICHERTEN Snapshot, nicht gegen den laufenden Server -
der Hook darf nicht davon abhaengen, ob gerade ein Server laeuft.
⚠ KEIN ESLint: das braeuchte npm und node_modules, gegen die dokumentierte
Entscheidung ("kein npm, keine package.json").

BEIDE RICHTUNGEN VERIFIZIERT, je Stufe:
  A3  Aritaetsfehler eingebaut -> "FEHLER too-many-positional-arguments",
      1 Befund; zurueck -> gruen
  B2  d.market zurueckgebaut   -> " EXCEPTION: d is not defined",
      1 Befund; zurueck -> gruen
Beide haengen an tools/check_nfalle.py und laufen damit im pre-commit-Hook mit.
Fehlt das Werkzeug (ty nicht installiert, node nicht im PATH, Fixture fehlt),
wird die Stufe uebersprungen statt zu blockieren - eine frische Maschine darf am
Hook nicht haengenbleiben. Ein WERKZEUGFEHLER (Exit != 0/1) gilt dagegen
ausdruecklich NICHT als sauber.

ty in requirements-dev.txt gepinnt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-19 23:14:43 +02:00
co-authored by Claude Opus 5
parent 95b22e2add
commit 0fe51dea48
4 changed files with 127 additions and 0 deletions
+34
View File
@@ -0,0 +1,34 @@
# Typpruefung — BEWUSST ENGES Regelset (2026-08-19).
#
# ⚠⚠ Der volle Lauf meldet 172 Befunde, davon 97 `unresolved-attribute` aus
# fehlenden MetaTrader5-Stubs. Eine Stufe mit Dauer-Treffern wird ignoriert,
# und mit ihr die eine echte Meldung — das ist im Projekt dokumentiert
# (ruff-Schweregrad-Trennung, 07.08.). Deshalb blockieren nur die Regeln,
# die ECHTE Aufruffehler finden und hier nachweislich rauschfrei sind.
#
# Anlass ist ein realer Fehler vom 19.08.: `paarweise(d)` mit 1 von 2
# Pflichtargumenten. py_compile, ruff F821 und pytest liessen ihn durch; er
# schlug erst zur Laufzeit zu.
[src]
exclude = ["backtest_*.py", "analyze_*.py", "tests/**"]
[rules]
# ── AKTIV: echte Aufruffehler ────────────────────────────────────────────
missing-argument = "error"
too-many-positional-arguments = "error"
unknown-argument = "error"
# ⚠ call-non-callable / not-iterable BEWUSST AUS: beide melden hier nur
# Falsch-Positive aus heterogenen dicts (`c["have"]()` in den CHECKS,
# `"up" in c` in news.py). Geprueft, nicht angenommen.
call-non-callable = "ignore"
not-iterable = "ignore"
unresolved-import = "ignore"
# ── AUS: braucht vollstaendige Stubs/Annotationen, sonst Dauer-Rauschen ──
unresolved-attribute = "ignore"
unsupported-operator = "ignore"
invalid-argument-type = "ignore"
no-matching-overload = "ignore"
not-subscriptable = "ignore"
possibly-missing-attribute = "ignore"
invalid-assignment = "ignore"
invalid-return-type = "ignore"