{"record":{"id":"ad21c4d68b9e0ce7","repo":"stride3d/stride","slug":"expected-document-start-or-stream-end","errorCode":null,"errorMessage":"Expected DOCUMENT-START or STREAM-END","messagePattern":"Expected DOCUMENT-START or STREAM-END","errorType":"exception","errorClass":"YamlException","httpStatus":null,"severity":"error","filePath":"sources/core/Stride.Core.Yaml/Emitter.cs","lineNumber":738,"sourceCode":"                    }\n                }\n\n                state = EmitterState.YAML_EMIT_DOCUMENT_CONTENT_STATE;\n            }\n\n            else if (evt is StreamEnd)\n            {\n                if (isOpenEnded)\n                {\n                    WriteIndicator(\"...\", true, false, false);\n                    WriteIndent();\n                }\n\n                state = EmitterState.YAML_EMIT_END_STATE;\n            }\n            else\n            {\n                throw new YamlException(\"Expected DOCUMENT-START or STREAM-END\");\n            }\n        }\n\n        /// <summary>\n        /// Check if the document content is an empty scalar.\n        /// </summary>\n        private bool CheckEmptyDocument()\n        {\n            int index = 0;\n            foreach (var parsingEvent in events)\n            {\n                if (++index == 2)\n                {\n                    Scalar scalar = parsingEvent as Scalar;\n                    if (scalar != null)\n                    {\n                        return string.IsNullOrEmpty(scalar.Value);\n                    }","sourceCodeStart":720,"sourceCodeEnd":756,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/core/Stride.Core.Yaml/Emitter.cs#L720-L756","documentation":"In the YAML_DOCUMENT_IMPLICIT_STATE the emitter expects either DocumentStart (begin a document) or StreamEnd (finish the stream). Any other event in that state throws YamlException because document content cannot start before DocumentStart.","triggerScenarios":"Emitting a Scalar/SequenceStart/MappingStart (or DocumentEnd) directly between StreamStart and DocumentStart, or after DocumentEnd without a new DocumentStart.","commonSituations":"Emitting multiple documents but forgetting to open each with DocumentStart; emitting content events at stream level; event sequences generated by faulty custom producers.","solutions":["Emit DocumentStart before any document content events.","For multiple documents, emit DocumentEnd then a new DocumentStart per document.","After the last document emit StreamEnd instead of content events."],"exampleFix":"// before\nemitter.Emit(new StreamStart());\nemitter.Emit(new Scalar(\"value\")); // throws\n// after\nemitter.Emit(new StreamStart());\nemitter.Emit(new DocumentStart());\nemitter.Emit(new Scalar(\"value\"));","handlingStrategy":"type-guard","validationCode":"bool ContentAllowedAfterStreamStart(ParsingEvent evt) =>\n    evt is DocumentStart || evt is StreamEnd;\n// only pass content events once a DocumentStart has been emitted","typeGuard":"bool IsDocumentLevelEvent(ParsingEvent evt) => evt is DocumentStart or StreamEnd;","tryCatchPattern":"try { emitter.Emit(evt); }\ncatch (YamlException ex) when (ex.Message == \"Expected DOCUMENT-START or STREAM-END\") { /* insert missing DocumentStart or terminate with StreamEnd */ }","preventionTips":["Emit DocumentStart before any content","For multi-document streams close each with DocumentEnd and reopen with DocumentStart","Validate event sequences with a small state checker before emitting"],"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"}