{"record":{"id":"fd8a2ffab3daf897","repo":"santifer/career-ops","slug":"skipping-filename-cannot-tell-score-from-s-fd8a2f","errorCode":null,"errorMessage":"⚠️  Skipping ${filename}: cannot tell score from status in columns 5–6 (\"${parts[4].trim()}\" | \"${parts[5].trim()}\") — 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":700,"sourceCode":"    };\n    const extras = parseTsvExtras(parts, filename);\n    if (!extras) return null;\n    Object.assign(addition, extras);\n  } else {\n    // Tab-separated\n    parts = content.split('\\t');\n    if (parts.length < 8) {\n      console.warn(`⚠️  Skipping malformed TSV ${filename}: ${parts.length} fields`);\n      return null;\n    }\n\n    // Column order varies: batch TSVs write (status, score), applications.md is\n    // (score, status). Identify each by content — the score cell is recognizable\n    // by pattern, a status never is — so a reordered TSV merges correctly and an\n    // undecidable row is skipped loudly instead of merging swapped data (#1427).\n    const resolved = resolveScoreStatus(parts[4].trim(), parts[5].trim());\n    if (!resolved) {\n      console.warn(`⚠️  Skipping ${filename}: cannot tell score from status in columns 5–6 (\"${parts[4].trim()}\" | \"${parts[5].trim()}\") — refusing to merge a possible column swap`);\n      return null;\n    }\n\n    addition = {\n      num: parseInt(parts[0]),\n      date: parts[1],\n      company: parts[2],\n      role: parts[3],\n      status: validateStatus(resolved.status),\n      // Write-canonical: strip any markdown bold so the stored score stays\n      // unbolded (verify-pipeline rejects bold scores).\n      score: resolved.score.replace(/\\*\\*/g, '').trim(),\n      pdf: parts[6],\n      report: parts[7],\n      notes: parts[8] || '',\n    };\n    const extras = parseTsvExtras(parts, filename);\n    if (!extras) return null;","sourceCodeStart":682,"sourceCodeEnd":718,"githubUrl":"https://github.com/santifer/career-ops/blob/60398d6549a46f5266929538af21cfab94badc75/merge-tracker.mjs#L682-L718","documentation":"Same content-based column identification as the pipe path, applied to tab-separated rows (guard #1427): batch TSVs write (status, score), applications.md stores (score, status), so columns 5-6 are resolved by recognizing the score pattern. When neither cell matches a score (X.X/5 or N/A / — / - sentinels), the row could be swapped, and the merge refuses it loudly.","triggerScenarios":"A TSV row whose 5th/6th fields are both non-score text — e.g. 'Interview' and 'good' or two empty cells — makes resolveScoreStatus() return null and the warning quotes both cells before the skip.","commonSituations":"Backfilled rows with blank or ad-hoc score placeholders ('pending', '??'); a header line accidentally left in the additions file; a status duplicated into both columns during hand-editing.","solutions":["Set the score cell to X.X/5 or an accepted sentinel (N/A, —, or -)","Ensure exactly one of the two cells holds a canonical status","Remove header/comment lines from batch/tracker-additions files before merging"],"exampleFix":"# before (fields 5-6)\n042\t2026-08-20\tAcme\tSRE\tInterview\t???\t✅\t[042](reports/042-acme-2026-08-20.md)\tnote\n\n# after\n042\t2026-08-20\tAcme\tSRE\tInterview\t4.2/5\t✅\t[042](reports/042-acme-2026-08-20.md)\tnote","handlingStrategy":"validation","validationCode":"const SCORE_CELL = /^(\\d+(\\.\\d+)?\\/5|n\\/a|—|-)$/i;\nfunction tsvScoreStatusResolvable(line) {\n  const parts = line.split('\\t');\n  if (parts.length < 8) return false;\n  return SCORE_CELL.test(parts[4].trim()) || SCORE_CELL.test(parts[5].trim());\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep exactly one score-shaped cell and one canonical status among columns 5-6","Strip header lines from batch/tracker-additions files before merging"],"tags":["tracker","column-swap","tsv-parsing","merge","warning"],"backgroundTag":"column-swap-ambiguity","analyzedSha":"60398d6549a46f5266929538af21cfab94badc75","analyzedAt":"2026-08-20T23:00:06.764Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}