{"record":{"id":"94dff5cb757f4633","repo":"santifer/career-ops","slug":"sync-check-could-not-run-err-message","errorCode":null,"errorMessage":"Sync check could not run: ${err.message}","messagePattern":"Sync check could not run: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"verify-pipeline.mjs","lineNumber":446,"sourceCode":"for (const [num, group] of numGroups) {\n  if (group.length > 1) {\n    error(`Duplicate tracker number #${num} used by ${group.length} rows: ${group.map(e => `${e.company} — ${e.role}`).join(' | ')}`);\n    dupeNums++;\n  }\n}\nif (dupeNums === 0) ok('No duplicate tracker numbers');\n\n// --- Check 13: applications.md <-> active-interviews.md status sync (#1504) ---\n// Delegates to tracker-sync-check.mjs's exported checkTrackerSync() rather than\n// re-implementing the matching/two-tier resolution logic here or shelling out\n// to a second process. Read-only: this only surfaces drift, it does not write\n// a fix (tracker-sync-check.mjs is intentionally reporting-only for now — see\n// its module header).\nlet syncResult;\ntry {\n  syncResult = checkTrackerSync({ appsFile: APPS_FILE });\n} catch (err) {\n  warn(`Sync check could not run: ${err.message}`);\n}\n\nif (syncResult) {\n  const tier1Mismatches = syncResult.mismatches.filter(m => m.resolution === 'auto-tier1');\n  const tier2Mismatches = syncResult.mismatches.filter(m => m.resolution === 'needs-review-tier2');\n  const unmatchedRows = syncResult.mismatches.filter(m => m.resolution === 'unmatched');\n\n  for (const m of tier1Mismatches) {\n    warn(`Sync drift (auto-resolvable): ${m.company} — ${m.role}: applications.md=\"${m.applicationsStatus}\" vs active-interviews.md=\"${m.activeInterviewsStatus}\" -> suggest \"${m.suggestedStatus}\" in ${m.staleIn} (run node tracker-sync-check.mjs for details)`);\n  }\n  for (const m of tier2Mismatches) {\n    warn(`Sync drift (needs human review): ${m.company} — ${m.role}: applications.md=\"${m.applicationsStatus}\" (${m.applicationsLastModified || 'no blame info'}) vs active-interviews.md=\"${m.activeInterviewsStatus}\" (${m.activeInterviewsLastModified || 'no blame info'})`);\n  }\n  for (const m of unmatchedRows) {\n    warn(`Sync check: active-interviews.md row for \"${m.company}\" — \"${m.role}\" could not be matched to a tracker row (${m.note})`);\n  }\n  if (tier1Mismatches.length === 0 && tier2Mismatches.length === 0 && unmatchedRows.length === 0) {\n    ok(syncResult.summary.total > 0","sourceCodeStart":428,"sourceCodeEnd":464,"githubUrl":"https://github.com/santifer/career-ops/blob/60398d6549a46f5266929538af21cfab94badc75/verify-pipeline.mjs#L428-L464","documentation":"verify-pipeline.mjs's health check 13 delegates to tracker-sync-check.mjs's exported checkTrackerSync(); that call threw before producing a result. In practice this means its inputs — data/applications.md and data/active-interviews.md — are missing or do not contain the expected markdown tables (never created, renamed, or emptied by a bad merge). The rest of verify-pipeline still runs; you just get no drift report for this check.","triggerScenarios":"data/active-interviews.md absent (fresh install with no interviews tracked yet); the file exists but has no table header to parse; a tracker file renamed during reorganization; a conflict resolved by emptying the file.","commonSituations":"New setups before any interview tracking; repo reorganizations renaming tracker files; merge conflicts resolved by truncation.","solutions":["Run node tracker-sync-check.mjs standalone — its direct error pinpoints the file it choked on.","Ensure data/active-interviews.md exists with the documented table header; same for data/applications.md.","Re-run node verify-pipeline.mjs and confirm check 13 now reports instead of warning."],"exampleFix":"# before — checkTrackerSync throws because active-interviews.md is missing\n# after — create the file with the expected header, then re-run\ncat > data/active-interviews.md <<'EOF'\n# Active Interviews\n\n| Company | Role | Round | Status | Last Update | Notes |\n|---------|------|-------|--------|-------------|-------|\nEOF\nnode verify-pipeline.mjs","handlingStrategy":"validation","validationCode":"import { existsSync, readFileSync } from 'node:fs';\nconst tableReady = (p) => existsSync(p) && /^\\|.*\\|/m.test(readFileSync(p, 'utf-8'));\nif (!tableReady('data/applications.md') || !tableReady('data/active-interviews.md')) {\n  console.warn('sync-check inputs missing or unparsed — run node tracker-sync-check.mjs for details');\n}","typeGuard":null,"tryCatchPattern":"try {\n  syncResult = checkTrackerSync({ appsFile: APPS_FILE });\n} catch (err) {\n  warn(`Sync check could not run: ${err.message}`);\n} // degrade a single check, never the whole health report","preventionTips":["Keep both tracker files present with valid table headers, even when empty","Run tracker-sync-check.mjs standalone first when verify-pipeline reports this","Treat a missing sync check as unknown state, not as 'no drift'"],"tags":["verify-pipeline","tracker-sync","missing-file","health-check"],"backgroundTag":"missing-input-file","analyzedSha":"60398d6549a46f5266929538af21cfab94badc75","analyzedAt":"2026-08-20T23:00:06.764Z","schemaVersion":2},"datasetVersion":"2026-08-21T13:17:26.733Z"}