Commit Graph
100 Commits
Author SHA1 Message Date
knsoandClaude Sonnet 5 f91b5ab7c6 fix(extract): Schleifen-Kante bekommt zwei Stummel in junction_area()
incident() liefert eine Schleife (a == b) nur einmal, und edge.a == node ist bei ihr immer
wahr - die zweite Abgangsrichtung bekam deshalb nie einen eigenen Arm im Kreuzungsfächer.
Das war kein Schönheitsfehler, sondern ein Loch in der Fahrbahn genau dort, wo das
zurückgeschnittene Schleifenband auf die Kreuzungsfläche trifft: 179 von 196 Schleifen
sitzen an einem Knoten mit Grad >= 3 und waren betroffen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 02:53:15 +02:00
knsoandClaude Sonnet 5 5ddcbbfc17 feat(extract): Kreuzungsflächen mit amerikanischem Eckradius
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 02:44:16 +02:00
knsoandClaude Sonnet 5 8870484233 style(extract): Einrückung der neuen Fixture ausrichten
Die nodes-Liste in test_kante_ganz_innerhalb_der_kreuzung_liefert_kein_band
stand ein Zeichen zu weit links, statt wie die edges-Liste darunter unter
dem ersten Listenelement zu fluchten - beim Selbstlesen des Diffs
aufgefallen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 02:13:54 +02:00
knsoandClaude Sonnet 5 f91b906827 feat(extract): Querschnitt je Klasse und Fahrbahnband
Der Korridor, den Task 4 misst, ist auf der Karte eine einzige graue
Fläche - Fahrbahn und Gehweg tragen dort dieselbe Farbe. Der Querschnitt
teilt sie deshalb nur auf, statt sie zu vergrößern: Fahrbahn plus zweimal
Gehweg ergibt für jede Klasse genau die gemessene Breite, und der
Stadtgrundriss bleibt unberührt. Die Maße (Fahrspur 3,5 m, Parkspur
2,0-2,5 m, Gehweg 2,5-3,0 m) stehen im Entwurf; eine Assertion auf
Modulebene hält die Aufteilung für alle vier Klassen fest.

Das Fahrbahnband entsteht aus der Mittellinie: An jedem Kreuzungsende
(Grad >= 3) weicht sie um die halbe Fahrbahn der breitesten anliegenden
Kante plus 2 m zurück, freie Enden bleiben stehen. Eine Kante, die ganz
in den Kreuzungsflächen verschwindet, liefert kein Band - das füllt Task 6.

Testkorrektur: test_kante_ganz_innerhalb_der_kreuzung_liefert_kein_band
hatte an beiden "Kreuzungsknoten" nur je zwei Kanten, also Grad 2 statt
Grad 3 - keine Kreuzung nach der Definition, die trimmed_line() selbst
verwendet. Gegen die fertige Implementierung geprüft, lieferte sie eine
echte Linie statt None. Je ein zweiter Arm an beiden Knoten (wie schon in
test_kontraktion_zieht_alle_anliegenden_kanten_mit für denselben
3-m-Kreuzungsabstand) behebt das.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 02:12:16 +02:00
knsoandClaude Sonnet 5 2d8f4e730c fix(extract): Kontraktion zieht jetzt alle anliegenden Kanten mit
_contract_short() ließ Kanten, die schon vorher am überlebenden Knoten
hingen, auf ihrer alten Koordinate stehen - nur die vom eingezogenen
Knoten umgehängten folgten dem neuen Mittelpunkt. Da Kontraktion beidseitig
Grad >= 3 voraussetzt, hat der überlebende Knoten danach immer mindestens
Grad 4, und _merge_chains() fasst nur Grad-2-Knoten an: Der Fehler konnte
sich nie von selbst heilen. Am heutigen Mosaik wirkungslos (die Funktion
greift dort kein einziges Mal), aber real für jeden Ausschnitt mit zwei
nahen Kreuzungen - genau der Fall, den die Funktion behandeln soll.

Dazu zwei Kleinigkeiten: _median_width() deckte den Kurzkanten-Fallback
(unter 2 * WIDTH_MARGIN) bisher nicht ab, und ein Kommentar in
_merge_chains() war ein Zeichen zu weit eingerückt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 01:52:19 +02:00
knsoandClaude Sonnet 5 f809eedf71 feat(extract): Graph säubern, Breite messen, Klasse bestimmen
Sackgassen unter 10 m sind Skelettfransen und fallen weg, Knoten mit nur
noch zwei Kanten lösen sich auf, Kreuzungen näher als 5 m werden eine. Die
Breite kommt aus der Distanztransformation ohne die ersten und letzten 8 m:
dort misst sie die Kreuzung, nicht die Straße.

Der Gegencheck am echten Mosaik deckte zwei Fälle auf, die kein
synthetischer Test zeigt: Ein Rohast ohne Kreuzungsanschluss liefert eine
Kante mit nur einem Stützpunkt (LineString verlangt 0 oder mehr als einen
Punkt), und ein Knoten mit Schleife plus Verbindungskante hat kein zweites
Ende zum Verketten. Beides fängt clean() jetzt ab, mit je einem
Regressionstest.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 01:16:13 +02:00
knsoandClaude Opus 5 1300dc9a2a docs: Säuberung des Graphen gegen quadratische Laufzeit absichern
Die Fassung im Plan suchte je Kante den Grad über alle Kanten und begann
nach jedem Fund von vorn. Am echten Skelett mit rund 12.000 Rohästen wäre
das nicht langsam, sondern praktisch stehengeblieben. Jetzt wird der Grad
einmal gezählt und fortgeschrieben, ein Durchgang räumt alle Fransen auf
einmal weg, und ein Test mit über 1.500 Kanten nagelt es fest.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 00:48:58 +02:00
knsoandClaude Sonnet 5 3fe3cd5c45 feat(extract): Straßennetz als Graph aus dem Skelett
centerlines() verwirft alles unter 15 m und zerlegt das Netz damit an jeder
Kreuzung: von 3.038 Linienenden treffen sich nur 81. Der neue Graph lässt
das Skelett ungefiltert, macht aus den 5.970 Pixeln mit Grad >= 3 durch
Verschmelzen im Umkreis von 8 m die 862 Kreuzungen und hängt die Kanten
dort ein.

