santifer/career-ops · warning

⚠️ config/profile.yml cv.sections names ${names}, which mat

Error message

⚠️  config/profile.yml cv.sections names ${names}, which matched no section in this CV. The CV also renders ${unrecognized.size} section title(s) the section-order alias table doesn't recognize (${titles}) — if one of those is the section you meant, its title needs an entry in SECTION_ALIASES in generate-pdf.mjs. Otherwise the name has no effect and can be dropped.

What it means

After resolving cv.sections names, generate-pdf.mjs reports names that matched no section block in the rendered CV (unresolved) only when the CV also renders titles the SECTION_ALIASES alias table cannot identify (unrecognized). The likely cause is that the section exists under a heading the table doesn't map, so the configured name had nothing to attach to; the fix is a new SECTION_ALIASES entry.

Source

Thrown at generate-pdf.mjs:819

    }
  }

  // It is worth one when the CV also renders titles the alias table can't name,
  // because then "not in this CV" may be a misreading: the section could be
  // sitting right there under a heading nothing could identify.
  //
  // Whether that is what happened is not knowable here — an unresolved name may
  // equally be an optional section with no entries. So the report states only
  // what is checkable (this name matched nothing; these titles are unidentified)
  // and leaves the conclusion to the reader. Deliberately not conditioned on
  // whether the document changed: a name that did nothing did nothing, whether
  // or not its neighbours moved, and treating "output identical" as the failure
  // signal misreads an order that was already satisfied.
  const reportUnresolved = () => {
    if (unresolved.length === 0 || unrecognized.size === 0) return;
    const names = unresolved.map(name => `"${displayTitle(name)}"`).join(', ');
    const titles = [...unrecognized.values()].map(title => `"${title}"`).join(', ');
    console.warn(`⚠️  config/profile.yml cv.sections names ${names}, which matched no section in this CV. The CV also renders ${unrecognized.size} section title(s) the section-order alias table doesn't recognize (${titles}) — if one of those is the section you meant, its title needs an entry in SECTION_ALIASES in generate-pdf.mjs. Otherwise the name has no effect and can be dropped.`);
  };
  if (chosen.length < 2) {
    reportUnresolved();
    return html;
  }

  // The slots are the named sections' own positions, in document order; the
  // sections fill them in the configured order. No separate sibling check is
  // needed: every accepted block is balanced, so they all sit at the same
  // nesting level by construction.
  const slots = [...chosen].sort((a, b) => a.start - b.start);

  let out = '';
  let cursor = 0;
  for (let i = 0; i < slots.length; i++) {
    out += html.slice(cursor, slots[i].start);
    out += html.slice(chosen[i].start, chosen[i].end);
    cursor = slots[i].end;

View on GitHub (pinned to 60398d6549)

Solutions

  1. Check the unrecognized titles quoted in the warning — if one is the section you meant, add a mapping in SECTION_ALIASES in generate-pdf.mjs (custom title -> canonical key)
  2. Otherwise drop the ineffective name from cv.sections; the warning explicitly states the name has no effect
  3. If the section truly is absent (optional section stripped for having no entries), no action is needed — the warning only appears when unrecognized titles also exist

Example fix

// before (generate-pdf.mjs)
const SECTION_ALIASES = new Map([
  ['skills', 'skills'],
  // 'Toolbox' unrecognized
]);

// after
const SECTION_ALIASES = new Map([
  ['skills', 'skills'],
  ['toolbox', 'skills'],
]);
Defensive patterns

Strategy: validation

Validate before calling

// Before relying on cv.sections, check every configured name maps to something
// the rendered CV actually contains under a known alias:
function unmatchedNames(configuredKeys, renderedHeadings, aliasToKey) {
  const known = new Set(renderedHeadings.map(h => aliasToKey[h.toLowerCase().trim()]).filter(Boolean));
  return configuredKeys.filter(k => !known.has(k));
}

Prevention

When it happens

Trigger: cv.md uses a custom heading like '## Toolbox' (not in SECTION_ALIASES), cv.sections lists 'skills', and the rendered HTML contains the 'Toolbox' title — unresolved and unrecognized are both non-empty, so reportUnresolved() fires. It also fires regardless of whether the rest of the reorder changed anything.

Common situations: Renaming section headings in cv.md for personal style; non-English headings after translating cv.md; a new optional section type added to the template without extending the alias table.

Related errors


AI-assisted analysis of santifer/career-ops@60398d6549 (2026-08-20). Data as JSON: /api/errors/9664fb1370e9f4c2. Report an issue: GitHub.