{"record":{"id":"28ad09d64c90f81f","repo":"ppy/osu","slug":"ruleset-with-id-of-score-rulesetid-not-found-loc","errorCode":null,"errorMessage":"Ruleset with ID of {Score.RulesetID} not found locally","messagePattern":"Ruleset with ID of (.+?) not found locally","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs","lineNumber":54,"sourceCode":"\r\n        [Resolved]\r\n        private OsuColour colours { get; set; } = null!;\r\n\r\n        [Resolved]\r\n        private OverlayColourProvider colourProvider { get; set; } = null!;\r\n\r\n        public DrawableProfileScore(SoloScoreInfo score)\r\n        {\r\n            Score = score;\r\n\r\n            RelativeSizeAxes = Axes.X;\r\n            Height = height;\r\n        }\r\n\r\n        [BackgroundDependencyLoader]\r\n        private void load(RulesetStore rulesets)\r\n        {\r\n            var ruleset = rulesets.GetRuleset(Score.RulesetID)?.CreateInstance() ?? throw new InvalidOperationException($\"Ruleset with ID of {Score.RulesetID} not found locally\");\r\n\r\n            AddInternal(new ProfileItemContainer\r\n            {\r\n                Children = new Drawable[]\r\n                {\r\n                    new Container\r\n                    {\r\n                        RelativeSizeAxes = Axes.Both,\r\n                        Padding = new MarginPadding { Left = 20, Right = performance_width },\r\n                        Children = new Drawable[]\r\n                        {\r\n                            new FillFlowContainer\r\n                            {\r\n                                Anchor = Anchor.CentreLeft,\r\n                                Origin = Anchor.CentreLeft,\r\n                                AutoSizeAxes = Axes.Both,\r\n                                Direction = FillDirection.Horizontal,\r\n                                Spacing = new Vector2(10, 0),\r","sourceCodeStart":36,"sourceCodeEnd":72,"githubUrl":"https://github.com/ppy/osu/blob/d9c73e12adff2feaae4a3e158d36fe5883faf6ca/osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs#L36-L72","documentation":"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.","triggerScenarios":"Loading a DrawableProfileScore for a SoloScoreInfo whose RulesetID is not in the local RulesetStore (during [BackgroundDependencyLoader]).","commonSituations":"Profile displays a score from a ruleset the client lacks (custom/uninstalled/disabled ruleset, version skew).","solutions":["Ensure the ruleset assembly for Score.RulesetID is installed and enabled.","Filter scores by rulesets.AvailableRulesets before creating DrawableProfileScore.","Catch InvalidOperationException during load and skip that score in the profile list."],"exampleFix":"// before\nAdd(new DrawableProfileScore(score));\n\n// after\nif (rulesets.GetRuleset(score.RulesetID) == null) return;\nAdd(new DrawableProfileScore(score));","handlingStrategy":"validation","validationCode":"if (rulesets.GetRuleset(score.RulesetID) == null)\n    return; // skip profile scores whose ruleset is unavailable","typeGuard":"RulesetInfo? ResolveRuleset(RulesetStore store, SoloScoreInfo score)\n    => store.GetRuleset(score.RulesetID);","tryCatchPattern":"try { Add(new DrawableProfileScore(score)); }\ncatch (InvalidOperationException) { /* ruleset unavailable: skip */ }","preventionTips":["Filter profile scores by AvailableRulesets before constructing DrawableProfileScore.","Keep all standard ruleset DLLs enabled.","Telemetry-log unresolved RulesetIDs."],"tags":["profile","score","ruleset","ui","invalid-operation"],"backgroundTag":null,"analyzedSha":"d9c73e12adff2feaae4a3e158d36fe5883faf6ca","analyzedAt":"2026-08-13T14:12:54.015Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}