{"record":{"id":"82896c4ce9687ab6","repo":"santifer/career-ops","slug":"sync-drift-auto-resolvable-m-company-m-r","errorCode":null,"errorMessage":"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)","messagePattern":"Sync drift \\(auto-resolvable\\): (.+?) — (.+?): applications\\.md=\"(.+?)\" vs active-interviews\\.md=\"(.+?)\" -> suggest \"(.+?)\" in (.+?) \\(run node tracker-sync-check\\.mjs for details\\)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"verify-pipeline.mjs","lineNumber":455,"sourceCode":"// 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\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","sourceCodeStart":437,"sourceCodeEnd":473,"githubUrl":"https://github.com/santifer/career-ops/blob/60398d6549a46f5266929538af21cfab94badc75/verify-pipeline.mjs#L437-L473","documentation":"Error \"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)\" thrown in santifer/career-ops.","triggerScenarios":"Thrown at verify-pipeline.mjs:455 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"}