Every reader-facing number has one entry here. The formula, unit, basis, coverage tier and source layer are copied from config/metrics.yaml; verification and value history live on Metrics and audit.
Registered metrics
League table record
Per-team league record and ranking inputs.
- Formula
- [object Object]
- Unit
- mixed
- Basis
- measured
- Coverage
- match
- Source layer
- league_standings
- Metric ids
- table.record
Limits: Registered family; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
League cutoffs
League positions and cutoff labels.
- Formula
- Configured league cutoffs; positions are read from config/competitions.yaml, not recomputed from results.
- Unit
- mixed
- Basis
- curated
- Coverage
- curated
- Source layer
- league_standings
- Metric ids
- table.cutoffs
Limits: Cutoff positions are configured; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Competition index
Competition identity, coverage and match counts.
- Formula
- One row per configured competition; counts are fixtures or table rows joined by competition_id; coverage states come from the source frame.
- Unit
- mixed
- Basis
- mixed
- Coverage
- derived
- Source layer
- league_standings
- Metric ids
- competition.index
Limits: Competition metadata and coverage; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
League Cup
League Cup groups, rounds, ties and qualifiers.
- Formula
- Group tables: points = 3*won + drawn + shootout bonus; ties and rounds counted from cup fixtures; qualifiers read from config/cups.yaml.
- Unit
- mixed
- Basis
- mixed
- Coverage
- derived
- Source layer
- cup_fixtures
- Metric ids
- cup.league
Limits: Cup structure and results; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Scottish Cup
Scottish Cup rounds, ties and coverage.
- Formula
- Rounds and ties counted from cup fixtures; coverage compares published ties with the configured official round count.
- Unit
- mixed
- Basis
- mixed
- Coverage
- derived
- Source layer
- cup_fixtures
- Metric ids
- cup.scottish
Limits: Cup structure and results; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Matchday form
Recent and split form for both teams.
- Formula
- [object Object]
- Unit
- mixed
- Basis
- measured
- Coverage
- match
- Source layer
- league_results_current
- Metric ids
- matchday.form
Limits: Registered family; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Matchday strength
League strength, percentiles and comparison.
- Formula
- ppp = points/played; ppg = points/played; gf_pg = gf/played; ga_pg = ga/played; gd_pg = (gf-ga)/played; shots_for_pm = shots/matches; shot_share = team shots/(team + opponent shots); rank = 1 + count of better teams (lower is better for ga_pg); league_size = teams in the league; position_gap and ppg_gap = team value minus opponent value. Percentiles set the bar length; ranks set the visible label.
- Unit
- mixed
- Basis
- inferred
- Coverage
- derived
- Source layer
- league_standings
- Metric ids
- matchday.strength
Limits: Registered family; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Matchday style
Shot profile, approach index and style lean.
- Formula
- Approach index is the mean of within-league percentiles for shots, shots on target, goals and corners; possession is not used. Style lean is the sign of the approach index against the league median.
- Unit
- mixed
- Basis
- inferred
- Coverage
- derived
- Source layer
- league_team_stats
- Metric ids
- matchday.style
Limits: Shot-profile derivatives; provenance checked, not independently recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Predicted XI
Predicted lineups, scores, selection weights, selection confidence and availability.
- Formula
- Player score = 0.20*form + 0.10*minute_share + 0.15*recent_rating + 0.15*role_fit + 0.18*recency_start + 0.22*start_rate. Availability counts curated entries; opponent availability is not modelled.
- Unit
- mixed
- Basis
- inferred
- Coverage
- event
- Source layer
- lineups_roles
- Metric ids
- matchday.lineup
Limits: Selection and formation projections; provenance checked, not recomputed. The opponent rating is only present when /fixtures/players returns one.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Matchday coverage
Snapshot, lineup and form coverage.
- Formula
- age_hours = (generated_at - snapshot_at)/3600; lineup_coverage = fixtures_with_lineups/fixtures; counts are from the opponent snapshot.
- Unit
- mixed
- Basis
- measured
- Coverage
- match
- Source layer
- league_results_current
- Metric ids
- matchday.coverage
Limits: Registered family; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Head-to-head
Recent meetings and results.
- Formula
- League meetings joined by date and team ids; result is W/D/L for Aberdeen; score is the final score, with shootouts shown separately.
- Unit
- mixed
- Basis
- measured
- Coverage
- match
- Source layer
- history
- Metric ids
- matchday.head-to-head
Limits: Historical meeting snapshot; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Next fixtures
Upcoming club fixtures.
- Formula
- Upcoming competitive club fixtures from the merged season schedule, ordered by local date and kickoff; current plus the next five are rendered on matchday. Conflict-review and friendly rows are excluded from the lookahead.
- Unit
- mixed
- Basis
- measured
- Coverage
- match
- Source layer
- club_fixtures
- Metric ids
- matchday.next-fixtures
Limits: Fixture snapshot; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Needs summary
Family counts and availability summary.
- Formula
- [object Object]
- Unit
- mixed
- Basis
- inferred
- Coverage
- derived
- Source layer
- needs
- Metric ids
- needs.summary
Limits: Registered family; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Needs families
Per-family depth, quality, availability, market and roster metrics.
- Formula
- measured_score = 100 * sum(w*x)/sum(w) over available drivers: depth_gap 0.30, quality_gap 0.20, top_share 0.10, availability_risk 0.25, age_risk 0.15. availability_risk = (out + 0.5*doubtful)/known projected players; null when known = 0.
- Unit
- mixed
- Basis
- inferred
- Coverage
- derived
- Source layer
- needs
- Metric ids
- needs.family
Limits: Derived family metrics; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Roster space
Roster current/max and outgoing-first policy.
- Formula
- roster current = senior squad players under contract; max from config/needs.yaml; outgoing-first policy is a config flag, not a measured value.
- Unit
- mixed
- Basis
- curated
- Coverage
- curated
- Source layer
- needs
- Metric ids
- needs.roster-space
Limits: Roster policy; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Needs coverage
Needs coverage and availability status.
- Formula
- Counts of known and unknown availability entries, contract data and squad rows; states are available, partial or unavailable.
- Unit
- mixed
- Basis
- mixed
- Coverage
- derived
- Source layer
- needs
- Metric ids
- needs.coverage
Limits: Registered family; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Transfer summary
Register totals, players and period.
- Formula
- [object Object]
- Unit
- mixed
- Basis
- curated
- Coverage
- curated
- Source layer
- transfer_register
- Metric ids
- transfers.summary
Limits: Registered family; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Transfer windows
Per-window arrival/departure and valuation counts.
- Formula
- [object Object]
- Unit
- mixed
- Basis
- curated
- Coverage
- curated
- Source layer
- transfer_register
- Metric ids
- transfers.window
Limits: Registered family; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Transfer rows
Per-move fee, loan and verification values.
- Formula
- One row per confirmed move; fee is disclosed/reported/inferred/undisclosed; inferred ranges are modelled, never treated as fees; loan terms are unknown unless confirmed.
- Unit
- mixed
- Basis
- curated
- Coverage
- curated
- Source layer
- transfer_register
- Metric ids
- transfers.row
Limits: Per-row curated fees and terms; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Transfer valuation
Modelled fee ranges and calibration counts.
- Formula
- Fee range from disclosed comparables by position, age and league; calibration counts are the rows with a disclosed or reported anchor used to fit the range.
- Unit
- mixed
- Basis
- inferred
- Coverage
- derived
- Source layer
- valuation
- Metric ids
- transfers.valuation
Limits: Modelled valuation; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Sell-on clauses
Sell-on percentages, basis and summary.
- Formula
- Sell-on percentage is published only where confirmed; summary counts confirmed, reported and unknown clauses; unknown is not zero.
- Unit
- mixed
- Basis
- curated
- Coverage
- curated
- Source layer
- transfer_register
- Metric ids
- transfers.sell-on
Limits: Curated sell-on clauses; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Transfer loans
Loan-in and loan-out slices.
- Formula
- Loan-in and loan-out rows from the confirmed register; one row per loan; parent club, dates and terms are source-linked.
- Unit
- mixed
- Basis
- curated
- Coverage
- curated
- Source layer
- loans
- Metric ids
- transfers.loans
Limits: Loan rows; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Transfer plausibility
Withheld suspect rows and plausibility counts.
- Formula
- Counts of rows withheld or flagged by the plausibility audit; the audit compares fee, age, position and window against the published register.
- Unit
- mixed
- Basis
- curated
- Coverage
- curated
- Source layer
- transfer_register
- Metric ids
- transfers.plausibility
Limits: Plausibility policy; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Transfer completeness audit
Seniority review, position coverage and gap ledger counts.
- Formula
- Counts by seniority, position coverage and gap status; the ledger records unresolved or duplicate identities, not transfer claims.
- Unit
- mixed
- Basis
- curated
- Coverage
- curated
- Source layer
- transfer_register
- Metric ids
- transfers.audit
Limits: Completeness audit is report-only; it does not prove provider completeness.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Transfer coverage
Audited/curated window coverage.
- Formula
- Windows are audited or curated partial; counts are confirmed rows per window; earlier windows are partial, not silently complete.
- Unit
- mixed
- Basis
- curated
- Coverage
- curated
- Source layer
- transfer_register
- Metric ids
- transfers.coverage
Limits: Registered family; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
History scorecard
Era aggregates: seasons, managers, honours and positions.
- Formula
- seasons = covered seasons; best/worst_position = min/max league position; average_position = mean season position; average_points = mean season points; manager_count = distinct people with a league match; honours_total = register count.
- Unit
- mixed
- Basis
- mixed
- Coverage
- curated
- Source layer
- history
- Metric ids
- history.scorecard
Limits: Registered family; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
History seasons
Season-level history rows.
- Formula
- One row per season; league position/points from the club payload; cup and European outcomes from season documents; manager spells kept separate.
- Unit
- mixed
- Basis
- mixed
- Coverage
- curated
- Source layer
- history
- Metric ids
- history.season
Limits: Curated season refs; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
History staff
Manager/staff stints and records.
- Formula
- One row per manager or staff stint; played, points, gf and ga are league matches only; interim spells are separate.
- Unit
- mixed
- Basis
- curated
- Coverage
- curated
- Source layer
- history
- Metric ids
- history.staff
Limits: Curated staff stints; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
History baseline
League-only baseline window.
- Formula
- [object Object]
- Unit
- mixed
- Basis
- measured
- Coverage
- match
- Source layer
- history
- Metric ids
- history.baseline
Limits: Registered family; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
History coverage
History season/backfill coverage.
- Formula
- Counts of seasons with history documents, backfilled lineups, staff and honours; missing seasons are labelled unavailable.
- Unit
- mixed
- Basis
- mixed
- Coverage
- curated
- Source layer
- history
- Metric ids
- history.coverage
Limits: Registered family; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
History season documents
Per-season history documents.
- Formula
- Document envelope: one per season with review, style, selection, staff, transfers and honours; measured facts and the labelled assessment are kept separate.
- Unit
- mixed
- Basis
- mixed
- Coverage
- curated
- Source layer
- history
- Metric ids
- history.season-document
Limits: Curated season documents; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Squad summary
Squad size, official-roster reconciliation, loans, role evidence and coverage counts.
- Formula
- [object Object]
- Unit
- mixed
- Basis
- measured
- Coverage
- event
- Source layer
- squad_identity
- Metric ids
- squad.summary
Limits: Registered family; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Loan scopes
Official team-list loans, current-register loans and all-time register loans, with the reconciliation between them.
- Formula
- official_list counts status loan_out in the official squad rows; register_current counts confirmed loan rows for the current season; register_all_time counts every confirmed loan row. The three are published separately and never substituted for one another.
- Unit
- count
- Basis
- mixed
- Coverage
- curated
- Source layer
- loans
- Metric ids
- squad.loan-scope
Limits: The official team list and the transfer register are different scopes; both counts are shown.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Squad players
Per-player totals, playing time, role, position and official-roster reconciliation fields.
- Formula
- Playing time reconstructed from lineups and substitution events; starts and minutes are competitive-only; role shares use starting-XI observations; totals sum competition rows.
- Unit
- mixed
- Basis
- mixed
- Coverage
- event
- Source layer
- squad_identity
- Metric ids
- squad.players
Limits: Per-player rows; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Squad metadata
Role/career/position/attribute coverage metadata.
- Formula
- Coverage flags for role, career, position and attribute data; unknown fields are null, not filled.
- Unit
- mixed
- Basis
- mixed
- Coverage
- event
- Source layer
- squad_identity
- Metric ids
- squad.meta
Limits: Coverage metadata; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Player pages
Per-player page panels, two-figure Nightingale rose, availability projection and recent match log.
- Formula
- Document envelope: player totals, playing time, role evidence, position stats, the published rose axes, the curated availability projection and the latest competitive match rows for one player. The rose uses league-only rates from the provider season totals; each percentile is the midrank rank of the raw value in the player's league and role cohort (provider-group fallback), with conceded_p90 ranked on negated values. The percentile is null when the cohort or value is unavailable. Where current-season Premiership minutes are below the squad threshold, the rose uses the most recent prior Premiership season with at least 180 league minutes and a same-season cohort; season_used, cohort_season, fallback and fallback_note are published and visible. The summary minutes remain current-season. The match log is a projection of the normalized player-match rows joined to the fixture date, opponent and score; it is not recomputed in React.
- Unit
- mixed
- Basis
- mixed
- Coverage
- event
- Source layer
- player_match_stats
- Metric ids
- player.page
Limits: Player page rows; provenance checked, not recomputed. The provider rating is opaque and league-relative; it is not a verdict. Rose percentiles are within one league and role cohort; there is no cross-league ranking. Availability is the curated ledger projection, not an inferred injury. The recent match log is limited to the latest 10 competitive current-season rows with provider coverage; missing values are a dash.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Rumour summary
Curated rumour counts and status.
- Formula
- [object Object]
- Unit
- mixed
- Basis
- curated
- Coverage
- curated
- Source layer
- rumours
- Metric ids
- rumours.summary
Limits: Registered family; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Rumour profile
Advisory recruitment profile weights and buckets.
- Formula
- Advisory profile from active incoming external_target rows only; current squad, current non-official and former players are excluded, and return links are listed separately. Buckets are descriptive, not probabilities or recommendations.
- Unit
- mixed
- Basis
- inferred
- Coverage
- derived
- Source layer
- rumours
- Metric ids
- rumours.profile
Limits: Advisory profile; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Forum signal
Fan-signal coverage, sentiment and profile.
- Formula
- Mention counts from sampled first pages; each name is labelled by canonical affiliation; the position and age profile counts external_target only; topic-level VADER sentiment only; no per-player sentiment score is published.
- Unit
- mixed
- Basis
- mixed
- Coverage
- curated
- Source layer
- forum_signal
- Metric ids
- forum.signal
Limits: Reference fan signal; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Provenance layers
Layer/source row counts and truth table.
- Formula
- Row counts by source layer; status is the source probe state; coverage gaps remain visible in the truth table.
- Unit
- mixed
- Basis
- mixed
- Coverage
- derived
- Source layer
- computed
- Metric ids
- provenance.layers
Limits: Provenance summary; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Coverage
Build coverage counts across surfaces.
- Formula
- Counts of built pages and published payloads per surface; used by the build status page.
- Unit
- mixed
- Basis
- mixed
- Coverage
- derived
- Source layer
- computed
- Metric ids
- coverage.surfaces
Limits: Registered family; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Former-player definition
Configured former-player universe, rival list, development proxy and sell-on policy.
- Formula
- Read from config/former_players.yaml; the universe is the latest published permanent/free departure, excluding current squad, returns and loan-outs.
- Unit
- mixed
- Basis
- curated
- Coverage
- curated
- Source layer
- former_player_record
- Metric ids
- former.definition
Limits: The register covers 2019-20 onward; earlier departures are outside the record. A definition is a policy, not a claim that every departure is captured.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Former-player summary
Former-player counts by departure, destination, current status, rival spell and coverage.
- Formula
- One row per canonical former player; buckets count those rows; a missing value is unknown, never zero.
- Unit
- count
- Basis
- mixed
- Coverage
- derived
- Source layer
- former_player_record
- Metric ids
- former.summary
Limits: A later career is context, not proof that a sale was right or a fee was good.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Former-player rows
One row per canonical former player with departure, Aberdeen record, post-career summary and sell-on reference.
- Formula
- The universe rule, then one Aberdeen tenure aggregation and one post-career league aggregation per player. Provider ratings stay league-relative.
- Unit
- mixed
- Basis
- mixed
- Coverage
- derived
- Source layer
- former_player_record
- Metric ids
- former.players
Limits: Post-career ratings are provider values and are not comparable across leagues. A player without an API id has no measured post-career record.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Former-player post-Aberdeen seasons
League season rows and per-season rates after the Aberdeen departure.
- Formula
- League-only provider seasons after departure; per-90 rates only above the configured minutes gate; no cross-league percentile.
- Unit
- mixed
- Basis
- measured
- Coverage
- match
- Source layer
- former_player_record
- Metric ids
- former.post-seasons
Limits: Cup and European provider rows are stored locally but excluded because some repeat league totals. The provider does not cover every league.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Former-player sell-on watch
Sell-on clause event, receipt and missing-input state.
- Formula
- Detect the first permanent/free move away from the buyer; compute a receipt only when percentage, basis and every required public fee are evidenced; otherwise return the missing inputs.
- Unit
- mixed
- Basis
- mixed
- Coverage
- curated
- Source layer
- sell_on_events
- Metric ids
- former.sell-on
Limits: Instalments, add-ons, agent fees and solidarity terms are unknown. A receipt is an implied gross share before deductions, not confirmed cash.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Former-player development scorecard
Descriptive exit cohorts and post-Aberdeen distributions.
- Formula
- Counts and distributions over the canonical former players; young exits at the configured age, developed proxy at the configured debut age and starts; no composite score.
- Unit
- mixed
- Basis
- mixed
- Coverage
- derived
- Source layer
- former_player_record
- Metric ids
- former.scorecard
Limits: The counterfactual is unobservable; later success does not prove a sale was wrong. The developed proxy is not an academy register.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Former-player coverage
Backfill counts, gaps and current-club coverage.
- Formula
- Expected player-seasons from departure to current; present league seasons; gaps and provider budget from the local backfill meta.
- Unit
- mixed
- Basis
- measured
- Coverage
- derived
- Source layer
- former_player_record
- Metric ids
- former.coverage
Limits: Provider coverage varies by league and season.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Former-player forum profile
Former-player mention lane and external-target profile counts.
- Formula
- Signals are labelled by affiliation from the current squad and former register; position and age mixes count external_target only; the former lane is a filtered view of the same signal rows.
- Unit
- mixed
- Basis
- mixed
- Coverage
- derived
- Source layer
- forum_signal
- Metric ids
- forum.former-profile
Limits: Sampled first pages only; a mention is not a target or a probability.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Curated former-player rumour lane
Curated rumours whose subject is a former player.
- Formula
- Rows whose canonical affiliation is former_player; a return link is a former player named as an incoming target and is shown separately.
- Unit
- count
- Basis
- curated
- Coverage
- curated
- Source layer
- rumours
- Metric ids
- rumours.former-lane
Limits: The curated register is currently empty until a sourced row is added.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Cross-surface consistency audit
Pass/fail counts for the published cross-surface consistency checks, including the former-player, result/form, semantic, epoch and manifest checks.
- Formula
- One record per named consistency check; passed + failed = checks.
- Unit
- count
- Basis
- mixed
- Coverage
- derived
- Source layer
- computed
- Metric ids
- consistency.summary
Limits: Generated from the same published corpus; it catches disagreement, not an incorrect shared formula.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Freshness thresholds
Dataset, availability and per-source freshness states exposed to the client.
- Formula
- Read from config/matchday.yaml stale_after_hours, config/availability.yaml policy.max_age_days and the former-player refresh timestamp.
- Unit
- mixed
- Basis
- measured
- Coverage
- derived
- Source layer
- computed
- Metric ids
- manifest.freshness
Limits: Config-backed thresholds plus measured source ages; not a quality verdict.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Club payload
Aberdeen club summary, history and news rows.
- Formula
- Club summary joins league table, recent results, upcoming fixtures and news metadata by club id; no commercial or attendance series is invented.
- Unit
- mixed
- Basis
- mixed
- Coverage
- match
- Source layer
- league_results_current
- Metric ids
- clubs.aberdeen
Limits: Club summary payload; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Availability
Availability ledger coverage and entries.
- Formula
- Entries require a player key, status, source id and verified_at; known/unknown counts are over the current squad; a provider injury boolean is not team news.
- Unit
- mixed
- Basis
- curated
- Coverage
- curated
- Source layer
- availability
- Metric ids
- availability.ledger
Limits: Curated team news; provenance checked, not recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
The case document
Owner view, chairman frame, thesis and state.
- Formula
- Document envelope: owner view, chairman frame, thesis, claims and coverage state; opinion is attributed, measured counts are labelled.
- Unit
- mixed
- Basis
- mixed
- Coverage
- derived
- Source layer
- themes
- Metric ids
- case.document
Limits: Case claim; provenance checked, not independently recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
The case claims
The claim register: order, domain, status and counts.
- Formula
- One row per claim; count is the qualifying rows in the claim evidence table; status is supported, partial, can't test yet or not supported; order is editorial.
- Unit
- mixed
- Basis
- mixed
- Coverage
- derived
- Source layer
- themes
- Metric ids
- case.claims
Limits: Case claim; provenance checked, not independently recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Claim evidence
The evidence table attached to each claim.
- Formula
- One row per evidence item; count is the observed value, sample is the denominator or qualifying set; source and period are carried with the row.
- Unit
- mixed
- Basis
- mixed
- Coverage
- derived
- Source layer
- themes
- Metric ids
- case.evidence
Limits: Case claim; provenance checked, not independently recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Peer benchmark
League performance of the other SPFL clubs.
- Formula
- League performance of the other SPFL clubs: best/worst/median position and points from the computed tables; current is the latest season position.
- Unit
- mixed
- Basis
- measured
- Coverage
- match
- Source layer
- themes
- Metric ids
- case.benchmark
Limits: League performance only; other clubs transfer and wage models are not in the record.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Case coverage
Availability, history and missing data classes.
- Formula
- Counts of known and unknown data classes; unknown is not zero and is listed in the coverage block.
- Unit
- mixed
- Basis
- mixed
- Coverage
- derived
- Source layer
- themes
- Metric ids
- case.coverage
Limits: Case claim; provenance checked, not independently recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
The team now
League record and kick-off shape churn.
- Formula
- played = competitive matches in the period; points = 3*won + drawn; gf/ga = league goals for/against; form = last five league results; churn = kick-off shape changes.
- Unit
- mixed
- Basis
- measured
- Coverage
- match
- Source layer
- themes
- Metric ids
- case.claim.team-now
Limits: Case claim; provenance checked, not independently recomputed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
The defence
Three-at-the-back record, wide roles and availability.
- Formula
- matches = matches with three centre-backs at kick-off; points_pg = points/matches; ga_pm = goals against/matches; wb_starts_pm = wing-back starts/matches; wf_starts_pm = wide-forward starts/matches; denominator = qualifying matches only.
- Unit
- mixed
- Basis
- measured
- Coverage
- match
- Source layer
- themes
- Metric ids
- case.claim.defence
Limits: Four three-CB matches; association only. Availability is unknown.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
The attack
Goals, shot share and the set-play/error gap.
- Formula
- gf/ga = league goals; shot_share = Aberdeen shots/(Aberdeen + opponent shots); attack_share = goals from wide forwards and strikers/total league goals; roles from the starting-XI grid.
- Unit
- mixed
- Basis
- measured
- Coverage
- match
- Source layer
- themes
- Metric ids
- case.claim.attack
Limits: No event data for set-piece goals, errors or penalties.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
The managers
Manager phases, runs and the cup.
- Formula
- played/ppg by manager stint; winning_run/winless_run = longest league run; cup outcome from the honours register; interim spells are separate.
- Unit
- mixed
- Basis
- measured
- Coverage
- match
- Source layer
- themes
- Metric ids
- case.claim.managers
Limits: 18 Robinson matches; no pre-declared variance measure.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
The squad
Arrivals, departures, age, U21 minutes and the Morris sale.
- Formula
- arrivals/departures = confirmed register rows in the window; median_age = median current squad age; u21_minutes_share = U21 minutes/total minutes; Morris sale = confirmed transfer.
- Unit
- mixed
- Basis
- mixed
- Coverage
- curated
- Source layer
- themes
- Metric ids
- case.claim.squad
Limits: Confirmed business only; fees are mostly undisclosed.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
The chairman's record
The Cormack-era record, managers, honours and transfers.
- Formula
- seasons = covered seasons; positions from computed league tables; honours from the register; manager_count = distinct people; europe from season documents.
- Unit
- mixed
- Basis
- mixed
- Coverage
- curated
- Source layer
- themes
- Metric ids
- case.claim.chairman-record
Limits: The record cannot prove causation or boardroom intent.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Match document
One played-fixture document: score, summary, scoreboard, stats, fxG with model and goals ranges, timeline, lineups, player stats, performance, form and coverage.
- Formula
- One document per canonical played fixture; final score is authoritative; summary, timeline and scoreboard use regular goals only; missing classes are null with coverage labels; duplicate aliases are separate. The xg block carries fxG, an 80% model range, an 80% goals range, provider xG with its source, shots, penalties, xG per shot and the over/underperformance position.
- Unit
- mixed
- Basis
- mixed
- Coverage
- match
- Source layer
- computed
- Metric ids
- matches.document
Limits: The document family is checked for presence and source; the two ranges are checked for arithmetic and ordering, not independently recalibrated per page. fxG is a team-match estimate, not provider xG, xGOT or a shot-level location model; provider xG is a different model and is never blended into it.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Season overview
Current position and form, next fixtures, official and derived availability, measured aims, squad-decision lenses and the category bridges.
- Formula
- A projection of the current table row, the merged season schedule, the AFC availability ledger, sourced card rules, named-squad membership, matchday contenders, the season expectations and factual squad-decision lenses. No value, fee, wage, contract expiry or medical diagnosis is derived. Counts sum to the active universe (official list minus loanees out); the five official loan-outs are separate. Aims are analyst-set targets with a measured current value and status; they are not club targets.
- Unit
- mixed
- Basis
- mixed
- Coverage
- derived
- Source layer
- computed
- Metric ids
- analysis.summary
Limits: Inferred absence is not a medical diagnosis; cause is not published. Suspension rules are watch/review-only until the current SFA protocol is sourced. No contract-expiry, free-agent, wage, fee or release-clause data is held. Market/value language is not used; squad decisions are measured lenses only.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Fixture index
The fixture index: played results plus the remaining scheduled fixtures.
- Formula
- count = canonical played fixtures (duplicate aliases excluded); each played row carries score, result, depth and href. scheduled = remaining canonical fixtures after the played registry and conflict handling. scheduled_count = rows with status scheduled; scheduled_rows_total includes conflict_review rows; conflict_count = conflict_review rows. Conflict-review rows are retained but excluded from forward-looking surfaces.
- Unit
- mixed
- Basis
- measured
- Coverage
- match
- Source layer
- computed
- Metric ids
- fixtures.index
Limits: Index rows are checked for presence; the fixture pages carry the detailed source coverage.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
fxG document
Team-match expected goals from open-play shot zones, shots on target, blocked shots and penalties; a model range, a goals range, provider-xG calibration, transfer check, provider-style estimate, manager splits, aggregates and coverage.
- Formula
- open_play_sot = max(0, shots_on_target - penalty_sot_subtracted); open_play_insidebox = max(0, shots_insidebox - penalty_attempts); fxG_open = a selected linear model on open-play inside-box, outside-box, shots on target, off-target and blocked counts; fxG = fxG_open + 0.76 * penalty_attempts. Coefficients are fitted by OLS to 2026-27 Premiership team rows where provider xG exists. The 80% model range is the 10th-90th percentile of match-clustered bootstrap predictions plus the leave-one-match-out residual pool. The 80% goals range is the convolution of a beta-binomial open-play distribution and a binomial penalty distribution. Aggregate variances are combined, never summed as intervals. provider_estimate = max(0, intercept + slope * fxg) for rows without provider xG; actual and estimated provider values are never summed. manager_splits sum league match rows by date-attributed manager stint, for and against separately.
- Unit
- mixed
- Basis
- inferred
- Coverage
- derived
- Source layer
- computed
- Metric ids
- xg.document
Limits: fxG is a team-match estimate from shots, shot zones and penalties. It is not a location model, not xGOT and not provider xG. The record has no shot coordinates, distance, angle, body part, pressure or goalkeeper position. The coefficients are calibrated to 2026-27 football-data provider xG. The gate is leave-one-match-out inside that season; the 2025-26 API-Football check crosses season and provider and is informational, not a clean holdout. Penalties are priced at a fixed 0.76 xG and removed from open-play counts. Own goals, deflections and shootouts are outside the model. The two ranges answer different questions. Neither is a confidence interval for team quality, a result prediction or proof of finishing skill. A discrete goals range can cover more than its nominal level. The provider-style estimate is a separate calibration for rows without provider xG, not provider xG itself.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
xG per shot
Expected goals divided by shots for a team match or aggregate.
- Formula
- fxg_per_shot = fxg / shots; null when shots is zero or unavailable.
- Unit
- xG per shot
- Basis
- inferred
- Coverage
- match
- Source layer
- computed
- Metric ids
- xg.per-shot
Limits: Penalties are included in the numerator and denominator; the value is a descriptive scale, not a shot-level probability.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Goals minus fxG
Observed goals minus the team-match fxG estimate, with a shifted goals range.
- Formula
- goals_minus_fxg = goals - fxg. The shifted goals range is goals_low - fxg to goals_high - fxg.
- Unit
- goals
- Basis
- inferred
- Coverage
- match
- Source layer
- computed
- Metric ids
- xg.goals-minus
Limits: One match or one season is not proof of finishing skill; overperformance usually regresses and style changes the chance profile.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
fxG model range
The 80% range for the fxG estimate.
- Formula
- 10th-90th percentile of match-clustered bootstrap predictions plus a draw from the leave-one-match-out residual pool. Aggregates sum per draw; per-match ranges are never summed as intervals.
- Unit
- goals
- Basis
- inferred
- Coverage
- match
- Source layer
- computed
- Metric ids
- xg.model-range
Limits: This is model uncertainty, not a result prediction or a confidence interval for team quality.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Goals range
The 80% range of goals from the same chances.
- Formula
- Convolution of a beta-binomial open-play goal distribution and a binomial penalty distribution; aggregate distributions are convolved across matches. The range is the 10th-90th percentile.
- Unit
- goals
- Basis
- inferred
- Coverage
- match
- Source layer
- computed
- Metric ids
- xg.goals-range
Limits: Shot quality is heterogeneous; the binomial approximation is conservative. The range is not a prediction of the score and not a verdict on finishing.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
fxG shot profile
Measured shots, shots on target, off-target, blocked, inside-box, outside-box and penalty counts behind a team-match fxG value.
- Formula
- Counts are carried from the licensed team statistics and event feed; missing values are null, never zero.
- Unit
- counts
- Basis
- measured
- Coverage
- match
- Source layer
- league_team_stats
- Metric ids
- xg.shot-profile
Limits: Provider shot counts can disagree slightly across sources; the source row is named on the match page.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Heavy defeats
Cormack-era defeats by four or more goals, newest first.
- Formula
- goals_for/goals_against are the final score for each defeat with a margin of four or more; one row per fixture, newest first; the threshold is a display parameter, not a modelled value.
- Unit
- goals
- Basis
- measured
- Coverage
- match
- Source layer
- computed
- Metric ids
- history.defeats
Limits: The four-goal threshold is a presentation choice; the match page carries the full score and record.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Scouting player pool
One row per ranked player per league with provider season statistics, within-league role percentiles and profile scores.
- Formula
- Per-90 values are stat * 90 / minutes. Completed passes are passes_total * pass_accuracy / 100. Duel and dribble percentages divide by their provider attempts; conversion divides goals by shots; save percentage divides saves by saves + conceded. The rating percentile is the midrank percentile of the provider rating within the league and role family at 450+ minutes; the provider-group fallback is used only when the role cohort is below its minimum. Archetype scores are 100 * Phi(sum(w * shrunk robust z) / sum(abs(w))), with winsorisation at 1/99, median/MAD scaling, minutes shrinkage and weight renormalisation. The rose uses the same league-only rates: each axis is the midrank percentile of the raw value in the same role-family cohort (provider group fallback), with conceded_p90 ranked on negated values. Missing values and insufficient cohorts are null.
- Unit
- mixed
- Basis
- mixed
- Coverage
- match
- Source layer
- scouting_pool
- Metric ids
- scouting.pool
Limits: Provider ratings are opaque and relative to a league and role cohort; no cross-league ranking is published. The feed has no xG/xA, progressive passes, carries, pressures, aerial wins or crosses, so those features are absent rather than inferred. Role families need starting-XI grids; leagues without grids use the provider position group and say so. Scouting priority is an Aberdeen preference, not a measured quality term. The current club comes from the provider transfer feed; the stats club is kept where it differs. A subsequent move outside a pool team may be missing. Rose percentiles are within the league and role cohort, not a cross-league rank. A missing or insufficient cohort is null, never zero.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Scouting weakness board
Aberdeen role-family ratings against the Scottish Premiership cohort, with verified availability evidence.
- Formula
- The family average is the appearance-weighted mean provider rating of Aberdeen players at 300+ competitive minutes in the role family. The percentile is the midrank position of that average within the other Premiership players in the same role family at 450+ minutes; Aberdeen are excluded from their own cohort. The reading is structural below 40, at 40-60, above 60; a below-cohort family with one absent first-choice player is cover, two or more is hold. First-choice evidence is 10 starts or 900 minutes in the most recent prior season with at least 450 minutes.
- Unit
- mixed
- Basis
- mixed
- Coverage
- derived
- Source layer
- scouting_pool
- Metric ids
- scouting.board
Limits: The model cannot separate selection, availability and quality. The provider rating is not a verdict; the cohort is the other Premiership players in the same role family, not a like-for-like cross-league pool. Only verified official AFC team news can mark a player out or available.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Scouting archetype profiles
Weighted player-profile scores, their feature weights, coverage, the attacker assist/goal split and the dedicated goal-scoring list.
- Formula
- Each archetype is a weighted composite of winsorised, robust z-scores within league and role family: z = (x - median) / (1.4826 * MAD), shrunk by minutes / (minutes + 450), combined with signed weights and mapped to 0-100 by the normal CDF. Missing features are removed and the remaining absolute weights renormalised; below 70% coverage the score is null. Weights are in config/scouting/archetypes.yaml and are published with the score.
- Unit
- index
- Basis
- inferred
- Coverage
- derived
- Source layer
- computed
- Metric ids
- scouting.archetypes
Limits: A profile is not a position, a target or a recommendation. Assist bias and goal bias are separate attacker profiles. Each leader list is ordered by its own adjusted profile score multiplied by the U23 and European preferences; the goal-scoring table is ordered by goals per 90, not by a composite. The assist profile weights passes, key passes, pass accuracy and dribbles. The feed carries no crosses or chance-creation data, so those are absent rather than inferred. The goal profile deliberately excludes pass and dribble volume so it does not reproduce the assist order.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Scouting team-context lens
Players outperforming teams that are underperforming in their league.
- Formula
- Team points per game = points / played in the provider's current league table. The team points percentile is the midrank percentile of that value among the league's teams. team_lift = player role-adjusted percentile - team points percentile. A team is underperforming when its percentile is at or below the configured maximum (default 40). The lens keeps players with a positive lift at those teams, ordered by lift then scouting priority. A league without a table is unknown, never zero-strength.
- Unit
- mixed
- Basis
- inferred
- Coverage
- derived
- Source layer
- computed
- Metric ids
- scouting.team-lens
Limits: Team underperformance is a within-league points-per-game contrast, not a budget, wage or resource model. A player's role-adjusted percentile and a team's points percentile are different units; the lift is a descriptive ranking aid, not a causal claim. A league without a current table is unknown, not zero-strength.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Scouting squad profile
Aberdeen registered-squad position-specific per-90 output, competitive matches only.
- Formula
- The same per-90 and percentage formulas as scouting.pool, applied to the registered Aberdeen squad in competitive matches only (friendlies and loan-club rows excluded), at 180+ minutes. The rating is appearance-weighted; the percentile is within the Premiership role cohort. The rose uses Premiership-only rates against the same league and role cohort.
- Unit
- mixed
- Basis
- mixed
- Coverage
- match
- Source layer
- squad_identity
- Metric ids
- scouting.squad
Limits: Forward and progressive passes, carries and pressures are not in the feed; they are unavailable, not inferred. Loanees out are excluded; their loan-club rows are not Aberdeen output.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Scouting coverage
Per-league provider coverage, role coverage and pool counts.
- Formula
- Counts of provider player-season rows, rated rows, rows at 450+ minutes, players with at least one starting-XI role, played fixtures and lineups fetched. Role coverage is role players divided by the league pool. Searchable requires at least 25 rated players.
- Unit
- mixed
- Basis
- measured
- Coverage
- derived
- Source layer
- scouting_pool
- Metric ids
- scouting.coverage
Limits: Coverage is a provider fact at the last sync, not a permanent statement. Scottish lower tiers have lineups but no player season statistics. Current-club coverage comes from the team transfer feed and may miss a later move outside a pool team.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Scouting value model
The 0-100 scouting value index and the anchor-gated GBP value model.
- Formula
- Value index = 100 * sum(w_i * component_i) / sum(w_i) over performance (league-adjusted percentile / 100), age curve, minutes reliability (min(1, minutes / 1800)) and best adjusted profile score / 100. Weights are renormalised over available components and the index is null below 70% coverage. The GBP band is fitted only after the public-source anchor gate passes: log(value_gbp) = b0 + b1*adjusted_percentile/100 + b2*age + b3*age^2 + b4*log(minutes) + role-group dummies. The published band is the 80% prediction interval. No GBP value is published before the gate.
- Unit
- mixed
- Basis
- inferred
- Coverage
- derived
- Source layer
- computed
- Metric ids
- scouting.value-model
Limits: The value index is a scouting ordering, not a transfer value or fee. The GBP band is not published until the public-source anchor register passes the gate; it is never an uncalibrated currency estimate. Contract length, wages, release clauses and agent fees are unknown.
Registry version 3.11.0. Copied from the metric registry at publish time.
Registered metrics
Scouting priority
U23 and European shop-window weighting on top of the value index.
- Formula
- scouting_priority = value_index * age_multiplier * europe_multiplier. age_multiplier = u23_multiplier when age <= u23_max_age, else 1.0. europe_multiplier = europe_multiplier when european league-phase minutes >= europe_minutes_threshold, else 1.0. The European flag is built from the league-phase fixtures of the Champions League, Europa League and Conference League and the per-fixture player endpoint; qualifiers and play-offs are excluded. A player not found is none only when coverage is complete; otherwise the status is unknown and the multiplier is 1.0.
- Unit
- index
- Basis
- inferred
- Coverage
- derived
- Source layer
- computed
- Metric ids
- scouting.priority
Limits: The U23 boost and the European shop-window discount are Aberdeen scouting preferences, not measured quality. Only the league phase of the three UEFA competitions is used; qualifiers, play-offs and domestic Europe are not. A player with fewer than 90 league-phase minutes is shown but not discounted. Unknown European status is not discounted. Priority is not a transfer value or a fee.
Registry version 3.11.0. Copied from the metric registry at publish time.