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
- 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.
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
- 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.
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
- ⚠️ Skipping : header is missing required column(s)
- # : — no automatic update
- Conflicting status recommendations require manual review:
- ⚠️ Could not save report
- Cross-channel duplicate
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)