{"record":{"id":"ab34a8490ded274d","repo":"stride3d/stride","slug":"expect-name1-value1-name2-value2-format","errorCode":null,"errorMessage":"Expect name1=value1;name2=value2 format.","messagePattern":"Expect name1=value1;name2=value2 format\\.","errorType":"validation","errorClass":"OptionException","httpStatus":null,"severity":"error","filePath":"sources/assets/Stride.AssetCompiler/PackageBuilderApp.cs","lineNumber":148,"sourceCode":"                { \"slave=\", \"Slave pipe\", v => options.SlavePipe = v }, // Benlitz: I don't think this should be documented\n                { \"crash-dir=\", \"Slave only: shared crash run directory the master collects crashes from\", v => options.CrashRunDirectory = v },\n                { \"dump-dir=\", \"crash-adopt only: directory of createdump minidumps to adopt into the crash store\", v => options.NativeDumpDirectory = v },\n                { \"server=\", \"This Compiler is launched as a server\", v => { } },\n                { \"graphics-api=\", \"Graphics API to load (Direct3D11|Direct3D12|Vulkan). Applied at startup by GraphicsApiSelector.\", v => { } },\n                { \"pack-asset-assembly=\", \"Host-loadable asset assembly (package-relative path) to declare in the packed sdpkg; repeat for each\", v => options.PackAssetAssemblies.Add(v) },\n                { \"pack-asset-namespace=\", \"Asset URL namespace declaration to resolve into the packed sdpkg (true/false/name)\", v => options.PackAssetNamespace = v },\n                { \"t|threads=\", \"Number of threads to create. Default value is the number of hardware threads available.\", v => options.ThreadCount = int.Parse(v) },\n                { \"test=\", \"Run a test session.\", v => options.TestName = v },\n                { \"no-backup\", \"Upgrade verb only: skip backing up the files the upgrade overwrites (backup is on by default).\", v => options.NoBackup = v != null },\n                { \"property:\", \"Properties. Format is name1=value1;name2=value2\", v =>\n                {\n                    if (!string.IsNullOrEmpty(v))\n                    {\n                        foreach (var nameValue in v.Split(new [] { ';' }, StringSplitOptions.RemoveEmptyEntries))\n                        {\n                            var equalIndex = nameValue.IndexOf('=');\n                            if (equalIndex == -1)\n                                throw new OptionException(\"Expect name1=value1;name2=value2 format.\", \"property\");\n\n                            var name = nameValue.Substring(0, equalIndex);\n                            var value = nameValue.Substring(equalIndex + 1);\n                            if (value != string.Empty)\n                                options.Properties.Add(name, value);\n                        }\n                    }\n                }\n                },\n                { \"compile-property:\", \"Compile properties. Format is name1=value1;name2=value2\", v =>\n                {\n                    if (!string.IsNullOrEmpty(v))\n                    {\n                        if (options.ExtraCompileProperties == null)\n                            options.ExtraCompileProperties = new Dictionary<string, string>();\n\n                        foreach (var nameValue in v.Split(new [] { ';' }, StringSplitOptions.RemoveEmptyEntries))\n                        {","sourceCodeStart":130,"sourceCodeEnd":166,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/assets/Stride.AssetCompiler/PackageBuilderApp.cs#L130-L166","documentation":"IInitializingObjectNode.AddMember may only run while the node graph is being constructed; once the GraphNode is sealed, its member set is immutable, and adding another child throws InvalidOperationException. Sealing is the mechanism that freezes the node structure after initialization.","triggerScenarios":"Calling AddMember on an ObjectNode after construction/sealing completed — e.g. attempting to attach a late-discovered member or a dynamic child to an already-built node.","commonSituations":"Dynamically adding properties to objects at runtime after their node was built; duplicate type description changes or re-initialization attempts on live nodes.","solutions":["Add all members during node initialization, before the node is sealed.","Rebuild/re-create the node (or its containing model) if members must change.","Check IsSealed before calling AddMember and skip or defer dynamic members."],"exampleFix":"// before\n((IInitializingObjectNode)objectNode).AddMember(memberNode, false);\n// after\nif (!objectNode.IsSealed)\n    ((IInitializingObjectNode)objectNode).AddMember(memberNode, false);","handlingStrategy":"validation","validationCode":"if (objectNode.IsSealed)\n    throw new InvalidOperationException(\"Node already sealed; rebuild it to add members\");","typeGuard":"bool AcceptsMembers(ObjectNode node) => !node.IsSealed;","tryCatchPattern":"try { ((IInitializingObjectNode)node).AddMember(member, false); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"sealed\")) { /* defer or rebuild the node */ }","preventionTips":["Register all members during initialization only","Check IsSealed before any structural change","Rebuild nodes instead of mutating sealed ones"],"tags":["invalid-state","sealed-node","quantum"],"backgroundTag":"invalid-state-transition","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"}