{"record":{"id":"c4acc88702c8e2f4","repo":"santifer/career-ops","slug":"s-url-batch-reports-report-s-reportnum","errorCode":null,"errorMessage":"⚠️  ${s.url} — batch reports report #${s.reportNum} but no reports/${s.reportNum}-*.md found; left in Pendientes.","messagePattern":"⚠️  (.+?) — batch reports report #(.+?) but no reports/(.+?)-\\*\\.md found; left in Pendientes\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"reconcile-pipeline.mjs","lineNumber":240,"sourceCode":"\n  const parts = body.split('|').map(s => s.trim());\n  const company = parts[1] || '';\n  const role = parts[2] || '';\n  const score = resolveScore(done.score, reportFile);\n  const pdf = resolvePdf(reportFile);\n  const num = parseInt(done.reportNum, 10);\n\n  const reportLink = normalizeReportLink(`[${num}](reports/${reportFile})`, dirname(PIPELINE_FILE), CAREER_OPS);\n  movedProcLines.push(`- [x] ${reportLink} | ${url} | ${company} | ${role} | ${score} | PDF ${pdf}`);\n  moved.push({ url, company, role, num, score });\n  procUrls.add(url);\n  removeIdx.add(i);\n}\n\n// ---- report & exit early if nothing changed ----\nconsole.log('=== Reconcile pipeline.md ===');\nfor (const s of skippedNoReport) {\n  console.warn(`⚠️  ${s.url} — batch reports report #${s.reportNum} but no reports/${s.reportNum}-*.md found; left in Pendientes.`);\n}\n\nif (removeIdx.size === 0) {\n  console.log('✅ pipeline.md already in sync — nothing to reconcile.');\n  process.exit(0);\n}\n\n// ---- rebuild the file ----\nconst out = [];\nlet skipBlankAfterProc = false;\nfor (let i = 0; i < lines.length; i++) {\n  if (removeIdx.has(i)) continue;\n  if (skipBlankAfterProc) {\n    skipBlankAfterProc = false;\n    if (lines[i].trim() === '') continue; // drop the original blank after \"## Procesadas\"\n  }\n  out.push(lines[i]);\n  if (i === procStart && movedProcLines.length > 0) {","sourceCodeStart":222,"sourceCodeEnd":258,"githubUrl":"https://github.com/santifer/career-ops/blob/60398d6549a46f5266929538af21cfab94badc75/reconcile-pipeline.mjs#L222-L258","documentation":"reconcile-pipeline.mjs moves processed pipeline.md entries into the done section by trusting the report numbers recorded in batch TSVs. When a TSV claims report #N but no reports/N-*.md exists, the entry is deliberately left in Pendientes (skippedNoReport) and this warning is printed -- refusing to write a done-line whose report link is dead.","triggerScenarios":"A batch worker wrote the tracker TSV but crashed before writing the report file; the report was deleted or renamed by hand; reconcile running against a different CAREER_OPS root than the one hosting reports/.","commonSituations":"Interrupted parallel batch runs; overzealous manual cleanup of reports/; git operations dropping untracked report files; stale batch/tracker-additions/ from an old session.","solutions":["Locate the real report: ls reports/ | grep <number or company-slug> -- it may exist under a different number.","Fix the TSV's report number to match the actual file, or re-run the evaluation for that URL if the report truly never landed.","Re-run node reconcile-pipeline.mjs; the entry moves once the link resolves."],"exampleFix":"# before: TSV claims a report that does not exist\n064\t2026-08-20\tAcme\t...\t[064](reports/064-acme-2026-08-20.md)\t...\n$ ls reports/ | grep acme   # -> 065-acme-2026-08-20.md\n# after: point the TSV at the real file and re-run reconcile\n064\t2026-08-20\tAcme\t...\t[064](reports/065-acme-2026-08-20.md)\t...","handlingStrategy":"validation","validationCode":"// Before reconcile, confirm every TSV's report number has a real file\nimport { readdirSync, readFileSync, existsSync } from 'node:fs';\nconst reports = new Set(readdirSync('reports'));\nfor (const f of readdirSync('batch/tracker-additions').filter(f => f.endsWith('.tsv'))) {\n  const cells = readFileSync(`batch/tracker-additions/${f}`, 'utf-8').trim().split('\\t');\n  const num = cells[0].padStart(3, '0');\n  if (![...reports].some(r => r.startsWith(`${num}-`)))\n    console.error(`${f}: report #${num} has no reports/${num}-*.md`);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Run reconcile only after the batch's reports are confirmed written (the runner prints 'Report saved: ...' per file).","Use --report=N archiving so captures and reports share the tracked number.","Never delete reports/ files without checking batch/tracker-additions/ and pipeline.md references first."],"tags":["reconcile-pipeline","report-missing","dangling-reference","batch","pipeline"],"backgroundTag":"dangling-reference","analyzedSha":"60398d6549a46f5266929538af21cfab94badc75","analyzedAt":"2026-08-20T23:00:06.764Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}