Komprimierte Session-Dokumentation. Entscheidungen und Erkenntnisse vollstaendig, Dateilisten und CSS-Details entfernt.
- Wissens-Destillation: 7 Vault-Dokumente geschrieben und verifiziert
- Repo-Bereinigung: Fotografien komplett aus Scope entfernt
- Entscheidung: Fotografien (UAKUG/NIM_FS_XXX) sind nicht Teil des Projekts
- Entscheidung: 3 Bestandsgruppen: Hauptbestand (255), Plakate (26), Tontraeger (1)
- KNOWLEDGE.md ersetzt durch strukturierten
knowledge/Ordner mit 7 Docs + README explore.pyals erster Pipeline-Schritt (~760 Zeilen)- Entscheidung: Knowledge lebt in Repo UND Vault (nicht nur Vault)
- Entscheidung: Bestehende
data/google-spreadsheet/verwenden
- Detailanalyse aller 6 Excel-Tabellen
- Konvolut-Hierarchie entdeckt: Objekt-ID = archivsignatur + " " + folio
- Verknuepfungs-Mechanismus geklaert: String-Matching ueber
name-Spalte - Dokumenttyp-Vokabular erweitert (18 → 25 Werte)
Erkenntnisse:
Unnamed: 2in Objekte = Folio-Spalte (fehlender Header)- Header-Shifts in 3 von 4 Indizes (Org, Ort, Werk)
- IDs in Indizes sind Durchzaehlungen, keine Verknuepfungs-Schluessel
- Case-Inkonsistenzen durchgaengig — Pipeline normalisiert mit
.lower().strip() - Excel-Datetime-Artefakte sind Export-Artefakte, kein Datenproblem
Entscheidungen:
- P1–P5 loest Pipeline automatisch, kein Handlungsbedarf im Google Sheet
- Wikidata-Reconciliation wird eigenes Script (
reconcile.py)
- RiC-O 1.1 Referenzdokument geschrieben
- m3gim-Ontologie: 2 Klassen (MusicalWork, Performance), 4 Object Properties, 2 SKOS-Vokabulare
- validate.py komplett ueberarbeitet (Normalisierung, 25 Dokumenttypen, Cross-Table-Checks)
- transform.py neu geschrieben (Konvolut-Hierarchie, String-Matching, 7 Namespaces → 282 Records)
- build-views.py ueberarbeitet (liest strukturierte RiC-O-Daten → 294 Personen in Matrix)
Erkenntnisse:
- Duale Datenextraktion (strukturiert + Title-Matching) ist robuster als nur eins
- 294 vs 30 Personen in Matrix zeigt den Wert der strukturierten Verknuepfungen
Entscheidungen:
- m3gim-Namespace fuer MusicalWork und Rollen-Qualifikation (RiC-O reicht nicht)
- transform.py statt create-ric-json.py (klarerer Name)
- 3 echte Code-Bugs gefixt:
- HEADER_SHIFTS: Spalten 2+3 vertauscht → 145 falsche Wikidata-URIs. Fix: Reihenfolge + Regex
^Q\d+$ - Q-IDs als Komponistennamen in Kosmos — durch Bug-1-Fix automatisch behoben
rico:hasLanguage→rico:hasOrHadLanguage(falscher Property-Name) → 74 Records mit Sprache
- HEADER_SHIFTS: Spalten 2+3 vertauscht → 145 falsche Wikidata-URIs. Fix: Reihenfolge + Regex
Erkenntnisse:
- Header-Shift-Bug war subtil und nicht durch reine Code-Review erkennbar
- 62/282 Objekte haben Verknuepfungen (22%), nicht 3 wie zuvor angenommen
- formatDate() komplett neu: ISO → menschenlesbare deutsche Formate (6 Regeln)
- countLinks() erweitert um
rico:isAssociatedWithDate,m3gim:hasPerformanceRole
Erkenntnisse:
- 78% der Records haben 0 Verknuepfungen
- 3 Datumsformate: YYYY-MM-DD (100x), YYYY-MM-DD/YYYY-MM-DD (142x), YYYY (1x)
Entscheidungen:
- Monatsabkuerzungen auf Oesterreichisch: "Jaen." statt "Jan."
- "o. D." (ohne Datum) als Archivkonvention
- Kritischer Bug:
getOrderedItems()iterierte nur ueberstore.allRecords, nichtstore.konvolute→ 76 Einzelobjekte unsichtbar - getOrderedItems() neu: Merged standalone Records + Konvolut RecordSets
Entscheidungen:
- Konvolute als eigenstaendige Zeilen mit Toggle-Button
- Bei Suche/Filter: Hierarchie aufgeloest, alle Einzelobjekte flach
- 7 Bestand-View-Probleme behoben (Konvolut-Meta, Folio-Filter, Counter, Detail-Aggregation)
- Anforderungsanalyse (Soll-Ist v5.0): 3 faktische Fehler im Analysedokument identifiziert
- Kritischer Pfad: Mustererkennung → Quellenbeleg → persistente Sammlung — noch nicht geschlossen
Entscheidungen:
- Folio-Records sind Metadaten, keine Archivobjekte → aus allRecords entfernen
- Konvolut-Titel vom Folio-Kind abgeleitet
Pipeline (M1): 3 Bugs in transform.py: Rollen-Normalisierung, Datums-Bereinigung, Ort/Datum-Decomposition.
Quick-Wins (M2): Stats-Bar Jahresvalidierung, Typ-Badges "Nicht klassifiziert", Empty-State "Noch nicht erschlossen", Kosmos-Legende, Malaniuk-Kategorie.
Features (M3–M7): Matrix-Drilldown (Heatmap-Zelle → Dokumentliste), Chronik-Toggle Ort/Person/Werk, klickbare Tags → Index-Navigation, Personen-Filter im Archiv, 4 funktionale Farbkategorien.
Navigation (M8): Info-Modal ersetzt durch 3 eigenstaendige Seiten. Stats-Bar und Info-Button entfernt.
Bestand/Chronik (M9): Folio-Differenzierung, Ohne-Ort-Hinweis, Undatiert-Erklaerung, Agenten-Tooltip.
Matrix/Kosmos (M10): Kategorie-Kuerzel in Matrix, Graduated-Circle-Legende, Zoom/Pan.
Pipeline (M12): Spaltennamen-Normalisierung, Bearbeitungsstand-Mapping.
Archiv UX (M13): Spaltenheader-Sortierung, Custom Autocomplete-Combobox fuer Personenfilter, erweiterte Suche.
Indizes (M14): Viewport-Fix (Flexbox statt max-height), Cross-Grid-Facettensuche, Detail-Expansion mit Archiv-Link.
Wissenskorb (M15): sessionStorage-State, Bookmark-Icons, Korb-Tab als 5. Tab.
KB-Refactor (M16): 12 nummerierte Docs → 5 kanonische + Traceability-Matrix + Quellenindex. Vollarchiv unter _archive/.
- KB-Refactoring zusammengefuehrt
- Bugfix: Indizes-Tab leer (
.tab-contentaufposition: absolute; inset: 0) - Feature: Archiv Reset-Button (alle 3 Filter gleichzeitig zuruecksetzen)
- Bugfix: D3.js passive Event Listener (
touch-action: none)
- Matrix und Kosmos aus Tab-Bar ausgeblendet (hidden-Attribut), Code erhalten
- Wissenskorb: Card-basierte Darstellung mit Metadaten und Verknuepfungen als klickbare Chips
- Detail-Panel (Sidebar) deaktiviert — Navigation zum Archiv-Tab
- Layout-Refactor: Flex-Layout mit fixierter Toolbar und scrollbarem View-Container
- Indizes: Suche + Facet-Chips auf eine Zeile
- Semantische Verknuepfungen: Person/Institution-Trennung, Werk-Rollen
- Neue Seite "Modell" (#modell): Ontologie, Verknuepfungstypen, Normdaten-Statistik
- Konvolut-Expansion: Collapsed als Default
- 4 Info-Seiten von JS-Views zu eigenstaendigen HTML-Dateien migriert
- Einheitliches Template: info-header, info-nav, info-main, info-footer (720px Lesebreite)
- SPA aufraeumen: PAGES-Array entfernt, 18 statt 22 JS-Module
- Statische Zahlen (Stand 2026-02-20): 282 Archiveinheiten, 62 verknuepft (22%), 313 Personen, 94 Werke
- App-Header auf allen 6 Info-Seiten vereinheitlicht (about, projekt, modell, hilfe, impressum, index)
- CSS-Bug gefixt:
.info-page a→.info-main a(verhinderte blaue-auf-blau Links) .gitignoreaktualisiert: antrag.md, handreichung.md ausgeschlossen (DSGVO)
- 16 Vault-Dokumente in thematische Unterordner: Forschung/, Daten/, Technik/, Produkt/, Prozess/
- Knowledge-Ordner im Repo mit Vault synchronisiert
_archive/aufgeloest, Wissen in kanonische Dokumente integriert
- CSS-only Tooltips (
data-tipAttribut) als Ersatz fuer Browser-Tooltips - Chronik-Redesign: Perioden starten zugeklappt, aggregierte Summary-Zeile im Header
- nummerierte Listen mit KUG-Blau-Kreisen auf Info-Seiten
Wikidata-Sichtbarkeit:
- Wikidata-Icon (Original-Barcode-Logo in Markenfarben #990000/#339966/#006699) in allen Indizes, Inline-Detail und Korb
- WD-Coverage-Prozent in Index-Grid-Headern
- Orte-Index: Wikidata-Feld in loader.js + indizes.js ergaenzt
reconcile.py Refactoring:
- MIN_NAME_LENGTH = 3 (verhindert falsche Matches)
- 4 identische Code-Sektionen → generische INDEX_CONFIG-Schleife
- Caching: vorhandene Ergebnisse ueberspringen (--force zum Ignorieren)
- Redundante time.sleep entfernt
- 171 Wikidata-Matches (Personen, Orte, Organisationen, Werke)
RiC-O 1.1 Compliance (OWL-Pruefung gegen RiC-O_1-1.rdf):
rico:hasOrHadAgentexistiert nicht in RiC-O →m3gim:hasAssociatedAgent(bewusste Extension)m3gim:mentions→rico:hasOrHadSubjectmit@type: rico:Person(RiC-O-konform)rico:isAssociatedWithDateist ObjectProperty (Range: Date-Klasse) →m3gim:eventDatefuer Literalerico:descriptiveNoteumbenannt →rico:generalDescription- Locations:
@type: "rico:Place"ergaenzt (161/161) - Bare Properties via
@context-Aliase:name→rico:name,role→m3gim:role,komponist→m3gim:komponist
Geaenderte Dateien: transform.py, build-views.py, audit-data.py, loader.js, format.js, aggregator.js, archiv-bestand.js, archiv-chronik.js, archiv-inline-detail.js, korb.js, indizes.js, constants.js, modell.html
Entscheidungen:
m3gim:hasAssociatedAgentstattrico:hasCreator(zu einschraenkend fuer Archivdaten mit diversen Rollen)- Erwaehnungen als
rico:hasOrHadSubject(domain: RecordResource, range: Thing — standard RiC-O) @context-Aliase fuer kurze JSON-Keys bei semantischer Korrektheit
Mobilitaet-View Verbesserungen:
- Floating-Tooltips (HTML-div ueber SVG) statt CSS-
::after(SVG-Elemente unterstuetzen keine Pseudo-Elemente) - Dokument-Navigation: Klick auf Gastspiel-Dot → Archiv-Tab (1 Dokument) oder Popup-Menue (>1 Dokumente)
- Popup-Menue fuer Multi-Dokument-Dots mit Signatur + Titel-Liste
- Piecewise-linear Zeitskala: BREAK_YEAR=1975, BREAK_RATIO=0.74 komprimiert sparse 1975–2009
- GUEST_DISPLAY_MAP normalisiert Gastspiel-Staedtenamen
- PHASE_ABBR kuerzt Labels bei schmalen Phasen-Baendern
- Legende ueber dem Diagramm
- Unsichtbare Hit-Areas (14px) hinter Pfeilen
Knowledge-Refactor:
- 12 alte Quelldateien in
_archive/pre-refactor/archiviert - 7 destillierte Wissensdokumente als flacher Vault erstellt: forschung.md, datenmodell.md, pipeline.md, frontend.md, visualisierungen.md, entscheidungen.md, projekt-status.md
- knowledge/README.md aktualisiert
- Appendices: journal-volltext.md
Entscheidungen:
- E-36: Floating-Tooltip statt CSS-Pseudo-Elemente
- E-37: Popup-Menue fuer Multi-Dokument-Dots
- E-38: Guest-City-Display-Normalisierung via GUEST_DISPLAY_MAP
- E-39: Piecewise-linear Zeitskala mit Skalenbruch
Pipeline-Audit:
- Vollstaendiger Audit ergab 69 Fehler in validate.py — alle verursacht durch einen einzigen Bug: doppelte UTF-8-Kodierung (Mojibake) in den Vokabular-Listen
- transform.py verarbeitet alle Daten korrekt (kein Datenverlust)
validate.py Fixes:
- Mojibake in VOCAB["bearbeitungsstand"] korrigiert (47 E004-Fehler → 0)
- Mojibake in KOMPOSIT_TYPEN korrigiert (21 E004-Fehler → 0)
normalize_bearbeitungsstand()eingefuehrt: Fuzzy-Matching das transform.py's Logik spiegeltis_komposit_typ()verbessert: Input-Wert vor Vergleich.replace(" ", "")- Ergebnis: 69 Fehler → 1 (E001 PL_07-Duplikat, Sheet-seitig)
Wikidata-CSV-Export:
- Neues Skript
scripts/export-wikidata-csv.py - 5 CSVs in
data/output/wikidata-csvs/: person-matches (152), org-matches (3), location-matches (14), work-matches (2), unmatched (295) - Zweck: VLOOKUP-Import in Google Sheets fuer Nicole/Wolfgang
3 Git-Commits:
feat: Mobilität-Tooltips, Dokument-Navigation, Popup-Menü, Skalenbruchdocs: Knowledge-Base destilliert — 7 flache Dokumente, 12 Quellen archiviertfix: validate.py Encoding-Bugs, Wikidata-CSV-Export, Pipeline-Reports aktualisiert
Erkenntnisse:
- Mojibake-Bugs sind subtil —
.py-Dateien muessen konsistent UTF-8 sein - Fuzzy-Matching in validate.py (wie transform.py) ist robuster als exakte VOCAB-Listen
- 177 verbleibende Warnungen (W004) sind alle Cross-Table-Mismatches — erwartetes Verhalten bei laufender Erschliessung
Cross-Visualization Linking:
- Matrix → Indizes: Person-Name klickbar (navigateToIndex)
- Matrix → Kosmos: Komponist-Link mit Highlight-Event (navigateToView + m3gim:navigate)
- Kosmos → Matrix: Komponist-Popup mit Aktions-Links
- Kosmos → Indizes: Werk-Popup mit Dokumentliste + Index-Link
- Router: navigateToView(tab, context) als generische Cross-View-Funktion
Wissenskorb-Export:
- CSV-Export (Blob-Download) mit allen Korb-Eintraegen
- BibTeX-Export fuer Literaturverwaltung
Kosmos-Overhaul:
- Deterministisches konzentrisches Layout statt instabilem Force-Layout
- Feste Radien: Komponisten-Layer innen, Werk-Layer aussen
- Konsistente Positionierung bei jedem Laden
Refactoring:
- Dead Code entfernt (alte Sankey-Referenzen, ungenutzte Funktionen)
- CSS-Duplikate bereinigt
- Normalisierung in eigenes Modul extrahiert
- Meeting-Referenzen aus allen Knowledge-Docs entfernt
Commits:
feat: Cross-Visualization Linking, Wissenskorb-Export, modell.html aktualisiertrefactor: Dead Code entfernt, CSS-Duplikate bereinigt, Normalisierung extrahiertfix: PERSONEN_KATEGORIEN Import in aggregator.js wiederhergestelltfeat: Kosmos-View komplett neu — deterministisches konzentrisches Layout
Analyse: Systematische Evaluation der 3 Visualisierungen gegen FF1–FF4 ergab:
- FF4 (Mobilitaetsformen) = stark
- FF1 (Graz/Vernetzung) = mittel
- FF2 (Aesthetische Strukturen) = schwach
- FF3 (Wissenstransfer) = schwach
10-Punkte-Plan (Phase 1 + Phase 2) entwickelt und groesstenteils umgesetzt:
Phase 1 — Sofort sichtbar (alle erledigt):
- FF-Badges + Datenabdeckungs-Zeile auf Matrix, Kosmos, Mobilitaet
- 2 fehlende Mobilitaetstypen: National (Lemberg→Wien, ~1950) und Bildung (Zuerich→Graz, 1970)
- Lehrphase: Gestrichelter Balken fuer KUG-Professur (1970–2000) als eigener Ortstyp
- Graz-Tags (gruen hervorgehoben) + Werk-Chips (klickbar → Kosmos) im Matrix-Drilldown
- Netzwerk-Sparkline ueber der Heatmap: 7 Perioden-Intensitaet aus partitur.json
Phase 2 — Tiefere FF-Argumentation (teilweise erledigt): 6. Volle Rollen-Anzeige im Kosmos: Tooltip und Popup zeigen alle Rollen mit Counts 7. Dokument-Sparkline auf Mobilitaet-Timeline: Archivalischer Puls als Flaechendiagramm 8. Kosmos-Phasenfilter (Zeitdimension) — in Arbeit 9. Repertoire-Overlay auf Mobilitaet-Timeline — offen
Knowledge-Base-Konsolidierung:
- Vault: 6 alte Einzeldocs in _archive/ verschoben, Project Overview als einziges Destillat (v4.0)
- Repo: PLAN.md und Status.md geloescht (obsolet/redundant)
- README.md: Tote Links gefixt, Struktur aktualisiert
- 5 stale Knowledge-Docs aktualisiert (frontend, visualisierungen, entscheidungen, projekt-status, README)
- Journal um Session 20 + 21 ergaenzt
Geaenderte Dateien:
docs/js/views/matrix.js— FF-Badges, Sparkline, Drilldown mit Graz-Tags + Werk-Chipsdocs/js/views/kosmos.js— FF-Badges, volle Rollen-Anzeigedocs/js/views/mobilitaet.js— FF-Badges, 2 neue Mobilitaetstypen, Lehrphase, Dokument-Sparklinedocs/css/components.css— FF-Badges, Data-Coverage CSSdocs/css/matrix.css— Sparkline, Drilldown-Tags, Werk-Chipsdocs/css/kosmos.css— Header-Row, Rollen-CSSdocs/css/mobilitaet.css— Header-Rowdocs/data/partitur.json— National/Bildung-Pfeile, Lehrstaette
Kontext: Kritische UI-Analyse ergab Inkonsistenzen: 4 verschiedene Toolbar-Architekturen, 3 verschiedene Phasen-Chip-Implementierungen, 3 verschiedene Tooltip-Stile, uneinheitliche Legende-Platzierung, unvollstaendiges Cross-View-Netzwerk. 6-Phasen-Optimierungsplan erstellt und umgesetzt.
Phase 0 — Zeitfluss Navigate-Listener:
- Zeitfluss empfaengt
m3gim:navigate-Events und highlightet Komponisten-Zeile pendingHighlight/activeHighlight-Pattern fuer Lazy-Highlight nach Render
Phase 1 — Shared Component Foundation:
components.css: ~100 Zeilen shared CSS (.viz-toolbar,.phase-chip,.viz-legend,.viz-tooltip,.viz-zoom-reset)viz-components.js: Neue Datei mitbuildFFBadges(),buildPhaseChips(),buildCoverageFooter()
Phase 2 — Toolbar-Refactor alle 4 D3-Views:
- Alle 4 Views migriert auf
.viz-toolbar+.phase-chip+.viz-legend - ~235 Zeilen view-spezifisches CSS entfernt
- Mobilitaet: NEU Phase-Chip-Bar mit
applyMobPhaseFilter()(Dimming ausserhalb gewaehlter Phase)
Phase 3 — Forschungsfragen schaerfen (FF1–FF4):
- FF1: Graz-Fokus-Toggle in Matrix-Toolbar
- FF1: Netzwerk-Intensitaets-Overlay auf Mobilitaet
- FF2: Genre-Ratio-Annotation im Kosmos bei Phasenfilter
- FF3: Ort-Chips im Kosmos Werk-Popup (klickbar → Orte-Index)
- FF3: Ort-kodierte Dot-Strokes im Zeitfluss (Graz=gruen, Wien=blau, Bayreuth=gold)
- FF4: Repertoire-Kontext in Mobilitaets-Arrow-Tooltips
Phase 4 — Cross-View-Navigation komplettiert:
- 6 neue Navigationslinks: Zeitfluss↔Kosmos, Zeitfluss→Indizes, Mob→Matrix, Mob→Zeitfluss, Matrix→Mob
Phase 5 — Tooltip-Vereinheitlichung:
- Alle 3 D3-Views: einheitlich
.viz-tooltip(dunkler Stil, opacity-Transition)
Bugfixes nach Screenshot-Analyse:
- Kosmos: Flex-Column-Layout, Reset-Button nur bei Zoom, Legende sichtbar
- Mobilitaet: Legende-Spacing vereinheitlicht, Netzwerk-Overlay Position korrigiert
- Console-Diagnostik fuer alle 4 Views
Neue Datei: docs/js/utils/viz-components.js
- Excel-Quelldateien in
data/source/git-getrackt (7 XLSX: Objekte, Verknuepfungen, 4 Indizes, Fotos) .gitignoreangepasst:!data/source/*.xlsxAusnahme- Pipeline-Skripte referenzieren noch
data/google-spreadsheet/→ Migration offen
Entscheidung: Originale XLSX-Quelldateien werden fuer Reproduzierbarkeit im Repo versioniert
Kontext: Analyse ergab 4× duplizierte Patterns (Partitur-Fetch, Tooltip-Logik, Zoom-Setup, Console-Diagnostik) in den 4 D3-Views. 5-Schritte-Plan erstellt und umgesetzt.
Schritt 1 — Partitur-Singleton:
loadPartitur()+getLebensphasen()in loader.js (concurrent-safe mit Promise-Caching)- Alle 4 Views migriert (statt 3× separater Fetch + 1× Hardcode LEBENSPHASEN)
renderZeitflussasync gemacht fuerawait loadPartitur()
Schritt 2 — Tooltip-Controller:
createTooltip(container)in viz-components.js — shared show/move/hide mit Boundary-Clamping- Migriert: Kosmos, Zeitfluss, Mobilitaet (je ~12 Zeilen lokaler Code entfernt)
Schritt 3 — Matrix an Shared-System:
buildFFBadges()Import statt inline-HTML
Schritt 4 — Zoom+Reset-Helper:
setupD3Zoom()in viz-components.js — D3-Zoom mit Reset-Button und Visibility-Toggle- Migriert: Kosmos. Zeitfluss behaelt eigene horizontale Zoom-Logik (zu spezialisiert)
Schritt 5 — Console-Diagnostik:
viewLog(name, color)in viz-components.js — einheitliche Gruppenausgabe- Migriert: alle 4 D3-Views
Ergebnis: viz-components.js gewachsen von 68 → 156 Zeilen (6 Exports statt 3)
Kontext: 5 weitere Refactoring-Kandidaten identifiziert und umgesetzt.
1. aggregator.js — buildKomponistenMap() extrahiert:
- ~90 Zeilen duplizierter Pass-1/Pass-2 Logik (structured subjects + title-matching) in shared Funktion
aggregateKosmos()undaggregateZeitfluss()nutzen beidebuildKomponistenMap(store)
2. Unused Reset-Funktionen entfernt:
resetMatrix(),resetKosmos(),resetMobilitaet()— exportiert aber nie importiert → geloescht
3. CSS konsolidiert:
.matrix-drilldown__kosmos-link+__zeitfluss-link→.cross-link(components.css).kosmos-popup__action+.mob__popup-item→.popup-item(components.css)- ~54 Zeilen view-spezifisches CSS entfernt, ~30 Zeilen shared CSS eingefuehrt
4. Matrix refreshMatrix():
- 6 redundante
reAggregate + renderHeatmap + renderPeriphery + updateActiveFiltersAufrufe → 1 Funktion
5. main.js Registry:
- Switch-Statement (7 cases) →
TAB_RENDERERSMap + 3-zeiligerenderTab()Funktion
6. Repo-Bereinigung:
- 3 ungenutzte View-JSONs aus Git entfernt:
sankey.json,matrix.json,kosmos.json(nurpartitur.jsonwird konsumiert) node_modules/lokal geloescht (~40 MB, kein package.json vorhanden)
Siehe auch: → Projekt-Status · → Pipeline · → Entscheidungen