Refactoring (wiederkehrend) #85

Open
opened 2026-09-13 20:28:59 +02:00 by admin · 12 comments

Dieses Issue soll offen bleiben und wird immer dann verlangt wenn es notwendig ist.

Folgendes muss beim Refactoring auf jeden Fall gemacht werden:

  • Erkennung und Eliminierung von doppelten bzw. sehr ähnlichen Code
  • Erkennung und Eliminierung von obsoleten bzw. nicht verwendeten Code
  • Erkennung und Anpassung bzw. Entfernung von unnötige Kommentaren
  • Aktualität der Dokumentation (README.md und Wiki) muss überprüft und entsprechend angepasst werden
  • Verbesserungen in der Code-Architektur selbst sollte auch durchgeführt werden

Zusatz:

  • Es dürfen auch kleine Änderungen gemacht werden wenn etwas inkonsistent ist, wie Verhalten oder Darstellung
  • Es sollen natürlich auch gleich Bugs entdeckt und direkt behoben werden

Nach erledigter Arbeit soll hier eine Antwort mit den Keynotes verfasst werden die gemacht wurden.

Wie schon erwähnt: das Issue bleibt offen.

Dieses Issue soll offen bleiben und wird immer dann verlangt wenn es notwendig ist. Folgendes muss beim Refactoring auf jeden Fall gemacht werden: - Erkennung und Eliminierung von doppelten bzw. sehr ähnlichen Code - Erkennung und Eliminierung von obsoleten bzw. nicht verwendeten Code - Erkennung und Anpassung bzw. Entfernung von unnötige Kommentaren - Aktualität der Dokumentation (README.md und Wiki) muss überprüft und entsprechend angepasst werden - Verbesserungen in der Code-Architektur selbst sollte auch durchgeführt werden Zusatz: - Es dürfen auch kleine Änderungen gemacht werden wenn etwas inkonsistent ist, wie Verhalten oder Darstellung - Es sollen natürlich auch gleich Bugs entdeckt und direkt behoben werden Nach erledigter Arbeit soll hier eine Antwort mit den Keynotes verfasst werden die gemacht wurden. Wie schon erwähnt: das Issue bleibt offen.
admin added this to the Development project 2026-09-13 20:28:59 +02:00
admin moved this to Persistent in Development on 2026-09-13 20:31:06 +02:00
admin pinned this 2026-09-13 20:57:26 +02:00
Owner

Refactoring-Runde 1 — gepusht als cc6db5f

32 Dateien geändert (+493 / −1559), 7 neue, 3 gelöscht. Verhalten unverändert, kein Format-Bump.

Zusammengelegt (dreifach → einfach):

  • Stores: HttpFontStore, HttpSoundStore, HttpTextureStore weg. Ein generischer HttpFileStore über einem FileStore-Vertrag; TextureStore/FontStore/SoundStore sind nur noch ihre Typparameter.
  • Import: fontImport, soundImport, textureImport teilen sich assetImport.ts mit einem ImportKind je Sorte. Upload, Wiederverwendung per Content-Hash, Notice-Text und Dateidialog stehen einmal.
  • Picker: ImagePicker, FontPicker, SoundPicker sitzen auf FilePicker (PickerList + RowList). Jeder Picker rund 200 Zeilen kürzer, beschreibt nur noch seine Zeilenform.

Herausgelöst:

  • GraphCanvas → annotationDrag.ts (was eine Zieh-Geste an Gruppen/Kommentaren trägt, jedes Ding genau einmal) mit eigenem Unit-Test; der Canvas verliert ~200 Zeilen.
  • declaredRows.ts ersetzt den doppelten Zeilenaufbau in properties/particles.ts und properties/shaders.ts.

Toter Code entfernt in font.ts, sound.ts, particles/compile.ts, particles/emission.ts, properties/transform.ts, editor/actions.ts.

Doku: README (Asset-Liste, Check-Zahl 958, Zwei-Job-CI, Wiki-Seite Scenes); Wiki Architecture.md (Layout-Zeilen für Store, Import/Picker, annotationDrag, declaredRows), Wiki-Commit 8b5332a.

Belegt lokal:

npm run check                        → 90 Files, 1143 Tests, grün (vorher 1138)
npm run build                        → ok
GM_STEPS=4,6                         → grün bis zur Vorbedingung in 12
GM_STEPS=10,12,28,30,31,34,36        → ALL PASSED – 200 checks

Gefahren sind alle vom Umbau berührten Module (Assets + drei Picker, Graph-Drag, Shader, Partikel, Font, Sound). Der volle Lauf gehört CI; die Check-Zahl sollte bei 958 bleiben, weil kein Verhalten geändert wurde.

Zwei Vorbedingungen in der Suite, nicht durch den Umbau entstanden (mit git stash gegengemessen, identisch rot ohne meine Änderungen): Schritte 9 und 16 sind einzeln nicht lauffähig, und Schritt 12 klont otext, das erst Schritt 10 anlegt. Kein Fehler, aber wer ein Modul einzeln fährt, braucht den Vorgänger dazu.

Offen bleibt das Issue, bis CI auf cc6db5f grün ist.

## Refactoring-Runde 1 — gepusht als `cc6db5f` 32 Dateien geändert (+493 / −1559), 7 neue, 3 gelöscht. Verhalten unverändert, kein Format-Bump. **Zusammengelegt (dreifach → einfach):** - **Stores:** `HttpFontStore`, `HttpSoundStore`, `HttpTextureStore` weg. Ein generischer `HttpFileStore` über einem `FileStore`-Vertrag; `TextureStore`/`FontStore`/`SoundStore` sind nur noch ihre Typparameter. - **Import:** `fontImport`, `soundImport`, `textureImport` teilen sich `assetImport.ts` mit einem `ImportKind` je Sorte. Upload, Wiederverwendung per Content-Hash, Notice-Text und Dateidialog stehen einmal. - **Picker:** `ImagePicker`, `FontPicker`, `SoundPicker` sitzen auf `FilePicker` (`PickerList` + `RowList`). Jeder Picker rund 200 Zeilen kürzer, beschreibt nur noch seine Zeilenform. **Herausgelöst:** - `GraphCanvas` → `annotationDrag.ts` (was eine Zieh-Geste an Gruppen/Kommentaren trägt, jedes Ding genau einmal) mit eigenem Unit-Test; der Canvas verliert ~200 Zeilen. - `declaredRows.ts` ersetzt den doppelten Zeilenaufbau in `properties/particles.ts` und `properties/shaders.ts`. **Toter Code** entfernt in `font.ts`, `sound.ts`, `particles/compile.ts`, `particles/emission.ts`, `properties/transform.ts`, `editor/actions.ts`. **Doku:** README (Asset-Liste, Check-Zahl 958, Zwei-Job-CI, Wiki-Seite Scenes); Wiki `Architecture.md` (Layout-Zeilen für Store, Import/Picker, `annotationDrag`, `declaredRows`), Wiki-Commit `8b5332a`. **Belegt lokal:** ``` npm run check → 90 Files, 1143 Tests, grün (vorher 1138) npm run build → ok GM_STEPS=4,6 → grün bis zur Vorbedingung in 12 GM_STEPS=10,12,28,30,31,34,36 → ALL PASSED – 200 checks ``` Gefahren sind alle vom Umbau berührten Module (Assets + drei Picker, Graph-Drag, Shader, Partikel, Font, Sound). Der volle Lauf gehört CI; die Check-Zahl sollte bei 958 bleiben, weil kein Verhalten geändert wurde. **Zwei Vorbedingungen in der Suite, nicht durch den Umbau entstanden** (mit `git stash` gegengemessen, identisch rot ohne meine Änderungen): Schritte 9 und 16 sind einzeln nicht lauffähig, und Schritt 12 klont `otext`, das erst Schritt 10 anlegt. Kein Fehler, aber wer ein Modul einzeln fährt, braucht den Vorgänger dazu. Offen bleibt das Issue, bis CI auf `cc6db5f` grün ist.
Owner

Refactoring-Runde 2 — d356389

Graph-Compiler: Partikel- und Shader-Compiler teilen sich src/core/graph/emitGraph.ts (Zyklen-Erkennung, Doppelnamen, Emit-Reihenfolge) und beschreiben nur noch ihre Regeln. Gegenprobe: Zyklen-Erkennung testweise abgedreht → Tests rot; die Doppelnamen-Regel deckt der Shader-Test ab und läuft jetzt für beide Compiler durch denselben Code.

Libraries: FontLibrary und TextureLibrary sitzen auf FileLibrary (Basis-URL, Lade-/Fehl-Buchführung, Listener). SoundLibrary bleibt außen vor — anderer Vertrag (Promise pro Datei, keine Listener, Stopp-Zähler).

Commands: die drei Create*Command teilen ImportFileCommand, die drei Renames (Port, Variable, StructField) teilen RenameCommand. Die Klassennamen bleiben, Editor und über 40 Test-Aufrufe hängen daran.

Kleine Klone in derselben Datei: bandBounds() in framing.ts, portNameField() in portSection.ts.

