Mockup · third pass Altay's sixteen weighted attributes are his real figures, so his 63 is the number you saw. The other three keepers are illustrative — but every score is calculated, not typed in, against the seeded Goalkeeper role's own weights. Try the scoring switch below: three candidate rules over the same figures, and the middle one does the opposite of what it should. The third carries a dial for the one number still guessed — turn it and watch where each thing settles, and where one of them never does. Notes at the foot.

Player comparison

Judged as
Goalkeeper▾
23 weighted columns · 16 attributes, 4 metrics, 3 statistics
Scoring
Player
Attributes i
Metrics i
Statistics i
Score i

What changed, and what the scoring switch turned up

  1. 1. The ranking now stops where the evidence does. Tom Heaton had no football recorded and still came second, above Onana and his seventeen appearances. That is not a rounding problem, it is the arithmetic: the mean divides by the weight that is present, so a kind you never captured is left out of the average rather than counted against it. Strip Onana's season out and his total rises from 62 to 68 — the app was rewarding the absence of data. Players missing a whole kind now sit below a line, unranked, attribute score still shown — the line gives the reason in one clause and keeps the working on hover, because it is worth reading once rather than every time you open the tab. This is the change to argue with: it says a target you have only scouted cannot hold a place in a depth order, which is either obviously right or unacceptable depending on what you use the tab for.
  2. 2. The sample moved onto the grid, and it is not a colour. You said the warning had to live where the decision is made. It could not be amber: amber already means a weighted column was never captured, and both Harrison's 100 and Onana's 39 are already amber for that reason — a second meaning would have made the colour useless. So the minutes are simply printed under the metrics number. Harrison reads 100 / over 90 mins, and the 90 does the work no colour could.
  3. 3. The empty columns were my mock data, not the design. You confirmed every player carries metrics in every category even when they are zero — FM records a keeper's shooting as 0, it does not leave it blank. The mock keepers now do the same, so this tab is seven populated columns that scroll sideways, which is what you said you preferred to wrapping. The collapse-to-one-line survives, but it can now only fire for a player with nothing captured at all. That is the unranked case, and there it is the right treatment: Heaton's metrics tab is four amber rows and a sentence, not six columns of nothing.
  4. Two tabs now. Attributes, then Metrics & statistics together — because a rate and its denominator are one reading, not two. Statistics collapse into a strip at the top; the strip's header keeps the sample visible even closed, since apps, starts and minutes are the numbers every per-90 underneath is divided by.
  5. Clicking a number still lands you in the right place. Metrics opens the tab with the strip shut; Statistics opens it with the strip open. Same two tabs either way.
  6. 4. Totals per 90, on its own, makes it worse. Every lower-is-better statistic in the seed — Fouls Made, Goals Conceded, MLG, Red cards, Yel — is a counting total divided by the squad's largest and then flipped, so on all five the way to score well is to not play. Dividing totals by the player's own 90s is the obvious fix and it promotes Harrison to first: one clean sheet in one game becomes a perfect rate, and the volume that was the only thing holding him back disappears. His statistics score goes 73 → 100 while Altay's falls 73 → 48. I did not predict that, which is why this is a switch on a page and not a recommendation on the issue.
  7. 5. Confidence is what does the work. With both applied — Altay 68, Onana 65, Harrison 56. Harrison's metrics fall 100 → 88, and the gap between him and Altay widens from six points to twelve. Nothing is refused, no threshold fires, and Altay at 990 minutes is barely moved while Harrison at 90 is mostly squad average. Attributes do not move at all: 20 is 20 and no sample is involved. So it is both together or neither — per 90 alone is actively harmful, and confidence is what makes it safe.
  8. 6. In the third model, the dial turns up three answers, not one. Sweeping the prior from 0 to a full season: the depth order settles almost immediately — ten minutes of prior is enough to stop Harrison ranking first overall, and he stays third from there all the way out. His metrics stop topping that column at 580, which is about as close to a vindication as the original 600 was ever going to get. And his statistics never stop topping theirs, at any value on the slider.
  9. Why "never" — and why it is not a bug. Shrinkage is a compression, not a reordering. It pulls every figure toward the same prior, so it narrows the gaps without changing who is on top. At a full season's worth of prior Harrison's clean-sheet rate is still 0.361 against Altay's 0.349, because one clean sheet in one game genuinely is the squad's best rate, and no amount of caution makes a true observation false. Where a thin sample produced an extreme number the dial fixes it; where it produced a real lead, only refusing to score him would — and that is the cliff we already turned down. Which is what pointed at the answer: if no prior can fix his clean-sheet lead, the problem was never the prior. It was turning a count into a rate in the first place.
  10. 7. The recommendation — treat a total by its direction. A volume is only a fair comparison when more of it is better. Goals accumulate to your credit; goals conceded accumulate because you kept playing. So a higher-is-better total keeps its volume and is left exactly as the app has it today, only the perverse half goes per 90, and rates are shrunk. Clean Sheets goes back to being a count — Harrison scores 0.20 on it, as he should for one — and Goals Conceded stops paying him for absence. His statistics fall 73 → 46, last of the three, and his total to 53. Nothing is refused, no threshold fires, and the rate versions are all still there as metrics if that is what you meant to weight.
  11. And the dial stops mattering, which is the tell. Under the recommendation Harrison never leads overall at any prior, stops topping statistics at 40 minutes, and stops topping metrics at 580 — where the third model could never dislodge him from statistics at all. A rule that needs the dial set carefully is a rule doing the wrong thing; this one works at almost any value, which is the argument for not exposing the prior in Settings. Leave it a constant in the code with the reasoning beside it.
  12. The sample columns had to be exempted. Minutes, Appearances, Starts and Sub Appearances are counting totals too, but dividing minutes by 90ths of minutes gives 90 for everybody — the arithmetic is fine and the question is wrong. They measure availability, and availability is a volume. So they stay raw however the rest is treated, which is a wrinkle any real implementation inherits.
  13. Every figure here is computed. Scores, coverage labels, movement arrows and the arithmetic strings all come out of the same formula the app uses, so adding Harrison genuinely moved the others: he tops Cln/90 and xGP/90, and being the squad's best on both is what those two columns now divide by. Altay's metrics number fell because of it — which is the property you signed off, visible.
  14. Ruled — four numbers above, two tabs below, and they are right to disagree. Metrics and Statistics stay separate scores, because splitting them is what makes each one legible; the drawer shows them together, because reading a rate against its sample is a different job from scoring it. The header is not a table of contents for the tabs. Attributes | Form | Score is dead — it collapsed two scores into one to make a header match a tab strip, which is the wrong way round, and #342's four columns stand.
  15. App-wide, as you suspected. Squad comparison, Player evolution and the Metrics tab all show per-90s with no sample beside them. If this reads right here, the same strip belongs on those — that is its own issue, not this one.
  16. Still open — attribute colour bands. Values are plain; your Settings bands would make 15 green and 7 red at a glance. Small change, left out rather than assumed.