santifer/career-ops · warning

Skipped #${r.num}: row no longer exists in the tracker

Error message

Skipped #${r.num}: row no longer exists in the tracker

What it means

Same apply pass in reply-watch.mjs handles rows that vanished entirely: a recommendation references #num, but by apply time no such row exists in applications.md (result.missing). The update is skipped -- never recreated -- because reply-watch only updates existing applications; it does not author rows. Typical cause is dedup-tracker.mjs renumbering or manual row deletion between classification and apply.

Source

Thrown at reply-watch.mjs:321

    updates.forEach(r => {
      const count = r.count > 1 ? ` (${r.count} replies)` : '';
      console.log(`  #${r.num} ${r.company} (${r.role}): ${r.oldStatus} → ${r.newStatus}${count}`);
    });
    console.log('');

    const answer = await askQuestion(`Apply recommended status updates to ${APPS_FILE}? (y/N): `);
    if (answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes') {
      const result = await updateTrackerStatuses(updates);
      for (const r of updates) {
        const count = r.count > 1 ? ` (${r.count} replies)` : '';
        if (result.applied.has(r.num)) {
          console.log(`Updated #${r.num} to ${r.newStatus}${count}`);
        } else if (result.alreadyCurrent.has(r.num)) {
          console.log(`No change for #${r.num}: already ${r.newStatus}${count}`);
        } else if (result.conflicts.has(r.num)) {
          console.warn(`Skipped #${r.num}: status changed from ${r.oldStatus} to ${result.conflicts.get(r.num)} during review`);
        } else if (result.missing.has(r.num)) {
          console.warn(`Skipped #${r.num}: row no longer exists in the tracker`);
        }
      }
      console.log('\n✅ Tracker review complete');

      // Sync tracker DB if tracker.mjs exists
      try {
        const { execSync } = await import('child_process');
        execSync('node tracker.mjs sync', { stdio: 'ignore' });
        console.log('Synced database index (applications.db).');
      } catch (e) {
        // ignore
      }
    } else {
      console.log('Updates skipped.');
    }
  }
}

View on GitHub (pinned to 60398d6549)

Solutions

  1. If the application should still be tracked, re-add it through the normal path: a TSV in batch/tracker-additions/ + node merge-tracker.mjs.
  2. If the row was deleted intentionally, ignore the warning -- replies and their record remain in reply history.
  3. Re-run reply-watch afterwards so recommendations map onto the surviving row numbers.

Example fix

# before
Skipped #42: row no longer exists in the tracker
# after: re-add the application via the merge path, then re-run
$ printf '051\t2026-08-20\tAcme\tSenior ML Engineer\tResponded\t4.2/5\t❌\t[051](reports/051-acme-2026-08-20.md)\tnote\n' > batch/tracker-additions/051-acme.tsv
$ node merge-tracker.mjs && node reply-watch.mjs
Defensive patterns

Strategy: validation

Validate before calling

// Before applying updates, confirm every recommended row still exists
const liveNums = new Set(
  [...readFileSync('data/applications.md', 'utf-8').matchAll(/^\|\s*(\d+)\s*\|/gm)].map(m => Number(m[1]))
);
const applicable = updates.filter(u => liveNums.has(u.num));

Prevention

When it happens

Trigger: Running node dedup-tracker.mjs (which renumbers/removes rows) while a reply-watch review is pending; hand-deleting rows during review; merge-tracker renumbering a colliding entry (#220's path) after classification.

Common situations: Post-batch dedup housekeeping overlapping interactive review; two people/tools sharing one tracker file.

Understand the failure class

Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.

Related errors


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