_skeleton_graph/_to_world in vectors.py sind jetzt öffentliche Schnittstelle
für roads.py (skeleton_graph/to_world); inpaint.py zieht seinen einzigen
Aufruf von skeleton_graph mit, sonst bräche dessen Import.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 00:36:40 +02:00
knsoandClaude Sonnet 5 505b1969ec feat(assets): Bordstein- und Gehwegtexturen aus dem Kit holen
modular_sidewalk_curb_kit (Just8, CC BY 4.0) liefert 2048er Karten für
Bordstein und Gehweg. Sie werden auf 1024 verkleinert und im Namensschema
der Poly-Haven-Texturen abgelegt, damit createMaterials() sie ohne
Sonderfall lädt. Das Kit selbst bleibt außerhalb des Repos; das Skript
überspringt den Schritt, wenn der Ordner fehlt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 00:18:46 +02:00
knsoandClaude Opus 5 3a26cf837b docs: Kit-Ordner des Nutzers nicht mehr verschieben zum Prüfen
Schritt 4 von Task 2 verschob modular_sidewalk_curb_kit nach /tmp und zurück.
Bricht der Lauf dazwischen ab, liegt ein Ordner, der uns nicht gehört, im
Temp-Verzeichnis. CURB_KIT stellt den Pfad um, ohne etwas anzufassen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 00:12:41 +02:00
knsoandClaude Haiku 4.5 8f80c020c8 test(world): Bodenplatte-Test absichern und console.log entfernen
Fixrunde 1: Der Test „lässt kein Loch verschwinden" konnte nicht fehlschlagen,
weil er nur position.count prüfte, das vor der Triangulierung gefüllt wird.
Jetzt absichert footprintArea(geo) die tatsächliche Restfläche (18400 m²);
das console.log ist entfernt.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-17 00:05:55 +02:00
knsoandClaude Haiku 4.5 f301d39ea0 test(world): Bodenplatte mit vielen Löchern messen
Erstes Risiko des Entwurfs: die Fahrbahn wird als Loch aus der Bodenplatte
geschnitten, und ShapeUtils.triangulateShape läuft beim Nachladen im
Hauptthread. Der Test hält fest, dass 100 Löcher je Chunk unter 50 ms
bleiben und keines verschwindet.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-16 23:50:34 +02:00
knsoandClaude Opus 5 a86a4c9601 docs: fünf Befunde des Vorabscans im Plan berichtigt
Signatur von road_graph, eine wirkungslose Hilfsfunktion, eine Zusicherung
die der Vereinfachung widerspricht, ein doppelter Aufruf und ein sorted()
über Wörterbücher ohne Schlüssel.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 23:48:15 +02:00
knsoandClaude Opus 5 b24714adf4 docs: Umsetzungsplan für den Straßenumbau
16 Aufgaben mit Tests zuerst. Aufgabe 1 misst das größte Risiko des
Entwurfs, bevor irgendetwas gebaut wird: ob der Browser eine Bodenplatte
mit 100 Löchern je Chunk in unter 50 ms trianguliert. Danach Graph,
Querschnitte, Kreuzungen, Mulde, Markierungen, Chunk-Format, Flamingo
Park, Pipeline, Browser, Minimap und die Abnahme.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 23:40:13 +02:00
knsoandClaude Opus 5 32af584190 docs: Entwurf für Straßen mit Bordstein, Gehweg und US-Markierung
Teil 2 der Straßenarbeit. Gemessen statt geschätzt: 88,74 km in 1.519
Mittellinien, deren Krummheit im Median bei 1,0104 liegt — das Zackige
sitzt allein in den Rändern. Das heutige Netz zerfällt an den Kreuzungen
(nur 81 von 3.038 Enden treffen sich), weil centerlines() alles unter 15 m
verwirft; das ungefilterte Skelett hat 862 Kreuzungen.

Entwurf: Graph aus dem Skelett, vier Straßenklassen nach gemessener
Korridorbreite, Fahrbahn als 15 cm tiefe Mulde mit Bordsteinwand und
Gehweg auf Bodenhöhe, Markierungen als Geometrie in einem Material.

Im Browser gemessen: die Kapsel erklimmt 15 und 25 cm ohne Halt und
blockiert erst bei 40 cm — ein Bordstein mit Kollision sperrt niemanden ein.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 23:21:04 +02:00
knsoandClaude Opus 5 ee49fd726d Merge branch 'leonida/flamingo-park'
Flamingo Park zeigt die echte Anlage aus OpenStreetMap: Wege, Sportfelder,
Plätze, Pool, Parkplatz und Gebäude, eingepasst in die Parkfläche des
Spiels. Die Jefferson Avenue führt vom Park geradeaus nach Süden. Tribüne
und Hood Yard bleiben, wo sie sind.

Teil 2 (Bordstein, Gehweg, amerikanische Straßenmarkierungen mit den
beiden Kits) ist ein eigener Entwurf.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 18:30:45 +02:00
knsoandClaude Opus 5 dd242b61e8 chore(data): Welt mit normalisierter, sortierter Chunk-Ausgabe neu erzeugt
140 der 144 Chunkdateien ändern sich einmalig durch die Normalisierung in
emit.py, ohne dass sich außerhalb der acht Parkchunks in irgendeiner Ebene die
Fläche bewegt: symmetrische Differenz 0,00 m² für land, surfaces, roads,
buildings und paths über alle 136 übrigen Chunks.

In den Parkchunks ändert sich allein die Wegschicht, und zwar genau um die
runden Kappen: außerhalb des Parkvierecks liegen jetzt 0,02 statt 95,96 m² Weg
(der Rest ist die Rundung auf zwei Stellen). Wegfläche gesamt 7.999,35 ->
7.903,38 m². Palmen (2.257), Mittellinien und Gebäude bleiben unverändert;
map.png folgt der kleineren Wegfläche.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 13:46:13 +02:00
knsoandClaude Opus 5 3c74202b5e fix(extract): Chunk-Ausgabe lauf-stabil, Eckenprüfung in beide Richtungen
emit.py normalisiert jede ausgegebene Fläche und sortiert die Listen nach der
Ausgabestruktur selbst. unary_union() in apply_street() gab das kartenweite
Straßenpolygon mit anderem Ringstartpunkt und an anderer Listenstelle zurück und
änderte damit 88 Chunkdateien, in denen sich geometrisch nichts bewegt hatte
(symmetrische Differenz 0,00 m²). Belagsarten und Mittellinien behalten ihre
Reihenfolge: overview.py malt die Beläge in Listenreihenfolge übereinander, und
vergeLampPoints() hängt an Reihenfolge und Laufrichtung der Mittellinien —
Sortieren verschöbe dort 1.848 von 3.921 Laternen auf die andere Straßenseite.

