Yeachan-Heo/oh-my-codex · critical · Error

catalog_manifest_invalid:missing_core_skill:${coreSkill}

Error message

catalog_manifest_invalid:missing_core_skill:${coreSkill}

What it means

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.

Source

Thrown at src/catalog/schema.ts:128

      ? entry.canonical.trim()
      : undefined;

    if ((entry.status === 'alias' || entry.status === 'merged') && !canonical) {
      throw new Error(`catalog_manifest_invalid:agents[${index}].canonical`);
    }

    return {
      name,
      category: entry.category as CatalogAgentCategory,
      status: entry.status as CatalogEntryStatus,
      canonical,
    };
  });

  for (const coreSkill of REQUIRED_CORE_SKILLS) {
    const skill = skills.find((s) => s.name === coreSkill);
    if (!skill || skill.status !== 'active') {
      throw new Error(`catalog_manifest_invalid:missing_core_skill:${coreSkill}`);
    }
  }

  return {
    schemaVersion: input.schemaVersion,
    catalogVersion: input.catalogVersion,
    skills,
    agents,
  };
}

export interface CatalogCounts {
  skillCount: number;
  promptCount: number;
  activeSkillCount: number;
  activeAgentCount: number;
}

View on GitHub (pinned to 3ad79a8a6f)

Solutions

  1. Add the named skill back as {"name":"<coreSkill>", "status":"active", ...}
  2. 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
  3. Regenerate the manifest from the canonical source that includes core skills

Example fix

// before
"skills": [ ... no "team" entry ... ]

// after
"skills": [ ..., { "name": "team", "category": "planning", "status": "active" } ]
Defensive patterns

Strategy: try-catch

Validate before calling

const REQUIRED = ['autopilot','ralplan','team','ultragoal'];
const ok = REQUIRED.every((n) => raw.skills?.some((s: any) => s?.name === n && s?.status === 'active'));
if (!ok) { /* add missing core skills before shipping */ }

Try / catch

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; }

Prevention

When it happens

Trigger: A manifest that omits one of autopilot/ralplan/team/ultragoal, or includes it with status alias/merged/deprecated/internal instead of active.

Common situations: Trimmed-down custom catalogs, filtering deprecated entries during generation, or changing a core skill's status during a rename without keeping an active entry.

Related errors


AI-assisted analysis of Yeachan-Heo/oh-my-codex@3ad79a8a6f (2026-08-27). Data as JSON: /api/errors/0b765bad31ec7a96. Report an issue: GitHub.