Skip to content

Prize Scoring Contract

Ziel

Dieser Vertrag schneidet explizit, welche Signale aus der Mirror-Quelle stammen und welche Wertungssemantik erst in TargetShot entsteht. Damit bauen Preisschiessen, spaetere Wettkampfflaechen und Admin-Auswertungen nicht lauter leicht abweichende Einzelregeln.

Quellsignale aus der Mirror-Quelle

Die aktuelle Meyton-/Mirror-Strecke liefert fuer Preisschiessen heute keine fachliche Auswertungsmethode wie best10 oder best_teiler direkt mit. Stattdessen kommen Rohsignale:

Signal Herkunft Bedeutung
starterliste Quelle Fachlicher Event-Name bzw. Listenlabel
disziplin Quelle Disziplintext, wird auch fuer Auflage-/LP-Erkennung verwendet
klasse Quelle Klassenhinweis aus dem Quellsystem
trefferzahl Quelle Anzahl registrierter Treffer
totalRing Quelle Gesamtringe ohne Zehntel
totalRing01 Quelle Gesamtringe mit Zehntelauflösung
besterTeiler01 Quelle Bester Teiler mit Zehntelauflösung

Produktlogik oberhalb der Quelle

TargetShot leitet daraus bewusst fachliche Semantik ab:

Produktbegriff Typ Beschreibung
rankingMode Produktregel Aktiver Wertungsmodus eines Preisschiessen-Events
ruleOrigin Produktregel Ob die Regel aus dem Vereinsstandard oder aus einem Event-Override stammt
ranking_value Abgeleitet Ergebniswert, der fuer die Rangbildung benutzt wird
best10_gate Abgeleitet Kennzeichnet, dass nur exakte 10-Schuss-Ergebnisse ranken
adjusted_best_teiler Abgeleitet Fachlich korrigierter Teiler fuer Auflage / LP
tenths_tiebreak Abgeleitet Expliziter Zehntel-Tiebreak fuer Score-basierte Rankings

Aktuell kanonische Wertungsmodi

best10

  • Ursprung: Produktregel
  • Primärmetrik: total_ring desc
  • Tie-Breaker:
  • total_ring_tenths desc
  • adjusted_best_teiler asc
  • attempt_timestamp asc
  • sportpass_id asc
  • Zusatzregel: Nur Ergebnisse mit exakt trefferzahl = 10 werden gewertet

overall_total

  • Ursprung: Produktregel
  • Primärmetrik: total_ring desc
  • Tie-Breaker:
  • total_ring_tenths desc
  • adjusted_best_teiler asc
  • attempt_timestamp asc
  • sportpass_id asc
  • Zusatzregel: Jede Session mit Gesamtwertung kann ranken

best_teiler

  • Ursprung: Produktregel
  • Primärmetrik: adjusted_best_teiler asc
  • Tie-Breaker:
  • total_ring desc
  • total_ring_tenths desc
  • attempt_timestamp asc
  • sportpass_id asc
  • Zusatzregel: Der aus der Quelle kommende Teiler wird vor der Rangbildung fachlich angepasst

Regelherkunft

Aktuell kennt der Vertrag zwei produktive Regelquellen:

  • club_default: Vereinsstandard aus der Club-Konfiguration
  • event_override: Veranstaltungsspezifische Uebersteuerung fuer genau ein Event

Weitere Regelquellen wie source-native oder externe Wettkampfdefinitionen bleiben bewusst ausserhalb dieses ersten Schnitts und koennen spaeter auf denselben Vertrag erweitert werden.

Fachliche Teiler-Anpassung

Die Quelle liefert besterTeiler01, aber nicht die endgueltige fachliche Auswertung fuer alle Vereinskontexte. Daher haelt der Vertrag explizit fest:

  • Auflage wird ueber disziplin / Event-Kontext erkannt und mit auflageMultiplier gewichtet
  • Luftpistole wird ueber disziplin / Event-Kontext erkannt und mit lpDivisor normiert
  • die API liefert deshalb neben dem Rankingmodus auch ein Objekt adjustedBestTeiler, damit Web und spaetere Admin-Flaechen nachvollziehen koennen, ob und wie der Teiler angepasst wurde

API-Vertrag fuer Preisschiessen

/api/club/prize-shooting/results liefert jetzt:

  • defaultEvaluation auf Payload-Ebene fuer den aktiven Vereinsstandard
  • evaluation pro Event mit:
  • mode
  • ruleOrigin
  • primaryMetric
  • tieBreakers
  • sourceSignals
  • derivedSignals
  • best10RequiresExactShotCount
  • adjustedBestTeiler

Damit koennen Folgeflaechen dieselbe Semantik nutzen, statt Rankinglogik noch einmal lokal zu erraten.

Nicht Teil dieses ersten Schnitts

  • allgemeine Wettkampfwertungen ausserhalb von Preisschiessen
  • DSB-spezifische Sonderregeln fuer Koenigsschiessen, Blattl oder spaetere Verbandssonderformen
  • automatisches Mapping aus neuen Quellsystemen wie DISAG

Diese Punkte bauen spaeter auf demselben Vertrag auf, sind aber bewusst nicht Voraussetzung fuer diesen ersten Sprint-10-Schnitt.