Show the predicted scoreline, not decimal expected goals

Coming-up cards and the post-match comparison now use the model's most
likely score ('2-0') instead of decimal goal expectations ('2.3-0.4');
the pre-match model card keeps just the honesty note since the bar's
chip already carries the predicted scoreline.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-12 13:14:08 +02:00
parent e85053aa0a
commit 3d3267d803
4 changed files with 8 additions and 10 deletions
+1 -1
View File
@@ -20,7 +20,7 @@ function ModelHint({ num }: { num: number }) {
<div className="mt-1.5 text-center text-[11px] text-faint"> <div className="mt-1.5 text-center text-[11px] text-faint">
{t.match.modelPrefix} {side ? <>{teamFlag(side)} {side} </> : `${t.common.draw} `} {t.match.modelPrefix} {side ? <>{teamFlag(side)} {side} </> : `${t.common.draw} `}
<span className="font-semibold text-muted">{Math.round(p * 100)}%</span> <span className="font-semibold text-muted">{Math.round(p * 100)}%</span>
<span className="tnum"> · {pred.lambdaHome.toFixed(1)}{pred.lambdaAway.toFixed(1)} {t.match.goalsShort}</span> <span className="tnum" title={t.common.mostLikelyScore}> · {pred.topScore.home}{pred.topScore.away}</span>
</div> </div>
); );
} }
+3 -3
View File
@@ -216,12 +216,12 @@ export function MatchPreviewPage() {
<p className="text-xs text-faint"> <p className="text-xs text-faint">
{finished && f.homeScore != null && f.awayScore != null {finished && f.homeScore != null && f.awayScore != null
? fmt(t.match.predictedVsActual, { ? fmt(t.match.predictedVsActual, {
ph: preview.prediction.lambdaHome.toFixed(2), ph: preview.prediction.topScore.home,
pa: preview.prediction.lambdaAway.toFixed(2), pa: preview.prediction.topScore.away,
ah: f.homeScore, ah: f.homeScore,
aa: f.awayScore, aa: f.awayScore,
}) })
: fmt(t.match.expectedGoalsLine, { home: preview.prediction.lambdaHome.toFixed(2), away: preview.prediction.lambdaAway.toFixed(2) })} : t.match.modelHonestyNote}
</p> </p>
</CardBody> </CardBody>
</Card> </Card>
+2 -3
View File
@@ -96,7 +96,7 @@ export const de: Dict = {
oddsMovementNote: "Durchgezogene Linien: die Buchmacherquoten ohne Marge, im Verlauf bis zum Anstoß. Gestrichelt: die Wahrscheinlichkeiten unseres Modells. Der Markt ist nur Vergleichsmaßstab — das Modell sieht ihn nie.", oddsMovementNote: "Durchgezogene Linien: die Buchmacherquoten ohne Marge, im Verlauf bis zum Anstoß. Gestrichelt: die Wahrscheinlichkeiten unseres Modells. Der Markt ist nur Vergleichsmaßstab — das Modell sieht ihn nie.",
preMatchModel: "Modell vor Anstoß", preMatchModel: "Modell vor Anstoß",
modelExpectation: "Modell-Prognose", modelExpectation: "Modell-Prognose",
expectedGoalsLine: "Erwartete Tore (xG): {home} {away} · Modell-Wahrscheinlichkeiten, keine Wettempfehlung", modelHonestyNote: "Modell-Wahrscheinlichkeiten keine Wettempfehlung.",
recentForm: "Aktuelle Form", recentForm: "Aktuelle Form",
headToHead: "Direkter Vergleich", headToHead: "Direkter Vergleich",
h2h: { h2h: {
@@ -132,8 +132,7 @@ export const de: Dict = {
subbedOff: "Ausgewechselt", subbedOff: "Ausgewechselt",
predictedLineups: "Voraussichtliche Aufstellungen", predictedLineups: "Voraussichtliche Aufstellungen",
predictedLineupsNote: "Voraussichtliche Startelf laut FotMob — die offiziellen Aufstellungen kommen meist rund eine Stunde vor Anstoß.", predictedLineupsNote: "Voraussichtliche Startelf laut FotMob — die offiziellen Aufstellungen kommen meist rund eine Stunde vor Anstoß.",
predictedVsActual: "Erwartete Tore des Modells vor Anstoß: {ph} {pa} · Endstand {ah}{aa}", predictedVsActual: "Modell-Prognose vor Anstoß: {ph}{pa} · Endstand {ah}{aa}",
goalsShort: "Tore",
chips: { chips: {
att: "Zusch.", att: "Zusch.",
ref: "SR", ref: "SR",
+2 -3
View File
@@ -95,7 +95,7 @@ export const en = {
oddsMovementNote: "Solid lines: the bookmaker's odds with the margin removed, drifting toward kickoff. Dashed lines: our model's probabilities. The market is a benchmark — the model never sees it.", oddsMovementNote: "Solid lines: the bookmaker's odds with the margin removed, drifting toward kickoff. Dashed lines: our model's probabilities. The market is a benchmark — the model never sees it.",
preMatchModel: "Pre-match model", preMatchModel: "Pre-match model",
modelExpectation: "Model expectation", modelExpectation: "Model expectation",
expectedGoalsLine: "Expected goals: {home} {away} · model probabilities, not betting advice", modelHonestyNote: "Model probabilities not betting advice.",
recentForm: "Recent form", recentForm: "Recent form",
headToHead: "Head to head", headToHead: "Head to head",
h2h: { h2h: {
@@ -131,8 +131,7 @@ export const en = {
subbedOff: "Subbed off", subbedOff: "Subbed off",
predictedLineups: "Predicted lineups", predictedLineups: "Predicted lineups",
predictedLineupsNote: "FotMob's projected starting XIs — the official lineups usually arrive about an hour before kickoff.", predictedLineupsNote: "FotMob's projected starting XIs — the official lineups usually arrive about an hour before kickoff.",
predictedVsActual: "Model's pre-match expected goals: {ph} {pa} · final score {ah}{aa}", predictedVsActual: "Model's pre-match prediction: {ph}{pa} · final score {ah}{aa}",
goalsShort: "goals",
chips: { chips: {
att: "Att", att: "Att",
ref: "Ref", ref: "Ref",