{"record":{"id":"53b34bc948195f72","repo":"moeru-ai/airi","slug":"spine-no-model-source-provided","errorCode":null,"errorMessage":"[Spine] No model source provided","messagePattern":"\\[Spine\\] No model source provided","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"packages/stage-ui-spine/src/components/scenes/spine/Model.vue","lineNumber":128,"sourceCode":"  modelIntrinsicBounds = undefined\n  spineStore.isModelLoaded = false\n}\n\nasync function loadModel() {\n  await modelLoadMutex.acquire()\n\n  modelLoading.value = true\n  componentState.value = 'loading'\n\n  try {\n    if (!canvas.value) {\n      modelLoading.value = false\n      componentState.value = 'mounted'\n      return\n    }\n\n    if (!modelSrc.value) {\n      console.warn('[Spine] No model source provided')\n      disposeSpine()\n      modelLoading.value = false\n      componentState.value = 'mounted'\n      return\n    }\n\n    disposeSpine()\n\n    let assetPaths: { skeletonPath: string, atlasPath: string, skeletonFormat: 'binary' | 'json', texturePaths: string[] }\n    let pathPrefix = ''\n    let blobUrls: Record<string, string> | undefined\n    let rawData: Record<string, Uint8Array | string> | undefined\n\n    const isLocalBlob = modelSrc.value.startsWith('blob:')\n    if (isLocalBlob || modelSrc.value.endsWith('.zip')) {\n      const response = await fetch(modelSrc.value)\n      const blob = await response.blob()\n      const file = new File([blob], 'model.zip', { type: 'application/zip' })","sourceCodeStart":110,"sourceCodeEnd":146,"githubUrl":"https://github.com/moeru-ai/airi/blob/677329427f32468c74b17f3ec47eeca4e05bec65/packages/stage-ui-spine/src/components/scenes/spine/Model.vue#L110-L146","documentation":"The Spine Model component's load routine requires the modelSrc prop (skeleton + atlas source). When it is empty, the component disposes any previous Spine instance, clears modelLoading, sets componentState to 'mounted' and returns — a controlled no-op, not a crash.","triggerScenarios":"Rendering the Spine <Model /> without modelSrc, or with modelSrc bound to a value that is still undefined while settings/model stores load.","commonSituations":"No Spine model selected during onboarding; passing only identifiers and expecting the component to fetch the source; conditional sources that start as undefined.","solutions":["Provide a valid modelSrc pointing at the Spine skeleton/atlas source","Render conditionally: <Model v-if=\"modelSrc\" :model-src=\"modelSrc\" /> and show a placeholder state otherwise"],"exampleFix":"// before\n<Model />\n\n// after\n<Model v-if=\"modelSrc\" :model-src=\"modelSrc\" />","handlingStrategy":"validation","validationCode":"// Before rendering the Spine model\n// template: <Model v-if=\"modelSrc\" :model-src=\"modelSrc\" />","typeGuard":"function isModelSource(value: unknown): value is string {\n  return typeof value === 'string' && value.trim().length > 0\n}","tryCatchPattern":null,"preventionTips":["Never mount the Spine Model without a resolved modelSrc","Show a placeholder until the model source is selected/loaded","Keep skeleton and atlas sources together so partial sources cannot be passed"],"tags":["spine","props","vue","model-loading"],"backgroundTag":"missing-required-argument","analyzedSha":"677329427f32468c74b17f3ec47eeca4e05bec65","analyzedAt":"2026-08-18T17:29:58.153Z","contentChangedAt":"2026-08-18T17:29:58.153Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}