{"record":{"id":"9664fb1370e9f4c2","repo":"santifer/career-ops","slug":"config-profile-yml-cv-sections-names-names","errorCode":null,"errorMessage":"⚠️  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.","messagePattern":"⚠️  config/profile\\.yml cv\\.sections names (.+?), which matched no section in this CV\\. The CV also renders (.+?) section title\\(s\\) the section-order alias table doesn't recognize \\((.+?)\\) — 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\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"generate-pdf.mjs","lineNumber":982,"sourceCode":"    }\n  }\n\n  // It is worth one when the CV also renders titles the alias table can't name,\n  // because then \"not in this CV\" may be a misreading: the section could be\n  // sitting right there under a heading nothing could identify.\n  //\n  // Whether that is what happened is not knowable here — an unresolved name may\n  // equally be an optional section with no entries. So the report states only\n  // what is checkable (this name matched nothing; these titles are unidentified)\n  // and leaves the conclusion to the reader. Deliberately not conditioned on\n  // whether the document changed: a name that did nothing did nothing, whether\n  // or not its neighbours moved, and treating \"output identical\" as the failure\n  // signal misreads an order that was already satisfied.\n  const reportUnresolved = () => {\n    if (unresolved.length === 0 || unrecognized.size === 0) return;\n    const names = unresolved.map(name => `\"${displayTitle(name)}\"`).join(', ');\n    const titles = [...unrecognized.values()].map(title => `\"${title}\"`).join(', ');\n    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.`);\n  };\n  if (chosen.length < 2) {\n    reportUnresolved();\n    return html;\n  }\n\n  // The slots are the named sections' own positions, in document order; the\n  // sections fill them in the configured order. No separate sibling check is\n  // needed: every accepted block is balanced, so they all sit at the same\n  // nesting level by construction.\n  const slots = [...chosen].sort((a, b) => a.start - b.start);\n\n  let out = '';\n  let cursor = 0;\n  for (let i = 0; i < slots.length; i++) {\n    out += html.slice(cursor, slots[i].start);\n    out += html.slice(chosen[i].start, chosen[i].end);\n    cursor = slots[i].end;","sourceCodeStart":964,"sourceCodeEnd":1000,"githubUrl":"https://github.com/santifer/career-ops/blob/aac998c7ed7248ea853b720ceeb1fdbeb322fc5d/generate-pdf.mjs#L964-L1000","documentation":"After applying cv.sections, generate-pdf.mjs reports unresolved names — but only when the CV also renders section titles the SECTION_ALIASES table does not recognize, because that combination suggests the user named a real section by a title the alias table lacks. The warning tells the user to add a SECTION_ALIASES entry or drop the name.","triggerScenarios":"reorderCvSections finished with entries in `unresolved` (recognized names that matched no section block) AND the `unrecognized` set of rendered-but-unknown section titles is non-empty. reportUnresolved() at generate-pdf.mjs:976 emits this combined warning; it stays silent if either set is empty.","commonSituations":"A custom CV template uses a novel section heading (e.g. 'Open Source') that SECTION_ALIASES does not map, while the user lists the intended section key in cv.sections; renamed headings after a template update.","solutions":["Check the rendered titles listed in the warning; if one is the section you meant, add a mapping to SECTION_ALIASES in generate-pdf.mjs","If the name is simply not in this CV (optional section with no entries), remove it from cv.sections","Regenerate the PDF and confirm the order now applies"],"exampleFix":"// before: generate-pdf.mjs\nconst SECTION_ALIASES = { experience: ['Work Experience'], skills: ['Skills'] };\n// after: alias the novel heading\nconst SECTION_ALIASES = { experience: ['Work Experience'], skills: ['Skills'], opensource: ['Open Source'] };","handlingStrategy":"validation","validationCode":"// ensure every cv.sections name resolves and every rendered title has an alias\nconst renderedTitles = extractRenderedSectionTitles(html);\nconst unmapped = renderedTitles.filter(t => !aliasTableHasTitle(t));\nconst unresolved = (profile.cv?.sections ?? []).filter(n => !findSectionBlock(html, n));\nif (unresolved.length && unmapped.length) console.warn('add SECTION_ALIASES entries for:', unmapped);","typeGuard":"const isAliasMapped = (title, aliases) => Object.values(aliases).some(list => list.includes(title));","tryCatchPattern":null,"preventionTips":["When renaming a section heading in the template, update SECTION_ALIASES in the same change","Keep cv.sections limited to sections that actually exist in the current CV","Run PDF generation once after template changes and read all ⚠️ output before shipping"],"tags":["cv","pdf","config","alias"],"backgroundTag":"invalid-config-value","analyzedSha":"aac998c7ed7248ea853b720ceeb1fdbeb322fc5d","analyzedAt":"2026-09-16T06:35:29.214Z","contentChangedAt":"2026-09-16T06:35:29.214Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}