check_corners() misst gegen den Straßenrand statt gegen die Straßenfläche. Alle
vier Ecken liegen in der Fahrbahn, ihr Flächenabstand ist 0,000 m; die alte
Prüfung schlug deshalb nur an, wenn eine Straße sich zurückzieht. Eine nach
innen verbreiterte Straße hätte apply_park() still auf das veraltete Viereck
zurückgeschnitten.

Die Parkwege werden am Parkviereck abgeschnitten — die runden Kappen von
LineString.buffer() lagen mit 95,96 m² darüber hinaus, rund 41 m² davon sichtbar
als Betonzungen auf den umgebenden Belägen. load_elements() prüft den OSM-Abzug
so streng wie die Parkdatei, mit Dateiname statt nacktem KeyError.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 13:43:01 +02:00
knsoandClaude Opus 5 a3504df43d docs: Messwerte der Browserprüfung im Entwurf festhalten
Draw Calls, Dreiecke und Bildzeit für Draufsicht, Weg und Feld, der Anteil
der neuen Schichten daran, der Zustand der Konsole und die abgestimmte
Rasenfarbe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 13:05:24 +02:00
knsoandClaude Opus 5 4f68a3f625 feat(world): Rasen grün tönen statt roh sandfarben
leafy_grass ist roh sandfarben (Mittel der Diffuse-Kachel R 151, G 131,
B 89). Seit der Park seine echte Fläche als eigene Schicht trägt (102 790
statt 16 798 m² im Parkrechteck), las er sich aus der Vogelperspektive wie
eine Brache, während ihn die Minimap grün zeichnet. PARK_TINT 0xb4dc94
tönt Rot und Blau stärker ab als Grün; die Felder behalten ihren helleren
FIELD_TINT und heben sich weiter ab.

Im Browser abgestimmt (Task 12, Schritt 7) und vom Nutzer so gewählt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 13:04:50 +02:00
knsoandClaude Sonnet 5 a7271d2331 feat(world): Flamingo Park nach OpenStreetMap und Jefferson Avenue im Spiel
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 09:15:30 +02:00
knsoandClaude Sonnet 5 5e445c5a3e test(world): Sperrflächen, Startpunkt und Parkwege gegen die Daten prüfen
Startpunkt und Fahrzeugpunkte stehen jetzt in src/world/spawn.js, damit ein
Datentest sie lesen kann.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 08:49:42 +02:00
knsoandClaude Sonnet 5 b736afb7ff feat(world): Parkwege, Felder, Plätze, Pool und Parkplatz als eigene Schichten
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 08:34:43 +02:00
knsoandClaude Sonnet 5 e675e62a16 feat(extract): Minimap zeichnet Parkwege, Felder, Plätze, Pool und Parkplatz
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 08:20:44 +02:00
knsoandClaude Opus 5 0e11c54338 docs: Plan erwartet die bekannte Zufahrt-Warnung statt gar keiner
Folge der Entscheidung aus Task 5: Sperrflächen schneiden auch Zufahrten aus
und warnen dabei. Am echten Stand quert die Zufahrt zum Parkplatz die
Sperrfläche der Tribüne, die Warnung gehört also zum gewollten Zustand.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 08:07:21 +02:00
knsoandClaude Sonnet 5 305572620d fix(extract): Integrationstest hält die bekannte Zufahrt-Warnung fest statt Warnungen pauschal auszuschließen
Die Erwartung "keine Warnung" im Plan war überholt: Task 5 schneidet Sperrflächen
bewusst auch aus Zufahrten aus und warnt dabei, und am echten Stand quert die
Zufahrt zum Parkplatz die Tribuenen-Sperrflaeche. Der Test prueft jetzt die
Warnungsliste wortgenau, damit er weiterhin bei jeder neuen oder anderen
Warnung anschlaegt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 08:06:17 +02:00
knsoandClaude Sonnet 5 442f5b2ada feat(extract): Flamingo Park in run.py, Parkwege in der Chunk-Ausgabe
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 08:00:07 +02:00
knsoandClaude Sonnet 5 2ef9e6774a feat(extract): Parkanlage in die Welt einsetzen, Palmen neu setzen, Ecken prüfen
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 07:44:48 +02:00
knsoandClaude Sonnet 5 cfc9fc0690 feat(extract): Jefferson Avenue als gerade Straße statt der Gasse
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 07:28:27 +02:00
knsoandClaude Sonnet 5 d756eccd77 fix(extract): Sperrflächen auch aus Zufahrtsflächen ausschneiden und davor warnen
Zufahrtsflächen (highway=service) wurden bisher ungeschnitten ausgegeben und nicht auf
Überschneidung mit Sperrflächen geprüft. Am echten Stand überlappte eine Zufahrt die
Sperrfläche "tribuene" um 42,17 m² ohne Schnitt und ohne Warnung. build_layout wendet
difference(blocked) jetzt auch auf Zufahrten an, die Warnschleife prüft Wege und
Zufahrten getrennt ("Parkweg schneidet ..." / "Zufahrt schneidet ...").

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 07:20:41 +02:00
knsoandClaude Sonnet 5 26aafbbbd5 feat(extract): Parkanlage aus OpenStreetMap mit Wegen, Flächen und Gebäuden
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 07:03:52 +02:00
knsoandClaude Sonnet 5 ad5d0468db feat(extract): Flamingo Park affin in den Spielpark einpassen
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 06:48:26 +02:00
knsoandClaude Sonnet 5 1b0011874e feat(extract): Parkdatei für Flamingo Park lesen und prüfen
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 06:35:15 +02:00
knsoandClaude Sonnet 5 3d4d8380c8 feat(extract): OpenStreetMap-Stand für Flamingo Park abrufen und ablegen
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 06:20:14 +02:00
knsoandClaude Sonnet 5 f32ea27e5f chore(data): Welt auf Windows neu erzeugt, Referenzstand
Die Pipeline erzeugt auf diesem Rechner nicht dieselben Daten wie auf dem Mac,
auf dem der bisherige Stand entstand: Pillow dekodiert die JPEG-Kacheln
minimal anders, bei unveränderten Paketversionen aus uv.lock. Betroffen sind
22 von 144 Chunks und die drei Kartendateien.

