Skip to content

Metadaten-Güte nach dem MQA-Schema (v63) - #60

Merged
daimpad merged 1 commit into
mainfrom
claude/datenlotse-frontend-setup-r4ylco
Aug 11, 2026
Merged

Metadaten-Güte nach dem MQA-Schema (v63)#60
daimpad merged 1 commit into
mainfrom
claude/datenlotse-frontend-setup-r4ylco

Conversation

@daimpad

@daimpad daimpad commented Aug 11, 2026

Copy link
Copy Markdown
Owner

completeness() zählte gefüllte Pflichtfelder. Ein Datensatz mit allen Pflichtangaben stand damit auf 100 % — auch ohne Schlagwörter, ohne Zeitraum und nur als PDF. Genau dagegen richtet sich der Leitgedanke der Metadata Quality Assurance von data.europa.eu: „filling the DCAT-AP mandatory fields alone is not sufficient".

Das Schema

Dimension Punkte Prüfungen
Auffindbarkeit 100 Schlagwörter (30), Kategorie (30), Raum (20), Zeit (20)
Zugänglichkeit 100 Zugriffs-URL je Verteilung (50), Info-Seite (20), Zugriffsrechte (30)
Interoperabilität 110 Format je Verteilung (30), maschinenlesbar (40), nicht herstellergebunden (20), Zyklus (20)
Nachnutzbarkeit 75 Lizenz je Verteilung (25), Lizenz offen (20), Herausgeber (15), Kontakt mit E-Mail (15)
Kontext 20 Beschreibung (8), Titel (6), Datum (6)

Ersatz, nicht drittes Maß

Der Funktionsname bleibt, damit Badge, Durchschnitt, Sortierung, Dashboard, Status-Einseiter und PDF-Bericht weiter an genau einer graduellen Zahl hängen.

Ein frischer Import fällt damit von ~83 % auf ~46 %. Das ist der Zweck, kein Nebeneffekt — die alte Zahl war zu freundlich. Die Bestnote bleibt erreichbar: ein rundum gepflegter Datensatz erreicht 100 %, sonst wäre die 80-%-Ampelschwelle eine Schikane. Ein Test hält das fest.

Sauber getrennt: was übernommen ist und was nicht

Herkunft
Die fünf Dimensionen und ihre Gewichte aus der MQA-Methodik (Ihr Recherchebericht)
Zuordnung der Einzelprüfungen, Punkte innerhalb einer Dimension eigene Zutat — die Aufteilung im Original lag nicht vor

Ein Test pinnt die fünf Gewichte wörtlich und prüft, dass jede Dimension genau ihr Maximum ausschöpft. Wer eine Prüfung ergänzt, muss innerhalb der Dimension umverteilen statt die Summe zu verschieben.

Was der Wert ausdrücklich nicht ist

Die MQA ruft URLs tatsächlich ab und prüft, ob sie antworten. DatenLotse macht keine Netzaufrufe — geprüft wird nur, ob eine Angabe da und wohlgeformt ist.

Das steht so im Kasten im Qualitäts-Tab. Ohne diesen Satz würde jemand aus „380 von 405" schließen, das Portal werde dasselbe sagen.

Zwei kleinere Entscheidungen

  • MQA_OFFENE_FORMATE ist eine Positivliste. „Nicht herstellergebunden" lässt sich nicht aus dem Fehlen von etwas ableiten — unbekannte Formate zählen deshalb nicht mit, statt großzügig durchgewunken zu werden.
  • renderMqaSummary() mittelt über den ganzen Bestand und nennt die drei schwächsten Einzelprüfungen. Der Einzelwert steht schon auf der Karte; hier interessiert, wo das Inventar schwach ist — „Auffindbarkeit 20 %" ist ein Arbeitsauftrag, ein Durchschnitt ist nur eine Zahl.

Nebenbei: empty() existierte zweimal wortgleich als lokale Hilfe in validateDataset() und inventoryIssues() — jetzt einmal modulweit.

Tests

8 neue Tests, 361 gesamt, alle grün. Drei bestehende wurden auf die neue Semantik umgeschrieben statt gelockert — sie prüfen jetzt, dass eine fehlende Lizenz weiterhin Punkte kostet und dass die v39-Migration die Bewertung nicht verändert.

Der stärkste Test geht die 18 Prüfungen einzeln durch: er leert jeweils genau das, was eine Prüfung braucht, und misst, ob die Differenz ihren vollen Punkten entspricht. Eine wirkungslos in der Liste hängende Prüfung fällt damit sofort auf.

