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
- Rewrite the line with the full 9 tab-separated columns: num, date, company, role, status, score, pdf, report, notes
- Verify the file is tab-delimited, not comma-delimited
- 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
- Write additions with a script that emits the 9 tab-separated columns
- Confirm the file is tab-delimited (comma-separated files fail this check)
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
- Parsing and encoding errors: unexpected token, malformed input — why parsers reject input and how to find the real culprit.
Related errors
- ⚠️ Skipping ${filename}: ambiguous extra fields [${extras.j
- ⚠️ Skipping malformed pipe-delimited ${filename}: ${parts.l
- ⚠️ Skipping ${filename}: cannot tell score from status in c
- ⚠️ Skipping ${filename}: invalid entry number
- ⚠️ Non-canonical status "${status}" → defaulting to "Evalua
AI-assisted analysis of santifer/career-ops@60398d6549 (2026-08-20).
Data as JSON: /api/errors/ba34e3cf4b22fadd.
Report an issue: GitHub.