In neun Chunks ändert sich dabei auch die Zahl der Objekte je Ebene, weil
Flächen an Berührungspunkten anders verschmelzen oder sich teilen. Der
relative Flächenanteil je Ebene ist dabei kein verlässliches Maß und läuft bis
31.69 % hoch, weil einzelne Ebenen je Chunk nur wenige hundert m² groß sind.
Absolut liegt der größte Einzelverlust bei 1651 m² (chunk_1_3, Straße), davon
1541 m² räumlich deckungsgleich als Stadtfläche wiedergefunden; ähnlich
sauber chunk_3_0 mit 1286 m² verlorenem Gebäude gegen 1266 m² neue
Stadtfläche am selben Ort. Ausnahme: in chunk_1_1 verschwinden 66 m²
Gebäudefläche ersatzlos, ohne Entsprechung in Straße oder Stadtfläche
desselben Chunks.

Die Landplatte (`land`) bleibt in 20 von 22 Chunks unverändert. In chunk_4_11
Randrauschen (±11 m²), in chunk_3_11 schließt sich eine rund 150 m² kleine
Aussparung (netto +140 m² Land) – in keinem Chunk verliert die Landplatte per
Saldo Fläche.

Die Parkchunks (J6 bis K9) sind bis auf chunk_10_6 nicht betroffen; dort
ändern sich nur Koordinaten, weder Objektzahl je Ebene noch die Landplatte.

Ab hier ist Windows der Referenzrechner, damit spätere Läufe nur noch die
gewollten Änderungen zeigen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 06:14:51 +02:00
knsoandClaude Sonnet 5 73a6df7f08 fix(extract): Hüllrechteck ohne Zusatzpunkte auf den Kanten
_sides() und _place_rows() nehmen die ersten vier Ringpunkte eines Rechtecks
als seine Ecken. GEOS setzt nach dem Puffern je nach Plattform zusätzliche
Punkte mitten auf die Kanten (macOS 0, Windows 2), und dann messen beide die
falschen Kanten: ergänzte Gebäude bekamen unter entfernten Beschriftungen eine
falsche Größe und eine falsche Richtung. simplify(0) entfernt genau diese
Punkte und lässt die Form unverändert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 05:54:22 +02:00
knsoandClaude Sonnet 5 aa699b1585 fix(test): zwei plattformabhängige Tests unter Windows neutral
GEOS setzt bei entarteten Eingaben je nach Plattform zusätzliche Punkte auf
eine Kante, und fileURLToPath liefert unter Windows Backslashes. Beide Tests
prüfen jetzt, was sie meinen: die Ecken des Rechtecks und den Ort im Baum.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 05:43:43 +02:00
knsoandClaude Opus 5 c6241db90f docs: Umsetzungsplan für Flamingo Park, Spec beim Planen geschärft
Beim Nachrechnen korrigiert: affine statt bilinearer Einpassung (bilinear
verfehlte den Hood Yard um 4,2 m), offset_u 6,25 m, gemessenes Schnitt-Vieleck
der Gasse, Mittellinienstücke erst ab 15 m, Tribüne ohne replaces, Startpunkt
als eigenes Modul, PYTHONUTF8=1 unter Windows.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 23:57:30 +02:00
knsoandClaude Opus 5 c278ad3d9d docs: Entwurf für Flamingo Park nach OpenStreetMap
Teil 1 von zwei: Der Park bekommt die echten Wege, Felder, Plätze, Pool,
Parkplatz und Gebäude, eingepasst nach Variante D, dazu die Jefferson Avenue
als gerade Verlängerung nach Süden. Umsetzung in der Extraktion. Teil 2
(Bordstein, Gehweg, amerikanische Markierungen) bekommt einen eigenen Entwurf.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 23:22:09 +02:00
knsoandClaude Opus 5 fb38652e7f chore(controller): three-player-controller als Ordner statt Submodul
Das Submodul zeigte auf GitHub, der eingetragene Stand 028c652 lag aber nur
lokal vor: GitHub-Master ac39682 plus Showcase mit Figuren und launch.json.
Frische Klone konnten den Controller deshalb nicht laden. Jetzt liegt dieser
Stand als normaler Ordner im Repo, ohne Verweis auf GitHub.

