{"record":{"id":"3bd70bee01c72f1d","repo":"santifer/career-ops","slug":"sync-drift-needs-human-review-m-company","errorCode":null,"errorMessage":"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'})","messagePattern":"Sync drift \\(needs human review\\): (.+?) — (.+?): applications\\.md=\"(.+?)\" \\((.+?)\\) vs active-interviews\\.md=\"(.+?)\" \\((.+?)\\)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"verify-pipeline.mjs","lineNumber":458,"sourceCode":"// 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\n      ? 'applications.md and active-interviews.md are in sync'\n      : 'No active-interviews.md rows to sync-check');\n  }\n}\n\n// --- Check 14: data/follow-ups.md table schema (#2971) ---\n// stats.mjs (computeFollowupStats) and followup-cadence.mjs both read this table\n// positionally, in the shape modes/followup.md documents, and both skip any row\n// whose num/appNum cells don't parse as integers. A table written with a\n// different column order therefore reports as ZERO follow-ups in both tools,\n// silently — indistinguishable from a file where nothing has been logged yet.\n// Follow-up compliance is exactly the number a user consults to decide whether","sourceCodeStart":440,"sourceCodeEnd":476,"githubUrl":"https://github.com/santifer/career-ops/blob/60398d6549a46f5266929538af21cfab94badc75/verify-pipeline.mjs#L440-L476","documentation":"Error \"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'})\" thrown in santifer/career-ops.","triggerScenarios":"Thrown at verify-pipeline.mjs:458 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"60398d6549a46f5266929538af21cfab94badc75","analyzedAt":"2026-08-20T23:00:06.764Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}