ppy/osu · error · InvalidOperationException

Ruleset with ID of {Score.RulesetID} not found locally

Error message

Ruleset with ID of {Score.RulesetID} not found locally

What it means

Thrown by DrawableProfileScore.load when resolving the ruleset for a profile score: rulesets.GetRuleset(Score.RulesetID) returns null. The profile score references a ruleset the client cannot instantiate.

Source

Thrown at osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs:54

        [Resolved]
        private OsuColour colours { get; set; } = null!;

        [Resolved]
        private OverlayColourProvider colourProvider { get; set; } = null!;

        public DrawableProfileScore(SoloScoreInfo score)
        {
            Score = score;

            RelativeSizeAxes = Axes.X;
            Height = height;
        }

        [BackgroundDependencyLoader]
        private void load(RulesetStore rulesets)
        {
            var ruleset = rulesets.GetRuleset(Score.RulesetID)?.CreateInstance() ?? throw new InvalidOperationException($"Ruleset with ID of {Score.RulesetID} not found locally");

            AddInternal(new ProfileItemContainer
            {
                Children = new Drawable[]
                {
                    new Container
                    {
                        RelativeSizeAxes = Axes.Both,
                        Padding = new MarginPadding { Left = 20, Right = performance_width },
                        Children = new Drawable[]
                        {
                            new FillFlowContainer
                            {
                                Anchor = Anchor.CentreLeft,
                                Origin = Anchor.CentreLeft,
                                AutoSizeAxes = Axes.Both,
                                Direction = FillDirection.Horizontal,
                                Spacing = new Vector2(10, 0),

View on GitHub (pinned to d9c73e12ad)

Solutions

  1. Ensure the ruleset assembly for Score.RulesetID is installed and enabled.
  2. Filter scores by rulesets.AvailableRulesets before creating DrawableProfileScore.
  3. Catch InvalidOperationException during load and skip that score in the profile list.

Example fix

// before
Add(new DrawableProfileScore(score));

// after
if (rulesets.GetRuleset(score.RulesetID) == null) return;
Add(new DrawableProfileScore(score));
Defensive patterns

Strategy: validation

Validate before calling

if (rulesets.GetRuleset(score.RulesetID) == null)
    return; // skip profile scores whose ruleset is unavailable

Type guard

RulesetInfo? ResolveRuleset(RulesetStore store, SoloScoreInfo score)
    => store.GetRuleset(score.RulesetID);

Try / catch

try { Add(new DrawableProfileScore(score)); }
catch (InvalidOperationException) { /* ruleset unavailable: skip */ }

Prevention

When it happens

Trigger: Loading a DrawableProfileScore for a SoloScoreInfo whose RulesetID is not in the local RulesetStore (during [BackgroundDependencyLoader]).

Common situations: Profile displays a score from a ruleset the client lacks (custom/uninstalled/disabled ruleset, version skew).

Related errors


AI-assisted analysis of ppy/osu@d9c73e12ad (2026-08-13). Data as JSON: /api/errors/28ad09d64c90f81f. Report an issue: GitHub.