dist/ und node_modules/ im Controller bleiben ignoriert und werden wie bisher
lokal gebaut.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 21:27:03 +02:00
knsoandClaude Opus 5 780e246fe5 Merge branch 'leonida/tribuene'
Tribüne im Park J6 statt des alten Gebäudekastens, mit Materialrollen,
ersetzten Grundrissen beim Chunk-Aufbau und Asset-Test je Ort.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 21:26:58 +02:00
knso a55dca5fb6 start 2026-09-15 21:05:18 +02:00
knsoandClaude Sonnet 5 71011e27e2 docs(skills): Projekt-Skill kennt replaces und den Asset-Test je Ort
Behebt Befund 1 aus dem Abschluss-Review: der Skill war seit den
Tribüne-Tasks veraltet - er kannte weder replaces noch die
Materialzeilen je Ort in SOLID_BY_PLACE/BUMP_BY_PLACE. Ersetzt statt
angehängt, an den drei Stellen, wo man danach sucht: Überblick
(Ein-neuer-Ort-Liste), Schritt 2 (Stelle holen) und Schritt 8 (Tests),
dazu zwei Fallstricke-Zeilen für die roten Ausgangszustände.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 03:57:37 +02:00
knsoandClaude Sonnet 5 237a4ed389 test(world): ersetzte Grundrisse und feste Materialien je Ort strenger prüfen
Behebt Befunde 2-6 aus dem Abschluss-Review: der replaces-Test prüft
jetzt zusätzlich jede Ecke des getroffenen Grundrisses gegen die
Außenmaße plus REPLACED_OVERHANG (5 m), der Verteilungstest vergleicht
als Mengen und bekommt eine Gegenrichtung je Datei, BUMP_BY_PLACE
erzwingt eine Zeile je Ort statt sie mit "?? []" zu verdecken, ein
Gebäude an einer Chunkgrenze bekommt einen Test über zwei Chunks samt
JSDoc-Hinweis, und der Rückwand-Messwert in der Spec nennt Kapselmitte,
Wandfläche und Radius einzeln.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 03:57:31 +02:00
knsoandClaude Opus 5 14fd9cefde docs: Tribünen-Spec mit Messwerten aus dem Spiel
Browserprüfung: alter Kasten weg (Strahl trifft Boden bzw. Tribünendach), acht feste Materialien als Float32 im Collider, Rückwand stoppt die Kapsel am Sockel, Tunnel samt Treppe begehbar, Sitze durchlässig, +0,1–0,3 ms je Bild, vorgewärmt (48 ms bis zum Einsetzen, größte Lücke 56 ms).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 20:57:00 +02:00
knsoandClaude Sonnet 5 190fe9c13c feat(world): Tribüne im Park J6 statt des alten Gebäudekastens
tribuene.glb mit places.mjs aufbereitet (6,3 MB -> 1,7 MB, 69 557 Dreiecke, 14 Primitive, 49 MB Grafikspeicher). PLACES-Eintrag bei (1409,9 | 1051,1), 45° gedreht, lift 0, replaces auf den 18,6 m hohen Kasten. Der Lage-Test übergeht ersetzte Grundrisse und prüft, dass jeder replaces-Punkt genau ein Gebäude unter dem Ort trifft.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 20:36:29 +02:00
knsoandClaude Sonnet 5 ae0f6106bb feat(world): Materialrollen der Tribüne, Asset-Test je Ort
Fest: Sichtbeton, Estrich, Verkleidung, Stahl, Trapezblech, Riffelblech, Verglasung, utility_box_01. Nahflächen: Sichtbeton, Estrich, Verkleidung, Stahl, Sitzschale. Kabel, Kabeldosen, Wandleuchten und Kästen auf 0,25. Der Asset-Test prüft jede Datei aus PLACES gegen ihre eigene Zeile fester Materialien statt gegen die ganze globale Liste, Bump nur beim Hood Yard.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 20:24:09 +02:00
knsoandClaude Opus 5 e33c1817ec feat(world): Gebäude, die ein Ort ersetzt, beim Chunk-Aufbau weglassen
withoutReplacedBuildings filtert die Grundrisse, in denen ein Weltpunkt aus PLACES[].replaces liegt; ChunkStreamer baut die Geometrie daraus, main.js übergibt die Punkte aller Orte. Damit entfallen Kasten, Schatten und Kollision des alten Gebäudes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 20:13:47 +02:00
knsoandClaude Opus 5 f7506ac556 docs: Umsetzungsplan für die Tribüne im Park J6
Vier Tasks: ersetzte Gebäude beim Chunk-Aufbau weglassen, Materialrollen und Asset-Test je Ort, Tribüne aufbereiten und eintragen (am Prototyp gemessen: 1,7 MB, 69 557 Dreiecke, 14 Primitive, 49 MB), Prüfung im Browser mit vorberechneten Blick- und Kapselpunkten.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 20:08:18 +02:00
knsoandClaude Opus 5 4a1b337609 docs: Entwurf für die Tribüne im Park J6
Die Tribüne aus tribuene.glb ersetzt 1:1 den Gebäudekasten in J6:
längs mittig auf dem alten Gebäude, 45° gedreht, Front 1 m vor dessen
Feldseite (Vergleichsbild im Gespräch bestätigt), lift 0 ohne
Bodenplatte. Neu gegenüber dem Hood Yard ist replaces im Orte-Eintrag:
der ChunkStreamer lässt den Grundriss beim Aufbau weg. Dazu
Materialrollen, Budget und der Umbau des Asset-Tests auf alle Orte.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 19:55:12 +02:00
knsoandClaude Opus 5 6a056262a8 chore(skills): Projekt-Skill zum Platzieren von three-d-stage-Modellen
Ablauf wie beim Hood Yard mit den gefundenen Fallstricken (Dreiecke je Knoten,
Bodenplatte +6 cm, globale Materiallisten, Asset-Test je Ort, launch.json nur im
Hauptordner, gl.finish-Messung, Vorwärmen prüfen) und Werkzeugen: Modell vermessen,
Kartendaten eines Weltfensters, Vergleichsbild Satellit/Spiel, Screenshot-Dekodierung,
erprobte Browser-Ausschnitte.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 19:22:20 +02:00
knsoandClaude Sonnet 5 7e4af1d0bc docs: Hood-Yard-Spec mit Messwerten und Vorwärmen
Wortlaut: die Radien garantieren nur, dass die Chunks unter einem Ort
angefordert sind, solange er in der Szene ist — nicht, dass ihr Boden
schon gebaut ist (ChunkStreamer baut höchstens einen Chunk je Bild).
"geladen" -> "angefordert" im Kommentar über den Radien
(src/world/places.js), über der PlaceLayer-Konstruktion (src/main.js),
im Testnamen (tests/placesSite.test.js) und in der Spec, dort mit
einem Satz zu den paar Bildern nach einem Kartensprung.

Spec zusätzlich: warmUp in den Bullets "Vorbereiten"/"Einsetzen",
robustes Einsetzen (Warnung, kein erneuter Versuch) im Bullet zum
Ladefehler, und ein neuer Messwerte-Bullet in "Fehlerfälle und
Risiken" (+0,4–0,6 ms je Bild, ~130 ms einmaliger Texturupload ohne
warmUp).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 13:43:23 +02:00
knsoandClaude Sonnet 5 fc9e818c79 test(world): entquantisierte Positionen auch für interleaved Attribute
GLTFLoader liefert quantisierte Positionen in echt als
InterleavedBufferAttribute (gemeinsamer Puffer mit Normale/UV), nicht
als eigene BufferAttribute wie im bisherigen Test. dequantizePosition
braucht dafür keine Änderung: es liest nur über das gemeinsame
Attribut-Interface (normalized, getX/getY/getZ, count), das three.js
für beide Klassen implementiert. Der Test läuft grün und schreibt das
fest.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 13:41:46 +02:00
knsoandClaude Sonnet 5 23a0623898 fix(assets): Zielpfad der Aufbereitung unabhängig vom Arbeitsverzeichnis
places.mjs schrieb bisher nach public/models/places/<id>.glb relativ
zu process.cwd() und nahm jede id ungeprüft an. Die neue, exportierte
placeTarget(id) löst den Pfad stattdessen von import.meta.url ab (egal
von wo das Skript aufgerufen wird) und lehnt IDs außerhalb von
[a-z0-9-]+ ab, bevor daraus ein Pfad wird, der aus public/models/
places/ herausführen könnte.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 13:41:18 +02:00
knsoandClaude Sonnet 5 ed5254f88e fix(world): Einsetzen eines Orts gegen Collider-Fehler absichern
#show baute bisher scene.add, bevor player.addCollider lief: wirft
addCollider (z. B. toter Worker), blieb die Wurzel ohne active-Eintrag
in der Szene stehen — sichtbar, aber nie wieder entfernbar — und die
Ausnahme entkam synchron aus update() in die Spielschleife.

