{"record":{"id":"64e2949c08cd6852","repo":"santifer/career-ops","slug":"e-num-unknown-employer-but-the-tracker-ha","errorCode":null,"errorMessage":"#${e.num}: unknown employer (?) but the tracker has no Via column — add it with: node merge-tracker.mjs --migrate-via","messagePattern":"#(.+?): unknown employer \\(\\?\\) but the tracker has no Via column — add it with: node merge-tracker\\.mjs --migrate-via","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"verify-pipeline.mjs","lineNumber":379,"sourceCode":"    warn(`Orphan report — no tracker row references #${num}: reports/${name}`);\n    orphanReports++;\n  }\n}\nif (orphanReports === 0) ok('No orphan reports');\n\n// --- Check 11: Via channel consistency (#1596) ---\n// The Via column records the intermediary (agency/recruiter firm; `—` when the\n// application was direct). Unknown employers use the structural marker `?` in\n// Company — never a word like \"Confidential\", which is locale-dependent and can\n// collide with a real firm name.\nlet viaIssues = 0;\nconst CONFIDENTIAL_WORD_RE = /^(confidential|vertraulich|confidentiel|confidencial|riservato|gizli|機密|سري)$/i;\nfor (const e of entries) {\n  const company = String(e.company || '').trim();\n  const via = String(e.via || '').trim();\n  if (company === '?') {\n    if (COLMAP.via == null) {\n      warn(`#${e.num}: unknown employer (?) but the tracker has no Via column — add it with: node merge-tracker.mjs --migrate-via`);\n      viaIssues++;\n    } else if (!via || via === '—') {\n      error(`#${e.num}: unknown employer (?) with no Via channel — record the agency/recruiter firm`);\n      viaIssues++;\n    }\n  }\n  if (CONFIDENTIAL_WORD_RE.test(company)) {\n    warn(`#${e.num}: company \"${company}\" looks like a confidentiality placeholder — use the structural marker ? (locale-invariant, can't collide with a real firm)`);\n    viaIssues++;\n  }\n}\n// Same company+role reached through different channels: both submissions are\n// real, so this is a warning to the human (double-submission risk), never an\n// auto-merge. Channel identity uses the shared normalizeVia() that merge-tracker\n// and dedup-tracker key agencies with (#2397), so \"Hays\" and \"HAYS \" read as one\n// channel while リクルート and パーソル stay two; the raw spelling is kept for\n// the message. Before this, both non-Latin agencies normalized to '' and fell\n// back to 'direct', hiding exactly the double-submission this check exists for.","sourceCodeStart":361,"sourceCodeEnd":397,"githubUrl":"https://github.com/santifer/career-ops/blob/e7abd431fce9348a95261acac9e0c14779c35df8/verify-pipeline.mjs#L361-L397","documentation":"A warning from verify-pipeline.mjs (Check 11, Via channel consistency #1596) when a tracker row records an unknown end employer (`?` — the locale-invariant marker for agency-posted jobs) but the tracker table has no `Via` column at all, so the agency/recruiter firm behind the posting cannot be recorded. The fix is migrating the tracker to add the column.","triggerScenarios":"Running `node verify-pipeline.mjs` when COLMAP.via is null (no Via header column in applications.md) and at least one entry's company is exactly `?` — e.g. rows created from agency listings (Hays et al.) before the Via column existed.","commonSituations":"Trackers created before the #1596 Via field was introduced; applying through staffing agencies and using `?` for the unknown end client; older installs that never ran --migrate-via.","solutions":["Run `node merge-tracker.mjs --migrate-via` to add the Via column to the existing tracker.","Fill the Via cell for each `?` row with the agency/recruiter firm name (e.g. `Hays`).","Going forward, write `via` as an ordinary column in batch/tracker-additions/ TSV headers (or `via={Agency}` tagged extras in legacy headerless rows).","Re-run `node verify-pipeline.mjs` — the warning should clear; missing Via values on `?` rows then escalate to an error."],"exampleFix":"// before: no Via column, company cell holds '?'\n| 42 | 2026-09-16 | ? | Sr Backend | 4.0/5 | Applied | ... |\n// after migration\nnode merge-tracker.mjs --migrate-via\n| 42 | 2026-09-16 | ? | Sr Backend | 4.0/5 | Applied | ... | Hays | ... |","handlingStrategy":"validation","validationCode":"if (company === '?' && !trackerHeaders.includes('via')) {\n  execSync('node merge-tracker.mjs --migrate-via');\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Migrate once (`--migrate-via`) after adopting agency-sourced rows.","Include a `via` column in every tracker-additions TSV header.","Use `?` for unknown end employers only together with the agency name in Via."],"tags":["missing-column","schema-migration","tracker","via-channel"],"backgroundTag":"missing-config-key","analyzedSha":"e7abd431fce9348a95261acac9e0c14779c35df8","analyzedAt":"2026-09-16T06:35:29.214Z","contentChangedAt":"2026-09-16T06:35:29.214Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}