{"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":340,"sourceCode":"            const line = `${num}\\t${todayStr}\\t${u.oldStatus}\\t${u.newStatus}\\treply-watch\\t\\n`;\n            try {\n              fs.appendFileSync(statusLogFile, line, 'utf-8');\n            } catch (err) {\n              console.warn(`Warning: failed to append to status-log.tsv for #${num}: ${err.message}`);\n            }\n          }\n        }\n      });\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":322,"sourceCodeEnd":358,"githubUrl":"https://github.com/santifer/career-ops/blob/aac998c7ed7248ea853b720ceeb1fdbeb322fc5d/reply-watch.mjs#L322-L358","documentation":"During the apply phase, reply-watch verifies the target row still exists before updating. If #N is absent from the tracker (deleted, merged away by dedup/merge-tracker, or archived via outcome), the update is skipped and this warning reports it, with the run continuing to the remaining rows.","triggerScenarios":"A reply-candidates.json entry references tracker #N, but by apply time the row was removed — outcome.mjs archived it, merge-tracker deduped it into another row, the tracker was rebuilt, or the # referenced a row from a different tracker file.","commonSituations":"Recording an outcome for an application that had pending replies; running dedup-tracker between classification and apply; pointing CAREER_OPS_TRACKER at a different/older tracker file than when replies were captured.","solutions":["Check what happened to the row: if it was merged into another #, apply the status to the surviving row with `node set-status.mjs <surviving#> <State>`.","If the application was archived via outcome.mjs, no update is needed — the replies are historical.","Verify CAREER_OPS_TRACKER / the tracker path matches the one the replies were classified against.","Clean stale entries from data/reply-candidates.json if the # will never exist again."],"exampleFix":"// before\n// Skipped #57: row no longer exists in the tracker (row was deduped into #52)\n// after\nnode set-status.mjs 52 Interview --note \"status from merged row 57\"","handlingStrategy":"validation","validationCode":"const exists = trackerRows.some(row => row.num === r.num);\nif (!exists) console.warn(`#${r.num} gone from tracker — skip or re-point at merged row`);","typeGuard":null,"tryCatchPattern":"} else if (result.missing.has(r.num)) {\n  console.warn(`Skipped #${r.num}: row no longer exists in the tracker`);\n  // find surviving row (dedup/outcome) and update that instead\n}","preventionTips":["Run dedup-tracker/merge-tracker before classifying replies, not between classify and apply.","Clean stale reply-candidates.json entries for archived applications.","Keep CAREER_OPS_TRACKER stable so reply classification and apply target the same tracker."],"tags":["tracker","missing-row","reply-watch","dedup"],"backgroundTag":"record-not-found","analyzedSha":"aac998c7ed7248ea853b720ceeb1fdbeb322fc5d","analyzedAt":"2026-09-16T06:35:29.214Z","contentChangedAt":"2026-09-16T06:35:29.214Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}