Der Collider-Handle wird jetzt vor scene.add in einem try/catch
gebaut; schlägt er fehl, bleibt die Szene unverändert, der Ort landet
in this.failed (kein erneuter Versuch) und #show überspringt ihn beim
nächsten Aufruf.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 13:40:28 +02:00
knsoandClaude Sonnet 5 1c24fbf71e feat(world): Orte beim Vorladen vorwärmen
PlaceLayer nimmt jetzt ein optionales warmUp(root) entgegen und ruft es
nach prepareModel, aber vor dem Einsetzen auf. main.js nutzt das, um
Texturen hochzuladen und CSM-Shader zu übersetzen, solange der Ort noch
nicht in der Szene ist — gemessen kostete das sonst rund 130 ms auf
einen Schlag im ersten Bild, in dem der Hof erscheint. Schlägt das
Vorwärmen fehl, wird nur gewarnt; der Ort wird trotzdem eingesetzt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 13:39:50 +02:00
knsoandClaude Sonnet 5 522101c026 fix(world): quantisierte Positionen vor dem Kollisionsaufbau in Float32 wandeln
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 12:42:25 +02:00
knsoandClaude Haiku 4.5 9f6570b11d feat(world): Hood Yard im Spiel
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-14 11:35:17 +02:00
knsoandClaude Sonnet 5 ef2001542a feat(world): PlaceLayer lädt vor, setzt ein und nimmt heraus
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 11:26:34 +02:00
knsoandClaude Haiku 4.5 16eb651308 test(world): Lage der Orte gegen Straßen, Gebäude, Palmen, Laternen und Chunk-Radien
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-14 11:15:14 +02:00
knsoandClaude Haiku 4.5 d923f1ba2f feat(assets): Hood Yard aufbereitet (653,6 MB -> 16,2 MB)
2,9 Mio. -> 658 000 Dreiecke, 542 -> 43 Primitive, 105 PNG in 2048 px ->
32 WebP in 1024 px und 37 in 512 px. EXT_materials_bump der Container erhalten.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-14 11:08:26 +02:00
knsoandClaude Haiku 4.5 62dbbe41d2 feat(world): Orte-Liste mit Lage, Radien und Kollisionsmaterialien
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-14 10:59:02 +02:00
knsoandClaude Haiku 4.5 6c291c4106 feat(assets): Aufbereitung für Orte mit Texturgrößen je Material und Vereinfachung
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-14 10:49:31 +02:00
knsoandClaude Opus 5 0ebe8adb8b feat(assets): EXT_materials_bump für gltf-transform
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 10:39:39 +02:00
knsoandClaude Opus 5 3321a029fa docs: Umsetzungsplan für den Hood Yard, Spec am Prototyp geschärft
Prototyp am echten Modell: 653,6 MB -> 16,2 MB, 2,9 Mio. -> 658 000 Dreiecke,
Bump-Maps erhalten. Radien geändert: Der Hof erscheint erst ab 250 m und
verschwindet ab 450 m, sonst stünde er vom Startpunkt aus über ungeladenem
Boden. Vereinfachung je Material statt eines gemeinsamen Anteils.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 10:24:46 +02:00
knsoandClaude Opus 5 b61d9ab6a1 docs: Entwurf für den Hood Yard im Park J6/K6
Eigenes Modell aus three-d-stage 1:1 an die Stelle der kleinen Gebäude
zwischen Baseball- und Fußballfeld: Aufbereitung mit gltf-transform unter
Erhalt von EXT_materials_bump, Orte-Schicht mit Laden je nach Abstand,
Kollision über Materialnamen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 09:44:20 +02:00
knsoandClaude Opus 5 e26bded427 docs(minimap): Leerzeile in der Liste entfernt, früheren Spawn als solchen benannt
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:55:35 +02:00
knsoandClaude Opus 5 dedf5be507 docs: Folgen der Beschriftungs-Entfernung für Feinkalibrierung, Minimap und Start
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:39:55 +02:00
knsoandClaude Opus 5 4534a47eec fix(world): Start und Autos auf die wiederaufgebaute Straße am Park
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:03:17 +02:00
knsoandClaude Opus 5 dac19fa1ee feat(extract): alle Kartenbeschriftungen entfernt und Welt neu erzeugt
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:03:09 +02:00
knsoandClaude Opus 5 f098fe14b7 feat(extract): Beschriftungen suchen, Liste auf Vollständigkeit prüfen, Prüfbilder
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 19:38:14 +02:00
knsoandClaude Opus 5 b219013bbf feat(extract): Beschriftungen in run.py entfernen, Minimap am Ende erzeugen
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 19:30:51 +02:00
knsoandClaude Opus 5 97ff63b2b6 feat(extract): Beschriftungsmasken, Gitternetz und Entfernen mit Bericht
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 19:15:32 +02:00
knsoandClaude Opus 5 ce93e57936 feat(extract): angeschnittene Gebäude schließen und verdeckte Blockteile bebauen
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 19:08:53 +02:00
knsoandClaude Opus 5 368ea90b3a feat(extract): Wiederaufbau von Straßen, Wegen und Flächen unter Beschriftungen
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 18:37:05 +02:00
knsoandClaude Opus 5 c9e0615a88 feat(extract): Chunk-Zuordnung in Python und Beschriftungsliste lesen
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 18:27:33 +02:00
knsoandClaude Opus 5 a8817e2849 docs: Umsetzungsplan zum Entfernen der Kartenbeschriftungen
Acht Aufgaben, Code und Liste aus dem gegen die echte Vorlage geprüften
Prototyp; in Plan-Reihenfolge in einer Repository-Kopie nachgespielt.
Spec: Start und Autos ziehen von der Buchstabenkontur auf die
wiederaufgebaute Straße am Park, Nummern im Berichtsbeispiel.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 18:17:32 +02:00
knsoandClaude Opus 5 ac2f414bb6 docs: Beschriftungs-Spec am Prototyp gegen die echte Vorlage geschärft
Straßenenden über das Skelett samt Maske, Korridor statt Versatzgrenze,
Weiterführen über Kreuzungen, Ziel auf der anderen Seite, keine gemalten
Sackgassen, Kartenrand; Gebäudevorlage ab 100 m² im 150-m-Fenster;
randvoll vor dem Wachsen; Kontrastregel der Suche; Probelauf mit Kennzahlen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 17:53:13 +02:00
knsoandClaude Opus 5 57ffb5953a docs: Entwurf zum Entfernen der Kartenbeschriftungen
Alle Beschriftungen der Vorlage (Schriftzüge, Marker, Schilder, Symbole,
Straßennamen, Gitternetz) werden vor der Vektorisierung aus dem Klassenbild
entfernt und darunter wiederaufgebaut: Straßen laufen durch, Flächen
schließen sich, angebissene Gebäude werden geschlossen, verdeckte Blockteile
bekommen passende, als ergänzt markierte Gebäude. Ersetzt task_999fed4a.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:33:23 +02:00
knsoandClaude Opus 5 f76e97b69d feat(world): HDRI-Himmel „Nowhere Road" mit Umgebungslicht und scharfen Kaskaden-Schatten
- Himmel: 4k-HDRI von Poly Haven (CC0, tools/assets/hdri.mjs) statt Sky-Shader. Kuppel zeigt das Foto
  ab 12°, darunter weiches Band und Dunst in Nebelfarbe; Umgebungslicht und Spiegelungen per PMREM;
  Sonne aus dem Bild gekappt und als Licht übernommen (77°, Stärke 2,5)
