{"record":{"id":"1d0adca61a467541","repo":"santifer/career-ops","slug":"skipping-filename-cannot-tell-score-from-s","errorCode":null,"errorMessage":"⚠️  Skipping ${filename}: cannot tell score from status in columns 5–6 (\"${parts[4]}\" | \"${parts[5]}\") — refusing to merge a possible column swap","messagePattern":"⚠️  Skipping (.+?): cannot tell score from status in columns 5–6 \\(\"(.+?)\" \\| \"(.+?)\"\\) — refusing to merge a possible column swap","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"merge-tracker.mjs","lineNumber":667,"sourceCode":"\n  let parts;\n  let addition;\n\n  // Detect pipe-delimited (markdown table row)\n  if (content.startsWith('|')) {\n    parts = content.split('|').map(s => s.trim());\n    if (parts[0] === '') parts.shift();\n    if (parts[parts.length - 1] === '') parts.pop();\n    if (parts.length < 8) {\n      console.warn(`⚠️  Skipping malformed pipe-delimited ${filename}: ${parts.length} fields`);\n      return null;\n    }\n    // Format: num | date | company | role | score | status | pdf | report | notes [| location]\n    // Identify score vs status by content, not position, so a swapped row can't\n    // merge silently (#1427).\n    const resolved = resolveScoreStatus(parts[4], parts[5]);\n    if (!resolved) {\n      console.warn(`⚠️  Skipping ${filename}: cannot tell score from status in columns 5–6 (\"${parts[4]}\" | \"${parts[5]}\") — refusing to merge a possible column swap`);\n      return null;\n    }\n    addition = {\n      num: parseInt(parts[0]),\n      date: parts[1],\n      company: parts[2],\n      role: parts[3],\n      // Write-canonical: the tracker stores scores unbolded (verify-pipeline\n      // rejects bold scores), so strip any markdown bold from the incoming cell.\n      score: resolved.score.replace(/\\*\\*/g, '').trim(),\n      status: validateStatus(resolved.status),\n      pdf: parts[6],\n      report: parts[7],\n      notes: parts[8] || '',\n    };\n    const extras = parseTsvExtras(parts, filename);\n    if (!extras) return null;\n    Object.assign(addition, extras);","sourceCodeStart":649,"sourceCodeEnd":685,"githubUrl":"https://github.com/santifer/career-ops/blob/60398d6549a46f5266929538af21cfab94badc75/merge-tracker.mjs#L649-L685","documentation":"Because batch TSVs write (status, score) while applications.md stores (score, status), merge-tracker.mjs identifies columns 5-6 by content, not position (guard #1427). resolveScoreStatus() fails when neither cell is recognizable as a score pattern (X.X/5 or the N/A / — / - sentinels), and the row is refused rather than merged with possibly swapped data.","triggerScenarios":"A pipe row whose columns 5-6 are e.g. 'Interview' | 'high' — neither matches a score pattern, so resolveScoreStatus returns null and the skip warning quotes both cells. A blank score also fails: blank is not one of the recognized sentinels.","commonSituations":"Backfilled rows left with an empty score cell instead of N/A/—/-; creative placeholders like 'n/a yet' or 'TBD soon'; genuinely swapped columns where both cells contain status-like text.","solutions":["Format the score cell as X.X/5 or one of the sentinels N/A, — (em dash), or - (hyphen)","Keep the status cell a canonical status value so the pair is decidable in either column order","Re-run the merge and verify the row lands with score and status in the right columns"],"exampleFix":"# before (columns 5-6)\n| 042 | 2026-08-20 | Acme | SRE | Interview | pending | ... |\n\n# after\n| 042 | 2026-08-20 | Acme | SRE | Interview | 4.2/5 | ... |","handlingStrategy":"validation","validationCode":"const SCORE_CELL = /^(\\d+(\\.\\d+)?\\/5|n\\/a|—|-)$/i;\nfunction columnsFiveSixResolvable(a, b) {\n  return SCORE_CELL.test(a.trim()) || SCORE_CELL.test(b.trim());\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always format score as X.X/5 or an accepted sentinel (N/A, —, -) — blank is not accepted","Backfilled rows without an evaluation must carry a sentinel, never an empty score cell"],"tags":["tracker","column-swap","merge","score-format","warning"],"backgroundTag":"column-swap-ambiguity","analyzedSha":"60398d6549a46f5266929538af21cfab94badc75","analyzedAt":"2026-08-20T23:00:06.764Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}