santifer/career-ops · warning

# : unknown employer (?) but the tracker has no Via column…

Error message

#${e.num}: unknown employer (?) but the tracker has no Via column — add it with: node merge-tracker.mjs --migrate-via

What it means

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.

Solutions

  1. Run `node merge-tracker.mjs --migrate-via` to add the Via column to the existing tracker.
  2. Fill the Via cell for each `?` row with the agency/recruiter firm name (e.g. `Hays`).
  3. Going forward, write `via` as an ordinary column in batch/tracker-additions/ TSV headers (or `via={Agency}` tagged extras in legacy headerless rows).
  4. Re-run `node verify-pipeline.mjs` — the warning should clear; missing Via values on `?` rows then escalate to an error.

Example fix

// before: no Via column, company cell holds '?'
| 42 | 2026-09-16 | ? | Sr Backend | 4.0/5 | Applied | ... |
// after migration
node merge-tracker.mjs --migrate-via
| 42 | 2026-09-16 | ? | Sr Backend | 4.0/5 | Applied | ... | Hays | ... |
Defensive patterns

Strategy: validation

Validate before calling

if (company === '?' && !trackerHeaders.includes('via')) {
  execSync('node merge-tracker.mjs --migrate-via');
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of santifer/career-ops@e7abd431fc (2026-09-16). Data as JSON: /api/errors/64e2949c08cd6852. Report an issue: GitHub.

Appendix: source

Thrown at verify-pipeline.mjs:379

    warn(`Orphan report — no tracker row references #${num}: reports/${name}`);
    orphanReports++;
  }
}
if (orphanReports === 0) ok('No orphan reports');

// --- Check 11: Via channel consistency (#1596) ---
// The Via column records the intermediary (agency/recruiter firm; `—` when the
// application was direct). Unknown employers use the structural marker `?` in
// Company — never a word like "Confidential", which is locale-dependent and can
// collide with a real firm name.
let viaIssues = 0;
const CONFIDENTIAL_WORD_RE = /^(confidential|vertraulich|confidentiel|confidencial|riservato|gizli|機密|سري)$/i;
for (const e of entries) {
  const company = String(e.company || '').trim();
  const via = String(e.via || '').trim();
  if (company === '?') {
    if (COLMAP.via == null) {
      warn(`#${e.num}: unknown employer (?) but the tracker has no Via column — add it with: node merge-tracker.mjs --migrate-via`);
      viaIssues++;
    } else if (!via || via === '—') {
      error(`#${e.num}: unknown employer (?) with no Via channel — record the agency/recruiter firm`);
      viaIssues++;
    }
  }
  if (CONFIDENTIAL_WORD_RE.test(company)) {
    warn(`#${e.num}: company "${company}" looks like a confidentiality placeholder — use the structural marker ? (locale-invariant, can't collide with a real firm)`);
    viaIssues++;
  }
}
// Same company+role reached through different channels: both submissions are
// real, so this is a warning to the human (double-submission risk), never an
// auto-merge. Channel identity uses the shared normalizeVia() that merge-tracker
// and dedup-tracker key agencies with (#2397), so "Hays" and "HAYS " read as one
// channel while リクルート and パーソル stay two; the raw spelling is kept for
// the message. Before this, both non-Latin agencies normalized to '' and fell
// back to 'direct', hiding exactly the double-submission this check exists for.

View on GitHub (pinned to e7abd431fc)