- Schatten: CSM mit vier Stufen (25/100/350/1000 m, je 2048²), Schutznetz für beleuchtete Materialien,
  Normal-Bias 1,5 Texel je Stufe gegen Streifen auf doppelseitigen Materialien (Figur, Autos)
- Startfigur wirft Schatten, Palmen und Laternen empfangen Schatten, Wasser als ruhige See
- Debug-Panel: Sonne, Himmelslicht, Himmelshelligkeit; Namensnennung um das HDRI ergänzt

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:38:44 +02:00
knsoandClaude Opus 5 034b12537a docs: Entwurf und Umsetzungsplan für scharfe Kaskaden-Schatten
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:38:18 +02:00
knsoandClaude Opus 5 c79b4f347b docs(minimap): Lage der Koordinatenanzeige auch im Abschnitt Stapelordnung
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 13:04:49 +02:00
knsoandClaude Sonnet 5 dd5ced505b fix(ui): Landeplatz nur auf ganzem Kollisionsboden, Trackpad-Zoom, Fokus und Ladefehler der Minimap
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-13 12:47:51 +02:00
knsoandClaude Opus 5 e702517662 docs(minimap): Landeplatz auf ganzem Kollisionsboden, Fokus, Trackpad-Zoom und Ladefehler nach dem Abschluss-Review
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 12:27:39 +02:00
knsoandClaude Haiku 4.5 3b09482e6a fix(ui): Downtown-Bezugspunkt statt Downtown-Kern, leere Standortanzeige ausblenden
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-13 11:47:44 +02:00
knsoandClaude Opus 5 61ef30f081 docs: Downtown-Bezugspunkt statt Downtown-Kern, stimmige Koordinatenbeispiele
(−511, 254) ist der Bezugspunkt aus tools/extract/data/districts.json, der
Mittelpunkt der westlichen Hochhäuser, und liegt in B9. Der höchste Turm,
das Southeast Financial Center, steht in C12. Das Anzeigebeispiel
x 412 / y 1830 liegt in F3, nicht in C10. Im Browser bei Task 4 der
Minimap aufgefallen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 11:36:59 +02:00
knsoandClaude Sonnet 5 2ece0decb6 feat(ui): Minimap auf Taste M mit Chunk-Raster, Koordinaten und Klick zum Hinspringen
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-13 11:30:21 +02:00
knsoandClaude Haiku 4.5 c278f62cff feat(ui): Kartenmathematik für die Minimap
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-13 10:47:02 +02:00
knsoandClaude Haiku 4.5 40fc38059a test(extract): Begehbarkeitsmaske je Ebene ohne Land darunter prüfen
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-13 10:44:18 +02:00
knsoandClaude Opus 5 2f38e8f445 docs: Umsetzungsplan für die Feinkalibrierung
Sieben Aufgaben: Korrekturdatei lesen und prüfen, Korrekturen je Ebene
anwenden, Laternen in die Pipeline, einzelner Chunk vergrößert, Einhängen
in run.py mit Vorher/Nachher-Probe, Browser liest chunk.lamps.
Vor dem Commit in einer Kopie komplett durchgespielt, inklusive echtem
Pipeline-Lauf (22 s, 2.591 Laternen) und Mutationsproben der neuen Tests.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:42:11 +02:00
knsoandClaude Opus 5 3f51c818ff docs: Kalibrierungs-Spec vor dem Plan gegen den Code geschärft
Beim Abgleich mit Pipeline und Browsercode aufgefallen: add_road hätte
keine Brücke hinzufügen können (Landprüfung am Mittelpunkt statt an den
Enden); set_area zu Wasser ließ Sand und Parks stehen; unbekannte
Feldnamen wären still ignoriert worden; Drehrichtung von add_building,
Abschneiden der Mittellinien und die Laternenregeln waren unbestimmt.
Dazu die exakte Winkelumrechnung für die Laternen, damit sie nach dem
Umzug nicht gespiegelt stehen, und eine neue Regel gegen Laternen in
Gebäuden, die die Browser-Version nicht hatte.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:08:58 +02:00
knsoandClaude Sonnet 5 0b0376e564 feat(extract): Kartenbild, Begehbarkeitsmaske und map.json für die Minimap
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-13 10:03:29 +02:00
knsoandClaude Opus 5 9f8f93acc8 docs: Entwurf für die Feinkalibrierung
Dauerhafte Korrekturschicht in der Pipeline, damit der Nutzer die Welt
im Chat Chunk für Chunk korrigieren kann: Stelle über Chunk-Name und
Weltkoordinate von der Minimap, Korrektur in tools/extract/data/
corrections.toml. Aktionen für Gebäude, Straßen, Flächen und Küste und
Requisiten; Formfehler brechen ab, Nichttreffer werden gemeldet und
übersprungen. Die Laternen ziehen dafür in die Pipeline, womit sich
nebenbei ihre Lücke an Chunk-Grenzen schließt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:02:12 +02:00
knsoandClaude Haiku 4.5 f0f7692f14 fix(coords): Chunk-Namen korrekt für Float-Indizes und Newlines
- chunk_name: Reject float/bool indices like JavaScript (Number.isInteger)
- parse_chunk_name: Use fullmatch instead of match($) to reject strings with trailing newlines
- Add invalidIndices fixture cases to catch these edge cases in both languages

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-13 09:49:53 +02:00
knsoandClaude Haiku 4.5 2f63779363 feat(coords): Chunk-Namen als Planquadrat A1 bis L12
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-13 09:26:59 +02:00
knsoandClaude Opus 5 44108f94f4 docs: Umsetzungsplan für die Minimap, Spec nachgeschärft
Vier Aufgaben: Chunk-Namen in JavaScript und Python mit gemeinsamem
Beispielsatz; Kartenbild, Begehbarkeitsmaske und map.json aus
overview.py; reine Kartenmathematik mit Tests; Kartenkomponente und
Einhängen mit Browser-Abnahme.

