{"record":{"id":"e60e1e1c62bc8eef","repo":"multica-ai/multica","slug":"resolve-skill-bundle-returned-invalid-bundle-skil","errorCode":null,"errorMessage":"resolve skill bundle returned invalid bundle: skill_id=%s source=%s hash=%s","messagePattern":"resolve skill bundle returned invalid bundle: skill_id=(.+?) source=(.+?) hash=(.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/internal/daemon/daemon.go","lineNumber":5944,"sourceCode":"\tif err != nil {\n\t\treturn SkillData{}, err\n\t}\n\t// The resolve endpoint serves the agent's *current* bundle and hash, which\n\t// may differ from the claim-time ref when the skill was edited between\n\t// claim and prepare (see ResolveTaskSkillBundles). So confirm only that the\n\t// server returned the skill we asked for (source/id), then validate the\n\t// bundle for self-consistency against a ref derived from itself — pinning\n\t// it to the possibly-stale requested hash would reject a legitimate update.\n\tif bundle.Source != ref.Source || bundle.ID != ref.ID {\n\t\treturn SkillData{}, fmt.Errorf(\"resolve skill bundle returned wrong skill: requested source=%s id=%s, got source=%s id=%s\", ref.Source, ref.ID, bundle.Source, bundle.ID)\n\t}\n\tbundleRef := skillRefFromBundle(bundle)\n\tvalidationRef := bundleRef\n\tif ref.Source == skillbundle.SourcePlugin {\n\t\tvalidationRef = ref\n\t}\n\tif !validateSkillBundle(validationRef, bundle) {\n\t\treturn SkillData{}, fmt.Errorf(\"resolve skill bundle returned invalid bundle: skill_id=%s source=%s hash=%s\", bundle.ID, bundle.Source, bundle.Hash)\n\t}\n\tif err := d.skillCache.WithRefLock(task.WorkspaceID, validationRef, func() error {\n\t\treturn d.skillCache.Store(task.WorkspaceID, bundle)\n\t}); err != nil {\n\t\treturn SkillData{}, fmt.Errorf(\"store skill bundle cache: %w\", err)\n\t}\n\treturn bundle, nil\n}\n\nconst (\n\t// skillBundleResolveMinTimeout floors the per-skill resolve deadline so a\n\t// tiny bundle still tolerates connection setup and round-trip latency.\n\tskillBundleResolveMinTimeout = 30 * time.Second\n\t// skillBundleResolveMaxTimeout caps it so a wedged download cannot pin a\n\t// task in prepare indefinitely.\n\tskillBundleResolveMaxTimeout = 5 * time.Minute\n\t// skillBundleResolveMinThroughput is the pessimistic floor throughput\n\t// (bytes/sec) used to scale the deadline to bundle size — deliberately low","sourceCodeStart":5926,"sourceCodeEnd":5962,"githubUrl":"https://github.com/multica-ai/multica/blob/2c0912b6ec764b373d44eeea1e80f0d9f11ab417/server/internal/daemon/daemon.go#L5926-L5962","documentation":"Error \"resolve skill bundle returned invalid bundle: skill_id=%s source=%s hash=%s\" thrown in multica-ai/multica.","triggerScenarios":"Thrown at server/internal/daemon/daemon.go:5944 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Clear the skill bundle cache and retry; the resolved bundle failed validation."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"2c0912b6ec764b373d44eeea1e80f0d9f11ab417","analyzedAt":"2026-08-15T13:25:18.241Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}