{"record":{"id":"50512dba3e4a2c1b","repo":"santifer/career-ops","slug":"e-num-score-has-markdown-bold-e-score","errorCode":null,"errorMessage":"#${e.num}: Score has markdown bold: \"${e.score}\"","messagePattern":"#(.+?): Score has markdown bold: \"(.+?)\"","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"verify-pipeline.mjs","lineNumber":224,"sourceCode":"}\nif (badRows === 0) ok('All rows properly formatted');\n\n// --- Check 6: Pending TSVs ---\nlet pendingTsvs = 0;\nif (existsSync(ADDITIONS_DIR)) {\n  const files = readdirSync(ADDITIONS_DIR).filter(f => f.endsWith('.tsv'));\n  pendingTsvs = files.length;\n  if (pendingTsvs > 0) {\n    warn(`${pendingTsvs} pending TSVs in tracker-additions/ (not merged)`);\n  }\n}\nif (pendingTsvs === 0) ok('No pending TSVs');\n\n// --- Check 7: Bold in scores ---\nlet boldScores = 0;\nfor (const e of entries) {\n  if (e.score.includes('**')) {\n    warn(`#${e.num}: Score has markdown bold: \"${e.score}\"`);\n    boldScores++;\n  }\n}\nif (boldScores === 0) ok('No bold in scores');\n\n// --- Check 8: Stale report-number sentinels (GC) ---\n// reserve-report-num.mjs drops NNN-RESERVED.md files in reports/ when a\n// number is claimed.  If the process crashed before writing the real report\n// and deleting the sentinel it will linger.  Sentinels older than 4 h are\n// stale; remove them here so they don't skew the next slot allocation.\nconst SENTINEL_MAX_AGE_MS = 4 * 60 * 60 * 1000;\nlet staleSentinels = 0;\nif (existsSync(REPORTS_DIR)) {\n  const now = Date.now();\n  for (const name of readdirSync(REPORTS_DIR)) {\n    if (!name.endsWith('-RESERVED.md')) continue;\n    const full = join(REPORTS_DIR, name);\n    try {","sourceCodeStart":206,"sourceCodeEnd":242,"githubUrl":"https://github.com/santifer/career-ops/blob/60398d6549a46f5266929538af21cfab94badc75/verify-pipeline.mjs#L206-L242","documentation":"verify-pipeline.mjs check 7 flags tracker score cells containing markdown bold ('**'). The canonical rules forbid bold (and dates or extra text) in status/score fields because downstream parsers (tracker-parse.mjs, merge-tracker's score-column detection) match on the plain 'X.X/5' pattern; bold usually creeps in when a row is hand-edited from rendered markdown or a score is pasted from a rendered report.","triggerScenarios":"Hand-editing applications.md after copying text from a rendered (HTML/PDF) report or CV; tooling that writes '**4.5/5**'; markdown editors auto-bolding emphasized numbers.","commonSituations":"Manual table maintenance instead of the TSV+merge path; pasting from GitHub-rendered pages; over-eager editor formatting.","solutions":["Edit the flagged row and strip '**' from the score cell, leaving exactly '4.2/5' (or a recognized sentinel like 'N/A').","Stop hand-editing: use node set-status.mjs for status changes and TSV + node merge-tracker.mjs for additions.","Run node normalize-statuses.mjs to sweep related formatting drift."],"exampleFix":"# before\n| 42 | 2026-08-20 | Acme | ML Engineer | **4.5/5** | Applied | ... |\n# after\n| 42 | 2026-08-20 | Acme | ML Engineer | 4.5/5 | Applied | ... |","handlingStrategy":"validation","validationCode":"// Scrub bold from a score cell before it reaches the tracker\nconst clean = raw.replace(/\\*\\*/g, '').trim();\nif (!isValidScoreCell(clean)) throw new Error(`unrecognized score format: ${raw}`);","typeGuard":"// Predicate for a clean score cell (X.X/5 or a recognized sentinel)\nfunction isValidScoreCell(score) {\n  return /^\\d\\.\\d\\/5$/.test(score) || ['N/A', '—', '-'].includes(score);\n}","tryCatchPattern":null,"preventionTips":["Never hand-edit applications.md cells by pasting from rendered markdown; type the plain value.","Route all tracker writes through TSV + merge-tracker.mjs and status changes through set-status.mjs.","Run node verify-pipeline.mjs after manual edits; fix flagged rows with a plain 'X.X/5' cell."],"tags":["verify-pipeline","formatting","score-column","markdown-pollution","schema-rules"],"backgroundTag":"schema-validation-failed","analyzedSha":"60398d6549a46f5266929538af21cfab94badc75","analyzedAt":"2026-08-20T23:00:06.764Z","schemaVersion":2},"datasetVersion":"2026-08-21T13:17:26.733Z"}