Die Spec bekommt dabei drei Präzisierungen, die sich erst beim Lesen des
Codes ergeben haben: die Namensnennung muss über der Karte liegen
(Lizenzpflicht), die Veraltungsprüfung erkennt nicht jede Änderung, und
die Eingabesperre stoppt Mausereignisse auf der Karte erst an deren
Wurzel, weil ein Stopp in der Capture-Phase auch den eigenen Canvas
taub machen würde.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 09:24:00 +02:00
knsoandClaude Opus 5 c0767375fe docs: Minimap-Spec um benanntes Chunk-Raster ergänzen
Der Nutzer will Chunks im Chat für die Feinkalibrierung ansprechen. Das
Raster wird auf der Karte sichtbar, jeder Chunk heißt als Planquadrat
A1 bis L12 — A1 ist die Nordwest-Ecke, gegen chunkOrigin geprüft. Die
Umrechnung steht in JavaScript und Python mit demselben Beispielsatz,
dazu eine Anzeige von Chunk-Name und Weltkoordinate unter dem Mauszeiger.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 09:09:54 +02:00
knsoandClaude Opus 5 92a1f9e4df chore(test): Arbeitsbäume paralleler Sitzungen vom Testlauf ausnehmen
Eine parallele Sitzung arbeitet in .claude/worktrees/ innerhalb dieses
Repositorys. vitest sammelte deren Testdateien mit ein: 136 statt 71
Tests, und unser Lauf wäre fehlgeschlagen, sobald dort ein Test rot ist.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 09:05:38 +02:00
knsoandClaude Sonnet 5 5c8df78246 fix(world): Flackernden Boden behoben (Tiefenpuffer-Versatz je Schicht, Brücke angehoben)
Downtown aus der Luft: Boden, Stadtfläche, Park, Strand und Straße lagen 1-2 cm
auseinander (geometry.js: SURFACE_OFFSET=0.02 für alle drei Flächen gleich,
ROAD_OFFSET=0.03), bei 150-300 m Kameraabstand unter der Auflösung eines
24-Bit-Tiefenpuffers (~1,3 cm bei 150 m, ~5 cm bei 300 m, gemessen mit dem alten
Nahwert 0.1) — Strand/Park/Stadtfläche lagen zusätzlich exakt aufeinander und
fighteten unabhängig von der Entfernung. Die Brückenoberkante lag exakt auf der
Bodenoberkante (beide y=0).

Vier Änderungen, freigegebener Entwurf:
- Kamera-Nahwert 0.1 -> 0.5 m (src/main.js): fünffache Tiefenauflösung auf jede
  Entfernung, far bleibt 2500.
- src/world/materials.js: POLYGON_OFFSETS/POLYGON_OFFSET_ORDER, eine feste,
  streng zunehmend negative Stufe je Schicht (Boden 0, Stadt -1, Park -2, Strand -3,
  Straße -4, für Faktor und Units gleich) — wirkt im Tiefenpuffer selbst, hält die
  Rangfolge deshalb auf jede Entfernung, unabhängig vom geometrischen Abstand.
  applyPolygonOffsets() ist eine separate, reine Funktion, damit sie ohne
  createMaterials()/Texturladen testbar ist und beweisbar nur diese fünf Materialien
  trifft (Brücken/Gebäude/Wasser/Meeresboden bleiben unberührt).
- Strand, Park und Stadtfläche bekommen dabei je eine eigene Stufe, statt sich wie
  bisher (SURFACE_OFFSET) eine zu teilen.
- src/world/geometry.js: Brückendeck-Oberkante jetzt BRIDGE_OFFSET (=SURFACE_OFFSET,
  0.02 m) statt 0 — derselbe Größenordnungsentscheid wie bei den Flächen, klein genug
  für einen unbemerkten Schritt, groß genug für die Tiefenpuffer-Auflösung bei 300 m.

TDD: Rangfolge/Kein-Teilen-Regeln sind rein und zuerst als fehlschlagende Tests
geschrieben (tests/materials.test.js, 5 neue), ebenso die Brückenanhebung
(tests/geometry.test.js, 1 neu) — beide zunächst rot, dann grün. 65 -> 71 Tests,
alle grün.

Browser-Verifikation (Downtown, Chunk 2_9, gleiche Kameraposition vorher/nachher):
das zuvor durchgängig zackige/zerstückelte Straßen-/Flächenbild ist jetzt glatt und
durchgängig lesbar. Ego-Perspektive dicht an einer Gebäudewand zeigt mit near=0.5
kein sichtbares Durchsehen. Details, Screenshot-Pfade und offene Punkte (Brücken-
Nahaufnahme nicht separat bestätigt) im Bericht:
.superpowers/sdd/2026-09-12-leonida-vice-slice/schichten-report.md

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-13 09:01:36 +02:00
knsoandClaude Opus 5 efe15c4b64 docs: Entwurf für die Minimap
Große Kartenansicht auf Taste M über dem laufenden Spiel: eigene Position
mit Blickrichtung, Fahrzeuge, Zoomen, Verschieben, Klick zum Hinspringen.
Kartenbild vorab aus overview.py mit 1 px/m, Landung neben statt in
Gebäuden über eine Begehbarkeitsmaske. Eingaben werden in der
Capture-Phase abgefangen statt über unbindEvents(), das die ganze Figur
anhalten würde.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 08:35:38 +02:00