santifer/career-ops · warning

⚠️ ${file}: carries via=${addition.via} but the tracker has

Error message

⚠️  ${file}: carries via=${addition.via} but the tracker has no Via column — value dropped. Add it with: node merge-tracker.mjs --migrate-via

What it means

A via=Firm agency tag on an addition can only be stored if the tracker table has a Via column (#1596). When COLMAP.via is null, merge-tracker.mjs warns that the value is dropped, clears addition.via (so the cross-channel duplicate guard does not misread the row), and points at the one-command migration to add the column.

Source

Thrown at merge-tracker.mjs:987

  if (pendingIdx >= 0) {
    newLines[pendingIdx] = updatedLine;
    return true;
  }
  return false;
}

for (const file of tsvFiles) {
  const content = readFileSync(join(ADDITIONS_DIR, file), 'utf-8').trim();
  const addition = parseTsvContent(content, file);
  if (!addition) { skipped++; continue; }

  // A via= tag can only be stored if the tracker has a Via column — warn
  // instead of dropping the channel silently (#1596). Clear the value too:
  // existing rows parse with via='' on this layout, so a set addition.via would
  // make the cross-channel duplicate guard see a channel mismatch and add a
  // second ? row instead of updating the same-agency re-blast.
  if (addition.via && COLMAP.via == null) {
    console.warn(`⚠️  ${file}: carries via=${addition.via} but the tracker has no Via column — value dropped. Add it with: node merge-tracker.mjs --migrate-via`);
    addition.via = '';
  }

  // If additions carry a URL but the tracker has no URL
  // column, deterministic Pass 0 cannot engage and dedup silently falls back to
  // the fuzzy tiers. Warn once rather than degrade invisibly.
  if (addition.url && COLMAP.url == null && !warnedNoUrlCol) {
    console.warn('⚠️  Additions carry a URL but this tracker has no URL column — URL dedup is INACTIVE (fuzzy fallback). Add a `URL` header column to enable it.');
    warnedNoUrlCol = true;
  }

  // Normalize the report link to be relative to the tracker file's directory.
  // The TSV convention carries a root-relative `reports/...` link; rewrite it
  // so it resolves correctly when clicked from applications.md (see #760).
  addition.report = normalizeReportLink(addition.report);

  // Derive the key from the linked report when the TSV did not carry one, so a
  // row added through the normal nine-column flow is born WITH its key. This

View on GitHub (pinned to 60398d6549)

Solutions

  1. Run `node merge-tracker.mjs --migrate-via` to add the Via column, then re-merge so the value is kept
  2. Re-apply the dropped via value by hand to the affected row if migrating now is not an option
  3. Keep future additions' via tags consistent so the column stays populated

Example fix

# before
node merge-tracker.mjs  # via=Hays dropped with warning

# after
node merge-tracker.mjs --migrate-via
node merge-tracker.mjs  # via=Hays now stored
Defensive patterns

Strategy: validation

Validate before calling

import { readFileSync } from 'node:fs';
function trackerHasViaColumn(trackerPath) {
  const header = readFileSync(trackerPath, 'utf8').split('\n').find(l => l.startsWith('|'));
  return !!header && /\bvia\b/i.test(header);
}

Prevention

When it happens

Trigger: Merging a TSV row carrying a trailing `via=Hays` field into a data/applications.md whose header row has no Via column — addition.via is truthy, COLMAP.via == null, and the warn-and-drop branch runs for each such file.

Common situations: Tracker created before the Via feature existed; a fresh tracker from an old template; mixing agency-sourced additions into a manually maintained table.

Related errors


AI-assisted analysis of santifer/career-ops@60398d6549 (2026-08-20). Data as JSON: /api/errors/3d047809a7941bef. Report an issue: GitHub.