{"record":{"id":"0a2c991346d20ad0","repo":"stride3d/stride","slug":"key-0-must-be-a-registered-key","errorCode":null,"errorMessage":"Key [{0}] must be a registered key","messagePattern":"Key \\[(.+?)\\] must be a registered key","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"sources/engine/Stride.Foundation/Effects/ParameterKeys.cs","lineNumber":200,"sourceCode":"                    {\n                        builder.Append('[');\n                        builder.Append(composedKey.Indexer);\n                        builder.Append(']');\n                    }\n\n                    result = ComposeWith(composedKey.Key, builder);\n                    composedKeys.Add(composedKey, result);\n                }\n            }\n            return result;\n        }\n\n        private static ParameterKey ComposeWith(ParameterKey key, StringBuilder builder)\n        {\n            var newKey = FindByName(builder.ToString());\n            if (newKey == null)\n            {\n                throw new ArgumentException(\"Key [{0}] must be a registered key\".ToFormat(key));\n            }\n            return newKey;\n        }\n\n        public static ParameterKey TryFindByName(string name)\n        {\n            if (name == null)\n            {\n                return null;\n            }\n\n            lock (keyByNames)\n            {\n                ParameterKey key;\n                keyByNames.TryGetValue(name, out key);\n                return key;\n            }\n        }","sourceCodeStart":182,"sourceCodeEnd":218,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/engine/Stride.Foundation/Effects/ParameterKeys.cs#L182-L218","documentation":"ParameterKey.ComposeWith looks up the composed key name via FindByName; Stride requires all parameter keys to be registered in the ParameterKeys registry. When the composed name is not found, it throws ArgumentException stating the original key must be a registered key.","triggerScenarios":"Calling ComposeWith (e.g. via key composition like 'Permutation' keys or macros) where the resulting composed key name has never been registered with ParameterKeys.Add, or the source key name passed isn't registered.","commonSituations":"Shader macro/composition keys not registered at startup, key name strings built dynamically that don't match registered keys, keys registered under a different name (typo/case mismatch), or running code before key registration happens.","solutions":["Register the composed key with ParameterKeys.Add before using ComposeWith","Verify the exact key name string matches the registered name (case-sensitive)","Check that key registration code (often static initializers) actually runs before composition","Use TryFindByName to probe registration status when debugging"],"exampleFix":"// before\nvar composed = key.ComposeWith(suffixBuilder); // composed name never registered\n// after\nParameterKeys.Add(new ParameterKey<UInt32>(composedName, \"...\"));\nvar composed = key.ComposeWith(suffixBuilder);","handlingStrategy":"try-catch","validationCode":"var candidate = /* composed name */;\nif (ParameterKeys.TryFindByName(candidate) == null)\n    throw new InvalidOperationException($\"Composed key '{candidate}' is not registered; call ParameterKeys.Add first\");","typeGuard":null,"tryCatchPattern":"try { var composed = key.ComposeWith(builder); } catch (ArgumentException ex) when (ex.Message.Contains(\"must be a registered key\")) { // register missing key or fix name\n    log.Warn($\"Unregistered parameter key: {ex.Message}\"); throw; }","preventionTips":["Register all parameter keys in static initializers that are guaranteed to run","Use ParameterKey helper classes so registration happens via type initializers","Verify key names with TryFindByName in debug builds","Keep key name generation in one place to avoid string drift"],"tags":["shaders","parameters","registry","stride"],"backgroundTag":"resource-not-found","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}