{"record":{"id":"ecf3f4790a0d89f8","repo":"moeru-ai/airi","slug":"no-model-src-cannot-load-vrm-model","errorCode":null,"errorMessage":"NO model src, cannot load VRM model.","messagePattern":"NO model src, cannot load VRM model\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"packages/stage-ui-three/src/components/Model/VRMModel.vue","lineNumber":666,"sourceCode":"\nasync function loadModel() {\n  const requestId = invalidatePendingLoads()\n  const currentLoadReason = resolveVrmLoadReason()\n  const loadStartedAt = performance.now()\n  let nextVrm: VRM | undefined\n  let nextVrmGroup: Group | undefined\n  let nextVrmAnimationMixer: AnimationMixer | undefined\n  let nextVrmEmote: ReturnType<typeof useVRMEmote> | undefined\n  let didCommitLoad = false\n\n  try {\n    if (!scene.value) {\n      await until(() => scene.value).toBeTruthy()\n      if (!isLoadRequestCurrent(requestId))\n        return\n    }\n    if (!modelSrc.value) {\n      console.warn('NO model src, cannot load VRM model.')\n      return\n    }\n\n    emit('loadStart', currentLoadReason)\n\n    if (isStageThreeRuntimeTraceEnabled()) {\n      stageThreeRuntimeTraceContext.emit(stageThreeTraceVrmLoadStartEvent, {\n        modelSrc: modelSrc.value,\n        reason: currentLoadReason,\n        rendererMemory: createThreeRendererMemorySnapshot(getRendererInstance()),\n        sceneSummary: createVrmSceneSummarySnapshot(),\n        ts: loadStartedAt,\n      })\n    }\n\n    modelLoaded.value = false\n    const reusableInstance = takeManagedVrmInstance(getManagedVrmScopeKey(), modelSrc.value)\n    if (reusableInstance) {","sourceCodeStart":648,"sourceCodeEnd":684,"githubUrl":"https://github.com/moeru-ai/airi/blob/677329427f32468c74b17f3ec47eeca4e05bec65/packages/stage-ui-three/src/components/Model/VRMModel.vue#L648-L684","documentation":"VRMModel's load routine (guarded by a requestId for cancellation) requires the scene and a truthy modelSrc. When modelSrc is empty it warns and aborts the whole load request; no model is added to the scene and no load/error events beyond the warn are emitted.","triggerScenarios":"Rendering VRMModel without a resolved modelSrc: the model store/settings still loading, a cleared or missing VRM selection, or the prop bound to undefined by mistake.","commonSituations":"First-run state before any VRM is chosen; switching models where the new src is briefly undefined; persisted settings pointing at a deleted model record.","solutions":["Ensure modelSrc resolves to a usable VRM source (object URL, http(s) URL, or data URL) before the component renders — use v-if or await the store","Re-select or re-import the VRM model if the stored source no longer exists","Check the parent data flow: the prop must actually reach the component with a value"],"exampleFix":"// before\n<VRMModel :model-src=\"vrmStore.src\" />\n\n// after\n<VRMModel v-if=\"vrmStore.src\" :model-src=\"vrmStore.src\" />","handlingStrategy":"validation","validationCode":"// Before rendering VRMModel\nconst ready = computed(() => typeof modelSrc.value === 'string' && modelSrc.value.length > 0)\n// template: <VRMModel v-if=\"ready\" :model-src=\"modelSrc\" />","typeGuard":"function isModelSource(value: unknown): value is string {\n  return typeof value === 'string' && value.trim().length > 0\n}","tryCatchPattern":null,"preventionTips":["Resolve the VRM source (URL/blob) before mounting the component","Re-select or re-import the model when the stored source disappears","Handle loadStart/error events to detect lifecycle problems early"],"tags":["vrm","props","three","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"}