{"record":{"id":"e910f0fabd41f362","repo":"santifer/career-ops","slug":"skipped-r-num-row-no-longer-exists-in-the-tra","errorCode":null,"errorMessage":"Skipped #${r.num}: row no longer exists in the tracker","messagePattern":"Skipped #(.+?): row no longer exists in the tracker","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"reply-watch.mjs","lineNumber":321,"sourceCode":"    updates.forEach(r => {\n      const count = r.count > 1 ? ` (${r.count} replies)` : '';\n      console.log(`  #${r.num} ${r.company} (${r.role}): ${r.oldStatus} → ${r.newStatus}${count}`);\n    });\n    console.log('');\n\n    const answer = await askQuestion(`Apply recommended status updates to ${APPS_FILE}? (y/N): `);\n    if (answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes') {\n      const result = await updateTrackerStatuses(updates);\n      for (const r of updates) {\n        const count = r.count > 1 ? ` (${r.count} replies)` : '';\n        if (result.applied.has(r.num)) {\n          console.log(`Updated #${r.num} to ${r.newStatus}${count}`);\n        } else if (result.alreadyCurrent.has(r.num)) {\n          console.log(`No change for #${r.num}: already ${r.newStatus}${count}`);\n        } else if (result.conflicts.has(r.num)) {\n          console.warn(`Skipped #${r.num}: status changed from ${r.oldStatus} to ${result.conflicts.get(r.num)} during review`);\n        } else if (result.missing.has(r.num)) {\n          console.warn(`Skipped #${r.num}: row no longer exists in the tracker`);\n        }\n      }\n      console.log('\\n✅ Tracker review complete');\n\n      // Sync tracker DB if tracker.mjs exists\n      try {\n        const { execSync } = await import('child_process');\n        execSync('node tracker.mjs sync', { stdio: 'ignore' });\n        console.log('Synced database index (applications.db).');\n      } catch (e) {\n        // ignore\n      }\n    } else {\n      console.log('Updates skipped.');\n    }\n  }\n}\n","sourceCodeStart":303,"sourceCodeEnd":339,"githubUrl":"https://github.com/santifer/career-ops/blob/60398d6549a46f5266929538af21cfab94badc75/reply-watch.mjs#L303-L339","documentation":"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.","triggerScenarios":"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.","commonSituations":"Post-batch dedup housekeeping overlapping interactive review; two people/tools sharing one tracker file.","solutions":["If the application should still be tracked, re-add it through the normal path: a TSV in batch/tracker-additions/ + node merge-tracker.mjs.","If the row was deleted intentionally, ignore the warning -- replies and their record remain in reply history.","Re-run reply-watch afterwards so recommendations map onto the surviving row numbers."],"exampleFix":"# before\nSkipped #42: row no longer exists in the tracker\n# after: re-add the application via the merge path, then re-run\n$ 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\n$ node merge-tracker.mjs && node reply-watch.mjs","handlingStrategy":"validation","validationCode":"// Before applying updates, confirm every recommended row still exists\nconst liveNums = new Set(\n  [...readFileSync('data/applications.md', 'utf-8').matchAll(/^\\|\\s*(\\d+)\\s*\\|/gm)].map(m => Number(m[1]))\n);\nconst applicable = updates.filter(u => liveNums.has(u.num));","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Run dedup-tracker.mjs and merge-tracker.mjs before starting a reply-watch session, not during it.","Re-run reply-watch after any renumbering event so recommendations target live row numbers.","Re-add genuinely missing applications through the TSV + merge path rather than hand-inserting rows."],"tags":["reply-watch","row-missing","stale-reference","tracker","dedup"],"backgroundTag":"record-not-found","analyzedSha":"60398d6549a46f5266929538af21cfab94badc75","analyzedAt":"2026-08-20T23:00:06.764Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}