santifer/career-ops · warning
${pendingTsvs} pending TSVs in tracker-additions/ (not merge
Error message
${pendingTsvs} pending TSVs in tracker-additions/ (not merged) What it means
verify-pipeline.mjs check 6 counts *.tsv files in batch/tracker-additions/. Every evaluation drops one TSV there and merge-tracker.mjs consumes them (moving each to merged/); a non-zero count at verification time means evaluations whose tracker rows have not landed -- either the mandatory post-batch merge was not run, or some TSVs were rejected as malformed and never merged.
Source
Thrown at verify-pipeline.mjs:215
let badRows = 0;
for (const line of lines) {
if (!line.startsWith('|')) continue;
if (isSeparatorRow(line) || isHeaderRow(line)) continue;
const parts = line.split('|');
if (parts.length <= MAX_IDX) {
error(`Row with too few columns (need ${MAX_IDX} data cols): ${line.substring(0, 80)}...`);
badRows++;
}
}
if (badRows === 0) ok('All rows properly formatted');
// --- Check 6: Pending TSVs ---
let pendingTsvs = 0;
if (existsSync(ADDITIONS_DIR)) {
const files = readdirSync(ADDITIONS_DIR).filter(f => f.endsWith('.tsv'));
pendingTsvs = files.length;
if (pendingTsvs > 0) {
warn(`${pendingTsvs} pending TSVs in tracker-additions/ (not merged)`);
}
}
if (pendingTsvs === 0) ok('No pending TSVs');
// --- Check 7: Bold in scores ---
let boldScores = 0;
for (const e of entries) {
if (e.score.includes('**')) {
warn(`#${e.num}: Score has markdown bold: "${e.score}"`);
boldScores++;
}
}
if (boldScores === 0) ok('No bold in scores');
// --- Check 8: Stale report-number sentinels (GC) ---
// reserve-report-num.mjs drops NNN-RESERVED.md files in reports/ when a
// number is claimed. If the process crashed before writing the real report
// and deleting the sentinel it will linger. Sentinels older than 4 h areView on GitHub (pinned to 60398d6549)
Solutions
- Run node merge-tracker.mjs -- it merges what it can and moves consumed TSVs to merged/.
- Inspect any TSV named in the 'NOT merged' summary: fix its tab-separated columns and re-run the merge.
- Finish with node verify-pipeline.mjs to confirm check 6 reports 'No pending TSVs'.
Example fix
# before ⚠️ 5 pending TSVs in tracker-additions/ (not merged) # after $ node merge-tracker.mjs && node verify-pipeline.mjs # ✅ ... No pending TSVs
Defensive patterns
Strategy: validation
Validate before calling
// Batch scripts should verify the queue is drained before declaring done
import { readdirSync } from 'node:fs';
const pending = readdirSync('batch/tracker-additions').filter(f => f.endsWith('.tsv')).length;
if (pending > 0) {
console.error(`${pending} TSVs unmerged — run 'node merge-tracker.mjs' before finishing`);
process.exitCode = 1;
} Prevention
- Make 'node merge-tracker.mjs' the mandatory last step of every batch session (it is a repo rule for exactly this reason).
- Treat a 'NOT merged' count in the merge summary as a hard failure to fix, not noise.
- End sessions with node verify-pipeline.mjs and require 'No pending TSVs'.
When it happens
Trigger: Running batch/auto-pipeline evaluations without the follow-up node merge-tracker.mjs; a merge that aborted with 'N NOT merged' (failedAdditions); TSVs with wrong column counts left behind.
Common situations: Forgetting the merge step after a batch session; CI crashing between evaluate and merge; a worker writing a malformed TSV that the merger refuses.
Related errors
- Invalid or blocked URL: ${rejected.reason}
- each entry needs a string "input" and "output"
- invalid format "${entryFormat}" (use: ${validFormats.join(',
- invalid reportNum "${entryReport}" (use the numeric report n
- output escapes the tracker workspace: ${entryOutput}
AI-assisted analysis of santifer/career-ops@60398d6549 (2026-08-20).
Data as JSON: /api/errors/71012cc3bad2397d.
Report an issue: GitHub.