Vier Mutationen geprüft. Der erste Versuch bei der Formatliste war zu schwach gewählt und lief grün durch — „Wolkenformat" enthält keinen der Tokens, eine gelockerte Wortgrenze ändert daran nichts. Erst die schärfere Fassung (Positivliste akzeptiert alles) machte den Test rot.

361 passed (2.4m)

node tools/generate-wissen.js --check9 Seiten aktuell.

🤖 Generated with Claude Code

https://claude.ai/code/session_011QxDJcLg9h8zdL9ZpTTty7


Generated by Claude Code

completeness() zaehlte gefuellte Pflichtfelder. Ein Datensatz mit allen
Pflichtangaben stand damit auf 100 % - auch ohne Schlagwoerter, ohne
Zeitraum und nur als PDF. Genau dagegen richtet sich der Leitgedanke der
Metadata Quality Assurance von data.europa.eu: "filling the DCAT-AP
mandatory fields alone is not sufficient".

Die Zahl folgt jetzt deren Schema: fuenf FAIR-Dimensionen, 405 Punkte,
18 Einzelpruefungen.

  Auffindbarkeit     100   Schlagwoerter, Kategorie, Raum, Zeit
  Zugaenglichkeit    100   Zugriffs-URL, Info-Seite, Zugriffsrechte
  Interoperabilitaet 110   Format, maschinenlesbar, offen, Zyklus
  Nachnutzbarkeit     75   Lizenz je Verteilung, offen, Herausgeber, Kontakt
  Kontext             20   Beschreibung, Titel, Datum

ERSATZ STATT DRITTES MASS: der Funktionsname bleibt, damit Badge,
Durchschnitt, Sortierung, Dashboard, Status-Einseiter und PDF-Bericht
weiter an genau EINER graduellen Zahl haengen. Ein frischer Import faellt
damit von ~83 % auf ~46 % - das ist der Zweck, nicht ein Nebeneffekt.
Die Bestnote bleibt erreichbar (ein rundum gepflegter Datensatz erreicht
100 %), sonst waere die 80-%-Schwelle eine Schikane; ein Test haelt das
fest.

SAUBER GETRENNT, WAS UEBERNOMMEN IST: die fuenf Dimensionen und ihre
Gewichte stammen aus der Methodik (Quelle: Recherchebericht des
Nutzers). Die Zuordnung der Einzelpruefungen und ihre Punkte innerhalb
einer Dimension sind eigene Zutat - die Aufteilung im Original lag nicht
vor. Ein Test pinnt die Gewichte woertlich und prueft, dass jede
Dimension genau ihr Maximum ausschoepft.

AUSDRUECKLICH BENANNT, WAS DER WERT NICHT IST: die MQA ruft URLs
tatsaechlich ab und prueft, ob sie antworten. DatenLotse macht keine
Netzaufrufe und prueft deshalb nur, ob eine Angabe da und wohlgeformt
ist. Der Kasten im Qualitaets-Tab sagt das.

MQA_OFFENE_FORMATE ist eine Positivliste: "nicht herstellergebunden"
laesst sich nicht aus dem Fehlen von etwas ableiten, unbekannte Formate
zaehlen deshalb nicht mit.

renderMqaSummary() zeigt die Dimensionen ueber den ganzen Bestand
gemittelt plus die drei schwaechsten Einzelpruefungen - "Auffindbarkeit
20 %" ist ein Arbeitsauftrag, ein Durchschnitt ist nur eine Zahl.

Nebenbei: empty() existierte zweimal wortgleich als lokale Hilfe in
validateDataset() und inventoryIssues(); jetzt einmal modulweit.

8 neue Tests (361 gesamt), drei bestehende auf die neue Semantik
umgeschrieben statt gelockert. Der staerkste Test geht die 18 Pruefungen
einzeln durch und misst, ob jede ihre vollen Punkte ausmacht. Ein erster
Mutationsversuch war zu schwach gewaehlt und lief gruen durch - erst die
schaerfere Fassung machte ihn rot.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QxDJcLg9h8zdL9ZpTTty7
@daimpad
daimpad merged commit 62b7a42 into main Aug 11, 2026
1 check passed
@daimpad
daimpad deleted the claude/datenlotse-frontend-setup-r4ylco branch August 11, 2026 18:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants