santifer/career-ops · warning

⚠️ Skipping malformed TSV ${filename}: ${parts.length} fiel

Error message

⚠️  Skipping malformed TSV ${filename}: ${parts.length} fields

What it means

For tab-separated additions, merge-tracker.mjs splits the line on tabs and requires at least 8 fields (9 columns is the documented format; notes is field 9 and extras follow). Fewer than 8 means a required column is missing, so the file is skipped with this warning instead of merging misaligned data.

Source

Thrown at merge-tracker.mjs:690

      date: parts[1],
      company: parts[2],
      role: parts[3],
      // Write-canonical: the tracker stores scores unbolded (verify-pipeline
      // rejects bold scores), so strip any markdown bold from the incoming cell.
      score: resolved.score.replace(/\*\*/g, '').trim(),
      status: validateStatus(resolved.status),
      pdf: parts[6],
      report: parts[7],
      notes: parts[8] || '',
    };
    const extras = parseTsvExtras(parts, filename);
    if (!extras) return null;
    Object.assign(addition, extras);
  } else {
    // Tab-separated
    parts = content.split('\t');
    if (parts.length < 8) {
      console.warn(`⚠️  Skipping malformed TSV ${filename}: ${parts.length} fields`);
      return null;
    }

    // Column order varies: batch TSVs write (status, score), applications.md is
    // (score, status). Identify each by content — the score cell is recognizable
    // by pattern, a status never is — so a reordered TSV merges correctly and an
    // undecidable row is skipped loudly instead of merging swapped data (#1427).
    const resolved = resolveScoreStatus(parts[4].trim(), parts[5].trim());
    if (!resolved) {
      console.warn(`⚠️  Skipping ${filename}: cannot tell score from status in columns 5–6 ("${parts[4].trim()}" | "${parts[5].trim()}") — refusing to merge a possible column swap`);
      return null;
    }

    addition = {
      num: parseInt(parts[0]),
      date: parts[1],
      company: parts[2],
      role: parts[3],

View on GitHub (pinned to 60398d6549)

Solutions

  1. Rewrite the line with the full 9 tab-separated columns: num, date, company, role, status, score, pdf, report, notes
  2. Verify the file is tab-delimited, not comma-delimited
  3. Regenerate the TSV from the documented template and re-run node merge-tracker.mjs

Example fix

# before (7 fields)
042	2026-08-20	Acme	SRE	Interview	4.2/5	[042](reports/042-acme-2026-08-20.md)

# after (9 fields)
042	2026-08-20	Acme	SRE	Interview	4.2/5	✅	[042](reports/042-acme-2026-08-20.md)	note
Defensive patterns

Strategy: validation

Validate before calling

function tsvRowHasAllColumns(line) {
  return line.split('\t').length >= 8;
}

Prevention

When it happens

Trigger: A TSV line with 7 or fewer tab-separated cells — e.g. notes omitted AND an earlier column missing — makes parts.length < 8 and the addition is rejected before any content-based resolution runs.

Common situations: Hand-writing the TSV and dropping the pdf or report column; a CSV file (comma-separated) fed in where only 1 'field' is found after tab-splitting; line-editor that collapsed tabs.

Understand the failure class

Related errors


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