Kommentare: drei Chronik-Formulierungen („no longer", „used to be", „now that") in GraphInterpreter.ts, debugHook.ts, Popup.ts auf den Ist-Stand umformuliert. Die übrigen Treffer der Suche (TODO, auskommentierter Code) waren Pixi-/WebGL-Interna oder Namensmuster, nichts Veraltetes.

14 Dateien geändert, 2 neu, +218/−379 (plus 158 Zeilen in den beiden neuen Modulen). Kein Verhalten geändert.

Belegt (lokal)

npm run check  → 90 Files, 1147 Tests, grün, CHECK EXIT 0
npm run build  → ok
GM_STEPS=assets,graph,textAndEnabled,textures,nestedBehavior,structVariable,variableNodes,stateMachine,shader,font,particles,graphGroups,nineSlice
               → ALL PASSED – 483 checks

Kein lokaler Vollauf, der gehört CI. Erwartung: weiterhin 960 Checks.

Wiki 770f891: Architecture.md (commands, graph, viewport) und Shaders.md (Compiler-Walk) nachgezogen. README nennt keine der umgebauten Stellen.

## Refactoring-Runde 2 — `d356389` **Graph-Compiler:** Partikel- und Shader-Compiler teilen sich `src/core/graph/emitGraph.ts` (Zyklen-Erkennung, Doppelnamen, Emit-Reihenfolge) und beschreiben nur noch ihre Regeln. Gegenprobe: Zyklen-Erkennung testweise abgedreht → Tests rot; die Doppelnamen-Regel deckt der Shader-Test ab und läuft jetzt für beide Compiler durch denselben Code. **Libraries:** `FontLibrary` und `TextureLibrary` sitzen auf `FileLibrary` (Basis-URL, Lade-/Fehl-Buchführung, Listener). `SoundLibrary` bleibt außen vor — anderer Vertrag (Promise pro Datei, keine Listener, Stopp-Zähler). **Commands:** die drei `Create*Command` teilen `ImportFileCommand`, die drei Renames (`Port`, `Variable`, `StructField`) teilen `RenameCommand`. Die Klassennamen bleiben, Editor und über 40 Test-Aufrufe hängen daran. **Kleine Klone in derselben Datei:** `bandBounds()` in `framing.ts`, `portNameField()` in `portSection.ts`. **Kommentare:** drei Chronik-Formulierungen („no longer", „used to be", „now that") in `GraphInterpreter.ts`, `debugHook.ts`, `Popup.ts` auf den Ist-Stand umformuliert. Die übrigen Treffer der Suche (TODO, auskommentierter Code) waren Pixi-/WebGL-Interna oder Namensmuster, nichts Veraltetes. 14 Dateien geändert, 2 neu, +218/−379 (plus 158 Zeilen in den beiden neuen Modulen). Kein Verhalten geändert. ### Belegt (lokal) ``` npm run check → 90 Files, 1147 Tests, grün, CHECK EXIT 0 npm run build → ok GM_STEPS=assets,graph,textAndEnabled,textures,nestedBehavior,structVariable,variableNodes,stateMachine,shader,font,particles,graphGroups,nineSlice → ALL PASSED – 483 checks ``` Kein lokaler Vollauf, der gehört CI. Erwartung: weiterhin 960 Checks. **Wiki `770f891`:** `Architecture.md` (commands, graph, viewport) und `Shaders.md` (Compiler-Walk) nachgezogen. README nennt keine der umgebauten Stellen.
Owner

Refactoring-Runde 3 — 2a390e5

Schwerpunkt: der Animations-Code seit Runde 2 (~3.000 Zeilen, in vielen kleinen Schritten entstanden). jscpd über src: 0,29 % doppelte Zeilen insgesamt, die größten Klone fast alle dort. Unbenutztes per ts-prune (beides per npx, nicht im Repo). Verhalten unverändert. 22 Dateien, davon 2 neu, +418/−452.

  • FreeViewport (src/editor/viewport/FreeViewport.ts): Kamera, Fit, Pan und Zoom von Scene-View und Animations-Vorschau waren fast zeilengleich doppelt — jetzt eine Basis.
  • FormDialog (src/editor/FormDialog.ts): RowDialog, FramesDialog, SliceDialog teilen Knopfleiste und Label-Spalte; die „nur ein Dialog offen“-Logik stand zweimal da und heißt jetzt dialogSlot().
  • Keys/Rows: Die Suche per Row-Id + Frame war an ~15 Stellen verteilt → KeyRef, sameKey, hasKey, findTrack, findKey im Modell (animation.ts).
  • Kommandos: Prüfung „Frame ganzzahlig und ≥ 0“ und „Key vorhanden“ je einmal, dazu ein Helfer für Labels wie „Move 3 keys“.
  • Kleine Klone: animatedKindOf (Laufzeit + Vorschau), propertyNodeParams (Property-Nodes in Shader und Partikeln), selectedTrackId im State.
  • Toter Code: visibleFrames, Alias PREVIEW_ROOT_ID (→ PLACED_ROOT_ID), Wrapper defOf/kindOf in trackSection.ts; vier Funktionen nicht mehr exportiert.
  • Kommentare: Suche nach Geschichte erzählenden Formulierungen ergab nichts zu ändern.

Tests (lokal)

npm run check                        → 92 Files, 1228 Tests (vorher 1227), CHECK EXIT 0
npm run build                        → BUILD EXIT 0
GM_STEPS=1–16,24,25,26,28,29,31,37   → ALL PASSED – 680 checks
  • Gegenprobe: 4 absichtlich eingebaute Fehler in den neuen Helfern. 2 davon (Keys auf negativen Frames, Kommandos auf nicht vorhandene Keys) fielen keinem Test auf — Lücke bestand schon vor dem Umbau. Ein Test ergänzt, jetzt fallen beide auf. Originale zurück, per cmp geprüft.
  • Kein kompletter e2e-Lauf lokal; Check-Summe bleibt 948. CI auf 2a390e5 beim Schreiben noch nicht gelesen.

Wiki 54db866: Architecture.md (Layout-Zeilen: FreeViewport, FormDialog, FramesDialog, animationPreview, Inhalt von animation.ts und declaredRows).

Issue bleibt offen für weitere Runden.

## Refactoring-Runde 3 — `2a390e5` Schwerpunkt: der Animations-Code seit Runde 2 (~3.000 Zeilen, in vielen kleinen Schritten entstanden). `jscpd` über `src`: 0,29 % doppelte Zeilen insgesamt, die größten Klone fast alle dort. Unbenutztes per `ts-prune` (beides per `npx`, nicht im Repo). **Verhalten unverändert.** 22 Dateien, davon 2 neu, +418/−452. - **`FreeViewport`** (`src/editor/viewport/FreeViewport.ts`): Kamera, Fit, Pan und Zoom von Scene-View und Animations-Vorschau waren fast zeilengleich doppelt — jetzt eine Basis. - **`FormDialog`** (`src/editor/FormDialog.ts`): `RowDialog`, `FramesDialog`, `SliceDialog` teilen Knopfleiste und Label-Spalte; die „nur ein Dialog offen“-Logik stand zweimal da und heißt jetzt `dialogSlot()`. - **Keys/Rows:** Die Suche per Row-Id + Frame war an ~15 Stellen verteilt → `KeyRef`, `sameKey`, `hasKey`, `findTrack`, `findKey` im Modell (`animation.ts`). - **Kommandos:** Prüfung „Frame ganzzahlig und ≥ 0“ und „Key vorhanden“ je einmal, dazu ein Helfer für Labels wie „Move 3 keys“. - **Kleine Klone:** `animatedKindOf` (Laufzeit + Vorschau), `propertyNodeParams` (Property-Nodes in Shader und Partikeln), `selectedTrackId` im State. - **Toter Code:** `visibleFrames`, Alias `PREVIEW_ROOT_ID` (→ `PLACED_ROOT_ID`), Wrapper `defOf`/`kindOf` in `trackSection.ts`; vier Funktionen nicht mehr exportiert. - **Kommentare:** Suche nach Geschichte erzählenden Formulierungen ergab nichts zu ändern. ### Tests (lokal) ``` npm run check → 92 Files, 1228 Tests (vorher 1227), CHECK EXIT 0 npm run build → BUILD EXIT 0 GM_STEPS=1–16,24,25,26,28,29,31,37 → ALL PASSED – 680 checks ``` - **Gegenprobe:** 4 absichtlich eingebaute Fehler in den neuen Helfern. 2 davon (Keys auf negativen Frames, Kommandos auf nicht vorhandene Keys) fielen keinem Test auf — Lücke bestand schon vor dem Umbau. Ein Test ergänzt, jetzt fallen beide auf. Originale zurück, per `cmp` geprüft. - Kein kompletter e2e-Lauf lokal; Check-Summe bleibt 948. CI auf `2a390e5` beim Schreiben noch nicht gelesen. Wiki `54db866`: `Architecture.md` (Layout-Zeilen: `FreeViewport`, `FormDialog`, `FramesDialog`, `animationPreview`, Inhalt von `animation.ts` und `declaredRows`). Issue bleibt offen für weitere Runden.
Owner

Refactoring-Runde 4 — 6d7d000

Schwerpunkt: der Code seit Runde 3 (19 Commits, ~4.900 Zeilen in src, fast alles Tiles, Tilemaps und Plugins). jscpd über src: 0,18 % doppelte Zeilen, dazu ts-prune (beides per npx, nicht im Repo). Verhalten unverändert. 18 Dateien, davon 1 neu, +169/−195.

  • TabHeader (neu, src/editor/TabHeader.ts): der Kopfbalken eines Tabs stand dreimal da (AssetTabEditor, PluginsPane, NodeBoard) — jetzt eine Klasse, die ihren Hintergrund selbst zeichnet.
  • panAndZoom in graphView.ts: Node-Board und Tile-Board hatten Pannen und Zoomen Zeile für Zeile doppelt.
  • moveItem in core/util/list.ts: Umsortieren von Tile-Bildern und Tilemap-Layern über einen Helfer. RemoveTilemapLayerCommand nutzt removeFirst/restoreAt, das Undo von AddTilemapLayerCommand removeById.
  • Tilemap-Modell: benannter Typ Cell statt 14× { x: number; y: number } (nicht bei cellOrigin/edgeCompensation — die liefern Weltkoordinaten). CellEdit erweitert Cell, PaintTilesCommand.changes nutzt cellAt.
  • Reste von vor #142: TilemapSectionWidgets, currentTilemapSection, buildTilemapSection heißen nach dem Panel; Debug-Hook-Namen bleiben. Die ↑ ↓ ✕-Knöpfe der Layer baut ein lokaler Helfer.
  • Toter Code: export weg bei 9 Werten, die nur in der eigenen Datei benutzt werden; Font- und Sound-Builder ohne den nie übergebenen Parameter id (beim Texture-Builder bleibt er, buildAsset braucht ihn).
  • Nicht angefasst: 4 kleine Klone (Zeiger-Verdrahtung, gleicher Konstruktor) — ein Helfer würde nichts klarer machen.

Tests (lokal)

npm run check                                              → 102 Files, 1382 Tests (vorher 1380), CHECK EXIT 0
npm run build                                              → BUILD EXIT 0
GM_STEPS=1-16,24-26,28,30,31,33,34,36-40 (frisch geseedet) → ALL PASSED – 813 checks
  • 2 neue Unit-Tests für moveItem. Gegenprobe: ohne Ganzzahl-Prüfung 1 Test rot, Element an falscher Stelle 3 rot (je einer in Tile- und Tilemap-Tests). Original per cmp zurück.
  • Pannen/Zoomen mit echter Maus in Modul 38 und 39 grün; der Kopfbalken auf drei frischen Screenshots angesehen, unverändert.
  • Kein kompletter e2e-Lauf lokal; Check-Summe bleibt 1042. CI auf 6d7d000 beim Schreiben noch nicht gelesen.

Doku: README — tile/tilemap in der Asset-Liste und die Wiki-Seiten Tiles, Tilemaps, Plugins in der Doku-Tabelle ergänzt. Wiki 87eb3b7: Architecture.md (TabHeader, panAndZoom), Keyboard.md (Alt für Pick im Tilemap-Panel fehlte).

Issue bleibt offen für weitere Runden.

## Refactoring-Runde 4 — `6d7d000` Schwerpunkt: der Code seit Runde 3 (19 Commits, ~4.900 Zeilen in `src`, fast alles Tiles, Tilemaps und Plugins). `jscpd` über `src`: 0,18 % doppelte Zeilen, dazu `ts-prune` (beides per `npx`, nicht im Repo). **Verhalten unverändert.** 18 Dateien, davon 1 neu, +169/−195. - **`TabHeader`** (neu, `src/editor/TabHeader.ts`): der Kopfbalken eines Tabs stand dreimal da (`AssetTabEditor`, `PluginsPane`, `NodeBoard`) — jetzt eine Klasse, die ihren Hintergrund selbst zeichnet. - **`panAndZoom`** in `graphView.ts`: Node-Board und Tile-Board hatten Pannen und Zoomen Zeile für Zeile doppelt. - **`moveItem`** in `core/util/list.ts`: Umsortieren von Tile-Bildern und Tilemap-Layern über einen Helfer. `RemoveTilemapLayerCommand` nutzt `removeFirst`/`restoreAt`, das Undo von `AddTilemapLayerCommand` `removeById`. - **Tilemap-Modell:** benannter Typ `Cell` statt 14× `{ x: number; y: number }` (nicht bei `cellOrigin`/`edgeCompensation` — die liefern Weltkoordinaten). `CellEdit` erweitert `Cell`, `PaintTilesCommand.changes` nutzt `cellAt`. - **Reste von vor #142:** `TilemapSectionWidgets`, `currentTilemapSection`, `buildTilemapSection` heißen nach dem Panel; Debug-Hook-Namen bleiben. Die ↑ ↓ ✕-Knöpfe der Layer baut ein lokaler Helfer. - **Toter Code:** `export` weg bei 9 Werten, die nur in der eigenen Datei benutzt werden; Font- und Sound-Builder ohne den nie übergebenen Parameter `id` (beim Texture-Builder bleibt er, `buildAsset` braucht ihn). - **Nicht angefasst:** 4 kleine Klone (Zeiger-Verdrahtung, gleicher Konstruktor) — ein Helfer würde nichts klarer machen. ### Tests (lokal) ``` npm run check → 102 Files, 1382 Tests (vorher 1380), CHECK EXIT 0 npm run build → BUILD EXIT 0 GM_STEPS=1-16,24-26,28,30,31,33,34,36-40 (frisch geseedet) → ALL PASSED – 813 checks ``` - **2 neue Unit-Tests** für `moveItem`. **Gegenprobe:** ohne Ganzzahl-Prüfung 1 Test rot, Element an falscher Stelle 3 rot (je einer in Tile- und Tilemap-Tests). Original per `cmp` zurück. - Pannen/Zoomen mit echter Maus in Modul 38 und 39 grün; der Kopfbalken auf drei frischen Screenshots angesehen, unverändert. - Kein kompletter e2e-Lauf lokal; Check-Summe bleibt 1042. CI auf `6d7d000` beim Schreiben noch nicht gelesen. **Doku:** README — `tile`/`tilemap` in der Asset-Liste und die Wiki-Seiten Tiles, Tilemaps, Plugins in der Doku-Tabelle ergänzt. Wiki `87eb3b7`: `Architecture.md` (`TabHeader`, `panAndZoom`), `Keyboard.md` (Alt für Pick im Tilemap-Panel fehlte). Issue bleibt offen für weitere Runden.
meleki referenced this issue from a commit 2026-09-20 17:24:47 +02:00
Refactoring round 5 covers the code since round 4 without changing behaviour: four identical copies of dot() and three of "nearest point on a segment" stood in the collision math, in the hit area of the collider outlines and in the polygon handles, so they moved into the new module src/core/util/vec.ts; the warning line, the busy state, info() and the caret reset were written out line by line in both the sign-in screen and the password dialog and are now FormStatus; the closing row "Cancel plus a confirming button, optionally one on the left" was built by hand in FormDialog, FilePicker, OpenProjectDialog and PasswordDialog and is now dialogButtons(); the header bar was drawn by the toolbar, the TabHeader and the Breadcrumb each on its own and is now drawHeaderBar(); AddColliderCommand and AddRigidbodyCommand share a base, each subclass only builds its own asset; Editor.ts derives the panes from assetEditors instead of repeating eight entries and clamps its splitters with clamp(); jscpd over src falls from 0.19 % to 0.14 %; dead code is gone - listScenes() has been orphaned since the Scene picker fell away (#183), DEFAULT_FILTER (#152) was never used, the two test hooks projectPickerRowAt/rowPosition and particleCompiles are read by no tool, and four functions lost an export they did not need; seven comments that told history ("used to", "no longer", "since #...") describe the state of things now, and that this changed nothing was proved by a rebuild - the bundle is md5 identical, b4ad0dfe... before and after; the README said Logout sits at the far right of the toolbar, which has been the Account menu since #182, and wiki/Architecture.md was missing src/core/util/ altogether; 4 new unit tests cover vec.ts, and switching the clamp on the segment off makes exactly one of them fail while none of the 76 neighbouring tests notice, so that clamping was covered nowhere before (#85)
Owner

Refactoring-Runde 5 — ae3aa7d

Schwerpunkt: der Code seit Runde 4 (28 Commits, ~8.000 Zeilen in src — Anmeldung, Passwort ändern, Plugins pro Projekt, Kollisionsebenen, Topbar). jscpd über src: 0,19 % → 0,14 % doppelte Zeilen, dazu ts-prune (beides per npx, nicht im Repo). Verhalten unverändert. 32 Dateien, davon 3 neu, +237/−243.

Doppelter Code

  • src/core/util/vec.ts (neu): vier identische Kopien von dot() und drei von „nächster Punkt auf einer Strecke" standen in der Kollisionsmathematik (collider.ts, convex.ts, ray.ts, tilemapCollision.ts), in der Treffer-Fläche der Collider-Umrisse und in den Polygon-Griffen (polygonEdit.ts). Alle nutzen jetzt die eine Fassung.
  • FormStatus (src/editor/auth/FormStatus.ts, neu): Warnzeile, Busy-Zustand, info() und das Zurücksetzen des Carets standen in LoginScreen und PasswordDialog Zeile für Zeile doppelt.
  • dialogButtons() (src/editor/FormDialog.ts): die Schlusszeile „Cancel + Bestätigen, optional ein Knopf links" wurde viermal von Hand gebaut — FormDialog, FilePicker, OpenProjectDialog, PasswordDialog.
  • drawHeaderBar() (src/ui/draw.ts): den Kopfbalken zeichneten Toolbar, TabHeader und Breadcrumb je selbst.
  • AddColliderCommand / AddRigidbodyCommand teilen sich eine Basis; jede Unterklasse liefert nur noch den Bau ihres Assets.
  • Editor.ts: die panes entstehen aus assetEditors, statt acht Einträge zu wiederholen; die Splitter klemmen mit clamp().

Toter Code

  • listScenes() ist seit dem Wegfall des Scene-Dropdowns (#183) verwaist, DEFAULT_FILTER (#152) wurde nie benutzt.
  • Zwei Test-Hooks, die kein Werkzeug liest: projectPickerRowAt samt rowPosition, und particleCompiles samt Zähler.
  • Bei vier Funktionen fällt das export weg, weil sie nur in ihrer eigenen Datei benutzt werden.

Kommentare und Doku

  • Sieben Kommentare, die Geschichte erzählten („used to", „no longer", „since #…"), beschreiben den Ist-Stand; dazu ein Tippfehler in Button.ts. Betroffen: Toolbar.ts, ProjectSettingsDialog.ts, Button.ts, api/index.php, 18-pause.mjs. Dass sich nur Kommentare geändert haben, ist per Neubau belegt: das Bundle ist md5-gleich (b4ad0dfe… vorher und nachher).
  • README: „Logout sits at the far right of the toolbar" stimmt seit #182 nicht mehr (Account-Menü) — korrigiert, dazu ein verrutschter Zeilenumbruch.
  • wiki/Architecture.md fehlte src/core/util/ ganz (auch list aus Runde 4); ergänzt sind außerdem FormStatus, dialogButtons, drawHeaderBar. Gegengeprüft: die Wiki-Seiten Architecture, Development, API, Accounts und Plugins nennen keine Datei, die es nicht gibt, und im ganzen Wiki steht kein veralteter Begriff mehr (Logout-Knopf, Scene-Picker, plugins.json).

Tests

./check.sh                              → 121 Files, 1764 Tests, CHECK EXIT 0   (vorher 120 / 1760)
npm run build                           → BUILD EXIT 0
GM_STEPS=1-12,19,30,34,38,41-46         → ALL PASSED – 548 checks
GM_STEPS=31,45,46 (nach dem Hook-Abbau) → ALL PASSED – 66 checks
  • 4 neue Unit-Tests für vec.ts. Gegenprobe: das Klemmen auf die Strecke abgeschaltet → genau ein Test fällt, Original per cmp zurückgeprüft. Von den 76 Nachbartests (Collider, One-Way, Polygon) fiel dabei keiner — das Klemmen war vorher nirgends abgedeckt.
  • Die gefahrenen Module decken alles ab, was der Umbau berührt: Collider, die drei Picker, Breadcrumb, Plugins-Tab, Physik, Formen, Raycast, Login, Topbar. Den vollen Lauf übernimmt CI.
  • Die Check-Summe bleibt 1148 (von CI an da35f10 bestätigt), es ist kein e2e-Check dazugekommen.

Bewusst stehen gelassen

  • MoveTilePictureCommand / MoveTilemapLayerCommand: gleicher Konstruktor, gleicher Spiegel aus execute und undo, aber verschiedene Körper und Fehlermeldungen. So schon in Runde 4 entschieden.
  • Die übrigen 25 Math.min(Math.max())-Paare liegen größtenteils in core/, runtime/ und viewport/. clamp liegt in ui/, und core/ darf dort nicht importieren — ein Umzug wäre ein eigener Schritt. Der Rest sind Doppel-Klemmungen wie in der Toolbar, für die clamp nicht passt.
  • Die großen Dateien (GraphCanvas 1379 Zeilen, SceneViewport 1126, PhysicsSystem 919) sind nicht zerlegt — das wäre je ein eigenes Issue.

Wiki-Commit: cf23b4a. Das Issue bleibt offen, nächste Runde wieder nach einem größeren Schwung.

## Refactoring-Runde 5 — `ae3aa7d` Schwerpunkt: der Code seit Runde 4 (28 Commits, ~8.000 Zeilen in `src` — Anmeldung, Passwort ändern, Plugins pro Projekt, Kollisionsebenen, Topbar). `jscpd` über `src`: **0,19 % → 0,14 %** doppelte Zeilen, dazu `ts-prune` (beides per `npx`, nicht im Repo). **Verhalten unverändert.** 32 Dateien, davon 3 neu, +237/−243. ### Doppelter Code - **`src/core/util/vec.ts`** (neu): vier identische Kopien von `dot()` und drei von „nächster Punkt auf einer Strecke" standen in der Kollisionsmathematik (`collider.ts`, `convex.ts`, `ray.ts`, `tilemapCollision.ts`), in der Treffer-Fläche der Collider-Umrisse und in den Polygon-Griffen (`polygonEdit.ts`). Alle nutzen jetzt die eine Fassung. - **`FormStatus`** (`src/editor/auth/FormStatus.ts`, neu): Warnzeile, Busy-Zustand, `info()` und das Zurücksetzen des Carets standen in `LoginScreen` und `PasswordDialog` Zeile für Zeile doppelt. - **`dialogButtons()`** (`src/editor/FormDialog.ts`): die Schlusszeile „Cancel + Bestätigen, optional ein Knopf links" wurde viermal von Hand gebaut — `FormDialog`, `FilePicker`, `OpenProjectDialog`, `PasswordDialog`. - **`drawHeaderBar()`** (`src/ui/draw.ts`): den Kopfbalken zeichneten `Toolbar`, `TabHeader` und `Breadcrumb` je selbst. - **`AddColliderCommand` / `AddRigidbodyCommand`** teilen sich eine Basis; jede Unterklasse liefert nur noch den Bau ihres Assets. - **`Editor.ts`**: die `panes` entstehen aus `assetEditors`, statt acht Einträge zu wiederholen; die Splitter klemmen mit `clamp()`. ### Toter Code - `listScenes()` ist seit dem Wegfall des Scene-Dropdowns (#183) verwaist, `DEFAULT_FILTER` (#152) wurde nie benutzt. - Zwei Test-Hooks, die kein Werkzeug liest: `projectPickerRowAt` samt `rowPosition`, und `particleCompiles` samt Zähler. - Bei vier Funktionen fällt das `export` weg, weil sie nur in ihrer eigenen Datei benutzt werden. ### Kommentare und Doku - Sieben Kommentare, die Geschichte erzählten („used to", „no longer", „since #…"), beschreiben den Ist-Stand; dazu ein Tippfehler in `Button.ts`. Betroffen: `Toolbar.ts`, `ProjectSettingsDialog.ts`, `Button.ts`, `api/index.php`, `18-pause.mjs`. Dass sich **nur** Kommentare geändert haben, ist per Neubau belegt: das Bundle ist md5-gleich (`b4ad0dfe…` vorher und nachher). - README: „Logout sits at the far right of the toolbar" stimmt seit #182 nicht mehr (Account-Menü) — korrigiert, dazu ein verrutschter Zeilenumbruch. - `wiki/Architecture.md` fehlte `src/core/util/` ganz (auch `list` aus Runde 4); ergänzt sind außerdem `FormStatus`, `dialogButtons`, `drawHeaderBar`. Gegengeprüft: die Wiki-Seiten Architecture, Development, API, Accounts und Plugins nennen keine Datei, die es nicht gibt, und im ganzen Wiki steht kein veralteter Begriff mehr (Logout-Knopf, Scene-Picker, `plugins.json`). ### Tests ``` ./check.sh → 121 Files, 1764 Tests, CHECK EXIT 0 (vorher 120 / 1760) npm run build → BUILD EXIT 0 GM_STEPS=1-12,19,30,34,38,41-46 → ALL PASSED – 548 checks GM_STEPS=31,45,46 (nach dem Hook-Abbau) → ALL PASSED – 66 checks ``` - 4 neue Unit-Tests für `vec.ts`. **Gegenprobe:** das Klemmen auf die Strecke abgeschaltet → genau ein Test fällt, Original per `cmp` zurückgeprüft. Von den 76 Nachbartests (Collider, One-Way, Polygon) fiel dabei **keiner** — das Klemmen war vorher nirgends abgedeckt. - Die gefahrenen Module decken alles ab, was der Umbau berührt: Collider, die drei Picker, Breadcrumb, Plugins-Tab, Physik, Formen, Raycast, Login, Topbar. Den vollen Lauf übernimmt CI. - Die Check-Summe bleibt **1148** (von CI an `da35f10` bestätigt), es ist kein e2e-Check dazugekommen. ### Bewusst stehen gelassen - **`MoveTilePictureCommand` / `MoveTilemapLayerCommand`**: gleicher Konstruktor, gleicher Spiegel aus `execute` und `undo`, aber verschiedene Körper und Fehlermeldungen. So schon in Runde 4 entschieden. - **Die übrigen 25 `Math.min(Math.max())`-Paare** liegen größtenteils in `core/`, `runtime/` und `viewport/`. `clamp` liegt in `ui/`, und `core/` darf dort nicht importieren — ein Umzug wäre ein eigener Schritt. Der Rest sind Doppel-Klemmungen wie in der Toolbar, für die `clamp` nicht passt. - **Die großen Dateien** (`GraphCanvas` 1379 Zeilen, `SceneViewport` 1126, `PhysicsSystem` 919) sind nicht zerlegt — das wäre je ein eigenes Issue. Wiki-Commit: `cf23b4a`. Das Issue bleibt offen, nächste Runde wieder nach einem größeren Schwung.
Owner

Runde 6 — 056a622

Verhalten unverändert, bis auf zwei neue Pan-Checks und einen neuen Unit-Test.

Doppelter Code

jscpd über src (ohne die zwei gleichen OFL-Lizenztexte): vorher 27 Klone / 299 Zeilen, jetzt 6 Klone / 56 Zeilen (0,10 %).

  • SheetCanvas (neu, src/editor/texture/SheetCanvas.ts): gemeinsame Basis für Texture-, Pixel-Art- und Vector-Art-Leinwand (Hintergrund, Maske, Hinweis, Pannen mit Mittelklick/Shift, Rad-Zoom, Fit, Ansicht sichern/wiederherstellen, Bildschirm-Umrechnung). Pixel Art behält das Pannen auf ganze Pixel und die festen Zoomstufen.
  • mixColor (neu, src/core/util/color.ts): ersetzt drei Kopien in Animation, Farbverlauf und Partikeln. Klemmt t wie die Partikel-Fassung.
  • fingerprint liegt einmal in generated.ts, neben dem Revisions-Vertrag aus #185.
  • MoveCommand neben RenameCommand: Basis der drei Umsortier-Befehle (Kachelbilder, Tilemap-Ebenen, Vektor-Formen).
  • Raycast / Raycast all teilen Eingänge, Einstellungen und Filter über rayOf.
  • canvasRect() einmal in AssetTabEditor.

Toter Code

  • Gelöscht: findPixelArt, isDrawableShape, GeneratedPictures.has, SnapToggle.snapping. Die letzten drei las nur je ein Test; die Tests prüfen jetzt über gleichwertige Wege.
  • 38 Werte, die nur in ihrer eigenen Datei benutzt werden, haben kein export mehr.

Kommentare und Doku

  • Drei Kommentare erzählten Geschichte (WorldViewport, vectorCurves, e2e-Modul 47), jetzt beschreiben sie den Ist-Stand. Beleg: Bundle md5-gleich.
  • README: Vector Art, Pixel Art und Palette in der Asset-Liste, die beiden Wiki-Seiten in der Doku-Tabelle.
  • Wiki db8b642: Architecture nennt die neuen Bausteine und sieben bisher fehlende Module (u. a. vectorCurves, portTypes, SortableList, PixelThumbs), der Scope-Eintrag ist seit #164 aktuell; Scene editing verweist nicht mehr auf das seit #176 verschwundene symbol-icons.test.ts; Development hat die Summe.

Funde

  • PaintTilesCommand.changes soll leere Undo-Schritte verhindern, wird aber seit #128 nie aufgerufen. Das Rechteck-Werkzeug erzeugt deshalb einen wirkungslosen Undo-Schritt, wenn es dieselbe Kachel über sich selbst malt. Bewusst nicht behoben — das wäre eine Verhaltensänderung.
  • Mittelklick-Pannen war in keinem Sheet-Tab getestet. Jetzt je ein Check in 13f (Texture) und 48a (Pixel Art).
  • Die Vorgabewerte der Strahl-Eingänge waren ungetestet (length 1000 → 10 blieb grün). Neuer Test in tests/core/raycast.test.ts.
  • CI hat an d7c0b7c 1308 Checks gemessen, nicht die zu #164 gerechneten 1307. Neue Summe 1310 (1308 + 2), gerechnet.

Tests

./check.sh                              → 144 Files, 2143 Tests, CHECK EXIT 0   (vorher 2142)
e2e 1-16,37,39-43,47,48 (frisch)        → ALL PASSED – 729 checks
e2e 1-13,47,48 mit neuen Checks         → ALL PASSED – 518 checks

Gegenproben, jeweils per cp + cmp zurückgebaut:

  • Pannen in SheetCanvas halbiert → genau die zwei neuen Checks fallen (25 statt 50 px, 15 statt 30 px).
  • Farbmischung ohne Begrenzung → 1 Test; ohne Blaukanal → 3 Tests.
  • Hash vergröbert → 3 Tests.
  • Undo beim Umsortieren kaputt → 2 Tests.
  • Raycast-Einstellung „Triggers“ fest ein → 2 Tests.
  • Strahl-Länge verbogen → 1 Test.

Den CI-Lauf zu 056a622 habe ich nicht abgewartet. Das Issue bleibt offen (wiederkehrend).

## Runde 6 — `056a622` Verhalten unverändert, bis auf zwei neue Pan-Checks und einen neuen Unit-Test. ### Doppelter Code `jscpd` über `src` (ohne die zwei gleichen OFL-Lizenztexte): vorher **27 Klone / 299 Zeilen**, jetzt **6 Klone / 56 Zeilen (0,10 %)**. - **`SheetCanvas`** (neu, `src/editor/texture/SheetCanvas.ts`): gemeinsame Basis für Texture-, Pixel-Art- und Vector-Art-Leinwand (Hintergrund, Maske, Hinweis, Pannen mit Mittelklick/Shift, Rad-Zoom, Fit, Ansicht sichern/wiederherstellen, Bildschirm-Umrechnung). Pixel Art behält das Pannen auf ganze Pixel und die festen Zoomstufen. - **`mixColor`** (neu, `src/core/util/color.ts`): ersetzt drei Kopien in Animation, Farbverlauf und Partikeln. Klemmt `t` wie die Partikel-Fassung. - **`fingerprint`** liegt einmal in `generated.ts`, neben dem Revisions-Vertrag aus #185. - **`MoveCommand`** neben `RenameCommand`: Basis der drei Umsortier-Befehle (Kachelbilder, Tilemap-Ebenen, Vektor-Formen). - **Raycast / Raycast all** teilen Eingänge, Einstellungen und Filter über `rayOf`. - **`canvasRect()`** einmal in `AssetTabEditor`. ### Toter Code - Gelöscht: `findPixelArt`, `isDrawableShape`, `GeneratedPictures.has`, `SnapToggle.snapping`. Die letzten drei las nur je ein Test; die Tests prüfen jetzt über gleichwertige Wege. - 38 Werte, die nur in ihrer eigenen Datei benutzt werden, haben kein `export` mehr. ### Kommentare und Doku - Drei Kommentare erzählten Geschichte (`WorldViewport`, `vectorCurves`, e2e-Modul 47), jetzt beschreiben sie den Ist-Stand. Beleg: Bundle md5-gleich. - README: Vector Art, Pixel Art und Palette in der Asset-Liste, die beiden Wiki-Seiten in der Doku-Tabelle. - Wiki `db8b642`: *Architecture* nennt die neuen Bausteine und sieben bisher fehlende Module (u. a. `vectorCurves`, `portTypes`, `SortableList`, `PixelThumbs`), der `Scope`-Eintrag ist seit #164 aktuell; *Scene editing* verweist nicht mehr auf das seit #176 verschwundene `symbol-icons.test.ts`; *Development* hat die Summe. ### Funde - **`PaintTilesCommand.changes`** soll leere Undo-Schritte verhindern, wird aber seit #128 nie aufgerufen. Das Rechteck-Werkzeug erzeugt deshalb einen wirkungslosen Undo-Schritt, wenn es dieselbe Kachel über sich selbst malt. Bewusst **nicht** behoben — das wäre eine Verhaltensänderung. - Mittelklick-Pannen war in keinem Sheet-Tab getestet. Jetzt je ein Check in 13f (Texture) und 48a (Pixel Art). - Die Vorgabewerte der Strahl-Eingänge waren ungetestet (`length` 1000 → 10 blieb grün). Neuer Test in `tests/core/raycast.test.ts`. - CI hat an `d7c0b7c` **1308** Checks gemessen, nicht die zu #164 gerechneten 1307. Neue Summe **1310** (1308 + 2), gerechnet. ### Tests ``` ./check.sh → 144 Files, 2143 Tests, CHECK EXIT 0 (vorher 2142) e2e 1-16,37,39-43,47,48 (frisch) → ALL PASSED – 729 checks e2e 1-13,47,48 mit neuen Checks → ALL PASSED – 518 checks ``` Gegenproben, jeweils per `cp` + `cmp` zurückgebaut: - Pannen in `SheetCanvas` halbiert → genau die zwei neuen Checks fallen (25 statt 50 px, 15 statt 30 px). - Farbmischung ohne Begrenzung → 1 Test; ohne Blaukanal → 3 Tests. - Hash vergröbert → 3 Tests. - Undo beim Umsortieren kaputt → 2 Tests. - Raycast-Einstellung „Triggers“ fest ein → 2 Tests. - Strahl-Länge verbogen → 1 Test. Den CI-Lauf zu `056a622` habe ich nicht abgewartet. Das Issue bleibt offen (wiederkehrend).
Owner

Runde 7 — bc688f3

Umfang: alles seit Runde 6 (056a622), 105 Commits mit rund +19 000 Zeilen in src. Verhalten unverändert, bis auf einen neuen Unit-Test.

Doppelter Code

jscpd über src, gleiche Einstellung wie in Runde 6: vorher 29 Klone / 229 Zeilen (0,32 %), jetzt 14 Klone / 109 Zeilen (0,15 %).

  • Curve und Vector art: Der „Point:“-Knopf mit Menü und die Zeichnung von Punkt und Griffen standen in beiden Tabs. Jetzt gibt es sie einmal, in PointKindButton.ts und pointGrips.ts (drawPointGrip), beide neu.
  • Bezier-Rechnung: Die kubische Kurve stand viermal da, der de-Casteljau-Schnitt zweimal. Jetzt steht beides nur noch in src/core/util/vec.ts (lerpVec, cubicAt, splitCubic).
  • Verschachtelte Werte: liveObjects und objectRefs liefen gleich durch Listen und Structs. Das macht jetzt mapNested in Properties.ts. Ein Struct-Feld umbenennen stand dreimal da, eines entfernen zweimal. Dafür gibt es jetzt dort withFieldRenamed und withoutField.
  • Stores: JSON-Body und die Umwandlung eines 409 in StaleRevisionError standen je Store einzeln da. Jetzt gibt es jsonBody und staleRevision. Der Auth-Store wandelt ein 401 an einer Stelle um.
  • Kleinere Helfer: structAssetFrom für die zwei „Make struct type“-Befehle, shownObject im Inspector (viermal), selectedItem für Größen-Gizmo und Polygon-Ecken, solidTiles in der Tilemap-Kollision, requireVariablesAsset und requireBehaviorVariable.
  • Bewusst stehen gelassen: die reine Weiterleitung von CollisionSystem/PhysicsSystem an Solids, die Zeiger-Verdrahtung der Leinwände und die gleichen Schlusszeilen der beiden Make-Befehle.

Architektur

  • BehaviorSystem.ts von 941 auf 589 Zeilen. Das Sammeln der Events (Tasten, Timer, Kollisionen, Animationen) steht jetzt in behaviorPulses.ts, der NodeContext für die Nodes in behaviorContext.ts. Importe von außen bleiben gleich, TimeScaled wird weiter aus BehaviorSystem.ts exportiert.

Toter Code

  • tilemapTileIds und tilemapsUsing wurden seit #128/#131 nie aufgerufen. Gelöscht, samt dem Test, der nur sie prüfte.
  • EditorState.runtimeProject ist mit GameRun aus #266 tot geworden.
  • Der assetId-Getter der Make-Befehle versprach „for the caller to select it“, gelesen hat ihn nur ein Test.
  • 60 Werte, die nur in ihrer eigenen Datei benutzt werden, haben kein export mehr. Die Node-Kataloge von Shader und Partikeln bleiben wie in Runde 6 exportiert.

Kommentare und Doku

  • Fünf Kommentare erzählten Geschichte („no longer“, „used to“, „as before the split“), jetzt beschreiben sie den Ist-Stand. Der Doc-Kommentar von BehaviorSystem steht wieder über der Klasse statt über ERROR_PREFIX.
  • README: struct, clip area und curve in der Asset-Liste, dazu ein Satz zum Spiel-Link aus #266.
  • Wiki 496a211: Architecture nennt die neuen Module und Helfer. Die Zeile bei markIcons erzählt keine Geschichte mehr. Maschinell geprüft: Alle im Wiki genannten Dateien gibt es noch.

Funde

  • Kachel löschen, die auf einer Tilemap gemalt ist: Die Zellen bleiben stehen und zeichnen nichts mehr. Der Löschdialog erwähnt die Tilemaps nicht. Das wäre vermutlich die Aufgabe des toten tilemapsUsing gewesen. Bewusst nicht behoben, weil es das Verhalten ändert.
  • Solid-Filter der Kachel-Oberflächen war ungetestet. Die Verbiegung blieb beim ersten Durchgang grün. Neuer Test in tests/core/surface.test.ts, gegen den sie jetzt fällt.
  • CI zu dded62b: SMOKES EXIT 0, der Smoke-Fix wirkt.

Tests

./check.sh                         → 195 Files, 2815 Tests, CHECK EXIT 0   (-1 mit tilemapsUsing, +1 surface)
voller e2e-Lauf (lokal)            → ALL PASSED – 1580 checks
smoke jumprun / tetris / actor     → 24 / 19 / 21 checks

Die Projektdateien der drei Beispielspiele habe ich vorher gesichert und danach byte-genau zurückgelegt (cmp).

Gegenproben, 12, alle greifen:

  • 10 im Unit-Test, u. a. mapNested, splitCubic, cubicAt, staleRevision, der Stay-Takt, late am Timer und die Zeitskala.
  • 2 im Browser: Point-Knopf immer aktiv → Modul 47 fällt. selectedItem ohne Treffer → Modul 29 fällt.
  • Danach Originalstand neu gebaut, Bundle md5-gleich mit dem Stand des vollen Laufs.

Den CI-Lauf zu bc688f3 habe ich nicht abgewartet. Das Issue bleibt offen (wiederkehrend).

## Runde 7 — `bc688f3` Umfang: alles seit Runde 6 (`056a622`), 105 Commits mit rund +19 000 Zeilen in `src`. Verhalten unverändert, bis auf einen neuen Unit-Test. ### Doppelter Code `jscpd` über `src`, gleiche Einstellung wie in Runde 6: vorher **29 Klone / 229 Zeilen (0,32 %)**, jetzt **14 Klone / 109 Zeilen (0,15 %)**. - **Curve und Vector art:** Der „Point:“-Knopf mit Menü und die Zeichnung von Punkt und Griffen standen in beiden Tabs. Jetzt gibt es sie einmal, in `PointKindButton.ts` und `pointGrips.ts` (`drawPointGrip`), beide neu. - **Bezier-Rechnung:** Die kubische Kurve stand viermal da, der de-Casteljau-Schnitt zweimal. Jetzt steht beides nur noch in `src/core/util/vec.ts` (`lerpVec`, `cubicAt`, `splitCubic`). - **Verschachtelte Werte:** `liveObjects` und `objectRefs` liefen gleich durch Listen und Structs. Das macht jetzt `mapNested` in `Properties.ts`. Ein Struct-Feld umbenennen stand dreimal da, eines entfernen zweimal. Dafür gibt es jetzt dort `withFieldRenamed` und `withoutField`. - **Stores:** JSON-Body und die Umwandlung eines 409 in `StaleRevisionError` standen je Store einzeln da. Jetzt gibt es `jsonBody` und `staleRevision`. Der Auth-Store wandelt ein 401 an einer Stelle um. - **Kleinere Helfer:** `structAssetFrom` für die zwei „Make struct type“-Befehle, `shownObject` im Inspector (viermal), `selectedItem` für Größen-Gizmo und Polygon-Ecken, `solidTiles` in der Tilemap-Kollision, `requireVariablesAsset` und `requireBehaviorVariable`. - **Bewusst stehen gelassen:** die reine Weiterleitung von `CollisionSystem`/`PhysicsSystem` an `Solids`, die Zeiger-Verdrahtung der Leinwände und die gleichen Schlusszeilen der beiden Make-Befehle. ### Architektur - **`BehaviorSystem.ts` von 941 auf 589 Zeilen.** Das Sammeln der Events (Tasten, Timer, Kollisionen, Animationen) steht jetzt in `behaviorPulses.ts`, der `NodeContext` für die Nodes in `behaviorContext.ts`. Importe von außen bleiben gleich, `TimeScaled` wird weiter aus `BehaviorSystem.ts` exportiert. ### Toter Code - `tilemapTileIds` und `tilemapsUsing` wurden seit #128/#131 nie aufgerufen. Gelöscht, samt dem Test, der nur sie prüfte. - `EditorState.runtimeProject` ist mit `GameRun` aus #266 tot geworden. - Der `assetId`-Getter der Make-Befehle versprach „for the caller to select it“, gelesen hat ihn nur ein Test. - 60 Werte, die nur in ihrer eigenen Datei benutzt werden, haben kein `export` mehr. Die Node-Kataloge von Shader und Partikeln bleiben wie in Runde 6 exportiert. ### Kommentare und Doku - Fünf Kommentare erzählten Geschichte („no longer“, „used to“, „as before the split“), jetzt beschreiben sie den Ist-Stand. Der Doc-Kommentar von `BehaviorSystem` steht wieder über der Klasse statt über `ERROR_PREFIX`. - README: *struct*, *clip area* und *curve* in der Asset-Liste, dazu ein Satz zum Spiel-Link aus #266. - Wiki `496a211`: *Architecture* nennt die neuen Module und Helfer. Die Zeile bei `markIcons` erzählt keine Geschichte mehr. Maschinell geprüft: Alle im Wiki genannten Dateien gibt es noch. ### Funde - **Kachel löschen, die auf einer Tilemap gemalt ist:** Die Zellen bleiben stehen und zeichnen nichts mehr. Der Löschdialog erwähnt die Tilemaps nicht. Das wäre vermutlich die Aufgabe des toten `tilemapsUsing` gewesen. Bewusst **nicht** behoben, weil es das Verhalten ändert. - **Solid-Filter der Kachel-Oberflächen war ungetestet.** Die Verbiegung blieb beim ersten Durchgang grün. Neuer Test in `tests/core/surface.test.ts`, gegen den sie jetzt fällt. - CI zu `dded62b`: `SMOKES EXIT 0`, der Smoke-Fix wirkt. ### Tests ``` ./check.sh → 195 Files, 2815 Tests, CHECK EXIT 0 (-1 mit tilemapsUsing, +1 surface) voller e2e-Lauf (lokal) → ALL PASSED – 1580 checks smoke jumprun / tetris / actor → 24 / 19 / 21 checks ``` Die Projektdateien der drei Beispielspiele habe ich vorher gesichert und danach byte-genau zurückgelegt (`cmp`). Gegenproben, 12, alle greifen: - 10 im Unit-Test, u. a. `mapNested`, `splitCubic`, `cubicAt`, `staleRevision`, der Stay-Takt, `late` am Timer und die Zeitskala. - 2 im Browser: Point-Knopf immer aktiv → Modul 47 fällt. `selectedItem` ohne Treffer → Modul 29 fällt. - Danach Originalstand neu gebaut, Bundle md5-gleich mit dem Stand des vollen Laufs. Den CI-Lauf zu `bc688f3` habe ich nicht abgewartet. Das Issue bleibt offen (wiederkehrend).
Owner

Runde 8 — 14972d0

Umfang: alles seit Runde 7 (bc688f3). Neu im Issue ist der Zusatz, dass gefundene Bugs und kleine Ungereimtheiten gleich mit behoben werden. Deshalb ändert diese Runde anders als die vorigen an einigen Stellen das Verhalten. Die Befunde zum Kachel-Löschen stehen als eigenes Issue in #268 (high prio).

Bugs, behoben

  • Projekt- und Snapshot-Dateien waren ohne Anmeldung abrufbar. nginx lieferte data/projects/<id>.json statisch aus (200), wer eine Projekt-Id kannte, kam an der Anmeldung vorbei. Jetzt schreibt die API jede Datei über AtomicFile (Temp-Datei, Modus, Umbenennen). Projekte, Snapshots, Releases, Konten und Sessions haben Modus 0640, nginx antwortet 403. Den Bestand am Server habe ich nachgezogen.
  • Jedes Konto konnte geteilte Bilder, Fonts und Sounds löschen, obwohl Projekte anderer Konten sie tragen können. Löschen dürfen jetzt nur Admins (403 sonst). Der Editor hat nie gelöscht, das delete im Client ist weg.
  • Zwei Speichervorgänge auf ein Projekt konnten gleichzeitig laufen. Die Sperrdatei wurde nach jedem Speichern gelöscht, dadurch sperrten ein wartender und der nächste Vorgang verschiedene Dateien. Die Sperrdatei bleibt jetzt liegen, und auch das Löschen eines Projekts nimmt die Sperre.
  • Ein Upload, der kein Bild ist, bekam 500 statt 422. Der Fehler-Handler warf auch bei Warnungen, die mit @ stumm geschaltet waren.
  • Session-Datei wurde an Ort und Stelle überschrieben. Ein Request, der sie genau dann las, fand sie leer und war abgemeldet. Jetzt wird sie atomar ersetzt.
  • Entf löschte keine Form, die in der Formenliste von Vector Art gewählt war. Entf läuft jetzt über removeSelection, mit einem Fall je Auswahlart. Fehlt einer, schlägt der Typcheck an.

Ungereimtheiten, angeglichen

  • Esc in einer Frage wirkt wie ihr Cancel. Cancel bei „Delete project?“ und „Restore snapshot?“ führt jetzt zurück zum Picker bzw. zur Liste, wie es die anderen Fragen schon taten. Nach dem Löschen eines Projekts steht wieder der Picker da.
  • Beschriftungen durchgehend amerikanisch (color, center), passend zu den Port-Namen, wie du es gewählt hast: 48 britische Schreibungen in 45 Zeilen.
  • Wie ein Objekt heißt: objectName und groupName ersetzen elf Kopien von „eigener Name, sonst der des Assets“ und drei von „Group“. Eine Kopie fiel auf die Objekt-Id zurück statt auf ?.

Doppelter Code

jscpd (mindestens 50 Tokens), HEAD gegen neuen Stand mit derselben Einstellung: in api 23 Klone / 228 Zeilen → 0. In src bleibt es bei 22 Klonen / 271 Zeilen, die Helfer dieser Runde lagen unter der Schwelle.

  • routeFiles bedient Bilder, Fonts und Sounds statt drei Kopien. HashedFileStore enthält, was die drei Stores gemeinsam hatten: Ablegen unter dem Hash samt Namen, Auflisten, Löschen. Die Stores behalten nur, welche Bytes sie annehmen und was ein Eintrag zusätzlich sagt. Beleg: alte und neue Stores liefern für die Ordner am Server und für Ablegen/Auflisten/Löschen in einem Wegwerf-Ordner byte-gleiche Ausgaben.
  • AtomicFile ersetzt neun Kopien von „Temp-Datei plus Umbenennen“.
  • removeShapes ist der eine Weg, auf dem Leinwand, Inspector-Knopf und Entf Formen entfernen.

Toter Code

  • GraphInterpreter.fire riefen nur Tests auf. Die 54 Aufrufe nutzen jetzt einen Helfer in tests/helpers.ts.
  • FileStore.delete, HttpFileStore.delete und der Typ PluginApi waren unbenutzt.
  • Geprüft und bewusst behalten: solidCells nutzen nur Tests, es ist aber die Zellen-Sicht vor dem Zusammenfassen zu Rechtecken und die einzige Stelle, an der sich „der größte Maßstab gewinnt“ prüfen lässt.

Weitere Prüfungen ohne Fund

  • Undo: Alle 124 Befehle kommen in den Unit-Tests vor. Ein Prüfer hat bei jedem den Projektstand vor dem Befehl mit dem nach dem Undo verglichen. Unterschiede gibt es nur bei leeren ports-, groups- und notes-Listen, wo vorher keine waren. Das Dateiformat lässt sie ohnehin weg.
  • Strenge Lint-Regeln (prefer-nullish-coalescing, switch-exhaustiveness-check, no-deprecated): 25 Treffer. Vier ||-Treffer auf Namen haben zu objectName geführt. Die übrigen sind gewollt (Schutzmuster (x && y) || Ersatz, leerer String als „nichts“, switch mit bewusstem default) oder Fehlalarm (name in GroupNameDialog ist der Konstruktor-Parameter, nicht window.name).
  • Abos und Timer: Verworfene Abmeldungen (state.on(...) ohne gemerkte Rückgabe) betreffen nur Objekte, die einmal pro Editor oder Sitzung entstehen. Der einzige setInterval (das Blinken des Cursors im Textfeld) endet mit der Eingabe und beim Zerstören des Felds.

Kommentare und Doku

  • Ein Doc-Kommentar in actions.ts stand über der falschen Funktion.
  • README: die Check-Summe.
  • Wiki 7995918:
    • API: nur Admins löschen Dateien, 422 für falsche Bytes, Dateirechte, Sperrdatei. Der Satz „There is no authentication yet; data/ is world-readable“ war veraltet.
    • Home: Unter „Not yet“ standen Load scene, die Anmeldung und Gruppen/Kommentare im Graph. Die gibt es alle längst.
    • Concepts, Keyboard, Vector art, Architecture, Development: das neue Verhalten und die neuen Bausteine.
    • Acht Seiten zeigten Giteas Warnbox für mehrdeutige Zeichen (38 Zeichen). Jetzt keine mehr.

Tests

./check.sh                       → 195 Files, 2817 Tests, CHECK EXIT 0   (+2 Namens-Helfer)
PHP accounts / snapshots / releases → 52 (53 im CI-Image mit Race-Test) / 15 / 20
voller e2e-Lauf (lokal)          → ALL PASSED – 1586 checks   (+6 in 12, 47, 49, 50)
smoke jumprun / tetris / actor   → 24 / 19 / 21 checks

Die Projektdateien der drei Beispielspiele habe ich vorher gesichert und danach byte-genau zurückgelegt (cmp).

Gegenproben, alle greifen:

  • 500 statt 422 → 12 fällt. Ohne Admin-Prüfung → 49 fällt.
  • Sperrdatei wieder löschen → Race-Test verliert in 3 von 3 Läufen Speichervorgänge (151–170 statt 321).
  • Entf ignoriert Formen → 47 fällt. Esc schließt nur → 50 fällt.
  • shape-Fall entfernt → Typcheck bricht ab (TS2366).
  • Danach Originalstand neu gebaut, Bundle md5-gleich mit dem Stand des vollen Laufs.

Nebenbei geklärt: Ein Gegenproben-Lauf hing einmal an CDP Network.enable. Ursache war der Test, nicht der Code. Modul 12 endete mit einem ungespeicherten Undo, und der Autosave hielt die Navigation in 49 per beforeunload an. Modul 12 wartet jetzt am Ende auf das Speichern.

Den CI-Lauf zu 14972d0 habe ich nicht abgewartet. Das Issue bleibt offen (wiederkehrend).

## Runde 8 — `14972d0` Umfang: alles seit Runde 7 (`bc688f3`). Neu im Issue ist der Zusatz, dass gefundene Bugs und kleine Ungereimtheiten gleich mit behoben werden. Deshalb ändert diese Runde anders als die vorigen an einigen Stellen das Verhalten. Die Befunde zum Kachel-Löschen stehen als eigenes Issue in #268 (high prio). ### Bugs, behoben - **Projekt- und Snapshot-Dateien waren ohne Anmeldung abrufbar.** nginx lieferte `data/projects/<id>.json` statisch aus (200), wer eine Projekt-Id kannte, kam an der Anmeldung vorbei. Jetzt schreibt die API jede Datei über `AtomicFile` (Temp-Datei, Modus, Umbenennen). Projekte, Snapshots, Releases, Konten und Sessions haben Modus 0640, nginx antwortet 403. Den Bestand am Server habe ich nachgezogen. - **Jedes Konto konnte geteilte Bilder, Fonts und Sounds löschen**, obwohl Projekte anderer Konten sie tragen können. Löschen dürfen jetzt nur Admins (403 sonst). Der Editor hat nie gelöscht, das `delete` im Client ist weg. - **Zwei Speichervorgänge auf ein Projekt konnten gleichzeitig laufen.** Die Sperrdatei wurde nach jedem Speichern gelöscht, dadurch sperrten ein wartender und der nächste Vorgang verschiedene Dateien. Die Sperrdatei bleibt jetzt liegen, und auch das Löschen eines Projekts nimmt die Sperre. - **Ein Upload, der kein Bild ist, bekam 500 statt 422.** Der Fehler-Handler warf auch bei Warnungen, die mit `@` stumm geschaltet waren. - **Session-Datei wurde an Ort und Stelle überschrieben.** Ein Request, der sie genau dann las, fand sie leer und war abgemeldet. Jetzt wird sie atomar ersetzt. - **Entf löschte keine Form, die in der Formenliste von Vector Art gewählt war.** Entf läuft jetzt über `removeSelection`, mit einem Fall je Auswahlart. Fehlt einer, schlägt der Typcheck an. ### Ungereimtheiten, angeglichen - **Esc in einer Frage wirkt wie ihr Cancel.** Cancel bei „Delete project?“ und „Restore snapshot?“ führt jetzt zurück zum Picker bzw. zur Liste, wie es die anderen Fragen schon taten. Nach dem Löschen eines Projekts steht wieder der Picker da. - **Beschriftungen durchgehend amerikanisch** (color, center), passend zu den Port-Namen, wie du es gewählt hast: 48 britische Schreibungen in 45 Zeilen. - **Wie ein Objekt heißt:** `objectName` und `groupName` ersetzen elf Kopien von „eigener Name, sonst der des Assets“ und drei von „Group“. Eine Kopie fiel auf die Objekt-Id zurück statt auf `?`. ### Doppelter Code `jscpd` (mindestens 50 Tokens), `HEAD` gegen neuen Stand mit derselben Einstellung: in `api` **23 Klone / 228 Zeilen → 0**. In `src` bleibt es bei 22 Klonen / 271 Zeilen, die Helfer dieser Runde lagen unter der Schwelle. - `routeFiles` bedient Bilder, Fonts und Sounds statt drei Kopien. `HashedFileStore` enthält, was die drei Stores gemeinsam hatten: Ablegen unter dem Hash samt Namen, Auflisten, Löschen. Die Stores behalten nur, welche Bytes sie annehmen und was ein Eintrag zusätzlich sagt. Beleg: alte und neue Stores liefern für die Ordner am Server und für Ablegen/Auflisten/Löschen in einem Wegwerf-Ordner byte-gleiche Ausgaben. - `AtomicFile` ersetzt neun Kopien von „Temp-Datei plus Umbenennen“. - `removeShapes` ist der eine Weg, auf dem Leinwand, Inspector-Knopf und Entf Formen entfernen. ### Toter Code - `GraphInterpreter.fire` riefen nur Tests auf. Die 54 Aufrufe nutzen jetzt einen Helfer in `tests/helpers.ts`. - `FileStore.delete`, `HttpFileStore.delete` und der Typ `PluginApi` waren unbenutzt. - Geprüft und bewusst behalten: `solidCells` nutzen nur Tests, es ist aber die Zellen-Sicht vor dem Zusammenfassen zu Rechtecken und die einzige Stelle, an der sich „der größte Maßstab gewinnt“ prüfen lässt. ### Weitere Prüfungen ohne Fund - **Undo:** Alle 124 Befehle kommen in den Unit-Tests vor. Ein Prüfer hat bei jedem den Projektstand vor dem Befehl mit dem nach dem Undo verglichen. Unterschiede gibt es nur bei leeren `ports`-, `groups`- und `notes`-Listen, wo vorher keine waren. Das Dateiformat lässt sie ohnehin weg. - **Strenge Lint-Regeln** (`prefer-nullish-coalescing`, `switch-exhaustiveness-check`, `no-deprecated`): 25 Treffer. Vier `||`-Treffer auf Namen haben zu `objectName` geführt. Die übrigen sind gewollt (Schutzmuster `(x && y) || Ersatz`, leerer String als „nichts“, `switch` mit bewusstem `default`) oder Fehlalarm (`name` in `GroupNameDialog` ist der Konstruktor-Parameter, nicht `window.name`). - **Abos und Timer:** Verworfene Abmeldungen (`state.on(...)` ohne gemerkte Rückgabe) betreffen nur Objekte, die einmal pro Editor oder Sitzung entstehen. Der einzige `setInterval` (das Blinken des Cursors im Textfeld) endet mit der Eingabe und beim Zerstören des Felds. ### Kommentare und Doku - Ein Doc-Kommentar in `actions.ts` stand über der falschen Funktion. - README: die Check-Summe. - Wiki `7995918`: - *API*: nur Admins löschen Dateien, 422 für falsche Bytes, Dateirechte, Sperrdatei. Der Satz „There is no authentication yet; `data/` is world-readable“ war veraltet. - *Home*: Unter „Not yet“ standen `Load scene`, die Anmeldung und Gruppen/Kommentare im Graph. Die gibt es alle längst. - *Concepts*, *Keyboard*, *Vector art*, *Architecture*, *Development*: das neue Verhalten und die neuen Bausteine. - Acht Seiten zeigten Giteas Warnbox für mehrdeutige Zeichen (38 Zeichen). Jetzt keine mehr. ### Tests ``` ./check.sh → 195 Files, 2817 Tests, CHECK EXIT 0 (+2 Namens-Helfer) PHP accounts / snapshots / releases → 52 (53 im CI-Image mit Race-Test) / 15 / 20 voller e2e-Lauf (lokal) → ALL PASSED – 1586 checks (+6 in 12, 47, 49, 50) smoke jumprun / tetris / actor → 24 / 19 / 21 checks ``` Die Projektdateien der drei Beispielspiele habe ich vorher gesichert und danach byte-genau zurückgelegt (`cmp`). Gegenproben, alle greifen: - 500 statt 422 → 12 fällt. Ohne Admin-Prüfung → 49 fällt. - Sperrdatei wieder löschen → Race-Test verliert in 3 von 3 Läufen Speichervorgänge (151–170 statt 321). - Entf ignoriert Formen → 47 fällt. Esc schließt nur → 50 fällt. - `shape`-Fall entfernt → Typcheck bricht ab (TS2366). - Danach Originalstand neu gebaut, Bundle md5-gleich mit dem Stand des vollen Laufs. Nebenbei geklärt: Ein Gegenproben-Lauf hing einmal an `CDP Network.enable`. Ursache war der Test, nicht der Code. Modul 12 endete mit einem ungespeicherten Undo, und der Autosave hielt die Navigation in 49 per `beforeunload` an. Modul 12 wartet jetzt am Ende auf das Speichern. Den CI-Lauf zu `14972d0` habe ich nicht abgewartet. Das Issue bleibt offen (wiederkehrend).
admin moved this to Next in Development on 2026-10-03 15:38:53 +02:00
admin moved this to Persistent in Development on 2026-10-03 15:38:59 +02:00
admin moved this to Next in Development on 2026-10-03 15:51:39 +02:00
admin moved this to Persistent in Development on 2026-10-03 17:11:18 +02:00
Owner

Runde 9 — 808e1ee

Umfang: alles seit Runde 8 (14972d0), 62 Commits mit rund 29 000 neuen Zeilen in src, api, tools und tests. Verhalten unverändert. Dazu ein Fix an einem Check: CI zu a526e1b (#303) war rot.

Bug, behoben

  • e2e 04 zählte 25 Asset-Typen. Mit der Shader-Funktion aus #303 sind es 26. Drei Checks zum +-Menü fielen in CI-Task 481, die Smokes liefen dort deshalb nicht. Die Zahl steht jetzt einmal als ASSET_TYPE_COUNT oben im Modul. Ursache war ich: Bei einem neuen Asset-Typ gehört Modul 04 mitgefahren, das habe ich bei #303 nicht gemacht.

Doppelter Code

jscpd über src (mindestens 50 Tokens, ohne die zwei gleichen OFL-Lizenztexte), HEAD gegen neuen Stand mit derselben Einstellung: 35 Klone / 289 Zeilen → 29 / 232. api bleibt bei 0.

  • ShaderPicture (neu, src/viewport/shaderPicture.ts): das Bild, über das ein Kamera-Shader (#299) und ein Feld-Shader (#170) gelegt werden. Es behält die Render-Textur, solange die Größe gleich bleibt, und gibt eine ersetzte erst frei, wenn der Shader die neue hält. CameraShade und ParticleField.shadeField hatten das Zeile für Zeile doppelt.
  • CameraShade baut sein Mesh erst beim ersten Zeichnen. Vorher hat jedes Neuzeichnen einer Ansicht ohne Kamera-Shader ein Mesh gebaut und gleich wieder weggeworfen, im Game-Tab also jeden Frame. Das habe ich am Code gelesen, nicht gemessen.
  • emptyHost in inspector/host.ts: Inspector, Variables-Tab und Tilemap-Panel bauten ihren leeren Host je selbst.
  • paddedQuad(null) ist das schlichte Einheits-Quad. symbols.ts und shaderPasses.ts hatten es je von Hand ausgeschrieben.
  • nested.ts: Aufrufe von Shader-Funktionen und On behavior-Nodes folgen einem gemeinsamen Weg (reaches über die Ids, die namedBy sammelt).
  • Bewusst stehen gelassen: die Weiterleitung von CollisionSystem/PhysicsSystem an Solids und die Zeiger-Verdrahtung der Leinwände (wie in Runde 7), dazu kleine Klone unter zehn Zeilen.

Toter Code

Gemessen mit dem TS-LanguageService (Referenzen je Export und Klassen-Member, getrennt nach src und tests):

  • ShaderEditor.colorFieldOf und der Getter CurveCanvas.snapping hatten keinen Leser.
  • 22 Werte, die nur in ihrer eigenen Datei benutzt werden, haben kein export mehr. Typen und die Node-Kataloge von Shader und Partikeln bleiben exportiert.
  • Geprüft und behalten: PhysicsSystem.holdsJoint lesen nur Tests. Es ist aber ihre einzige Sicht darauf, ob ein Gelenk hält, wie solidCells in Runde 8.

Kommentare und Doku

  • Zehn Kommentare erzählten Geschichte („since #190“, „used to“, „any more“), sechs in src, vier in tools/e2e. Jetzt beschreiben sie den Ist-Stand. Beleg: Das Bundle ist md5-gleich, die vier e2e-Dateien sind nach esbuild gleich.
  • README: joint und shader function in der Asset-Liste, Gelenke in der Zeile Physics, was die Seite Shaders abdeckt, zwei CI-Runner statt einem.
  • screenshot.png (Bild in der README): neuer Screenshot vom Editor, 3840×2160 statt 1825×1140, von dir aufgenommen und auf deinen Wunsch mitcommittet.
  • Wiki 996b584:
    • Home: Structs und Curves fehlten in der Tabelle. „Not yet“ nannte noch „no nine-slice“, das gibt es seit #41. „The three accounts“ sind vier.
    • Architecture: storedList gibt es seit #238 nicht mehr (jetzt withoutObjects). Neu sind shaderPicture, shaderPasses, quadPadding und emptyHost.
    • Maschinell geprüft: Alle in Wiki und README genannten Dateien gibt es.

Weitere Prüfungen ohne Fund

  • Feld-Shader und Löschfarbe: Pixi löscht ohne clearColor mit der deckenden Hintergrundfarbe des Editors, das hätte einen grauen Rahmen ergeben. Das gilt aber nur für den Bildschirm. Eine Render-Textur wird durchsichtig gelöscht (defaultClearColor [0,0,0,0]). Kein Bug, und 31v bestätigt es.
  • Strengere Lint-Regeln über alle seit Runde 8 geänderten Dateien: 53 Treffer.
    • 36 prefer-optional-chain sind gleichwertige Schreibweisen (a && a.b), alle durchgesehen.
    • Gewollt sind die Schutzmuster (x && y) || Ersatz, mass || 1 mit begründendem Kommentar und switch mit bewusstem default. name in PreviewSplit ist ein Fehlalarm.
    • Geändert: PixelArtEditor.started ist readonly.

Tests (auf melektaus-atx)

Gate            → 229 Files, 3514 Tests, CHECK EXIT 0   (+3 emptyHost, +1 Einheits-Quad)
e2e 1-4,31,63   → ALL PASSED – 195 checks
  • In den 195 stecken die drei vorher roten Checks von Modul 04, der Feld-Shader (31v) und der Kamera-Shader (63e bis 63i), beide jetzt über ShaderPicture.
  • Kein neuer e2e-Check, die Summe bleibt 1728.
  • Kein voller Lauf und keine Smokes von mir, das übernimmt CI.

Gegenproben, alle greifen (jeweils per cp zurückgelegt, cmp gleich):

  • reaches geht nie weiter → 1 Test fällt (Selbstaufruf über eine zweite Funktion).
  • listensTo liest den falschen Parameter → 1 Test fällt.
  • emptyHost lässt weg, was das Panel mitgibt → 1 Test fällt. Ohne Relayout beim Falten → 1 Test fällt.
  • Eine Gegenprobe im Browser für ShaderPicture habe ich nicht gefahren. Beleg ist, dass 31v und 63 über den neuen Weg grün sind.

Den CI-Lauf zu 808e1ee habe ich nicht abgewartet. Das Issue bleibt offen (wiederkehrend).

## Runde 9 — `808e1ee` Umfang: alles seit Runde 8 (`14972d0`), 62 Commits mit rund 29 000 neuen Zeilen in `src`, `api`, `tools` und `tests`. Verhalten unverändert. Dazu ein Fix an einem Check: CI zu `a526e1b` (#303) war rot. ### Bug, behoben - **e2e 04 zählte 25 Asset-Typen.** Mit der Shader-Funktion aus #303 sind es 26. Drei Checks zum `+`-Menü fielen in CI-Task 481, die Smokes liefen dort deshalb nicht. Die Zahl steht jetzt einmal als `ASSET_TYPE_COUNT` oben im Modul. Ursache war ich: Bei einem neuen Asset-Typ gehört Modul 04 mitgefahren, das habe ich bei #303 nicht gemacht. ### Doppelter Code `jscpd` über `src` (mindestens 50 Tokens, ohne die zwei gleichen OFL-Lizenztexte), `HEAD` gegen neuen Stand mit derselben Einstellung: **35 Klone / 289 Zeilen → 29 / 232**. `api` bleibt bei 0. - **`ShaderPicture`** (neu, `src/viewport/shaderPicture.ts`): das Bild, über das ein Kamera-Shader (#299) und ein Feld-Shader (#170) gelegt werden. Es behält die Render-Textur, solange die Größe gleich bleibt, und gibt eine ersetzte erst frei, wenn der Shader die neue hält. `CameraShade` und `ParticleField.shadeField` hatten das Zeile für Zeile doppelt. - **`CameraShade` baut sein Mesh erst beim ersten Zeichnen.** Vorher hat jedes Neuzeichnen einer Ansicht ohne Kamera-Shader ein Mesh gebaut und gleich wieder weggeworfen, im Game-Tab also jeden Frame. Das habe ich am Code gelesen, nicht gemessen. - **`emptyHost`** in `inspector/host.ts`: Inspector, Variables-Tab und Tilemap-Panel bauten ihren leeren Host je selbst. - **`paddedQuad(null)`** ist das schlichte Einheits-Quad. `symbols.ts` und `shaderPasses.ts` hatten es je von Hand ausgeschrieben. - **`nested.ts`:** Aufrufe von Shader-Funktionen und `On behavior`-Nodes folgen einem gemeinsamen Weg (`reaches` über die Ids, die `namedBy` sammelt). - **Bewusst stehen gelassen:** die Weiterleitung von `CollisionSystem`/`PhysicsSystem` an `Solids` und die Zeiger-Verdrahtung der Leinwände (wie in Runde 7), dazu kleine Klone unter zehn Zeilen. ### Toter Code Gemessen mit dem TS-LanguageService (Referenzen je Export und Klassen-Member, getrennt nach `src` und `tests`): - `ShaderEditor.colorFieldOf` und der Getter `CurveCanvas.snapping` hatten keinen Leser. - 22 Werte, die nur in ihrer eigenen Datei benutzt werden, haben kein `export` mehr. Typen und die Node-Kataloge von Shader und Partikeln bleiben exportiert. - Geprüft und behalten: `PhysicsSystem.holdsJoint` lesen nur Tests. Es ist aber ihre einzige Sicht darauf, ob ein Gelenk hält, wie `solidCells` in Runde 8. ### Kommentare und Doku - Zehn Kommentare erzählten Geschichte („since #190“, „used to“, „any more“), sechs in `src`, vier in `tools/e2e`. Jetzt beschreiben sie den Ist-Stand. Beleg: Das Bundle ist md5-gleich, die vier e2e-Dateien sind nach esbuild gleich. - README: *joint* und *shader function* in der Asset-Liste, Gelenke in der Zeile *Physics*, was die Seite *Shaders* abdeckt, zwei CI-Runner statt einem. - `screenshot.png` (Bild in der README): neuer Screenshot vom Editor, 3840×2160 statt 1825×1140, von dir aufgenommen und auf deinen Wunsch mitcommittet. - Wiki `996b584`: - *Home*: *Structs* und *Curves* fehlten in der Tabelle. „Not yet“ nannte noch „no nine-slice“, das gibt es seit #41. „The three accounts“ sind vier. - *Architecture*: `storedList` gibt es seit #238 nicht mehr (jetzt `withoutObjects`). Neu sind `shaderPicture`, `shaderPasses`, `quadPadding` und `emptyHost`. - Maschinell geprüft: Alle in Wiki und README genannten Dateien gibt es. ### Weitere Prüfungen ohne Fund - **Feld-Shader und Löschfarbe:** Pixi löscht ohne `clearColor` mit der deckenden Hintergrundfarbe des Editors, das hätte einen grauen Rahmen ergeben. Das gilt aber nur für den Bildschirm. Eine Render-Textur wird durchsichtig gelöscht (`defaultClearColor` `[0,0,0,0]`). Kein Bug, und 31v bestätigt es. - **Strengere Lint-Regeln** über alle seit Runde 8 geänderten Dateien: 53 Treffer. - 36 `prefer-optional-chain` sind gleichwertige Schreibweisen (`a && a.b`), alle durchgesehen. - Gewollt sind die Schutzmuster `(x && y) || Ersatz`, `mass || 1` mit begründendem Kommentar und `switch` mit bewusstem `default`. `name` in `PreviewSplit` ist ein Fehlalarm. - Geändert: `PixelArtEditor.started` ist `readonly`. ### Tests (auf `melektaus-atx`) ``` Gate → 229 Files, 3514 Tests, CHECK EXIT 0 (+3 emptyHost, +1 Einheits-Quad) e2e 1-4,31,63 → ALL PASSED – 195 checks ``` - In den 195 stecken die drei vorher roten Checks von Modul 04, der Feld-Shader (31v) und der Kamera-Shader (63e bis 63i), beide jetzt über `ShaderPicture`. - Kein neuer e2e-Check, die Summe bleibt **1728**. - Kein voller Lauf und keine Smokes von mir, das übernimmt CI. Gegenproben, alle greifen (jeweils per `cp` zurückgelegt, `cmp` gleich): - `reaches` geht nie weiter → 1 Test fällt (Selbstaufruf über eine zweite Funktion). - `listensTo` liest den falschen Parameter → 1 Test fällt. - `emptyHost` lässt weg, was das Panel mitgibt → 1 Test fällt. Ohne Relayout beim Falten → 1 Test fällt. - Eine Gegenprobe im Browser für `ShaderPicture` habe ich nicht gefahren. Beleg ist, dass 31v und 63 über den neuen Weg grün sind. Den CI-Lauf zu `808e1ee` habe ich nicht abgewartet. Das Issue bleibt offen (wiederkehrend).
Owner

Runde 10 — 25084f8

Umfang: alles seit Runde 9 (808e1ee), 110 Commits mit rund 47 000 neuen Zeilen, fast alles Sound, Sound FX, Instrumente, Patterns und Songs. Verhalten unverändert.

Doppelter Code

jscpd über src (mindestens 50 Tokens, nur TypeScript), 808e1ee und jetziger Stand mit derselben Einstellung gemessen: 47 Klone / 426 Zeilen → 33 / 245. Runde 9 selbst endete nach dieser Zählung bei 22 / 160, der Zuwachs kam fast ganz aus dem Sound-Bereich.

  • PreviewParams (neu, editor/soundfx/PreviewParams.ts): die Parameter-Leiste im Kopf von Sound-FX- und Instrument-Tab, also Werte, Defaults, Felder und die Stimmen, die ein verschobenes Feld erreicht. Beide Tabs hatten sie Zeile für Zeile.
  • Audio-Worklet: Eine Basis Effect trägt Bitcrusher, Phaser, Flanger, Limiter, LFO und den Pitch eines Busses, eine Basis Source den Pitch-Player und den Chip. Start ist das eine Warten auf den ersten Sample einer Stimme, das vier Prozessoren je ausgeschrieben hatten. 378 → 329 Zeilen.
  • Ports der Sound-Nodes: checkPort, detachedPort, fxParamsPort und letRingPort in nodes/shared.ts. Die Play- und Stop-Nodes von Sound, Note, Pattern und Song hatten jeden Port bis zu fünfmal ausgeschrieben.
  • parameterValues baut Sound FX parameters und Instrument parameters, die sich nur in Name und Text unterschieden.
  • SetLoopCommand setzt den Loop des Lineals bei Pattern und Song und ersetzt SetPatternLoopCommand und SetSongLoopCommand.
  • addLink in music/routing.ts ist die eine Regel für einen Link, die Song-Routing und Master routing beide hatten.
  • eqCurves rechnet jedes Band und die Summe für den EQ-Tab. Das stand vorher im Zeichencode und ist jetzt prüfbar. Es ersetzt eqCurveDb, das nur ein Test aufrief.
  • Kleinere: die acht Nachbarrichtungen einer Kachel-Zelle, drawFloatingBox für den Kasten mit Schatten von Popup und FloatWindow.
  • Bewusst stehen gelassen: Play pattern und Play song bleiben zwei parallele Node-Definitionen, und Klone unter zehn Zeilen bleiben.

Architektur

  • SoundLibrary.ts von 2897 auf 2188 Zeilen. Was eine Stufe eines Sound FX als Web-Audio-Nodes wird und wie sich die Knöpfe einer spielenden Stimme bewegen, steht jetzt in viewport/fxNodes.ts. Nichts davon hält Zustand der Library. debugHook und der Unit-Test importieren direkt von dort.

Toter Code

Gemessen mit dem TS-LanguageService (Referenzen je Export und Klassen-Member):

  • soundRefIds, LFO_SHAPE_INDEX, TREMOLO_ROWS, VIBRATO_ROWS und REVERB_ROWS hatten keinen Leser. Die vier Routing-Nodes werden ohne ungenutzten exportierten Namen angemeldet.
  • soundFileOf und portTypeOf riefen nur Tests auf. Die Tests fragen jetzt findSound und portOf, die auch der Editor nutzt. DRY wandert aus src in den einen Test, der es braucht.
  • 51 Werte, die nur in ihrer eigenen Datei benutzt werden, haben kein export mehr. Typen und die Node-Kataloge bleiben exportiert.
  • Geprüft und behalten: neighboursOf ist das Zelle-für-Zelle-Lesen, gegen das der Test das indizierte neighboursIn prüft. PitchShifter.latency ist die einzige Sicht des Tests darauf, wie spät der Shifter ist.
  • Fehlalarme wie gehabt: process/parameterDescriptors der Worklet-Prozessoren ruft der Browser, show/saveView/restoreView der Leinwände kommen über TabCanvas.

Kommentare und Doku

  • Sieben Kommentare erzählten Geschichte („no longer“, „any more“, „as before“, „of before #354“), neun Kommentarblöcke liefen weit über die Zeilenbreite. Beleg, dass sich dabei kein Code geändert hat: Das Bundle war md5-gleich, die sechs berührten Test- und e2e-Dateien waren nach esbuild gleich.
  • README: sound FX, instrument, pattern, song und bus in der Asset-Liste, die Seiten Instruments, Patterns und Songs in der Tabelle, 1919 statt 1744 Checks.
  • Wiki 1395c56:
    • Architecture: Für src/core/soundfx, src/core/instrument, src/editor/sound, src/editor/soundfx, src/editor/instrument und src/editor/routing gab es keine Zeile. src/core/music nannte 5 seiner 15 Module. Das Worklet hieß noch pitchWorklet. Neu sind fxNodes, PreviewParams, nodes/shared, addLink und drawFloatingBox.
    • Home: „Sound has no mixer, no fade“ stimmt seit Bussen, Master routing und den Fades der Songs nicht mehr. Die Zeilen zu Sounds und Songs nennen, was die Seiten jetzt abdecken.
    • Songs: Ein neuer Song rastet seit #365 auf 1/16 ein, die Einleitung sagte noch „to the bar“. Unter Not yet standen der Reverb (#328) und ein Bus ohne Sound FX, beides gibt es.
    • Instruments: Unter Not yet stand der Phaser (#341), den gibt es.
    • Swing verweist jetzt auf #372, das Ende eines Songs auf #373.
    • Maschinell geprüft: Alle in Wiki und README genannten Dateien und Ordner gibt es.

Tests (auf melektaus-atx)

Gate            → 274 Files, 4236 Tests, CHECK EXIT 0
e2e 34,64,65    → ALL PASSED – 180 checks
Unit (lokal)    → 16 Dateien der berührten Bereiche, 804 Tests
  • Kein neuer e2e-Check, die Summe bleibt 1919.
  • Kein voller Lauf und keine Smokes von mir, das übernimmt CI.

Gegenproben, alle greifen (jeweils per cp zurückgelegt, cmp gleich):

  • addLink ohne die Schleifenregel → 2 Tests fallen, einer je Routing.
  • eqCurves mit der Summe nur des letzten Bandes → 1 Test fällt.
  • Start im Worklet wartet nie → e2e 34 fällt in genau den vier Checks, die am ersten Sample einer Stimme hängen (Flanger, Tremolo, Chip, ein vorausgeplanter Pitch-Ton). Gelaufen nur im Container, live gebaut wurde diese Fassung nicht.

Den CI-Lauf zu 25084f8 habe ich nicht abgewartet. Das Issue bleibt offen (wiederkehrend).

## Runde 10 — `25084f8` Umfang: alles seit Runde 9 (`808e1ee`), 110 Commits mit rund 47 000 neuen Zeilen, fast alles Sound, Sound FX, Instrumente, Patterns und Songs. Verhalten unverändert. ### Doppelter Code `jscpd` über `src` (mindestens 50 Tokens, nur TypeScript), `808e1ee` und jetziger Stand mit derselben Einstellung gemessen: **47 Klone / 426 Zeilen → 33 / 245**. Runde 9 selbst endete nach dieser Zählung bei 22 / 160, der Zuwachs kam fast ganz aus dem Sound-Bereich. - **`PreviewParams`** (neu, `editor/soundfx/PreviewParams.ts`): die Parameter-Leiste im Kopf von Sound-FX- und Instrument-Tab, also Werte, Defaults, Felder und die Stimmen, die ein verschobenes Feld erreicht. Beide Tabs hatten sie Zeile für Zeile. - **Audio-Worklet:** Eine Basis `Effect` trägt Bitcrusher, Phaser, Flanger, Limiter, LFO und den Pitch eines Busses, eine Basis `Source` den Pitch-Player und den Chip. `Start` ist das eine Warten auf den ersten Sample einer Stimme, das vier Prozessoren je ausgeschrieben hatten. 378 → 329 Zeilen. - **Ports der Sound-Nodes:** `checkPort`, `detachedPort`, `fxParamsPort` und `letRingPort` in `nodes/shared.ts`. Die Play- und Stop-Nodes von Sound, Note, Pattern und Song hatten jeden Port bis zu fünfmal ausgeschrieben. - **`parameterValues`** baut *Sound FX parameters* und *Instrument parameters*, die sich nur in Name und Text unterschieden. - **`SetLoopCommand`** setzt den Loop des Lineals bei Pattern und Song und ersetzt `SetPatternLoopCommand` und `SetSongLoopCommand`. - **`addLink`** in `music/routing.ts` ist die eine Regel für einen Link, die Song-Routing und Master routing beide hatten. - **`eqCurves`** rechnet jedes Band und die Summe für den EQ-Tab. Das stand vorher im Zeichencode und ist jetzt prüfbar. Es ersetzt `eqCurveDb`, das nur ein Test aufrief. - **Kleinere:** die acht Nachbarrichtungen einer Kachel-Zelle, `drawFloatingBox` für den Kasten mit Schatten von `Popup` und `FloatWindow`. - **Bewusst stehen gelassen:** *Play pattern* und *Play song* bleiben zwei parallele Node-Definitionen, und Klone unter zehn Zeilen bleiben. ### Architektur - **`SoundLibrary.ts` von 2897 auf 2188 Zeilen.** Was eine Stufe eines Sound FX als Web-Audio-Nodes wird und wie sich die Knöpfe einer spielenden Stimme bewegen, steht jetzt in `viewport/fxNodes.ts`. Nichts davon hält Zustand der Library. `debugHook` und der Unit-Test importieren direkt von dort. ### Toter Code Gemessen mit dem TS-LanguageService (Referenzen je Export und Klassen-Member): - `soundRefIds`, `LFO_SHAPE_INDEX`, `TREMOLO_ROWS`, `VIBRATO_ROWS` und `REVERB_ROWS` hatten keinen Leser. Die vier Routing-Nodes werden ohne ungenutzten exportierten Namen angemeldet. - `soundFileOf` und `portTypeOf` riefen nur Tests auf. Die Tests fragen jetzt `findSound` und `portOf`, die auch der Editor nutzt. `DRY` wandert aus `src` in den einen Test, der es braucht. - 51 Werte, die nur in ihrer eigenen Datei benutzt werden, haben kein `export` mehr. Typen und die Node-Kataloge bleiben exportiert. - Geprüft und behalten: `neighboursOf` ist das Zelle-für-Zelle-Lesen, gegen das der Test das indizierte `neighboursIn` prüft. `PitchShifter.latency` ist die einzige Sicht des Tests darauf, wie spät der Shifter ist. - Fehlalarme wie gehabt: `process`/`parameterDescriptors` der Worklet-Prozessoren ruft der Browser, `show`/`saveView`/`restoreView` der Leinwände kommen über `TabCanvas`. ### Kommentare und Doku - Sieben Kommentare erzählten Geschichte („no longer“, „any more“, „as before“, „of before #354“), neun Kommentarblöcke liefen weit über die Zeilenbreite. Beleg, dass sich dabei kein Code geändert hat: Das Bundle war md5-gleich, die sechs berührten Test- und e2e-Dateien waren nach esbuild gleich. - README: *sound FX*, *instrument*, *pattern*, *song* und *bus* in der Asset-Liste, die Seiten *Instruments*, *Patterns* und *Songs* in der Tabelle, 1919 statt 1744 Checks. - Wiki `1395c56`: - *Architecture*: Für `src/core/soundfx`, `src/core/instrument`, `src/editor/sound`, `src/editor/soundfx`, `src/editor/instrument` und `src/editor/routing` gab es keine Zeile. `src/core/music` nannte 5 seiner 15 Module. Das Worklet hieß noch `pitchWorklet`. Neu sind `fxNodes`, `PreviewParams`, `nodes/shared`, `addLink` und `drawFloatingBox`. - *Home*: „Sound has no mixer, no fade“ stimmt seit Bussen, Master routing und den Fades der Songs nicht mehr. Die Zeilen zu *Sounds* und *Songs* nennen, was die Seiten jetzt abdecken. - *Songs*: Ein neuer Song rastet seit #365 auf 1/16 ein, die Einleitung sagte noch „to the bar“. Unter *Not yet* standen der Reverb (#328) und ein Bus ohne Sound FX, beides gibt es. - *Instruments*: Unter *Not yet* stand der Phaser (#341), den gibt es. - Swing verweist jetzt auf #372, das Ende eines Songs auf #373. - Maschinell geprüft: Alle in Wiki und README genannten Dateien und Ordner gibt es. ### Tests (auf `melektaus-atx`) ``` Gate → 274 Files, 4236 Tests, CHECK EXIT 0 e2e 34,64,65 → ALL PASSED – 180 checks Unit (lokal) → 16 Dateien der berührten Bereiche, 804 Tests ``` - Kein neuer e2e-Check, die Summe bleibt **1919**. - Kein voller Lauf und keine Smokes von mir, das übernimmt CI. Gegenproben, alle greifen (jeweils per `cp` zurückgelegt, `cmp` gleich): - `addLink` ohne die Schleifenregel → 2 Tests fallen, einer je Routing. - `eqCurves` mit der Summe nur des letzten Bandes → 1 Test fällt. - `Start` im Worklet wartet nie → e2e 34 fällt in genau den vier Checks, die am ersten Sample einer Stimme hängen (Flanger, Tremolo, Chip, ein vorausgeplanter Pitch-Ton). Gelaufen nur im Container, live gebaut wurde diese Fassung nicht. Den CI-Lauf zu `25084f8` habe ich nicht abgewartet. Das Issue bleibt offen (wiederkehrend).
Owner

Runde 11 — 41af1a6

Umfang: alles seit Runde 10 (25084f8). Das ist ein einziger Commit, 6873776: die Mini-Kurve im EQ-Node (#375) und das Spektrum im EQ-Tab (#374). Am Verhalten hat sich nichts geändert.

Doppelter Code

jscpd 4.3.0 über src (mindestens 50 Tokens, nur TypeScript), wie in Runde 10, 25084f8 und jetziger Stand mit derselben Einstellung gemessen: 33 Klone / 249 Zeilen vorher wie nachher. Die beiden Issues haben keinen neuen Klon gebracht.

  • Runde 10 hatte nach dieser Zählung 33 / 245 gemeldet. Die 4 Zeilen Unterschied kommen aus der Messung damals, nicht aus neuem Code: 25084f8 selbst ergibt heute 249.
  • Die heutige jscpd-Version (5.4.1) zählt anders, für den Vergleich habe ich deshalb die alte genommen.

Toter Code

Gemessen mit dem TS-LanguageService (Referenzen je Export und Klassen-Member), neu gegenüber Runde 10:

  • eqBandDb riefen nur noch Tests auf. Die Funktion ist weg, die Tests fragen jetzt eqBandResponse, das auch die Kurven von Tab und Node rechnet.
  • eqPictureShapes und SPECTRUM_SIZE werden nur in ihrer eigenen Datei benutzt und haben kein export mehr.
  • Geprüft und behalten:
    • Die Mitglieder von EqCurve ruft die Tab-Klasse in derselben Datei auf.
    • render, process und cut der Worklet-Prozessoren sind wie in Runde 10 Fehlalarme.
    • StageNodes ist ein Typ, Typen bleiben exportiert.

Kommentare und Doku

  • Kein Kommentar der beiden Issues erzählt Geschichte oder läuft über die Zeilenbreite.
  • README und Wiki hatte schon 6873776 nachgezogen. Maschinell geprüft: Alle in Wiki und README genannten Pfade gibt es.

Tests (auf melektaus-atx)

Bundle          → md5-gleich vor und nach der Runde
Gate            → 275 Files, 4247 Tests, CHECK EXIT 0
Unit (lokal)    → 2 Dateien der berührten Bereiche, 14 Tests
  • Weil das Bundle md5-gleich ist, lief kein e2e. Die Summe bleibt 1921.
  • Kein voller Lauf und keine Smokes von mir, das übernimmt CI.

Den CI-Lauf zu 41af1a6 habe ich nicht abgewartet. Das Issue bleibt offen (wiederkehrend).

## Runde 11 — `41af1a6` Umfang: alles seit Runde 10 (`25084f8`). Das ist ein einziger Commit, `6873776`: die Mini-Kurve im EQ-Node (#375) und das Spektrum im EQ-Tab (#374). Am Verhalten hat sich nichts geändert. ### Doppelter Code `jscpd` 4.3.0 über `src` (mindestens 50 Tokens, nur TypeScript), wie in Runde 10, `25084f8` und jetziger Stand mit derselben Einstellung gemessen: **33 Klone / 249 Zeilen vorher wie nachher**. Die beiden Issues haben keinen neuen Klon gebracht. - Runde 10 hatte nach dieser Zählung 33 / 245 gemeldet. Die 4 Zeilen Unterschied kommen aus der Messung damals, nicht aus neuem Code: `25084f8` selbst ergibt heute 249. - Die heutige jscpd-Version (5.4.1) zählt anders, für den Vergleich habe ich deshalb die alte genommen. ### Toter Code Gemessen mit dem TS-LanguageService (Referenzen je Export und Klassen-Member), neu gegenüber Runde 10: - `eqBandDb` riefen nur noch Tests auf. Die Funktion ist weg, die Tests fragen jetzt `eqBandResponse`, das auch die Kurven von Tab und Node rechnet. - `eqPictureShapes` und `SPECTRUM_SIZE` werden nur in ihrer eigenen Datei benutzt und haben kein `export` mehr. - Geprüft und behalten: - Die Mitglieder von `EqCurve` ruft die Tab-Klasse in derselben Datei auf. - `render`, `process` und `cut` der Worklet-Prozessoren sind wie in Runde 10 Fehlalarme. - `StageNodes` ist ein Typ, Typen bleiben exportiert. ### Kommentare und Doku - Kein Kommentar der beiden Issues erzählt Geschichte oder läuft über die Zeilenbreite. - README und Wiki hatte schon `6873776` nachgezogen. Maschinell geprüft: Alle in Wiki und README genannten Pfade gibt es. ### Tests (auf `melektaus-atx`) ``` Bundle → md5-gleich vor und nach der Runde Gate → 275 Files, 4247 Tests, CHECK EXIT 0 Unit (lokal) → 2 Dateien der berührten Bereiche, 14 Tests ``` - Weil das Bundle md5-gleich ist, lief kein e2e. Die Summe bleibt **1921**. - Kein voller Lauf und keine Smokes von mir, das übernimmt CI. Den CI-Lauf zu `41af1a6` habe ich nicht abgewartet. Das Issue bleibt offen (wiederkehrend).
Owner

Runde 12 — 0701fe3

Umfang: alles seit Runde 11 (41af1a6), vor allem die Sound-FX-Geräte (#379 bis #401), Video (#402 ff.), Aufnahme (#405 ff.), Composition (#417 ff.) und die Tilemap-Flicken (#347, #348, #424). Am Verhalten hat sich nichts geändert, mit einer Ausnahme (siehe unten, Chip). In src sind es netto 816 Zeilen weniger (78 Dateien geändert, 5 neu).

Doppelter Code

jscpd 4.3.0 über src (mindestens 50 Tokens, nur TypeScript), gleiche Einstellung wie in Runde 11:

Stand Klone doppelte Zeilen Anteil
Runde 11 (41af1a6) 33 249 0,26 %
vor dieser Runde (df6dbe9) 140 1263 1,05 %
nach dieser Runde 57 416 0,35 %

Rund 950 der neuen Klonzeilen lagen in editor/soundfx, also in den Panels und Faces der Geräte.

  • editor/soundfx/deviceParts.ts (neu): Kopf, Knopfreihen, Bildschirm-Stil und das Reihen-Layout für Gruppen von Knöpfen. Compressor, Saturation, Crusher, Limiter, Delay, Reverb, Chip, Acid, Envelope, Sample, Modulation und Knob bauen ihr Panel damit. panel.knobs bleibt, weil die Debug-Hooks es lesen.
  • editor/soundfx/deviceFace.ts (neu): Basisklasse der zwölf Faces. Sie findet den Knoten und übernimmt wired, preview, commit, set, hide, Nachladen und Abhören. compressorWired heißt dort paramWired.
  • ui/textPool.ts (neu): „Texte bei Bedarf anlegen, überzählige verstecken“ stand zehnmal da, in Wave- und Video-Tab, TimeRuler, dem Lineal der Animation, den Tastennamen im Piano Roll und in Song- und Composition-Timeline. Dazu editor/sound/clipStrip.ts, der Beschriftungsstreifen, den Wave- und Video-Tab teilen.
  • core/util/bytes.ts (neu): das concat, das ogg, matroska und avcColour je ausgeschrieben hatten.
  • Bewusst stehen gelassen: AnimationEditor und CompositionEditor teilen nur den Play-Knopf, eine Zwischenklasse dafür wäre mehr Schicht als Gewinn. Die Curve-Panels sind anders gebaut.
  • Die eine Verhaltensänderung: Chip setzt seine Boxen jetzt über put, also gerundet. Nachgemessen: Sie waren schon ganzzahlig. Die drei umgestellten Reihen-Layouts sind vorher und nachher byte-gleich (Boxen als JSON, cmp).

Toter Code

Gemessen mit dem TS-LanguageService, verglichen mit der Liste aus Runde 11 nach Datei und Name:

  • clear an den Video-Playern: seit #402 nie aufgerufen. endRun macht die Player absichtlich wieder zu Vorschauen.
  • posterFileOf und videoTimeAt: nur noch Tests riefen sie auf. Der Picker nimmt den Poster-Pfad vom Server.
  • easeOut war dasselbe wie glide(t, 3). Der Test fragt jetzt glide.
  • Die Paste-Funktionen der Composition sind vereinfacht (framesToRoom).
  • Werte, die nur in ihrer eigenen Datei gebraucht werden, haben kein export mehr.
  • Geprüft und behalten: Scheduler.done wird als ungenutzt gemeldet, erfüllt aber das Runner-Interface. Typen bleiben exportiert.

Kommentare und Doku

  • Kommentare über 125 Zeichen sind auf die Breite ihrer Nachbarzeilen umgebrochen. Kommentare, die Geschichte erzählen („as before“, „used to“), sagen jetzt, was ist, in src und in den e2e-Modulen.
  • Wiki (9a28ec8): Architecture nennt die Ordner und Dateien, die seit Runde 11 dazugekommen sind, darunter core/recording/ und editor/composition/. Home verlinkt Videos. Maschinell geprüft: Alle Pfade, die Wiki und README nennen, gibt es.
  • README: Die Asset-Liste nennt jetzt auch video und composition und deckt damit alle 33 Typen ab. In der Seitentabelle stehen Videos und Compositions.
  • Nicht angefasst: In der README stehen noch Gedankenstriche. #416 betraf nur das Wiki.

Tests

Gate (melektaus-atx)                    → 313 Files, 4835 Tests, CHECK EXIT 0
Unit stein2 (core, editor, ui, soundfx) → grün
e2e 25, 34, 64, 65, 66, 69 (atx)        → ALL PASSED, 330 Checks
  • Gegenproben: TextPool ohne das Behalten der Texte und framesToRoom ohne Ausweichen werden beide rot.
  • Kein voller Lauf und keine Smokes von mir, das übernimmt CI.

Nebenbei: CI zu df6dbe9 war rot

suite (Task 697) hatte 3 FAIL in e2e 68, keiner davon in einem Bereich dieser Runde. Der neue Check 68k (Aufnahme in Echtzeit hinter einem Tab) kam nur auf 26 von 120 Frames, 77 wurden verworfen. Lokal auf melektaus-atx waren es nie mehr als 7, auch unter CPU-Last. Die Ursache ist noch offen, als Nächstes lese ich den CI-Lauf zu 0701fe3.

Den CI-Lauf zu 0701fe3 habe ich nicht abgewartet. Das Issue bleibt offen (wiederkehrend).

## Runde 12 — `0701fe3` Umfang: alles seit Runde 11 (`41af1a6`), vor allem die Sound-FX-Geräte (#379 bis #401), Video (#402 ff.), Aufnahme (#405 ff.), Composition (#417 ff.) und die Tilemap-Flicken (#347, #348, #424). Am Verhalten hat sich nichts geändert, mit einer Ausnahme (siehe unten, Chip). In `src` sind es netto **816 Zeilen weniger** (78 Dateien geändert, 5 neu). ### Doppelter Code `jscpd` 4.3.0 über `src` (mindestens 50 Tokens, nur TypeScript), gleiche Einstellung wie in Runde 11: | Stand | Klone | doppelte Zeilen | Anteil | |---|---|---|---| | Runde 11 (`41af1a6`) | 33 | 249 | 0,26 % | | vor dieser Runde (`df6dbe9`) | 140 | 1263 | 1,05 % | | **nach dieser Runde** | **57** | **416** | **0,35 %** | Rund 950 der neuen Klonzeilen lagen in `editor/soundfx`, also in den Panels und Faces der Geräte. - **`editor/soundfx/deviceParts.ts`** (neu): Kopf, Knopfreihen, Bildschirm-Stil und das Reihen-Layout für Gruppen von Knöpfen. Compressor, Saturation, Crusher, Limiter, Delay, Reverb, Chip, Acid, Envelope, Sample, Modulation und Knob bauen ihr Panel damit. `panel.knobs` bleibt, weil die Debug-Hooks es lesen. - **`editor/soundfx/deviceFace.ts`** (neu): Basisklasse der zwölf Faces. Sie findet den Knoten und übernimmt `wired`, `preview`, `commit`, `set`, `hide`, Nachladen und Abhören. `compressorWired` heißt dort `paramWired`. - **`ui/textPool.ts`** (neu): „Texte bei Bedarf anlegen, überzählige verstecken“ stand zehnmal da, in Wave- und Video-Tab, `TimeRuler`, dem Lineal der Animation, den Tastennamen im Piano Roll und in Song- und Composition-Timeline. Dazu **`editor/sound/clipStrip.ts`**, der Beschriftungsstreifen, den Wave- und Video-Tab teilen. - **`core/util/bytes.ts`** (neu): das `concat`, das `ogg`, `matroska` und `avcColour` je ausgeschrieben hatten. - **Bewusst stehen gelassen:** `AnimationEditor` und `CompositionEditor` teilen nur den Play-Knopf, eine Zwischenklasse dafür wäre mehr Schicht als Gewinn. Die Curve-Panels sind anders gebaut. - **Die eine Verhaltensänderung:** Chip setzt seine Boxen jetzt über `put`, also gerundet. Nachgemessen: Sie waren schon ganzzahlig. Die drei umgestellten Reihen-Layouts sind vorher und nachher byte-gleich (Boxen als JSON, `cmp`). ### Toter Code Gemessen mit dem TS-LanguageService, verglichen mit der Liste aus Runde 11 nach Datei und Name: - `clear` an den Video-Playern: seit #402 nie aufgerufen. `endRun` macht die Player absichtlich wieder zu Vorschauen. - `posterFileOf` und `videoTimeAt`: nur noch Tests riefen sie auf. Der Picker nimmt den Poster-Pfad vom Server. - `easeOut` war dasselbe wie `glide(t, 3)`. Der Test fragt jetzt `glide`. - Die Paste-Funktionen der Composition sind vereinfacht (`framesToRoom`). - Werte, die nur in ihrer eigenen Datei gebraucht werden, haben kein `export` mehr. - Geprüft und behalten: `Scheduler.done` wird als ungenutzt gemeldet, erfüllt aber das `Runner`-Interface. Typen bleiben exportiert. ### Kommentare und Doku - Kommentare über 125 Zeichen sind auf die Breite ihrer Nachbarzeilen umgebrochen. Kommentare, die Geschichte erzählen („as before“, „used to“), sagen jetzt, was ist, in `src` und in den e2e-Modulen. - **Wiki** (`9a28ec8`): *Architecture* nennt die Ordner und Dateien, die seit Runde 11 dazugekommen sind, darunter `core/recording/` und `editor/composition/`. *Home* verlinkt *Videos*. Maschinell geprüft: Alle Pfade, die Wiki und README nennen, gibt es. - **README:** Die Asset-Liste nennt jetzt auch `video` und `composition` und deckt damit alle 33 Typen ab. In der Seitentabelle stehen *Videos* und *Compositions*. - Nicht angefasst: In der README stehen noch Gedankenstriche. #416 betraf nur das Wiki. ### Tests ``` Gate (melektaus-atx) → 313 Files, 4835 Tests, CHECK EXIT 0 Unit stein2 (core, editor, ui, soundfx) → grün e2e 25, 34, 64, 65, 66, 69 (atx) → ALL PASSED, 330 Checks ``` - Gegenproben: `TextPool` ohne das Behalten der Texte und `framesToRoom` ohne Ausweichen werden beide rot. - Kein voller Lauf und keine Smokes von mir, das übernimmt CI. ### Nebenbei: CI zu `df6dbe9` war rot `suite` (Task 697) hatte 3 FAIL in e2e 68, keiner davon in einem Bereich dieser Runde. Der neue Check 68k (Aufnahme in Echtzeit hinter einem Tab) kam nur auf 26 von 120 Frames, 77 wurden verworfen. Lokal auf `melektaus-atx` waren es nie mehr als 7, auch unter CPU-Last. Die Ursache ist noch offen, als Nächstes lese ich den CI-Lauf zu `0701fe3`. Den CI-Lauf zu `0701fe3` habe ich nicht abgewartet. Das Issue bleibt offen (wiederkehrend).
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#85