{"record":{"id":"0b765bad31ec7a96","repo":"Yeachan-Heo/oh-my-codex","slug":"catalog-manifest-invalid-missing-core-skill-core","errorCode":null,"errorMessage":"catalog_manifest_invalid:missing_core_skill:${coreSkill}","messagePattern":"catalog_manifest_invalid:missing_core_skill:(.+?)","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"critical","filePath":"src/catalog/schema.ts","lineNumber":128,"sourceCode":"      ? entry.canonical.trim()\n      : undefined;\n\n    if ((entry.status === 'alias' || entry.status === 'merged') && !canonical) {\n      throw new Error(`catalog_manifest_invalid:agents[${index}].canonical`);\n    }\n\n    return {\n      name,\n      category: entry.category as CatalogAgentCategory,\n      status: entry.status as CatalogEntryStatus,\n      canonical,\n    };\n  });\n\n  for (const coreSkill of REQUIRED_CORE_SKILLS) {\n    const skill = skills.find((s) => s.name === coreSkill);\n    if (!skill || skill.status !== 'active') {\n      throw new Error(`catalog_manifest_invalid:missing_core_skill:${coreSkill}`);\n    }\n  }\n\n  return {\n    schemaVersion: input.schemaVersion,\n    catalogVersion: input.catalogVersion,\n    skills,\n    agents,\n  };\n}\n\nexport interface CatalogCounts {\n  skillCount: number;\n  promptCount: number;\n  activeSkillCount: number;\n  activeAgentCount: number;\n}\n","sourceCodeStart":110,"sourceCodeEnd":146,"githubUrl":"https://github.com/Yeachan-Heo/oh-my-codex/blob/3ad79a8a6fe6e95fdbb8c00e40716fffe4011ce2/src/catalog/schema.ts#L110-L146","documentation":"After validating all entries, the validator asserts that each of the required core skills (autopilot, ralplan, team, ultragoal) exists with status active. This error names the missing core skill and means the catalog cannot be used because a guaranteed-available skill is absent or not active.","triggerScenarios":"A manifest that omits one of autopilot/ralplan/team/ultragoal, or includes it with status alias/merged/deprecated/internal instead of active.","commonSituations":"Trimmed-down custom catalogs, filtering deprecated entries during generation, or changing a core skill's status during a rename without keeping an active entry.","solutions":["Add the named skill back as {\"name\":\"<coreSkill>\", \"status\":\"active\", ...}","If it was renamed, keep the new active entry plus an alias, and also ensure an active entry under the required core name exists per your version's contract","Regenerate the manifest from the canonical source that includes core skills"],"exampleFix":"// before\n\"skills\": [ ... no \"team\" entry ... ]\n\n// after\n\"skills\": [ ..., { \"name\": \"team\", \"category\": \"planning\", \"status\": \"active\" } ]","handlingStrategy":"try-catch","validationCode":"const REQUIRED = ['autopilot','ralplan','team','ultragoal'];\nconst ok = REQUIRED.every((n) => raw.skills?.some((s: any) => s?.name === n && s?.status === 'active'));\nif (!ok) { /* add missing core skills before shipping */ }","typeGuard":null,"tryCatchPattern":"try { readCatalogManifest(root); } catch (e) { if ((e as Error).message.startsWith('catalog_manifest_invalid:missing_core_skill:')) { const missing = (e as Error).message.split(':').pop(); /* re-add core skill */ } throw e; }","preventionTips":["Never filter core skills out of generated catalogs","Keep autopilot/ralplan/team/ultragoal active when renaming or deprecating","Assert core-skill presence in CI manifest checks"],"tags":["catalog","manifest","core-skills","validation"],"backgroundTag":"missing-required-entry","analyzedSha":"3ad79a8a6fe6e95fdbb8c00e40716fffe4011ce2","analyzedAt":"2026-08-27T22:18:39.783Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}