{"record":{"id":"5c09ab209e34e69b","repo":"stride3d/stride","slug":"expected-nothing-after-stream-end","errorCode":null,"errorMessage":"Expected nothing after STREAM-END","messagePattern":"Expected nothing after STREAM-END","errorType":"exception","errorClass":"YamlException","httpStatus":null,"severity":"error","filePath":"sources/core/Stride.Core.Yaml/Emitter.cs","lineNumber":629,"sourceCode":"\n                case EmitterState.YAML_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE:\n                    EmitBlockMappingKey(evt, true);\n                    break;\n\n                case EmitterState.YAML_EMIT_BLOCK_MAPPING_KEY_STATE:\n                    EmitBlockMappingKey(evt, false);\n                    break;\n\n                case EmitterState.YAML_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE:\n                    EmitBlockMappingValue(evt, true);\n                    break;\n\n                case EmitterState.YAML_EMIT_BLOCK_MAPPING_VALUE_STATE:\n                    EmitBlockMappingValue(evt, false);\n                    break;\n\n                case EmitterState.YAML_EMIT_END_STATE:\n                    throw new YamlException(\"Expected nothing after STREAM-END\");\n\n                default:\n                    Debug.Assert(false, \"Invalid state.\");\n                    throw new InvalidOperationException(\"Invalid state\");\n            }\n        }\n\n        /// <summary>\n        /// Expect STREAM-START.\n        /// </summary>\n        private void EmitStreamStart(ParsingEvent evt)\n        {\n            if (!(evt is StreamStart))\n            {\n                throw new ArgumentException(\"Expected STREAM-START.\", \"evt\");\n            }\n\n            indent = -1;","sourceCodeStart":611,"sourceCodeEnd":647,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/core/Stride.Core.Yaml/Emitter.cs#L611-L647","documentation":"The emitter's state machine reaches YAML_EMIT_END_STATE after the STREAM-END event has been written; the stream is finished. If another event is then fed to Emit, the emitter throws YamlException because no events may follow STREAM-END.","triggerScenarios":"Calling Emitter.Emit with any ParsingEvent after a StreamEnd event has already been emitted.","commonSituations":"Manual emitter loops that emit documents in a cycle and don't stop after StreamEnd; emitting a second stream on the same emitter; event-producing code that appends trailing events.","solutions":["Stop the emission loop when a StreamEnd event has been written.","Create a new Emitter instance for each output stream/document sequence.","Ensure your event source yields exactly one StreamStart ... StreamEnd sequence."],"exampleFix":"// before\nforeach (var evt in events) emitter.Emit(evt); // events may extend past StreamEnd\n// after\nforeach (var evt in events)\n{\n    emitter.Emit(evt);\n    if (evt is StreamEnd) break;\n}","handlingStrategy":"type-guard","validationCode":"foreach (var evt in events)\n{\n    emitter.Emit(evt);\n    if (evt is StreamEnd) break; // nothing may follow STREAM-END\n}","typeGuard":"bool CanEmit(ParsingEvent evt, bool streamEnded) => !streamEnded || evt is StreamEnd;","tryCatchPattern":"try { emitter.Emit(evt); }\ncatch (YamlException ex) when (ex.Message == \"Expected nothing after STREAM-END\") { /* drop trailing events; stream already complete */ }","preventionTips":["Break emission loops on StreamEnd","One Emitter per output stream","Audit event producers for trailing events"],"tags":["yaml","event-stream","state-machine"],"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"}